From edf3b7fde038fcf3e6d86b8b4b88c2ff6f9014cf Mon Sep 17 00:00:00 2001
From: xuekang <914468783@qq.com>
Date: 星期五, 10 五月 2024 20:52:50 +0800
Subject: [PATCH] 初始化

---
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/flow_service_v2.js                                          |   85 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionHolder.java                                                         |  426 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/SessionConverter.java                                                      |  207 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/v2/FlowControllerV2.java                       |  216 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_single.js                                        |  262 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/RuoYiDemoApplication.java                                                                |   20 
 ruoyi-visual/ruoyi-nacos/src/main/resources/static/login.html                                                                                    |   43 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/session/DataBaseSessionManager.java                                     |  190 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/cluster/cluster-client-config-dialog.html                       |   40 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/service/BranchSessionService.java                                          |   34 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_server_monitor.js                            |   97 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/dist/js/app.js                                                                   |    1 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/metric/InMemoryMetricsRepository.java          |  166 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/version_service.js                                          |   10 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemFlowRuleStore.java                   |   53 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/SimpleWebAuthServiceImpl.java                        |   73 
 ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/services/io.seata.server.coordinator.AbstractCore                                    |    4 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/IExportExcelService.java                                                         |   18 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/gulpfile.js                                                                      |  134 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestTreeMapper.java                                                               |   21 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/redis/BranchSessionRedisServiceImpl.java                              |   65 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/listener/ExportDemoListener.java                                                         |   68 
 ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/TestMessaging.java                                                             |   20 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/TransactionStoreManager.java                                                 |  148 
 ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/javascript.js                                                            |  831 
 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteDictDataVo.java                                                  |   76 
 ruoyi-example/ruoyi-stream-mq/src/main/resources/banner.txt                                                                                      |   10 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/gateway/api.js                                           |  245 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/MachineRegistryController.java                 |   88 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/fonts/fontawesome-webfont.woff                                               |    0 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/lock/AbstractLockManager.java                                                      |  198 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/.gitignore                                                                       |    2 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/gateway/api-dialog.html                                         |   49 
 ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/native-image/io.seata/server/resource-config.json                                    |   21 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/gateway/InMemGatewayFlowRuleStore.java         |   39 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/DynamicRulePublisher.java                            |   32 
 ruoyi-visual/ruoyi-powerjob-server/pom.xml                                                                                                       |   89 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterAssignService.java                         |   58 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/request/ClusterClientModifyRequest.java    |   82 
 ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/codemirror.addone.lint.js                                                |  251 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/param_flow.js                                            |  328 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestTreeBo.java                                                                |   54 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/controller/HealthController.java                                                   |   43 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/vo/GlobalLockVO.java                                                       |  196 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/assets/img/sentinel-logo.png                                                     |    0 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestDemoService.java                                                            |   71 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/DefaultLoginAuthenticationFilter.java                |  125 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/lock/FileLocker.java                                                  |  220 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/transaction/tcc/TccCore.java                                                       |   37 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/gateway/GatewayParamFlowItemEntity.java |   95 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/css/bootstrap.min.css                                                        |    7 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/TransactionCoordinatorOutbound.java                                    |   54 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/metrics/MeterIdConstants.java                                                      |  108 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestTreeServiceImpl.java                                                    |   88 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/flow_service_v1.js                                          |  119 
 ruoyi-visual/ruoyi-seata-server/src/main/resources/banner.txt                                                                                    |    8 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/DefaultCoordinator.java                                                |  609 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/gateway/identity.js                                      |  299 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/cluster/client.html                                                    |   30 
 ruoyi-example/ruoyi-demo/src/main/resources/excel/多列表.xlsx                                                                                       |    0 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestExcelController.java                                                      |  160 
 ruoyi-visual/ruoyi-nacos/src/main/resources/banner.txt                                                                                           |   15 
 ruoyi-visual/ruoyi-seata-server/src/main/resources/README.md                                                                                     |   33 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/cluster/ClusterAssignController.java           |  104 
 ruoyi-visual/ruoyi-powerjob-server/Dockerfile                                                                                                    |   17 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/SessionStorable.java                                                         |   38 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/gateway/ApiDefinitionEntity.java        |  208 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/resources/logback-plus.xml                                                                        |   28 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/header/header.html                                        |   15 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/VersionUtils.java                                    |   95 
 ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/TOrderTest.java                                                                          |   49 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestEncryptController.java                                                    |   55 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/cluster_state_service.js                                    |   73 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/rule/UpdateFlowRuleReqVo.java           |  125 
 ruoyi-visual/ruoyi-nacos/src/main/resources/static/img/black_dot.png                                                                             |    0 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/degrade.js                                               |  204 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/fonts/fontawesome-webfont.ttf                                                |    0 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/MachineUtils.java                                    |   59 
 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteTenantService.java                                                         |   26 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/MachineInfoVo.java                              |  123 
 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteLogininforBo.java                                                |   90 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/AbstractTransactionStoreManager.java                                         |   60 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/fonts/glyphicons-halflings-regular.ttf                                       |    0 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/api/ApiPredicateItemVo.java             |   57 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/CommandNotFoundException.java                      |   34 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/appservice.js                                               |   12 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java                                                    |  111 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/resources/banner.txt                                                                              |    8 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/filters/filters.js                                                   |   17 
 ruoyi-visual/ruoyi-nacos/src/main/resources/static/index.html                                                                                    |   61 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/config/ServerFlowConfig.java               |  108 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterServerStateVO.java            |  129 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/TransactionWriteStore.java                                            |  129 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/BranchSessionHandler.java                                                  |   39 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/ShardingOrderItem.java                                                            |   17 
 ruoyi-example/ruoyi-demo/src/main/resources/spy.properties                                                                                       |   28 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/AuthService.java                                     |  113 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/metricservice.js                                            |   36 
 ruoyi-visual/ruoyi-sentinel-dashboard/pom.xml                                                                                                    |  158 
 ruoyi-visual/ruoyi-nacos/src/main/resources/static/img/nacos.png                                                                                 |    0 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/system-rule-dialog.html                                         |   58 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar-search/sidebar-search.html                |   10 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/Result.java                                        |  103 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestDemo.java                                                                     |   69 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestDemoEncrypt.java                                                              |   29 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/service/GlobalLockService.java                                             |   37 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/ShardingOrder.java                                                                |   16 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/identityservice.js                                          |   30 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/ShardingOrderItemMapper.java                                                      |   14 
 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteUserBo.java                                                      |  125 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/system.js                                                |  239 
 ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/codemirror.js                                                            | 9515 ++++++++
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/controller/GlobalSessionController.java                                    |   52 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar-search/sidebar-search.js                  |   20 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/package.json                                                                     |   55 
 ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/spring-configuration-metadata.json                                                   |   22 
 ruoyi-example/ruoyi-demo/src/main/resources/banner.txt                                                                                           |   10 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/gateway/api_service.js                                      |   73 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/param_flow.html                                                        |  118 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/MetricVo.java                                   |  208 
 ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/TagUnitTest.java                                                                         |   54 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/logging/logback/ExtendedWhitespaceThrowableProxyConverter.java                     |   35 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/gateway/GatewayFlowRuleEntity.java      |  354 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ParamFlowRuleController.java                   |  263 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/lock/RedisLockManager.java                                           |   66 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/authority.js                                             |  227 
 ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMessageService.java                                                    |   19 
 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDeptService.java                                                           |   18 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisLockController.java                                                      |   71 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/README_zh.md                                                                     |   33 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/degrade.html                                                           |   98 
 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteLogService.java                                                            |   26 
 ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/codemirror.addone.json-lint.js                                           |   44 
 ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/DemoUnitTest.java                                                                        |   69 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/dist/js/app.vendor.js                                                            |    1 
 ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/xml.js                                                                   |  407 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/FlowRuleApiPublisher.java                            |   60 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/TransactionCoordinatorInbound.java                                     |   29 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/lock/FileLockManager.java                                             |   60 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/AppClusterServerStateWrapVO.java     |  102 
 ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/DelayProducer.java                                                    |   27 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/libs/treeTable.js                                                    |  292 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/ExportDemoVo.java                                                              |  118 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/UUIDGenerator.java                                                                 |   51 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/lock/RedisLocker.java                                                |  385 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/cluster/ClusterConfigController.java           |  245 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/package-info.java                                                           |    1 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/DruidDataSourceProvider.java                                                 |   59 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/auth/AbstractCheckAuthHandler.java                                                 |   53 
 ruoyi-visual/ruoyi-seata-server/src/main/resources/README-zh.md                                                                                  |   32 
 ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteFile.java                                                       |   34 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/logging/logback/appender/EnhancedLogstashEncoder.java                              |   45 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/AbstractSessionManager.java                                                |  199 
 ruoyi-example/ruoyi-demo/src/main/resources/excel/单列表.xlsx                                                                                       |    0 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/authority_service.js                                        |   56 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayApiController.java              |  260 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/DegradeController.java                         |  221 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/lock/LockManager.java                                                              |  106 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/lock/distributed/DistributedLockerFactory.java                                     |   69 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/file/GlobalSessionFileServiceImpl.java                                |  102 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayFlowRuleController.java         |  431 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/AbstractRuleEntity.java            |  111 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/LoginAuthenticationFilter.java                       |   39 
 ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/vs/language/typescript/src/worker.js                                     |   18 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/spring/listener/SeataPropertiesLoader.java                                         |   70 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/resources/logback-common.xml                                                                      |   97 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/js/g2.min.js                                                                 |    1 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/DefaultCore.java                                                       |  399 
 ruoyi-api/ruoyi-api-bom/pom.xml                                                                                                                  |   39 
 ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/merge.js                                                                 | 1010 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/DegradeRuleEntity.java             |  202 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/metric/MetricsRepository.java                  |   60 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/param-flow-rule-dialog.html                                     |  166 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisPubSubController.java                                                    |   47 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/css/font-awesome.min.css                                                     |    4 
 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/LoginUser.java                                                             |  141 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/machine.js                                               |   65 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/ShardingOrderMapper.java                                                          |   15 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/ServerRunner.java                                                                  |  105 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/GlobalSession.java                                                         |  771 
 ruoyi-visual/ruoyi-seata-server/src/main/resources/logback-common.xml                                                                            |   97 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/lock/RedisDistributedLocker.java                                     |   85 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/VersionController.java                         |   49 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/package-info.java                                                                |    1 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/machine.html                                                           |   76 
 ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/DelayConsumer.java                                                    |   22 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/file/GlobalLockFileServiceImpl.java                                   |  173 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/WebConfig.java                                     |  116 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/DashboardApplication.java                                 |   39 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/request/ClusterAppAssignMap.java           |  112 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/store/RedisTransactionStoreManager.java                              |  835 
 ruoyi-api/pom.xml                                                                                                                                |   24 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_token_client_list.js                         |  121 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/Document.java                                                                     |   25 
 ruoyi-visual/ruoyi-nacos/src/main/resources/application.properties                                                                               |  196 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/flow_v1.html                                                           |  117 
 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/RoleDTO.java                                                               |   42 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/MetricEntity.java                       |  219 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/package-info.java                                                                 |    1 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/gateway/InMemApiDefinitionStore.java           |   39 
 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDataScopeService.java                                                      |   20 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/FlowRuleApiProvider.java                             |   59 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/SensitiveServiceImpl.java                                                   |   46 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/GlobalSessionHandler.java                                                  |   36 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/ParameterParser.java                                                               |  200 
 ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMessageServiceStub.java                                                |   38 
 ruoyi-visual/ruoyi-seata-server/pom.xml                                                                                                          |  226 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java                                                               |   59 
 ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/ParamUnitTest.java                                                                       |   72 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/CommandFailedException.java                        |   33 
 ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMailService.java                                                       |   21 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestShardingController.java                                                   |   46 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterConfigService.java                         |  179 
 ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/services/io.seata.core.store.db.DataSourceProvider                                   |    3 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_server_manage.js                             |  283 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/FlowControllerV1.java                          |  272 
 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSocialVo.java                                                    |  135 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestTreeService.java                                                            |   52 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/AuthAction.java                                      |   47 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/AuthConfiguration.java                             |   57 
 ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/jquery.js                                                                |    2 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/SystemController.java                          |  254 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/FlowRuleEntity.java                |  249 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/flow_v2.js                                               |  221 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/redis/GlobalSessionRedisServiceImpl.java                              |  110 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/event/EventBusManager.java                                                         |   34 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/api/AddApiReqVo.java                    |   78 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/confirm-dialog.html                                             |   20 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/header/header.js                                          |   61 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterClientInfoVO.java                   |   76 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/Swagger3DemoController.java                                                   |   31 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/metrics/MetricsPublisher.java                                                      |   97 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterAppSingleServerAssignRequest.java   |   56 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/Lockable.java                                                              |   42 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterUniversalStateVO.java         |   64 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/rule/AddFlowRuleReqVo.java              |  155 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoImportVo.java                                                          |   53 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/metric/MetricFetcher.java                                 |  375 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/cluster/server.html                                                    |   29 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/lock/DataBaseLocker.java                                                |  144 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ConnectionGroupVO.java                     |   66 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/AuthorityRuleEntity.java           |   62 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/vo/GlobalSessionVO.java                                                    |  217 
 ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/vs/loader.js                                                             |    8 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/gateway/flow.html                                                      |   94 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/fonts/glyphicons-halflings-regular.woff                                      |    0 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/styles/main.css                                                              | 1756 +
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dashboard/home.html                                                    |   13 
 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteTenantVo.java                                                    |   91 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/session/RedisSessionManager.java                                     |  189 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/RuleRepository.java                       |   85 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/transaction/at/ATCore.java                                                         |  104 
 ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileService.java                                                       |   29 
 ruoyi-visual/ruoyi-nacos/src/main/resources/static/css/main.css                                                                                  |  480 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/gateway/api.html                                                       |   87 
 ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/spring.factories                                                                     |    4 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterRequestLimitVO.java           |   63 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/flow_v1.js                                               |  220 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/AuthProperties.java                                |   33 
 ruoyi-example/pom.xml                                                                                                                            |   43 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionCondition.java                                                      |  145 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/package-lock.json                                                                | 4498 +++
 ruoyi-visual/ruoyi-powerjob-server/src/main/resources/application.properties                                                                     |   41 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AppController.java                             |   85 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/cluster/cluster-server-assign-dialog.html                       |  139 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/AppClusterClientStateWrapVO.java     |   79 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/js/bootstrap.min.js                                                          |    7 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/degrade-rule-dialog.html                                        |   93 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestI18nController.java                                                       |   71 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/AuthorizationInterceptor.java                        |   29 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/auth/DefaultCheckAuthHandler.java                                                  |   37 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/MachineInfo.java                                |  185 
 ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/TestTreeMapper.xml                                                                       |   22 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/gateway/ApiPredicateItemEntity.java     |   79 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/lock/LockerManagerFactory.java                                                     |   74 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/param/GlobalSessionParam.java                                              |  102 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/authority.html                                                         |   85 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/SentinelApiClient.java                             |  849 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/ResourceTreeNode.java                              |  242 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_app_assign_manage.html                                         |  118 
 ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/codemirror.addone.fullscreen.js                                          |   54 
 ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/services/io.seata.core.store.DistributedLocker                                       |    2 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterAppFullAssignRequest.java           |   58 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ConnectionDescriptorVO.java                |   53 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/StoreConfig.java                                                             |  248 
 ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/services/io.seata.core.rpc.RegisterCheckAuthHandler                                  |    1 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/styles/timeline.css                                                          |  180 
 ruoyi-visual/ruoyi-powerjob-server/src/main/resources/banner.txt                                                                                 |   11 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/service/GlobalSessionService.java                                          |   35 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/FakeAuthServiceImpl.java                             |   71 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterStateSingleVO.java                  |   63 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestTreeVo.java                                                                |   64 
 ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/TestStreamProducer.java                                               |   24 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/store/DataBaseTransactionStoreManager.java                              |  256 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/license-stat.csv                                                                 |   26 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionLifecycle.java                                                      |  105 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/package-info.java                                                             |    1 
 ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/TestDemoMapper.xml                                                                       |   26 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/AbstractTCInboundHandler.java                                                      |  327 
 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteConfigService.java                                                         |   17 
 ruoyi-example/ruoyi-stream-mq/pom.xml                                                                                                            |   98 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/systemservice.js                                            |   77 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/MachineEntity.java                      |  125 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/SentinelVersion.java                    |  129 
 ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/LogStreamProducer.java                                                |   24 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/HikariDataSourceProvider.java                                                |   62 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/login.js                                                 |   33 
 ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileServiceMock.java                                                   |   37 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/AppInfo.java                                    |  137 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_app_server_list.html                                           |   96 
 ruoyi-visual/ruoyi-nacos/pom.xml                                                                                                                 |  327 
 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteUserService.java                                                           |   92 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/Reloadable.java                                                            |   29 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/config/ServerTransportConfig.java          |   64 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/lock/DataBaseLockManager.java                                           |   78 
 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteClientService.java                                                         |   20 
 ruoyi-visual/pom.xml                                                                                                                             |   46 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/ExportExcelServiceImpl.java                                                 |  222 
 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteOperLogBo.java                                                   |  120 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/env/PortHelper.java                                                                |  130 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/Server.java                                                                        |   89 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/DbcpDataSourceProvider.java                                                  |   58 
 ruoyi-visual/ruoyi-powerjob-server/src/main/java/org/dromara/powerjob/PowerJobServerApplication.java                                             |   25 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/login.html                                                             |   34 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/RuleEntity.java                    |   40 
 ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/native-image/io.seata/server/reflect-config.json                                     |  362 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestDemoController.java                                                       |  146 
 ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/services/io.seata.server.session.SessionManager                                      |    3 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/flow-rule-dialog.html                                           |  148 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/vo/BranchSessionVO.java                                                    |  241 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/README.md                                                                        |   33 
 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/XcxLoginUser.java                                                          |   27 
 ruoyi-api/ruoyi-api-system/pom.xml                                                                                                               |   33 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/DefaultAuthorizationInterceptor.java                 |   75 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestTreeController.java                                                       |  104 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/spring/listener/ServerApplicationListener.java                                     |  124 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/.jshintrc                                                                        |   67 
 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDictService.java                                                           |   21 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/system.html                                                            |   92 
 ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/codemirror.lib.json-lint.js                                              |  448 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/store/LogStoreDataBaseDAO.java                                          |  601 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java                                                            |   59 
 ruoyi-visual/ruoyi-seata-server/src/main/resources/redislocker/redislock.lua                                                                     |   52 
 ruoyi-example/ruoyi-demo/src/main/resources/application.yml                                                                                      |  114 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/SeataServerApplication.java                                                        |   49 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/fonts/fontawesome-webfont.woff2                                              |    0 
 ruoyi-visual/ruoyi-sentinel-dashboard/Dockerfile                                                                                                 |   20 
 ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/LogStreamConsumer.java                                                |   22 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/ReloadableStore.java                                                  |   45 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterAssignServiceImpl.java                     |  270 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/param_flow_service.js                                       |  104 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/cluster/cluster-server-connection-detail-dialog.html            |   37 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemDegradeRuleStore.java                |   36 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_server_list.js                               |  570 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/db/BranchSessionDBServiceImpl.java                                    |  101 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/ClusterEntityUtils.java                              |  159 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_single_config.html                                             |   95 
 ruoyi-visual/ruoyi-powerjob-server/src/main/resources/logback-common.xml                                                                         |   97 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterClientStateVO.java            |   46 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/gateway/flow_service.js                                     |   76 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/index_dev.htm                                                                    |   30 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/home.js                                                  |   11 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/JedisPooledFactory.java                                              |  125 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/lock/DataBaseDistributedLocker.java                                     |  283 
 ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteSms.java                                                        |   36 
 ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/ShardingOrderItemMapper.xml                                                              |    7 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemAuthorityRuleStore.java              |   39 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/BranchSession.java                                                         |  473 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemParamFlowRuleStore.java              |   51 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/param/GlobalLockParam.java                                                 |  114 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/DynamicRuleProvider.java                             |   25 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/EsCrudController.java                                                         |   89 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemoryRuleRepositoryAdapter.java        |  129 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionManager.java                                                        |  127 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/Core.java                                                              |   59 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/metrics/MetricsManager.java                                                        |   65 
 ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/AssertUnitTest.java                                                                      |   45 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/metric.html                                                            |  117 
 ruoyi-example/ruoyi-demo/pom.xml                                                                                                                 |  138 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/DemoController.java                            |  135 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/request/ClusterModifyRequest.java          |   31 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_app_server_overview.html                                       |   88 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisCacheController.java                                                     |   95 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterGroupEntity.java                    |   91 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionLifecycleListener.java                                              |   98 
 ruoyi-api/ruoyi-api-resource/pom.xml                                                                                                             |   28 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/js/jquery.min.js                                                             |    5 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/controller/GlobalLockController.java                                       |   52 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/static/favicon.ico                                                               |    0 
 ruoyi-visual/ruoyi-nacos/src/main/resources/static/img/logo-2000-390.svg                                                                         |    1 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/pagination.tpl.html                                                    |   18 
 ruoyi-example/ruoyi-demo/src/main/resources/mapper/package-info.md                                                                               |    3 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/js/angular.min.js                                                            |  295 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AuthController.java                            |   92 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestTree.java                                                                     |   66 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/lock/LockStoreDataBaseDAO.java                                          |  437 
 ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/TestStreamConsumer.java                                               |   22 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar.js                                        |   71 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionStatusValidator.java                                                |   87 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/identity.html                                                          |  110 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/controller/BranchSessionController.java                                    |   36 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/gateway/flow-rule-dialog.html                                   |  172 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/MetricPositionEntity.java               |  121 
 ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteSmsService.java                                                        |   24 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/DashboardConfig.java                               |  140 
 ruoyi-example/ruoyi-demo/README.md                                                                                                               |    2 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/degrade_service.js                                          |   97 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_app_client_list.html                                           |   73 
 ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/controller/TestMqController.java                                                  |   60 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/ResourceVo.java                                 |  236 
 ruoyi-visual/ruoyi-seata-server/src/main/resources/application.yml                                                                               |   59 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/main.js                                                  |   10 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoBo.java                                                                |   61 
 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteClientVo.java                                                    |   71 
 ruoyi-example/ruoyi-stream-mq/src/main/resources/application.yml                                                                                 |  107 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/identity.js                                              |  478 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterAppAssignResultVO.java              |   66 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/gateway/identity.html                                                  |   98 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/index.htm                                                                        |   30 
 ruoyi-example/ruoyi-demo/src/main/resources/logback-plus.xml                                                                                     |   23 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/AbstractCore.java                                                      |  241 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterStateSimpleEntity.java        |   74 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/app.js                                                               |  368 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/styles/page.css                                                              |  399 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/MachineDiscovery.java                           |   51 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/api/UpdateApiReqVo.java                 |   57 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/ParamFlowRuleEntity.java           |  120 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/machineservice.js                                           |   25 
 ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/loader.js                                                                |    8 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestBatchController.java                                                      |   89 
 ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/codemirror.lib.clike-lint.js                                             |  802 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java                                                                |   89 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterUniversalStatePairVO.java     |   72 
 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysUserOnline.java                                                        |   72 
 ruoyi-visual/ruoyi-seata-server/src/main/resources/logback-spring.xml                                                                            |   49 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/db/GlobalLockDBServiceImpl.java                                       |  145 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/logging/listener/SystemPropertyLoggerContextListener.java                          |   75 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemSystemRuleStore.java                 |   36 
 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteSocialBo.java                                                    |  129 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/auth_service.js                                             |   25 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/authority-rule-dialog.html                                      |   46 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/resources/application.yml                                                                         |   35 
 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteSocialService.java                                                         |   35 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/session/FileSessionManager.java                                       |  370 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/config/ClusterClientConfig.java            |   75 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/redis/GlobalLockRedisServiceImpl.java                                 |  119 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoEncryptMapper.java                                                        |   13 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/ApplicationEntity.java                  |  106 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/request/ClusterServerModifyRequest.java    |  119 
 ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/RuoYiStreamMqApplication.java                                                     |   22 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dashboard/main.html                                                    |   10 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_assign_manage.js                             |  283 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/SystemRuleEntity.java              |  158 
 ruoyi-example/ruoyi-demo/src/main/resources/excel/多sheet列表.xlsx                                                                                  |    0 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/flow_v2.html                                                           |  113 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/metric.js                                                |  269 
 ruoyi-visual/ruoyi-powerjob-server/src/main/resources/logback-plus.xml                                                                           |   30 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ResourceController.java                        |   91 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestSensitiveController.java                                                  |   75 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/package-info.java                                                                 |    1 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/file/BranchSessionFileServiceImpl.java                                |   39 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AuthorityRuleController.java                   |  187 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/MailController.java                                                           |   52 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/FlushDiskMode.java                                                    |   43 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/transaction/saga/SagaCore.java                                                     |  230 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar.html                                      |   91 
 ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/ShardingOrderMapper.xml                                                                  |    7 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/env/ContainerHelper.java                                                           |  103 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/SimpleMachineDiscovery.java                     |   77 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/MetricController.java                          |  175 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/dist/css/app.css                                                                 |    5 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/gateway/flow.js                                          |  251 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/transaction/xa/XACore.java                                                         |   48 
 ruoyi-visual/ruoyi-seata-server/Dockerfile                                                                                                       |   23 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/AsyncUtils.java                                      |   72 
 ruoyi-visual/ruoyi-nacos/Dockerfile                                                                                                              |   17 
 ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/services/io.seata.server.lock.LockManager                                            |    3 
 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/esmapper/DocumentMapper.java                                                             |    7 
 ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/diff_match_patch.js                                                      |   49 
 ruoyi-visual/ruoyi-nacos/src/main/resources/static/js/main.js                                                                                    |  330 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/metrics/MetricsSubscriber.java                                                     |  214 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/store/FileTransactionStoreManager.java                                |  651 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/rule/GatewayParamFlowItemVo.java        |   65 
 ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/AppManagement.java                              |   80 
 ruoyi-example/ruoyi-stream-mq/src/main/resources/logback-plus.xml                                                                                |   26 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/db/GlobalSessionDBServiceImpl.java                                    |  160 
 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionHelper.java                                                         |  346 
 487 files changed, 67,920 insertions(+), 0 deletions(-)

diff --git a/ruoyi-api/pom.xml b/ruoyi-api/pom.xml
new file mode 100644
index 0000000..2701751
--- /dev/null
+++ b/ruoyi-api/pom.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.dromara</groupId>
+        <artifactId>ruoyi-cloud-plus</artifactId>
+        <version>${revision}</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <modules>
+        <module>ruoyi-api-bom</module>
+        <module>ruoyi-api-system</module>
+        <module>ruoyi-api-resource</module>
+    </modules>
+
+    <artifactId>ruoyi-api</artifactId>
+    <packaging>pom</packaging>
+
+    <description>
+        ruoyi-api绯荤粺鎺ュ彛
+    </description>
+
+</project>
diff --git a/ruoyi-api/ruoyi-api-bom/pom.xml b/ruoyi-api/ruoyi-api-bom/pom.xml
new file mode 100644
index 0000000..46b6134
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-bom/pom.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>org.dromara</groupId>
+    <artifactId>ruoyi-api-bom</artifactId>
+    <packaging>pom</packaging>
+    <version>${revision}</version>
+
+    <description>
+        ruoyi-api-bom api渚濊禆椤�
+    </description>
+
+    <properties>
+        <revision>2.1.2</revision>
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <!-- 绯荤粺鎺ュ彛 -->
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>ruoyi-api-system</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <!-- 璧勬簮鏈嶅姟鎺ュ彛 -->
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>ruoyi-api-resource</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+        </dependencies>
+    </dependencyManagement>
+</project>
diff --git a/ruoyi-api/ruoyi-api-resource/pom.xml b/ruoyi-api/ruoyi-api-resource/pom.xml
new file mode 100644
index 0000000..4a4f728
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-resource/pom.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.dromara</groupId>
+        <artifactId>ruoyi-api</artifactId>
+        <version>${revision}</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>ruoyi-api-resource</artifactId>
+
+    <description>
+        ruoyi-api-resource 璧勬簮鏈嶅姟鎺ュ彛妯″潡
+    </description>
+
+    <dependencies>
+
+        <!-- RuoYi Common Core-->
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-core</artifactId>
+        </dependency>
+
+    </dependencies>
+
+</project>
diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileService.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileService.java
new file mode 100644
index 0000000..6ab788e
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileService.java
@@ -0,0 +1,29 @@
+package org.dromara.resource.api;
+
+import org.dromara.common.core.exception.ServiceException;
+import org.dromara.resource.api.domain.RemoteFile;
+
+/**
+ * 鏂囦欢鏈嶅姟
+ *
+ * @author Lion Li
+ */
+public interface RemoteFileService {
+
+    /**
+     * 涓婁紶鏂囦欢
+     *
+     * @param file 鏂囦欢淇℃伅
+     * @return 缁撴灉
+     */
+    RemoteFile upload(String name, String originalFilename, String contentType, byte[] file) throws ServiceException;
+
+    /**
+     * 閫氳繃ossId鏌ヨ瀵瑰簲鐨剈rl
+     *
+     * @param ossIds ossId涓查�楀彿鍒嗛殧
+     * @return url涓查�楀彿鍒嗛殧
+     */
+    String selectUrlByIds(String ossIds);
+
+}
diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileServiceMock.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileServiceMock.java
new file mode 100644
index 0000000..c689f2d
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileServiceMock.java
@@ -0,0 +1,37 @@
+package org.dromara.resource.api;
+
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.resource.api.domain.RemoteFile;
+
+/**
+ * 鏂囦欢鏈嶅姟(闄嶇骇澶勭悊)
+ *
+ * @author Lion Li
+ */
+@Slf4j
+public class RemoteFileServiceMock implements RemoteFileService {
+
+    /**
+     * 涓婁紶鏂囦欢
+     *
+     * @param file 鏂囦欢淇℃伅
+     * @return 缁撴灉
+     */
+    public RemoteFile upload(String name, String originalFilename, String contentType, byte[] file) {
+        log.warn("鏈嶅姟璋冪敤寮傚父 -> 闄嶇骇澶勭悊");
+        return null;
+    }
+
+    /**
+     * 閫氳繃ossId鏌ヨ瀵瑰簲鐨剈rl
+     *
+     * @param ossIds ossId涓查�楀彿鍒嗛殧
+     * @return url涓查�楀彿鍒嗛殧
+     */
+    public String selectUrlByIds(String ossIds) {
+        log.warn("鏈嶅姟璋冪敤寮傚父 -> 闄嶇骇澶勭悊");
+        return StringUtils.EMPTY;
+    }
+
+}
diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMailService.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMailService.java
new file mode 100644
index 0000000..b63e541
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMailService.java
@@ -0,0 +1,21 @@
+package org.dromara.resource.api;
+
+import org.dromara.common.core.exception.ServiceException;
+
+/**
+ * 閭欢鏈嶅姟
+ *
+ * @author Lion Li
+ */
+public interface RemoteMailService {
+
+    /**
+     * 鍙戦�侀偖浠�
+     *
+     * @param to      鎺ユ敹浜�
+     * @param subject 鏍囬
+     * @param text    鍐呭
+     */
+    void send(String to, String subject, String text) throws ServiceException;
+
+}
diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMessageService.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMessageService.java
new file mode 100644
index 0000000..6b2ecb5
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMessageService.java
@@ -0,0 +1,19 @@
+package org.dromara.resource.api;
+
+/**
+ * 娑堟伅鏈嶅姟
+ *
+ * @author Lion Li
+ */
+public interface RemoteMessageService {
+
+    /**
+     * 鍙戦�佹秷鎭�
+     *
+     * @param sessionKey session涓婚敭 涓�鑸负鐢ㄦ埛id
+     * @param message    娑堟伅鏂囨湰
+     */
+    void sendMessage(Long sessionKey, String message);
+
+    void publishAll(String message);
+}
diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMessageServiceStub.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMessageServiceStub.java
new file mode 100644
index 0000000..813fba6
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMessageServiceStub.java
@@ -0,0 +1,38 @@
+package org.dromara.resource.api;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 娑堟伅鏈嶅姟
+ *
+ * @author Lion Li
+ */
+@Slf4j
+@RequiredArgsConstructor
+public class RemoteMessageServiceStub implements RemoteMessageService {
+
+    private final RemoteMessageService remoteMessageService;
+
+    /**
+     * 鍙戦�佹秷鎭�
+     *
+     * @param sessionKey session涓婚敭 涓�鑸负鐢ㄦ埛id
+     * @param message    娑堟伅鏂囨湰
+     */
+    public void sendMessage(Long sessionKey, String message) {
+        try {
+            remoteMessageService.sendMessage(sessionKey, message);
+        } catch (Exception e) {
+            log.warn("websocket 鍔熻兘鏈紑鍚垨鏈嶅姟鏈壘鍒�");
+        }
+    }
+
+    public void publishAll(String message) {
+        try {
+            remoteMessageService.publishAll(message);
+        } catch (Exception e) {
+            log.warn("websocket 鍔熻兘鏈紑鍚垨鏈嶅姟鏈壘鍒�");
+        }
+    }
+}
diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteSmsService.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteSmsService.java
new file mode 100644
index 0000000..ad4cbea
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteSmsService.java
@@ -0,0 +1,24 @@
+package org.dromara.resource.api;
+
+import org.dromara.common.core.exception.ServiceException;
+import org.dromara.resource.api.domain.RemoteSms;
+
+import java.util.LinkedHashMap;
+
+/**
+ * 鐭俊鏈嶅姟
+ *
+ * @author Lion Li
+ */
+public interface RemoteSmsService {
+
+    /**
+     * 鍙戦�佺煭淇�
+     *
+     * @param phones     鐢佃瘽鍙�(澶氫釜閫楀彿鍒嗗壊)
+     * @param templateId 妯℃澘id
+     * @param param      妯℃澘瀵瑰簲鍙傛暟
+     */
+    RemoteSms send(String phones, String templateId, LinkedHashMap<String, String> param) throws ServiceException;
+
+}
diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteFile.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteFile.java
new file mode 100644
index 0000000..ecc4b16
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteFile.java
@@ -0,0 +1,34 @@
+package org.dromara.resource.api.domain;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 鏂囦欢淇℃伅
+ *
+ * @author ruoyi
+ */
+@Data
+public class RemoteFile implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * oss涓婚敭
+     */
+    private Long ossId;
+
+    /**
+     * 鏂囦欢鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鏂囦欢鍦板潃
+     */
+    private String url;
+
+}
diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteSms.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteSms.java
new file mode 100644
index 0000000..430eb5b
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteSms.java
@@ -0,0 +1,36 @@
+package org.dromara.resource.api.domain;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 鏂囦欢淇℃伅
+ *
+ * @author ruoyi
+ */
+@Data
+public class RemoteSms implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 鏄惁鎴愬姛
+     */
+    private Boolean isSuccess;
+
+    /**
+     * 鍝嶅簲娑堟伅
+     */
+    private String message;
+
+    /**
+     * 瀹為檯鍝嶅簲浣�
+     * <p>
+     * 鍙嚜琛岃浆鎹负 SDK 瀵瑰簲鐨� SendSmsResponse
+     */
+    private String response;
+
+}
diff --git a/ruoyi-api/ruoyi-api-system/pom.xml b/ruoyi-api/ruoyi-api-system/pom.xml
new file mode 100644
index 0000000..02958f3
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-system/pom.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.dromara</groupId>
+        <artifactId>ruoyi-api</artifactId>
+        <version>${revision}</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>ruoyi-api-system</artifactId>
+
+    <description>
+        ruoyi-api-system绯荤粺鎺ュ彛妯″潡
+    </description>
+
+    <dependencies>
+
+        <!-- RuoYi Common Core-->
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-core</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-excel</artifactId>
+        </dependency>
+
+    </dependencies>
+
+</project>
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteClientService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteClientService.java
new file mode 100644
index 0000000..89c3068
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteClientService.java
@@ -0,0 +1,20 @@
+package org.dromara.system.api;
+
+import org.dromara.system.api.domain.vo.RemoteClientVo;
+
+/**
+ * 瀹㈡埛绔湇鍔�
+ *
+ * @author Michelle.Chung
+ */
+public interface RemoteClientService {
+
+    /**
+     * 鏍规嵁瀹㈡埛绔痠d鑾峰彇瀹㈡埛绔鎯�
+     *
+     * @param clientId 瀹㈡埛绔痠d
+     * @return 瀹㈡埛绔璞�
+     */
+    RemoteClientVo queryByClientId(String clientId);
+
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteConfigService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteConfigService.java
new file mode 100644
index 0000000..4c4502e
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteConfigService.java
@@ -0,0 +1,17 @@
+package org.dromara.system.api;
+
+/**
+ * 閰嶇疆鏈嶅姟
+ *
+ * @author Michelle.Chung
+ */
+public interface RemoteConfigService {
+
+    /**
+     * 鑾峰彇娉ㄥ唽寮�鍏�
+     * @param tenantId 绉熸埛id
+     * @return true寮�鍚紝false鍏抽棴
+     */
+    boolean selectRegisterEnabled(String tenantId);
+
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDataScopeService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDataScopeService.java
new file mode 100644
index 0000000..ceac940
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDataScopeService.java
@@ -0,0 +1,20 @@
+package org.dromara.system.api;
+
+/**
+ * 鏁版嵁鏉冮檺鏈嶅姟
+ *
+ * @author Lion Li
+ */
+public interface RemoteDataScopeService {
+
+    /**
+     * 鑾峰彇瑙掕壊鑷畾涔夋潈闄愯鍙�
+     */
+    String getRoleCustom(Long roleId);
+
+    /**
+     * 鑾峰彇閮ㄩ棬鍜屼笅绾ф潈闄愯鍙�
+     */
+    String getDeptAndChild(Long deptId);
+
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDeptService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDeptService.java
new file mode 100644
index 0000000..095fd7c
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDeptService.java
@@ -0,0 +1,18 @@
+package org.dromara.system.api;
+
+/**
+ * 閮ㄩ棬鏈嶅姟
+ *
+ * @author Lion Li
+ */
+public interface RemoteDeptService {
+
+    /**
+     * 閫氳繃閮ㄩ棬ID鏌ヨ閮ㄩ棬鍚嶇О
+     *
+     * @param deptIds 閮ㄩ棬ID涓查�楀彿鍒嗛殧
+     * @return 閮ㄩ棬鍚嶇О涓查�楀彿鍒嗛殧
+     */
+    String selectDeptNameByIds(String deptIds);
+
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDictService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDictService.java
new file mode 100644
index 0000000..142dc45
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDictService.java
@@ -0,0 +1,21 @@
+package org.dromara.system.api;
+
+import org.dromara.system.api.domain.vo.RemoteDictDataVo;
+
+import java.util.List;
+
+/**
+ * 瀛楀吀鏈嶅姟
+ *
+ * @author Lion Li
+ */
+public interface RemoteDictService {
+
+    /**
+     * 鏍规嵁瀛楀吀绫诲瀷鏌ヨ瀛楀吀鏁版嵁
+     *
+     * @param dictType 瀛楀吀绫诲瀷
+     * @return 瀛楀吀鏁版嵁闆嗗悎淇℃伅
+     */
+    List<RemoteDictDataVo> selectDictDataByType(String dictType);
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteLogService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteLogService.java
new file mode 100644
index 0000000..af084a2
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteLogService.java
@@ -0,0 +1,26 @@
+package org.dromara.system.api;
+
+import org.dromara.system.api.domain.bo.RemoteLogininforBo;
+import org.dromara.system.api.domain.bo.RemoteOperLogBo;
+
+/**
+ * 鏃ュ織鏈嶅姟
+ *
+ * @author Lion Li
+ */
+public interface RemoteLogService {
+
+    /**
+     * 淇濆瓨绯荤粺鏃ュ織
+     *
+     * @param sysOperLog 鏃ュ織瀹炰綋
+     */
+    void saveLog(RemoteOperLogBo sysOperLog);
+
+    /**
+     * 淇濆瓨璁块棶璁板綍
+     *
+     * @param sysLogininfor 璁块棶瀹炰綋
+     */
+    void saveLogininfor(RemoteLogininforBo sysLogininfor);
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteSocialService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteSocialService.java
new file mode 100644
index 0000000..ff61c12
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteSocialService.java
@@ -0,0 +1,35 @@
+package org.dromara.system.api;
+
+import org.dromara.system.api.domain.bo.RemoteSocialBo;
+import org.dromara.system.api.domain.vo.RemoteSocialVo;
+
+import java.util.List;
+
+/**
+ * 绀句細鍖栧叧绯绘湇鍔�
+ *
+ * @author Michelle.Chung
+ */
+public interface RemoteSocialService {
+
+    /**
+     * 鏍规嵁 authId 鏌ヨ鐢ㄦ埛淇℃伅
+     */
+    List<RemoteSocialVo> selectByAuthId(String authId);
+
+    /**
+     * 淇濆瓨绀句細鍖栧叧绯�
+     */
+    void insertByBo(RemoteSocialBo bo);
+
+    /**
+     * 鏇存柊绀句細鍖栧叧绯�
+     */
+    void updateByBo(RemoteSocialBo bo);
+
+    /**
+     * 鍒犻櫎绀句細鍖栧叧绯�
+     */
+    Boolean deleteWithValidById(Long socialId);
+
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteTenantService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteTenantService.java
new file mode 100644
index 0000000..5cfcc05
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteTenantService.java
@@ -0,0 +1,26 @@
+package org.dromara.system.api;
+
+
+import org.dromara.system.api.domain.vo.RemoteTenantVo;
+
+import java.util.List;
+
+/**
+ * @author zhujie
+ */
+public interface RemoteTenantService {
+
+    /**
+     * 鏍规嵁绉熸埛id鑾峰彇绉熸埛璇︽儏
+     * @param tenantId 绉熸埛id
+     * @return 缁撴灉
+     */
+    RemoteTenantVo queryByTenantId(String tenantId);
+
+    /**
+     * 鑾峰彇绉熸埛鍒楄〃
+     * @return 缁撴灉
+     */
+    List<RemoteTenantVo> queryList();
+
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteUserService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteUserService.java
new file mode 100644
index 0000000..8401e61
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteUserService.java
@@ -0,0 +1,92 @@
+package org.dromara.system.api;
+
+import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.core.exception.user.UserException;
+import org.dromara.system.api.domain.bo.RemoteUserBo;
+import org.dromara.system.api.model.LoginUser;
+import org.dromara.system.api.model.XcxLoginUser;
+
+/**
+ * 鐢ㄦ埛鏈嶅姟
+ *
+ * @author Lion Li
+ */
+public interface RemoteUserService {
+
+    /**
+     * 閫氳繃鐢ㄦ埛鍚嶆煡璇㈢敤鎴蜂俊鎭�
+     *
+     * @param username 鐢ㄦ埛鍚�
+     * @param tenantId 绉熸埛id
+     * @return 缁撴灉
+     */
+    LoginUser getUserInfo(String username, String tenantId) throws UserException;
+
+    /**
+     * 閫氳繃鐢ㄦ埛id鏌ヨ鐢ㄦ埛淇℃伅
+     *
+     * @param userId   鐢ㄦ埛id
+     * @param tenantId 绉熸埛id
+     * @return 缁撴灉
+     */
+    LoginUser getUserInfo(Long userId, String tenantId) throws UserException;
+
+    /**
+     * 閫氳繃鎵嬫満鍙锋煡璇㈢敤鎴蜂俊鎭�
+     *
+     * @param phonenumber 鎵嬫満鍙�
+     * @param tenantId    绉熸埛id
+     * @return 缁撴灉
+     */
+    LoginUser getUserInfoByPhonenumber(String phonenumber, String tenantId) throws UserException;
+
+    /**
+     * 閫氳繃閭鏌ヨ鐢ㄦ埛淇℃伅
+     *
+     * @param email    閭
+     * @param tenantId 绉熸埛id
+     * @return 缁撴灉
+     */
+    LoginUser getUserInfoByEmail(String email, String tenantId) throws UserException;
+
+    /**
+     * 閫氳繃openid鏌ヨ鐢ㄦ埛淇℃伅
+     *
+     * @param openid openid
+     * @return 缁撴灉
+     */
+    XcxLoginUser getUserInfoByOpenid(String openid) throws UserException;
+
+    /**
+     * 娉ㄥ唽鐢ㄦ埛淇℃伅
+     *
+     * @param remoteUserBo 鐢ㄦ埛淇℃伅
+     * @return 缁撴灉
+     */
+    Boolean registerUserInfo(RemoteUserBo remoteUserBo) throws UserException, ServiceException;
+
+    /**
+     * 閫氳繃userId鏌ヨ鐢ㄦ埛璐︽埛
+     *
+     * @param userId 鐢ㄦ埛id
+     * @return 缁撴灉
+     */
+    String selectUserNameById(Long userId);
+
+    /**
+     * 閫氳繃鐢ㄦ埛ID鏌ヨ鐢ㄦ埛鏄电О
+     *
+     * @param userId 鐢ㄦ埛id
+     * @return 缁撴灉
+     */
+    String selectNicknameById(Long userId);
+
+    /**
+     * 鏇存柊鐢ㄦ埛淇℃伅
+     *
+     * @param userId 鐢ㄦ埛ID
+     * @param ip     IP鍦板潃
+     */
+    void recordLoginInfo(Long userId, String ip);
+
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysUserOnline.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysUserOnline.java
new file mode 100644
index 0000000..4ad3c06
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysUserOnline.java
@@ -0,0 +1,72 @@
+package org.dromara.system.api.domain;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 褰撳墠鍦ㄧ嚎浼氳瘽
+ *
+ * @author Lion Li
+ */
+
+@Data
+@NoArgsConstructor
+public class SysUserOnline implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 浼氳瘽缂栧彿
+     */
+    private String tokenId;
+
+    /**
+     * 閮ㄩ棬鍚嶇О
+     */
+    private String deptName;
+
+    /**
+     * 鐢ㄦ埛鍚嶇О
+     */
+    private String userName;
+
+    /**
+     * 瀹㈡埛绔�
+     */
+    private String clientKey;
+
+    /**
+     * 璁惧绫诲瀷
+     */
+    private String deviceType;
+
+    /**
+     * 鐧诲綍IP鍦板潃
+     */
+    private String ipaddr;
+
+    /**
+     * 鐧诲綍鍦板潃
+     */
+    private String loginLocation;
+
+    /**
+     * 娴忚鍣ㄧ被鍨�
+     */
+    private String browser;
+
+    /**
+     * 鎿嶄綔绯荤粺
+     */
+    private String os;
+
+    /**
+     * 鐧诲綍鏃堕棿
+     */
+    private Long loginTime;
+
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteLogininforBo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteLogininforBo.java
new file mode 100644
index 0000000..ac2c411
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteLogininforBo.java
@@ -0,0 +1,90 @@
+package org.dromara.system.api.domain.bo;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 绯荤粺璁块棶璁板綍琛� sys_logininfor
+ *
+ * @author Lion Li
+ */
+
+@Data
+@NoArgsConstructor
+public class RemoteLogininforBo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 璁块棶ID
+     */
+    private Long infoId;
+
+    /**
+     * 绉熸埛缂栧彿
+     */
+    private String tenantId;
+
+    /**
+     * 鐢ㄦ埛璐﹀彿
+     */
+    private String userName;
+
+    /**
+     * 瀹㈡埛绔�
+     */
+    private String clientKey;
+
+    /**
+     * 璁惧绫诲瀷
+     */
+    private String deviceType;
+
+    /**
+     * 鐧诲綍IP鍦板潃
+     */
+    private String ipaddr;
+
+    /**
+     * 鐧诲綍鍦扮偣
+     */
+    private String loginLocation;
+
+    /**
+     * 娴忚鍣ㄧ被鍨�
+     */
+    private String browser;
+
+    /**
+     * 鎿嶄綔绯荤粺
+     */
+    private String os;
+
+    /**
+     * 鐧诲綍鐘舵�侊紙0鎴愬姛 1澶辫触锛�
+     */
+    private String status;
+
+    /**
+     * 鎻愮ず娑堟伅
+     */
+    private String msg;
+
+    /**
+     * 璁块棶鏃堕棿
+     */
+    private Date loginTime;
+
+    /**
+     * 璇锋眰鍙傛暟
+     */
+    private Map<String, Object> params = new HashMap<>();
+
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteOperLogBo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteOperLogBo.java
new file mode 100644
index 0000000..aad49f6
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteOperLogBo.java
@@ -0,0 +1,120 @@
+package org.dromara.system.api.domain.bo;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 鎿嶄綔鏃ュ織璁板綍琛� oper_log
+ *
+ * @author Lion Li
+ */
+
+@Data
+@NoArgsConstructor
+public class RemoteOperLogBo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 鏃ュ織涓婚敭
+     */
+    private Long operId;
+
+    /**
+     * 绉熸埛缂栧彿
+     */
+    private String tenantId;
+
+    /**
+     * 妯″潡鏍囬
+     */
+    private String title;
+
+    /**
+     * 涓氬姟绫诲瀷锛�0鍏跺畠 1鏂板 2淇敼 3鍒犻櫎锛�
+     */
+    private Integer businessType;
+
+    /**
+     * 鏂规硶鍚嶇О
+     */
+    private String method;
+
+    /**
+     * 璇锋眰鏂瑰紡
+     */
+    private String requestMethod;
+
+    /**
+     * 鎿嶄綔绫诲埆锛�0鍏跺畠 1鍚庡彴鐢ㄦ埛 2鎵嬫満绔敤鎴凤級
+     */
+    private Integer operatorType;
+
+    /**
+     * 鎿嶄綔浜哄憳
+     */
+    private String operName;
+
+    /**
+     * 閮ㄩ棬鍚嶇О
+     */
+    private String deptName;
+
+    /**
+     * 璇锋眰URL
+     */
+    private String operUrl;
+
+    /**
+     * 涓绘満鍦板潃
+     */
+    private String operIp;
+
+    /**
+     * 鎿嶄綔鍦扮偣
+     */
+    private String operLocation;
+
+    /**
+     * 璇锋眰鍙傛暟
+     */
+    private String operParam;
+
+    /**
+     * 杩斿洖鍙傛暟
+     */
+    private String jsonResult;
+
+    /**
+     * 鎿嶄綔鐘舵�侊紙0姝e父 1寮傚父锛�
+     */
+    private Integer status;
+
+    /**
+     * 閿欒娑堟伅
+     */
+    private String errorMsg;
+
+    /**
+     * 鎿嶄綔鏃堕棿
+     */
+    private Date operTime;
+
+    /**
+     * 娑堣�楁椂闂�
+     */
+    private Long costTime;
+
+    /**
+     * 璇锋眰鍙傛暟
+     */
+    private Map<String, Object> params = new HashMap<>();
+
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteSocialBo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteSocialBo.java
new file mode 100644
index 0000000..78daf2f
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteSocialBo.java
@@ -0,0 +1,129 @@
+package org.dromara.system.api.domain.bo;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 绀句細鍖栧叧绯讳笟鍔″璞� sys_social
+ *
+ * @author Michelle.Chung
+ */
+@Data
+@NoArgsConstructor
+public class RemoteSocialBo implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 1L;
+    /**
+     * 涓婚敭
+     */
+    private Long id;
+
+    /**
+     * 鐨勫敮涓�ID
+     */
+    private String authId;
+
+    /**
+     * 鐢ㄦ埛鏉ユ簮
+     */
+    private String source;
+
+    /**
+     * 鐢ㄦ埛鐨勬巿鏉冧护鐗�
+     */
+    private String accessToken;
+
+    /**
+     * 鐢ㄦ埛鐨勬巿鏉冧护鐗岀殑鏈夋晥鏈燂紝閮ㄥ垎骞冲彴鍙兘娌℃湁
+     */
+    private int expireIn;
+
+    /**
+     * 鍒锋柊浠ょ墝锛岄儴鍒嗗钩鍙板彲鑳芥病鏈�
+     */
+    private String refreshToken;
+
+    /**
+     * 骞冲彴鍞竴id
+     */
+    private String openId;
+
+    /**
+     * 鐢ㄦ埛鐨� ID
+     */
+    private Long userId;
+
+    /**
+     * 骞冲彴鐨勬巿鏉冧俊鎭紝閮ㄥ垎骞冲彴鍙兘娌℃湁
+     */
+    private String accessCode;
+
+    /**
+     * 鐢ㄦ埛鐨� unionid
+     */
+    private String unionId;
+
+    /**
+     * 鎺堜簣鐨勬潈闄愶紝閮ㄥ垎骞冲彴鍙兘娌℃湁
+     */
+    private String scope;
+
+    /**
+     * 鎺堟潈鐨勭涓夋柟璐﹀彿
+     */
+    private String userName;
+
+    /**
+     * 鎺堟潈鐨勭涓夋柟鏄电О
+     */
+    private String nickName;
+
+    /**
+     * 鎺堟潈鐨勭涓夋柟閭
+     */
+    private String email;
+
+    /**
+     * 鎺堟潈鐨勭涓夋柟澶村儚鍦板潃
+     */
+    private String avatar;
+
+    /**
+     * 涓埆骞冲彴鐨勬巿鏉冧俊鎭紝閮ㄥ垎骞冲彴鍙兘娌℃湁
+     */
+    private String tokenType;
+
+    /**
+     * id token锛岄儴鍒嗗钩鍙板彲鑳芥病鏈�
+     */
+    private String idToken;
+
+    /**
+     * 灏忕背骞冲彴鐢ㄦ埛鐨勯檮甯﹀睘鎬э紝閮ㄥ垎骞冲彴鍙兘娌℃湁
+     */
+    private String macAlgorithm;
+
+    /**
+     * 灏忕背骞冲彴鐢ㄦ埛鐨勯檮甯﹀睘鎬э紝閮ㄥ垎骞冲彴鍙兘娌℃湁
+     */
+    private String macKey;
+
+    /**
+     * 鐢ㄦ埛鐨勬巿鏉僣ode锛岄儴鍒嗗钩鍙板彲鑳芥病鏈�
+     */
+    private String code;
+
+    /**
+     * Twitter骞冲彴鐢ㄦ埛鐨勯檮甯﹀睘鎬э紝閮ㄥ垎骞冲彴鍙兘娌℃湁
+     */
+    private String oauthToken;
+
+    /**
+     * Twitter骞冲彴鐢ㄦ埛鐨勯檮甯﹀睘鎬э紝閮ㄥ垎骞冲彴鍙兘娌℃湁
+     */
+    private String oauthTokenSecret;
+
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteUserBo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteUserBo.java
new file mode 100644
index 0000000..5d21b09
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteUserBo.java
@@ -0,0 +1,125 @@
+package org.dromara.system.api.domain.bo;
+
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.dromara.common.core.constant.UserConstants;
+import org.dromara.common.core.xss.Xss;
+
+import jakarta.validation.constraints.Email;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Size;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 鐢ㄦ埛淇℃伅涓氬姟瀵硅薄 sys_user
+ *
+ * @author Michelle.Chung
+ */
+
+@Data
+@NoArgsConstructor
+public class RemoteUserBo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 鐢ㄦ埛ID
+     */
+    private Long userId;
+
+    /**
+     * 绉熸埛ID
+     */
+    private String tenantId;
+
+    /**
+     * 閮ㄩ棬ID
+     */
+    private Long deptId;
+
+    /**
+     * 鐢ㄦ埛璐﹀彿
+     */
+    @Xss(message = "鐢ㄦ埛璐﹀彿涓嶈兘鍖呭惈鑴氭湰瀛楃")
+    @NotBlank(message = "鐢ㄦ埛璐﹀彿涓嶈兘涓虹┖")
+    @Size(min = 0, max = 30, message = "鐢ㄦ埛璐﹀彿闀垮害涓嶈兘瓒呰繃{max}涓瓧绗�")
+    private String userName;
+
+    /**
+     * 鐢ㄦ埛鏄电О
+     */
+    @Xss(message = "鐢ㄦ埛鏄电О涓嶈兘鍖呭惈鑴氭湰瀛楃")
+    @Size(min = 0, max = 30, message = "鐢ㄦ埛鏄电О闀垮害涓嶈兘瓒呰繃{max}涓瓧绗�")
+    private String nickName;
+
+    /**
+     * 鐢ㄦ埛绫诲瀷锛坰ys_user绯荤粺鐢ㄦ埛锛�
+     */
+    private String userType;
+
+    /**
+     * 鐢ㄦ埛閭
+     */
+    @Email(message = "閭鏍煎紡涓嶆纭�")
+    @Size(min = 0, max = 50, message = "閭闀垮害涓嶈兘瓒呰繃{max}涓瓧绗�")
+    private String email;
+
+    /**
+     * 鎵嬫満鍙风爜
+     */
+    private String phonenumber;
+
+    /**
+     * 鐢ㄦ埛鎬у埆锛�0鐢� 1濂� 2鏈煡锛�
+     */
+    private String sex;
+
+    /**
+     * 澶村儚鍦板潃
+     */
+    private Long avatar;
+
+    /**
+     * 瀵嗙爜
+     */
+    private String password;
+
+    /**
+     * 甯愬彿鐘舵�侊紙0姝e父 1鍋滅敤锛�
+     */
+    private String status;
+
+    /**
+     * 鏈�鍚庣櫥褰旾P
+     */
+    private String loginIp;
+
+    /**
+     * 鏈�鍚庣櫥褰曟椂闂�
+     */
+    private Date loginDate;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+    /**
+     * 鏁版嵁鏉冮檺 褰撳墠瑙掕壊ID
+     */
+    private Long roleId;
+
+    public RemoteUserBo(Long userId) {
+        this.userId = userId;
+    }
+
+    public boolean isSuperAdmin() {
+        return UserConstants.SUPER_ADMIN_ID.equals(this.userId);
+    }
+
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteClientVo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteClientVo.java
new file mode 100644
index 0000000..400f56b
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteClientVo.java
@@ -0,0 +1,71 @@
+package org.dromara.system.api.domain.vo;
+
+import lombok.Data;
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+
+/**
+ * 鎺堟潈绠$悊瑙嗗浘瀵硅薄 sys_client
+ *
+ * @author Michelle.Chung
+ */
+@Data
+public class RemoteClientVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    private Long id;
+
+    /**
+     * 瀹㈡埛绔痠d
+     */
+    private String clientId;
+
+    /**
+     * 瀹㈡埛绔痥ey
+     */
+    private String clientKey;
+
+    /**
+     * 瀹㈡埛绔閽�
+     */
+    private String clientSecret;
+
+    /**
+     * 鎺堟潈绫诲瀷
+     */
+    private List<String> grantTypeList;
+
+    /**
+     * 鎺堟潈绫诲瀷
+     */
+    private String grantType;
+
+    /**
+     * 璁惧绫诲瀷
+     */
+    private String deviceType;
+
+    /**
+     * token娲昏穬瓒呮椂鏃堕棿
+     */
+    private Long activeTimeout;
+
+    /**
+     * token鍥哄畾瓒呮椂鏃堕棿
+     */
+    private Long timeout;
+
+    /**
+     * 鐘舵�侊紙0姝e父 1鍋滅敤锛�
+     */
+    private String status;
+
+
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteDictDataVo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteDictDataVo.java
new file mode 100644
index 0000000..294d3e3
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteDictDataVo.java
@@ -0,0 +1,76 @@
+package org.dromara.system.api.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 瀛楀吀鏁版嵁瑙嗗浘瀵硅薄 sys_dict_data
+ *
+ * @author Michelle.Chung
+ */
+@Data
+public class RemoteDictDataVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 瀛楀吀缂栫爜
+     */
+    private Long dictCode;
+
+    /**
+     * 瀛楀吀鎺掑簭
+     */
+    private Integer dictSort;
+
+    /**
+     * 瀛楀吀鏍囩
+     */
+    private String dictLabel;
+
+    /**
+     * 瀛楀吀閿��
+     */
+    private String dictValue;
+
+    /**
+     * 瀛楀吀绫诲瀷
+     */
+    private String dictType;
+
+    /**
+     * 鏍峰紡灞炴�э紙鍏朵粬鏍峰紡鎵╁睍锛�
+     */
+    private String cssClass;
+
+    /**
+     * 琛ㄦ牸鍥炴樉鏍峰紡
+     */
+    private String listClass;
+
+    /**
+     * 鏄惁榛樿锛圷鏄� N鍚︼級
+     */
+    private String isDefault;
+
+    /**
+     * 鐘舵�侊紙0姝e父 1鍋滅敤锛�
+     */
+    private String status;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date createTime;
+
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSocialVo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSocialVo.java
new file mode 100644
index 0000000..71e8d58
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSocialVo.java
@@ -0,0 +1,135 @@
+package org.dromara.system.api.domain.vo;
+
+import lombok.Data;
+import java.io.Serial;
+import java.io.Serializable;
+
+
+/**
+ * 绀句細鍖栧叧绯昏鍥惧璞� sys_social
+ *
+ * @author thiszhc
+ */
+@Data
+public class RemoteSocialVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭
+     */
+    private Long id;
+
+    /**
+     * 鐢ㄦ埛ID
+     */
+    private Long userId;
+
+    /**
+     * 绉熸埛ID
+     */
+    private String tenantId;
+
+    /**
+     * 鐨勫敮涓�ID
+     */
+    private String authId;
+
+    /**
+     * 鐢ㄦ埛鏉ユ簮
+     */
+    private String source;
+
+    /**
+     * 鐢ㄦ埛鐨勬巿鏉冧护鐗�
+     */
+    private String accessToken;
+
+    /**
+     * 鐢ㄦ埛鐨勬巿鏉冧护鐗岀殑鏈夋晥鏈燂紝閮ㄥ垎骞冲彴鍙兘娌℃湁
+     */
+    private int expireIn;
+
+    /**
+     * 鍒锋柊浠ょ墝锛岄儴鍒嗗钩鍙板彲鑳芥病鏈�
+     */
+    private String refreshToken;
+
+    /**
+     * 鐢ㄦ埛鐨� open id
+     */
+    private String openId;
+
+    /**
+     * 鎺堟潈鐨勭涓夋柟璐﹀彿
+     */
+    private String userName;
+
+    /**
+     * 鎺堟潈鐨勭涓夋柟鏄电О
+     */
+    private String nickName;
+
+    /**
+     * 鎺堟潈鐨勭涓夋柟閭
+     */
+    private String email;
+
+    /**
+     * 鎺堟潈鐨勭涓夋柟澶村儚鍦板潃
+     */
+    private String avatar;
+
+
+    /**
+     * 骞冲彴鐨勬巿鏉冧俊鎭紝閮ㄥ垎骞冲彴鍙兘娌℃湁
+     */
+    private String accessCode;
+
+    /**
+     * 鐢ㄦ埛鐨� unionid
+     */
+    private String unionId;
+
+    /**
+     * 鎺堜簣鐨勬潈闄愶紝閮ㄥ垎骞冲彴鍙兘娌℃湁
+     */
+    private String scope;
+
+    /**
+     * 涓埆骞冲彴鐨勬巿鏉冧俊鎭紝閮ㄥ垎骞冲彴鍙兘娌℃湁
+     */
+    private String tokenType;
+
+    /**
+     * id token锛岄儴鍒嗗钩鍙板彲鑳芥病鏈�
+     */
+    private String idToken;
+
+    /**
+     * 灏忕背骞冲彴鐢ㄦ埛鐨勯檮甯﹀睘鎬э紝閮ㄥ垎骞冲彴鍙兘娌℃湁
+     */
+    private String macAlgorithm;
+
+    /**
+     * 灏忕背骞冲彴鐢ㄦ埛鐨勯檮甯﹀睘鎬э紝閮ㄥ垎骞冲彴鍙兘娌℃湁
+     */
+    private String macKey;
+
+    /**
+     * 鐢ㄦ埛鐨勬巿鏉僣ode锛岄儴鍒嗗钩鍙板彲鑳芥病鏈�
+     */
+    private String code;
+
+    /**
+     * Twitter骞冲彴鐢ㄦ埛鐨勯檮甯﹀睘鎬э紝閮ㄥ垎骞冲彴鍙兘娌℃湁
+     */
+    private String oauthToken;
+
+    /**
+     * Twitter骞冲彴鐢ㄦ埛鐨勯檮甯﹀睘鎬э紝閮ㄥ垎骞冲彴鍙兘娌℃湁
+     */
+    private String oauthTokenSecret;
+
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteTenantVo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteTenantVo.java
new file mode 100644
index 0000000..b9387f9
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteTenantVo.java
@@ -0,0 +1,91 @@
+package org.dromara.system.api.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 绉熸埛瑙嗗浘瀵硅薄
+ *
+ * @author zhujie
+ */
+@Data
+public class RemoteTenantVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    private Long id;
+
+    /**
+     * 绉熸埛缂栧彿
+     */
+    private String tenantId;
+
+    /**
+     * 鑱旂郴浜�
+     */
+    private String contactUserName;
+
+    /**
+     * 鑱旂郴鐢佃瘽
+     */
+    private String contactPhone;
+
+    /**
+     * 浼佷笟鍚嶇О
+     */
+    private String companyName;
+
+    /**
+     * 缁熶竴绀句細淇$敤浠g爜
+     */
+    private String licenseNumber;
+
+    /**
+     * 鍦板潃
+     */
+    private String address;
+
+    /**
+     * 鍩熷悕
+     */
+    private String domain;
+
+    /**
+     * 浼佷笟绠�浠�
+     */
+    private String intro;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+    /**
+     * 绉熸埛濂楅缂栧彿
+     */
+    private Long packageId;
+
+    /**
+     * 杩囨湡鏃堕棿
+     */
+    private Date expireTime;
+
+    /**
+     * 鐢ㄦ埛鏁伴噺锛�-1涓嶉檺鍒讹級
+     */
+    private Long accountCount;
+
+    /**
+     * 绉熸埛鐘舵�侊紙0姝e父 1鍋滅敤锛�
+     */
+    private String status;
+
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/LoginUser.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/LoginUser.java
new file mode 100644
index 0000000..2463bd0
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/LoginUser.java
@@ -0,0 +1,141 @@
+package org.dromara.system.api.model;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * 鐢ㄦ埛淇℃伅
+ *
+ * @author ruoyi
+ */
+@Data
+@NoArgsConstructor
+public class LoginUser implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 绉熸埛ID
+     */
+    private String tenantId;
+
+    /**
+     * 鐢ㄦ埛ID
+     */
+    private Long userId;
+
+    /**
+     * 閮ㄩ棬ID
+     */
+    private Long deptId;
+
+    /**
+     * 閮ㄩ棬鍚�
+     */
+    private String deptName;
+
+    /**
+     * 鐢ㄦ埛鍞竴鏍囪瘑
+     */
+    private String token;
+
+    /**
+     * 鐢ㄦ埛绫诲瀷
+     */
+    private String userType;
+
+    /**
+     * 鐧诲綍鏃堕棿
+     */
+    private Long loginTime;
+
+    /**
+     * 杩囨湡鏃堕棿
+     */
+    private Long expireTime;
+
+    /**
+     * 鐧诲綍IP鍦板潃
+     */
+    private String ipaddr;
+
+    /**
+     * 鐧诲綍鍦扮偣
+     */
+    private String loginLocation;
+
+    /**
+     * 娴忚鍣ㄧ被鍨�
+     */
+    private String browser;
+
+    /**
+     * 鎿嶄綔绯荤粺
+     */
+    private String os;
+
+    /**
+     * 鑿滃崟鏉冮檺
+     */
+    private Set<String> menuPermission;
+
+    /**
+     * 瑙掕壊鏉冮檺
+     */
+    private Set<String> rolePermission;
+
+    /**
+     * 鐢ㄦ埛鍚�
+     */
+    private String username;
+
+    /**
+     * 鐢ㄦ埛鏄电О
+     */
+    private String nickname;
+
+    /**
+     * 瀵嗙爜
+     */
+    private String password;
+
+    /**
+     * 瑙掕壊瀵硅薄
+     */
+    private List<RoleDTO> roles;
+
+    /**
+     * 鏁版嵁鏉冮檺 褰撳墠瑙掕壊ID
+     */
+    private Long roleId;
+
+    /**
+     * 瀹㈡埛绔�
+     */
+    private String clientKey;
+
+    /**
+     * 璁惧绫诲瀷
+     */
+    private String deviceType;
+
+    /**
+     * 鑾峰彇鐧诲綍id
+     */
+    public String getLoginId() {
+        if (userType == null) {
+            throw new IllegalArgumentException("鐢ㄦ埛绫诲瀷涓嶈兘涓虹┖");
+        }
+        if (userId == null) {
+            throw new IllegalArgumentException("鐢ㄦ埛ID涓嶈兘涓虹┖");
+        }
+        return userType + ":" + userId;
+    }
+
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/RoleDTO.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/RoleDTO.java
new file mode 100644
index 0000000..71b9af3
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/RoleDTO.java
@@ -0,0 +1,42 @@
+package org.dromara.system.api.model;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 瑙掕壊
+ *
+ * @author Lion Li
+ */
+
+@Data
+@NoArgsConstructor
+public class RoleDTO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 瑙掕壊ID
+     */
+    private Long roleId;
+
+    /**
+     * 瑙掕壊鍚嶇О
+     */
+    private String roleName;
+
+    /**
+     * 瑙掕壊鏉冮檺
+     */
+    private String roleKey;
+
+    /**
+     * 鏁版嵁鑼冨洿锛�1锛氭墍鏈夋暟鎹潈闄愶紱2锛氳嚜瀹氫箟鏁版嵁鏉冮檺锛�3锛氭湰閮ㄩ棬鏁版嵁鏉冮檺锛�4锛氭湰閮ㄩ棬鍙婁互涓嬫暟鎹潈闄愶紱5锛氫粎鏈汉鏁版嵁鏉冮檺锛�
+     */
+    private String dataScope;
+
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/XcxLoginUser.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/XcxLoginUser.java
new file mode 100644
index 0000000..3982e2e
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/XcxLoginUser.java
@@ -0,0 +1,27 @@
+package org.dromara.system.api.model;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+
+/**
+ * 灏忕▼搴忕櫥褰曠敤鎴疯韩浠芥潈闄�
+ *
+ * @author Lion Li
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+public class XcxLoginUser extends LoginUser {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * openid
+     */
+    private String openid;
+
+}
diff --git a/ruoyi-example/pom.xml b/ruoyi-example/pom.xml
new file mode 100644
index 0000000..eebbb56
--- /dev/null
+++ b/ruoyi-example/pom.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.dromara</groupId>
+        <artifactId>ruoyi-cloud-plus</artifactId>
+        <version>${revision}</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <modules>
+        <module>ruoyi-demo</module>
+        <module>ruoyi-stream-mq</module>
+    </modules>
+
+    <artifactId>ruoyi-example</artifactId>
+    <packaging>pom</packaging>
+
+    <description>
+        ruoyi-example 渚嬪瓙妯″潡
+    </description>
+
+    <dependencies>
+        <!-- 鑷畾涔夎礋杞藉潎琛�(澶氬洟闃熷紑鍙戜娇鐢�) -->
+<!--        <dependency>-->
+<!--            <groupId>org.dromara</groupId>-->
+<!--            <artifactId>ruoyi-common-loadbalancer</artifactId>-->
+<!--        </dependency>-->
+
+        <!-- skywalking 鏃ュ織鏀堕泦 -->
+<!--        <dependency>-->
+<!--            <groupId>org.dromara</groupId>-->
+<!--            <artifactId>ruoyi-common-skylog</artifactId>-->
+<!--        </dependency>-->
+
+        <!-- prometheus 鐩戞帶 -->
+<!--        <dependency>-->
+<!--            <groupId>org.dromara</groupId>-->
+<!--            <artifactId>ruoyi-common-prometheus</artifactId>-->
+<!--        </dependency>-->
+    </dependencies>
+
+</project>
diff --git a/ruoyi-example/ruoyi-demo/README.md b/ruoyi-example/ruoyi-demo/README.md
new file mode 100644
index 0000000..5ac83c8
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/README.md
@@ -0,0 +1,2 @@
+# 浣跨敤璇存槑
+闇�瑕佸湪 `ry-cloud` 鏁版嵁搴撳唴鎵ц `test.sql` 鏂囦欢 鍒濆鍖栨祴璇曟暟鎹�
\ No newline at end of file
diff --git a/ruoyi-example/ruoyi-demo/pom.xml b/ruoyi-example/ruoyi-demo/pom.xml
new file mode 100644
index 0000000..d717e93
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/pom.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.dromara</groupId>
+        <artifactId>ruoyi-example</artifactId>
+        <version>${revision}</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>ruoyi-demo</artifactId>
+
+    <description>
+        ruoyi-demo 婕旂ず妯″潡
+    </description>
+
+    <dependencies>
+
+        <!-- SpringCloud Alibaba Nacos -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+
+        <!-- SpringCloud Alibaba Nacos Config -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-sentinel</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-log</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-doc</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-security</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-mybatis</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-dubbo</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-idempotent</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-mail</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-sms</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-encrypt</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-tenant</artifactId>
+        </dependency>
+
+        <!-- 鐭俊 鐢ㄥ摢涓鍏ュ摢涓緷璧� -->
+<!--        <dependency>-->
+<!--            <groupId>com.aliyun</groupId>-->
+<!--            <artifactId>dysmsapi20170525</artifactId>-->
+<!--        </dependency>-->
+
+<!--        <dependency>-->
+<!--            <groupId>com.tencentcloudapi</groupId>-->
+<!--            <artifactId>tencentcloud-sdk-java-sms</artifactId>-->
+<!--        </dependency>-->
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-elasticsearch</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-sensitive</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>${project.artifactId}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>${spring-boot.version}</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/RuoYiDemoApplication.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/RuoYiDemoApplication.java
new file mode 100644
index 0000000..c62aa66
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/RuoYiDemoApplication.java
@@ -0,0 +1,20 @@
+package org.dromara.demo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
+
+/**
+ * 婕旂ず妯″潡
+ *
+ * @author Lion Li
+ */
+@SpringBootApplication
+public class RuoYiDemoApplication {
+    public static void main(String[] args) {
+        SpringApplication application = new SpringApplication(RuoYiDemoApplication.class);
+        application.setApplicationStartup(new BufferingApplicationStartup(2048));
+        application.run(args);
+        System.out.println("(鈾モ棤鈥库棤)锞夛緸  婕旂ず妯″潡鍚姩鎴愬姛   醿�(麓凇`醿�)锞�  ");
+    }
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/EsCrudController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/EsCrudController.java
new file mode 100644
index 0000000..d3a1548
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/EsCrudController.java
@@ -0,0 +1,89 @@
+package org.dromara.demo.controller;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.demo.domain.Document;
+import org.dromara.demo.esmapper.DocumentMapper;
+import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 鎼滅储寮曟搸 crud 婕旂ず妗堜緥
+ *
+ * @author Lion Li
+ */
+@ConditionalOnProperty(value = "easy-es.enable", havingValue = "true")
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/es")
+public class EsCrudController {
+
+    private final DocumentMapper documentMapper;
+
+    /**
+     * 鏌ヨ(鎸囧畾)
+     *
+     * @param title 鏍囬
+     */
+    @GetMapping("/select")
+    public Document select(String title) {
+        LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
+        wrapper.eq(Document::getTitle, title);
+        return documentMapper.selectOne(wrapper);
+    }
+
+    /**
+     * 鎼滅储(妯$硦)
+     *
+     * @param key 鎼滅储鍏抽敭瀛�
+     */
+    @GetMapping("/search")
+    public List<Document> search(String key) {
+        LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
+        wrapper.like(Document::getTitle, key);
+        return documentMapper.selectList(wrapper);
+    }
+
+    /**
+     * 鎻掑叆
+     */
+    @PostMapping("/insert")
+    public Integer insert(@RequestBody Document document) {
+        return documentMapper.insert(document);
+    }
+
+    /**
+     * 鏇存柊
+     */
+    @PutMapping("/update")
+    public R<Void> update(@RequestBody Document document) {
+        // 娴嬭瘯鏇存柊 鏇存柊鏈変袱绉嶆儏鍐� 鍒嗗埆婕旂ず濡備笅:
+        // case1: 宸茬煡id, 鏍规嵁id鏇存柊 (涓轰簡婕旂ず鏂逛究,姝d鏄粠涓婁竴姝ユ煡璇腑澶嶅埗杩囨潵鐨�,瀹為檯涓氬姟鍙互鑷鏌ヨ)
+        documentMapper.updateById(document);
+
+        // case2: id鏈煡, 鏍规嵁鏉′欢鏇存柊
+//        LambdaEsUpdateWrapper<Document> wrapper = new LambdaEsUpdateWrapper<>();
+//        wrapper.like(Document::getTitle, document.getTitle());
+//        Document document2 = new Document();
+//        document2.setTitle(document.getTitle());
+//        document2.setContent(document.getContent());
+//        documentMapper.update(document2, wrapper);
+
+        return R.ok();
+    }
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    @DeleteMapping("/delete/{id}")
+    public R<Integer> delete(@PathVariable String id) {
+        // 娴嬭瘯鍒犻櫎鏁版嵁 鍒犻櫎鏈変袱绉嶆儏鍐�:鏍规嵁id鍒犳垨鏍规嵁鏉′欢鍒�
+        return R.ok(documentMapper.deleteById(id));
+    }
+
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/MailController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/MailController.java
new file mode 100644
index 0000000..7f3e3b7
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/MailController.java
@@ -0,0 +1,52 @@
+package org.dromara.demo.controller;
+
+import org.dromara.common.core.domain.R;
+import org.dromara.common.mail.utils.MailUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.File;
+
+
+/**
+ * 閭欢鍙戦�佹渚�
+ *
+ * @author Michelle.Chung
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/mail")
+public class MailController {
+
+    /**
+     * 鍙戦�侀偖浠�
+     *
+     * @param to 鎺ユ敹浜�
+     * @param subject 鏍囬
+     * @param text 鍐呭
+     */
+    @GetMapping("/sendSimpleMessage")
+    public R<Void> sendSimpleMessage(String to, String subject, String text) {
+        MailUtils.sendText(to, subject, text);
+        return R.ok();
+    }
+
+    /**
+     * 鍙戦�侀偖浠讹紙甯﹂檮浠讹級
+     *
+     * @param to 鎺ユ敹浜�
+     * @param subject 鏍囬
+     * @param text 鍐呭
+     * @param filePath 闄勪欢璺緞
+     */
+    @GetMapping("/sendMessageWithAttachment")
+    public R<Void> sendMessageWithAttachment(String to, String subject, String text, String filePath) {
+        MailUtils.sendText(to, subject, text, new File(filePath));
+        return R.ok();
+    }
+
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisCacheController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisCacheController.java
new file mode 100644
index 0000000..9a6508a
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisCacheController.java
@@ -0,0 +1,95 @@
+package org.dromara.demo.controller;
+
+import org.dromara.common.core.constant.CacheNames;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.redis.utils.RedisUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.CachePut;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.time.Duration;
+
+/**
+ * spring-cache 婕旂ず妗堜緥
+ *
+ * @author Lion Li
+ */
+// 绫荤骇鍒� 缂撳瓨缁熶竴閰嶇疆
+//@CacheConfig(cacheNames = CacheNames.DEMO_CACHE)
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/cache")
+public class RedisCacheController {
+
+    /**
+     * 娴嬭瘯 @Cacheable
+     * <p>
+     * 琛ㄧず杩欎釜鏂规硶鏈変簡缂撳瓨鐨勫姛鑳�,鏂规硶鐨勮繑鍥炲�间細琚紦瀛樹笅鏉�
+     * 涓嬩竴娆¤皟鐢ㄨ鏂规硶鍓�,浼氬幓妫�鏌ユ槸鍚︾紦瀛樹腑宸茬粡鏈夊��
+     * 濡傛灉鏈夊氨鐩存帴杩斿洖,涓嶈皟鐢ㄦ柟娉�
+     * 濡傛灉娌℃湁,灏辫皟鐢ㄦ柟娉�,鐒跺悗鎶婄粨鏋滅紦瀛樿捣鏉�
+     * 杩欎釜娉ㄨВ銆屼竴鑸敤鍦ㄦ煡璇㈡柟娉曚笂銆�
+     * <p>
+     * 閲嶇偣璇存槑: 缂撳瓨娉ㄨВ涓ョ涓庡叾浠栫瓫閫夋暟鎹姛鑳戒竴璧蜂娇鐢�
+     * 渚嬪: 鏁版嵁鏉冮檺娉ㄨВ 浼氶�犳垚 缂撳瓨鍑荤┛ 涓� 鏁版嵁涓嶄竴鑷撮棶棰�
+     * <p>
+     * cacheNames 鍛藉悕瑙勫垯 鏌ョ湅 {@link CacheNames} 娉ㄩ噴 鏀寔澶氬弬鏁�
+     */
+    @Cacheable(cacheNames = "demo:cache#60s#10m#20", key = "#key", condition = "#key != null")
+    @GetMapping("/test1")
+    public R<String> test1(String key, String value) {
+        return R.ok("鎿嶄綔鎴愬姛", value);
+    }
+
+    /**
+     * 娴嬭瘯 @CachePut
+     * <p>
+     * 鍔犱簡@CachePut娉ㄨВ鐨勬柟娉�,浼氭妸鏂规硶鐨勮繑鍥炲�紁ut鍒扮紦瀛橀噷闈㈢紦瀛樿捣鏉�,渚涘叾瀹冨湴鏂逛娇鐢�
+     * 瀹冦�岄�氬父鐢ㄥ湪鏂板鎴栬�呭疄鏃舵洿鏂版柟娉曚笂銆�
+     * <p>
+     * cacheNames 鍛藉悕瑙勫垯 鏌ョ湅 {@link CacheNames} 娉ㄩ噴 鏀寔澶氬弬鏁�
+     */
+    @CachePut(cacheNames = CacheNames.DEMO_CACHE, key = "#key", condition = "#key != null")
+    @GetMapping("/test2")
+    public R<String> test2(String key, String value) {
+        return R.ok("鎿嶄綔鎴愬姛", value);
+    }
+
+    /**
+     * 娴嬭瘯 @CacheEvict
+     * <p>
+     * 浣跨敤浜咰acheEvict娉ㄨВ鐨勬柟娉�,浼氭竻绌烘寚瀹氱紦瀛�
+     * 銆屼竴鑸敤鍦ㄥ垹闄ょ殑鏂规硶涓娿��
+     * <p>
+     * cacheNames 鍛藉悕瑙勫垯 鏌ョ湅 {@link CacheNames} 娉ㄩ噴 鏀寔澶氬弬鏁�
+     */
+    @CacheEvict(cacheNames = CacheNames.DEMO_CACHE, key = "#key", condition = "#key != null")
+    @GetMapping("/test3")
+    public R<String> test3(String key, String value) {
+        return R.ok("鎿嶄綔鎴愬姛", value);
+    }
+
+    /**
+     * 娴嬭瘯璁剧疆杩囨湡鏃堕棿
+     * 鎵嬪姩璁剧疆杩囨湡鏃堕棿10绉�
+     * 11绉掑悗鑾峰彇 鍒ゆ柇鏄惁鐩哥瓑
+     */
+    @GetMapping("/test6")
+    public R<Boolean> test6(String key, String value) {
+        RedisUtils.setCacheObject(key, value);
+        boolean flag = RedisUtils.expire(key, Duration.ofSeconds(10));
+        System.out.println("***********" + flag);
+        try {
+            Thread.sleep(11 * 1000);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        Object obj = RedisUtils.getCacheObject(key);
+        return R.ok(value.equals(obj));
+    }
+
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisLockController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisLockController.java
new file mode 100644
index 0000000..1cf0542
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisLockController.java
@@ -0,0 +1,71 @@
+package org.dromara.demo.controller;
+
+import com.baomidou.lock.LockInfo;
+import com.baomidou.lock.LockTemplate;
+import com.baomidou.lock.annotation.Lock4j;
+import com.baomidou.lock.executor.RedissonLockExecutor;
+import org.dromara.common.core.domain.R;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.time.LocalTime;
+
+
+/**
+ * 娴嬭瘯鍒嗗竷寮忛攣鐨勬牱渚�
+ *
+ * @author shenxinquan
+ */
+@Slf4j
+@RestController
+@RequestMapping("/redisLock")
+public class RedisLockController {
+
+    @Autowired
+    private LockTemplate lockTemplate;
+
+    /**
+     * 娴嬭瘯lock4j 娉ㄨВ
+     */
+    @Lock4j(keys = {"#key"})
+    @GetMapping("/testLock4j")
+    public R<String> testLock4j(String key, String value) {
+        System.out.println("start:" + key + ",time:" + LocalTime.now());
+        try {
+            Thread.sleep(10000);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        System.out.println("end :" + key + ",time:" + LocalTime.now());
+        return R.ok("鎿嶄綔鎴愬姛", value);
+    }
+
+    /**
+     * 娴嬭瘯lock4j 宸ュ叿
+     */
+    @GetMapping("/testLock4jLockTemplate")
+    public R<String> testLock4jLockTemplate(String key, String value) {
+        final LockInfo lockInfo = lockTemplate.lock(key, 30000L, 5000L, RedissonLockExecutor.class);
+        if (null == lockInfo) {
+            throw new RuntimeException("涓氬姟澶勭悊涓�,璇风◢鍚庡啀璇�");
+        }
+        // 鑾峰彇閿佹垚鍔燂紝澶勭悊涓氬姟
+        try {
+            try {
+                Thread.sleep(8000);
+            } catch (InterruptedException e) {
+                //
+            }
+            System.out.println("鎵ц绠�鍗曟柟娉�1 , 褰撳墠绾跨▼:" + Thread.currentThread().getName());
+        } finally {
+            //閲婃斁閿�
+            lockTemplate.releaseLock(lockInfo);
+        }
+        //缁撴潫
+        return R.ok("鎿嶄綔鎴愬姛", value);
+    }
+
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisPubSubController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisPubSubController.java
new file mode 100644
index 0000000..5b19610
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisPubSubController.java
@@ -0,0 +1,47 @@
+package org.dromara.demo.controller;
+
+import org.dromara.common.core.domain.R;
+import org.dromara.common.redis.utils.RedisUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * Redis 鍙戝竷璁㈤槄 婕旂ず妗堜緥
+ *
+ * @author Lion Li
+ */
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/redis/pubsub")
+public class RedisPubSubController {
+
+    /**
+     * 鍙戝竷娑堟伅
+     *
+     * @param key 閫氶亾Key
+     * @param value 鍙戦�佸唴瀹�
+     */
+    @GetMapping("/pub")
+    public R<Void> pub(String key, String value) {
+        RedisUtils.publish(key, value, consumer -> {
+            System.out.println("鍙戝竷閫氶亾 => " + key + ", 鍙戦�佸�� => " + value);
+        });
+        return R.ok("鎿嶄綔鎴愬姛");
+    }
+
+    /**
+     * 璁㈤槄娑堟伅
+     *
+     * @param key 閫氶亾Key
+     */
+    @GetMapping("/sub")
+    public R<Void> sub(String key) {
+        RedisUtils.subscribe(key, String.class, msg -> {
+            System.out.println("璁㈤槄閫氶亾 => " + key + ", 鎺ユ敹鍊� => " + msg);
+        });
+        return R.ok("鎿嶄綔鎴愬姛");
+    }
+
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java
new file mode 100644
index 0000000..f14fdb7
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java
@@ -0,0 +1,59 @@
+package org.dromara.demo.controller;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.sms4j.api.SmsBlend;
+import org.dromara.sms4j.api.entity.SmsResponse;
+import org.dromara.sms4j.core.factory.SmsFactory;
+import org.dromara.sms4j.provider.enumerate.SupplierType;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.LinkedHashMap;
+
+/**
+ * 鐭俊婕旂ず妗堜緥
+ * 璇峰厛闃呰鏂囨。 鍚﹀垯鏃犳硶浣跨敤
+ *
+ * @author Lion Li
+ * @version 4.2.0
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/sms")
+public class SmsController {
+    /**
+     * 鍙戦�佺煭淇liyun
+     *
+     * @param phones     鐢佃瘽鍙�
+     * @param templateId 妯℃澘ID
+     */
+    @GetMapping("/sendAliyun")
+    public R<Object> sendAliyun(String phones, String templateId) {
+        LinkedHashMap<String, String> map = new LinkedHashMap<>(1);
+        map.put("code", "1234");
+        SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.ALIBABA);
+        SmsResponse smsResponse = smsBlend.sendMessage(phones, templateId, map);
+        return R.ok(smsResponse);
+    }
+
+    /**
+     * 鍙戦�佺煭淇encent
+     *
+     * @param phones     鐢佃瘽鍙�
+     * @param templateId 妯℃澘ID
+     */
+    @GetMapping("/sendTencent")
+    public R<Object> sendTencent(String phones, String templateId) {
+        LinkedHashMap<String, String> map = new LinkedHashMap<>(1);
+//        map.put("2", "娴嬭瘯娴嬭瘯");
+        map.put("1", "1234");
+        SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.TENCENT);
+        SmsResponse smsResponse = smsBlend.sendMessage(phones, templateId, map);
+        return R.ok(smsResponse);
+    }
+
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/Swagger3DemoController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/Swagger3DemoController.java
new file mode 100644
index 0000000..bb02f98
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/Swagger3DemoController.java
@@ -0,0 +1,31 @@
+package org.dromara.demo.controller;
+
+import org.dromara.common.core.domain.R;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestPart;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * swagger3 鐢ㄦ硶绀轰緥
+ *
+ * @author Lion Li
+ */
+@RestController
+@RequestMapping("/swagger/demo")
+public class Swagger3DemoController {
+
+    /**
+     * 涓婁紶璇锋眰
+     * 蹇呴』浣跨敤 @RequestPart 娉ㄨВ鏍囨敞涓烘枃浠�
+     *
+     * @param file 鏂囦欢
+     */
+    @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public R<String> upload(@RequestPart("file") MultipartFile file) {
+        return R.ok("鎿嶄綔鎴愬姛", file.getOriginalFilename());
+    }
+
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestBatchController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestBatchController.java
new file mode 100644
index 0000000..2c49b4d
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestBatchController.java
@@ -0,0 +1,89 @@
+package org.dromara.demo.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.demo.domain.TestDemo;
+import org.dromara.demo.mapper.TestDemoMapper;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 娴嬭瘯鎵归噺鏂规硶
+ *
+ * @author Lion Li
+ * @date 2021-05-30
+ */
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/batch")
+public class TestBatchController extends BaseController {
+
+    /**
+     * 涓轰簡渚夸簬娴嬭瘯 鐩存帴寮曞叆mapper
+     */
+    private final TestDemoMapper testDemoMapper;
+
+    /**
+     * 鏂板鎵归噺鏂规硶 鍙畬缇庢浛浠� saveBatch 绉掔骇鎻掑叆涓婁竾鏁版嵁 (瀵筸ysql璐熻嵎杈冨ぇ)
+     * <p>
+     * 3.5.0 鐗堟湰 澧炲姞 rewriteBatchedStatements=true 鎵瑰鐞嗗弬鏁� 浣� MP 鍘熺敓鎵瑰鐞嗗彲浠ヨ揪鍒板悓鏍风殑閫熷害
+     */
+    @PostMapping("/add")
+//    @DS("slave")
+    public R<Void> add() {
+        List<TestDemo> list = new ArrayList<>();
+        for (int i = 0; i < 1000; i++) {
+            TestDemo testDemo = new TestDemo();
+            testDemo.setOrderNum(-1);
+            testDemo.setTestKey("鎵归噺鏂板");
+            testDemo.setValue("娴嬭瘯鏂板");
+            list.add(testDemo);
+        }
+        return toAjax(testDemoMapper.insertBatch(list));
+    }
+
+    /**
+     * 鏂板鎴栨洿鏂� 鍙畬缇庢浛浠� saveOrUpdateBatch 楂樻�ц兘
+     * <p>
+     * 3.5.0 鐗堟湰 澧炲姞 rewriteBatchedStatements=true 鎵瑰鐞嗗弬鏁� 浣� MP 鍘熺敓鎵瑰鐞嗗彲浠ヨ揪鍒板悓鏍风殑閫熷害
+     */
+    @PostMapping("/addOrUpdate")
+//    @DS("slave")
+    public R<Void> addOrUpdate() {
+        List<TestDemo> list = new ArrayList<>();
+        for (int i = 0; i < 1000; i++) {
+            TestDemo testDemo = new TestDemo();
+            testDemo.setOrderNum(-1);
+            testDemo.setTestKey("鎵归噺鏂板");
+            testDemo.setValue("娴嬭瘯鏂板");
+            list.add(testDemo);        }
+        testDemoMapper.insertBatch(list);
+        for (int i = 0; i < list.size(); i++) {
+            TestDemo testDemo = list.get(i);
+            testDemo.setTestKey("鎵归噺鏂板鎴栦慨鏀�");
+            testDemo.setValue("鎵归噺鏂板鎴栦慨鏀�");
+            if (i % 2 == 0) {
+                testDemo.setId(null);
+            }
+        }
+        return toAjax(testDemoMapper.insertOrUpdateBatch(list));
+    }
+
+    /**
+     * 鍒犻櫎鎵归噺鏂规硶
+     */
+    @DeleteMapping()
+//    @DS("slave")
+    public R<Void> remove() {
+        return toAjax(testDemoMapper.delete(new LambdaQueryWrapper<TestDemo>()
+            .eq(TestDemo::getOrderNum, -1L)));
+    }
+
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestDemoController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestDemoController.java
new file mode 100644
index 0000000..93b4687
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestDemoController.java
@@ -0,0 +1,146 @@
+package org.dromara.demo.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.bean.BeanUtil;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.utils.ValidatorUtils;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.core.validate.QueryGroup;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.excel.core.ExcelResult;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.demo.domain.TestDemo;
+import org.dromara.demo.domain.bo.TestDemoBo;
+import org.dromara.demo.domain.bo.TestDemoImportVo;
+import org.dromara.demo.domain.vo.TestDemoVo;
+import org.dromara.demo.service.ITestDemoService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.MediaType;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 娴嬭瘯鍗曡〃Controller
+ *
+ * @author Lion Li
+ * @date 2021-07-26
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/demo")
+public class TestDemoController extends BaseController {
+
+    private final ITestDemoService iTestDemoService;
+
+    /**
+     * 鏌ヨ娴嬭瘯鍗曡〃鍒楄〃
+     */
+    @SaCheckPermission("demo:demo:list")
+    @GetMapping("/list")
+    public TableDataInfo<TestDemoVo> list(TestDemoBo bo, PageQuery pageQuery) {
+        return iTestDemoService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 鑷畾涔夊垎椤垫煡璇�
+     */
+    @SaCheckPermission("demo:demo:list")
+    @GetMapping("/page")
+    public TableDataInfo<TestDemoVo> page(@Validated(QueryGroup.class) TestDemoBo bo, PageQuery pageQuery) {
+        return iTestDemoService.customPageList(bo, pageQuery);
+    }
+
+    /**
+     * 瀵煎叆娴嬭瘯-鏍¢獙
+     *
+     * @param file 瀵煎叆鏂囦欢
+     */
+    @Log(title = "娴嬭瘯鍗曡〃", businessType = BusinessType.IMPORT)
+    @SaCheckPermission("demo:demo:import")
+    @PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public R<Void> importData(@RequestPart("file") MultipartFile file) throws Exception {
+        ExcelResult<TestDemoImportVo> excelResult = ExcelUtil.importExcel(file.getInputStream(), TestDemoImportVo.class, true);
+        List<TestDemoImportVo> volist = excelResult.getList();
+        List<TestDemo> list = BeanUtil.copyToList(volist, TestDemo.class);
+        iTestDemoService.saveBatch(list);
+        return R.ok(excelResult.getAnalysis());
+    }
+
+    /**
+     * 瀵煎嚭娴嬭瘯鍗曡〃鍒楄〃
+     */
+    @SaCheckPermission("demo:demo:export")
+    @Log(title = "娴嬭瘯鍗曡〃", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(@Validated TestDemoBo bo, HttpServletResponse response) {
+        List<TestDemoVo> list = iTestDemoService.queryList(bo);
+        // 娴嬭瘯闆姳id瀵煎嚭
+//        for (TestDemoVo vo : list) {
+//            vo.setId(1234567891234567893L);
+//        }
+        ExcelUtil.exportExcel(list, "娴嬭瘯鍗曡〃", TestDemoVo.class, response);
+    }
+
+    /**
+     * 鑾峰彇娴嬭瘯鍗曡〃璇︾粏淇℃伅
+     *
+     * @param id 娴嬭瘯ID
+     */
+    @SaCheckPermission("demo:demo:query")
+    @GetMapping("/{id}")
+    public R<TestDemoVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖") @PathVariable("id") Long id) {
+        return R.ok(iTestDemoService.queryById(id));
+    }
+
+    /**
+     * 鏂板娴嬭瘯鍗曡〃
+     */
+    @SaCheckPermission("demo:demo:add")
+    @Log(title = "娴嬭瘯鍗曡〃", businessType = BusinessType.INSERT)
+    @RepeatSubmit(interval = 2, timeUnit = TimeUnit.SECONDS, message = "{repeat.submit.message}")
+    @PostMapping()
+    public R<Void> add(@RequestBody TestDemoBo bo) {
+        // 浣跨敤鏍¢獙宸ュ叿瀵规爣 @Validated(AddGroup.class) 娉ㄨВ
+        // 鐢ㄤ簬鍦ㄩ潪 Controller 鐨勫湴鏂规牎楠屽璞�
+        ValidatorUtils.validate(bo, AddGroup.class);
+        return toAjax(iTestDemoService.insertByBo(bo));
+    }
+
+    /**
+     * 淇敼娴嬭瘯鍗曡〃
+     */
+    @SaCheckPermission("demo:demo:edit")
+    @Log(title = "娴嬭瘯鍗曡〃", businessType = BusinessType.UPDATE)
+    @RepeatSubmit
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody TestDemoBo bo) {
+        return toAjax(iTestDemoService.updateByBo(bo));
+    }
+
+    /**
+     * 鍒犻櫎娴嬭瘯鍗曡〃
+     *
+     * @param ids 娴嬭瘯ID涓�
+     */
+    @SaCheckPermission("demo:demo:remove")
+    @Log(title = "娴嬭瘯鍗曡〃", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖") @PathVariable Long[] ids) {
+        return toAjax(iTestDemoService.deleteWithValidByIds(Arrays.asList(ids), true));
+    }
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestEncryptController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestEncryptController.java
new file mode 100644
index 0000000..de32a43
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestEncryptController.java
@@ -0,0 +1,55 @@
+package org.dromara.demo.controller;
+
+import org.dromara.common.core.domain.R;
+import org.dromara.demo.domain.TestDemoEncrypt;
+import org.dromara.demo.mapper.TestDemoEncryptMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+/**
+ * 娴嬭瘯鏁版嵁搴撳姞瑙e瘑鍔熻兘
+ *
+ * @author Lion Li
+ */
+@Validated
+@RestController
+@RequestMapping("/encrypt")
+public class TestEncryptController {
+
+    @Autowired
+    private TestDemoEncryptMapper mapper;
+    @Value("${mybatis-encryptor.enable}")
+    private Boolean encryptEnable;
+
+    /**
+     * 娴嬭瘯鏁版嵁搴撳姞瑙e瘑
+     *
+     * @param key   娴嬭瘯key
+     * @param value 娴嬭瘯value
+     */
+    @GetMapping()
+    public R<Map<String, TestDemoEncrypt>> test(String key, String value) {
+        if (!encryptEnable) {
+            throw new RuntimeException("鍔犲瘑鍔熻兘鏈紑鍚�!");
+        }
+        Map<String, TestDemoEncrypt> map = new HashMap<>(2);
+        TestDemoEncrypt demo = new TestDemoEncrypt();
+        demo.setTestKey(key);
+        demo.setValue(value);
+        mapper.insert(demo);
+        map.put("鍔犲瘑", demo);
+        TestDemoEncrypt testDemo = mapper.selectById(demo.getId());
+        map.put("瑙e瘑", testDemo);
+        return R.ok(map);
+    }
+
+
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestExcelController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestExcelController.java
new file mode 100644
index 0000000..d82ea3b
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestExcelController.java
@@ -0,0 +1,160 @@
+package org.dromara.demo.controller;
+
+import cn.hutool.core.collection.CollUtil;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.excel.core.ExcelResult;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.demo.domain.vo.ExportDemoVo;
+import org.dromara.demo.listener.ExportDemoListener;
+import org.dromara.demo.service.IExportExcelService;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 娴嬭瘯Excel鍔熻兘
+ *
+ * @author Lion Li
+ */
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/excel")
+public class TestExcelController {
+
+    private final IExportExcelService exportExcelService;
+
+    /**
+     * 鍗曞垪琛ㄥ鏁版嵁
+     */
+    @GetMapping("/exportTemplateOne")
+    public void exportTemplateOne(HttpServletResponse response) {
+        Map<String, String> map = new HashMap<>();
+        map.put("title", "鍗曞垪琛ㄥ鏁版嵁");
+        map.put("test1", "鏁版嵁娴嬭瘯1");
+        map.put("test2", "鏁版嵁娴嬭瘯2");
+        map.put("test3", "鏁版嵁娴嬭瘯3");
+        map.put("test4", "鏁版嵁娴嬭瘯4");
+        map.put("testTest", "666");
+        List<TestObj> list = new ArrayList<>();
+        list.add(new TestObj("鍗曞垪琛ㄦ祴璇�1", "鍒楄〃娴嬭瘯1", "鍒楄〃娴嬭瘯2", "鍒楄〃娴嬭瘯3", "鍒楄〃娴嬭瘯4"));
+        list.add(new TestObj("鍗曞垪琛ㄦ祴璇�2", "鍒楄〃娴嬭瘯5", "鍒楄〃娴嬭瘯6", "鍒楄〃娴嬭瘯7", "鍒楄〃娴嬭瘯8"));
+        list.add(new TestObj("鍗曞垪琛ㄦ祴璇�3", "鍒楄〃娴嬭瘯9", "鍒楄〃娴嬭瘯10", "鍒楄〃娴嬭瘯11", "鍒楄〃娴嬭瘯12"));
+        ExcelUtil.exportTemplate(CollUtil.newArrayList(map, list), "鍗曞垪琛�.xlsx", "excel/鍗曞垪琛�.xlsx", response);
+    }
+
+    /**
+     * 澶氬垪琛ㄥ鏁版嵁
+     */
+    @GetMapping("/exportTemplateMuliti")
+    public void exportTemplateMuliti(HttpServletResponse response) {
+        Map<String, String> map = new HashMap<>();
+        map.put("title1", "鏍囬1");
+        map.put("title2", "鏍囬2");
+        map.put("title3", "鏍囬3");
+        map.put("title4", "鏍囬4");
+        map.put("author", "Lion Li");
+        List<TestObj1> list1 = new ArrayList<>();
+        list1.add(new TestObj1("list1娴嬭瘯1", "list1娴嬭瘯2", "list1娴嬭瘯3"));
+        list1.add(new TestObj1("list1娴嬭瘯4", "list1娴嬭瘯5", "list1娴嬭瘯6"));
+        list1.add(new TestObj1("list1娴嬭瘯7", "list1娴嬭瘯8", "list1娴嬭瘯9"));
+        List<TestObj1> list2 = new ArrayList<>();
+        list2.add(new TestObj1("list2娴嬭瘯1", "list2娴嬭瘯2", "list2娴嬭瘯3"));
+        list2.add(new TestObj1("list2娴嬭瘯4", "list2娴嬭瘯5", "list2娴嬭瘯6"));
+        List<TestObj1> list3 = new ArrayList<>();
+        list3.add(new TestObj1("list3娴嬭瘯1", "list3娴嬭瘯2", "list3娴嬭瘯3"));
+        List<TestObj1> list4 = new ArrayList<>();
+        list4.add(new TestObj1("list4娴嬭瘯1", "list4娴嬭瘯2", "list4娴嬭瘯3"));
+        list4.add(new TestObj1("list4娴嬭瘯4", "list4娴嬭瘯5", "list4娴嬭瘯6"));
+        list4.add(new TestObj1("list4娴嬭瘯7", "list4娴嬭瘯8", "list4娴嬭瘯9"));
+        list4.add(new TestObj1("list4娴嬭瘯10", "list4娴嬭瘯11", "list4娴嬭瘯12"));
+        Map<String, Object> multiListMap = new HashMap<>();
+        multiListMap.put("map", map);
+        multiListMap.put("data1", list1);
+        multiListMap.put("data2", list2);
+        multiListMap.put("data3", list3);
+        multiListMap.put("data4", list4);
+        ExcelUtil.exportTemplateMultiList(multiListMap, "澶氬垪琛�.xlsx", "excel/澶氬垪琛�.xlsx", response);
+    }
+
+    /**
+     * 瀵煎嚭涓嬫媺妗�
+     *
+     * @param response /
+     */
+    @GetMapping("/exportWithOptions")
+    public void exportWithOptions(HttpServletResponse response) {
+        exportExcelService.exportWithOptions(response);
+    }
+
+    /**
+     * 澶氫釜sheet瀵煎嚭
+     */
+    @GetMapping("/exportTemplateMultiSheet")
+    public void exportTemplateMultiSheet(HttpServletResponse response) {
+        List<TestObj1> list1 = new ArrayList<>();
+        list1.add(new TestObj1("list1娴嬭瘯1", "list1娴嬭瘯2", "list1娴嬭瘯3"));
+        list1.add(new TestObj1("list1娴嬭瘯4", "list1娴嬭瘯5", "list1娴嬭瘯6"));
+        List<TestObj1> list2 = new ArrayList<>();
+        list2.add(new TestObj1("list2娴嬭瘯1", "list2娴嬭瘯2", "list2娴嬭瘯3"));
+        list2.add(new TestObj1("list2娴嬭瘯4", "list2娴嬭瘯5", "list2娴嬭瘯6"));
+        List<TestObj1> list3 = new ArrayList<>();
+        list3.add(new TestObj1("list3娴嬭瘯1", "list3娴嬭瘯2", "list3娴嬭瘯3"));
+        list3.add(new TestObj1("list3娴嬭瘯4", "list3娴嬭瘯5", "list3娴嬭瘯6"));
+        List<TestObj1> list4 = new ArrayList<>();
+        list4.add(new TestObj1("list4娴嬭瘯1", "list4娴嬭瘯2", "list4娴嬭瘯3"));
+        list4.add(new TestObj1("list4娴嬭瘯4", "list4娴嬭瘯5", "list4娴嬭瘯6"));
+
+        List<Map<String, Object>> list = new ArrayList<>();
+        Map<String, Object> sheetMap1 = new HashMap<>();
+        sheetMap1.put("data1", list1);
+        Map<String, Object> sheetMap2 = new HashMap<>();
+        sheetMap2.put("data2", list2);
+        Map<String, Object> sheetMap3 = new HashMap<>();
+        sheetMap3.put("data3", list3);
+        Map<String, Object> sheetMap4 = new HashMap<>();
+        sheetMap4.put("data4", list4);
+
+        list.add(sheetMap1);
+        list.add(sheetMap2);
+        list.add(sheetMap3);
+        list.add(sheetMap4);
+        ExcelUtil.exportTemplateMultiSheet(list, "澶歴heet鍒楄〃", "excel/澶歴heet鍒楄〃.xlsx", response);
+    }
+
+    /**
+     * 瀵煎叆琛ㄦ牸
+     */
+    @PostMapping(value = "/importWithOptions", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public List<ExportDemoVo> importWithOptions(@RequestPart("file") MultipartFile file) throws Exception {
+        // 澶勭悊瑙f瀽缁撴灉
+        ExcelResult<ExportDemoVo> excelResult = ExcelUtil.importExcel(file.getInputStream(), ExportDemoVo.class, new ExportDemoListener());
+        return excelResult.getList();
+    }
+
+    @Data
+    @AllArgsConstructor
+    static class TestObj1 {
+        private String test1;
+        private String test2;
+        private String test3;
+    }
+
+    @Data
+    @AllArgsConstructor
+    static class TestObj {
+        private String name;
+        private String list1;
+        private String list2;
+        private String list3;
+        private String list4;
+    }
+
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestI18nController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestI18nController.java
new file mode 100644
index 0000000..d618512
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestI18nController.java
@@ -0,0 +1,71 @@
+package org.dromara.demo.controller;
+
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.utils.MessageUtils;
+import lombok.Data;
+import org.hibernate.validator.constraints.Range;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+
+
+/**
+ * 娴嬭瘯鍥介檯鍖�
+ *
+ * @author Lion Li
+ */
+@Validated
+@RestController
+@RequestMapping("/i18n")
+public class TestI18nController {
+
+    /**
+     * 閫氳繃code鑾峰彇鍥介檯鍖栧唴瀹�
+     * code涓� messages.properties 涓殑 key
+     * <p>
+     * 娴嬭瘯浣跨敤 user.register.success
+     *
+     * @param code 鍥介檯鍖朿ode
+     */
+    @GetMapping()
+    public R<Void> get(String code) {
+        return R.ok(MessageUtils.message(code));
+    }
+
+    /**
+     * Validator 鏍¢獙鍥介檯鍖�
+     * 涓嶄紶鍊� 鍒嗗埆鏌ョ湅寮傚父杩斿洖
+     * <p>
+     * 娴嬭瘯浣跨敤 not.null
+     */
+    @GetMapping("/test1")
+    public R<Void> test1(@NotBlank(message = "{not.null}") String str) {
+        return R.ok(str);
+    }
+
+    /**
+     * Bean 鏍¢獙鍥介檯鍖�
+     * 涓嶄紶鍊� 鍒嗗埆鏌ョ湅寮傚父杩斿洖
+     * <p>
+     * 娴嬭瘯浣跨敤 not.null
+     */
+    @GetMapping("/test2")
+    public R<TestI18nBo> test2(@Validated TestI18nBo bo) {
+        return R.ok(bo);
+    }
+
+    @Data
+    public static class TestI18nBo {
+
+        @NotBlank(message = "{not.null}")
+        private String name;
+
+        @NotNull(message = "{not.null}")
+        @Range(min = 0, max = 100, message = "{length.not.valid}")
+        private Integer age;
+    }
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestSensitiveController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestSensitiveController.java
new file mode 100644
index 0000000..1feaf1b
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestSensitiveController.java
@@ -0,0 +1,75 @@
+package org.dromara.demo.controller;
+
+import org.dromara.common.core.domain.R;
+import org.dromara.common.sensitive.annotation.Sensitive;
+import org.dromara.common.sensitive.core.SensitiveStrategy;
+import org.dromara.common.web.core.BaseController;
+import lombok.Data;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 娴嬭瘯鏁版嵁鑴辨晱鎺у埗鍣�
+ * <p>
+ * 榛樿绠$悊鍛樹笉杩囨护
+ * 闇�鑷鏍规嵁涓氬姟閲嶅啓瀹炵幇
+ *
+ * @author Lion Li
+ * @version 3.6.0
+ * @see org.dromara.common.sensitive.core.SensitiveService
+ */
+@RestController
+@RequestMapping("/sensitive")
+public class TestSensitiveController extends BaseController {
+
+    /**
+     * 娴嬭瘯鏁版嵁鑴辨晱
+     */
+    @GetMapping("/test")
+    public R<TestSensitive> test() {
+        TestSensitive testSensitive = new TestSensitive();
+        testSensitive.setIdCard("210397198608215431");
+        testSensitive.setPhone("17640125371");
+        testSensitive.setAddress("鍖椾含甯傛湞闃冲尯鏌愭煇鍥涘悎闄�1203瀹�");
+        testSensitive.setEmail("17640125371@163.com");
+        testSensitive.setBankCard("6226456952351452853");
+        return R.ok(testSensitive);
+    }
+
+    @Data
+    static class TestSensitive {
+
+        /**
+         * 韬唤璇�
+         */
+        @Sensitive(strategy = SensitiveStrategy.ID_CARD)
+        private String idCard;
+
+        /**
+         * 鐢佃瘽
+         */
+        @Sensitive(strategy = SensitiveStrategy.PHONE, roleKey = "common")
+        private String phone;
+
+        /**
+         * 鍦板潃
+         */
+        @Sensitive(strategy = SensitiveStrategy.ADDRESS, perms = "system:user:query")
+        private String address;
+
+        /**
+         * 閭
+         */
+        @Sensitive(strategy = SensitiveStrategy.EMAIL, roleKey = "common", perms = "system:user:query1")
+        private String email;
+
+        /**
+         * 閾惰鍗�
+         */
+        @Sensitive(strategy = SensitiveStrategy.BANK_CARD, roleKey = "common1", perms = "system:user:query")
+        private String bankCard;
+
+    }
+
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestShardingController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestShardingController.java
new file mode 100644
index 0000000..81bb2a7
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestShardingController.java
@@ -0,0 +1,46 @@
+package org.dromara.demo.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.demo.domain.ShardingOrder;
+import org.dromara.demo.mapper.ShardingOrderMapper;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 浣跨敤鏂瑰紡 鐪嬪畼缃戞枃妗f墿灞曢」鐩�
+ */
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/sharding")
+public class TestShardingController {
+
+    private final ShardingOrderMapper torderMapper;
+
+    @GetMapping("/page")
+    public R<Page<ShardingOrder>> page() {
+        Page<ShardingOrder> page = new Page<>();
+        page.setCurrent(3L);
+        LambdaQueryWrapper<ShardingOrder> lqw = new LambdaQueryWrapper<>();
+        lqw.orderByAsc(ShardingOrder::getOrderId);
+        torderMapper.selectPage(page, lqw);
+        return R.ok(page);
+    }
+
+    @GetMapping("/insert")
+    public R<Void> insert() {
+        for (Long i = 1L; i <= 100L; i++) {
+            ShardingOrder torder = new ShardingOrder();
+            torder.setUserId(i);
+            torder.setTotalMoney(100 + Integer.parseInt(i + ""));
+            torderMapper.insert(torder);
+        }
+
+        return R.ok("鍒嗗簱鍒嗚〃鏁版嵁鎵归噺鎻掑叆鎴愬姛锛�");
+
+    }
+
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestTreeController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestTreeController.java
new file mode 100644
index 0000000..178a4b8
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestTreeController.java
@@ -0,0 +1,104 @@
+package org.dromara.demo.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.demo.domain.bo.TestTreeBo;
+import org.dromara.demo.domain.vo.TestTreeVo;
+import org.dromara.demo.service.ITestTreeService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 娴嬭瘯鏍戣〃Controller
+ *
+ * @author Lion Li
+ * @date 2021-07-26
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/tree")
+public class TestTreeController extends BaseController {
+
+    private final ITestTreeService iTestTreeService;
+
+    /**
+     * 鏌ヨ娴嬭瘯鏍戣〃鍒楄〃
+     */
+    @SaCheckPermission("demo:tree:list")
+    @GetMapping("/list")
+    public R<List<TestTreeVo>> list(TestTreeBo bo) {
+        List<TestTreeVo> list = iTestTreeService.queryList(bo);
+        return R.ok(list);
+    }
+
+    /**
+     * 瀵煎嚭娴嬭瘯鏍戣〃鍒楄〃
+     */
+    @SaCheckPermission("demo:tree:export")
+    @Log(title = "娴嬭瘯鏍戣〃", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public void export(@Validated TestTreeBo bo, HttpServletResponse response) {
+        List<TestTreeVo> list = iTestTreeService.queryList(bo);
+        ExcelUtil.exportExcel(list, "娴嬭瘯鏍戣〃", TestTreeVo.class, response);
+    }
+
+    /**
+     * 鑾峰彇娴嬭瘯鏍戣〃璇︾粏淇℃伅
+     *
+     * @param id 娴嬭瘯鏍慖D
+     */
+    @SaCheckPermission("demo:tree:query")
+    @GetMapping("/{id}")
+    public R<TestTreeVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖") @PathVariable("id") Long id) {
+        return R.ok(iTestTreeService.queryById(id));
+    }
+
+    /**
+     * 鏂板娴嬭瘯鏍戣〃
+     */
+    @SaCheckPermission("demo:tree:add")
+    @Log(title = "娴嬭瘯鏍戣〃", businessType = BusinessType.INSERT)
+    @RepeatSubmit
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody TestTreeBo bo) {
+        return toAjax(iTestTreeService.insertByBo(bo));
+    }
+
+    /**
+     * 淇敼娴嬭瘯鏍戣〃
+     */
+    @SaCheckPermission("demo:tree:edit")
+    @Log(title = "娴嬭瘯鏍戣〃", businessType = BusinessType.UPDATE)
+    @RepeatSubmit
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody TestTreeBo bo) {
+        return toAjax(iTestTreeService.updateByBo(bo));
+    }
+
+    /**
+     * 鍒犻櫎娴嬭瘯鏍戣〃
+     *
+     * @param ids 娴嬭瘯鏍慖D涓�
+     */
+    @SaCheckPermission("demo:tree:remove")
+    @Log(title = "娴嬭瘯鏍戣〃", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖") @PathVariable Long[] ids) {
+        return toAjax(iTestTreeService.deleteWithValidByIds(Arrays.asList(ids), true));
+    }
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/package-info.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/package-info.java
new file mode 100644
index 0000000..16c30f8
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/package-info.java
@@ -0,0 +1 @@
+package org.dromara.demo.controller;
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/Document.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/Document.java
new file mode 100644
index 0000000..71c77ee
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/Document.java
@@ -0,0 +1,25 @@
+package org.dromara.demo.domain;
+
+import lombok.Data;
+
+/**
+ * 鏂囨。瀹炰綋
+ */
+@Data
+public class Document {
+
+    /**
+     * es涓殑鍞竴id
+     */
+    private String id;
+
+    /**
+     * 鏂囨。鏍囬
+     */
+    private String title;
+
+    /**
+     * 鏂囨。鍐呭
+     */
+    private String content;
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/ShardingOrder.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/ShardingOrder.java
new file mode 100644
index 0000000..6190e9c
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/ShardingOrder.java
@@ -0,0 +1,16 @@
+package org.dromara.demo.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@TableName("t_order")
+@Data
+public class ShardingOrder {
+
+
+    private Long orderId;
+
+    private Long userId;
+
+    private int totalMoney;
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/ShardingOrderItem.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/ShardingOrderItem.java
new file mode 100644
index 0000000..83fde7c
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/ShardingOrderItem.java
@@ -0,0 +1,17 @@
+package org.dromara.demo.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@TableName("t_order_item")
+@Data
+public class ShardingOrderItem {
+
+    private Long orderItemId;
+
+    private Long orderId;
+
+    private Long userId;
+
+    private int totalMoney;
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestDemo.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestDemo.java
new file mode 100644
index 0000000..ada6d2b
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestDemo.java
@@ -0,0 +1,69 @@
+package org.dromara.demo.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 娴嬭瘯鍗曡〃瀵硅薄 test_demo
+ *
+ * @author Lion Li
+ * @date 2021-07-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("test_demo")
+public class TestDemo extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+
+    /**
+     * 涓婚敭
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 閮ㄩ棬id
+     */
+    private Long deptId;
+
+    /**
+     * 鐢ㄦ埛id
+     */
+    private Long userId;
+
+    /**
+     * 鎺掑簭鍙�
+     */
+    @OrderBy(asc = false, sort = 1)
+    private Integer orderNum;
+
+    /**
+     * key閿�
+     */
+    private String testKey;
+
+    /**
+     * 鍊�
+     */
+    private String value;
+
+    /**
+     * 鐗堟湰
+     */
+    @Version
+    private Long version;
+
+    /**
+     * 鍒犻櫎鏍囧織
+     */
+    @TableLogic
+    private Long delFlag;
+
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestDemoEncrypt.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestDemoEncrypt.java
new file mode 100644
index 0000000..bdcd596
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestDemoEncrypt.java
@@ -0,0 +1,29 @@
+package org.dromara.demo.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import org.dromara.common.encrypt.annotation.EncryptField;
+import org.dromara.common.encrypt.enumd.AlgorithmType;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("test_demo")
+public class TestDemoEncrypt extends TestDemo {
+
+    /**
+     * key閿�
+     */
+    // @EncryptField(algorithm=AlgorithmType.SM2, privateKey = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgZSlOvw8FBiH+aFJWLYZP/VRjg9wjfRarTkGBZd/T3N+gCgYIKoEcz1UBgi2hRANCAAR5DGuQwJqkxnbCsP+iPSDoHWIF4RwcR5EsSvT8QPxO1wRkR2IhCkzvRb32x2CUgJFdvoqVqfApFDPZzShqzBwX", publicKey = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEeQxrkMCapMZ2wrD/oj0g6B1iBeEcHEeRLEr0/ED8TtcEZEdiIQpM70W99sdglICRXb6KlanwKRQz2c0oaswcFw==")
+    @EncryptField(algorithm = AlgorithmType.RSA, privateKey = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBANBBEeueWlXlkkj2+WY5l+IWe42d8b5K28g+G/CFKC/yYAEHtqGlCsBOrb+YBkG9mPzmuYA/n9k0NFIc8E8yY5vZQaroyFBrTTWEzG9RY2f7Y3svVyybs6jpXSUs4xff8abo7wL1Y/wUaeatTViamxYnyTvdTmLm3d+JjRij68rxAgMBAAECgYAB0TnhXraSopwIVRfmboea1b0upl+BUdTJcmci412UjrKr5aE695ZLPkXbFXijVu7HJlyyv94NVUdaMACV7Ku/S2RuNB70M7YJm8rAjHFC3/i2ZeIM60h1Ziy4QKv0XM3pRATlDCDNhC1WUrtQCQSgU8kcp6eUUppruOqDzcY04QJBAPm9+sBP9CwDRgy3e5+V8aZtJkwDstb0lVVV/KY890cydVxiCwvX3fqVnxKMlb+x0YtH0sb9v+71xvK2lGobaRECQQDVePU6r/cCEfpc+nkWF6osAH1f8Mux3rYv2DoBGvaPzV2BGfsLed4neRfCwWNCKvGPCdW+L0xMJg8+RwaoBUPhAkAT5kViqXxFPYWJYd1h2+rDXhMdH3ZSlm6HvDBDdrwlWinr0Iwcx3iSjPV93uHXwm118aUj4fg3LDJMCKxOwBxhAkByrQXfvwOMYygBprRBf/j0plazoWFrbd6lGR0f1uI5IfNnFRPdeFw1DEINZ2Hw+6zEUF44SqRMC+4IYJNc02dBAkBCgy7RvfyV/A7N6kKXxTHauY0v6XwSSvpeKtRJkbIcRWOdIYvaHO9L7cklj3vIEdwjSUp9K4VTBYYlmAz1xh03", publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQQRHrnlpV5ZJI9vlmOZfiFnuNnfG+StvIPhvwhSgv8mABB7ahpQrATq2/mAZBvZj85rmAP5/ZNDRSHPBPMmOb2UGq6MhQa001hMxvUWNn+2N7L1csm7Oo6V0lLOMX3/Gm6O8C9WP8FGnmrU1YmpsWJ8k73U5i5t3fiY0Yo+vK8QIDAQAB")
+    private String testKey;
+
+    /**
+     * 鍊�
+     */
+    // @EncryptField // 浠�涔堜篃涓嶅啓璧伴粯璁ml閰嶇疆
+    // @EncryptField(algorithm = AlgorithmType.SM4, password = "10rfylhtccpuyke5")
+    @EncryptField(algorithm = AlgorithmType.AES, password = "10rfylhtccpuyke5")
+    private String value;
+
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestTree.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestTree.java
new file mode 100644
index 0000000..6cd3109
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestTree.java
@@ -0,0 +1,66 @@
+package org.dromara.demo.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.Version;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+import java.io.Serial;
+
+/**
+ * 娴嬭瘯鏍戣〃瀵硅薄 test_tree
+ *
+ * @author Lion Li
+ * @date 2021-07-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("test_tree")
+public class TestTree extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+
+    /**
+     * 涓婚敭
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 鐖禝D
+     */
+    private Long parentId;
+
+    /**
+     * 閮ㄩ棬id
+     */
+    private Long deptId;
+
+    /**
+     * 鐢ㄦ埛id
+     */
+    private Long userId;
+
+    /**
+     * 鏍戣妭鐐瑰悕
+     */
+    private String treeName;
+
+    /**
+     * 鐗堟湰
+     */
+    @Version
+    private Long version;
+
+    /**
+     * 鍒犻櫎鏍囧織
+     */
+    @TableLogic
+    private Long delFlag;
+
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoBo.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoBo.java
new file mode 100644
index 0000000..2896f6c
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoBo.java
@@ -0,0 +1,61 @@
+package org.dromara.demo.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.demo.domain.TestDemo;
+
+/**
+ * 娴嬭瘯鍗曡〃涓氬姟瀵硅薄 test_demo
+ *
+ * @author Lion Li
+ * @date 2021-07-26
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = TestDemo.class, reverseConvertGenerate = false)
+public class TestDemoBo extends BaseEntity {
+
+    /**
+     * 涓婚敭
+     */
+    @NotNull(message = "涓婚敭涓嶈兘涓虹┖", groups = {EditGroup.class})
+    private Long id;
+
+    /**
+     * 閮ㄩ棬id
+     */
+    @NotNull(message = "閮ㄩ棬id涓嶈兘涓虹┖", groups = {AddGroup.class, EditGroup.class})
+    private Long deptId;
+
+    /**
+     * 鐢ㄦ埛id
+     */
+    @NotNull(message = "鐢ㄦ埛id涓嶈兘涓虹┖", groups = {AddGroup.class, EditGroup.class})
+    private Long userId;
+
+    /**
+     * 鎺掑簭鍙�
+     */
+    @NotNull(message = "鎺掑簭鍙蜂笉鑳戒负绌�", groups = {AddGroup.class, EditGroup.class})
+    private Integer orderNum;
+
+    /**
+     * key閿�
+     */
+    @NotBlank(message = "key閿笉鑳戒负绌�", groups = {AddGroup.class, EditGroup.class})
+    private String testKey;
+
+    /**
+     * 鍊�
+     */
+    @NotBlank(message = "鍊间笉鑳戒负绌�", groups = {AddGroup.class, EditGroup.class})
+    private String value;
+
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoImportVo.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoImportVo.java
new file mode 100644
index 0000000..c066118
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoImportVo.java
@@ -0,0 +1,53 @@
+package org.dromara.demo.domain.bo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * 娴嬭瘯鍗曡〃涓氬姟瀵硅薄 test_demo
+ *
+ * @author Lion Li
+ * @date 2021-07-26
+ */
+@Data
+public class TestDemoImportVo {
+
+    /**
+     * 閮ㄩ棬id
+     */
+    @NotNull(message = "閮ㄩ棬id涓嶈兘涓虹┖")
+    @ExcelProperty(value = "閮ㄩ棬id")
+    private Long deptId;
+
+    /**
+     * 鐢ㄦ埛id
+     */
+    @NotNull(message = "鐢ㄦ埛id涓嶈兘涓虹┖")
+    @ExcelProperty(value = "鐢ㄦ埛id")
+    private Long userId;
+
+    /**
+     * 鎺掑簭鍙�
+     */
+    @NotNull(message = "鎺掑簭鍙蜂笉鑳戒负绌�")
+    @ExcelProperty(value = "鎺掑簭鍙�")
+    private Long orderNum;
+
+    /**
+     * key閿�
+     */
+    @NotBlank(message = "key閿笉鑳戒负绌�")
+    @ExcelProperty(value = "key閿�")
+    private String testKey;
+
+    /**
+     * 鍊�
+     */
+    @NotBlank(message = "鍊间笉鑳戒负绌�")
+    @ExcelProperty(value = "鍊�")
+    private String value;
+
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestTreeBo.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestTreeBo.java
new file mode 100644
index 0000000..a0a765a
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestTreeBo.java
@@ -0,0 +1,54 @@
+package org.dromara.demo.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.demo.domain.TestTree;
+
+/**
+ * 娴嬭瘯鏍戣〃涓氬姟瀵硅薄 test_tree
+ *
+ * @author Lion Li
+ * @date 2021-07-26
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = TestTree.class, reverseConvertGenerate = false)
+public class TestTreeBo extends BaseEntity {
+
+    /**
+     * 涓婚敭
+     */
+    @NotNull(message = "涓婚敭涓嶈兘涓虹┖", groups = {EditGroup.class})
+    private Long id;
+
+    /**
+     * 鐖禝D
+     */
+    private Long parentId;
+
+    /**
+     * 閮ㄩ棬id
+     */
+    @NotNull(message = "閮ㄩ棬id涓嶈兘涓虹┖", groups = {AddGroup.class, EditGroup.class})
+    private Long deptId;
+
+    /**
+     * 鐢ㄦ埛id
+     */
+    @NotNull(message = "鐢ㄦ埛id涓嶈兘涓虹┖", groups = {AddGroup.class, EditGroup.class})
+    private Long userId;
+
+    /**
+     * 鏍戣妭鐐瑰悕
+     */
+    @NotBlank(message = "鏍戣妭鐐瑰悕涓嶈兘涓虹┖", groups = {AddGroup.class, EditGroup.class})
+    private String treeName;
+
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/package-info.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/package-info.java
new file mode 100644
index 0000000..cb7d83f
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/package-info.java
@@ -0,0 +1 @@
+package org.dromara.demo.domain;
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/ExportDemoVo.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/ExportDemoVo.java
new file mode 100644
index 0000000..95fa0d1
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/ExportDemoVo.java
@@ -0,0 +1,118 @@
+package org.dromara.demo.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.dromara.common.core.enums.UserStatus;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.annotation.ExcelEnumFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import org.dromara.common.excel.convert.ExcelEnumConvert;
+
+/**
+ * 甯︽湁涓嬫媺閫夌殑Excel瀵煎嚭
+ *
+ * @author Emil.Zhang
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AllArgsConstructor
+@NoArgsConstructor
+public class ExportDemoVo {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 鐢ㄦ埛鏄电О
+     */
+    @ExcelProperty(value = "鐢ㄦ埛鍚�", index = 0)
+    @NotEmpty(message = "鐢ㄦ埛鍚嶄笉鑳戒负绌�", groups = AddGroup.class)
+    private String nickName;
+
+    /**
+     * 鐢ㄦ埛绫诲瀷
+     * </p>
+     * 浣跨敤ExcelEnumFormat娉ㄨВ闇�瑕佽繘琛屼笅鎷夐�夌殑閮ㄥ垎
+     */
+    @ExcelProperty(value = "鐢ㄦ埛绫诲瀷", index = 1, converter = ExcelEnumConvert.class)
+    @ExcelEnumFormat(enumClass = UserStatus.class, textField = "info")
+    @NotEmpty(message = "鐢ㄦ埛绫诲瀷涓嶈兘涓虹┖", groups = AddGroup.class)
+    private String userStatus;
+
+    /**
+     * 鎬у埆
+     * <p>
+     * 浣跨敤ExcelDictFormat娉ㄨВ闇�瑕佽繘琛屼笅鎷夐�夌殑閮ㄥ垎
+     */
+    @ExcelProperty(value = "鎬у埆", index = 2, converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "sys_user_sex")
+    @NotEmpty(message = "鎬у埆涓嶈兘涓虹┖", groups = AddGroup.class)
+    private String gender;
+
+    /**
+     * 鎵嬫満鍙�
+     */
+    @ExcelProperty(value = "鎵嬫満鍙�", index = 3)
+    @NotEmpty(message = "鎵嬫満鍙蜂笉鑳戒负绌�", groups = AddGroup.class)
+    private String phoneNumber;
+
+    /**
+     * Email
+     */
+    @ExcelProperty(value = "Email", index = 4)
+    @NotEmpty(message = "Email涓嶈兘涓虹┖", groups = AddGroup.class)
+    private String email;
+
+    /**
+     * 鐪�
+     * <p>
+     * 绾ц仈涓嬫媺锛屼粎鍒ゆ柇鏄惁閫変簡
+     */
+    @ExcelProperty(value = "鐪�", index = 5)
+    @NotNull(message = "鐪佷笉鑳戒负绌�", groups = AddGroup.class)
+    private String province;
+
+    /**
+     * 鏁版嵁搴撲腑鐨勭渷ID
+     * </p>
+     * 澶勭悊瀹屾瘯鍚庡啀鍒ゆ柇鏄惁甯傛纭殑鍊�
+     */
+    @NotNull(message = "璇峰嬁鎵嬪姩杈撳叆", groups = EditGroup.class)
+    private Integer provinceId;
+
+    /**
+     * 甯�
+     * <p>
+     * 绾ц仈涓嬫媺
+     */
+    @ExcelProperty(value = "甯�", index = 6)
+    @NotNull(message = "甯備笉鑳戒负绌�", groups = AddGroup.class)
+    private String city;
+
+    /**
+     * 鏁版嵁搴撲腑鐨勫競ID
+     */
+    @NotNull(message = "璇峰嬁鎵嬪姩杈撳叆", groups = EditGroup.class)
+    private Integer cityId;
+
+    /**
+     * 鍘�
+     * <p>
+     * 绾ц仈涓嬫媺
+     */
+    @ExcelProperty(value = "鍘�", index = 7)
+    @NotNull(message = "鍘夸笉鑳戒负绌�", groups = AddGroup.class)
+    private String area;
+
+    /**
+     * 鏁版嵁搴撲腑鐨勫幙ID
+     */
+    @NotNull(message = "璇峰嬁鎵嬪姩杈撳叆", groups = EditGroup.class)
+    private Integer areaId;
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java
new file mode 100644
index 0000000..3eb072f
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java
@@ -0,0 +1,89 @@
+package org.dromara.demo.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.demo.domain.TestDemo;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 娴嬭瘯鍗曡〃瑙嗗浘瀵硅薄 test_demo
+ *
+ * @author Lion Li
+ * @date 2021-07-26
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = TestDemo.class)
+public class TestDemoVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭
+     */
+    @ExcelProperty(value = "涓婚敭")
+    private Long id;
+
+    /**
+     * 閮ㄩ棬id
+     */
+    @ExcelProperty(value = "閮ㄩ棬id")
+    private Long deptId;
+
+    /**
+     * 鐢ㄦ埛id
+     */
+    @ExcelProperty(value = "鐢ㄦ埛id")
+    private Long userId;
+
+    /**
+     * 鎺掑簭鍙�
+     */
+    @ExcelProperty(value = "鎺掑簭鍙�")
+    private Integer orderNum;
+
+    /**
+     * key閿�
+     */
+    @ExcelProperty(value = "key閿�")
+    private String testKey;
+
+    /**
+     * 鍊�
+     */
+    @ExcelProperty(value = "鍊�")
+    private String value;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @ExcelProperty(value = "鍒涘缓鏃堕棿")
+    private Date createTime;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    @ExcelProperty(value = "鍒涘缓浜�")
+    private String createBy;
+
+    /**
+     * 鏇存柊鏃堕棿
+     */
+    @ExcelProperty(value = "鏇存柊鏃堕棿")
+    private Date updateTime;
+
+    /**
+     * 鏇存柊浜�
+     */
+    @ExcelProperty(value = "鏇存柊浜�")
+    private String updateBy;
+
+
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestTreeVo.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestTreeVo.java
new file mode 100644
index 0000000..aac6033
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestTreeVo.java
@@ -0,0 +1,64 @@
+package org.dromara.demo.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.demo.domain.TestTree;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 娴嬭瘯鏍戣〃瑙嗗浘瀵硅薄 test_tree
+ *
+ * @author Lion Li
+ * @date 2021-07-26
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = TestTree.class)
+public class TestTreeVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭
+     */
+    private Long id;
+
+    /**
+     * 鐖秈d
+     */
+    @ExcelProperty(value = "鐖秈d")
+    private Long parentId;
+
+    /**
+     * 閮ㄩ棬id
+     */
+    @ExcelProperty(value = "閮ㄩ棬id")
+    private Long deptId;
+
+    /**
+     * 鐢ㄦ埛id
+     */
+    @ExcelProperty(value = "鐢ㄦ埛id")
+    private Long userId;
+
+    /**
+     * 鏍戣妭鐐瑰悕
+     */
+    @ExcelProperty(value = "鏍戣妭鐐瑰悕")
+    private String treeName;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @ExcelProperty(value = "鍒涘缓鏃堕棿")
+    private Date createTime;
+
+
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/esmapper/DocumentMapper.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/esmapper/DocumentMapper.java
new file mode 100644
index 0000000..c925b62
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/esmapper/DocumentMapper.java
@@ -0,0 +1,7 @@
+package org.dromara.demo.esmapper;
+
+import org.dromara.demo.domain.Document;
+import org.dromara.easyes.core.core.BaseEsMapper;
+
+public interface DocumentMapper extends BaseEsMapper<Document> {
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/listener/ExportDemoListener.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/listener/ExportDemoListener.java
new file mode 100644
index 0000000..7bd4e1e
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/listener/ExportDemoListener.java
@@ -0,0 +1,68 @@
+package org.dromara.demo.listener;
+
+import cn.hutool.core.util.NumberUtil;
+import com.alibaba.excel.context.AnalysisContext;
+import org.dromara.common.core.utils.ValidatorUtils;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.excel.core.DefaultExcelListener;
+import org.dromara.common.excel.core.DropDownOptions;
+import org.dromara.demo.domain.vo.ExportDemoVo;
+
+import java.util.List;
+
+/**
+ * Excel甯︿笅鎷夋鐨勮В鏋愬鐞嗗櫒
+ *
+ * @author Emil.Zhang
+ */
+public class ExportDemoListener extends DefaultExcelListener<ExportDemoVo> {
+
+    public ExportDemoListener() {
+        // 鏄剧ず浣跨敤鏋勯�犲嚱鏁帮紝鍚﹀垯灏嗗鑷寸┖鎸囬拡
+        super(true);
+    }
+
+    @Override
+    public void invoke(ExportDemoVo data, AnalysisContext context) {
+        // 鍏堟牎楠屽繀濉�
+        ValidatorUtils.validate(data, AddGroup.class);
+
+        // 澶勭悊绾ц仈涓嬫媺鐨勯儴鍒�
+        String province = data.getProvince();
+        String city = data.getCity();
+        String area = data.getArea();
+        // 鏈鐢ㄦ埛閫夋嫨鐨勭渷
+        List<String> thisRowSelectedProvinceOption = DropDownOptions.analyzeOptionValue(province);
+        if (thisRowSelectedProvinceOption.size() == 2) {
+            String provinceIdStr = thisRowSelectedProvinceOption.get(1);
+            if (NumberUtil.isNumber(provinceIdStr)) {
+                // 涓ユ牸瑕佹眰鏁版嵁鐨勮瘽鍙互鍦ㄨ繖閲屽仛涓庢暟鎹簱鐩稿叧鐨勫垽鏂�
+                // 渚嬪鍒ゆ柇鐪佷俊鎭槸鍚﹀湪鏁版嵁搴撲腑瀛樺湪绛夛紝寤鸿缁撳悎RedisCache鍋氱紦瀛�10s锛屽噺灏戞暟鎹簱璋冪敤
+                data.setProvinceId(Integer.parseInt(provinceIdStr));
+            }
+        }
+        // 鏈鐢ㄦ埛閫夋嫨鐨勫競
+        List<String> thisRowSelectedCityOption = DropDownOptions.analyzeOptionValue(city);
+        if (thisRowSelectedCityOption.size() == 2) {
+            String cityIdStr = thisRowSelectedCityOption.get(1);
+            if (NumberUtil.isNumber(cityIdStr)) {
+                data.setCityId(Integer.parseInt(cityIdStr));
+            }
+        }
+        // 鏈鐢ㄦ埛閫夋嫨鐨勫幙
+        List<String> thisRowSelectedAreaOption = DropDownOptions.analyzeOptionValue(area);
+        if (thisRowSelectedAreaOption.size() == 2) {
+            String areaIdStr = thisRowSelectedAreaOption.get(1);
+            if (NumberUtil.isNumber(areaIdStr)) {
+                data.setAreaId(Integer.parseInt(areaIdStr));
+            }
+        }
+
+        // 澶勭悊瀹屾瘯浠ュ悗鍒ゆ柇鏄惁绗﹀悎瑙勫垯
+        ValidatorUtils.validate(data, EditGroup.class);
+
+        // 娣诲姞鍒板鐞嗙粨鏋滀腑
+        getExcelResult().getList().add(data);
+    }
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/ShardingOrderItemMapper.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/ShardingOrderItemMapper.java
new file mode 100644
index 0000000..0082677
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/ShardingOrderItemMapper.java
@@ -0,0 +1,14 @@
+package org.dromara.demo.mapper;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.dromara.demo.domain.ShardingOrderItem;
+
+@Mapper
+@DS("sharding")
+public interface ShardingOrderItemMapper extends BaseMapper<ShardingOrderItem> {
+
+
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/ShardingOrderMapper.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/ShardingOrderMapper.java
new file mode 100644
index 0000000..58d3525
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/ShardingOrderMapper.java
@@ -0,0 +1,15 @@
+package org.dromara.demo.mapper;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.dromara.demo.domain.ShardingOrder;
+
+
+@Mapper
+@DS("sharding")
+public interface ShardingOrderMapper extends BaseMapper<ShardingOrder> {
+
+
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoEncryptMapper.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoEncryptMapper.java
new file mode 100644
index 0000000..601f97a
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoEncryptMapper.java
@@ -0,0 +1,13 @@
+package org.dromara.demo.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.demo.domain.TestDemoEncrypt;
+
+/**
+ * 娴嬭瘯鍔犲瘑鍔熻兘
+ *
+ * @author Lion Li
+ */
+public interface TestDemoEncryptMapper extends BaseMapperPlus<TestDemoEncrypt, TestDemoEncrypt> {
+
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java
new file mode 100644
index 0000000..08d2e0d
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java
@@ -0,0 +1,59 @@
+package org.dromara.demo.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.dromara.common.mybatis.annotation.DataColumn;
+import org.dromara.common.mybatis.annotation.DataPermission;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.demo.domain.TestDemo;
+import org.dromara.demo.domain.vo.TestDemoVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 娴嬭瘯鍗曡〃Mapper鎺ュ彛
+ *
+ * @author Lion Li
+ * @date 2021-07-26
+ */
+public interface TestDemoMapper extends BaseMapperPlus<TestDemo, TestDemoVo> {
+
+    @DataPermission({
+        @DataColumn(key = "deptName", value = "dept_id"),
+        @DataColumn(key = "userName", value = "user_id")
+    })
+    Page<TestDemoVo> customPageList(@Param("page") Page<TestDemo> page, @Param("ew") Wrapper<TestDemo> wrapper);
+
+    @Override
+    @DataPermission({
+        @DataColumn(key = "deptName", value = "dept_id"),
+        @DataColumn(key = "userName", value = "user_id")
+    })
+    List<TestDemo> selectList(IPage<TestDemo> page, @Param(Constants.WRAPPER) Wrapper<TestDemo> queryWrapper);
+
+
+    @Override
+    @DataPermission({
+        @DataColumn(key = "deptName", value = "dept_id"),
+        @DataColumn(key = "userName", value = "user_id")
+    })
+    List<TestDemo> selectList(@Param(Constants.WRAPPER) Wrapper<TestDemo> queryWrapper);
+
+    @Override
+    @DataPermission({
+        @DataColumn(key = "deptName", value = "dept_id"),
+        @DataColumn(key = "userName", value = "user_id")
+    })
+    int updateById(@Param(Constants.ENTITY) TestDemo entity);
+
+    @Override
+    @DataPermission({
+        @DataColumn(key = "deptName", value = "dept_id"),
+        @DataColumn(key = "userName", value = "user_id")
+    })
+    int deleteBatchIds(@Param(Constants.COLL) Collection<?> idList);
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestTreeMapper.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestTreeMapper.java
new file mode 100644
index 0000000..e5f4c44
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestTreeMapper.java
@@ -0,0 +1,21 @@
+package org.dromara.demo.mapper;
+
+import org.dromara.common.mybatis.annotation.DataColumn;
+import org.dromara.common.mybatis.annotation.DataPermission;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.demo.domain.TestTree;
+import org.dromara.demo.domain.vo.TestTreeVo;
+
+/**
+ * 娴嬭瘯鏍戣〃Mapper鎺ュ彛
+ *
+ * @author Lion Li
+ * @date 2021-07-26
+ */
+@DataPermission({
+    @DataColumn(key = "deptName", value = "dept_id"),
+    @DataColumn(key = "userName", value = "user_id")
+})
+public interface TestTreeMapper extends BaseMapperPlus<TestTree, TestTreeVo> {
+
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/package-info.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/package-info.java
new file mode 100644
index 0000000..ff1c4df
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/package-info.java
@@ -0,0 +1 @@
+package org.dromara.demo.mapper;
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/IExportExcelService.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/IExportExcelService.java
new file mode 100644
index 0000000..4dfa5ef
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/IExportExcelService.java
@@ -0,0 +1,18 @@
+package org.dromara.demo.service;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * 瀵煎嚭涓嬫媺妗咵xcel绀轰緥
+ *
+ * @author Emil.Zhang
+ */
+public interface IExportExcelService {
+
+    /**
+     * 瀵煎嚭涓嬫媺妗�
+     *
+     * @param response /
+     */
+    void exportWithOptions(HttpServletResponse response);
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestDemoService.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestDemoService.java
new file mode 100644
index 0000000..bca4192
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestDemoService.java
@@ -0,0 +1,71 @@
+package org.dromara.demo.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.demo.domain.TestDemo;
+import org.dromara.demo.domain.bo.TestDemoBo;
+import org.dromara.demo.domain.vo.TestDemoVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 娴嬭瘯鍗曡〃Service鎺ュ彛
+ *
+ * @author Lion Li
+ * @date 2021-07-26
+ */
+public interface ITestDemoService {
+
+    /**
+     * 鏌ヨ鍗曚釜
+     *
+     * @return
+     */
+    TestDemoVo queryById(Long id);
+
+    /**
+     * 鏌ヨ鍒楄〃
+     */
+    TableDataInfo<TestDemoVo> queryPageList(TestDemoBo bo, PageQuery pageQuery);
+
+    /**
+     * 鑷畾涔夊垎椤垫煡璇�
+     */
+    TableDataInfo<TestDemoVo> customPageList(TestDemoBo bo, PageQuery pageQuery);
+
+    /**
+     * 鏌ヨ鍒楄〃
+     */
+    List<TestDemoVo> queryList(TestDemoBo bo);
+
+    /**
+     * 鏍规嵁鏂板涓氬姟瀵硅薄鎻掑叆娴嬭瘯鍗曡〃
+     *
+     * @param bo 娴嬭瘯鍗曡〃鏂板涓氬姟瀵硅薄
+     * @return
+     */
+    Boolean insertByBo(TestDemoBo bo);
+
+    /**
+     * 鏍规嵁缂栬緫涓氬姟瀵硅薄淇敼娴嬭瘯鍗曡〃
+     *
+     * @param bo 娴嬭瘯鍗曡〃缂栬緫涓氬姟瀵硅薄
+     * @return
+     */
+    Boolean updateByBo(TestDemoBo bo);
+
+    /**
+     * 鏍¢獙骞跺垹闄ゆ暟鎹�
+     *
+     * @param ids     涓婚敭闆嗗悎
+     * @param isValid 鏄惁鏍¢獙,true-鍒犻櫎鍓嶆牎楠�,false-涓嶆牎楠�
+     * @return
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    /**
+     * 鎵归噺淇濆瓨
+     */
+    Boolean saveBatch(List<TestDemo> list);
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestTreeService.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestTreeService.java
new file mode 100644
index 0000000..9155201
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestTreeService.java
@@ -0,0 +1,52 @@
+package org.dromara.demo.service;
+
+import org.dromara.demo.domain.bo.TestTreeBo;
+import org.dromara.demo.domain.vo.TestTreeVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 娴嬭瘯鏍戣〃Service鎺ュ彛
+ *
+ * @author Lion Li
+ * @date 2021-07-26
+ */
+public interface ITestTreeService {
+    /**
+     * 鏌ヨ鍗曚釜
+     *
+     * @return
+     */
+    TestTreeVo queryById(Long id);
+
+    /**
+     * 鏌ヨ鍒楄〃
+     */
+    List<TestTreeVo> queryList(TestTreeBo bo);
+
+    /**
+     * 鏍规嵁鏂板涓氬姟瀵硅薄鎻掑叆娴嬭瘯鏍戣〃
+     *
+     * @param bo 娴嬭瘯鏍戣〃鏂板涓氬姟瀵硅薄
+     * @return
+     */
+    Boolean insertByBo(TestTreeBo bo);
+
+    /**
+     * 鏍规嵁缂栬緫涓氬姟瀵硅薄淇敼娴嬭瘯鏍戣〃
+     *
+     * @param bo 娴嬭瘯鏍戣〃缂栬緫涓氬姟瀵硅薄
+     * @return
+     */
+    Boolean updateByBo(TestTreeBo bo);
+
+    /**
+     * 鏍¢獙骞跺垹闄ゆ暟鎹�
+     *
+     * @param ids     涓婚敭闆嗗悎
+     * @param isValid 鏄惁鏍¢獙,true-鍒犻櫎鍓嶆牎楠�,false-涓嶆牎楠�
+     * @return
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/ExportExcelServiceImpl.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/ExportExcelServiceImpl.java
new file mode 100644
index 0000000..0240e02
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/ExportExcelServiceImpl.java
@@ -0,0 +1,222 @@
+package org.dromara.demo.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.Data;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.enums.UserStatus;
+import org.dromara.common.core.utils.StreamUtils;
+import org.dromara.common.excel.core.DropDownOptions;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.demo.domain.vo.ExportDemoVo;
+import org.dromara.demo.service.IExportExcelService;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 瀵煎嚭涓嬫媺妗咵xcel绀轰緥
+ *
+ * @author Emil.Zhang
+ */
+@Service
+@RequiredArgsConstructor
+public class ExportExcelServiceImpl implements IExportExcelService {
+
+    @Override
+    public void exportWithOptions(HttpServletResponse response) {
+        // 鍒涘缓琛ㄦ牸鏁版嵁锛屼笟鍔′腑涓�鑸�氳繃鏁版嵁搴撴煡璇�
+        List<ExportDemoVo> excelDataList = new ArrayList<>();
+        for (int i = 0; i < 3; i++) {
+            // 妯℃嫙鏁版嵁搴撲腑鐨勪竴鏉℃暟鎹�
+            ExportDemoVo everyRowData = new ExportDemoVo();
+            everyRowData.setNickName("鐢ㄦ埛-" + i);
+            everyRowData.setUserStatus(UserStatus.OK.getCode());
+            everyRowData.setGender("1");
+            everyRowData.setPhoneNumber(String.format("175%08d", i));
+            everyRowData.setEmail(String.format("175%08d", i) + "@163.com");
+            everyRowData.setProvinceId(i);
+            everyRowData.setCityId(i);
+            everyRowData.setAreaId(i);
+            excelDataList.add(everyRowData);
+        }
+
+        // 閫氳繃@ExcelIgnoreUnannotated閰嶅悎@ExcelProperty鍚堢悊鏄剧ず闇�瑕佺殑鍒�
+        // 骞堕�氳繃@DropDown娉ㄨВ鎸囧畾涓嬫媺鍊硷紝鎴栬�呴�氳繃鍒涘缓ExcelOptions鏉ユ寚瀹氫笅鎷夋
+        // 浣跨敤ExcelOptions鏃跺缓璁寚瀹氬垪index锛岄槻姝㈠嚭鐜颁笅鎷夊垪瑙f瀽涓嶅榻�
+
+        // 棣栧厛浠庢暟鎹簱涓煡璇笅鎷夋鍐呯殑鍙�夐」
+        // 杩欓噷妯℃嫙鏌ヨ缁撴灉
+        List<DemoCityData> provinceList = getProvinceList(),
+            cityList = getCityList(provinceList),
+            areaList = getAreaList(cityList);
+        int provinceIndex = 5, cityIndex = 6, areaIndex = 7;
+
+        DropDownOptions provinceToCity = DropDownOptions.buildLinkedOptions(
+            provinceList,
+            provinceIndex,
+            cityList,
+            cityIndex,
+            DemoCityData::getId,
+            DemoCityData::getPid,
+            everyOptions -> DropDownOptions.createOptionValue(
+                everyOptions.getName(),
+                everyOptions.getId()
+            )
+        );
+
+        DropDownOptions cityToArea = DropDownOptions.buildLinkedOptions(
+            cityList,
+            cityIndex,
+            areaList,
+            areaIndex,
+            DemoCityData::getId,
+            DemoCityData::getPid,
+            everyOptions -> DropDownOptions.createOptionValue(
+                everyOptions.getName(),
+                everyOptions.getId()
+            )
+        );
+
+        // 鎶婃墍鏈夌殑涓嬫媺妗嗗瓨鍌�
+        List<DropDownOptions> options = new ArrayList<>();
+        options.add(provinceToCity);
+        options.add(cityToArea);
+
+        // 鍒版涓烘鎵�鏈夌殑涓嬫媺妗嗗彲閫夐」宸插叏閮ㄩ厤缃畬姣�
+
+        // 鎺ヤ笅鏉ラ渶瑕佸皢Excel涓殑灞曠ず鏁版嵁杞崲涓哄搴旂殑涓嬫媺閫�
+        List<ExportDemoVo> outList = StreamUtils.toList(excelDataList, everyRowData -> {
+            // 鍙渶瑕佸鐞嗘病鏈変娇鐢ˊExcelDictFormat娉ㄨВ鐨勪笅鎷夋
+            // 涓�鑸潵璇达紝鍙互鐩存帴鍦ㄦ暟鎹簱鏌ヨ鍗虫煡璇㈠嚭鐪佸競鍘夸俊鎭紝杩欓噷閫氳繃妯℃嫙鎿嶄綔璧嬪��
+            everyRowData.setProvince(buildOptions(provinceList, everyRowData.getProvinceId()));
+            everyRowData.setCity(buildOptions(cityList, everyRowData.getCityId()));
+            everyRowData.setArea(buildOptions(areaList, everyRowData.getAreaId()));
+            return everyRowData;
+        });
+
+        ExcelUtil.exportExcel(outList, "涓嬫媺妗嗙ず渚�", ExportDemoVo.class, response, options);
+    }
+
+    private String buildOptions(List<DemoCityData> cityDataList, Integer id) {
+        Map<Integer, List<DemoCityData>> groupByIdMap =
+            cityDataList.stream().collect(Collectors.groupingBy(DemoCityData::getId));
+        if (groupByIdMap.containsKey(id)) {
+            DemoCityData demoCityData = groupByIdMap.get(id).get(0);
+            return DropDownOptions.createOptionValue(demoCityData.getName(), demoCityData.getId());
+        } else {
+            return StrUtil.EMPTY;
+        }
+    }
+
+    /**
+     * 妯℃嫙鏌ヨ鏁版嵁搴撴搷浣�
+     *
+     * @return /
+     */
+    private List<DemoCityData> getProvinceList() {
+        List<DemoCityData> provinceList = new ArrayList<>();
+
+        // 瀹為檯涓氬姟涓竴鑸噰鐢ㄦ暟鎹簱璇诲彇鐨勫舰寮忥紝杩欓噷鐩存帴鎷兼帴鍒涘缓
+        provinceList.add(new DemoCityData(0, null, "瀹夊窘鐪�"));
+        provinceList.add(new DemoCityData(1, null, "姹熻嫃鐪�"));
+
+        return provinceList;
+    }
+
+    /**
+     * 妯℃嫙鏌ユ壘鏁版嵁搴撴搷浣滐紝闇�瑕佽繛甯︽煡璇㈠嚭鐪佺殑鏁版嵁
+     *
+     * @param provinceList 妯℃嫙鐨勭埗鐪佹暟鎹�
+     * @return /
+     */
+    private List<DemoCityData> getCityList(List<DemoCityData> provinceList) {
+        List<DemoCityData> cityList = new ArrayList<>();
+
+        // 瀹為檯涓氬姟涓竴鑸噰鐢ㄦ暟鎹簱璇诲彇鐨勫舰寮忥紝杩欓噷鐩存帴鎷兼帴鍒涘缓
+        cityList.add(new DemoCityData(0, 0, "鍚堣偉甯�"));
+        cityList.add(new DemoCityData(1, 0, "鑺滄箹甯�"));
+        cityList.add(new DemoCityData(2, 1, "鍗椾含甯�"));
+        cityList.add(new DemoCityData(3, 1, "鏃犻敗甯�"));
+        cityList.add(new DemoCityData(4, 1, "寰愬窞甯�"));
+
+        selectParentData(provinceList, cityList);
+
+        return cityList;
+    }
+
+    /**
+     * 妯℃嫙鏌ユ壘鏁版嵁搴撴搷浣滐紝闇�瑕佽繛甯︽煡璇㈠嚭甯傜殑鏁版嵁
+     *
+     * @param cityList 妯℃嫙鐨勭埗甯傛暟鎹�
+     * @return /
+     */
+    private List<DemoCityData> getAreaList(List<DemoCityData> cityList) {
+        List<DemoCityData> areaList = new ArrayList<>();
+
+        // 瀹為檯涓氬姟涓竴鑸噰鐢ㄦ暟鎹簱璇诲彇鐨勫舰寮忥紝杩欓噷鐩存帴鎷兼帴鍒涘缓
+        areaList.add(new DemoCityData(0, 0, "鐟舵捣鍖�"));
+        areaList.add(new DemoCityData(1, 0, "搴愭睙鍖�"));
+        areaList.add(new DemoCityData(2, 1, "鍗楀畞鍘�"));
+        areaList.add(new DemoCityData(3, 1, "闀滄箹鍖�"));
+        areaList.add(new DemoCityData(4, 2, "鐜勬鍖�"));
+        areaList.add(new DemoCityData(5, 2, "绉︽樊鍖�"));
+        areaList.add(new DemoCityData(6, 3, "瀹滃叴甯�"));
+        areaList.add(new DemoCityData(7, 3, "鏂板惔鍖�"));
+        areaList.add(new DemoCityData(8, 4, "榧撴ゼ鍖�"));
+        areaList.add(new DemoCityData(9, 4, "涓板幙"));
+
+        selectParentData(cityList, areaList);
+
+        return areaList;
+    }
+
+    /**
+     * 妯℃嫙鏁版嵁搴撶殑鏌ヨ鐖舵暟鎹搷浣�
+     *
+     * @param parentList /
+     * @param sonList    /
+     */
+    private void selectParentData(List<DemoCityData> parentList, List<DemoCityData> sonList) {
+        Map<Integer, List<DemoCityData>> parentGroupByIdMap =
+            parentList.stream().collect(Collectors.groupingBy(DemoCityData::getId));
+
+        sonList.forEach(everySon -> {
+            if (parentGroupByIdMap.containsKey(everySon.getPid())) {
+                everySon.setPData(parentGroupByIdMap.get(everySon.getPid()).get(0));
+            }
+        });
+    }
+
+    /**
+     * 妯℃嫙鐨勬暟鎹簱鐪佸競鍘�
+     */
+    @Data
+    private static class DemoCityData {
+        /**
+         * 鏁版嵁搴搃d瀛楁
+         */
+        private Integer id;
+        /**
+         * 鏁版嵁搴損id瀛楁
+         */
+        private Integer pid;
+        /**
+         * 鏁版嵁搴搉ame瀛楁
+         */
+        private String name;
+        /**
+         * MyBatisPlus杩炲甫鏌ヨ鐖舵暟鎹�
+         */
+        private DemoCityData pData;
+
+        public DemoCityData(Integer id, Integer pid, String name) {
+            this.id = id;
+            this.pid = pid;
+            this.name = name;
+        }
+    }
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/SensitiveServiceImpl.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/SensitiveServiceImpl.java
new file mode 100644
index 0000000..01cc1a6
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/SensitiveServiceImpl.java
@@ -0,0 +1,46 @@
+package org.dromara.demo.service.impl;
+
+import cn.dev33.satoken.stp.StpUtil;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.common.sensitive.core.SensitiveService;
+import org.dromara.common.tenant.helper.TenantHelper;
+import org.springframework.stereotype.Service;
+
+/**
+ * 鑴辨晱鏈嶅姟
+ * 榛樿绠$悊鍛樹笉杩囨护
+ * 闇�鑷鏍规嵁涓氬姟閲嶅啓瀹炵幇
+ *
+ * @author Lion Li
+ */
+@Service
+public class SensitiveServiceImpl implements SensitiveService {
+
+    /**
+     * 鏄惁鑴辨晱
+     */
+    @Override
+    public boolean isSensitive(String roleKey, String perms) {
+        if (!LoginHelper.isLogin()) {
+            return true;
+        }
+        boolean roleExist = StringUtils.isNotBlank(roleKey);
+        boolean permsExist = StringUtils.isNotBlank(perms);
+        if (roleExist && permsExist) {
+            if (StpUtil.hasRole(roleKey) && StpUtil.hasPermission(perms)) {
+                return false;
+            }
+        } else if (roleExist && StpUtil.hasRole(roleKey)) {
+            return false;
+        } else if (permsExist && StpUtil.hasPermission(perms)) {
+            return false;
+        }
+
+        if (TenantHelper.isEnable()) {
+            return !LoginHelper.isSuperAdmin() && !LoginHelper.isTenantAdmin();
+        }
+        return !LoginHelper.isSuperAdmin();
+    }
+
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java
new file mode 100644
index 0000000..afc99c7
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java
@@ -0,0 +1,111 @@
+package org.dromara.demo.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.demo.domain.TestDemo;
+import org.dromara.demo.domain.bo.TestDemoBo;
+import org.dromara.demo.domain.vo.TestDemoVo;
+import org.dromara.demo.mapper.TestDemoMapper;
+import org.dromara.demo.service.ITestDemoService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 娴嬭瘯鍗曡〃Service涓氬姟灞傚鐞�
+ *
+ * @author Lion Li
+ * @date 2021-07-26
+ */
+@RequiredArgsConstructor
+@Service
+public class TestDemoServiceImpl implements ITestDemoService {
+
+    private final TestDemoMapper baseMapper;
+
+    @Override
+    public TestDemoVo queryById(Long id) {
+        return baseMapper.selectVoById(id);
+    }
+
+    @Override
+    public TableDataInfo<TestDemoVo> queryPageList(TestDemoBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<TestDemo> lqw = buildQueryWrapper(bo);
+        Page<TestDemoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 鑷畾涔夊垎椤垫煡璇�
+     */
+    @Override
+    public TableDataInfo<TestDemoVo> customPageList(TestDemoBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<TestDemo> lqw = buildQueryWrapper(bo);
+        Page<TestDemoVo> result = baseMapper.customPageList(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    @Override
+    public List<TestDemoVo> queryList(TestDemoBo bo) {
+        return baseMapper.selectVoList(buildQueryWrapper(bo));
+    }
+
+    private LambdaQueryWrapper<TestDemo> buildQueryWrapper(TestDemoBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<TestDemo> lqw = Wrappers.lambdaQuery();
+        lqw.like(StringUtils.isNotBlank(bo.getTestKey()), TestDemo::getTestKey, bo.getTestKey());
+        lqw.eq(StringUtils.isNotBlank(bo.getValue()), TestDemo::getValue, bo.getValue());
+        lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null,
+            TestDemo::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime"));
+        lqw.orderByAsc(TestDemo::getId);
+        return lqw;
+    }
+
+    @Override
+    public Boolean insertByBo(TestDemoBo bo) {
+        TestDemo add = BeanUtil.toBean(bo, TestDemo.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    @Override
+    public Boolean updateByBo(TestDemoBo bo) {
+        TestDemo update = BeanUtil.toBean(bo, TestDemo.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
+     *
+     * @param entity 瀹炰綋绫绘暟鎹�
+     */
+    private void validEntityBeforeSave(TestDemo entity) {
+        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
+    }
+
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if (isValid) {
+            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
+        }
+        return baseMapper.deleteBatchIds(ids) > 0;
+    }
+
+    @Override
+    public Boolean saveBatch(List<TestDemo> list) {
+        return baseMapper.insertBatch(list);
+    }
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestTreeServiceImpl.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestTreeServiceImpl.java
new file mode 100644
index 0000000..138e19b
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestTreeServiceImpl.java
@@ -0,0 +1,88 @@
+package org.dromara.demo.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.demo.domain.TestTree;
+import org.dromara.demo.domain.bo.TestTreeBo;
+import org.dromara.demo.domain.vo.TestTreeVo;
+import org.dromara.demo.mapper.TestTreeMapper;
+import org.dromara.demo.service.ITestTreeService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 娴嬭瘯鏍戣〃Service涓氬姟灞傚鐞�
+ *
+ * @author Lion Li
+ * @date 2021-07-26
+ */
+// @DS("slave") // 鍒囨崲浠庡簱鏌ヨ
+@RequiredArgsConstructor
+@Service
+public class TestTreeServiceImpl implements ITestTreeService {
+
+    private final TestTreeMapper baseMapper;
+
+    @Override
+    public TestTreeVo queryById(Long id) {
+        return baseMapper.selectVoById(id);
+    }
+
+    // @DS("slave") // 鍒囨崲浠庡簱鏌ヨ
+    @Override
+    public List<TestTreeVo> queryList(TestTreeBo bo) {
+        LambdaQueryWrapper<TestTree> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<TestTree> buildQueryWrapper(TestTreeBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<TestTree> lqw = Wrappers.lambdaQuery();
+        lqw.like(StringUtils.isNotBlank(bo.getTreeName()), TestTree::getTreeName, bo.getTreeName());
+        lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null,
+            TestTree::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime"));
+        lqw.orderByAsc(TestTree::getId);
+        return lqw;
+    }
+
+    @Override
+    public Boolean insertByBo(TestTreeBo bo) {
+        TestTree add = BeanUtil.toBean(bo, TestTree.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    @Override
+    public Boolean updateByBo(TestTreeBo bo) {
+        TestTree update = BeanUtil.toBean(bo, TestTree.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
+     *
+     * @param entity 瀹炰綋绫绘暟鎹�
+     */
+    private void validEntityBeforeSave(TestTree entity) {
+        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
+    }
+
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if (isValid) {
+            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
+        }
+        return baseMapper.deleteBatchIds(ids) > 0;
+    }
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/package-info.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/package-info.java
new file mode 100644
index 0000000..7011984
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/package-info.java
@@ -0,0 +1 @@
+package org.dromara.demo.service.impl;
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/package-info.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/package-info.java
new file mode 100644
index 0000000..16727ff
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/package-info.java
@@ -0,0 +1 @@
+package org.dromara.demo.service;
diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/application.yml b/ruoyi-example/ruoyi-demo/src/main/resources/application.yml
new file mode 100644
index 0000000..d35ec41
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/resources/application.yml
@@ -0,0 +1,114 @@
+# Tomcat
+server:
+  port: 9401
+
+# Spring
+spring:
+  application:
+    # 搴旂敤鍚嶇О
+    name: ruoyi-demo
+  profiles:
+    # 鐜閰嶇疆
+    active: @profiles.active@
+
+--- # nacos 閰嶇疆
+spring:
+  cloud:
+    nacos:
+      # nacos 鏈嶅姟鍦板潃
+      server-addr: @nacos.server@
+      discovery:
+        # 娉ㄥ唽缁�
+        group: @nacos.discovery.group@
+        namespace: ${spring.profiles.active}
+      config:
+        # 閰嶇疆缁�
+        group: @nacos.config.group@
+        namespace: ${spring.profiles.active}
+  config:
+    import:
+      - optional:nacos:application-common.yml
+      - optional:nacos:ruoyi-resource.yml
+      - optional:nacos:datasource.yml
+
+--- # 鏁版嵁婧愯缃� 闇�鍦� system 鏁版嵁婧愪笅 鎵ц test.sql 鏂囦欢
+spring:
+  datasource:
+    dynamic:
+      seata: false
+      # 璁剧疆榛樿鐨勬暟鎹簮鎴栬�呮暟鎹簮缁�,榛樿鍊煎嵆涓� master
+      primary: master
+      datasource:
+        # 涓诲簱鏁版嵁婧�
+        master:
+          type: ${spring.datasource.type}
+          driver-class-name: com.mysql.cj.jdbc.Driver
+          url: ${datasource.system-master.url}
+          username: ${datasource.system-master.username}
+          password: ${datasource.system-master.password}
+        sharding:
+          lazy: true
+          type: ${spring.datasource.type}
+          driver-class-name: com.mysql.cj.jdbc.Driver
+          # shardingproxy 鏈嶅姟鐨刬p鍦板潃
+          url: jdbc:mysql://127.0.0.1:3307/data-center_db?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&allowMultiQueries=true&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
+          username: root
+          password: root
+#        oracle:
+#          type: ${spring.datasource.type}
+#          driverClassName: oracle.jdbc.OracleDriver
+#          url: ${datasource.system-oracle.url}
+#          username: ${datasource.system-oracle.username}
+#          password: ${datasource.system-oracle.password}
+#          hikari:
+#            connectionTestQuery: SELECT 1 FROM DUAL
+#        postgres:
+#          type: ${spring.datasource.type}
+#          driverClassName: org.postgresql.Driver
+#          url: ${datasource.system-postgres.url}
+#          username: ${datasource.system-postgres.username}
+#          password: ${datasource.system-postgres.password}
+
+--- # elasticsearch 鍔熻兘閰嶇疆
+# 鏂囨。鍦板潃: https://www.easy-es.cn/
+# 鏇存敼鍖呭悕闇�瑕佸幓 EasyEsConfiguration 淇敼鍖呮壂鎻�(鍚庣画鐗堟湰鏀寔閰嶇疆鏂囦欢璇诲彇)
+easy-es:
+  # 鏄惁寮�鍚疎E鑷姩閰嶇疆
+  enable: false
+  # es杩炴帴鍦板潃+绔彛 鏍煎紡蹇呴』涓篿p:port,濡傛灉鏄泦缇ゅ垯鍙敤閫楀彿闅斿紑
+  address : localhost:9200
+  # 榛樿涓篽ttp
+  schema: http
+  # 娉ㄦ剰ES寤鸿浣跨敤璐﹀彿璁よ瘉 涓嶄娇鐢ㄤ細鎶ヨ鍛婃棩蹇�
+  #濡傛灉鏃犺处鍙峰瘑鐮佸垯鍙笉閰嶇疆姝よ
+  #username:
+  #濡傛灉鏃犺处鍙峰瘑鐮佸垯鍙笉閰嶇疆姝よ
+  #password:
+  # 蹇冭烦绛栫暐鏃堕棿 鍗曚綅:ms
+  keep-alive-millis: 18000
+  # 杩炴帴瓒呮椂鏃堕棿 鍗曚綅:ms
+  connectTimeout: 5000
+  # 閫氫俊瓒呮椂鏃堕棿 鍗曚綅:ms
+  socketTimeout: 5000
+  # 杩炴帴璇锋眰瓒呮椂鏃堕棿 鍗曚綅:ms
+  connectionRequestTimeout: 5000
+  # 鏈�澶ц繛鎺ユ暟 鍗曚綅:涓�
+  maxConnTotal: 100
+  # 鏈�澶ц繛鎺ヨ矾鐢辨暟 鍗曚綅:涓�
+  maxConnPerRoute: 100
+  global-config:
+    # 寮�鍚帶鍒跺彴鎵撳嵃閫氳繃鏈鏋剁敓鎴愮殑DSL璇彞,榛樿涓哄紑鍚�,娴嬭瘯绋冲畾鍚庣殑鐢熶骇鐜寤鸿鍏抽棴,浠ユ彁鍗囧皯閲忔�ц兘
+    print-dsl: true
+    # 寮傛澶勭悊绱㈠紩鏄惁闃诲涓荤嚎绋� 榛樿闃诲 鏁版嵁閲忚繃澶ф椂璋冩暣涓洪潪闃诲寮傛杩涜 椤圭洰鍚姩鏇村揩
+    asyncProcessIndexBlocking: true
+    db-config:
+      # 鏄惁寮�鍚笅鍒掔嚎杞┘宄� 榛樿涓篺alse
+      map-underscore-to-camel-case: true
+      # id鐢熸垚绛栫暐 customize涓鸿嚜瀹氫箟,id鍊肩敱鐢ㄦ埛鐢熸垚,姣斿鍙朚ySQL涓殑鏁版嵁id,濡傜己鐪佹椤归厤缃�,鍒檌d榛樿绛栫暐涓篹s鑷姩鐢熸垚
+      id-type: customize
+      # 瀛楁鏇存柊绛栫暐 榛樿涓簄ot_null
+      field-strategy: not_null
+      # 榛樿寮�鍚�,鏌ヨ鑻ユ寚瀹氫簡size瓒呰繃1w鏉℃椂涔熶細鑷姩寮�鍚�,寮�鍚悗鏌ヨ鎵�鏈夊尮閰嶆暟鎹�,鑻ヤ笉寮�鍚�,浼氬鑷存棤娉曡幏鍙栨暟鎹�绘潯鏁�,鍏跺畠鍔熻兘涓嶅彈褰卞搷.
+      enable-track-total-hits: true
+      # 鏁版嵁鍒锋柊绛栫暐,榛樿涓轰笉鍒锋柊
+      refresh-policy: immediate
diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/banner.txt b/ruoyi-example/ruoyi-demo/src/main/resources/banner.txt
new file mode 100644
index 0000000..1514deb
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/resources/banner.txt
@@ -0,0 +1,10 @@
+Spring Boot Version: ${spring-boot.version}
+Spring Application Name: ${spring.application.name}
+                        _           _
+                       (_)         | |
+ _ __ _   _  ___  _   _ _ ______ __| | ___ _ __ ___   ___
+| '__| | | |/ _ \| | | | |______/ _` |/ _ \ '_ ` _ \ / _ \
+| |  | |_| | (_) | |_| | |     | (_| |  __/ | | | | | (_) |
+|_|   \__,_|\___/ \__, |_|      \__,_|\___|_| |_| |_|\___/
+                   __/ |
+                  |___/
diff --git "a/ruoyi-example/ruoyi-demo/src/main/resources/excel/\345\215\225\345\210\227\350\241\250.xlsx" "b/ruoyi-example/ruoyi-demo/src/main/resources/excel/\345\215\225\345\210\227\350\241\250.xlsx"
new file mode 100644
index 0000000..0f7347d
--- /dev/null
+++ "b/ruoyi-example/ruoyi-demo/src/main/resources/excel/\345\215\225\345\210\227\350\241\250.xlsx"
Binary files differ
diff --git "a/ruoyi-example/ruoyi-demo/src/main/resources/excel/\345\244\232sheet\345\210\227\350\241\250.xlsx" "b/ruoyi-example/ruoyi-demo/src/main/resources/excel/\345\244\232sheet\345\210\227\350\241\250.xlsx"
new file mode 100644
index 0000000..5277f2e
--- /dev/null
+++ "b/ruoyi-example/ruoyi-demo/src/main/resources/excel/\345\244\232sheet\345\210\227\350\241\250.xlsx"
Binary files differ
diff --git "a/ruoyi-example/ruoyi-demo/src/main/resources/excel/\345\244\232\345\210\227\350\241\250.xlsx" "b/ruoyi-example/ruoyi-demo/src/main/resources/excel/\345\244\232\345\210\227\350\241\250.xlsx"
new file mode 100644
index 0000000..c7d11dc
--- /dev/null
+++ "b/ruoyi-example/ruoyi-demo/src/main/resources/excel/\345\244\232\345\210\227\350\241\250.xlsx"
Binary files differ
diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/logback-plus.xml b/ruoyi-example/ruoyi-demo/src/main/resources/logback-plus.xml
new file mode 100644
index 0000000..ec6586f
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/resources/logback-plus.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <!-- 鏃ュ織瀛樻斁璺緞 -->
+	<property name="log.path" value="logs/${project.artifactId}" />
+   <!-- 鏃ュ織杈撳嚭鏍煎紡 -->
+    <property name="console.log.pattern"
+              value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/>
+
+    <!-- 鎺у埗鍙拌緭鍑� -->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>${console.log.pattern}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+    </appender>
+
+    <include resource="logback-common.xml" />
+
+	<!--绯荤粺鎿嶄綔鏃ュ織-->
+    <root level="info">
+        <appender-ref ref="console" />
+    </root>
+</configuration>
diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/ShardingOrderItemMapper.xml b/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/ShardingOrderItemMapper.xml
new file mode 100644
index 0000000..aeed502
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/ShardingOrderItemMapper.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.demo.mapper.ShardingOrderItemMapper">
+
+</mapper>
diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/ShardingOrderMapper.xml b/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/ShardingOrderMapper.xml
new file mode 100644
index 0000000..420912e
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/ShardingOrderMapper.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.demo.mapper.ShardingOrderMapper">
+
+</mapper>
diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/TestDemoMapper.xml b/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/TestDemoMapper.xml
new file mode 100644
index 0000000..9b722d1
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/TestDemoMapper.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.demo.mapper.TestDemoMapper">
+
+    <resultMap type="org.dromara.demo.domain.TestDemo" id="TestDemoResult">
+        <result property="id" column="id"/>
+        <result property="deptId" column="dept_id"/>
+        <result property="userId" column="user_id"/>
+        <result property="orderNum" column="order_num"/>
+        <result property="testKey" column="test_key"/>
+        <result property="value" column="value"/>
+        <result property="version" column="version"/>
+        <result property="createTime" column="create_time"/>
+        <result property="createBy" column="create_by"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="delFlag" column="del_flag"/>
+    </resultMap>
+    <select id="customPageList" resultType="org.dromara.demo.domain.vo.TestDemoVo">
+        SELECT * FROM test_demo ${ew.customSqlSegment}
+    </select>
+
+
+</mapper>
diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/TestTreeMapper.xml b/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/TestTreeMapper.xml
new file mode 100644
index 0000000..f34a565
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/TestTreeMapper.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.demo.mapper.TestTreeMapper">
+
+    <resultMap type="org.dromara.demo.domain.TestTree" id="TestTreeResult">
+        <result property="id" column="id"/>
+        <result property="parentId" column="parent_id"/>
+        <result property="deptId" column="dept_id"/>
+        <result property="userId" column="user_id"/>
+        <result property="treeName" column="tree_name"/>
+        <result property="version" column="version"/>
+        <result property="createTime" column="create_time"/>
+        <result property="createBy" column="create_by"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="delFlag" column="del_flag"/>
+    </resultMap>
+
+
+</mapper>
diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/mapper/package-info.md b/ruoyi-example/ruoyi-demo/src/main/resources/mapper/package-info.md
new file mode 100644
index 0000000..c938b1e
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/resources/mapper/package-info.md
@@ -0,0 +1,3 @@
+java鍖呬娇鐢� `.` 鍒嗗壊 resource 鐩綍浣跨敤 `/` 鍒嗗壊
+<br>
+姝ゆ枃浠剁洰鐨� 闃叉鏂囦欢澶圭矘杩炴壘涓嶅埌 `xml` 鏂囦欢
\ No newline at end of file
diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/spy.properties b/ruoyi-example/ruoyi-demo/src/main/resources/spy.properties
new file mode 100644
index 0000000..abbd893
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/resources/spy.properties
@@ -0,0 +1,28 @@
+# p6spy 鎬ц兘鍒嗘瀽鎻掍欢閰嶇疆鏂囦欢
+modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
+# 鑷畾涔夋棩蹇楁墦鍗�
+logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
+#鏃ュ織杈撳嚭鍒版帶鍒跺彴
+appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
+# 浣跨敤鏃ュ織绯荤粺璁板綍 sql
+#appender=com.p6spy.engine.spy.appender.Slf4JLogger
+# 璁剧疆 p6spy driver 浠g悊
+#deregisterdrivers=true
+# 鍙栨秷JDBC URL鍓嶇紑
+useprefix=true
+# 閰嶇疆璁板綍 Log 渚嬪,鍙幓鎺夌殑缁撴灉闆嗘湁error,info,batch,debug,statement,commit,rollback,result,resultset.
+excludecategories=info,debug,result,commit,resultset
+# 鏃ユ湡鏍煎紡
+dateformat=yyyy-MM-dd HH:mm:ss
+# SQL璇彞鎵撳嵃鏃堕棿鏍煎紡
+databaseDialectTimestampFormat=yyyy-MM-dd HH:mm:ss
+# 瀹為檯椹卞姩鍙涓�
+#driverlist=org.h2.Driver
+# 鏄惁寮�鍚參SQL璁板綍
+outagedetection=true
+# 鎱QL璁板綍鏍囧噯 2 绉�
+outagedetectioninterval=2
+# 鏄惁杩囨护 Log
+filter=true
+# 杩囨护 Log 鏃舵墍鎺掗櫎鐨� sql 鍏抽敭瀛楋紝浠ラ�楀彿鍒嗛殧
+exclude=SELECT 1
diff --git a/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/AssertUnitTest.java b/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/AssertUnitTest.java
new file mode 100644
index 0000000..40c6ab3
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/AssertUnitTest.java
@@ -0,0 +1,45 @@
+package org.dromara.demo;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+
+/**
+ * 鏂█鍗曞厓娴嬭瘯妗堜緥
+ *
+ * @author Lion Li
+ */
+@DisplayName("鏂█鍗曞厓娴嬭瘯妗堜緥")
+public class AssertUnitTest {
+
+    @DisplayName("娴嬭瘯 assertEquals 鏂规硶")
+    @Test
+    public void testAssertEquals() {
+        Assertions.assertEquals("666", new String("666"));
+        Assertions.assertNotEquals("666", new String("666"));
+    }
+
+    @DisplayName("娴嬭瘯 assertSame 鏂规硶")
+    @Test
+    public void testAssertSame() {
+        Object obj = new Object();
+        Object obj1 = obj;
+        Assertions.assertSame(obj, obj1);
+        Assertions.assertNotSame(obj, obj1);
+    }
+
+    @DisplayName("娴嬭瘯 assertTrue 鏂规硶")
+    @Test
+    public void testAssertTrue() {
+        Assertions.assertTrue(true);
+        Assertions.assertFalse(true);
+    }
+
+    @DisplayName("娴嬭瘯 assertNull 鏂规硶")
+    @Test
+    public void testAssertNull() {
+        Assertions.assertNull(null);
+        Assertions.assertNotNull(null);
+    }
+
+}
diff --git a/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/DemoUnitTest.java b/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/DemoUnitTest.java
new file mode 100644
index 0000000..a3e96dd
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/DemoUnitTest.java
@@ -0,0 +1,69 @@
+package org.dromara.demo;
+
+import org.junit.jupiter.api.*;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 鍗曞厓娴嬭瘯妗堜緥
+ *
+ * @author Lion Li
+ */
+@SpringBootTest // 姝ゆ敞瑙e彧鑳藉湪 springboot 涓诲寘涓嬩娇鐢� 闇�鍖呭惈 main 鏂规硶涓� yml 閰嶇疆鏂囦欢
+@DisplayName("鍗曞厓娴嬭瘯妗堜緥")
+public class DemoUnitTest {
+
+    @Value("${spring.application.name}")
+    private String appName;
+
+    @DisplayName("娴嬭瘯 @SpringBootTest @Test @DisplayName 娉ㄨВ")
+    @Test
+    public void testTest() {
+        System.out.println(appName);
+    }
+
+    @Disabled
+    @DisplayName("娴嬭瘯 @Disabled 娉ㄨВ")
+    @Test
+    public void testDisabled() {
+        System.out.println(appName);
+    }
+
+    @Timeout(value = 2L, unit = TimeUnit.SECONDS)
+    @DisplayName("娴嬭瘯 @Timeout 娉ㄨВ")
+    @Test
+    public void testTimeout() throws InterruptedException {
+        Thread.sleep(3000);
+        System.out.println(appName);
+    }
+
+
+    @DisplayName("娴嬭瘯 @RepeatedTest 娉ㄨВ")
+    @RepeatedTest(3)
+    public void testRepeatedTest() {
+        System.out.println(666);
+    }
+
+    @BeforeAll
+    public static void testBeforeAll() {
+        System.out.println("@BeforeAll ==================");
+    }
+
+    @BeforeEach
+    public void testBeforeEach() {
+        System.out.println("@BeforeEach ==================");
+    }
+
+    @AfterEach
+    public void testAfterEach() {
+        System.out.println("@AfterEach ==================");
+    }
+
+    @AfterAll
+    public static void testAfterAll() {
+        System.out.println("@AfterAll ==================");
+    }
+
+}
diff --git a/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/ParamUnitTest.java b/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/ParamUnitTest.java
new file mode 100644
index 0000000..ce56d53
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/ParamUnitTest.java
@@ -0,0 +1,72 @@
+package org.dromara.demo;
+
+import org.dromara.common.core.enums.UserType;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.EnumSource;
+import org.junit.jupiter.params.provider.MethodSource;
+import org.junit.jupiter.params.provider.NullSource;
+import org.junit.jupiter.params.provider.ValueSource;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Stream;
+
+/**
+ * 甯﹀弬鏁板崟鍏冩祴璇曟渚�
+ *
+ * @author Lion Li
+ */
+@DisplayName("甯﹀弬鏁板崟鍏冩祴璇曟渚�")
+public class ParamUnitTest {
+
+    @DisplayName("娴嬭瘯 @ValueSource 娉ㄨВ")
+    @ParameterizedTest
+    @ValueSource(strings = {"t1", "t2", "t3"})
+    public void testValueSource(String str) {
+        System.out.println(str);
+    }
+
+    @DisplayName("娴嬭瘯 @NullSource 娉ㄨВ")
+    @ParameterizedTest
+    @NullSource
+    public void testNullSource(String str) {
+        System.out.println(str);
+    }
+
+    @DisplayName("娴嬭瘯 @EnumSource 娉ㄨВ")
+    @ParameterizedTest
+    @EnumSource(UserType.class)
+    public void testEnumSource(UserType type) {
+        System.out.println(type.getUserType());
+    }
+
+    @DisplayName("娴嬭瘯 @MethodSource 娉ㄨВ")
+    @ParameterizedTest
+    @MethodSource("getParam")
+    public void testMethodSource(String str) {
+        System.out.println(str);
+    }
+
+    public static Stream<String> getParam() {
+        List<String> list = new ArrayList<>();
+        list.add("t1");
+        list.add("t2");
+        list.add("t3");
+        return list.stream();
+    }
+
+    @BeforeEach
+    public void testBeforeEach() {
+        System.out.println("@BeforeEach ==================");
+    }
+
+    @AfterEach
+    public void testAfterEach() {
+        System.out.println("@AfterEach ==================");
+    }
+
+
+}
diff --git a/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/TOrderTest.java b/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/TOrderTest.java
new file mode 100644
index 0000000..300057d
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/TOrderTest.java
@@ -0,0 +1,49 @@
+package org.dromara.demo;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import org.dromara.demo.domain.ShardingOrder;
+import org.dromara.demo.mapper.ShardingOrderMapper;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class TOrderTest {
+
+    @Autowired
+    ShardingOrderMapper torderMapper;
+
+
+    @Test
+    void find() {
+        //Order order = orderMapper.selectById(1640990702722723841L);
+    }
+
+    @Test
+    void page() {
+        Page<ShardingOrder> page = new Page<>();
+        page.setCurrent(3L);
+        QueryWrapper<ShardingOrder> queryWrapper = new QueryWrapper<>();
+        queryWrapper.orderByAsc("order_id");
+        torderMapper.selectPage(page,queryWrapper);
+        System.out.println(page.getTotal());
+        for(ShardingOrder order : page.getRecords()){
+            System.out.print(order.getTotalMoney()+" ");
+        }
+    }
+
+    @Test
+    void insert() {
+        for(Long i = 1L; i <= 100L; i++){
+            ShardingOrder torder = new ShardingOrder();
+            torder.setUserId(i);
+            torder.setTotalMoney(100 + Integer.parseInt(i+""));
+            torderMapper.insert(torder);
+        }
+
+    }
+
+
+}
diff --git a/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/TagUnitTest.java b/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/TagUnitTest.java
new file mode 100644
index 0000000..6d8c416
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/TagUnitTest.java
@@ -0,0 +1,54 @@
+package org.dromara.demo;
+
+import org.junit.jupiter.api.*;
+import org.springframework.boot.test.context.SpringBootTest;
+
+/**
+ * 鏍囩鍗曞厓娴嬭瘯妗堜緥
+ *
+ * @author Lion Li
+ */
+@SpringBootTest
+@DisplayName("鏍囩鍗曞厓娴嬭瘯妗堜緥")
+public class TagUnitTest {
+
+    @Tag("dev")
+    @DisplayName("娴嬭瘯 @Tag dev")
+    @Test
+    public void testTagDev() {
+        System.out.println("dev");
+    }
+
+    @Tag("prod")
+    @DisplayName("娴嬭瘯 @Tag prod")
+    @Test
+    public void testTagProd() {
+        System.out.println("prod");
+    }
+
+    @Tag("local")
+    @DisplayName("娴嬭瘯 @Tag local")
+    @Test
+    public void testTagLocal() {
+        System.out.println("local");
+    }
+
+    @Tag("exclude")
+    @DisplayName("娴嬭瘯 @Tag exclude")
+    @Test
+    public void testTagExclude() {
+        System.out.println("exclude");
+    }
+
+    @BeforeEach
+    public void testBeforeEach() {
+        System.out.println("@BeforeEach ==================");
+    }
+
+    @AfterEach
+    public void testAfterEach() {
+        System.out.println("@AfterEach ==================");
+    }
+
+
+}
diff --git a/ruoyi-example/ruoyi-stream-mq/pom.xml b/ruoyi-example/ruoyi-stream-mq/pom.xml
new file mode 100644
index 0000000..5b3343e
--- /dev/null
+++ b/ruoyi-example/ruoyi-stream-mq/pom.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.dromara</groupId>
+        <artifactId>ruoyi-example</artifactId>
+        <version>${revision}</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>ruoyi-stream-mq</artifactId>
+
+    <description>
+        ruoyi-stream-mq SpringCloud-Stream-MQ 妗堜緥椤圭洰
+    </description>
+
+    <dependencies>
+
+        <!-- SpringCloud Alibaba Nacos -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+
+        <!-- SpringCloud Alibaba Nacos Config -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-stream-kafka</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-sentinel</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-security</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-doc</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-tenant</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.dromara</groupId>
+                    <artifactId>ruoyi-common-mybatis</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <finalName>${project.artifactId}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>${spring-boot.version}</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/RuoYiStreamMqApplication.java b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/RuoYiStreamMqApplication.java
new file mode 100644
index 0000000..2c46467
--- /dev/null
+++ b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/RuoYiStreamMqApplication.java
@@ -0,0 +1,22 @@
+package org.dromara.stream;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
+
+/**
+ * SpringCloud-Stream-MQ 妗堜緥椤圭洰
+ *
+ * @author Lion Li
+ */
+@SpringBootApplication
+public class RuoYiStreamMqApplication {
+
+    public static void main(String[] args) {
+        SpringApplication application = new SpringApplication(RuoYiStreamMqApplication.class);
+        application.setApplicationStartup(new BufferingApplicationStartup(2048));
+        application.run(args);
+        System.out.println("(鈾モ棤鈥库棤)锞夛緸  MQ妗堜緥妯″潡鍚姩鎴愬姛   醿�(麓凇`醿�)锞�  ");
+    }
+
+}
diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/controller/TestMqController.java b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/controller/TestMqController.java
new file mode 100644
index 0000000..bbfee28
--- /dev/null
+++ b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/controller/TestMqController.java
@@ -0,0 +1,60 @@
+package org.dromara.stream.controller;
+
+import org.dromara.common.core.domain.R;
+import org.dromara.stream.mq.producer.DelayProducer;
+import org.dromara.stream.mq.producer.LogStreamProducer;
+import org.dromara.stream.mq.producer.TestStreamProducer;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 娴嬭瘯mq
+ */
+@Slf4j
+@RestController
+@AllArgsConstructor
+@RequestMapping("/test-mq")
+public class TestMqController {
+
+    private final DelayProducer delayProducer;
+    private final TestStreamProducer testStreamProducer;
+    private final LogStreamProducer logStreamProducer;
+
+    /**
+     * 鍙戦�佹秷鎭疪abbitmq
+     *
+     * @param msg 娑堟伅鍐呭
+     * @param delay 寤舵椂鏃堕棿
+     */
+    @GetMapping("/sendRabbitmq")
+    public R<Void> sendRabbitmq(String msg, Long delay) {
+        delayProducer.sendMsg(msg, delay);
+        return R.ok();
+    }
+
+    /**
+     * 鍙戦�佹秷鎭疪ocketmq
+     *
+     * @param msg 娑堟伅鍐呭
+     */
+    @GetMapping("/sendRocketmq")
+    public R<Void> sendRocketmq(String msg) {
+        testStreamProducer.streamTestMsg(msg);
+        return R.ok();
+    }
+
+    /**
+     * 鍙戦�佹秷鎭疜afka
+     *
+     * @param msg 娑堟伅鍐呭
+     */
+    @GetMapping("/sendKafka")
+    public R<Void> sendKafka(String msg) {
+        logStreamProducer.streamLogMsg(msg);
+        return R.ok();
+    }
+
+}
diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/TestMessaging.java b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/TestMessaging.java
new file mode 100644
index 0000000..9759bee
--- /dev/null
+++ b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/TestMessaging.java
@@ -0,0 +1,20 @@
+package org.dromara.stream.mq;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * @author Lion Li
+ */
+@Data
+@Accessors(chain = true)
+public class TestMessaging {
+    /**
+     * 娑堟伅id
+     */
+    private String msgId;
+    /**
+     * 娑堟伅鍐呭
+     */
+    private String msgText;
+}
diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/DelayConsumer.java b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/DelayConsumer.java
new file mode 100644
index 0000000..6045286
--- /dev/null
+++ b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/DelayConsumer.java
@@ -0,0 +1,22 @@
+package org.dromara.stream.mq.consumer;
+
+
+import org.dromara.stream.mq.TestMessaging;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Component;
+
+import java.util.function.Consumer;
+
+@Slf4j
+@Component
+public class DelayConsumer {
+
+    @Bean
+    Consumer<TestMessaging> delay() {
+        log.info("鍒濆鍖栬闃�");
+        return obj -> {
+            log.info("娑堟伅鎺ユ敹鎴愬姛锛�" + obj);
+        };
+    }
+}
diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/LogStreamConsumer.java b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/LogStreamConsumer.java
new file mode 100644
index 0000000..b21eb55
--- /dev/null
+++ b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/LogStreamConsumer.java
@@ -0,0 +1,22 @@
+package org.dromara.stream.mq.consumer;
+
+import org.dromara.stream.mq.TestMessaging;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Component;
+
+import java.util.function.Consumer;
+
+@Slf4j
+@Component
+public class LogStreamConsumer {
+
+    @Bean
+    Consumer<TestMessaging> log() {
+        log.info("鍒濆鍖栬闃�");
+        return msg -> {
+            log.info("閫氳繃stream娑堣垂鍒版秷鎭� => {}", msg.toString());
+        };
+    }
+
+}
diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/TestStreamConsumer.java b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/TestStreamConsumer.java
new file mode 100644
index 0000000..0163c78
--- /dev/null
+++ b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/TestStreamConsumer.java
@@ -0,0 +1,22 @@
+package org.dromara.stream.mq.consumer;
+
+import org.dromara.stream.mq.TestMessaging;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Component;
+
+import java.util.function.Consumer;
+
+@Slf4j
+@Component
+public class TestStreamConsumer {
+
+    @Bean
+    Consumer<TestMessaging> demo() {
+        log.info("鍒濆鍖栬闃�");
+        return msg -> {
+            log.info("閫氳繃stream娑堣垂鍒版秷鎭� => {}", msg.toString());
+        };
+    }
+
+}
diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/DelayProducer.java b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/DelayProducer.java
new file mode 100644
index 0000000..b879d91
--- /dev/null
+++ b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/DelayProducer.java
@@ -0,0 +1,27 @@
+package org.dromara.stream.mq.producer;
+
+import org.dromara.stream.mq.TestMessaging;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.stream.function.StreamBridge;
+import org.springframework.messaging.Message;
+import org.springframework.messaging.support.MessageBuilder;
+import org.springframework.stereotype.Component;
+
+import java.util.UUID;
+
+@Component
+public class DelayProducer {
+
+    @Autowired
+    private StreamBridge streamBridge;
+
+    public void sendMsg(String msg, Long delay) {
+        // 鏋勫缓娑堟伅瀵硅薄
+        TestMessaging testMessaging = new TestMessaging()
+            .setMsgId(UUID.randomUUID().toString())
+            .setMsgText(msg);
+        Message<TestMessaging> message = MessageBuilder.withPayload(testMessaging)
+            .setHeader("x-delay", delay).build();
+        streamBridge.send("delay-out-0", message);
+    }
+}
diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/LogStreamProducer.java b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/LogStreamProducer.java
new file mode 100644
index 0000000..bff3924
--- /dev/null
+++ b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/LogStreamProducer.java
@@ -0,0 +1,24 @@
+package org.dromara.stream.mq.producer;
+
+import org.dromara.stream.mq.TestMessaging;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.stream.function.StreamBridge;
+import org.springframework.messaging.support.MessageBuilder;
+import org.springframework.stereotype.Component;
+
+import java.util.UUID;
+
+@Component
+public class LogStreamProducer {
+
+    @Autowired
+    private StreamBridge streamBridge;
+
+    public void streamLogMsg(String msg) {
+        // 鏋勫缓娑堟伅瀵硅薄
+        TestMessaging testMessaging = new TestMessaging()
+            .setMsgId(UUID.randomUUID().toString())
+            .setMsgText(msg);
+        streamBridge.send("log-out-0", MessageBuilder.withPayload(testMessaging).build());
+    }
+}
diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/TestStreamProducer.java b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/TestStreamProducer.java
new file mode 100644
index 0000000..a23c1fc
--- /dev/null
+++ b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/TestStreamProducer.java
@@ -0,0 +1,24 @@
+package org.dromara.stream.mq.producer;
+
+import org.dromara.stream.mq.TestMessaging;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.stream.function.StreamBridge;
+import org.springframework.messaging.support.MessageBuilder;
+import org.springframework.stereotype.Component;
+
+import java.util.UUID;
+
+@Component
+public class TestStreamProducer {
+
+    @Autowired
+    private StreamBridge streamBridge;
+
+    public void streamTestMsg(String msg) {
+        // 鏋勫缓娑堟伅瀵硅薄
+        TestMessaging testMessaging = new TestMessaging()
+            .setMsgId(UUID.randomUUID().toString())
+            .setMsgText(msg);
+        streamBridge.send("demo-out-0", MessageBuilder.withPayload(testMessaging).build());
+    }
+}
diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/resources/application.yml b/ruoyi-example/ruoyi-stream-mq/src/main/resources/application.yml
new file mode 100644
index 0000000..35b6d1f
--- /dev/null
+++ b/ruoyi-example/ruoyi-stream-mq/src/main/resources/application.yml
@@ -0,0 +1,107 @@
+server:
+  port: 9402
+
+# Spring
+spring:
+  application:
+    # 搴旂敤鍚嶇О
+    name: ruoyi-stream-mq
+  profiles:
+    # 鐜閰嶇疆
+    active: @profiles.active@
+  cloud:
+    stream:
+      function:
+        # 閲嶇偣閰嶇疆 涓� binding 鍚嶄笌娑堣垂鑰呭搴�
+        definition: delay;demo;log
+
+--- # rabbitmq 閰嶇疆
+spring:
+  rabbitmq:
+    host: localhost
+    port: 5672
+    username: root
+    password: root
+  cloud:
+    stream:
+      rabbit:
+        bindings:
+          delay-in-0:
+            consumer:
+              delayedExchange: true
+          delay-out-0:
+            producer:
+              delayedExchange: true
+      bindings:
+        delay-in-0:
+          destination: delay.exchange.cloud
+          content-type: application/json
+          group: delay-group
+          binder: rabbit
+        delay-out-0:
+          destination: delay.exchange.cloud
+          content-type: application/json
+          group: delay-group
+          binder: rabbit
+
+--- # rocketmq 閰嶇疆
+spring:
+  cloud:
+    stream:
+      rocketmq:
+        binder:
+          # rocketmq 鍦板潃
+          name-server: localhost:9876
+        bindings:
+          demo-out-0:
+            producer:
+              # 蹇呴』寰楀啓
+              group: default
+      bindings:
+        demo-out-0:
+          content-type: application/json
+          destination: stream-test-topic
+          group: test-group
+          binder: rocketmq
+        demo-in-0:
+          content-type: application/json
+          destination: stream-test-topic
+          group: test-group
+          binder: rocketmq
+
+--- # kafka 閰嶇疆
+spring:
+  cloud:
+    stream:
+      kafka:
+        binder:
+          brokers: localhost:9092
+      bindings:
+        log-out-0:
+          destination: stream-log-topic
+          contentType: application/json
+          group: log_group
+          binder: kafka
+        log-in-0:
+          destination: stream-log-topic
+          contentType: application/json
+          group: log_group
+          binder: kafka
+
+--- # nacos 閰嶇疆
+spring:
+  cloud:
+    nacos:
+      # nacos 鏈嶅姟鍦板潃
+      server-addr: @nacos.server@
+      discovery:
+        # 娉ㄥ唽缁�
+        group: @nacos.discovery.group@
+        namespace: ${spring.profiles.active}
+      config:
+        # 閰嶇疆缁�
+        group: @nacos.config.group@
+        namespace: ${spring.profiles.active}
+  config:
+    import:
+      - optional:nacos:application-common.yml
diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/resources/banner.txt b/ruoyi-example/ruoyi-stream-mq/src/main/resources/banner.txt
new file mode 100644
index 0000000..8a8054c
--- /dev/null
+++ b/ruoyi-example/ruoyi-stream-mq/src/main/resources/banner.txt
@@ -0,0 +1,10 @@
+Spring Boot Version: ${spring-boot.version}
+Spring Application Name: ${spring.application.name}
+                        _            _
+                       (_)          | |
+ _ __ _   _  ___  _   _ _ ______ ___| |_ _ __ ___  __ _ _ __ ___ ______ _ __ ___   __ _
+| '__| | | |/ _ \| | | | |______/ __| __| '__/ _ \/ _` | '_ ` _ \______| '_ ` _ \ / _` |
+| |  | |_| | (_) | |_| | |      \__ \ |_| | |  __/ (_| | | | | | |     | | | | | | (_| |
+|_|   \__,_|\___/ \__, |_|      |___/\__|_|  \___|\__,_|_| |_| |_|     |_| |_| |_|\__, |
+                   __/ |                                                             | |
+                  |___/                                                              |_|
diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/resources/logback-plus.xml b/ruoyi-example/ruoyi-stream-mq/src/main/resources/logback-plus.xml
new file mode 100644
index 0000000..0507560
--- /dev/null
+++ b/ruoyi-example/ruoyi-stream-mq/src/main/resources/logback-plus.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <!-- 鏃ュ織瀛樻斁璺緞 -->
+	<property name="log.path" value="logs/${project.artifactId}" />
+   <!-- 鏃ュ織杈撳嚭鏍煎紡 -->
+    <property name="console.log.pattern"
+              value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/>
+
+    <!-- 鎺у埗鍙拌緭鍑� -->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>${console.log.pattern}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+    </appender>
+
+    <include resource="logback-common.xml" />
+
+    <!-- 寮�鍚� skywalking 鏃ュ織鏀堕泦 -->
+    <include resource="logback-skylog.xml" />
+
+	<!--绯荤粺鎿嶄綔鏃ュ織-->
+    <root level="info">
+        <appender-ref ref="console" />
+    </root>
+</configuration>
diff --git a/ruoyi-visual/pom.xml b/ruoyi-visual/pom.xml
new file mode 100644
index 0000000..513e1cf
--- /dev/null
+++ b/ruoyi-visual/pom.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.dromara</groupId>
+        <artifactId>ruoyi-cloud-plus</artifactId>
+        <version>${revision}</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <modules>
+        <module>ruoyi-monitor</module>
+        <module>ruoyi-sentinel-dashboard</module>
+        <module>ruoyi-seata-server</module>
+        <module>ruoyi-nacos</module>
+        <module>ruoyi-powerjob-server</module>
+    </modules>
+
+    <artifactId>ruoyi-visual</artifactId>
+    <packaging>pom</packaging>
+
+    <description>
+        ruoyi-visual鍥惧舰鍖栫鐞嗘ā鍧�
+    </description>
+
+    <dependencies>
+        <!-- ELK 鏃ュ織鏀堕泦 -->
+<!--        <dependency>-->
+<!--            <groupId>org.dromara</groupId>-->
+<!--            <artifactId>ruoyi-common-logstash</artifactId>-->
+<!--        </dependency>-->
+
+        <!-- skywalking 鏃ュ織鏀堕泦 -->
+<!--        <dependency>-->
+<!--            <groupId>org.dromara</groupId>-->
+<!--            <artifactId>ruoyi-common-skylog</artifactId>-->
+<!--        </dependency>-->
+
+        <!-- prometheus 鐩戞帶 -->
+<!--        <dependency>-->
+<!--            <groupId>org.dromara</groupId>-->
+<!--            <artifactId>ruoyi-common-prometheus</artifactId>-->
+<!--        </dependency>-->
+    </dependencies>
+
+</project>
diff --git a/ruoyi-visual/ruoyi-nacos/Dockerfile b/ruoyi-visual/ruoyi-nacos/Dockerfile
new file mode 100644
index 0000000..6394b7b
--- /dev/null
+++ b/ruoyi-visual/ruoyi-nacos/Dockerfile
@@ -0,0 +1,17 @@
+#FROM findepi/graalvm:java17-native
+FROM openjdk:17.0.2-oraclelinux8
+
+MAINTAINER Lion Li
+
+RUN mkdir -p /ruoyi/nacos
+
+WORKDIR /ruoyi/nacos
+
+EXPOSE 8848
+
+ENV TZ=Asia/Shanghai LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="-Xms512m -Xmx1024m"
+
+ADD ./target/ruoyi-nacos.jar ./app.jar
+
+ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -jar app.jar ${JAVA_OPTS}
+
diff --git a/ruoyi-visual/ruoyi-nacos/pom.xml b/ruoyi-visual/ruoyi-nacos/pom.xml
new file mode 100644
index 0000000..a1ae716
--- /dev/null
+++ b/ruoyi-visual/ruoyi-nacos/pom.xml
@@ -0,0 +1,327 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 1999-2018 Alibaba Group Holding Ltd.
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.dromara</groupId>
+        <artifactId>ruoyi-visual</artifactId>
+        <version>${revision}</version>
+    </parent>
+    <artifactId>ruoyi-nacos</artifactId>
+    <packaging>jar</packaging>
+
+    <properties>
+        <nacos.version>2.2.1</nacos.version>
+        <!-- 闇�瑕佷笌 Nacos 鍐呯疆 Boot 鐗堟湰淇濇寔涓�鑷� -->
+        <spring-boot.version>2.7.18</spring-boot.version>
+        <spring-boot-admin.version>2.7.11</spring-boot-admin.version>
+        <nacos.lib.path>${project.basedir}/src/main/resources/lib</nacos.lib.path>
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <!-- SpringBoot 渚濊禆閰嶇疆 -->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>com.alibaba.nacos</groupId>
+                <artifactId>nacos-all</artifactId>
+                <version>${nacos.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.alibaba.nacos</groupId>
+            <artifactId>nacos-auth</artifactId>
+            <version>${nacos.version}</version>
+            <scope>system</scope>
+            <systemPath>${nacos.lib.path}/nacos-auth-${nacos.version}.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.nacos</groupId>
+            <artifactId>nacos-cmdb</artifactId>
+            <version>${nacos.version}</version>
+            <scope>system</scope>
+            <systemPath>${nacos.lib.path}/nacos-cmdb-${nacos.version}.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.nacos</groupId>
+            <artifactId>nacos-config</artifactId>
+            <version>${nacos.version}</version>
+            <scope>system</scope>
+            <systemPath>${nacos.lib.path}/nacos-config-${nacos.version}.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.nacos</groupId>
+            <artifactId>nacos-consistency</artifactId>
+            <version>${nacos.version}</version>
+            <scope>system</scope>
+            <systemPath>${nacos.lib.path}/nacos-consistency-${nacos.version}.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.nacos</groupId>
+            <artifactId>nacos-contrl-plugin</artifactId>
+            <version>${nacos.version}</version>
+            <scope>system</scope>
+            <systemPath>${nacos.lib.path}/nacos-contrl-plugin-${nacos.version}.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.nacos</groupId>
+            <artifactId>nacos-core</artifactId>
+            <version>${nacos.version}</version>
+            <scope>system</scope>
+            <systemPath>${nacos.lib.path}/nacos-core-${nacos.version}.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.nacos</groupId>
+            <artifactId>nacos-istio</artifactId>
+            <version>${nacos.version}</version>
+            <scope>system</scope>
+            <systemPath>${nacos.lib.path}/nacos-istio-${nacos.version}.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.nacos</groupId>
+            <artifactId>nacos-naming</artifactId>
+            <version>${nacos.version}</version>
+            <scope>system</scope>
+            <systemPath>${nacos.lib.path}/nacos-naming-${nacos.version}.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.nacos</groupId>
+            <artifactId>nacos-plugin-default-impl</artifactId>
+            <version>${nacos.version}</version>
+            <scope>system</scope>
+            <systemPath>${nacos.lib.path}/nacos-plugin-default-impl-${nacos.version}.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.nacos</groupId>
+            <artifactId>nacos-prometheus</artifactId>
+            <version>${nacos.version}</version>
+            <scope>system</scope>
+            <systemPath>${nacos.lib.path}/nacos-prometheus-${nacos.version}.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.nacos</groupId>
+            <artifactId>nacos-sys</artifactId>
+            <version>${nacos.version}</version>
+            <scope>system</scope>
+            <systemPath>${nacos.lib.path}/nacos-sys-${nacos.version}.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.nacos</groupId>
+            <artifactId>nacos-custom-environment-plugin</artifactId>
+            <version>${nacos.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.nacos</groupId>
+            <artifactId>nacos-datasource-plugin</artifactId>
+            <version>${nacos.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.nacos</groupId>
+            <artifactId>nacos-encryption-plugin</artifactId>
+            <version>${nacos.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.nacos</groupId>
+            <artifactId>nacos-trace-plugin</artifactId>
+            <version>${nacos.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.nacos</groupId>
+            <artifactId>nacos-common</artifactId>
+            <version>${nacos.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.nacos</groupId>
+            <artifactId>nacos-client</artifactId>
+        </dependency>
+
+        <!-- SpringBoot Web瀹瑰櫒 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>spring-boot-starter-tomcat</artifactId>
+                    <groupId>org.springframework.boot</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>log4j-to-slf4j</artifactId>
+                    <groupId>org.apache.logging.log4j</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!-- web 瀹瑰櫒浣跨敤 undertow 鎬ц兘鏇村己 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-undertow</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-jdbc</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.ldap</groupId>
+            <artifactId>spring-ldap-core</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.caucho</groupId>
+            <artifactId>hessian</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-collections</groupId>
+            <artifactId>commons-collections</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.mysql</groupId>
+            <artifactId>mysql-connector-j</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.derby</groupId>
+            <artifactId>derby</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alipay.sofa</groupId>
+            <artifactId>jraft-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alipay.sofa</groupId>
+            <artifactId>rpc-grpc-impl</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.codehaus.jackson</groupId>
+            <artifactId>jackson-core-asl</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt-impl</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt-jackson</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.javatuples</groupId>
+            <artifactId>javatuples</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.micrometer</groupId>
+            <artifactId>micrometer-registry-prometheus</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.micrometer</groupId>
+            <artifactId>micrometer-registry-influx</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.micrometer</groupId>
+            <artifactId>micrometer-registry-elastic</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>io.envoyproxy.controlplane</groupId>
+            <artifactId>api</artifactId>
+            <version>0.1.27</version>
+        </dependency>
+
+        <!-- log -->
+        <!-- apache commons logging閫氳繃slf4j鏉ヤ唬鐞� -->
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>jcl-over-slf4j</artifactId>
+        </dependency>
+        <!-- java.util.logging 閫氳繃slf4j鏉ヤ唬鐞� -->
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>jul-to-slf4j</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>de.codecentric</groupId>
+            <artifactId>spring-boot-admin-client</artifactId>
+            <version>${spring-boot-admin.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>${project.artifactId}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>${spring-boot.version}</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <!-- 浣滅敤:椤圭洰鎵撴垚jar鐨勫悓鏃跺皢鏈湴jar鍖呬篃寮曞叆杩涘幓 -->
+                    <includeSystemScope>true</includeSystemScope>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/resources/application.properties b/ruoyi-visual/ruoyi-nacos/src/main/resources/application.properties
new file mode 100644
index 0000000..f3e5f5f
--- /dev/null
+++ b/ruoyi-visual/ruoyi-nacos/src/main/resources/application.properties
@@ -0,0 +1,196 @@
+#
+# Copyright 1999-2018 Alibaba Group Holding Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+#*************** Spring Boot Related Configurations ***************#
+server.port=8848
+### Default web context path:
+server.servlet.contextPath=/nacos
+### Include message field
+server.error.include-message=ON_PARAM
+### Default web server port:
+
+#*************** Network Related Configurations ***************#
+### If prefer hostname over ip for Nacos server addresses in cluster.conf:
+# nacos.inetutils.prefer-hostname-over-ip=false
+
+### Specify local server's IP:
+# nacos.inetutils.ip-address=
+
+spring.application.name=ruoyi-nacos
+#*************** Config Module Related Configurations ***************#
+### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
+spring.sql.init.platform=mysql
+nacos.plugin.datasource.log.enabled=true
+
+### Count of DB:
+db.num=1
+
+### Connect URL of DB:
+db.url.0=jdbc:mysql://127.0.0.1:3306/ry-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
+db.user.0=root
+db.password.0=root
+
+#*************** Naming Module Related Configurations ***************#
+### Data dispatch task execution period in milliseconds:
+# nacos.naming.distro.taskDispatchPeriod=200
+
+### Data count of batch sync task:
+# nacos.naming.distro.batchSyncKeyCount=1000
+
+### Retry delay in milliseconds if sync task failed:
+# nacos.naming.distro.syncRetryDelay=5000
+
+### If enable data warmup. If set to false, the server would accept request without local data preparation:
+# nacos.naming.data.warmup=true
+
+### If enable the instance auto expiration, kind like of health check of instance:
+# nacos.naming.expireInstance=true
+
+nacos.naming.empty-service.auto-clean=true
+nacos.naming.empty-service.clean.initial-delay-ms=50000
+nacos.naming.empty-service.clean.period-time-ms=30000
+
+
+#*************** CMDB Module Related Configurations ***************#
+### The interval to dump external CMDB in seconds:
+# nacos.cmdb.dumpTaskInterval=3600
+
+### The interval of polling data change event in seconds:
+# nacos.cmdb.eventTaskInterval=10
+
+### The interval of loading labels in seconds:
+# nacos.cmdb.labelTaskInterval=300
+
+### If turn on data loading task:
+# nacos.cmdb.loadDataAtStart=false
+
+
+#*************** Metrics Related Configurations ***************#
+# 鎸囧悜 ruoyi-monitor 鐩戞帶
+spring.boot.admin.client.url=http://127.0.0.1:9100
+spring.boot.admin.client.username=ruoyi
+spring.boot.admin.client.password=123456
+spring.boot.admin.client.instance.service-host-type=IP
+
+### Metrics for prometheus
+management.endpoints.web.exposure.include=*
+
+### Metrics for elastic search
+management.metrics.export.elastic.enabled=false
+#management.metrics.export.elastic.host=http://localhost:9200
+
+### Metrics for influx
+management.metrics.export.influx.enabled=false
+#management.metrics.export.influx.db=springboot
+#management.metrics.export.influx.uri=http://localhost:8086
+#management.metrics.export.influx.auto-create-db=true
+#management.metrics.export.influx.consistency=one
+#management.metrics.export.influx.compressed=true
+
+#*************** Access Control Related Configurations ***************#
+### If enable spring security, this option is deprecated in 1.2.0:
+#spring.security.enabled=false
+
+### The ignore urls of auth, is deprecated in 1.2.0:
+nacos.security.ignore.urls=/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-ui/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**
+
+### The auth system to use, currently only 'nacos' and 'ldap' is supported:
+nacos.core.auth.system.type=nacos
+
+### If turn on auth system:
+nacos.core.auth.enabled=false
+
+### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.
+nacos.core.auth.caching.enabled=true
+
+### Since 1.4.1, Turn on/off white auth for user-agent: nacos-server, only for upgrade from old version.
+nacos.core.auth.enable.userAgentAuthWhite=false
+
+### Since 1.4.1, worked when nacos.core.auth.enabled=true and nacos.core.auth.enable.userAgentAuthWhite=false.
+### The two properties is the white list for auth and used by identity the request from other server.
+### 姝ゅ涓虹敤鎴峰悕瀵嗙爜 闇�瑕佽嚜琛屼慨鏀�
+nacos.core.auth.server.identity.key=serverIdentity
+nacos.core.auth.server.identity.value=security
+
+### worked when nacos.core.auth.system.type=nacos
+### The token expiration in seconds:
+nacos.core.auth.plugin.nacos.token.cache.enable=false
+nacos.core.auth.plugin.nacos.token.expire.seconds=18000
+### The default token (Base64 string):
+#nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789
+### 姝ゅ涓簍oken瀵嗛挜 闇�瑕佽嚜琛屼慨鏀�
+nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789
+
+### worked when nacos.core.auth.system.type=ldap锛寋0} is Placeholder,replace login username
+#nacos.core.auth.ldap.url=ldap://localhost:389
+#nacos.core.auth.ldap.basedc=dc=example,dc=org
+#nacos.core.auth.ldap.userDn=cn=admin,${nacos.core.auth.ldap.basedc}
+#nacos.core.auth.ldap.password=admin
+#nacos.core.auth.ldap.userdn=cn={0},dc=example,dc=org
+#nacos.core.auth.ldap.filter.prefix=uid
+#nacos.core.auth.ldap.case.sensitive=true
+
+
+#*************** Istio Related Configurations ***************#
+### If turn on the MCP server:
+nacos.istio.mcp.server.enabled=false
+
+
+
+###*************** Add from 1.3.0 ***************###
+
+
+#*************** Core Related Configurations ***************#
+
+### set the WorkerID manually
+# nacos.core.snowflake.worker-id=
+
+### Member-MetaData
+# nacos.core.member.meta.site=
+# nacos.core.member.meta.adweight=
+# nacos.core.member.meta.weight=
+
+### MemberLookup
+### Addressing pattern category, If set, the priority is highest
+# nacos.core.member.lookup.type=[file,address-server]
+## Set the cluster list with a configuration file or command-line argument
+# nacos.member.list=192.168.16.101:8847?raft_port=8807,192.168.16.101?raft_port=8808,192.168.16.101:8849?raft_port=8809
+## for AddressServerMemberLookup
+# Maximum number of retries to query the address server upon initialization
+# nacos.core.address-server.retry=5
+## Server domain name address of [address-server] mode
+# address.server.domain=jmenv.tbsite.net
+## Server port of [address-server] mode
+# address.server.port=8080
+## Request address of [address-server] mode
+# address.server.url=/nacos/serverlist
+
+#*************** JRaft Related Configurations ***************#
+
+### Sets the Raft cluster election timeout, default value is 5 second
+# nacos.core.protocol.raft.data.election_timeout_ms=5000
+### Sets the amount of time the Raft snapshot will execute periodically, default is 30 minute
+# nacos.core.protocol.raft.data.snapshot_interval_secs=30
+### raft internal worker threads
+# nacos.core.protocol.raft.data.core_thread_num=8
+### Number of threads required for raft business request processing
+# nacos.core.protocol.raft.data.cli_service_thread_num=4
+### raft linear read strategy. Safe linear reads are used by default, that is, the Leader tenure is confirmed by heartbeat
+# nacos.core.protocol.raft.data.read_index_type=ReadOnlySafe
+### rpc request timeout, default 5 seconds
+# nacos.core.protocol.raft.data.rpc_request_timeout_ms=5000
+### enable to support prometheus service discovery
+#nacos.prometheus.metrics.enabled=true
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/resources/banner.txt b/ruoyi-visual/ruoyi-nacos/src/main/resources/banner.txt
new file mode 100644
index 0000000..e197a61
--- /dev/null
+++ b/ruoyi-visual/ruoyi-nacos/src/main/resources/banner.txt
@@ -0,0 +1,15 @@
+
+         ,--.
+       ,--.'|
+   ,--,:  : |                                           Nacos ${application.version}
+,`--.'`|  ' :                       ,---.               Running in ${nacos.mode} mode, ${nacos.function.mode} function modules
+|   :  :  | |                      '   ,'\   .--.--.    Port: ${server.port}
+:   |   \ | :  ,--.--.     ,---.  /   /   | /  /    '   Pid: ${pid}
+|   : '  '; | /       \   /     \.   ; ,. :|  :  /`./   Console: http://${nacos.local.ip}:${server.port}${server.servlet.contextPath}/index.html
+'   ' ;.    ;.--.  .-. | /    / ''   | |: :|  :  ;_
+|   | | \   | \__\/: . ..    ' / '   | .; : \  \    `.      https://nacos.io
+'   : |  ; .' ," .--.; |'   ; :__|   :    |  `----.   \
+|   | '`--'  /  /  ,.  |'   | '.'|\   \  /  /  /`--'  /
+'   : |     ;  :   .'   \   :    : `----'  '--'.     /
+;   |.'     |  ,     .-./\   \  /            `--'---'
+'---'        `--`---'     `----'
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/codemirror.addone.fullscreen.js b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/codemirror.addone.fullscreen.js
new file mode 100644
index 0000000..e38b6a0
--- /dev/null
+++ b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/codemirror.addone.fullscreen.js
@@ -0,0 +1,54 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+(function(mod) {
+  if (typeof exports == "object" && typeof module == "object") // CommonJS
+    mod(require("../../lib/codemirror"));
+  else if (typeof define == "function" && define.amd) // AMD
+    define(["../../lib/codemirror"], mod);
+  else // Plain browser env
+    mod(CodeMirror);
+})(function(CodeMirror) {
+  "use strict";
+
+  CodeMirror.defineOption("fullScreen", false, function(cm, val, old) {
+    if (old == CodeMirror.Init) old = false;
+    if (!old == !val) return;
+    if (val) setFullscreen(cm);
+    else setNormal(cm);
+  });
+
+  function setFullscreen(cm) {
+    var wrap = cm.getWrapperElement();
+    cm.state.fullScreenRestore = {scrollTop: window.pageYOffset, scrollLeft: window.pageXOffset,
+                                  width: wrap.style.width, height: wrap.style.height};
+    wrap.style.width = "";
+    wrap.style.height = "auto";
+    wrap.className += " CodeMirror-fullscreen";
+    document.documentElement.style.overflow = "hidden";
+    cm.refresh();
+  }
+
+  function setNormal(cm) {
+    var wrap = cm.getWrapperElement();
+    wrap.className = wrap.className.replace(/\s*CodeMirror-fullscreen\b/, "");
+    document.documentElement.style.overflow = "";
+    var info = cm.state.fullScreenRestore;
+    wrap.style.width = info.width; wrap.style.height = info.height;
+    window.scrollTo(info.scrollLeft, info.scrollTop);
+    cm.refresh();
+  }
+});
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/codemirror.addone.json-lint.js b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/codemirror.addone.json-lint.js
new file mode 100644
index 0000000..5628e0d
--- /dev/null
+++ b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/codemirror.addone.json-lint.js
@@ -0,0 +1,44 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// Depends on jsonlint.js from https://github.com/zaach/jsonlint
+
+// declare global: jsonlint
+
+(function(mod) {
+  if (typeof exports == "object" && typeof module == "object") // CommonJS
+    mod(require("../../lib/codemirror"));
+  else if (typeof define == "function" && define.amd) // AMD
+    define(["../../lib/codemirror"], mod);
+  else // Plain browser env
+    mod(CodeMirror);
+})(function(CodeMirror) {
+"use strict";
+
+CodeMirror.registerHelper("lint", "json", function(text) {
+  var found = [];
+  jsonlint.parseError = function(str, hash) {
+    var loc = hash.loc;
+    found.push({from: CodeMirror.Pos(loc.first_line - 1, loc.first_column),
+                to: CodeMirror.Pos(loc.last_line - 1, loc.last_column),
+                message: str});
+  };
+  try { jsonlint.parse(text); }
+  catch(e) {}
+  return found;
+});
+
+});
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/codemirror.addone.lint.js b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/codemirror.addone.lint.js
new file mode 100644
index 0000000..927caf8
--- /dev/null
+++ b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/codemirror.addone.lint.js
@@ -0,0 +1,251 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+(function(mod) {
+  if (typeof exports == "object" && typeof module == "object") // CommonJS
+    mod(require("../../lib/codemirror"));
+  else if (typeof define == "function" && define.amd) // AMD
+    define(["../../lib/codemirror"], mod);
+  else // Plain browser env
+    mod(CodeMirror);
+})(function(CodeMirror) {
+  "use strict";
+  var GUTTER_ID = "CodeMirror-lint-markers";
+
+  function showTooltip(e, content) {
+    var tt = document.createElement("div");
+    tt.className = "CodeMirror-lint-tooltip";
+    tt.appendChild(content.cloneNode(true));
+    document.body.appendChild(tt);
+
+    function position(e) {
+      if (!tt.parentNode) return CodeMirror.off(document, "mousemove", position);
+      tt.style.top = Math.max(0, e.clientY - tt.offsetHeight - 5) + "px";
+      tt.style.left = (e.clientX + 5) + "px";
+    }
+    CodeMirror.on(document, "mousemove", position);
+    position(e);
+    if (tt.style.opacity != null) tt.style.opacity = 1;
+    return tt;
+  }
+  function rm(elt) {
+    if (elt.parentNode) elt.parentNode.removeChild(elt);
+  }
+  function hideTooltip(tt) {
+    if (!tt.parentNode) return;
+    if (tt.style.opacity == null) rm(tt);
+    tt.style.opacity = 0;
+    setTimeout(function() { rm(tt); }, 600);
+  }
+
+  function showTooltipFor(e, content, node) {
+    var tooltip = showTooltip(e, content);
+    function hide() {
+      CodeMirror.off(node, "mouseout", hide);
+      if (tooltip) { hideTooltip(tooltip); tooltip = null; }
+    }
+    var poll = setInterval(function() {
+      if (tooltip) for (var n = node;; n = n.parentNode) {
+        if (n && n.nodeType == 11) n = n.host;
+        if (n == document.body) return;
+        if (!n) { hide(); break; }
+      }
+      if (!tooltip) return clearInterval(poll);
+    }, 400);
+    CodeMirror.on(node, "mouseout", hide);
+  }
+
+  function LintState(cm, options, hasGutter) {
+    this.marked = [];
+    this.options = options;
+    this.timeout = null;
+    this.hasGutter = hasGutter;
+    this.onMouseOver = function(e) { onMouseOver(cm, e); };
+    this.waitingFor = 0
+  }
+
+  function parseOptions(_cm, options) {
+    if (options instanceof Function) return {getAnnotations: options};
+    if (!options || options === true) options = {};
+    return options;
+  }
+
+  function clearMarks(cm) {
+    var state = cm.state.lint;
+    if (state.hasGutter) cm.clearGutter(GUTTER_ID);
+    for (var i = 0; i < state.marked.length; ++i)
+      state.marked[i].clear();
+    state.marked.length = 0;
+  }
+
+  function makeMarker(labels, severity, multiple, tooltips) {
+    var marker = document.createElement("div"), inner = marker;
+    marker.className = "CodeMirror-lint-marker-" + severity;
+    if (multiple) {
+      inner = marker.appendChild(document.createElement("div"));
+      inner.className = "CodeMirror-lint-marker-multiple";
+    }
+
+    if (tooltips != false) CodeMirror.on(inner, "mouseover", function(e) {
+      showTooltipFor(e, labels, inner);
+    });
+
+    return marker;
+  }
+
+  function getMaxSeverity(a, b) {
+    if (a == "error") return a;
+    else return b;
+  }
+
+  function groupByLine(annotations) {
+    var lines = [];
+    for (var i = 0; i < annotations.length; ++i) {
+      var ann = annotations[i], line = ann.from.line;
+      (lines[line] || (lines[line] = [])).push(ann);
+    }
+    return lines;
+  }
+
+  function annotationTooltip(ann) {
+    var severity = ann.severity;
+    if (!severity) severity = "error";
+    var tip = document.createElement("div");
+    tip.className = "CodeMirror-lint-message-" + severity;
+    tip.appendChild(document.createTextNode(ann.message));
+    return tip;
+  }
+
+  function lintAsync(cm, getAnnotations, passOptions) {
+    var state = cm.state.lint
+    var id = ++state.waitingFor
+    function abort() {
+      id = -1
+      cm.off("change", abort)
+    }
+    cm.on("change", abort)
+    getAnnotations(cm.getValue(), function(annotations, arg2) {
+      cm.off("change", abort)
+      if (state.waitingFor != id) return
+      if (arg2 && annotations instanceof CodeMirror) annotations = arg2
+      updateLinting(cm, annotations)
+    }, passOptions, cm);
+  }
+
+  function startLinting(cm) {
+    var state = cm.state.lint, options = state.options;
+    var passOptions = options.options || options; // Support deprecated passing of `options` property in options
+    var getAnnotations = options.getAnnotations || cm.getHelper(CodeMirror.Pos(0, 0), "lint");
+    if (!getAnnotations) return;
+    if (options.async || getAnnotations.async) {
+      lintAsync(cm, getAnnotations, passOptions)
+    } else {
+      updateLinting(cm, getAnnotations(cm.getValue(), passOptions, cm));
+    }
+  }
+
+  function updateLinting(cm, annotationsNotSorted) {
+    clearMarks(cm);
+    var state = cm.state.lint, options = state.options;
+
+    var annotations = groupByLine(annotationsNotSorted);
+
+    for (var line = 0; line < annotations.length; ++line) {
+      var anns = annotations[line];
+      if (!anns) continue;
+
+      var maxSeverity = null;
+      var tipLabel = state.hasGutter && document.createDocumentFragment();
+
+      for (var i = 0; i < anns.length; ++i) {
+        var ann = anns[i];
+        var severity = ann.severity;
+        if (!severity) severity = "error";
+        maxSeverity = getMaxSeverity(maxSeverity, severity);
+
+        if (options.formatAnnotation) ann = options.formatAnnotation(ann);
+        if (state.hasGutter) tipLabel.appendChild(annotationTooltip(ann));
+
+        if (ann.to) state.marked.push(cm.markText(ann.from, ann.to, {
+          className: "CodeMirror-lint-mark-" + severity,
+          __annotation: ann
+        }));
+      }
+
+      if (state.hasGutter)
+        cm.setGutterMarker(line, GUTTER_ID, makeMarker(tipLabel, maxSeverity, anns.length > 1,
+                                                       state.options.tooltips));
+    }
+    if (options.onUpdateLinting) options.onUpdateLinting(annotationsNotSorted, annotations, cm);
+  }
+
+  function onChange(cm) {
+    var state = cm.state.lint;
+    if (!state) return;
+    clearTimeout(state.timeout);
+    state.timeout = setTimeout(function(){startLinting(cm);}, state.options.delay || 500);
+  }
+
+  function popupTooltips(annotations, e) {
+    var target = e.target || e.srcElement;
+    var tooltip = document.createDocumentFragment();
+    for (var i = 0; i < annotations.length; i++) {
+      var ann = annotations[i];
+      tooltip.appendChild(annotationTooltip(ann));
+    }
+    showTooltipFor(e, tooltip, target);
+  }
+
+  function onMouseOver(cm, e) {
+    var target = e.target || e.srcElement;
+    if (!/\bCodeMirror-lint-mark-/.test(target.className)) return;
+    var box = target.getBoundingClientRect(), x = (box.left + box.right) / 2, y = (box.top + box.bottom) / 2;
+    var spans = cm.findMarksAt(cm.coordsChar({left: x, top: y}, "client"));
+
+    var annotations = [];
+    for (var i = 0; i < spans.length; ++i) {
+      annotations.push(spans[i].__annotation);
+    }
+    if (annotations.length) popupTooltips(annotations, e);
+  }
+
+  CodeMirror.defineOption("lint", false, function(cm, val, old) {
+    if (old && old != CodeMirror.Init) {
+      clearMarks(cm);
+      if (cm.state.lint.options.lintOnChange !== false)
+        cm.off("change", onChange);
+      CodeMirror.off(cm.getWrapperElement(), "mouseover", cm.state.lint.onMouseOver);
+      clearTimeout(cm.state.lint.timeout);
+      delete cm.state.lint;
+    }
+
+    if (val) {
+      var gutters = cm.getOption("gutters"), hasLintGutter = false;
+      for (var i = 0; i < gutters.length; ++i) if (gutters[i] == GUTTER_ID) hasLintGutter = true;
+      var state = cm.state.lint = new LintState(cm, parseOptions(cm, val), hasLintGutter);
+      if (state.options.lintOnChange !== false)
+        cm.on("change", onChange);
+      if (state.options.tooltips != false)
+        CodeMirror.on(cm.getWrapperElement(), "mouseover", state.onMouseOver);
+
+      startLinting(cm);
+    }
+  });
+
+  CodeMirror.defineExtension("performLint", function() {
+    if (this.state.lint) startLinting(this);
+  });
+});
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/codemirror.js b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/codemirror.js
new file mode 100644
index 0000000..559b4ea
--- /dev/null
+++ b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/codemirror.js
@@ -0,0 +1,9515 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// This is CodeMirror (http://codemirror.net), a code editor
+// implemented in JavaScript on top of the browser's DOM.
+//
+// You can find some technical background for some of the code below
+// at http://marijnhaverbeke.nl/blog/#cm-internals .
+
+(function (global, factory) {
+	typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+	typeof define === 'function' && define.amd ? define(factory) :
+	(global.CodeMirror = factory());
+}(this, (function () { 'use strict';
+
+// Kludges for bugs and behavior differences that can't be feature
+// detected are enabled based on userAgent etc sniffing.
+var userAgent = navigator.userAgent;
+var platform = navigator.platform;
+
+var gecko = /gecko\/\d/i.test(userAgent);
+var ie_upto10 = /MSIE \d/.test(userAgent);
+var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(userAgent);
+var edge = /Edge\/(\d+)/.exec(userAgent);
+var ie = ie_upto10 || ie_11up || edge;
+var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : +(edge || ie_11up)[1]);
+var webkit = !edge && /WebKit\//.test(userAgent);
+var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(userAgent);
+var chrome = !edge && /Chrome\//.test(userAgent);
+var presto = /Opera\//.test(userAgent);
+var safari = /Apple Computer/.test(navigator.vendor);
+var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(userAgent);
+var phantom = /PhantomJS/.test(userAgent);
+
+var ios = !edge && /AppleWebKit/.test(userAgent) && /Mobile\/\w+/.test(userAgent);
+var android = /Android/.test(userAgent);
+// This is woefully incomplete. Suggestions for alternative methods welcome.
+var mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent);
+var mac = ios || /Mac/.test(platform);
+var chromeOS = /\bCrOS\b/.test(userAgent);
+var windows = /win/i.test(platform);
+
+var presto_version = presto && userAgent.match(/Version\/(\d*\.\d*)/);
+if (presto_version) { presto_version = Number(presto_version[1]); }
+if (presto_version && presto_version >= 15) { presto = false; webkit = true; }
+// Some browsers use the wrong event properties to signal cmd/ctrl on OS X
+var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11));
+var captureRightClick = gecko || (ie && ie_version >= 9);
+
+function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*") }
+
+var rmClass = function(node, cls) {
+  var current = node.className;
+  var match = classTest(cls).exec(current);
+  if (match) {
+    var after = current.slice(match.index + match[0].length);
+    node.className = current.slice(0, match.index) + (after ? match[1] + after : "");
+  }
+};
+
+function removeChildren(e) {
+  for (var count = e.childNodes.length; count > 0; --count)
+    { e.removeChild(e.firstChild); }
+  return e
+}
+
+function removeChildrenAndAdd(parent, e) {
+  return removeChildren(parent).appendChild(e)
+}
+
+function elt(tag, content, className, style) {
+  var e = document.createElement(tag);
+  if (className) { e.className = className; }
+  if (style) { e.style.cssText = style; }
+  if (typeof content == "string") { e.appendChild(document.createTextNode(content)); }
+  else if (content) { for (var i = 0; i < content.length; ++i) { e.appendChild(content[i]); } }
+  return e
+}
+// wrapper for elt, which removes the elt from the accessibility tree
+function eltP(tag, content, className, style) {
+  var e = elt(tag, content, className, style);
+  e.setAttribute("role", "presentation");
+  return e
+}
+
+var range;
+if (document.createRange) { range = function(node, start, end, endNode) {
+  var r = document.createRange();
+  r.setEnd(endNode || node, end);
+  r.setStart(node, start);
+  return r
+}; }
+else { range = function(node, start, end) {
+  var r = document.body.createTextRange();
+  try { r.moveToElementText(node.parentNode); }
+  catch(e) { return r }
+  r.collapse(true);
+  r.moveEnd("character", end);
+  r.moveStart("character", start);
+  return r
+}; }
+
+function contains(parent, child) {
+  if (child.nodeType == 3) // Android browser always returns false when child is a textnode
+    { child = child.parentNode; }
+  if (parent.contains)
+    { return parent.contains(child) }
+  do {
+    if (child.nodeType == 11) { child = child.host; }
+    if (child == parent) { return true }
+  } while (child = child.parentNode)
+}
+
+function activeElt() {
+  // IE and Edge may throw an "Unspecified Error" when accessing document.activeElement.
+  // IE < 10 will throw when accessed while the page is loading or in an iframe.
+  // IE > 9 and Edge will throw when accessed in an iframe if document.body is unavailable.
+  var activeElement;
+  try {
+    activeElement = document.activeElement;
+  } catch(e) {
+    activeElement = document.body || null;
+  }
+  while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement)
+    { activeElement = activeElement.shadowRoot.activeElement; }
+  return activeElement
+}
+
+function addClass(node, cls) {
+  var current = node.className;
+  if (!classTest(cls).test(current)) { node.className += (current ? " " : "") + cls; }
+}
+function joinClasses(a, b) {
+  var as = a.split(" ");
+  for (var i = 0; i < as.length; i++)
+    { if (as[i] && !classTest(as[i]).test(b)) { b += " " + as[i]; } }
+  return b
+}
+
+var selectInput = function(node) { node.select(); };
+if (ios) // Mobile Safari apparently has a bug where select() is broken.
+  { selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; }; }
+else if (ie) // Suppress mysterious IE10 errors
+  { selectInput = function(node) { try { node.select(); } catch(_e) {} }; }
+
+function bind(f) {
+  var args = Array.prototype.slice.call(arguments, 1);
+  return function(){return f.apply(null, args)}
+}
+
+function copyObj(obj, target, overwrite) {
+  if (!target) { target = {}; }
+  for (var prop in obj)
+    { if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop)))
+      { target[prop] = obj[prop]; } }
+  return target
+}
+
+// Counts the column offset in a string, taking tabs into account.
+// Used mostly to find indentation.
+function countColumn(string, end, tabSize, startIndex, startValue) {
+  if (end == null) {
+    end = string.search(/[^\s\u00a0]/);
+    if (end == -1) { end = string.length; }
+  }
+  for (var i = startIndex || 0, n = startValue || 0;;) {
+    var nextTab = string.indexOf("\t", i);
+    if (nextTab < 0 || nextTab >= end)
+      { return n + (end - i) }
+    n += nextTab - i;
+    n += tabSize - (n % tabSize);
+    i = nextTab + 1;
+  }
+}
+
+var Delayed = function() {this.id = null;};
+Delayed.prototype.set = function (ms, f) {
+  clearTimeout(this.id);
+  this.id = setTimeout(f, ms);
+};
+
+function indexOf(array, elt) {
+  for (var i = 0; i < array.length; ++i)
+    { if (array[i] == elt) { return i } }
+  return -1
+}
+
+// Number of pixels added to scroller and sizer to hide scrollbar
+var scrollerGap = 30;
+
+// Returned or thrown by various protocols to signal 'I'm not
+// handling this'.
+var Pass = {toString: function(){return "CodeMirror.Pass"}};
+
+// Reused option objects for setSelection & friends
+var sel_dontScroll = {scroll: false};
+var sel_mouse = {origin: "*mouse"};
+var sel_move = {origin: "+move"};
+
+// The inverse of countColumn -- find the offset that corresponds to
+// a particular column.
+function findColumn(string, goal, tabSize) {
+  for (var pos = 0, col = 0;;) {
+    var nextTab = string.indexOf("\t", pos);
+    if (nextTab == -1) { nextTab = string.length; }
+    var skipped = nextTab - pos;
+    if (nextTab == string.length || col + skipped >= goal)
+      { return pos + Math.min(skipped, goal - col) }
+    col += nextTab - pos;
+    col += tabSize - (col % tabSize);
+    pos = nextTab + 1;
+    if (col >= goal) { return pos }
+  }
+}
+
+var spaceStrs = [""];
+function spaceStr(n) {
+  while (spaceStrs.length <= n)
+    { spaceStrs.push(lst(spaceStrs) + " "); }
+  return spaceStrs[n]
+}
+
+function lst(arr) { return arr[arr.length-1] }
+
+function map(array, f) {
+  var out = [];
+  for (var i = 0; i < array.length; i++) { out[i] = f(array[i], i); }
+  return out
+}
+
+function insertSorted(array, value, score) {
+  var pos = 0, priority = score(value);
+  while (pos < array.length && score(array[pos]) <= priority) { pos++; }
+  array.splice(pos, 0, value);
+}
+
+function nothing() {}
+
+function createObj(base, props) {
+  var inst;
+  if (Object.create) {
+    inst = Object.create(base);
+  } else {
+    nothing.prototype = base;
+    inst = new nothing();
+  }
+  if (props) { copyObj(props, inst); }
+  return inst
+}
+
+var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;
+function isWordCharBasic(ch) {
+  return /\w/.test(ch) || ch > "\x80" &&
+    (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch))
+}
+function isWordChar(ch, helper) {
+  if (!helper) { return isWordCharBasic(ch) }
+  if (helper.source.indexOf("\\w") > -1 && isWordCharBasic(ch)) { return true }
+  return helper.test(ch)
+}
+
+function isEmpty(obj) {
+  for (var n in obj) { if (obj.hasOwnProperty(n) && obj[n]) { return false } }
+  return true
+}
+
+// Extending unicode characters. A series of a non-extending char +
+// any number of extending chars is treated as a single unit as far
+// as editing and measuring is concerned. This is not fully correct,
+// since some scripts/fonts/browsers also treat other configurations
+// of code points as a group.
+var extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;
+function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch) }
+
+// Returns a number from the range [`0`; `str.length`] unless `pos` is outside that range.
+function skipExtendingChars(str, pos, dir) {
+  while ((dir < 0 ? pos > 0 : pos < str.length) && isExtendingChar(str.charAt(pos))) { pos += dir; }
+  return pos
+}
+
+// Returns the value from the range [`from`; `to`] that satisfies
+// `pred` and is closest to `from`. Assumes that at least `to` satisfies `pred`.
+function findFirst(pred, from, to) {
+  for (;;) {
+    if (Math.abs(from - to) <= 1) { return pred(from) ? from : to }
+    var mid = Math.floor((from + to) / 2);
+    if (pred(mid)) { to = mid; }
+    else { from = mid; }
+  }
+}
+
+// The display handles the DOM integration, both for input reading
+// and content drawing. It holds references to DOM nodes and
+// display-related state.
+
+function Display(place, doc, input) {
+  var d = this;
+  this.input = input;
+
+  // Covers bottom-right square when both scrollbars are present.
+  d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler");
+  d.scrollbarFiller.setAttribute("cm-not-content", "true");
+  // Covers bottom of gutter when coverGutterNextToScrollbar is on
+  // and h scrollbar is present.
+  d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler");
+  d.gutterFiller.setAttribute("cm-not-content", "true");
+  // Will contain the actual code, positioned to cover the viewport.
+  d.lineDiv = eltP("div", null, "CodeMirror-code");
+  // Elements are added to these to represent selection and cursors.
+  d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1");
+  d.cursorDiv = elt("div", null, "CodeMirror-cursors");
+  // A visibility: hidden element used to find the size of things.
+  d.measure = elt("div", null, "CodeMirror-measure");
+  // When lines outside of the viewport are measured, they are drawn in this.
+  d.lineMeasure = elt("div", null, "CodeMirror-measure");
+  // Wraps everything that needs to exist inside the vertically-padded coordinate system
+  d.lineSpace = eltP("div", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv],
+                    null, "position: relative; outline: none");
+  var lines = eltP("div", [d.lineSpace], "CodeMirror-lines");
+  // Moved around its parent to cover visible view.
+  d.mover = elt("div", [lines], null, "position: relative");
+  // Set to the height of the document, allowing scrolling.
+  d.sizer = elt("div", [d.mover], "CodeMirror-sizer");
+  d.sizerWidth = null;
+  // Behavior of elts with overflow: auto and padding is
+  // inconsistent across browsers. This is used to ensure the
+  // scrollable area is big enough.
+  d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerGap + "px; width: 1px;");
+  // Will contain the gutters, if any.
+  d.gutters = elt("div", null, "CodeMirror-gutters");
+  d.lineGutter = null;
+  // Actual scrollable element.
+  d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll");
+  d.scroller.setAttribute("tabIndex", "-1");
+  // The element in which the editor lives.
+  d.wrapper = elt("div", [d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror");
+
+  // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported)
+  if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; }
+  if (!webkit && !(gecko && mobile)) { d.scroller.draggable = true; }
+
+  if (place) {
+    if (place.appendChild) { place.appendChild(d.wrapper); }
+    else { place(d.wrapper); }
+  }
+
+  // Current rendered range (may be bigger than the view window).
+  d.viewFrom = d.viewTo = doc.first;
+  d.reportedViewFrom = d.reportedViewTo = doc.first;
+  // Information about the rendered lines.
+  d.view = [];
+  d.renderedView = null;
+  // Holds info about a single rendered line when it was rendered
+  // for measurement, while not in view.
+  d.externalMeasured = null;
+  // Empty space (in pixels) above the view
+  d.viewOffset = 0;
+  d.lastWrapHeight = d.lastWrapWidth = 0;
+  d.updateLineNumbers = null;
+
+  d.nativeBarWidth = d.barHeight = d.barWidth = 0;
+  d.scrollbarsClipped = false;
+
+  // Used to only resize the line number gutter when necessary (when
+  // the amount of lines crosses a boundary that makes its width change)
+  d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null;
+  // Set to true when a non-horizontal-scrolling line widget is
+  // added. As an optimization, line widget aligning is skipped when
+  // this is false.
+  d.alignWidgets = false;
+
+  d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;
+
+  // Tracks the maximum line length so that the horizontal scrollbar
+  // can be kept static when scrolling.
+  d.maxLine = null;
+  d.maxLineLength = 0;
+  d.maxLineChanged = false;
+
+  // Used for measuring wheel scrolling granularity
+  d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null;
+
+  // True when shift is held down.
+  d.shift = false;
+
+  // Used to track whether anything happened since the context menu
+  // was opened.
+  d.selForContextMenu = null;
+
+  d.activeTouch = null;
+
+  input.init(d);
+}
+
+// Find the line object corresponding to the given line number.
+function getLine(doc, n) {
+  n -= doc.first;
+  if (n < 0 || n >= doc.size) { throw new Error("There is no line " + (n + doc.first) + " in the document.") }
+  var chunk = doc;
+  while (!chunk.lines) {
+    for (var i = 0;; ++i) {
+      var child = chunk.children[i], sz = child.chunkSize();
+      if (n < sz) { chunk = child; break }
+      n -= sz;
+    }
+  }
+  return chunk.lines[n]
+}
+
+// Get the part of a document between two positions, as an array of
+// strings.
+function getBetween(doc, start, end) {
+  var out = [], n = start.line;
+  doc.iter(start.line, end.line + 1, function (line) {
+    var text = line.text;
+    if (n == end.line) { text = text.slice(0, end.ch); }
+    if (n == start.line) { text = text.slice(start.ch); }
+    out.push(text);
+    ++n;
+  });
+  return out
+}
+// Get the lines between from and to, as array of strings.
+function getLines(doc, from, to) {
+  var out = [];
+  doc.iter(from, to, function (line) { out.push(line.text); }); // iter aborts when callback returns truthy value
+  return out
+}
+
+// Update the height of a line, propagating the height change
+// upwards to parent nodes.
+function updateLineHeight(line, height) {
+  var diff = height - line.height;
+  if (diff) { for (var n = line; n; n = n.parent) { n.height += diff; } }
+}
+
+// Given a line object, find its line number by walking up through
+// its parent links.
+function lineNo(line) {
+  if (line.parent == null) { return null }
+  var cur = line.parent, no = indexOf(cur.lines, line);
+  for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {
+    for (var i = 0;; ++i) {
+      if (chunk.children[i] == cur) { break }
+      no += chunk.children[i].chunkSize();
+    }
+  }
+  return no + cur.first
+}
+
+// Find the line at the given vertical position, using the height
+// information in the document tree.
+function lineAtHeight(chunk, h) {
+  var n = chunk.first;
+  outer: do {
+    for (var i$1 = 0; i$1 < chunk.children.length; ++i$1) {
+      var child = chunk.children[i$1], ch = child.height;
+      if (h < ch) { chunk = child; continue outer }
+      h -= ch;
+      n += child.chunkSize();
+    }
+    return n
+  } while (!chunk.lines)
+  var i = 0;
+  for (; i < chunk.lines.length; ++i) {
+    var line = chunk.lines[i], lh = line.height;
+    if (h < lh) { break }
+    h -= lh;
+  }
+  return n + i
+}
+
+function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size}
+
+function lineNumberFor(options, i) {
+  return String(options.lineNumberFormatter(i + options.firstLineNumber))
+}
+
+// A Pos instance represents a position within the text.
+function Pos(line, ch, sticky) {
+  if ( sticky === void 0 ) sticky = null;
+
+  if (!(this instanceof Pos)) { return new Pos(line, ch, sticky) }
+  this.line = line;
+  this.ch = ch;
+  this.sticky = sticky;
+}
+
+// Compare two positions, return 0 if they are the same, a negative
+// number when a is less, and a positive number otherwise.
+function cmp(a, b) { return a.line - b.line || a.ch - b.ch }
+
+function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b) == 0 }
+
+function copyPos(x) {return Pos(x.line, x.ch)}
+function maxPos(a, b) { return cmp(a, b) < 0 ? b : a }
+function minPos(a, b) { return cmp(a, b) < 0 ? a : b }
+
+// Most of the external API clips given positions to make sure they
+// actually exist within the document.
+function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1))}
+function clipPos(doc, pos) {
+  if (pos.line < doc.first) { return Pos(doc.first, 0) }
+  var last = doc.first + doc.size - 1;
+  if (pos.line > last) { return Pos(last, getLine(doc, last).text.length) }
+  return clipToLen(pos, getLine(doc, pos.line).text.length)
+}
+function clipToLen(pos, linelen) {
+  var ch = pos.ch;
+  if (ch == null || ch > linelen) { return Pos(pos.line, linelen) }
+  else if (ch < 0) { return Pos(pos.line, 0) }
+  else { return pos }
+}
+function clipPosArray(doc, array) {
+  var out = [];
+  for (var i = 0; i < array.length; i++) { out[i] = clipPos(doc, array[i]); }
+  return out
+}
+
+// Optimize some code when these features are not used.
+var sawReadOnlySpans = false;
+var sawCollapsedSpans = false;
+
+function seeReadOnlySpans() {
+  sawReadOnlySpans = true;
+}
+
+function seeCollapsedSpans() {
+  sawCollapsedSpans = true;
+}
+
+// TEXTMARKER SPANS
+
+function MarkedSpan(marker, from, to) {
+  this.marker = marker;
+  this.from = from; this.to = to;
+}
+
+// Search an array of spans for a span matching the given marker.
+function getMarkedSpanFor(spans, marker) {
+  if (spans) { for (var i = 0; i < spans.length; ++i) {
+    var span = spans[i];
+    if (span.marker == marker) { return span }
+  } }
+}
+// Remove a span from an array, returning undefined if no spans are
+// left (we don't store arrays for lines without spans).
+function removeMarkedSpan(spans, span) {
+  var r;
+  for (var i = 0; i < spans.length; ++i)
+    { if (spans[i] != span) { (r || (r = [])).push(spans[i]); } }
+  return r
+}
+// Add a span to a line.
+function addMarkedSpan(line, span) {
+  line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span];
+  span.marker.attachLine(line);
+}
+
+// Used for the algorithm that adjusts markers for a change in the
+// document. These functions cut an array of spans at a given
+// character position, returning an array of remaining chunks (or
+// undefined if nothing remains).
+function markedSpansBefore(old, startCh, isInsert) {
+  var nw;
+  if (old) { for (var i = 0; i < old.length; ++i) {
+    var span = old[i], marker = span.marker;
+    var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh);
+    if (startsBefore || span.from == startCh && marker.type == "bookmark" && (!isInsert || !span.marker.insertLeft)) {
+      var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh);(nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to));
+    }
+  } }
+  return nw
+}
+function markedSpansAfter(old, endCh, isInsert) {
+  var nw;
+  if (old) { for (var i = 0; i < old.length; ++i) {
+    var span = old[i], marker = span.marker;
+    var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh);
+    if (endsAfter || span.from == endCh && marker.type == "bookmark" && (!isInsert || span.marker.insertLeft)) {
+      var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh);(nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh,
+                                            span.to == null ? null : span.to - endCh));
+    }
+  } }
+  return nw
+}
+
+// Given a change object, compute the new set of marker spans that
+// cover the line in which the change took place. Removes spans
+// entirely within the change, reconnects spans belonging to the
+// same marker that appear on both sides of the change, and cuts off
+// spans partially within the change. Returns an array of span
+// arrays with one element for each line in (after) the change.
+function stretchSpansOverChange(doc, change) {
+  if (change.full) { return null }
+  var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans;
+  var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans;
+  if (!oldFirst && !oldLast) { return null }
+
+  var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0;
+  // Get the spans that 'stick out' on both sides
+  var first = markedSpansBefore(oldFirst, startCh, isInsert);
+  var last = markedSpansAfter(oldLast, endCh, isInsert);
+
+  // Next, merge those two ends
+  var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0);
+  if (first) {
+    // Fix up .to properties of first
+    for (var i = 0; i < first.length; ++i) {
+      var span = first[i];
+      if (span.to == null) {
+        var found = getMarkedSpanFor(last, span.marker);
+        if (!found) { span.to = startCh; }
+        else if (sameLine) { span.to = found.to == null ? null : found.to + offset; }
+      }
+    }
+  }
+  if (last) {
+    // Fix up .from in last (or move them into first in case of sameLine)
+    for (var i$1 = 0; i$1 < last.length; ++i$1) {
+      var span$1 = last[i$1];
+      if (span$1.to != null) { span$1.to += offset; }
+      if (span$1.from == null) {
+        var found$1 = getMarkedSpanFor(first, span$1.marker);
+        if (!found$1) {
+          span$1.from = offset;
+          if (sameLine) { (first || (first = [])).push(span$1); }
+        }
+      } else {
+        span$1.from += offset;
+        if (sameLine) { (first || (first = [])).push(span$1); }
+      }
+    }
+  }
+  // Make sure we didn't create any zero-length spans
+  if (first) { first = clearEmptySpans(first); }
+  if (last && last != first) { last = clearEmptySpans(last); }
+
+  var newMarkers = [first];
+  if (!sameLine) {
+    // Fill gap with whole-line-spans
+    var gap = change.text.length - 2, gapMarkers;
+    if (gap > 0 && first)
+      { for (var i$2 = 0; i$2 < first.length; ++i$2)
+        { if (first[i$2].to == null)
+          { (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i$2].marker, null, null)); } } }
+    for (var i$3 = 0; i$3 < gap; ++i$3)
+      { newMarkers.push(gapMarkers); }
+    newMarkers.push(last);
+  }
+  return newMarkers
+}
+
+// Remove spans that are empty and don't have a clearWhenEmpty
+// option of false.
+function clearEmptySpans(spans) {
+  for (var i = 0; i < spans.length; ++i) {
+    var span = spans[i];
+    if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false)
+      { spans.splice(i--, 1); }
+  }
+  if (!spans.length) { return null }
+  return spans
+}
+
+// Used to 'clip' out readOnly ranges when making a change.
+function removeReadOnlyRanges(doc, from, to) {
+  var markers = null;
+  doc.iter(from.line, to.line + 1, function (line) {
+    if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) {
+      var mark = line.markedSpans[i].marker;
+      if (mark.readOnly && (!markers || indexOf(markers, mark) == -1))
+        { (markers || (markers = [])).push(mark); }
+    } }
+  });
+  if (!markers) { return null }
+  var parts = [{from: from, to: to}];
+  for (var i = 0; i < markers.length; ++i) {
+    var mk = markers[i], m = mk.find(0);
+    for (var j = 0; j < parts.length; ++j) {
+      var p = parts[j];
+      if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) { continue }
+      var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to);
+      if (dfrom < 0 || !mk.inclusiveLeft && !dfrom)
+        { newParts.push({from: p.from, to: m.from}); }
+      if (dto > 0 || !mk.inclusiveRight && !dto)
+        { newParts.push({from: m.to, to: p.to}); }
+      parts.splice.apply(parts, newParts);
+      j += newParts.length - 3;
+    }
+  }
+  return parts
+}
+
+// Connect or disconnect spans from a line.
+function detachMarkedSpans(line) {
+  var spans = line.markedSpans;
+  if (!spans) { return }
+  for (var i = 0; i < spans.length; ++i)
+    { spans[i].marker.detachLine(line); }
+  line.markedSpans = null;
+}
+function attachMarkedSpans(line, spans) {
+  if (!spans) { return }
+  for (var i = 0; i < spans.length; ++i)
+    { spans[i].marker.attachLine(line); }
+  line.markedSpans = spans;
+}
+
+// Helpers used when computing which overlapping collapsed span
+// counts as the larger one.
+function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 }
+function extraRight(marker) { return marker.inclusiveRight ? 1 : 0 }
+
+// Returns a number indicating which of two overlapping collapsed
+// spans is larger (and thus includes the other). Falls back to
+// comparing ids when the spans cover exactly the same range.
+function compareCollapsedMarkers(a, b) {
+  var lenDiff = a.lines.length - b.lines.length;
+  if (lenDiff != 0) { return lenDiff }
+  var aPos = a.find(), bPos = b.find();
+  var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b);
+  if (fromCmp) { return -fromCmp }
+  var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b);
+  if (toCmp) { return toCmp }
+  return b.id - a.id
+}
+
+// Find out whether a line ends or starts in a collapsed span. If
+// so, return the marker for that span.
+function collapsedSpanAtSide(line, start) {
+  var sps = sawCollapsedSpans && line.markedSpans, found;
+  if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) {
+    sp = sps[i];
+    if (sp.marker.collapsed && (start ? sp.from : sp.to) == null &&
+        (!found || compareCollapsedMarkers(found, sp.marker) < 0))
+      { found = sp.marker; }
+  } }
+  return found
+}
+function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true) }
+function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false) }
+
+// Test whether there exists a collapsed span that partially
+// overlaps (covers the start or end, but not both) of a new span.
+// Such overlap is not allowed.
+function conflictingCollapsedRange(doc, lineNo$$1, from, to, marker) {
+  var line = getLine(doc, lineNo$$1);
+  var sps = sawCollapsedSpans && line.markedSpans;
+  if (sps) { for (var i = 0; i < sps.length; ++i) {
+    var sp = sps[i];
+    if (!sp.marker.collapsed) { continue }
+    var found = sp.marker.find(0);
+    var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker);
+    var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker);
+    if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) { continue }
+    if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) ||
+        fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0))
+      { return true }
+  } }
+}
+
+// A visual line is a line as drawn on the screen. Folding, for
+// example, can cause multiple logical lines to appear on the same
+// visual line. This finds the start of the visual line that the
+// given line is part of (usually that is the line itself).
+function visualLine(line) {
+  var merged;
+  while (merged = collapsedSpanAtStart(line))
+    { line = merged.find(-1, true).line; }
+  return line
+}
+
+function visualLineEnd(line) {
+  var merged;
+  while (merged = collapsedSpanAtEnd(line))
+    { line = merged.find(1, true).line; }
+  return line
+}
+
+// Returns an array of logical lines that continue the visual line
+// started by the argument, or undefined if there are no such lines.
+function visualLineContinued(line) {
+  var merged, lines;
+  while (merged = collapsedSpanAtEnd(line)) {
+    line = merged.find(1, true).line
+    ;(lines || (lines = [])).push(line);
+  }
+  return lines
+}
+
+// Get the line number of the start of the visual line that the
+// given line number is part of.
+function visualLineNo(doc, lineN) {
+  var line = getLine(doc, lineN), vis = visualLine(line);
+  if (line == vis) { return lineN }
+  return lineNo(vis)
+}
+
+// Get the line number of the start of the next visual line after
+// the given line.
+function visualLineEndNo(doc, lineN) {
+  if (lineN > doc.lastLine()) { return lineN }
+  var line = getLine(doc, lineN), merged;
+  if (!lineIsHidden(doc, line)) { return lineN }
+  while (merged = collapsedSpanAtEnd(line))
+    { line = merged.find(1, true).line; }
+  return lineNo(line) + 1
+}
+
+// Compute whether a line is hidden. Lines count as hidden when they
+// are part of a visual line that starts with another line, or when
+// they are entirely covered by collapsed, non-widget span.
+function lineIsHidden(doc, line) {
+  var sps = sawCollapsedSpans && line.markedSpans;
+  if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) {
+    sp = sps[i];
+    if (!sp.marker.collapsed) { continue }
+    if (sp.from == null) { return true }
+    if (sp.marker.widgetNode) { continue }
+    if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp))
+      { return true }
+  } }
+}
+function lineIsHiddenInner(doc, line, span) {
+  if (span.to == null) {
+    var end = span.marker.find(1, true);
+    return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker))
+  }
+  if (span.marker.inclusiveRight && span.to == line.text.length)
+    { return true }
+  for (var sp = (void 0), i = 0; i < line.markedSpans.length; ++i) {
+    sp = line.markedSpans[i];
+    if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to &&
+        (sp.to == null || sp.to != span.from) &&
+        (sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&
+        lineIsHiddenInner(doc, line, sp)) { return true }
+  }
+}
+
+// Find the height above the given line.
+function heightAtLine(lineObj) {
+  lineObj = visualLine(lineObj);
+
+  var h = 0, chunk = lineObj.parent;
+  for (var i = 0; i < chunk.lines.length; ++i) {
+    var line = chunk.lines[i];
+    if (line == lineObj) { break }
+    else { h += line.height; }
+  }
+  for (var p = chunk.parent; p; chunk = p, p = chunk.parent) {
+    for (var i$1 = 0; i$1 < p.children.length; ++i$1) {
+      var cur = p.children[i$1];
+      if (cur == chunk) { break }
+      else { h += cur.height; }
+    }
+  }
+  return h
+}
+
+// Compute the character length of a line, taking into account
+// collapsed ranges (see markText) that might hide parts, and join
+// other lines onto it.
+function lineLength(line) {
+  if (line.height == 0) { return 0 }
+  var len = line.text.length, merged, cur = line;
+  while (merged = collapsedSpanAtStart(cur)) {
+    var found = merged.find(0, true);
+    cur = found.from.line;
+    len += found.from.ch - found.to.ch;
+  }
+  cur = line;
+  while (merged = collapsedSpanAtEnd(cur)) {
+    var found$1 = merged.find(0, true);
+    len -= cur.text.length - found$1.from.ch;
+    cur = found$1.to.line;
+    len += cur.text.length - found$1.to.ch;
+  }
+  return len
+}
+
+// Find the longest line in the document.
+function findMaxLine(cm) {
+  var d = cm.display, doc = cm.doc;
+  d.maxLine = getLine(doc, doc.first);
+  d.maxLineLength = lineLength(d.maxLine);
+  d.maxLineChanged = true;
+  doc.iter(function (line) {
+    var len = lineLength(line);
+    if (len > d.maxLineLength) {
+      d.maxLineLength = len;
+      d.maxLine = line;
+    }
+  });
+}
+
+// BIDI HELPERS
+
+function iterateBidiSections(order, from, to, f) {
+  if (!order) { return f(from, to, "ltr") }
+  var found = false;
+  for (var i = 0; i < order.length; ++i) {
+    var part = order[i];
+    if (part.from < to && part.to > from || from == to && part.to == from) {
+      f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr");
+      found = true;
+    }
+  }
+  if (!found) { f(from, to, "ltr"); }
+}
+
+var bidiOther = null;
+function getBidiPartAt(order, ch, sticky) {
+  var found;
+  bidiOther = null;
+  for (var i = 0; i < order.length; ++i) {
+    var cur = order[i];
+    if (cur.from < ch && cur.to > ch) { return i }
+    if (cur.to == ch) {
+      if (cur.from != cur.to && sticky == "before") { found = i; }
+      else { bidiOther = i; }
+    }
+    if (cur.from == ch) {
+      if (cur.from != cur.to && sticky != "before") { found = i; }
+      else { bidiOther = i; }
+    }
+  }
+  return found != null ? found : bidiOther
+}
+
+// Bidirectional ordering algorithm
+// See http://unicode.org/reports/tr9/tr9-13.html for the algorithm
+// that this (partially) implements.
+
+// One-char codes used for character types:
+// L (L):   Left-to-Right
+// R (R):   Right-to-Left
+// r (AL):  Right-to-Left Arabic
+// 1 (EN):  European Number
+// + (ES):  European Number Separator
+// % (ET):  European Number Terminator
+// n (AN):  Arabic Number
+// , (CS):  Common Number Separator
+// m (NSM): Non-Spacing Mark
+// b (BN):  Boundary Neutral
+// s (B):   Paragraph Separator
+// t (S):   Segment Separator
+// w (WS):  Whitespace
+// N (ON):  Other Neutrals
+
+// Returns null if characters are ordered as they appear
+// (left-to-right), or an array of sections ({from, to, level}
+// objects) in the order in which they occur visually.
+var bidiOrdering = (function() {
+  // Character types for codepoints 0 to 0xff
+  var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN";
+  // Character types for codepoints 0x600 to 0x6f9
+  var arabicTypes = "nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111";
+  function charType(code) {
+    if (code <= 0xf7) { return lowTypes.charAt(code) }
+    else if (0x590 <= code && code <= 0x5f4) { return "R" }
+    else if (0x600 <= code && code <= 0x6f9) { return arabicTypes.charAt(code - 0x600) }
+    else if (0x6ee <= code && code <= 0x8ac) { return "r" }
+    else if (0x2000 <= code && code <= 0x200b) { return "w" }
+    else if (code == 0x200c) { return "b" }
+    else { return "L" }
+  }
+
+  var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/;
+  var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/;
+
+  function BidiSpan(level, from, to) {
+    this.level = level;
+    this.from = from; this.to = to;
+  }
+
+  return function(str, direction) {
+    var outerType = direction == "ltr" ? "L" : "R";
+
+    if (str.length == 0 || direction == "ltr" && !bidiRE.test(str)) { return false }
+    var len = str.length, types = [];
+    for (var i = 0; i < len; ++i)
+      { types.push(charType(str.charCodeAt(i))); }
+
+    // W1. Examine each non-spacing mark (NSM) in the level run, and
+    // change the type of the NSM to the type of the previous
+    // character. If the NSM is at the start of the level run, it will
+    // get the type of sor.
+    for (var i$1 = 0, prev = outerType; i$1 < len; ++i$1) {
+      var type = types[i$1];
+      if (type == "m") { types[i$1] = prev; }
+      else { prev = type; }
+    }
+
+    // W2. Search backwards from each instance of a European number
+    // until the first strong type (R, L, AL, or sor) is found. If an
+    // AL is found, change the type of the European number to Arabic
+    // number.
+    // W3. Change all ALs to R.
+    for (var i$2 = 0, cur = outerType; i$2 < len; ++i$2) {
+      var type$1 = types[i$2];
+      if (type$1 == "1" && cur == "r") { types[i$2] = "n"; }
+      else if (isStrong.test(type$1)) { cur = type$1; if (type$1 == "r") { types[i$2] = "R"; } }
+    }
+
+    // W4. A single European separator between two European numbers
+    // changes to a European number. A single common separator between
+    // two numbers of the same type changes to that type.
+    for (var i$3 = 1, prev$1 = types[0]; i$3 < len - 1; ++i$3) {
+      var type$2 = types[i$3];
+      if (type$2 == "+" && prev$1 == "1" && types[i$3+1] == "1") { types[i$3] = "1"; }
+      else if (type$2 == "," && prev$1 == types[i$3+1] &&
+               (prev$1 == "1" || prev$1 == "n")) { types[i$3] = prev$1; }
+      prev$1 = type$2;
+    }
+
+    // W5. A sequence of European terminators adjacent to European
+    // numbers changes to all European numbers.
+    // W6. Otherwise, separators and terminators change to Other
+    // Neutral.
+    for (var i$4 = 0; i$4 < len; ++i$4) {
+      var type$3 = types[i$4];
+      if (type$3 == ",") { types[i$4] = "N"; }
+      else if (type$3 == "%") {
+        var end = (void 0);
+        for (end = i$4 + 1; end < len && types[end] == "%"; ++end) {}
+        var replace = (i$4 && types[i$4-1] == "!") || (end < len && types[end] == "1") ? "1" : "N";
+        for (var j = i$4; j < end; ++j) { types[j] = replace; }
+        i$4 = end - 1;
+      }
+    }
+
+    // W7. Search backwards from each instance of a European number
+    // until the first strong type (R, L, or sor) is found. If an L is
+    // found, then change the type of the European number to L.
+    for (var i$5 = 0, cur$1 = outerType; i$5 < len; ++i$5) {
+      var type$4 = types[i$5];
+      if (cur$1 == "L" && type$4 == "1") { types[i$5] = "L"; }
+      else if (isStrong.test(type$4)) { cur$1 = type$4; }
+    }
+
+    // N1. A sequence of neutrals takes the direction of the
+    // surrounding strong text if the text on both sides has the same
+    // direction. European and Arabic numbers act as if they were R in
+    // terms of their influence on neutrals. Start-of-level-run (sor)
+    // and end-of-level-run (eor) are used at level run boundaries.
+    // N2. Any remaining neutrals take the embedding direction.
+    for (var i$6 = 0; i$6 < len; ++i$6) {
+      if (isNeutral.test(types[i$6])) {
+        var end$1 = (void 0);
+        for (end$1 = i$6 + 1; end$1 < len && isNeutral.test(types[end$1]); ++end$1) {}
+        var before = (i$6 ? types[i$6-1] : outerType) == "L";
+        var after = (end$1 < len ? types[end$1] : outerType) == "L";
+        var replace$1 = before == after ? (before ? "L" : "R") : outerType;
+        for (var j$1 = i$6; j$1 < end$1; ++j$1) { types[j$1] = replace$1; }
+        i$6 = end$1 - 1;
+      }
+    }
+
+    // Here we depart from the documented algorithm, in order to avoid
+    // building up an actual levels array. Since there are only three
+    // levels (0, 1, 2) in an implementation that doesn't take
+    // explicit embedding into account, we can build up the order on
+    // the fly, without following the level-based algorithm.
+    var order = [], m;
+    for (var i$7 = 0; i$7 < len;) {
+      if (countsAsLeft.test(types[i$7])) {
+        var start = i$7;
+        for (++i$7; i$7 < len && countsAsLeft.test(types[i$7]); ++i$7) {}
+        order.push(new BidiSpan(0, start, i$7));
+      } else {
+        var pos = i$7, at = order.length;
+        for (++i$7; i$7 < len && types[i$7] != "L"; ++i$7) {}
+        for (var j$2 = pos; j$2 < i$7;) {
+          if (countsAsNum.test(types[j$2])) {
+            if (pos < j$2) { order.splice(at, 0, new BidiSpan(1, pos, j$2)); }
+            var nstart = j$2;
+            for (++j$2; j$2 < i$7 && countsAsNum.test(types[j$2]); ++j$2) {}
+            order.splice(at, 0, new BidiSpan(2, nstart, j$2));
+            pos = j$2;
+          } else { ++j$2; }
+        }
+        if (pos < i$7) { order.splice(at, 0, new BidiSpan(1, pos, i$7)); }
+      }
+    }
+    if (order[0].level == 1 && (m = str.match(/^\s+/))) {
+      order[0].from = m[0].length;
+      order.unshift(new BidiSpan(0, 0, m[0].length));
+    }
+    if (lst(order).level == 1 && (m = str.match(/\s+$/))) {
+      lst(order).to -= m[0].length;
+      order.push(new BidiSpan(0, len - m[0].length, len));
+    }
+
+    return direction == "rtl" ? order.reverse() : order
+  }
+})();
+
+// Get the bidi ordering for the given line (and cache it). Returns
+// false for lines that are fully left-to-right, and an array of
+// BidiSpan objects otherwise.
+function getOrder(line, direction) {
+  var order = line.order;
+  if (order == null) { order = line.order = bidiOrdering(line.text, direction); }
+  return order
+}
+
+function moveCharLogically(line, ch, dir) {
+  var target = skipExtendingChars(line.text, ch + dir, dir);
+  return target < 0 || target > line.text.length ? null : target
+}
+
+function moveLogically(line, start, dir) {
+  var ch = moveCharLogically(line, start.ch, dir);
+  return ch == null ? null : new Pos(start.line, ch, dir < 0 ? "after" : "before")
+}
+
+function endOfLine(visually, cm, lineObj, lineNo, dir) {
+  if (visually) {
+    var order = getOrder(lineObj, cm.doc.direction);
+    if (order) {
+      var part = dir < 0 ? lst(order) : order[0];
+      var moveInStorageOrder = (dir < 0) == (part.level == 1);
+      var sticky = moveInStorageOrder ? "after" : "before";
+      var ch;
+      // With a wrapped rtl chunk (possibly spanning multiple bidi parts),
+      // it could be that the last bidi part is not on the last visual line,
+      // since visual lines contain content order-consecutive chunks.
+      // Thus, in rtl, we are looking for the first (content-order) character
+      // in the rtl chunk that is on the last line (that is, the same line
+      // as the last (content-order) character).
+      if (part.level > 0) {
+        var prep = prepareMeasureForLine(cm, lineObj);
+        ch = dir < 0 ? lineObj.text.length - 1 : 0;
+        var targetTop = measureCharPrepared(cm, prep, ch).top;
+        ch = findFirst(function (ch) { return measureCharPrepared(cm, prep, ch).top == targetTop; }, (dir < 0) == (part.level == 1) ? part.from : part.to - 1, ch);
+        if (sticky == "before") { ch = moveCharLogically(lineObj, ch, 1); }
+      } else { ch = dir < 0 ? part.to : part.from; }
+      return new Pos(lineNo, ch, sticky)
+    }
+  }
+  return new Pos(lineNo, dir < 0 ? lineObj.text.length : 0, dir < 0 ? "before" : "after")
+}
+
+function moveVisually(cm, line, start, dir) {
+  var bidi = getOrder(line, cm.doc.direction);
+  if (!bidi) { return moveLogically(line, start, dir) }
+  if (start.ch >= line.text.length) {
+    start.ch = line.text.length;
+    start.sticky = "before";
+  } else if (start.ch <= 0) {
+    start.ch = 0;
+    start.sticky = "after";
+  }
+  var partPos = getBidiPartAt(bidi, start.ch, start.sticky), part = bidi[partPos];
+  if (cm.doc.direction == "ltr" && part.level % 2 == 0 && (dir > 0 ? part.to > start.ch : part.from < start.ch)) {
+    // Case 1: We move within an ltr part in an ltr editor. Even with wrapped lines,
+    // nothing interesting happens.
+    return moveLogically(line, start, dir)
+  }
+
+  var mv = function (pos, dir) { return moveCharLogically(line, pos instanceof Pos ? pos.ch : pos, dir); };
+  var prep;
+  var getWrappedLineExtent = function (ch) {
+    if (!cm.options.lineWrapping) { return {begin: 0, end: line.text.length} }
+    prep = prep || prepareMeasureForLine(cm, line);
+    return wrappedLineExtentChar(cm, line, prep, ch)
+  };
+  var wrappedLineExtent = getWrappedLineExtent(start.sticky == "before" ? mv(start, -1) : start.ch);
+
+  if (cm.doc.direction == "rtl" || part.level == 1) {
+    var moveInStorageOrder = (part.level == 1) == (dir < 0);
+    var ch = mv(start, moveInStorageOrder ? 1 : -1);
+    if (ch != null && (!moveInStorageOrder ? ch >= part.from && ch >= wrappedLineExtent.begin : ch <= part.to && ch <= wrappedLineExtent.end)) {
+      // Case 2: We move within an rtl part or in an rtl editor on the same visual line
+      var sticky = moveInStorageOrder ? "before" : "after";
+      return new Pos(start.line, ch, sticky)
+    }
+  }
+
+  // Case 3: Could not move within this bidi part in this visual line, so leave
+  // the current bidi part
+
+  var searchInVisualLine = function (partPos, dir, wrappedLineExtent) {
+    var getRes = function (ch, moveInStorageOrder) { return moveInStorageOrder
+      ? new Pos(start.line, mv(ch, 1), "before")
+      : new Pos(start.line, ch, "after"); };
+
+    for (; partPos >= 0 && partPos < bidi.length; partPos += dir) {
+      var part = bidi[partPos];
+      var moveInStorageOrder = (dir > 0) == (part.level != 1);
+      var ch = moveInStorageOrder ? wrappedLineExtent.begin : mv(wrappedLineExtent.end, -1);
+      if (part.from <= ch && ch < part.to) { return getRes(ch, moveInStorageOrder) }
+      ch = moveInStorageOrder ? part.from : mv(part.to, -1);
+      if (wrappedLineExtent.begin <= ch && ch < wrappedLineExtent.end) { return getRes(ch, moveInStorageOrder) }
+    }
+  };
+
+  // Case 3a: Look for other bidi parts on the same visual line
+  var res = searchInVisualLine(partPos + dir, dir, wrappedLineExtent);
+  if (res) { return res }
+
+  // Case 3b: Look for other bidi parts on the next visual line
+  var nextCh = dir > 0 ? wrappedLineExtent.end : mv(wrappedLineExtent.begin, -1);
+  if (nextCh != null && !(dir > 0 && nextCh == line.text.length)) {
+    res = searchInVisualLine(dir > 0 ? 0 : bidi.length - 1, dir, getWrappedLineExtent(nextCh));
+    if (res) { return res }
+  }
+
+  // Case 4: Nowhere to move
+  return null
+}
+
+// EVENT HANDLING
+
+// Lightweight event framework. on/off also work on DOM nodes,
+// registering native DOM handlers.
+
+var noHandlers = [];
+
+var on = function(emitter, type, f) {
+  if (emitter.addEventListener) {
+    emitter.addEventListener(type, f, false);
+  } else if (emitter.attachEvent) {
+    emitter.attachEvent("on" + type, f);
+  } else {
+    var map$$1 = emitter._handlers || (emitter._handlers = {});
+    map$$1[type] = (map$$1[type] || noHandlers).concat(f);
+  }
+};
+
+function getHandlers(emitter, type) {
+  return emitter._handlers && emitter._handlers[type] || noHandlers
+}
+
+function off(emitter, type, f) {
+  if (emitter.removeEventListener) {
+    emitter.removeEventListener(type, f, false);
+  } else if (emitter.detachEvent) {
+    emitter.detachEvent("on" + type, f);
+  } else {
+    var map$$1 = emitter._handlers, arr = map$$1 && map$$1[type];
+    if (arr) {
+      var index = indexOf(arr, f);
+      if (index > -1)
+        { map$$1[type] = arr.slice(0, index).concat(arr.slice(index + 1)); }
+    }
+  }
+}
+
+function signal(emitter, type /*, values...*/) {
+  var handlers = getHandlers(emitter, type);
+  if (!handlers.length) { return }
+  var args = Array.prototype.slice.call(arguments, 2);
+  for (var i = 0; i < handlers.length; ++i) { handlers[i].apply(null, args); }
+}
+
+// The DOM events that CodeMirror handles can be overridden by
+// registering a (non-DOM) handler on the editor for the event name,
+// and preventDefault-ing the event in that handler.
+function signalDOMEvent(cm, e, override) {
+  if (typeof e == "string")
+    { e = {type: e, preventDefault: function() { this.defaultPrevented = true; }}; }
+  signal(cm, override || e.type, cm, e);
+  return e_defaultPrevented(e) || e.codemirrorIgnore
+}
+
+function signalCursorActivity(cm) {
+  var arr = cm._handlers && cm._handlers.cursorActivity;
+  if (!arr) { return }
+  var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []);
+  for (var i = 0; i < arr.length; ++i) { if (indexOf(set, arr[i]) == -1)
+    { set.push(arr[i]); } }
+}
+
+function hasHandler(emitter, type) {
+  return getHandlers(emitter, type).length > 0
+}
+
+// Add on and off methods to a constructor's prototype, to make
+// registering events on such objects more convenient.
+function eventMixin(ctor) {
+  ctor.prototype.on = function(type, f) {on(this, type, f);};
+  ctor.prototype.off = function(type, f) {off(this, type, f);};
+}
+
+// Due to the fact that we still support jurassic IE versions, some
+// compatibility wrappers are needed.
+
+function e_preventDefault(e) {
+  if (e.preventDefault) { e.preventDefault(); }
+  else { e.returnValue = false; }
+}
+function e_stopPropagation(e) {
+  if (e.stopPropagation) { e.stopPropagation(); }
+  else { e.cancelBubble = true; }
+}
+function e_defaultPrevented(e) {
+  return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false
+}
+function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);}
+
+function e_target(e) {return e.target || e.srcElement}
+function e_button(e) {
+  var b = e.which;
+  if (b == null) {
+    if (e.button & 1) { b = 1; }
+    else if (e.button & 2) { b = 3; }
+    else if (e.button & 4) { b = 2; }
+  }
+  if (mac && e.ctrlKey && b == 1) { b = 3; }
+  return b
+}
+
+// Detect drag-and-drop
+var dragAndDrop = function() {
+  // There is *some* kind of drag-and-drop support in IE6-8, but I
+  // couldn't get it to work yet.
+  if (ie && ie_version < 9) { return false }
+  var div = elt('div');
+  return "draggable" in div || "dragDrop" in div
+}();
+
+var zwspSupported;
+function zeroWidthElement(measure) {
+  if (zwspSupported == null) {
+    var test = elt("span", "\u200b");
+    removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")]));
+    if (measure.firstChild.offsetHeight != 0)
+      { zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8); }
+  }
+  var node = zwspSupported ? elt("span", "\u200b") :
+    elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px");
+  node.setAttribute("cm-text", "");
+  return node
+}
+
+// Feature-detect IE's crummy client rect reporting for bidi text
+var badBidiRects;
+function hasBadBidiRects(measure) {
+  if (badBidiRects != null) { return badBidiRects }
+  var txt = removeChildrenAndAdd(measure, document.createTextNode("A\u062eA"));
+  var r0 = range(txt, 0, 1).getBoundingClientRect();
+  var r1 = range(txt, 1, 2).getBoundingClientRect();
+  removeChildren(measure);
+  if (!r0 || r0.left == r0.right) { return false } // Safari returns null in some cases (#2780)
+  return badBidiRects = (r1.right - r0.right < 3)
+}
+
+// See if "".split is the broken IE version, if so, provide an
+// alternative way to split lines.
+var splitLinesAuto = "\n\nb".split(/\n/).length != 3 ? function (string) {
+  var pos = 0, result = [], l = string.length;
+  while (pos <= l) {
+    var nl = string.indexOf("\n", pos);
+    if (nl == -1) { nl = string.length; }
+    var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl);
+    var rt = line.indexOf("\r");
+    if (rt != -1) {
+      result.push(line.slice(0, rt));
+      pos += rt + 1;
+    } else {
+      result.push(line);
+      pos = nl + 1;
+    }
+  }
+  return result
+} : function (string) { return string.split(/\r\n?|\n/); };
+
+var hasSelection = window.getSelection ? function (te) {
+  try { return te.selectionStart != te.selectionEnd }
+  catch(e) { return false }
+} : function (te) {
+  var range$$1;
+  try {range$$1 = te.ownerDocument.selection.createRange();}
+  catch(e) {}
+  if (!range$$1 || range$$1.parentElement() != te) { return false }
+  return range$$1.compareEndPoints("StartToEnd", range$$1) != 0
+};
+
+var hasCopyEvent = (function () {
+  var e = elt("div");
+  if ("oncopy" in e) { return true }
+  e.setAttribute("oncopy", "return;");
+  return typeof e.oncopy == "function"
+})();
+
+var badZoomedRects = null;
+function hasBadZoomedRects(measure) {
+  if (badZoomedRects != null) { return badZoomedRects }
+  var node = removeChildrenAndAdd(measure, elt("span", "x"));
+  var normal = node.getBoundingClientRect();
+  var fromRange = range(node, 0, 1).getBoundingClientRect();
+  return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1
+}
+
+// Known modes, by name and by MIME
+var modes = {};
+var mimeModes = {};
+
+// Extra arguments are stored as the mode's dependencies, which is
+// used by (legacy) mechanisms like loadmode.js to automatically
+// load a mode. (Preferred mechanism is the require/define calls.)
+function defineMode(name, mode) {
+  if (arguments.length > 2)
+    { mode.dependencies = Array.prototype.slice.call(arguments, 2); }
+  modes[name] = mode;
+}
+
+function defineMIME(mime, spec) {
+  mimeModes[mime] = spec;
+}
+
+// Given a MIME type, a {name, ...options} config object, or a name
+// string, return a mode config object.
+function resolveMode(spec) {
+  if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) {
+    spec = mimeModes[spec];
+  } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) {
+    var found = mimeModes[spec.name];
+    if (typeof found == "string") { found = {name: found}; }
+    spec = createObj(found, spec);
+    spec.name = found.name;
+  } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) {
+    return resolveMode("application/xml")
+  } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+json$/.test(spec)) {
+    return resolveMode("application/json")
+  }
+  if (typeof spec == "string") { return {name: spec} }
+  else { return spec || {name: "null"} }
+}
+
+// Given a mode spec (anything that resolveMode accepts), find and
+// initialize an actual mode object.
+function getMode(options, spec) {
+  spec = resolveMode(spec);
+  var mfactory = modes[spec.name];
+  if (!mfactory) { return getMode(options, "text/plain") }
+  var modeObj = mfactory(options, spec);
+  if (modeExtensions.hasOwnProperty(spec.name)) {
+    var exts = modeExtensions[spec.name];
+    for (var prop in exts) {
+      if (!exts.hasOwnProperty(prop)) { continue }
+      if (modeObj.hasOwnProperty(prop)) { modeObj["_" + prop] = modeObj[prop]; }
+      modeObj[prop] = exts[prop];
+    }
+  }
+  modeObj.name = spec.name;
+  if (spec.helperType) { modeObj.helperType = spec.helperType; }
+  if (spec.modeProps) { for (var prop$1 in spec.modeProps)
+    { modeObj[prop$1] = spec.modeProps[prop$1]; } }
+
+  return modeObj
+}
+
+// This can be used to attach properties to mode objects from
+// outside the actual mode definition.
+var modeExtensions = {};
+function extendMode(mode, properties) {
+  var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});
+  copyObj(properties, exts);
+}
+
+function copyState(mode, state) {
+  if (state === true) { return state }
+  if (mode.copyState) { return mode.copyState(state) }
+  var nstate = {};
+  for (var n in state) {
+    var val = state[n];
+    if (val instanceof Array) { val = val.concat([]); }
+    nstate[n] = val;
+  }
+  return nstate
+}
+
+// Given a mode and a state (for that mode), find the inner mode and
+// state at the position that the state refers to.
+function innerMode(mode, state) {
+  var info;
+  while (mode.innerMode) {
+    info = mode.innerMode(state);
+    if (!info || info.mode == mode) { break }
+    state = info.state;
+    mode = info.mode;
+  }
+  return info || {mode: mode, state: state}
+}
+
+function startState(mode, a1, a2) {
+  return mode.startState ? mode.startState(a1, a2) : true
+}
+
+// STRING STREAM
+
+// Fed to the mode parsers, provides helper functions to make
+// parsers more succinct.
+
+var StringStream = function(string, tabSize, lineOracle) {
+  this.pos = this.start = 0;
+  this.string = string;
+  this.tabSize = tabSize || 8;
+  this.lastColumnPos = this.lastColumnValue = 0;
+  this.lineStart = 0;
+  this.lineOracle = lineOracle;
+};
+
+StringStream.prototype.eol = function () {return this.pos >= this.string.length};
+StringStream.prototype.sol = function () {return this.pos == this.lineStart};
+StringStream.prototype.peek = function () {return this.string.charAt(this.pos) || undefined};
+StringStream.prototype.next = function () {
+  if (this.pos < this.string.length)
+    { return this.string.charAt(this.pos++) }
+};
+StringStream.prototype.eat = function (match) {
+  var ch = this.string.charAt(this.pos);
+  var ok;
+  if (typeof match == "string") { ok = ch == match; }
+  else { ok = ch && (match.test ? match.test(ch) : match(ch)); }
+  if (ok) {++this.pos; return ch}
+};
+StringStream.prototype.eatWhile = function (match) {
+  var start = this.pos;
+  while (this.eat(match)){}
+  return this.pos > start
+};
+StringStream.prototype.eatSpace = function () {
+    var this$1 = this;
+
+  var start = this.pos;
+  while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) { ++this$1.pos; }
+  return this.pos > start
+};
+StringStream.prototype.skipToEnd = function () {this.pos = this.string.length;};
+StringStream.prototype.skipTo = function (ch) {
+  var found = this.string.indexOf(ch, this.pos);
+  if (found > -1) {this.pos = found; return true}
+};
+StringStream.prototype.backUp = function (n) {this.pos -= n;};
+StringStream.prototype.column = function () {
+  if (this.lastColumnPos < this.start) {
+    this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);
+    this.lastColumnPos = this.start;
+  }
+  return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)
+};
+StringStream.prototype.indentation = function () {
+  return countColumn(this.string, null, this.tabSize) -
+    (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)
+};
+StringStream.prototype.match = function (pattern, consume, caseInsensitive) {
+  if (typeof pattern == "string") {
+    var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; };
+    var substr = this.string.substr(this.pos, pattern.length);
+    if (cased(substr) == cased(pattern)) {
+      if (consume !== false) { this.pos += pattern.length; }
+      return true
+    }
+  } else {
+    var match = this.string.slice(this.pos).match(pattern);
+    if (match && match.index > 0) { return null }
+    if (match && consume !== false) { this.pos += match[0].length; }
+    return match
+  }
+};
+StringStream.prototype.current = function (){return this.string.slice(this.start, this.pos)};
+StringStream.prototype.hideFirstChars = function (n, inner) {
+  this.lineStart += n;
+  try { return inner() }
+  finally { this.lineStart -= n; }
+};
+StringStream.prototype.lookAhead = function (n) {
+  var oracle = this.lineOracle;
+  return oracle && oracle.lookAhead(n)
+};
+
+var SavedContext = function(state, lookAhead) {
+  this.state = state;
+  this.lookAhead = lookAhead;
+};
+
+var Context = function(doc, state, line, lookAhead) {
+  this.state = state;
+  this.doc = doc;
+  this.line = line;
+  this.maxLookAhead = lookAhead || 0;
+};
+
+Context.prototype.lookAhead = function (n) {
+  var line = this.doc.getLine(this.line + n);
+  if (line != null && n > this.maxLookAhead) { this.maxLookAhead = n; }
+  return line
+};
+
+Context.prototype.nextLine = function () {
+  this.line++;
+  if (this.maxLookAhead > 0) { this.maxLookAhead--; }
+};
+
+Context.fromSaved = function (doc, saved, line) {
+  if (saved instanceof SavedContext)
+    { return new Context(doc, copyState(doc.mode, saved.state), line, saved.lookAhead) }
+  else
+    { return new Context(doc, copyState(doc.mode, saved), line) }
+};
+
+Context.prototype.save = function (copy) {
+  var state = copy !== false ? copyState(this.doc.mode, this.state) : this.state;
+  return this.maxLookAhead > 0 ? new SavedContext(state, this.maxLookAhead) : state
+};
+
+
+// Compute a style array (an array starting with a mode generation
+// -- for invalidation -- followed by pairs of end positions and
+// style strings), which is used to highlight the tokens on the
+// line.
+function highlightLine(cm, line, context, forceToEnd) {
+  // A styles array always starts with a number identifying the
+  // mode/overlays that it is based on (for easy invalidation).
+  var st = [cm.state.modeGen], lineClasses = {};
+  // Compute the base array of styles
+  runMode(cm, line.text, cm.doc.mode, context, function (end, style) { return st.push(end, style); },
+          lineClasses, forceToEnd);
+  var state = context.state;
+
+  // Run overlays, adjust style array.
+  var loop = function ( o ) {
+    var overlay = cm.state.overlays[o], i = 1, at = 0;
+    context.state = true;
+    runMode(cm, line.text, overlay.mode, context, function (end, style) {
+      var start = i;
+      // Ensure there's a token end at the current position, and that i points at it
+      while (at < end) {
+        var i_end = st[i];
+        if (i_end > end)
+          { st.splice(i, 1, end, st[i+1], i_end); }
+        i += 2;
+        at = Math.min(end, i_end);
+      }
+      if (!style) { return }
+      if (overlay.opaque) {
+        st.splice(start, i - start, end, "overlay " + style);
+        i = start + 2;
+      } else {
+        for (; start < i; start += 2) {
+          var cur = st[start+1];
+          st[start+1] = (cur ? cur + " " : "") + "overlay " + style;
+        }
+      }
+    }, lineClasses);
+  };
+
+  for (var o = 0; o < cm.state.overlays.length; ++o) loop( o );
+  context.state = state;
+
+  return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null}
+}
+
+function getLineStyles(cm, line, updateFrontier) {
+  if (!line.styles || line.styles[0] != cm.state.modeGen) {
+    var context = getContextBefore(cm, lineNo(line));
+    var resetState = line.text.length > cm.options.maxHighlightLength && copyState(cm.doc.mode, context.state);
+    var result = highlightLine(cm, line, context);
+    if (resetState) { context.state = resetState; }
+    line.stateAfter = context.save(!resetState);
+    line.styles = result.styles;
+    if (result.classes) { line.styleClasses = result.classes; }
+    else if (line.styleClasses) { line.styleClasses = null; }
+    if (updateFrontier === cm.doc.highlightFrontier)
+      { cm.doc.modeFrontier = Math.max(cm.doc.modeFrontier, ++cm.doc.highlightFrontier); }
+  }
+  return line.styles
+}
+
+function getContextBefore(cm, n, precise) {
+  var doc = cm.doc, display = cm.display;
+  if (!doc.mode.startState) { return new Context(doc, true, n) }
+  var start = findStartLine(cm, n, precise);
+  var saved = start > doc.first && getLine(doc, start - 1).stateAfter;
+  var context = saved ? Context.fromSaved(doc, saved, start) : new Context(doc, startState(doc.mode), start);
+
+  doc.iter(start, n, function (line) {
+    processLine(cm, line.text, context);
+    var pos = context.line;
+    line.stateAfter = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo ? context.save() : null;
+    context.nextLine();
+  });
+  if (precise) { doc.modeFrontier = context.line; }
+  return context
+}
+
+// Lightweight form of highlight -- proceed over this line and
+// update state, but don't save a style array. Used for lines that
+// aren't currently visible.
+function processLine(cm, text, context, startAt) {
+  var mode = cm.doc.mode;
+  var stream = new StringStream(text, cm.options.tabSize, context);
+  stream.start = stream.pos = startAt || 0;
+  if (text == "") { callBlankLine(mode, context.state); }
+  while (!stream.eol()) {
+    readToken(mode, stream, context.state);
+    stream.start = stream.pos;
+  }
+}
+
+function callBlankLine(mode, state) {
+  if (mode.blankLine) { return mode.blankLine(state) }
+  if (!mode.innerMode) { return }
+  var inner = innerMode(mode, state);
+  if (inner.mode.blankLine) { return inner.mode.blankLine(inner.state) }
+}
+
+function readToken(mode, stream, state, inner) {
+  for (var i = 0; i < 10; i++) {
+    if (inner) { inner[0] = innerMode(mode, state).mode; }
+    var style = mode.token(stream, state);
+    if (stream.pos > stream.start) { return style }
+  }
+  throw new Error("Mode " + mode.name + " failed to advance stream.")
+}
+
+var Token = function(stream, type, state) {
+  this.start = stream.start; this.end = stream.pos;
+  this.string = stream.current();
+  this.type = type || null;
+  this.state = state;
+};
+
+// Utility for getTokenAt and getLineTokens
+function takeToken(cm, pos, precise, asArray) {
+  var doc = cm.doc, mode = doc.mode, style;
+  pos = clipPos(doc, pos);
+  var line = getLine(doc, pos.line), context = getContextBefore(cm, pos.line, precise);
+  var stream = new StringStream(line.text, cm.options.tabSize, context), tokens;
+  if (asArray) { tokens = []; }
+  while ((asArray || stream.pos < pos.ch) && !stream.eol()) {
+    stream.start = stream.pos;
+    style = readToken(mode, stream, context.state);
+    if (asArray) { tokens.push(new Token(stream, style, copyState(doc.mode, context.state))); }
+  }
+  return asArray ? tokens : new Token(stream, style, context.state)
+}
+
+function extractLineClasses(type, output) {
+  if (type) { for (;;) {
+    var lineClass = type.match(/(?:^|\s+)line-(background-)?(\S+)/);
+    if (!lineClass) { break }
+    type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length);
+    var prop = lineClass[1] ? "bgClass" : "textClass";
+    if (output[prop] == null)
+      { output[prop] = lineClass[2]; }
+    else if (!(new RegExp("(?:^|\s)" + lineClass[2] + "(?:$|\s)")).test(output[prop]))
+      { output[prop] += " " + lineClass[2]; }
+  } }
+  return type
+}
+
+// Run the given mode's parser over a line, calling f for each token.
+function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) {
+  var flattenSpans = mode.flattenSpans;
+  if (flattenSpans == null) { flattenSpans = cm.options.flattenSpans; }
+  var curStart = 0, curStyle = null;
+  var stream = new StringStream(text, cm.options.tabSize, context), style;
+  var inner = cm.options.addModeClass && [null];
+  if (text == "") { extractLineClasses(callBlankLine(mode, context.state), lineClasses); }
+  while (!stream.eol()) {
+    if (stream.pos > cm.options.maxHighlightLength) {
+      flattenSpans = false;
+      if (forceToEnd) { processLine(cm, text, context, stream.pos); }
+      stream.pos = text.length;
+      style = null;
+    } else {
+      style = extractLineClasses(readToken(mode, stream, context.state, inner), lineClasses);
+    }
+    if (inner) {
+      var mName = inner[0].name;
+      if (mName) { style = "m-" + (style ? mName + " " + style : mName); }
+    }
+    if (!flattenSpans || curStyle != style) {
+      while (curStart < stream.start) {
+        curStart = Math.min(stream.start, curStart + 5000);
+        f(curStart, curStyle);
+      }
+      curStyle = style;
+    }
+    stream.start = stream.pos;
+  }
+  while (curStart < stream.pos) {
+    // Webkit seems to refuse to render text nodes longer than 57444
+    // characters, and returns inaccurate measurements in nodes
+    // starting around 5000 chars.
+    var pos = Math.min(stream.pos, curStart + 5000);
+    f(pos, curStyle);
+    curStart = pos;
+  }
+}
+
+// Finds the line to start with when starting a parse. Tries to
+// find a line with a stateAfter, so that it can start with a
+// valid state. If that fails, it returns the line with the
+// smallest indentation, which tends to need the least context to
+// parse correctly.
+function findStartLine(cm, n, precise) {
+  var minindent, minline, doc = cm.doc;
+  var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100);
+  for (var search = n; search > lim; --search) {
+    if (search <= doc.first) { return doc.first }
+    var line = getLine(doc, search - 1), after = line.stateAfter;
+    if (after && (!precise || search + (after instanceof SavedContext ? after.lookAhead : 0) <= doc.modeFrontier))
+      { return search }
+    var indented = countColumn(line.text, null, cm.options.tabSize);
+    if (minline == null || minindent > indented) {
+      minline = search - 1;
+      minindent = indented;
+    }
+  }
+  return minline
+}
+
+function retreatFrontier(doc, n) {
+  doc.modeFrontier = Math.min(doc.modeFrontier, n);
+  if (doc.highlightFrontier < n - 10) { return }
+  var start = doc.first;
+  for (var line = n - 1; line > start; line--) {
+    var saved = getLine(doc, line).stateAfter;
+    // change is on 3
+    // state on line 1 looked ahead 2 -- so saw 3
+    // test 1 + 2 < 3 should cover this
+    if (saved && (!(saved instanceof SavedContext) || line + saved.lookAhead < n)) {
+      start = line + 1;
+      break
+    }
+  }
+  doc.highlightFrontier = Math.min(doc.highlightFrontier, start);
+}
+
+// LINE DATA STRUCTURE
+
+// Line objects. These hold state related to a line, including
+// highlighting info (the styles array).
+var Line = function(text, markedSpans, estimateHeight) {
+  this.text = text;
+  attachMarkedSpans(this, markedSpans);
+  this.height = estimateHeight ? estimateHeight(this) : 1;
+};
+
+Line.prototype.lineNo = function () { return lineNo(this) };
+eventMixin(Line);
+
+// Change the content (text, markers) of a line. Automatically
+// invalidates cached information and tries to re-estimate the
+// line's height.
+function updateLine(line, text, markedSpans, estimateHeight) {
+  line.text = text;
+  if (line.stateAfter) { line.stateAfter = null; }
+  if (line.styles) { line.styles = null; }
+  if (line.order != null) { line.order = null; }
+  detachMarkedSpans(line);
+  attachMarkedSpans(line, markedSpans);
+  var estHeight = estimateHeight ? estimateHeight(line) : 1;
+  if (estHeight != line.height) { updateLineHeight(line, estHeight); }
+}
+
+// Detach a line from the document tree and its markers.
+function cleanUpLine(line) {
+  line.parent = null;
+  detachMarkedSpans(line);
+}
+
+// Convert a style as returned by a mode (either null, or a string
+// containing one or more styles) to a CSS style. This is cached,
+// and also looks for line-wide styles.
+var styleToClassCache = {};
+var styleToClassCacheWithMode = {};
+function interpretTokenStyle(style, options) {
+  if (!style || /^\s*$/.test(style)) { return null }
+  var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache;
+  return cache[style] ||
+    (cache[style] = style.replace(/\S+/g, "cm-$&"))
+}
+
+// Render the DOM representation of the text of a line. Also builds
+// up a 'line map', which points at the DOM nodes that represent
+// specific stretches of text, and is used by the measuring code.
+// The returned object contains the DOM node, this map, and
+// information about line-wide styles that were set by the mode.
+function buildLineContent(cm, lineView) {
+  // The padding-right forces the element to have a 'border', which
+  // is needed on Webkit to be able to get line-level bounding
+  // rectangles for it (in measureChar).
+  var content = eltP("span", null, null, webkit ? "padding-right: .1px" : null);
+  var builder = {pre: eltP("pre", [content], "CodeMirror-line"), content: content,
+                 col: 0, pos: 0, cm: cm,
+                 trailingSpace: false,
+                 splitSpaces: (ie || webkit) && cm.getOption("lineWrapping")};
+  lineView.measure = {};
+
+  // Iterate over the logical lines that make up this visual line.
+  for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) {
+    var line = i ? lineView.rest[i - 1] : lineView.line, order = (void 0);
+    builder.pos = 0;
+    builder.addToken = buildToken;
+    // Optionally wire in some hacks into the token-rendering
+    // algorithm, to deal with browser quirks.
+    if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line, cm.doc.direction)))
+      { builder.addToken = buildTokenBadBidi(builder.addToken, order); }
+    builder.map = [];
+    var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line);
+    insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate));
+    if (line.styleClasses) {
+      if (line.styleClasses.bgClass)
+        { builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || ""); }
+      if (line.styleClasses.textClass)
+        { builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || ""); }
+    }
+
+    // Ensure at least a single node is present, for measuring.
+    if (builder.map.length == 0)
+      { builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure))); }
+
+    // Store the map and a cache object for the current logical line
+    if (i == 0) {
+      lineView.measure.map = builder.map;
+      lineView.measure.cache = {};
+    } else {
+      (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map)
+      ;(lineView.measure.caches || (lineView.measure.caches = [])).push({});
+    }
+  }
+
+  // See issue #2901
+  if (webkit) {
+    var last = builder.content.lastChild;
+    if (/\bcm-tab\b/.test(last.className) || (last.querySelector && last.querySelector(".cm-tab")))
+      { builder.content.className = "cm-tab-wrap-hack"; }
+  }
+
+  signal(cm, "renderLine", cm, lineView.line, builder.pre);
+  if (builder.pre.className)
+    { builder.textClass = joinClasses(builder.pre.className, builder.textClass || ""); }
+
+  return builder
+}
+
+function defaultSpecialCharPlaceholder(ch) {
+  var token = elt("span", "\u2022", "cm-invalidchar");
+  token.title = "\\u" + ch.charCodeAt(0).toString(16);
+  token.setAttribute("aria-label", token.title);
+  return token
+}
+
+// Build up the DOM representation for a single token, and add it to
+// the line map. Takes care to render special characters separately.
+function buildToken(builder, text, style, startStyle, endStyle, title, css) {
+  if (!text) { return }
+  var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text;
+  var special = builder.cm.state.specialChars, mustWrap = false;
+  var content;
+  if (!special.test(text)) {
+    builder.col += text.length;
+    content = document.createTextNode(displayText);
+    builder.map.push(builder.pos, builder.pos + text.length, content);
+    if (ie && ie_version < 9) { mustWrap = true; }
+    builder.pos += text.length;
+  } else {
+    content = document.createDocumentFragment();
+    var pos = 0;
+    while (true) {
+      special.lastIndex = pos;
+      var m = special.exec(text);
+      var skipped = m ? m.index - pos : text.length - pos;
+      if (skipped) {
+        var txt = document.createTextNode(displayText.slice(pos, pos + skipped));
+        if (ie && ie_version < 9) { content.appendChild(elt("span", [txt])); }
+        else { content.appendChild(txt); }
+        builder.map.push(builder.pos, builder.pos + skipped, txt);
+        builder.col += skipped;
+        builder.pos += skipped;
+      }
+      if (!m) { break }
+      pos += skipped + 1;
+      var txt$1 = (void 0);
+      if (m[0] == "\t") {
+        var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize;
+        txt$1 = content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab"));
+        txt$1.setAttribute("role", "presentation");
+        txt$1.setAttribute("cm-text", "\t");
+        builder.col += tabWidth;
+      } else if (m[0] == "\r" || m[0] == "\n") {
+        txt$1 = content.appendChild(elt("span", m[0] == "\r" ? "\u240d" : "\u2424", "cm-invalidchar"));
+        txt$1.setAttribute("cm-text", m[0]);
+        builder.col += 1;
+      } else {
+        txt$1 = builder.cm.options.specialCharPlaceholder(m[0]);
+        txt$1.setAttribute("cm-text", m[0]);
+        if (ie && ie_version < 9) { content.appendChild(elt("span", [txt$1])); }
+        else { content.appendChild(txt$1); }
+        builder.col += 1;
+      }
+      builder.map.push(builder.pos, builder.pos + 1, txt$1);
+      builder.pos++;
+    }
+  }
+  builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32;
+  if (style || startStyle || endStyle || mustWrap || css) {
+    var fullStyle = style || "";
+    if (startStyle) { fullStyle += startStyle; }
+    if (endStyle) { fullStyle += endStyle; }
+    var token = elt("span", [content], fullStyle, css);
+    if (title) { token.title = title; }
+    return builder.content.appendChild(token)
+  }
+  builder.content.appendChild(content);
+}
+
+function splitSpaces(text, trailingBefore) {
+  if (text.length > 1 && !/  /.test(text)) { return text }
+  var spaceBefore = trailingBefore, result = "";
+  for (var i = 0; i < text.length; i++) {
+    var ch = text.charAt(i);
+    if (ch == " " && spaceBefore && (i == text.length - 1 || text.charCodeAt(i + 1) == 32))
+      { ch = "\u00a0"; }
+    result += ch;
+    spaceBefore = ch == " ";
+  }
+  return result
+}
+
+// Work around nonsense dimensions being reported for stretches of
+// right-to-left text.
+function buildTokenBadBidi(inner, order) {
+  return function (builder, text, style, startStyle, endStyle, title, css) {
+    style = style ? style + " cm-force-border" : "cm-force-border";
+    var start = builder.pos, end = start + text.length;
+    for (;;) {
+      // Find the part that overlaps with the start of this text
+      var part = (void 0);
+      for (var i = 0; i < order.length; i++) {
+        part = order[i];
+        if (part.to > start && part.from <= start) { break }
+      }
+      if (part.to >= end) { return inner(builder, text, style, startStyle, endStyle, title, css) }
+      inner(builder, text.slice(0, part.to - start), style, startStyle, null, title, css);
+      startStyle = null;
+      text = text.slice(part.to - start);
+      start = part.to;
+    }
+  }
+}
+
+function buildCollapsedSpan(builder, size, marker, ignoreWidget) {
+  var widget = !ignoreWidget && marker.widgetNode;
+  if (widget) { builder.map.push(builder.pos, builder.pos + size, widget); }
+  if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) {
+    if (!widget)
+      { widget = builder.content.appendChild(document.createElement("span")); }
+    widget.setAttribute("cm-marker", marker.id);
+  }
+  if (widget) {
+    builder.cm.display.input.setUneditable(widget);
+    builder.content.appendChild(widget);
+  }
+  builder.pos += size;
+  builder.trailingSpace = false;
+}
+
+// Outputs a number of spans to make up a line, taking highlighting
+// and marked text into account.
+function insertLineContent(line, builder, styles) {
+  var spans = line.markedSpans, allText = line.text, at = 0;
+  if (!spans) {
+    for (var i$1 = 1; i$1 < styles.length; i$1+=2)
+      { builder.addToken(builder, allText.slice(at, at = styles[i$1]), interpretTokenStyle(styles[i$1+1], builder.cm.options)); }
+    return
+  }
+
+  var len = allText.length, pos = 0, i = 1, text = "", style, css;
+  var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, title, collapsed;
+  for (;;) {
+    if (nextChange == pos) { // Update current marker set
+      spanStyle = spanEndStyle = spanStartStyle = title = css = "";
+      collapsed = null; nextChange = Infinity;
+      var foundBookmarks = [], endStyles = (void 0);
+      for (var j = 0; j < spans.length; ++j) {
+        var sp = spans[j], m = sp.marker;
+        if (m.type == "bookmark" && sp.from == pos && m.widgetNode) {
+          foundBookmarks.push(m);
+        } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) {
+          if (sp.to != null && sp.to != pos && nextChange > sp.to) {
+            nextChange = sp.to;
+            spanEndStyle = "";
+          }
+          if (m.className) { spanStyle += " " + m.className; }
+          if (m.css) { css = (css ? css + ";" : "") + m.css; }
+          if (m.startStyle && sp.from == pos) { spanStartStyle += " " + m.startStyle; }
+          if (m.endStyle && sp.to == nextChange) { (endStyles || (endStyles = [])).push(m.endStyle, sp.to); }
+          if (m.title && !title) { title = m.title; }
+          if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0))
+            { collapsed = sp; }
+        } else if (sp.from > pos && nextChange > sp.from) {
+          nextChange = sp.from;
+        }
+      }
+      if (endStyles) { for (var j$1 = 0; j$1 < endStyles.length; j$1 += 2)
+        { if (endStyles[j$1 + 1] == nextChange) { spanEndStyle += " " + endStyles[j$1]; } } }
+
+      if (!collapsed || collapsed.from == pos) { for (var j$2 = 0; j$2 < foundBookmarks.length; ++j$2)
+        { buildCollapsedSpan(builder, 0, foundBookmarks[j$2]); } }
+      if (collapsed && (collapsed.from || 0) == pos) {
+        buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos,
+                           collapsed.marker, collapsed.from == null);
+        if (collapsed.to == null) { return }
+        if (collapsed.to == pos) { collapsed = false; }
+      }
+    }
+    if (pos >= len) { break }
+
+    var upto = Math.min(len, nextChange);
+    while (true) {
+      if (text) {
+        var end = pos + text.length;
+        if (!collapsed) {
+          var tokenText = end > upto ? text.slice(0, upto - pos) : text;
+          builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle,
+                           spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", title, css);
+        }
+        if (end >= upto) {text = text.slice(upto - pos); pos = upto; break}
+        pos = end;
+        spanStartStyle = "";
+      }
+      text = allText.slice(at, at = styles[i++]);
+      style = interpretTokenStyle(styles[i++], builder.cm.options);
+    }
+  }
+}
+
+
+// These objects are used to represent the visible (currently drawn)
+// part of the document. A LineView may correspond to multiple
+// logical lines, if those are connected by collapsed ranges.
+function LineView(doc, line, lineN) {
+  // The starting line
+  this.line = line;
+  // Continuing lines, if any
+  this.rest = visualLineContinued(line);
+  // Number of logical lines in this visual line
+  this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1;
+  this.node = this.text = null;
+  this.hidden = lineIsHidden(doc, line);
+}
+
+// Create a range of LineView objects for the given lines.
+function buildViewArray(cm, from, to) {
+  var array = [], nextPos;
+  for (var pos = from; pos < to; pos = nextPos) {
+    var view = new LineView(cm.doc, getLine(cm.doc, pos), pos);
+    nextPos = pos + view.size;
+    array.push(view);
+  }
+  return array
+}
+
+var operationGroup = null;
+
+function pushOperation(op) {
+  if (operationGroup) {
+    operationGroup.ops.push(op);
+  } else {
+    op.ownsGroup = operationGroup = {
+      ops: [op],
+      delayedCallbacks: []
+    };
+  }
+}
+
+function fireCallbacksForOps(group) {
+  // Calls delayed callbacks and cursorActivity handlers until no
+  // new ones appear
+  var callbacks = group.delayedCallbacks, i = 0;
+  do {
+    for (; i < callbacks.length; i++)
+      { callbacks[i].call(null); }
+    for (var j = 0; j < group.ops.length; j++) {
+      var op = group.ops[j];
+      if (op.cursorActivityHandlers)
+        { while (op.cursorActivityCalled < op.cursorActivityHandlers.length)
+          { op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm); } }
+    }
+  } while (i < callbacks.length)
+}
+
+function finishOperation(op, endCb) {
+  var group = op.ownsGroup;
+  if (!group) { return }
+
+  try { fireCallbacksForOps(group); }
+  finally {
+    operationGroup = null;
+    endCb(group);
+  }
+}
+
+var orphanDelayedCallbacks = null;
+
+// Often, we want to signal events at a point where we are in the
+// middle of some work, but don't want the handler to start calling
+// other methods on the editor, which might be in an inconsistent
+// state or simply not expect any other events to happen.
+// signalLater looks whether there are any handlers, and schedules
+// them to be executed when the last operation ends, or, if no
+// operation is active, when a timeout fires.
+function signalLater(emitter, type /*, values...*/) {
+  var arr = getHandlers(emitter, type);
+  if (!arr.length) { return }
+  var args = Array.prototype.slice.call(arguments, 2), list;
+  if (operationGroup) {
+    list = operationGroup.delayedCallbacks;
+  } else if (orphanDelayedCallbacks) {
+    list = orphanDelayedCallbacks;
+  } else {
+    list = orphanDelayedCallbacks = [];
+    setTimeout(fireOrphanDelayed, 0);
+  }
+  var loop = function ( i ) {
+    list.push(function () { return arr[i].apply(null, args); });
+  };
+
+  for (var i = 0; i < arr.length; ++i)
+    loop( i );
+}
+
+function fireOrphanDelayed() {
+  var delayed = orphanDelayedCallbacks;
+  orphanDelayedCallbacks = null;
+  for (var i = 0; i < delayed.length; ++i) { delayed[i](); }
+}
+
+// When an aspect of a line changes, a string is added to
+// lineView.changes. This updates the relevant part of the line's
+// DOM structure.
+function updateLineForChanges(cm, lineView, lineN, dims) {
+  for (var j = 0; j < lineView.changes.length; j++) {
+    var type = lineView.changes[j];
+    if (type == "text") { updateLineText(cm, lineView); }
+    else if (type == "gutter") { updateLineGutter(cm, lineView, lineN, dims); }
+    else if (type == "class") { updateLineClasses(cm, lineView); }
+    else if (type == "widget") { updateLineWidgets(cm, lineView, dims); }
+  }
+  lineView.changes = null;
+}
+
+// Lines with gutter elements, widgets or a background class need to
+// be wrapped, and have the extra elements added to the wrapper div
+function ensureLineWrapped(lineView) {
+  if (lineView.node == lineView.text) {
+    lineView.node = elt("div", null, null, "position: relative");
+    if (lineView.text.parentNode)
+      { lineView.text.parentNode.replaceChild(lineView.node, lineView.text); }
+    lineView.node.appendChild(lineView.text);
+    if (ie && ie_version < 8) { lineView.node.style.zIndex = 2; }
+  }
+  return lineView.node
+}
+
+function updateLineBackground(cm, lineView) {
+  var cls = lineView.bgClass ? lineView.bgClass + " " + (lineView.line.bgClass || "") : lineView.line.bgClass;
+  if (cls) { cls += " CodeMirror-linebackground"; }
+  if (lineView.background) {
+    if (cls) { lineView.background.className = cls; }
+    else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; }
+  } else if (cls) {
+    var wrap = ensureLineWrapped(lineView);
+    lineView.background = wrap.insertBefore(elt("div", null, cls), wrap.firstChild);
+    cm.display.input.setUneditable(lineView.background);
+  }
+}
+
+// Wrapper around buildLineContent which will reuse the structure
+// in display.externalMeasured when possible.
+function getLineContent(cm, lineView) {
+  var ext = cm.display.externalMeasured;
+  if (ext && ext.line == lineView.line) {
+    cm.display.externalMeasured = null;
+    lineView.measure = ext.measure;
+    return ext.built
+  }
+  return buildLineContent(cm, lineView)
+}
+
+// Redraw the line's text. Interacts with the background and text
+// classes because the mode may output tokens that influence these
+// classes.
+function updateLineText(cm, lineView) {
+  var cls = lineView.text.className;
+  var built = getLineContent(cm, lineView);
+  if (lineView.text == lineView.node) { lineView.node = built.pre; }
+  lineView.text.parentNode.replaceChild(built.pre, lineView.text);
+  lineView.text = built.pre;
+  if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) {
+    lineView.bgClass = built.bgClass;
+    lineView.textClass = built.textClass;
+    updateLineClasses(cm, lineView);
+  } else if (cls) {
+    lineView.text.className = cls;
+  }
+}
+
+function updateLineClasses(cm, lineView) {
+  updateLineBackground(cm, lineView);
+  if (lineView.line.wrapClass)
+    { ensureLineWrapped(lineView).className = lineView.line.wrapClass; }
+  else if (lineView.node != lineView.text)
+    { lineView.node.className = ""; }
+  var textClass = lineView.textClass ? lineView.textClass + " " + (lineView.line.textClass || "") : lineView.line.textClass;
+  lineView.text.className = textClass || "";
+}
+
+function updateLineGutter(cm, lineView, lineN, dims) {
+  if (lineView.gutter) {
+    lineView.node.removeChild(lineView.gutter);
+    lineView.gutter = null;
+  }
+  if (lineView.gutterBackground) {
+    lineView.node.removeChild(lineView.gutterBackground);
+    lineView.gutterBackground = null;
+  }
+  if (lineView.line.gutterClass) {
+    var wrap = ensureLineWrapped(lineView);
+    lineView.gutterBackground = elt("div", null, "CodeMirror-gutter-background " + lineView.line.gutterClass,
+                                    ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px; width: " + (dims.gutterTotalWidth) + "px"));
+    cm.display.input.setUneditable(lineView.gutterBackground);
+    wrap.insertBefore(lineView.gutterBackground, lineView.text);
+  }
+  var markers = lineView.line.gutterMarkers;
+  if (cm.options.lineNumbers || markers) {
+    var wrap$1 = ensureLineWrapped(lineView);
+    var gutterWrap = lineView.gutter = elt("div", null, "CodeMirror-gutter-wrapper", ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px"));
+    cm.display.input.setUneditable(gutterWrap);
+    wrap$1.insertBefore(gutterWrap, lineView.text);
+    if (lineView.line.gutterClass)
+      { gutterWrap.className += " " + lineView.line.gutterClass; }
+    if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"]))
+      { lineView.lineNumber = gutterWrap.appendChild(
+        elt("div", lineNumberFor(cm.options, lineN),
+            "CodeMirror-linenumber CodeMirror-gutter-elt",
+            ("left: " + (dims.gutterLeft["CodeMirror-linenumbers"]) + "px; width: " + (cm.display.lineNumInnerWidth) + "px"))); }
+    if (markers) { for (var k = 0; k < cm.options.gutters.length; ++k) {
+      var id = cm.options.gutters[k], found = markers.hasOwnProperty(id) && markers[id];
+      if (found)
+        { gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt",
+                                   ("left: " + (dims.gutterLeft[id]) + "px; width: " + (dims.gutterWidth[id]) + "px"))); }
+    } }
+  }
+}
+
+function updateLineWidgets(cm, lineView, dims) {
+  if (lineView.alignable) { lineView.alignable = null; }
+  for (var node = lineView.node.firstChild, next = (void 0); node; node = next) {
+    next = node.nextSibling;
+    if (node.className == "CodeMirror-linewidget")
+      { lineView.node.removeChild(node); }
+  }
+  insertLineWidgets(cm, lineView, dims);
+}
+
+// Build a line's DOM representation from scratch
+function buildLineElement(cm, lineView, lineN, dims) {
+  var built = getLineContent(cm, lineView);
+  lineView.text = lineView.node = built.pre;
+  if (built.bgClass) { lineView.bgClass = built.bgClass; }
+  if (built.textClass) { lineView.textClass = built.textClass; }
+
+  updateLineClasses(cm, lineView);
+  updateLineGutter(cm, lineView, lineN, dims);
+  insertLineWidgets(cm, lineView, dims);
+  return lineView.node
+}
+
+// A lineView may contain multiple logical lines (when merged by
+// collapsed spans). The widgets for all of them need to be drawn.
+function insertLineWidgets(cm, lineView, dims) {
+  insertLineWidgetsFor(cm, lineView.line, lineView, dims, true);
+  if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++)
+    { insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false); } }
+}
+
+function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) {
+  if (!line.widgets) { return }
+  var wrap = ensureLineWrapped(lineView);
+  for (var i = 0, ws = line.widgets; i < ws.length; ++i) {
+    var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget");
+    if (!widget.handleMouseEvents) { node.setAttribute("cm-ignore-events", "true"); }
+    positionLineWidget(widget, node, lineView, dims);
+    cm.display.input.setUneditable(node);
+    if (allowAbove && widget.above)
+      { wrap.insertBefore(node, lineView.gutter || lineView.text); }
+    else
+      { wrap.appendChild(node); }
+    signalLater(widget, "redraw");
+  }
+}
+
+function positionLineWidget(widget, node, lineView, dims) {
+  if (widget.noHScroll) {
+    (lineView.alignable || (lineView.alignable = [])).push(node);
+    var width = dims.wrapperWidth;
+    node.style.left = dims.fixedPos + "px";
+    if (!widget.coverGutter) {
+      width -= dims.gutterTotalWidth;
+      node.style.paddingLeft = dims.gutterTotalWidth + "px";
+    }
+    node.style.width = width + "px";
+  }
+  if (widget.coverGutter) {
+    node.style.zIndex = 5;
+    node.style.position = "relative";
+    if (!widget.noHScroll) { node.style.marginLeft = -dims.gutterTotalWidth + "px"; }
+  }
+}
+
+function widgetHeight(widget) {
+  if (widget.height != null) { return widget.height }
+  var cm = widget.doc.cm;
+  if (!cm) { return 0 }
+  if (!contains(document.body, widget.node)) {
+    var parentStyle = "position: relative;";
+    if (widget.coverGutter)
+      { parentStyle += "margin-left: -" + cm.display.gutters.offsetWidth + "px;"; }
+    if (widget.noHScroll)
+      { parentStyle += "width: " + cm.display.wrapper.clientWidth + "px;"; }
+    removeChildrenAndAdd(cm.display.measure, elt("div", [widget.node], null, parentStyle));
+  }
+  return widget.height = widget.node.parentNode.offsetHeight
+}
+
+// Return true when the given mouse event happened in a widget
+function eventInWidget(display, e) {
+  for (var n = e_target(e); n != display.wrapper; n = n.parentNode) {
+    if (!n || (n.nodeType == 1 && n.getAttribute("cm-ignore-events") == "true") ||
+        (n.parentNode == display.sizer && n != display.mover))
+      { return true }
+  }
+}
+
+// POSITION MEASUREMENT
+
+function paddingTop(display) {return display.lineSpace.offsetTop}
+function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight}
+function paddingH(display) {
+  if (display.cachedPaddingH) { return display.cachedPaddingH }
+  var e = removeChildrenAndAdd(display.measure, elt("pre", "x"));
+  var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle;
+  var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)};
+  if (!isNaN(data.left) && !isNaN(data.right)) { display.cachedPaddingH = data; }
+  return data
+}
+
+function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth }
+function displayWidth(cm) {
+  return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth
+}
+function displayHeight(cm) {
+  return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight
+}
+
+// Ensure the lineView.wrapping.heights array is populated. This is
+// an array of bottom offsets for the lines that make up a drawn
+// line. When lineWrapping is on, there might be more than one
+// height.
+function ensureLineHeights(cm, lineView, rect) {
+  var wrapping = cm.options.lineWrapping;
+  var curWidth = wrapping && displayWidth(cm);
+  if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) {
+    var heights = lineView.measure.heights = [];
+    if (wrapping) {
+      lineView.measure.width = curWidth;
+      var rects = lineView.text.firstChild.getClientRects();
+      for (var i = 0; i < rects.length - 1; i++) {
+        var cur = rects[i], next = rects[i + 1];
+        if (Math.abs(cur.bottom - next.bottom) > 2)
+          { heights.push((cur.bottom + next.top) / 2 - rect.top); }
+      }
+    }
+    heights.push(rect.bottom - rect.top);
+  }
+}
+
+// Find a line map (mapping character offsets to text nodes) and a
+// measurement cache for the given line number. (A line view might
+// contain multiple lines when collapsed ranges are present.)
+function mapFromLineView(lineView, line, lineN) {
+  if (lineView.line == line)
+    { return {map: lineView.measure.map, cache: lineView.measure.cache} }
+  for (var i = 0; i < lineView.rest.length; i++)
+    { if (lineView.rest[i] == line)
+      { return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]} } }
+  for (var i$1 = 0; i$1 < lineView.rest.length; i$1++)
+    { if (lineNo(lineView.rest[i$1]) > lineN)
+      { return {map: lineView.measure.maps[i$1], cache: lineView.measure.caches[i$1], before: true} } }
+}
+
+// Render a line into the hidden node display.externalMeasured. Used
+// when measurement is needed for a line that's not in the viewport.
+function updateExternalMeasurement(cm, line) {
+  line = visualLine(line);
+  var lineN = lineNo(line);
+  var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN);
+  view.lineN = lineN;
+  var built = view.built = buildLineContent(cm, view);
+  view.text = built.pre;
+  removeChildrenAndAdd(cm.display.lineMeasure, built.pre);
+  return view
+}
+
+// Get a {top, bottom, left, right} box (in line-local coordinates)
+// for a given character.
+function measureChar(cm, line, ch, bias) {
+  return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias)
+}
+
+// Find a line view that corresponds to the given line number.
+function findViewForLine(cm, lineN) {
+  if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo)
+    { return cm.display.view[findViewIndex(cm, lineN)] }
+  var ext = cm.display.externalMeasured;
+  if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size)
+    { return ext }
+}
+
+// Measurement can be split in two steps, the set-up work that
+// applies to the whole line, and the measurement of the actual
+// character. Functions like coordsChar, that need to do a lot of
+// measurements in a row, can thus ensure that the set-up work is
+// only done once.
+function prepareMeasureForLine(cm, line) {
+  var lineN = lineNo(line);
+  var view = findViewForLine(cm, lineN);
+  if (view && !view.text) {
+    view = null;
+  } else if (view && view.changes) {
+    updateLineForChanges(cm, view, lineN, getDimensions(cm));
+    cm.curOp.forceUpdate = true;
+  }
+  if (!view)
+    { view = updateExternalMeasurement(cm, line); }
+
+  var info = mapFromLineView(view, line, lineN);
+  return {
+    line: line, view: view, rect: null,
+    map: info.map, cache: info.cache, before: info.before,
+    hasHeights: false
+  }
+}
+
+// Given a prepared measurement object, measures the position of an
+// actual character (or fetches it from the cache).
+function measureCharPrepared(cm, prepared, ch, bias, varHeight) {
+  if (prepared.before) { ch = -1; }
+  var key = ch + (bias || ""), found;
+  if (prepared.cache.hasOwnProperty(key)) {
+    found = prepared.cache[key];
+  } else {
+    if (!prepared.rect)
+      { prepared.rect = prepared.view.text.getBoundingClientRect(); }
+    if (!prepared.hasHeights) {
+      ensureLineHeights(cm, prepared.view, prepared.rect);
+      prepared.hasHeights = true;
+    }
+    found = measureCharInner(cm, prepared, ch, bias);
+    if (!found.bogus) { prepared.cache[key] = found; }
+  }
+  return {left: found.left, right: found.right,
+          top: varHeight ? found.rtop : found.top,
+          bottom: varHeight ? found.rbottom : found.bottom}
+}
+
+var nullRect = {left: 0, right: 0, top: 0, bottom: 0};
+
+function nodeAndOffsetInLineMap(map$$1, ch, bias) {
+  var node, start, end, collapse, mStart, mEnd;
+  // First, search the line map for the text node corresponding to,
+  // or closest to, the target character.
+  for (var i = 0; i < map$$1.length; i += 3) {
+    mStart = map$$1[i];
+    mEnd = map$$1[i + 1];
+    if (ch < mStart) {
+      start = 0; end = 1;
+      collapse = "left";
+    } else if (ch < mEnd) {
+      start = ch - mStart;
+      end = start + 1;
+    } else if (i == map$$1.length - 3 || ch == mEnd && map$$1[i + 3] > ch) {
+      end = mEnd - mStart;
+      start = end - 1;
+      if (ch >= mEnd) { collapse = "right"; }
+    }
+    if (start != null) {
+      node = map$$1[i + 2];
+      if (mStart == mEnd && bias == (node.insertLeft ? "left" : "right"))
+        { collapse = bias; }
+      if (bias == "left" && start == 0)
+        { while (i && map$$1[i - 2] == map$$1[i - 3] && map$$1[i - 1].insertLeft) {
+          node = map$$1[(i -= 3) + 2];
+          collapse = "left";
+        } }
+      if (bias == "right" && start == mEnd - mStart)
+        { while (i < map$$1.length - 3 && map$$1[i + 3] == map$$1[i + 4] && !map$$1[i + 5].insertLeft) {
+          node = map$$1[(i += 3) + 2];
+          collapse = "right";
+        } }
+      break
+    }
+  }
+  return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd}
+}
+
+function getUsefulRect(rects, bias) {
+  var rect = nullRect;
+  if (bias == "left") { for (var i = 0; i < rects.length; i++) {
+    if ((rect = rects[i]).left != rect.right) { break }
+  } } else { for (var i$1 = rects.length - 1; i$1 >= 0; i$1--) {
+    if ((rect = rects[i$1]).left != rect.right) { break }
+  } }
+  return rect
+}
+
+function measureCharInner(cm, prepared, ch, bias) {
+  var place = nodeAndOffsetInLineMap(prepared.map, ch, bias);
+  var node = place.node, start = place.start, end = place.end, collapse = place.collapse;
+
+  var rect;
+  if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates.
+    for (var i$1 = 0; i$1 < 4; i$1++) { // Retry a maximum of 4 times when nonsense rectangles are returned
+      while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) { --start; }
+      while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) { ++end; }
+      if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart)
+        { rect = node.parentNode.getBoundingClientRect(); }
+      else
+        { rect = getUsefulRect(range(node, start, end).getClientRects(), bias); }
+      if (rect.left || rect.right || start == 0) { break }
+      end = start;
+      start = start - 1;
+      collapse = "right";
+    }
+    if (ie && ie_version < 11) { rect = maybeUpdateRectForZooming(cm.display.measure, rect); }
+  } else { // If it is a widget, simply get the box for the whole widget.
+    if (start > 0) { collapse = bias = "right"; }
+    var rects;
+    if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1)
+      { rect = rects[bias == "right" ? rects.length - 1 : 0]; }
+    else
+      { rect = node.getBoundingClientRect(); }
+  }
+  if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) {
+    var rSpan = node.parentNode.getClientRects()[0];
+    if (rSpan)
+      { rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom}; }
+    else
+      { rect = nullRect; }
+  }
+
+  var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top;
+  var mid = (rtop + rbot) / 2;
+  var heights = prepared.view.measure.heights;
+  var i = 0;
+  for (; i < heights.length - 1; i++)
+    { if (mid < heights[i]) { break } }
+  var top = i ? heights[i - 1] : 0, bot = heights[i];
+  var result = {left: (collapse == "right" ? rect.right : rect.left) - prepared.rect.left,
+                right: (collapse == "left" ? rect.left : rect.right) - prepared.rect.left,
+                top: top, bottom: bot};
+  if (!rect.left && !rect.right) { result.bogus = true; }
+  if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; }
+
+  return result
+}
+
+// Work around problem with bounding client rects on ranges being
+// returned incorrectly when zoomed on IE10 and below.
+function maybeUpdateRectForZooming(measure, rect) {
+  if (!window.screen || screen.logicalXDPI == null ||
+      screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure))
+    { return rect }
+  var scaleX = screen.logicalXDPI / screen.deviceXDPI;
+  var scaleY = screen.logicalYDPI / screen.deviceYDPI;
+  return {left: rect.left * scaleX, right: rect.right * scaleX,
+          top: rect.top * scaleY, bottom: rect.bottom * scaleY}
+}
+
+function clearLineMeasurementCacheFor(lineView) {
+  if (lineView.measure) {
+    lineView.measure.cache = {};
+    lineView.measure.heights = null;
+    if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++)
+      { lineView.measure.caches[i] = {}; } }
+  }
+}
+
+function clearLineMeasurementCache(cm) {
+  cm.display.externalMeasure = null;
+  removeChildren(cm.display.lineMeasure);
+  for (var i = 0; i < cm.display.view.length; i++)
+    { clearLineMeasurementCacheFor(cm.display.view[i]); }
+}
+
+function clearCaches(cm) {
+  clearLineMeasurementCache(cm);
+  cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null;
+  if (!cm.options.lineWrapping) { cm.display.maxLineChanged = true; }
+  cm.display.lineNumChars = null;
+}
+
+function pageScrollX() {
+  // Work around https://bugs.chromium.org/p/chromium/issues/detail?id=489206
+  // which causes page_Offset and bounding client rects to use
+  // different reference viewports and invalidate our calculations.
+  if (chrome && android) { return -(document.body.getBoundingClientRect().left - parseInt(getComputedStyle(document.body).marginLeft)) }
+  return window.pageXOffset || (document.documentElement || document.body).scrollLeft
+}
+function pageScrollY() {
+  if (chrome && android) { return -(document.body.getBoundingClientRect().top - parseInt(getComputedStyle(document.body).marginTop)) }
+  return window.pageYOffset || (document.documentElement || document.body).scrollTop
+}
+
+// Converts a {top, bottom, left, right} box from line-local
+// coordinates into another coordinate system. Context may be one of
+// "line", "div" (display.lineDiv), "local"./null (editor), "window",
+// or "page".
+function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) {
+  if (!includeWidgets && lineObj.widgets) { for (var i = 0; i < lineObj.widgets.length; ++i) { if (lineObj.widgets[i].above) {
+    var size = widgetHeight(lineObj.widgets[i]);
+    rect.top += size; rect.bottom += size;
+  } } }
+  if (context == "line") { return rect }
+  if (!context) { context = "local"; }
+  var yOff = heightAtLine(lineObj);
+  if (context == "local") { yOff += paddingTop(cm.display); }
+  else { yOff -= cm.display.viewOffset; }
+  if (context == "page" || context == "window") {
+    var lOff = cm.display.lineSpace.getBoundingClientRect();
+    yOff += lOff.top + (context == "window" ? 0 : pageScrollY());
+    var xOff = lOff.left + (context == "window" ? 0 : pageScrollX());
+    rect.left += xOff; rect.right += xOff;
+  }
+  rect.top += yOff; rect.bottom += yOff;
+  return rect
+}
+
+// Coverts a box from "div" coords to another coordinate system.
+// Context may be "window", "page", "div", or "local"./null.
+function fromCoordSystem(cm, coords, context) {
+  if (context == "div") { return coords }
+  var left = coords.left, top = coords.top;
+  // First move into "page" coordinate system
+  if (context == "page") {
+    left -= pageScrollX();
+    top -= pageScrollY();
+  } else if (context == "local" || !context) {
+    var localBox = cm.display.sizer.getBoundingClientRect();
+    left += localBox.left;
+    top += localBox.top;
+  }
+
+  var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect();
+  return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top}
+}
+
+function charCoords(cm, pos, context, lineObj, bias) {
+  if (!lineObj) { lineObj = getLine(cm.doc, pos.line); }
+  return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context)
+}
+
+// Returns a box for a given cursor position, which may have an
+// 'other' property containing the position of the secondary cursor
+// on a bidi boundary.
+// A cursor Pos(line, char, "before") is on the same visual line as `char - 1`
+// and after `char - 1` in writing order of `char - 1`
+// A cursor Pos(line, char, "after") is on the same visual line as `char`
+// and before `char` in writing order of `char`
+// Examples (upper-case letters are RTL, lower-case are LTR):
+//     Pos(0, 1, ...)
+//     before   after
+// ab     a|b     a|b
+// aB     a|B     aB|
+// Ab     |Ab     A|b
+// AB     B|A     B|A
+// Every position after the last character on a line is considered to stick
+// to the last character on the line.
+function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) {
+  lineObj = lineObj || getLine(cm.doc, pos.line);
+  if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); }
+  function get(ch, right) {
+    var m = measureCharPrepared(cm, preparedMeasure, ch, right ? "right" : "left", varHeight);
+    if (right) { m.left = m.right; } else { m.right = m.left; }
+    return intoCoordSystem(cm, lineObj, m, context)
+  }
+  var order = getOrder(lineObj, cm.doc.direction), ch = pos.ch, sticky = pos.sticky;
+  if (ch >= lineObj.text.length) {
+    ch = lineObj.text.length;
+    sticky = "before";
+  } else if (ch <= 0) {
+    ch = 0;
+    sticky = "after";
+  }
+  if (!order) { return get(sticky == "before" ? ch - 1 : ch, sticky == "before") }
+
+  function getBidi(ch, partPos, invert) {
+    var part = order[partPos], right = (part.level % 2) != 0;
+    return get(invert ? ch - 1 : ch, right != invert)
+  }
+  var partPos = getBidiPartAt(order, ch, sticky);
+  var other = bidiOther;
+  var val = getBidi(ch, partPos, sticky == "before");
+  if (other != null) { val.other = getBidi(ch, other, sticky != "before"); }
+  return val
+}
+
+// Used to cheaply estimate the coordinates for a position. Used for
+// intermediate scroll updates.
+function estimateCoords(cm, pos) {
+  var left = 0;
+  pos = clipPos(cm.doc, pos);
+  if (!cm.options.lineWrapping) { left = charWidth(cm.display) * pos.ch; }
+  var lineObj = getLine(cm.doc, pos.line);
+  var top = heightAtLine(lineObj) + paddingTop(cm.display);
+  return {left: left, right: left, top: top, bottom: top + lineObj.height}
+}
+
+// Positions returned by coordsChar contain some extra information.
+// xRel is the relative x position of the input coordinates compared
+// to the found position (so xRel > 0 means the coordinates are to
+// the right of the character position, for example). When outside
+// is true, that means the coordinates lie outside the line's
+// vertical range.
+function PosWithInfo(line, ch, sticky, outside, xRel) {
+  var pos = Pos(line, ch, sticky);
+  pos.xRel = xRel;
+  if (outside) { pos.outside = true; }
+  return pos
+}
+
+// Compute the character position closest to the given coordinates.
+// Input must be lineSpace-local ("div" coordinate system).
+function coordsChar(cm, x, y) {
+  var doc = cm.doc;
+  y += cm.display.viewOffset;
+  if (y < 0) { return PosWithInfo(doc.first, 0, null, true, -1) }
+  var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1;
+  if (lineN > last)
+    { return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, null, true, 1) }
+  if (x < 0) { x = 0; }
+
+  var lineObj = getLine(doc, lineN);
+  for (;;) {
+    var found = coordsCharInner(cm, lineObj, lineN, x, y);
+    var merged = collapsedSpanAtEnd(lineObj);
+    var mergedPos = merged && merged.find(0, true);
+    if (merged && (found.ch > mergedPos.from.ch || found.ch == mergedPos.from.ch && found.xRel > 0))
+      { lineN = lineNo(lineObj = mergedPos.to.line); }
+    else
+      { return found }
+  }
+}
+
+function wrappedLineExtent(cm, lineObj, preparedMeasure, y) {
+  var measure = function (ch) { return intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, ch), "line"); };
+  var end = lineObj.text.length;
+  var begin = findFirst(function (ch) { return measure(ch - 1).bottom <= y; }, end, 0);
+  end = findFirst(function (ch) { return measure(ch).top > y; }, begin, end);
+  return {begin: begin, end: end}
+}
+
+function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) {
+  var targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), "line").top;
+  return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop)
+}
+
+function coordsCharInner(cm, lineObj, lineNo$$1, x, y) {
+  y -= heightAtLine(lineObj);
+  var begin = 0, end = lineObj.text.length;
+  var preparedMeasure = prepareMeasureForLine(cm, lineObj);
+  var pos;
+  var order = getOrder(lineObj, cm.doc.direction);
+  if (order) {
+    if (cm.options.lineWrapping) {
+      var assign;
+      ((assign = wrappedLineExtent(cm, lineObj, preparedMeasure, y), begin = assign.begin, end = assign.end, assign));
+    }
+    pos = new Pos(lineNo$$1, Math.floor(begin + (end - begin) / 2));
+    var beginLeft = cursorCoords(cm, pos, "line", lineObj, preparedMeasure).left;
+    var dir = beginLeft < x ? 1 : -1;
+    var prevDiff, diff = beginLeft - x, prevPos;
+    var steps = Math.ceil((end - begin) / 4);
+    outer: do {
+      prevDiff = diff;
+      prevPos = pos;
+      var i = 0;
+      for (; i < steps; ++i) {
+        var prevPos$1 = pos;
+        pos = moveVisually(cm, lineObj, pos, dir);
+        if (pos == null || pos.ch < begin || end <= (pos.sticky == "before" ? pos.ch - 1 : pos.ch)) {
+          pos = prevPos$1;
+          break outer
+        }
+      }
+      diff = cursorCoords(cm, pos, "line", lineObj, preparedMeasure).left - x;
+      if (steps > 1) {
+        var diff_change_per_step = Math.abs(diff - prevDiff) / steps;
+        steps = Math.min(steps, Math.ceil(Math.abs(diff) / diff_change_per_step));
+        dir = diff < 0 ? 1 : -1;
+      }
+    } while (diff != 0 && (steps > 1 || ((dir < 0) != (diff < 0) && (Math.abs(diff) <= Math.abs(prevDiff)))))
+    if (Math.abs(diff) > Math.abs(prevDiff)) {
+      if ((diff < 0) == (prevDiff < 0)) { throw new Error("Broke out of infinite loop in coordsCharInner") }
+      pos = prevPos;
+    }
+  } else {
+    var ch = findFirst(function (ch) {
+      var box = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, ch), "line");
+      if (box.top > y) {
+        // For the cursor stickiness
+        end = Math.min(ch, end);
+        return true
+      }
+      else if (box.bottom <= y) { return false }
+      else if (box.left > x) { return true }
+      else if (box.right < x) { return false }
+      else { return (x - box.left < box.right - x) }
+    }, begin, end);
+    ch = skipExtendingChars(lineObj.text, ch, 1);
+    pos = new Pos(lineNo$$1, ch, ch == end ? "before" : "after");
+  }
+  var coords = cursorCoords(cm, pos, "line", lineObj, preparedMeasure);
+  if (y < coords.top || coords.bottom < y) { pos.outside = true; }
+  pos.xRel = x < coords.left ? -1 : (x > coords.right ? 1 : 0);
+  return pos
+}
+
+var measureText;
+// Compute the default text height.
+function textHeight(display) {
+  if (display.cachedTextHeight != null) { return display.cachedTextHeight }
+  if (measureText == null) {
+    measureText = elt("pre");
+    // Measure a bunch of lines, for browsers that compute
+    // fractional heights.
+    for (var i = 0; i < 49; ++i) {
+      measureText.appendChild(document.createTextNode("x"));
+      measureText.appendChild(elt("br"));
+    }
+    measureText.appendChild(document.createTextNode("x"));
+  }
+  removeChildrenAndAdd(display.measure, measureText);
+  var height = measureText.offsetHeight / 50;
+  if (height > 3) { display.cachedTextHeight = height; }
+  removeChildren(display.measure);
+  return height || 1
+}
+
+// Compute the default character width.
+function charWidth(display) {
+  if (display.cachedCharWidth != null) { return display.cachedCharWidth }
+  var anchor = elt("span", "xxxxxxxxxx");
+  var pre = elt("pre", [anchor]);
+  removeChildrenAndAdd(display.measure, pre);
+  var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10;
+  if (width > 2) { display.cachedCharWidth = width; }
+  return width || 10
+}
+
+// Do a bulk-read of the DOM positions and sizes needed to draw the
+// view, so that we don't interleave reading and writing to the DOM.
+function getDimensions(cm) {
+  var d = cm.display, left = {}, width = {};
+  var gutterLeft = d.gutters.clientLeft;
+  for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {
+    left[cm.options.gutters[i]] = n.offsetLeft + n.clientLeft + gutterLeft;
+    width[cm.options.gutters[i]] = n.clientWidth;
+  }
+  return {fixedPos: compensateForHScroll(d),
+          gutterTotalWidth: d.gutters.offsetWidth,
+          gutterLeft: left,
+          gutterWidth: width,
+          wrapperWidth: d.wrapper.clientWidth}
+}
+
+// Computes display.scroller.scrollLeft + display.gutters.offsetWidth,
+// but using getBoundingClientRect to get a sub-pixel-accurate
+// result.
+function compensateForHScroll(display) {
+  return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left
+}
+
+// Returns a function that estimates the height of a line, to use as
+// first approximation until the line becomes visible (and is thus
+// properly measurable).
+function estimateHeight(cm) {
+  var th = textHeight(cm.display), wrapping = cm.options.lineWrapping;
+  var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3);
+  return function (line) {
+    if (lineIsHidden(cm.doc, line)) { return 0 }
+
+    var widgetsHeight = 0;
+    if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) {
+      if (line.widgets[i].height) { widgetsHeight += line.widgets[i].height; }
+    } }
+
+    if (wrapping)
+      { return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th }
+    else
+      { return widgetsHeight + th }
+  }
+}
+
+function estimateLineHeights(cm) {
+  var doc = cm.doc, est = estimateHeight(cm);
+  doc.iter(function (line) {
+    var estHeight = est(line);
+    if (estHeight != line.height) { updateLineHeight(line, estHeight); }
+  });
+}
+
+// Given a mouse event, find the corresponding position. If liberal
+// is false, it checks whether a gutter or scrollbar was clicked,
+// and returns null if it was. forRect is used by rectangular
+// selections, and tries to estimate a character position even for
+// coordinates beyond the right of the text.
+function posFromMouse(cm, e, liberal, forRect) {
+  var display = cm.display;
+  if (!liberal && e_target(e).getAttribute("cm-not-content") == "true") { return null }
+
+  var x, y, space = display.lineSpace.getBoundingClientRect();
+  // Fails unpredictably on IE[67] when mouse is dragged around quickly.
+  try { x = e.clientX - space.left; y = e.clientY - space.top; }
+  catch (e) { return null }
+  var coords = coordsChar(cm, x, y), line;
+  if (forRect && coords.xRel == 1 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) {
+    var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length;
+    coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff));
+  }
+  return coords
+}
+
+// Find the view element corresponding to a given line. Return null
+// when the line isn't visible.
+function findViewIndex(cm, n) {
+  if (n >= cm.display.viewTo) { return null }
+  n -= cm.display.viewFrom;
+  if (n < 0) { return null }
+  var view = cm.display.view;
+  for (var i = 0; i < view.length; i++) {
+    n -= view[i].size;
+    if (n < 0) { return i }
+  }
+}
+
+function updateSelection(cm) {
+  cm.display.input.showSelection(cm.display.input.prepareSelection());
+}
+
+function prepareSelection(cm, primary) {
+  var doc = cm.doc, result = {};
+  var curFragment = result.cursors = document.createDocumentFragment();
+  var selFragment = result.selection = document.createDocumentFragment();
+
+  for (var i = 0; i < doc.sel.ranges.length; i++) {
+    if (primary === false && i == doc.sel.primIndex) { continue }
+    var range$$1 = doc.sel.ranges[i];
+    if (range$$1.from().line >= cm.display.viewTo || range$$1.to().line < cm.display.viewFrom) { continue }
+    var collapsed = range$$1.empty();
+    if (collapsed || cm.options.showCursorWhenSelecting)
+      { drawSelectionCursor(cm, range$$1.head, curFragment); }
+    if (!collapsed)
+      { drawSelectionRange(cm, range$$1, selFragment); }
+  }
+  return result
+}
+
+// Draws a cursor for the given range
+function drawSelectionCursor(cm, head, output) {
+  var pos = cursorCoords(cm, head, "div", null, null, !cm.options.singleCursorHeightPerLine);
+
+  var cursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor"));
+  cursor.style.left = pos.left + "px";
+  cursor.style.top = pos.top + "px";
+  cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px";
+
+  if (pos.other) {
+    // Secondary cursor, shown when on a 'jump' in bi-directional text
+    var otherCursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor"));
+    otherCursor.style.display = "";
+    otherCursor.style.left = pos.other.left + "px";
+    otherCursor.style.top = pos.other.top + "px";
+    otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px";
+  }
+}
+
+// Draws the given range as a highlighted selection
+function drawSelectionRange(cm, range$$1, output) {
+  var display = cm.display, doc = cm.doc;
+  var fragment = document.createDocumentFragment();
+  var padding = paddingH(cm.display), leftSide = padding.left;
+  var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right;
+
+  function add(left, top, width, bottom) {
+    if (top < 0) { top = 0; }
+    top = Math.round(top);
+    bottom = Math.round(bottom);
+    fragment.appendChild(elt("div", null, "CodeMirror-selected", ("position: absolute; left: " + left + "px;\n                             top: " + top + "px; width: " + (width == null ? rightSide - left : width) + "px;\n                             height: " + (bottom - top) + "px")));
+  }
+
+  function drawForLine(line, fromArg, toArg) {
+    var lineObj = getLine(doc, line);
+    var lineLen = lineObj.text.length;
+    var start, end;
+    function coords(ch, bias) {
+      return charCoords(cm, Pos(line, ch), "div", lineObj, bias)
+    }
+
+    iterateBidiSections(getOrder(lineObj, doc.direction), fromArg || 0, toArg == null ? lineLen : toArg, function (from, to, dir) {
+      var leftPos = coords(from, "left"), rightPos, left, right;
+      if (from == to) {
+        rightPos = leftPos;
+        left = right = leftPos.left;
+      } else {
+        rightPos = coords(to - 1, "right");
+        if (dir == "rtl") { var tmp = leftPos; leftPos = rightPos; rightPos = tmp; }
+        left = leftPos.left;
+        right = rightPos.right;
+      }
+      if (fromArg == null && from == 0) { left = leftSide; }
+      if (rightPos.top - leftPos.top > 3) { // Different lines, draw top part
+        add(left, leftPos.top, null, leftPos.bottom);
+        left = leftSide;
+        if (leftPos.bottom < rightPos.top) { add(left, leftPos.bottom, null, rightPos.top); }
+      }
+      if (toArg == null && to == lineLen) { right = rightSide; }
+      if (!start || leftPos.top < start.top || leftPos.top == start.top && leftPos.left < start.left)
+        { start = leftPos; }
+      if (!end || rightPos.bottom > end.bottom || rightPos.bottom == end.bottom && rightPos.right > end.right)
+        { end = rightPos; }
+      if (left < leftSide + 1) { left = leftSide; }
+      add(left, rightPos.top, right - left, rightPos.bottom);
+    });
+    return {start: start, end: end}
+  }
+
+  var sFrom = range$$1.from(), sTo = range$$1.to();
+  if (sFrom.line == sTo.line) {
+    drawForLine(sFrom.line, sFrom.ch, sTo.ch);
+  } else {
+    var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line);
+    var singleVLine = visualLine(fromLine) == visualLine(toLine);
+    var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end;
+    var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start;
+    if (singleVLine) {
+      if (leftEnd.top < rightStart.top - 2) {
+        add(leftEnd.right, leftEnd.top, null, leftEnd.bottom);
+        add(leftSide, rightStart.top, rightStart.left, rightStart.bottom);
+      } else {
+        add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom);
+      }
+    }
+    if (leftEnd.bottom < rightStart.top)
+      { add(leftSide, leftEnd.bottom, null, rightStart.top); }
+  }
+
+  output.appendChild(fragment);
+}
+
+// Cursor-blinking
+function restartBlink(cm) {
+  if (!cm.state.focused) { return }
+  var display = cm.display;
+  clearInterval(display.blinker);
+  var on = true;
+  display.cursorDiv.style.visibility = "";
+  if (cm.options.cursorBlinkRate > 0)
+    { display.blinker = setInterval(function () { return display.cursorDiv.style.visibility = (on = !on) ? "" : "hidden"; },
+      cm.options.cursorBlinkRate); }
+  else if (cm.options.cursorBlinkRate < 0)
+    { display.cursorDiv.style.visibility = "hidden"; }
+}
+
+function ensureFocus(cm) {
+  if (!cm.state.focused) { cm.display.input.focus(); onFocus(cm); }
+}
+
+function delayBlurEvent(cm) {
+  cm.state.delayingBlurEvent = true;
+  setTimeout(function () { if (cm.state.delayingBlurEvent) {
+    cm.state.delayingBlurEvent = false;
+    onBlur(cm);
+  } }, 100);
+}
+
+function onFocus(cm, e) {
+  if (cm.state.delayingBlurEvent) { cm.state.delayingBlurEvent = false; }
+
+  if (cm.options.readOnly == "nocursor") { return }
+  if (!cm.state.focused) {
+    signal(cm, "focus", cm, e);
+    cm.state.focused = true;
+    addClass(cm.display.wrapper, "CodeMirror-focused");
+    // This test prevents this from firing when a context
+    // menu is closed (since the input reset would kill the
+    // select-all detection hack)
+    if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) {
+      cm.display.input.reset();
+      if (webkit) { setTimeout(function () { return cm.display.input.reset(true); }, 20); } // Issue #1730
+    }
+    cm.display.input.receivedFocus();
+  }
+  restartBlink(cm);
+}
+function onBlur(cm, e) {
+  if (cm.state.delayingBlurEvent) { return }
+
+  if (cm.state.focused) {
+    signal(cm, "blur", cm, e);
+    cm.state.focused = false;
+    rmClass(cm.display.wrapper, "CodeMirror-focused");
+  }
+  clearInterval(cm.display.blinker);
+  setTimeout(function () { if (!cm.state.focused) { cm.display.shift = false; } }, 150);
+}
+
+// Read the actual heights of the rendered lines, and update their
+// stored heights to match.
+function updateHeightsInViewport(cm) {
+  var display = cm.display;
+  var prevBottom = display.lineDiv.offsetTop;
+  for (var i = 0; i < display.view.length; i++) {
+    var cur = display.view[i], height = (void 0);
+    if (cur.hidden) { continue }
+    if (ie && ie_version < 8) {
+      var bot = cur.node.offsetTop + cur.node.offsetHeight;
+      height = bot - prevBottom;
+      prevBottom = bot;
+    } else {
+      var box = cur.node.getBoundingClientRect();
+      height = box.bottom - box.top;
+    }
+    var diff = cur.line.height - height;
+    if (height < 2) { height = textHeight(display); }
+    if (diff > .005 || diff < -.005) {
+      updateLineHeight(cur.line, height);
+      updateWidgetHeight(cur.line);
+      if (cur.rest) { for (var j = 0; j < cur.rest.length; j++)
+        { updateWidgetHeight(cur.rest[j]); } }
+    }
+  }
+}
+
+// Read and store the height of line widgets associated with the
+// given line.
+function updateWidgetHeight(line) {
+  if (line.widgets) { for (var i = 0; i < line.widgets.length; ++i)
+    { line.widgets[i].height = line.widgets[i].node.parentNode.offsetHeight; } }
+}
+
+// Compute the lines that are visible in a given viewport (defaults
+// the the current scroll position). viewport may contain top,
+// height, and ensure (see op.scrollToPos) properties.
+function visibleLines(display, doc, viewport) {
+  var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop;
+  top = Math.floor(top - paddingTop(display));
+  var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight;
+
+  var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom);
+  // Ensure is a {from: {line, ch}, to: {line, ch}} object, and
+  // forces those lines into the viewport (if possible).
+  if (viewport && viewport.ensure) {
+    var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line;
+    if (ensureFrom < from) {
+      from = ensureFrom;
+      to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight);
+    } else if (Math.min(ensureTo, doc.lastLine()) >= to) {
+      from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight);
+      to = ensureTo;
+    }
+  }
+  return {from: from, to: Math.max(to, from + 1)}
+}
+
+// Re-align line numbers and gutter marks to compensate for
+// horizontal scrolling.
+function alignHorizontally(cm) {
+  var display = cm.display, view = display.view;
+  if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) { return }
+  var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft;
+  var gutterW = display.gutters.offsetWidth, left = comp + "px";
+  for (var i = 0; i < view.length; i++) { if (!view[i].hidden) {
+    if (cm.options.fixedGutter) {
+      if (view[i].gutter)
+        { view[i].gutter.style.left = left; }
+      if (view[i].gutterBackground)
+        { view[i].gutterBackground.style.left = left; }
+    }
+    var align = view[i].alignable;
+    if (align) { for (var j = 0; j < align.length; j++)
+      { align[j].style.left = left; } }
+  } }
+  if (cm.options.fixedGutter)
+    { display.gutters.style.left = (comp + gutterW) + "px"; }
+}
+
+// Used to ensure that the line number gutter is still the right
+// size for the current document size. Returns true when an update
+// is needed.
+function maybeUpdateLineNumberWidth(cm) {
+  if (!cm.options.lineNumbers) { return false }
+  var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display;
+  if (last.length != display.lineNumChars) {
+    var test = display.measure.appendChild(elt("div", [elt("div", last)],
+                                               "CodeMirror-linenumber CodeMirror-gutter-elt"));
+    var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW;
+    display.lineGutter.style.width = "";
+    display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1;
+    display.lineNumWidth = display.lineNumInnerWidth + padding;
+    display.lineNumChars = display.lineNumInnerWidth ? last.length : -1;
+    display.lineGutter.style.width = display.lineNumWidth + "px";
+    updateGutterSpace(cm);
+    return true
+  }
+  return false
+}
+
+// SCROLLING THINGS INTO VIEW
+
+// If an editor sits on the top or bottom of the window, partially
+// scrolled out of view, this ensures that the cursor is visible.
+function maybeScrollWindow(cm, rect) {
+  if (signalDOMEvent(cm, "scrollCursorIntoView")) { return }
+
+  var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null;
+  if (rect.top + box.top < 0) { doScroll = true; }
+  else if (rect.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) { doScroll = false; }
+  if (doScroll != null && !phantom) {
+    var scrollNode = elt("div", "\u200b", null, ("position: absolute;\n                         top: " + (rect.top - display.viewOffset - paddingTop(cm.display)) + "px;\n                         height: " + (rect.bottom - rect.top + scrollGap(cm) + display.barHeight) + "px;\n                         left: " + (rect.left) + "px; width: " + (Math.max(2, rect.right - rect.left)) + "px;"));
+    cm.display.lineSpace.appendChild(scrollNode);
+    scrollNode.scrollIntoView(doScroll);
+    cm.display.lineSpace.removeChild(scrollNode);
+  }
+}
+
+// Scroll a given position into view (immediately), verifying that
+// it actually became visible (as line heights are accurately
+// measured, the position of something may 'drift' during drawing).
+function scrollPosIntoView(cm, pos, end, margin) {
+  if (margin == null) { margin = 0; }
+  var rect;
+  if (!cm.options.lineWrapping && pos == end) {
+    // Set pos and end to the cursor positions around the character pos sticks to
+    // If pos.sticky == "before", that is around pos.ch - 1, otherwise around pos.ch
+    // If pos == Pos(_, 0, "before"), pos and end are unchanged
+    pos = pos.ch ? Pos(pos.line, pos.sticky == "before" ? pos.ch - 1 : pos.ch, "after") : pos;
+    end = pos.sticky == "before" ? Pos(pos.line, pos.ch + 1, "before") : pos;
+  }
+  for (var limit = 0; limit < 5; limit++) {
+    var changed = false;
+    var coords = cursorCoords(cm, pos);
+    var endCoords = !end || end == pos ? coords : cursorCoords(cm, end);
+    rect = {left: Math.min(coords.left, endCoords.left),
+            top: Math.min(coords.top, endCoords.top) - margin,
+            right: Math.max(coords.left, endCoords.left),
+            bottom: Math.max(coords.bottom, endCoords.bottom) + margin};
+    var scrollPos = calculateScrollPos(cm, rect);
+    var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft;
+    if (scrollPos.scrollTop != null) {
+      updateScrollTop(cm, scrollPos.scrollTop);
+      if (Math.abs(cm.doc.scrollTop - startTop) > 1) { changed = true; }
+    }
+    if (scrollPos.scrollLeft != null) {
+      setScrollLeft(cm, scrollPos.scrollLeft);
+      if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) { changed = true; }
+    }
+    if (!changed) { break }
+  }
+  return rect
+}
+
+// Scroll a given set of coordinates into view (immediately).
+function scrollIntoView(cm, rect) {
+  var scrollPos = calculateScrollPos(cm, rect);
+  if (scrollPos.scrollTop != null) { updateScrollTop(cm, scrollPos.scrollTop); }
+  if (scrollPos.scrollLeft != null) { setScrollLeft(cm, scrollPos.scrollLeft); }
+}
+
+// Calculate a new scroll position needed to scroll the given
+// rectangle into view. Returns an object with scrollTop and
+// scrollLeft properties. When these are undefined, the
+// vertical/horizontal position does not need to be adjusted.
+function calculateScrollPos(cm, rect) {
+  var display = cm.display, snapMargin = textHeight(cm.display);
+  if (rect.top < 0) { rect.top = 0; }
+  var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop;
+  var screen = displayHeight(cm), result = {};
+  if (rect.bottom - rect.top > screen) { rect.bottom = rect.top + screen; }
+  var docBottom = cm.doc.height + paddingVert(display);
+  var atTop = rect.top < snapMargin, atBottom = rect.bottom > docBottom - snapMargin;
+  if (rect.top < screentop) {
+    result.scrollTop = atTop ? 0 : rect.top;
+  } else if (rect.bottom > screentop + screen) {
+    var newTop = Math.min(rect.top, (atBottom ? docBottom : rect.bottom) - screen);
+    if (newTop != screentop) { result.scrollTop = newTop; }
+  }
+
+  var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft;
+  var screenw = displayWidth(cm) - (cm.options.fixedGutter ? display.gutters.offsetWidth : 0);
+  var tooWide = rect.right - rect.left > screenw;
+  if (tooWide) { rect.right = rect.left + screenw; }
+  if (rect.left < 10)
+    { result.scrollLeft = 0; }
+  else if (rect.left < screenleft)
+    { result.scrollLeft = Math.max(0, rect.left - (tooWide ? 0 : 10)); }
+  else if (rect.right > screenw + screenleft - 3)
+    { result.scrollLeft = rect.right + (tooWide ? 0 : 10) - screenw; }
+  return result
+}
+
+// Store a relative adjustment to the scroll position in the current
+// operation (to be applied when the operation finishes).
+function addToScrollTop(cm, top) {
+  if (top == null) { return }
+  resolveScrollToPos(cm);
+  cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top;
+}
+
+// Make sure that at the end of the operation the current cursor is
+// shown.
+function ensureCursorVisible(cm) {
+  resolveScrollToPos(cm);
+  var cur = cm.getCursor();
+  cm.curOp.scrollToPos = {from: cur, to: cur, margin: cm.options.cursorScrollMargin};
+}
+
+function scrollToCoords(cm, x, y) {
+  if (x != null || y != null) { resolveScrollToPos(cm); }
+  if (x != null) { cm.curOp.scrollLeft = x; }
+  if (y != null) { cm.curOp.scrollTop = y; }
+}
+
+function scrollToRange(cm, range$$1) {
+  resolveScrollToPos(cm);
+  cm.curOp.scrollToPos = range$$1;
+}
+
+// When an operation has its scrollToPos property set, and another
+// scroll action is applied before the end of the operation, this
+// 'simulates' scrolling that position into view in a cheap way, so
+// that the effect of intermediate scroll commands is not ignored.
+function resolveScrollToPos(cm) {
+  var range$$1 = cm.curOp.scrollToPos;
+  if (range$$1) {
+    cm.curOp.scrollToPos = null;
+    var from = estimateCoords(cm, range$$1.from), to = estimateCoords(cm, range$$1.to);
+    scrollToCoordsRange(cm, from, to, range$$1.margin);
+  }
+}
+
+function scrollToCoordsRange(cm, from, to, margin) {
+  var sPos = calculateScrollPos(cm, {
+    left: Math.min(from.left, to.left),
+    top: Math.min(from.top, to.top) - margin,
+    right: Math.max(from.right, to.right),
+    bottom: Math.max(from.bottom, to.bottom) + margin
+  });
+  scrollToCoords(cm, sPos.scrollLeft, sPos.scrollTop);
+}
+
+// Sync the scrollable area and scrollbars, ensure the viewport
+// covers the visible area.
+function updateScrollTop(cm, val) {
+  if (Math.abs(cm.doc.scrollTop - val) < 2) { return }
+  if (!gecko) { updateDisplaySimple(cm, {top: val}); }
+  setScrollTop(cm, val, true);
+  if (gecko) { updateDisplaySimple(cm); }
+  startWorker(cm, 100);
+}
+
+function setScrollTop(cm, val, forceScroll) {
+  val = Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight, val);
+  if (cm.display.scroller.scrollTop == val && !forceScroll) { return }
+  cm.doc.scrollTop = val;
+  cm.display.scrollbars.setScrollTop(val);
+  if (cm.display.scroller.scrollTop != val) { cm.display.scroller.scrollTop = val; }
+}
+
+// Sync scroller and scrollbar, ensure the gutter elements are
+// aligned.
+function setScrollLeft(cm, val, isScroller, forceScroll) {
+  val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth);
+  if ((isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) && !forceScroll) { return }
+  cm.doc.scrollLeft = val;
+  alignHorizontally(cm);
+  if (cm.display.scroller.scrollLeft != val) { cm.display.scroller.scrollLeft = val; }
+  cm.display.scrollbars.setScrollLeft(val);
+}
+
+// SCROLLBARS
+
+// Prepare DOM reads needed to update the scrollbars. Done in one
+// shot to minimize update/measure roundtrips.
+function measureForScrollbars(cm) {
+  var d = cm.display, gutterW = d.gutters.offsetWidth;
+  var docH = Math.round(cm.doc.height + paddingVert(cm.display));
+  return {
+    clientHeight: d.scroller.clientHeight,
+    viewHeight: d.wrapper.clientHeight,
+    scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth,
+    viewWidth: d.wrapper.clientWidth,
+    barLeft: cm.options.fixedGutter ? gutterW : 0,
+    docHeight: docH,
+    scrollHeight: docH + scrollGap(cm) + d.barHeight,
+    nativeBarWidth: d.nativeBarWidth,
+    gutterWidth: gutterW
+  }
+}
+
+var NativeScrollbars = function(place, scroll, cm) {
+  this.cm = cm;
+  var vert = this.vert = elt("div", [elt("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar");
+  var horiz = this.horiz = elt("div", [elt("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar");
+  place(vert); place(horiz);
+
+  on(vert, "scroll", function () {
+    if (vert.clientHeight) { scroll(vert.scrollTop, "vertical"); }
+  });
+  on(horiz, "scroll", function () {
+    if (horiz.clientWidth) { scroll(horiz.scrollLeft, "horizontal"); }
+  });
+
+  this.checkedZeroWidth = false;
+  // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8).
+  if (ie && ie_version < 8) { this.horiz.style.minHeight = this.vert.style.minWidth = "18px"; }
+};
+
+NativeScrollbars.prototype.update = function (measure) {
+  var needsH = measure.scrollWidth > measure.clientWidth + 1;
+  var needsV = measure.scrollHeight > measure.clientHeight + 1;
+  var sWidth = measure.nativeBarWidth;
+
+  if (needsV) {
+    this.vert.style.display = "block";
+    this.vert.style.bottom = needsH ? sWidth + "px" : "0";
+    var totalHeight = measure.viewHeight - (needsH ? sWidth : 0);
+    // A bug in IE8 can cause this value to be negative, so guard it.
+    this.vert.firstChild.style.height =
+      Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + "px";
+  } else {
+    this.vert.style.display = "";
+    this.vert.firstChild.style.height = "0";
+  }
+
+  if (needsH) {
+    this.horiz.style.display = "block";
+    this.horiz.style.right = needsV ? sWidth + "px" : "0";
+    this.horiz.style.left = measure.barLeft + "px";
+    var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0);
+    this.horiz.firstChild.style.width =
+      Math.max(0, measure.scrollWidth - measure.clientWidth + totalWidth) + "px";
+  } else {
+    this.horiz.style.display = "";
+    this.horiz.firstChild.style.width = "0";
+  }
+
+  if (!this.checkedZeroWidth && measure.clientHeight > 0) {
+    if (sWidth == 0) { this.zeroWidthHack(); }
+    this.checkedZeroWidth = true;
+  }
+
+  return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0}
+};
+
+NativeScrollbars.prototype.setScrollLeft = function (pos) {
+  if (this.horiz.scrollLeft != pos) { this.horiz.scrollLeft = pos; }
+  if (this.disableHoriz) { this.enableZeroWidthBar(this.horiz, this.disableHoriz, "horiz"); }
+};
+
+NativeScrollbars.prototype.setScrollTop = function (pos) {
+  if (this.vert.scrollTop != pos) { this.vert.scrollTop = pos; }
+  if (this.disableVert) { this.enableZeroWidthBar(this.vert, this.disableVert, "vert"); }
+};
+
+NativeScrollbars.prototype.zeroWidthHack = function () {
+  var w = mac && !mac_geMountainLion ? "12px" : "18px";
+  this.horiz.style.height = this.vert.style.width = w;
+  this.horiz.style.pointerEvents = this.vert.style.pointerEvents = "none";
+  this.disableHoriz = new Delayed;
+  this.disableVert = new Delayed;
+};
+
+NativeScrollbars.prototype.enableZeroWidthBar = function (bar, delay, type) {
+  bar.style.pointerEvents = "auto";
+  function maybeDisable() {
+    // To find out whether the scrollbar is still visible, we
+    // check whether the element under the pixel in the bottom
+    // right corner of the scrollbar box is the scrollbar box
+    // itself (when the bar is still visible) or its filler child
+    // (when the bar is hidden). If it is still visible, we keep
+    // it enabled, if it's hidden, we disable pointer events.
+    var box = bar.getBoundingClientRect();
+    var elt$$1 = type == "vert" ? document.elementFromPoint(box.right - 1, (box.top + box.bottom) / 2)
+        : document.elementFromPoint((box.right + box.left) / 2, box.bottom - 1);
+    if (elt$$1 != bar) { bar.style.pointerEvents = "none"; }
+    else { delay.set(1000, maybeDisable); }
+  }
+  delay.set(1000, maybeDisable);
+};
+
+NativeScrollbars.prototype.clear = function () {
+  var parent = this.horiz.parentNode;
+  parent.removeChild(this.horiz);
+  parent.removeChild(this.vert);
+};
+
+var NullScrollbars = function () {};
+
+NullScrollbars.prototype.update = function () { return {bottom: 0, right: 0} };
+NullScrollbars.prototype.setScrollLeft = function () {};
+NullScrollbars.prototype.setScrollTop = function () {};
+NullScrollbars.prototype.clear = function () {};
+
+function updateScrollbars(cm, measure) {
+  if (!measure) { measure = measureForScrollbars(cm); }
+  var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight;
+  updateScrollbarsInner(cm, measure);
+  for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) {
+    if (startWidth != cm.display.barWidth && cm.options.lineWrapping)
+      { updateHeightsInViewport(cm); }
+    updateScrollbarsInner(cm, measureForScrollbars(cm));
+    startWidth = cm.display.barWidth; startHeight = cm.display.barHeight;
+  }
+}
+
+// Re-synchronize the fake scrollbars with the actual size of the
+// content.
+function updateScrollbarsInner(cm, measure) {
+  var d = cm.display;
+  var sizes = d.scrollbars.update(measure);
+
+  d.sizer.style.paddingRight = (d.barWidth = sizes.right) + "px";
+  d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + "px";
+  d.heightForcer.style.borderBottom = sizes.bottom + "px solid transparent";
+
+  if (sizes.right && sizes.bottom) {
+    d.scrollbarFiller.style.display = "block";
+    d.scrollbarFiller.style.height = sizes.bottom + "px";
+    d.scrollbarFiller.style.width = sizes.right + "px";
+  } else { d.scrollbarFiller.style.display = ""; }
+  if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) {
+    d.gutterFiller.style.display = "block";
+    d.gutterFiller.style.height = sizes.bottom + "px";
+    d.gutterFiller.style.width = measure.gutterWidth + "px";
+  } else { d.gutterFiller.style.display = ""; }
+}
+
+var scrollbarModel = {"native": NativeScrollbars, "null": NullScrollbars};
+
+function initScrollbars(cm) {
+  if (cm.display.scrollbars) {
+    cm.display.scrollbars.clear();
+    if (cm.display.scrollbars.addClass)
+      { rmClass(cm.display.wrapper, cm.display.scrollbars.addClass); }
+  }
+
+  cm.display.scrollbars = new scrollbarModel[cm.options.scrollbarStyle](function (node) {
+    cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller);
+    // Prevent clicks in the scrollbars from killing focus
+    on(node, "mousedown", function () {
+      if (cm.state.focused) { setTimeout(function () { return cm.display.input.focus(); }, 0); }
+    });
+    node.setAttribute("cm-not-content", "true");
+  }, function (pos, axis) {
+    if (axis == "horizontal") { setScrollLeft(cm, pos); }
+    else { updateScrollTop(cm, pos); }
+  }, cm);
+  if (cm.display.scrollbars.addClass)
+    { addClass(cm.display.wrapper, cm.display.scrollbars.addClass); }
+}
+
+// Operations are used to wrap a series of changes to the editor
+// state in such a way that each change won't have to update the
+// cursor and display (which would be awkward, slow, and
+// error-prone). Instead, display updates are batched and then all
+// combined and executed at once.
+
+var nextOpId = 0;
+// Start a new operation.
+function startOperation(cm) {
+  cm.curOp = {
+    cm: cm,
+    viewChanged: false,      // Flag that indicates that lines might need to be redrawn
+    startHeight: cm.doc.height, // Used to detect need to update scrollbar
+    forceUpdate: false,      // Used to force a redraw
+    updateInput: null,       // Whether to reset the input textarea
+    typing: false,           // Whether this reset should be careful to leave existing text (for compositing)
+    changeObjs: null,        // Accumulated changes, for firing change events
+    cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on
+    cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already
+    selectionChanged: false, // Whether the selection needs to be redrawn
+    updateMaxLine: false,    // Set when the widest line needs to be determined anew
+    scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet
+    scrollToPos: null,       // Used to scroll to a specific position
+    focus: false,
+    id: ++nextOpId           // Unique ID
+  };
+  pushOperation(cm.curOp);
+}
+
+// Finish an operation, updating the display and signalling delayed events
+function endOperation(cm) {
+  var op = cm.curOp;
+  finishOperation(op, function (group) {
+    for (var i = 0; i < group.ops.length; i++)
+      { group.ops[i].cm.curOp = null; }
+    endOperations(group);
+  });
+}
+
+// The DOM updates done when an operation finishes are batched so
+// that the minimum number of relayouts are required.
+function endOperations(group) {
+  var ops = group.ops;
+  for (var i = 0; i < ops.length; i++) // Read DOM
+    { endOperation_R1(ops[i]); }
+  for (var i$1 = 0; i$1 < ops.length; i$1++) // Write DOM (maybe)
+    { endOperation_W1(ops[i$1]); }
+  for (var i$2 = 0; i$2 < ops.length; i$2++) // Read DOM
+    { endOperation_R2(ops[i$2]); }
+  for (var i$3 = 0; i$3 < ops.length; i$3++) // Write DOM (maybe)
+    { endOperation_W2(ops[i$3]); }
+  for (var i$4 = 0; i$4 < ops.length; i$4++) // Read DOM
+    { endOperation_finish(ops[i$4]); }
+}
+
+function endOperation_R1(op) {
+  var cm = op.cm, display = cm.display;
+  maybeClipScrollbars(cm);
+  if (op.updateMaxLine) { findMaxLine(cm); }
+
+  op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null ||
+    op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom ||
+                       op.scrollToPos.to.line >= display.viewTo) ||
+    display.maxLineChanged && cm.options.lineWrapping;
+  op.update = op.mustUpdate &&
+    new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate);
+}
+
+function endOperation_W1(op) {
+  op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update);
+}
+
+function endOperation_R2(op) {
+  var cm = op.cm, display = cm.display;
+  if (op.updatedDisplay) { updateHeightsInViewport(cm); }
+
+  op.barMeasure = measureForScrollbars(cm);
+
+  // If the max line changed since it was last measured, measure it,
+  // and ensure the document's width matches it.
+  // updateDisplay_W2 will use these properties to do the actual resizing
+  if (display.maxLineChanged && !cm.options.lineWrapping) {
+    op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3;
+    cm.display.sizerWidth = op.adjustWidthTo;
+    op.barMeasure.scrollWidth =
+      Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth);
+    op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm));
+  }
+
+  if (op.updatedDisplay || op.selectionChanged)
+    { op.preparedSelection = display.input.prepareSelection(op.focus); }
+}
+
+function endOperation_W2(op) {
+  var cm = op.cm;
+
+  if (op.adjustWidthTo != null) {
+    cm.display.sizer.style.minWidth = op.adjustWidthTo + "px";
+    if (op.maxScrollLeft < cm.doc.scrollLeft)
+      { setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true); }
+    cm.display.maxLineChanged = false;
+  }
+
+  var takeFocus = op.focus && op.focus == activeElt() && (!document.hasFocus || document.hasFocus());
+  if (op.preparedSelection)
+    { cm.display.input.showSelection(op.preparedSelection, takeFocus); }
+  if (op.updatedDisplay || op.startHeight != cm.doc.height)
+    { updateScrollbars(cm, op.barMeasure); }
+  if (op.updatedDisplay)
+    { setDocumentHeight(cm, op.barMeasure); }
+
+  if (op.selectionChanged) { restartBlink(cm); }
+
+  if (cm.state.focused && op.updateInput)
+    { cm.display.input.reset(op.typing); }
+  if (takeFocus) { ensureFocus(op.cm); }
+}
+
+function endOperation_finish(op) {
+  var cm = op.cm, display = cm.display, doc = cm.doc;
+
+  if (op.updatedDisplay) { postUpdateDisplay(cm, op.update); }
+
+  // Abort mouse wheel delta measurement, when scrolling explicitly
+  if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos))
+    { display.wheelStartX = display.wheelStartY = null; }
+
+  // Propagate the scroll position to the actual DOM scroller
+  if (op.scrollTop != null) { setScrollTop(cm, op.scrollTop, op.forceScroll); }
+
+  if (op.scrollLeft != null) { setScrollLeft(cm, op.scrollLeft, true, true); }
+  // If we need to scroll a specific position into view, do so.
+  if (op.scrollToPos) {
+    var rect = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from),
+                                 clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin);
+    maybeScrollWindow(cm, rect);
+  }
+
+  // Fire events for markers that are hidden/unidden by editing or
+  // undoing
+  var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers;
+  if (hidden) { for (var i = 0; i < hidden.length; ++i)
+    { if (!hidden[i].lines.length) { signal(hidden[i], "hide"); } } }
+  if (unhidden) { for (var i$1 = 0; i$1 < unhidden.length; ++i$1)
+    { if (unhidden[i$1].lines.length) { signal(unhidden[i$1], "unhide"); } } }
+
+  if (display.wrapper.offsetHeight)
+    { doc.scrollTop = cm.display.scroller.scrollTop; }
+
+  // Fire change events, and delayed event handlers
+  if (op.changeObjs)
+    { signal(cm, "changes", cm, op.changeObjs); }
+  if (op.update)
+    { op.update.finish(); }
+}
+
+// Run the given function in an operation
+function runInOp(cm, f) {
+  if (cm.curOp) { return f() }
+  startOperation(cm);
+  try { return f() }
+  finally { endOperation(cm); }
+}
+// Wraps a function in an operation. Returns the wrapped function.
+function operation(cm, f) {
+  return function() {
+    if (cm.curOp) { return f.apply(cm, arguments) }
+    startOperation(cm);
+    try { return f.apply(cm, arguments) }
+    finally { endOperation(cm); }
+  }
+}
+// Used to add methods to editor and doc instances, wrapping them in
+// operations.
+function methodOp(f) {
+  return function() {
+    if (this.curOp) { return f.apply(this, arguments) }
+    startOperation(this);
+    try { return f.apply(this, arguments) }
+    finally { endOperation(this); }
+  }
+}
+function docMethodOp(f) {
+  return function() {
+    var cm = this.cm;
+    if (!cm || cm.curOp) { return f.apply(this, arguments) }
+    startOperation(cm);
+    try { return f.apply(this, arguments) }
+    finally { endOperation(cm); }
+  }
+}
+
+// Updates the display.view data structure for a given change to the
+// document. From and to are in pre-change coordinates. Lendiff is
+// the amount of lines added or subtracted by the change. This is
+// used for changes that span multiple lines, or change the way
+// lines are divided into visual lines. regLineChange (below)
+// registers single-line changes.
+function regChange(cm, from, to, lendiff) {
+  if (from == null) { from = cm.doc.first; }
+  if (to == null) { to = cm.doc.first + cm.doc.size; }
+  if (!lendiff) { lendiff = 0; }
+
+  var display = cm.display;
+  if (lendiff && to < display.viewTo &&
+      (display.updateLineNumbers == null || display.updateLineNumbers > from))
+    { display.updateLineNumbers = from; }
+
+  cm.curOp.viewChanged = true;
+
+  if (from >= display.viewTo) { // Change after
+    if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo)
+      { resetView(cm); }
+  } else if (to <= display.viewFrom) { // Change before
+    if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) {
+      resetView(cm);
+    } else {
+      display.viewFrom += lendiff;
+      display.viewTo += lendiff;
+    }
+  } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap
+    resetView(cm);
+  } else if (from <= display.viewFrom) { // Top overlap
+    var cut = viewCuttingPoint(cm, to, to + lendiff, 1);
+    if (cut) {
+      display.view = display.view.slice(cut.index);
+      display.viewFrom = cut.lineN;
+      display.viewTo += lendiff;
+    } else {
+      resetView(cm);
+    }
+  } else if (to >= display.viewTo) { // Bottom overlap
+    var cut$1 = viewCuttingPoint(cm, from, from, -1);
+    if (cut$1) {
+      display.view = display.view.slice(0, cut$1.index);
+      display.viewTo = cut$1.lineN;
+    } else {
+      resetView(cm);
+    }
+  } else { // Gap in the middle
+    var cutTop = viewCuttingPoint(cm, from, from, -1);
+    var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1);
+    if (cutTop && cutBot) {
+      display.view = display.view.slice(0, cutTop.index)
+        .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN))
+        .concat(display.view.slice(cutBot.index));
+      display.viewTo += lendiff;
+    } else {
+      resetView(cm);
+    }
+  }
+
+  var ext = display.externalMeasured;
+  if (ext) {
+    if (to < ext.lineN)
+      { ext.lineN += lendiff; }
+    else if (from < ext.lineN + ext.size)
+      { display.externalMeasured = null; }
+  }
+}
+
+// Register a change to a single line. Type must be one of "text",
+// "gutter", "class", "widget"
+function regLineChange(cm, line, type) {
+  cm.curOp.viewChanged = true;
+  var display = cm.display, ext = cm.display.externalMeasured;
+  if (ext && line >= ext.lineN && line < ext.lineN + ext.size)
+    { display.externalMeasured = null; }
+
+  if (line < display.viewFrom || line >= display.viewTo) { return }
+  var lineView = display.view[findViewIndex(cm, line)];
+  if (lineView.node == null) { return }
+  var arr = lineView.changes || (lineView.changes = []);
+  if (indexOf(arr, type) == -1) { arr.push(type); }
+}
+
+// Clear the view.
+function resetView(cm) {
+  cm.display.viewFrom = cm.display.viewTo = cm.doc.first;
+  cm.display.view = [];
+  cm.display.viewOffset = 0;
+}
+
+function viewCuttingPoint(cm, oldN, newN, dir) {
+  var index = findViewIndex(cm, oldN), diff, view = cm.display.view;
+  if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size)
+    { return {index: index, lineN: newN} }
+  var n = cm.display.viewFrom;
+  for (var i = 0; i < index; i++)
+    { n += view[i].size; }
+  if (n != oldN) {
+    if (dir > 0) {
+      if (index == view.length - 1) { return null }
+      diff = (n + view[index].size) - oldN;
+      index++;
+    } else {
+      diff = n - oldN;
+    }
+    oldN += diff; newN += diff;
+  }
+  while (visualLineNo(cm.doc, newN) != newN) {
+    if (index == (dir < 0 ? 0 : view.length - 1)) { return null }
+    newN += dir * view[index - (dir < 0 ? 1 : 0)].size;
+    index += dir;
+  }
+  return {index: index, lineN: newN}
+}
+
+// Force the view to cover a given range, adding empty view element
+// or clipping off existing ones as needed.
+function adjustView(cm, from, to) {
+  var display = cm.display, view = display.view;
+  if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) {
+    display.view = buildViewArray(cm, from, to);
+    display.viewFrom = from;
+  } else {
+    if (display.viewFrom > from)
+      { display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view); }
+    else if (display.viewFrom < from)
+      { display.view = display.view.slice(findViewIndex(cm, from)); }
+    display.viewFrom = from;
+    if (display.viewTo < to)
+      { display.view = display.view.concat(buildViewArray(cm, display.viewTo, to)); }
+    else if (display.viewTo > to)
+      { display.view = display.view.slice(0, findViewIndex(cm, to)); }
+  }
+  display.viewTo = to;
+}
+
+// Count the number of lines in the view whose DOM representation is
+// out of date (or nonexistent).
+function countDirtyView(cm) {
+  var view = cm.display.view, dirty = 0;
+  for (var i = 0; i < view.length; i++) {
+    var lineView = view[i];
+    if (!lineView.hidden && (!lineView.node || lineView.changes)) { ++dirty; }
+  }
+  return dirty
+}
+
+// HIGHLIGHT WORKER
+
+function startWorker(cm, time) {
+  if (cm.doc.highlightFrontier < cm.display.viewTo)
+    { cm.state.highlight.set(time, bind(highlightWorker, cm)); }
+}
+
+function highlightWorker(cm) {
+  var doc = cm.doc;
+  if (doc.highlightFrontier >= cm.display.viewTo) { return }
+  var end = +new Date + cm.options.workTime;
+  var context = getContextBefore(cm, doc.highlightFrontier);
+  var changedLines = [];
+
+  doc.iter(context.line, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function (line) {
+    if (context.line >= cm.display.viewFrom) { // Visible
+      var oldStyles = line.styles;
+      var resetState = line.text.length > cm.options.maxHighlightLength ? copyState(doc.mode, context.state) : null;
+      var highlighted = highlightLine(cm, line, context, true);
+      if (resetState) { context.state = resetState; }
+      line.styles = highlighted.styles;
+      var oldCls = line.styleClasses, newCls = highlighted.classes;
+      if (newCls) { line.styleClasses = newCls; }
+      else if (oldCls) { line.styleClasses = null; }
+      var ischange = !oldStyles || oldStyles.length != line.styles.length ||
+        oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass);
+      for (var i = 0; !ischange && i < oldStyles.length; ++i) { ischange = oldStyles[i] != line.styles[i]; }
+      if (ischange) { changedLines.push(context.line); }
+      line.stateAfter = context.save();
+      context.nextLine();
+    } else {
+      if (line.text.length <= cm.options.maxHighlightLength)
+        { processLine(cm, line.text, context); }
+      line.stateAfter = context.line % 5 == 0 ? context.save() : null;
+      context.nextLine();
+    }
+    if (+new Date > end) {
+      startWorker(cm, cm.options.workDelay);
+      return true
+    }
+  });
+  doc.highlightFrontier = context.line;
+  doc.modeFrontier = Math.max(doc.modeFrontier, context.line);
+  if (changedLines.length) { runInOp(cm, function () {
+    for (var i = 0; i < changedLines.length; i++)
+      { regLineChange(cm, changedLines[i], "text"); }
+  }); }
+}
+
+// DISPLAY DRAWING
+
+var DisplayUpdate = function(cm, viewport, force) {
+  var display = cm.display;
+
+  this.viewport = viewport;
+  // Store some values that we'll need later (but don't want to force a relayout for)
+  this.visible = visibleLines(display, cm.doc, viewport);
+  this.editorIsHidden = !display.wrapper.offsetWidth;
+  this.wrapperHeight = display.wrapper.clientHeight;
+  this.wrapperWidth = display.wrapper.clientWidth;
+  this.oldDisplayWidth = displayWidth(cm);
+  this.force = force;
+  this.dims = getDimensions(cm);
+  this.events = [];
+};
+
+DisplayUpdate.prototype.signal = function (emitter, type) {
+  if (hasHandler(emitter, type))
+    { this.events.push(arguments); }
+};
+DisplayUpdate.prototype.finish = function () {
+    var this$1 = this;
+
+  for (var i = 0; i < this.events.length; i++)
+    { signal.apply(null, this$1.events[i]); }
+};
+
+function maybeClipScrollbars(cm) {
+  var display = cm.display;
+  if (!display.scrollbarsClipped && display.scroller.offsetWidth) {
+    display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth;
+    display.heightForcer.style.height = scrollGap(cm) + "px";
+    display.sizer.style.marginBottom = -display.nativeBarWidth + "px";
+    display.sizer.style.borderRightWidth = scrollGap(cm) + "px";
+    display.scrollbarsClipped = true;
+  }
+}
+
+function selectionSnapshot(cm) {
+  if (cm.hasFocus()) { return null }
+  var active = activeElt();
+  if (!active || !contains(cm.display.lineDiv, active)) { return null }
+  var result = {activeElt: active};
+  if (window.getSelection) {
+    var sel = window.getSelection();
+    if (sel.anchorNode && sel.extend && contains(cm.display.lineDiv, sel.anchorNode)) {
+      result.anchorNode = sel.anchorNode;
+      result.anchorOffset = sel.anchorOffset;
+      result.focusNode = sel.focusNode;
+      result.focusOffset = sel.focusOffset;
+    }
+  }
+  return result
+}
+
+function restoreSelection(snapshot) {
+  if (!snapshot || !snapshot.activeElt || snapshot.activeElt == activeElt()) { return }
+  snapshot.activeElt.focus();
+  if (snapshot.anchorNode && contains(document.body, snapshot.anchorNode) && contains(document.body, snapshot.focusNode)) {
+    var sel = window.getSelection(), range$$1 = document.createRange();
+    range$$1.setEnd(snapshot.anchorNode, snapshot.anchorOffset);
+    range$$1.collapse(false);
+    sel.removeAllRanges();
+    sel.addRange(range$$1);
+    sel.extend(snapshot.focusNode, snapshot.focusOffset);
+  }
+}
+
+// Does the actual updating of the line display. Bails out
+// (returning false) when there is nothing to be done and forced is
+// false.
+function updateDisplayIfNeeded(cm, update) {
+  var display = cm.display, doc = cm.doc;
+
+  if (update.editorIsHidden) {
+    resetView(cm);
+    return false
+  }
+
+  // Bail out if the visible area is already rendered and nothing changed.
+  if (!update.force &&
+      update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo &&
+      (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) &&
+      display.renderedView == display.view && countDirtyView(cm) == 0)
+    { return false }
+
+  if (maybeUpdateLineNumberWidth(cm)) {
+    resetView(cm);
+    update.dims = getDimensions(cm);
+  }
+
+  // Compute a suitable new viewport (from & to)
+  var end = doc.first + doc.size;
+  var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first);
+  var to = Math.min(end, update.visible.to + cm.options.viewportMargin);
+  if (display.viewFrom < from && from - display.viewFrom < 20) { from = Math.max(doc.first, display.viewFrom); }
+  if (display.viewTo > to && display.viewTo - to < 20) { to = Math.min(end, display.viewTo); }
+  if (sawCollapsedSpans) {
+    from = visualLineNo(cm.doc, from);
+    to = visualLineEndNo(cm.doc, to);
+  }
+
+  var different = from != display.viewFrom || to != display.viewTo ||
+    display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth;
+  adjustView(cm, from, to);
+
+  display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom));
+  // Position the mover div to align with the current scroll position
+  cm.display.mover.style.top = display.viewOffset + "px";
+
+  var toUpdate = countDirtyView(cm);
+  if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view &&
+      (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo))
+    { return false }
+
+  // For big changes, we hide the enclosing element during the
+  // update, since that speeds up the operations on most browsers.
+  var selSnapshot = selectionSnapshot(cm);
+  if (toUpdate > 4) { display.lineDiv.style.display = "none"; }
+  patchDisplay(cm, display.updateLineNumbers, update.dims);
+  if (toUpdate > 4) { display.lineDiv.style.display = ""; }
+  display.renderedView = display.view;
+  // There might have been a widget with a focused element that got
+  // hidden or updated, if so re-focus it.
+  restoreSelection(selSnapshot);
+
+  // Prevent selection and cursors from interfering with the scroll
+  // width and height.
+  removeChildren(display.cursorDiv);
+  removeChildren(display.selectionDiv);
+  display.gutters.style.height = display.sizer.style.minHeight = 0;
+
+  if (different) {
+    display.lastWrapHeight = update.wrapperHeight;
+    display.lastWrapWidth = update.wrapperWidth;
+    startWorker(cm, 400);
+  }
+
+  display.updateLineNumbers = null;
+
+  return true
+}
+
+function postUpdateDisplay(cm, update) {
+  var viewport = update.viewport;
+
+  for (var first = true;; first = false) {
+    if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) {
+      // Clip forced viewport to actual scrollable area.
+      if (viewport && viewport.top != null)
+        { viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)}; }
+      // Updated line heights might result in the drawn area not
+      // actually covering the viewport. Keep looping until it does.
+      update.visible = visibleLines(cm.display, cm.doc, viewport);
+      if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo)
+        { break }
+    }
+    if (!updateDisplayIfNeeded(cm, update)) { break }
+    updateHeightsInViewport(cm);
+    var barMeasure = measureForScrollbars(cm);
+    updateSelection(cm);
+    updateScrollbars(cm, barMeasure);
+    setDocumentHeight(cm, barMeasure);
+    update.force = false;
+  }
+
+  update.signal(cm, "update", cm);
+  if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) {
+    update.signal(cm, "viewportChange", cm, cm.display.viewFrom, cm.display.viewTo);
+    cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo;
+  }
+}
+
+function updateDisplaySimple(cm, viewport) {
+  var update = new DisplayUpdate(cm, viewport);
+  if (updateDisplayIfNeeded(cm, update)) {
+    updateHeightsInViewport(cm);
+    postUpdateDisplay(cm, update);
+    var barMeasure = measureForScrollbars(cm);
+    updateSelection(cm);
+    updateScrollbars(cm, barMeasure);
+    setDocumentHeight(cm, barMeasure);
+    update.finish();
+  }
+}
+
+// Sync the actual display DOM structure with display.view, removing
+// nodes for lines that are no longer in view, and creating the ones
+// that are not there yet, and updating the ones that are out of
+// date.
+function patchDisplay(cm, updateNumbersFrom, dims) {
+  var display = cm.display, lineNumbers = cm.options.lineNumbers;
+  var container = display.lineDiv, cur = container.firstChild;
+
+  function rm(node) {
+    var next = node.nextSibling;
+    // Works around a throw-scroll bug in OS X Webkit
+    if (webkit && mac && cm.display.currentWheelTarget == node)
+      { node.style.display = "none"; }
+    else
+      { node.parentNode.removeChild(node); }
+    return next
+  }
+
+  var view = display.view, lineN = display.viewFrom;
+  // Loop over the elements in the view, syncing cur (the DOM nodes
+  // in display.lineDiv) with the view as we go.
+  for (var i = 0; i < view.length; i++) {
+    var lineView = view[i];
+    if (lineView.hidden) {
+    } else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet
+      var node = buildLineElement(cm, lineView, lineN, dims);
+      container.insertBefore(node, cur);
+    } else { // Already drawn
+      while (cur != lineView.node) { cur = rm(cur); }
+      var updateNumber = lineNumbers && updateNumbersFrom != null &&
+        updateNumbersFrom <= lineN && lineView.lineNumber;
+      if (lineView.changes) {
+        if (indexOf(lineView.changes, "gutter") > -1) { updateNumber = false; }
+        updateLineForChanges(cm, lineView, lineN, dims);
+      }
+      if (updateNumber) {
+        removeChildren(lineView.lineNumber);
+        lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN)));
+      }
+      cur = lineView.node.nextSibling;
+    }
+    lineN += lineView.size;
+  }
+  while (cur) { cur = rm(cur); }
+}
+
+function updateGutterSpace(cm) {
+  var width = cm.display.gutters.offsetWidth;
+  cm.display.sizer.style.marginLeft = width + "px";
+}
+
+function setDocumentHeight(cm, measure) {
+  cm.display.sizer.style.minHeight = measure.docHeight + "px";
+  cm.display.heightForcer.style.top = measure.docHeight + "px";
+  cm.display.gutters.style.height = (measure.docHeight + cm.display.barHeight + scrollGap(cm)) + "px";
+}
+
+// Rebuild the gutter elements, ensure the margin to the left of the
+// code matches their width.
+function updateGutters(cm) {
+  var gutters = cm.display.gutters, specs = cm.options.gutters;
+  removeChildren(gutters);
+  var i = 0;
+  for (; i < specs.length; ++i) {
+    var gutterClass = specs[i];
+    var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + gutterClass));
+    if (gutterClass == "CodeMirror-linenumbers") {
+      cm.display.lineGutter = gElt;
+      gElt.style.width = (cm.display.lineNumWidth || 1) + "px";
+    }
+  }
+  gutters.style.display = i ? "" : "none";
+  updateGutterSpace(cm);
+}
+
+// Make sure the gutters options contains the element
+// "CodeMirror-linenumbers" when the lineNumbers option is true.
+function setGuttersForLineNumbers(options) {
+  var found = indexOf(options.gutters, "CodeMirror-linenumbers");
+  if (found == -1 && options.lineNumbers) {
+    options.gutters = options.gutters.concat(["CodeMirror-linenumbers"]);
+  } else if (found > -1 && !options.lineNumbers) {
+    options.gutters = options.gutters.slice(0);
+    options.gutters.splice(found, 1);
+  }
+}
+
+// Since the delta values reported on mouse wheel events are
+// unstandardized between browsers and even browser versions, and
+// generally horribly unpredictable, this code starts by measuring
+// the scroll effect that the first few mouse wheel events have,
+// and, from that, detects the way it can convert deltas to pixel
+// offsets afterwards.
+//
+// The reason we want to know the amount a wheel event will scroll
+// is that it gives us a chance to update the display before the
+// actual scrolling happens, reducing flickering.
+
+var wheelSamples = 0;
+var wheelPixelsPerUnit = null;
+// Fill in a browser-detected starting value on browsers where we
+// know one. These don't have to be accurate -- the result of them
+// being wrong would just be a slight flicker on the first wheel
+// scroll (if it is large enough).
+if (ie) { wheelPixelsPerUnit = -.53; }
+else if (gecko) { wheelPixelsPerUnit = 15; }
+else if (chrome) { wheelPixelsPerUnit = -.7; }
+else if (safari) { wheelPixelsPerUnit = -1/3; }
+
+function wheelEventDelta(e) {
+  var dx = e.wheelDeltaX, dy = e.wheelDeltaY;
+  if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) { dx = e.detail; }
+  if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) { dy = e.detail; }
+  else if (dy == null) { dy = e.wheelDelta; }
+  return {x: dx, y: dy}
+}
+function wheelEventPixels(e) {
+  var delta = wheelEventDelta(e);
+  delta.x *= wheelPixelsPerUnit;
+  delta.y *= wheelPixelsPerUnit;
+  return delta
+}
+
+function onScrollWheel(cm, e) {
+  var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y;
+
+  var display = cm.display, scroll = display.scroller;
+  // Quit if there's nothing to scroll here
+  var canScrollX = scroll.scrollWidth > scroll.clientWidth;
+  var canScrollY = scroll.scrollHeight > scroll.clientHeight;
+  if (!(dx && canScrollX || dy && canScrollY)) { return }
+
+  // Webkit browsers on OS X abort momentum scrolls when the target
+  // of the scroll event is removed from the scrollable element.
+  // This hack (see related code in patchDisplay) makes sure the
+  // element is kept around.
+  if (dy && mac && webkit) {
+    outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) {
+      for (var i = 0; i < view.length; i++) {
+        if (view[i].node == cur) {
+          cm.display.currentWheelTarget = cur;
+          break outer
+        }
+      }
+    }
+  }
+
+  // On some browsers, horizontal scrolling will cause redraws to
+  // happen before the gutter has been realigned, causing it to
+  // wriggle around in a most unseemly way. When we have an
+  // estimated pixels/delta value, we just handle horizontal
+  // scrolling entirely here. It'll be slightly off from native, but
+  // better than glitching out.
+  if (dx && !gecko && !presto && wheelPixelsPerUnit != null) {
+    if (dy && canScrollY)
+      { updateScrollTop(cm, Math.max(0, scroll.scrollTop + dy * wheelPixelsPerUnit)); }
+    setScrollLeft(cm, Math.max(0, scroll.scrollLeft + dx * wheelPixelsPerUnit));
+    // Only prevent default scrolling if vertical scrolling is
+    // actually possible. Otherwise, it causes vertical scroll
+    // jitter on OSX trackpads when deltaX is small and deltaY
+    // is large (issue #3579)
+    if (!dy || (dy && canScrollY))
+      { e_preventDefault(e); }
+    display.wheelStartX = null; // Abort measurement, if in progress
+    return
+  }
+
+  // 'Project' the visible viewport to cover the area that is being
+  // scrolled into view (if we know enough to estimate it).
+  if (dy && wheelPixelsPerUnit != null) {
+    var pixels = dy * wheelPixelsPerUnit;
+    var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight;
+    if (pixels < 0) { top = Math.max(0, top + pixels - 50); }
+    else { bot = Math.min(cm.doc.height, bot + pixels + 50); }
+    updateDisplaySimple(cm, {top: top, bottom: bot});
+  }
+
+  if (wheelSamples < 20) {
+    if (display.wheelStartX == null) {
+      display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop;
+      display.wheelDX = dx; display.wheelDY = dy;
+      setTimeout(function () {
+        if (display.wheelStartX == null) { return }
+        var movedX = scroll.scrollLeft - display.wheelStartX;
+        var movedY = scroll.scrollTop - display.wheelStartY;
+        var sample = (movedY && display.wheelDY && movedY / display.wheelDY) ||
+          (movedX && display.wheelDX && movedX / display.wheelDX);
+        display.wheelStartX = display.wheelStartY = null;
+        if (!sample) { return }
+        wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1);
+        ++wheelSamples;
+      }, 200);
+    } else {
+      display.wheelDX += dx; display.wheelDY += dy;
+    }
+  }
+}
+
+// Selection objects are immutable. A new one is created every time
+// the selection changes. A selection is one or more non-overlapping
+// (and non-touching) ranges, sorted, and an integer that indicates
+// which one is the primary selection (the one that's scrolled into
+// view, that getCursor returns, etc).
+var Selection = function(ranges, primIndex) {
+  this.ranges = ranges;
+  this.primIndex = primIndex;
+};
+
+Selection.prototype.primary = function () { return this.ranges[this.primIndex] };
+
+Selection.prototype.equals = function (other) {
+    var this$1 = this;
+
+  if (other == this) { return true }
+  if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) { return false }
+  for (var i = 0; i < this.ranges.length; i++) {
+    var here = this$1.ranges[i], there = other.ranges[i];
+    if (!equalCursorPos(here.anchor, there.anchor) || !equalCursorPos(here.head, there.head)) { return false }
+  }
+  return true
+};
+
+Selection.prototype.deepCopy = function () {
+    var this$1 = this;
+
+  var out = [];
+  for (var i = 0; i < this.ranges.length; i++)
+    { out[i] = new Range(copyPos(this$1.ranges[i].anchor), copyPos(this$1.ranges[i].head)); }
+  return new Selection(out, this.primIndex)
+};
+
+Selection.prototype.somethingSelected = function () {
+    var this$1 = this;
+
+  for (var i = 0; i < this.ranges.length; i++)
+    { if (!this$1.ranges[i].empty()) { return true } }
+  return false
+};
+
+Selection.prototype.contains = function (pos, end) {
+    var this$1 = this;
+
+  if (!end) { end = pos; }
+  for (var i = 0; i < this.ranges.length; i++) {
+    var range = this$1.ranges[i];
+    if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0)
+      { return i }
+  }
+  return -1
+};
+
+var Range = function(anchor, head) {
+  this.anchor = anchor; this.head = head;
+};
+
+Range.prototype.from = function () { return minPos(this.anchor, this.head) };
+Range.prototype.to = function () { return maxPos(this.anchor, this.head) };
+Range.prototype.empty = function () { return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch };
+
+// Take an unsorted, potentially overlapping set of ranges, and
+// build a selection out of it. 'Consumes' ranges array (modifying
+// it).
+function normalizeSelection(ranges, primIndex) {
+  var prim = ranges[primIndex];
+  ranges.sort(function (a, b) { return cmp(a.from(), b.from()); });
+  primIndex = indexOf(ranges, prim);
+  for (var i = 1; i < ranges.length; i++) {
+    var cur = ranges[i], prev = ranges[i - 1];
+    if (cmp(prev.to(), cur.from()) >= 0) {
+      var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to());
+      var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head;
+      if (i <= primIndex) { --primIndex; }
+      ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to));
+    }
+  }
+  return new Selection(ranges, primIndex)
+}
+
+function simpleSelection(anchor, head) {
+  return new Selection([new Range(anchor, head || anchor)], 0)
+}
+
+// Compute the position of the end of a change (its 'to' property
+// refers to the pre-change end).
+function changeEnd(change) {
+  if (!change.text) { return change.to }
+  return Pos(change.from.line + change.text.length - 1,
+             lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0))
+}
+
+// Adjust a position to refer to the post-change position of the
+// same text, or the end of the change if the change covers it.
+function adjustForChange(pos, change) {
+  if (cmp(pos, change.from) < 0) { return pos }
+  if (cmp(pos, change.to) <= 0) { return changeEnd(change) }
+
+  var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch;
+  if (pos.line == change.to.line) { ch += changeEnd(change).ch - change.to.ch; }
+  return Pos(line, ch)
+}
+
+function computeSelAfterChange(doc, change) {
+  var out = [];
+  for (var i = 0; i < doc.sel.ranges.length; i++) {
+    var range = doc.sel.ranges[i];
+    out.push(new Range(adjustForChange(range.anchor, change),
+                       adjustForChange(range.head, change)));
+  }
+  return normalizeSelection(out, doc.sel.primIndex)
+}
+
+function offsetPos(pos, old, nw) {
+  if (pos.line == old.line)
+    { return Pos(nw.line, pos.ch - old.ch + nw.ch) }
+  else
+    { return Pos(nw.line + (pos.line - old.line), pos.ch) }
+}
+
+// Used by replaceSelections to allow moving the selection to the
+// start or around the replaced test. Hint may be "start" or "around".
+function computeReplacedSel(doc, changes, hint) {
+  var out = [];
+  var oldPrev = Pos(doc.first, 0), newPrev = oldPrev;
+  for (var i = 0; i < changes.length; i++) {
+    var change = changes[i];
+    var from = offsetPos(change.from, oldPrev, newPrev);
+    var to = offsetPos(changeEnd(change), oldPrev, newPrev);
+    oldPrev = change.to;
+    newPrev = to;
+    if (hint == "around") {
+      var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0;
+      out[i] = new Range(inv ? to : from, inv ? from : to);
+    } else {
+      out[i] = new Range(from, from);
+    }
+  }
+  return new Selection(out, doc.sel.primIndex)
+}
+
+// Used to get the editor into a consistent state again when options change.
+
+function loadMode(cm) {
+  cm.doc.mode = getMode(cm.options, cm.doc.modeOption);
+  resetModeState(cm);
+}
+
+function resetModeState(cm) {
+  cm.doc.iter(function (line) {
+    if (line.stateAfter) { line.stateAfter = null; }
+    if (line.styles) { line.styles = null; }
+  });
+  cm.doc.modeFrontier = cm.doc.highlightFrontier = cm.doc.first;
+  startWorker(cm, 100);
+  cm.state.modeGen++;
+  if (cm.curOp) { regChange(cm); }
+}
+
+// DOCUMENT DATA STRUCTURE
+
+// By default, updates that start and end at the beginning of a line
+// are treated specially, in order to make the association of line
+// widgets and marker elements with the text behave more intuitive.
+function isWholeLineUpdate(doc, change) {
+  return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == "" &&
+    (!doc.cm || doc.cm.options.wholeLineUpdateBefore)
+}
+
+// Perform a change on the document data structure.
+function updateDoc(doc, change, markedSpans, estimateHeight$$1) {
+  function spansFor(n) {return markedSpans ? markedSpans[n] : null}
+  function update(line, text, spans) {
+    updateLine(line, text, spans, estimateHeight$$1);
+    signalLater(line, "change", line, change);
+  }
+  function linesFor(start, end) {
+    var result = [];
+    for (var i = start; i < end; ++i)
+      { result.push(new Line(text[i], spansFor(i), estimateHeight$$1)); }
+    return result
+  }
+
+  var from = change.from, to = change.to, text = change.text;
+  var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line);
+  var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line;
+
+  // Adjust the line structure
+  if (change.full) {
+    doc.insert(0, linesFor(0, text.length));
+    doc.remove(text.length, doc.size - text.length);
+  } else if (isWholeLineUpdate(doc, change)) {
+    // This is a whole-line replace. Treated specially to make
+    // sure line objects move the way they are supposed to.
+    var added = linesFor(0, text.length - 1);
+    update(lastLine, lastLine.text, lastSpans);
+    if (nlines) { doc.remove(from.line, nlines); }
+    if (added.length) { doc.insert(from.line, added); }
+  } else if (firstLine == lastLine) {
+    if (text.length == 1) {
+      update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans);
+    } else {
+      var added$1 = linesFor(1, text.length - 1);
+      added$1.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight$$1));
+      update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));
+      doc.insert(from.line + 1, added$1);
+    }
+  } else if (text.length == 1) {
+    update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0));
+    doc.remove(from.line + 1, nlines);
+  } else {
+    update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));
+    update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans);
+    var added$2 = linesFor(1, text.length - 1);
+    if (nlines > 1) { doc.remove(from.line + 1, nlines - 1); }
+    doc.insert(from.line + 1, added$2);
+  }
+
+  signalLater(doc, "change", doc, change);
+}
+
+// Call f for all linked documents.
+function linkedDocs(doc, f, sharedHistOnly) {
+  function propagate(doc, skip, sharedHist) {
+    if (doc.linked) { for (var i = 0; i < doc.linked.length; ++i) {
+      var rel = doc.linked[i];
+      if (rel.doc == skip) { continue }
+      var shared = sharedHist && rel.sharedHist;
+      if (sharedHistOnly && !shared) { continue }
+      f(rel.doc, shared);
+      propagate(rel.doc, doc, shared);
+    } }
+  }
+  propagate(doc, null, true);
+}
+
+// Attach a document to an editor.
+function attachDoc(cm, doc) {
+  if (doc.cm) { throw new Error("This document is already in use.") }
+  cm.doc = doc;
+  doc.cm = cm;
+  estimateLineHeights(cm);
+  loadMode(cm);
+  setDirectionClass(cm);
+  if (!cm.options.lineWrapping) { findMaxLine(cm); }
+  cm.options.mode = doc.modeOption;
+  regChange(cm);
+}
+
+function setDirectionClass(cm) {
+  (cm.doc.direction == "rtl" ? addClass : rmClass)(cm.display.lineDiv, "CodeMirror-rtl");
+}
+
+function directionChanged(cm) {
+  runInOp(cm, function () {
+    setDirectionClass(cm);
+    regChange(cm);
+  });
+}
+
+function History(startGen) {
+  // Arrays of change events and selections. Doing something adds an
+  // event to done and clears undo. Undoing moves events from done
+  // to undone, redoing moves them in the other direction.
+  this.done = []; this.undone = [];
+  this.undoDepth = Infinity;
+  // Used to track when changes can be merged into a single undo
+  // event
+  this.lastModTime = this.lastSelTime = 0;
+  this.lastOp = this.lastSelOp = null;
+  this.lastOrigin = this.lastSelOrigin = null;
+  // Used by the isClean() method
+  this.generation = this.maxGeneration = startGen || 1;
+}
+
+// Create a history change event from an updateDoc-style change
+// object.
+function historyChangeFromChange(doc, change) {
+  var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)};
+  attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);
+  linkedDocs(doc, function (doc) { return attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); }, true);
+  return histChange
+}
+
+// Pop all selection events off the end of a history array. Stop at
+// a change event.
+function clearSelectionEvents(array) {
+  while (array.length) {
+    var last = lst(array);
+    if (last.ranges) { array.pop(); }
+    else { break }
+  }
+}
+
+// Find the top change event in the history. Pop off selection
+// events that are in the way.
+function lastChangeEvent(hist, force) {
+  if (force) {
+    clearSelectionEvents(hist.done);
+    return lst(hist.done)
+  } else if (hist.done.length && !lst(hist.done).ranges) {
+    return lst(hist.done)
+  } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) {
+    hist.done.pop();
+    return lst(hist.done)
+  }
+}
+
+// Register a change in the history. Merges changes that are within
+// a single operation, or are close together with an origin that
+// allows merging (starting with "+") into a single event.
+function addChangeToHistory(doc, change, selAfter, opId) {
+  var hist = doc.history;
+  hist.undone.length = 0;
+  var time = +new Date, cur;
+  var last;
+
+  if ((hist.lastOp == opId ||
+       hist.lastOrigin == change.origin && change.origin &&
+       ((change.origin.charAt(0) == "+" && doc.cm && hist.lastModTime > time - doc.cm.options.historyEventDelay) ||
+        change.origin.charAt(0) == "*")) &&
+      (cur = lastChangeEvent(hist, hist.lastOp == opId))) {
+    // Merge this change into the last event
+    last = lst(cur.changes);
+    if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) {
+      // Optimized case for simple insertion -- don't want to add
+      // new changesets for every character typed
+      last.to = changeEnd(change);
+    } else {
+      // Add new sub-event
+      cur.changes.push(historyChangeFromChange(doc, change));
+    }
+  } else {
+    // Can not be merged, start a new event.
+    var before = lst(hist.done);
+    if (!before || !before.ranges)
+      { pushSelectionToHistory(doc.sel, hist.done); }
+    cur = {changes: [historyChangeFromChange(doc, change)],
+           generation: hist.generation};
+    hist.done.push(cur);
+    while (hist.done.length > hist.undoDepth) {
+      hist.done.shift();
+      if (!hist.done[0].ranges) { hist.done.shift(); }
+    }
+  }
+  hist.done.push(selAfter);
+  hist.generation = ++hist.maxGeneration;
+  hist.lastModTime = hist.lastSelTime = time;
+  hist.lastOp = hist.lastSelOp = opId;
+  hist.lastOrigin = hist.lastSelOrigin = change.origin;
+
+  if (!last) { signal(doc, "historyAdded"); }
+}
+
+function selectionEventCanBeMerged(doc, origin, prev, sel) {
+  var ch = origin.charAt(0);
+  return ch == "*" ||
+    ch == "+" &&
+    prev.ranges.length == sel.ranges.length &&
+    prev.somethingSelected() == sel.somethingSelected() &&
+    new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500)
+}
+
+// Called whenever the selection changes, sets the new selection as
+// the pending selection in the history, and pushes the old pending
+// selection into the 'done' array when it was significantly
+// different (in number of selected ranges, emptiness, or time).
+function addSelectionToHistory(doc, sel, opId, options) {
+  var hist = doc.history, origin = options && options.origin;
+
+  // A new event is started when the previous origin does not match
+  // the current, or the origins don't allow matching. Origins
+  // starting with * are always merged, those starting with + are
+  // merged when similar and close together in time.
+  if (opId == hist.lastSelOp ||
+      (origin && hist.lastSelOrigin == origin &&
+       (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin ||
+        selectionEventCanBeMerged(doc, origin, lst(hist.done), sel))))
+    { hist.done[hist.done.length - 1] = sel; }
+  else
+    { pushSelectionToHistory(sel, hist.done); }
+
+  hist.lastSelTime = +new Date;
+  hist.lastSelOrigin = origin;
+  hist.lastSelOp = opId;
+  if (options && options.clearRedo !== false)
+    { clearSelectionEvents(hist.undone); }
+}
+
+function pushSelectionToHistory(sel, dest) {
+  var top = lst(dest);
+  if (!(top && top.ranges && top.equals(sel)))
+    { dest.push(sel); }
+}
+
+// Used to store marked span information in the history.
+function attachLocalSpans(doc, change, from, to) {
+  var existing = change["spans_" + doc.id], n = 0;
+  doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function (line) {
+    if (line.markedSpans)
+      { (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans; }
+    ++n;
+  });
+}
+
+// When un/re-doing restores text containing marked spans, those
+// that have been explicitly cleared should not be restored.
+function removeClearedSpans(spans) {
+  if (!spans) { return null }
+  var out;
+  for (var i = 0; i < spans.length; ++i) {
+    if (spans[i].marker.explicitlyCleared) { if (!out) { out = spans.slice(0, i); } }
+    else if (out) { out.push(spans[i]); }
+  }
+  return !out ? spans : out.length ? out : null
+}
+
+// Retrieve and filter the old marked spans stored in a change event.
+function getOldSpans(doc, change) {
+  var found = change["spans_" + doc.id];
+  if (!found) { return null }
+  var nw = [];
+  for (var i = 0; i < change.text.length; ++i)
+    { nw.push(removeClearedSpans(found[i])); }
+  return nw
+}
+
+// Used for un/re-doing changes from the history. Combines the
+// result of computing the existing spans with the set of spans that
+// existed in the history (so that deleting around a span and then
+// undoing brings back the span).
+function mergeOldSpans(doc, change) {
+  var old = getOldSpans(doc, change);
+  var stretched = stretchSpansOverChange(doc, change);
+  if (!old) { return stretched }
+  if (!stretched) { return old }
+
+  for (var i = 0; i < old.length; ++i) {
+    var oldCur = old[i], stretchCur = stretched[i];
+    if (oldCur && stretchCur) {
+      spans: for (var j = 0; j < stretchCur.length; ++j) {
+        var span = stretchCur[j];
+        for (var k = 0; k < oldCur.length; ++k)
+          { if (oldCur[k].marker == span.marker) { continue spans } }
+        oldCur.push(span);
+      }
+    } else if (stretchCur) {
+      old[i] = stretchCur;
+    }
+  }
+  return old
+}
+
+// Used both to provide a JSON-safe object in .getHistory, and, when
+// detaching a document, to split the history in two
+function copyHistoryArray(events, newGroup, instantiateSel) {
+  var copy = [];
+  for (var i = 0; i < events.length; ++i) {
+    var event = events[i];
+    if (event.ranges) {
+      copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event);
+      continue
+    }
+    var changes = event.changes, newChanges = [];
+    copy.push({changes: newChanges});
+    for (var j = 0; j < changes.length; ++j) {
+      var change = changes[j], m = (void 0);
+      newChanges.push({from: change.from, to: change.to, text: change.text});
+      if (newGroup) { for (var prop in change) { if (m = prop.match(/^spans_(\d+)$/)) {
+        if (indexOf(newGroup, Number(m[1])) > -1) {
+          lst(newChanges)[prop] = change[prop];
+          delete change[prop];
+        }
+      } } }
+    }
+  }
+  return copy
+}
+
+// The 'scroll' parameter given to many of these indicated whether
+// the new cursor position should be scrolled into view after
+// modifying the selection.
+
+// If shift is held or the extend flag is set, extends a range to
+// include a given position (and optionally a second position).
+// Otherwise, simply returns the range between the given positions.
+// Used for cursor motion and such.
+function extendRange(range, head, other, extend) {
+  if (extend) {
+    var anchor = range.anchor;
+    if (other) {
+      var posBefore = cmp(head, anchor) < 0;
+      if (posBefore != (cmp(other, anchor) < 0)) {
+        anchor = head;
+        head = other;
+      } else if (posBefore != (cmp(head, other) < 0)) {
+        head = other;
+      }
+    }
+    return new Range(anchor, head)
+  } else {
+    return new Range(other || head, head)
+  }
+}
+
+// Extend the primary selection range, discard the rest.
+function extendSelection(doc, head, other, options, extend) {
+  if (extend == null) { extend = doc.cm && (doc.cm.display.shift || doc.extend); }
+  setSelection(doc, new Selection([extendRange(doc.sel.primary(), head, other, extend)], 0), options);
+}
+
+// Extend all selections (pos is an array of selections with length
+// equal the number of selections)
+function extendSelections(doc, heads, options) {
+  var out = [];
+  var extend = doc.cm && (doc.cm.display.shift || doc.extend);
+  for (var i = 0; i < doc.sel.ranges.length; i++)
+    { out[i] = extendRange(doc.sel.ranges[i], heads[i], null, extend); }
+  var newSel = normalizeSelection(out, doc.sel.primIndex);
+  setSelection(doc, newSel, options);
+}
+
+// Updates a single range in the selection.
+function replaceOneSelection(doc, i, range, options) {
+  var ranges = doc.sel.ranges.slice(0);
+  ranges[i] = range;
+  setSelection(doc, normalizeSelection(ranges, doc.sel.primIndex), options);
+}
+
+// Reset the selection to a single range.
+function setSimpleSelection(doc, anchor, head, options) {
+  setSelection(doc, simpleSelection(anchor, head), options);
+}
+
+// Give beforeSelectionChange handlers a change to influence a
+// selection update.
+function filterSelectionChange(doc, sel, options) {
+  var obj = {
+    ranges: sel.ranges,
+    update: function(ranges) {
+      var this$1 = this;
+
+      this.ranges = [];
+      for (var i = 0; i < ranges.length; i++)
+        { this$1.ranges[i] = new Range(clipPos(doc, ranges[i].anchor),
+                                   clipPos(doc, ranges[i].head)); }
+    },
+    origin: options && options.origin
+  };
+  signal(doc, "beforeSelectionChange", doc, obj);
+  if (doc.cm) { signal(doc.cm, "beforeSelectionChange", doc.cm, obj); }
+  if (obj.ranges != sel.ranges) { return normalizeSelection(obj.ranges, obj.ranges.length - 1) }
+  else { return sel }
+}
+
+function setSelectionReplaceHistory(doc, sel, options) {
+  var done = doc.history.done, last = lst(done);
+  if (last && last.ranges) {
+    done[done.length - 1] = sel;
+    setSelectionNoUndo(doc, sel, options);
+  } else {
+    setSelection(doc, sel, options);
+  }
+}
+
+// Set a new selection.
+function setSelection(doc, sel, options) {
+  setSelectionNoUndo(doc, sel, options);
+  addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options);
+}
+
+function setSelectionNoUndo(doc, sel, options) {
+  if (hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange"))
+    { sel = filterSelectionChange(doc, sel, options); }
+
+  var bias = options && options.bias ||
+    (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1);
+  setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true));
+
+  if (!(options && options.scroll === false) && doc.cm)
+    { ensureCursorVisible(doc.cm); }
+}
+
+function setSelectionInner(doc, sel) {
+  if (sel.equals(doc.sel)) { return }
+
+  doc.sel = sel;
+
+  if (doc.cm) {
+    doc.cm.curOp.updateInput = doc.cm.curOp.selectionChanged = true;
+    signalCursorActivity(doc.cm);
+  }
+  signalLater(doc, "cursorActivity", doc);
+}
+
+// Verify that the selection does not partially select any atomic
+// marked ranges.
+function reCheckSelection(doc) {
+  setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false));
+}
+
+// Return a selection that does not partially select any atomic
+// ranges.
+function skipAtomicInSelection(doc, sel, bias, mayClear) {
+  var out;
+  for (var i = 0; i < sel.ranges.length; i++) {
+    var range = sel.ranges[i];
+    var old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i];
+    var newAnchor = skipAtomic(doc, range.anchor, old && old.anchor, bias, mayClear);
+    var newHead = skipAtomic(doc, range.head, old && old.head, bias, mayClear);
+    if (out || newAnchor != range.anchor || newHead != range.head) {
+      if (!out) { out = sel.ranges.slice(0, i); }
+      out[i] = new Range(newAnchor, newHead);
+    }
+  }
+  return out ? normalizeSelection(out, sel.primIndex) : sel
+}
+
+function skipAtomicInner(doc, pos, oldPos, dir, mayClear) {
+  var line = getLine(doc, pos.line);
+  if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) {
+    var sp = line.markedSpans[i], m = sp.marker;
+    if ((sp.from == null || (m.inclusiveLeft ? sp.from <= pos.ch : sp.from < pos.ch)) &&
+        (sp.to == null || (m.inclusiveRight ? sp.to >= pos.ch : sp.to > pos.ch))) {
+      if (mayClear) {
+        signal(m, "beforeCursorEnter");
+        if (m.explicitlyCleared) {
+          if (!line.markedSpans) { break }
+          else {--i; continue}
+        }
+      }
+      if (!m.atomic) { continue }
+
+      if (oldPos) {
+        var near = m.find(dir < 0 ? 1 : -1), diff = (void 0);
+        if (dir < 0 ? m.inclusiveRight : m.inclusiveLeft)
+          { near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null); }
+        if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0))
+          { return skipAtomicInner(doc, near, pos, dir, mayClear) }
+      }
+
+      var far = m.find(dir < 0 ? -1 : 1);
+      if (dir < 0 ? m.inclusiveLeft : m.inclusiveRight)
+        { far = movePos(doc, far, dir, far.line == pos.line ? line : null); }
+      return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null
+    }
+  } }
+  return pos
+}
+
+// Ensure a given position is not inside an atomic range.
+function skipAtomic(doc, pos, oldPos, bias, mayClear) {
+  var dir = bias || 1;
+  var found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) ||
+      (!mayClear && skipAtomicInner(doc, pos, oldPos, dir, true)) ||
+      skipAtomicInner(doc, pos, oldPos, -dir, mayClear) ||
+      (!mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true));
+  if (!found) {
+    doc.cantEdit = true;
+    return Pos(doc.first, 0)
+  }
+  return found
+}
+
+function movePos(doc, pos, dir, line) {
+  if (dir < 0 && pos.ch == 0) {
+    if (pos.line > doc.first) { return clipPos(doc, Pos(pos.line - 1)) }
+    else { return null }
+  } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) {
+    if (pos.line < doc.first + doc.size - 1) { return Pos(pos.line + 1, 0) }
+    else { return null }
+  } else {
+    return new Pos(pos.line, pos.ch + dir)
+  }
+}
+
+function selectAll(cm) {
+  cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll);
+}
+
+// UPDATING
+
+// Allow "beforeChange" event handlers to influence a change
+function filterChange(doc, change, update) {
+  var obj = {
+    canceled: false,
+    from: change.from,
+    to: change.to,
+    text: change.text,
+    origin: change.origin,
+    cancel: function () { return obj.canceled = true; }
+  };
+  if (update) { obj.update = function (from, to, text, origin) {
+    if (from) { obj.from = clipPos(doc, from); }
+    if (to) { obj.to = clipPos(doc, to); }
+    if (text) { obj.text = text; }
+    if (origin !== undefined) { obj.origin = origin; }
+  }; }
+  signal(doc, "beforeChange", doc, obj);
+  if (doc.cm) { signal(doc.cm, "beforeChange", doc.cm, obj); }
+
+  if (obj.canceled) { return null }
+  return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin}
+}
+
+// Apply a change to a document, and add it to the document's
+// history, and propagating it to all linked documents.
+function makeChange(doc, change, ignoreReadOnly) {
+  if (doc.cm) {
+    if (!doc.cm.curOp) { return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly) }
+    if (doc.cm.state.suppressEdits) { return }
+  }
+
+  if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) {
+    change = filterChange(doc, change, true);
+    if (!change) { return }
+  }
+
+  // Possibly split or suppress the update based on the presence
+  // of read-only spans in its range.
+  var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to);
+  if (split) {
+    for (var i = split.length - 1; i >= 0; --i)
+      { makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [""] : change.text}); }
+  } else {
+    makeChangeInner(doc, change);
+  }
+}
+
+function makeChangeInner(doc, change) {
+  if (change.text.length == 1 && change.text[0] == "" && cmp(change.from, change.to) == 0) { return }
+  var selAfter = computeSelAfterChange(doc, change);
+  addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN);
+
+  makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change));
+  var rebased = [];
+
+  linkedDocs(doc, function (doc, sharedHist) {
+    if (!sharedHist && indexOf(rebased, doc.history) == -1) {
+      rebaseHist(doc.history, change);
+      rebased.push(doc.history);
+    }
+    makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change));
+  });
+}
+
+// Revert a change stored in a document's history.
+function makeChangeFromHistory(doc, type, allowSelectionOnly) {
+  if (doc.cm && doc.cm.state.suppressEdits && !allowSelectionOnly) { return }
+
+  var hist = doc.history, event, selAfter = doc.sel;
+  var source = type == "undo" ? hist.done : hist.undone, dest = type == "undo" ? hist.undone : hist.done;
+
+  // Verify that there is a useable event (so that ctrl-z won't
+  // needlessly clear selection events)
+  var i = 0;
+  for (; i < source.length; i++) {
+    event = source[i];
+    if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges)
+      { break }
+  }
+  if (i == source.length) { return }
+  hist.lastOrigin = hist.lastSelOrigin = null;
+
+  for (;;) {
+    event = source.pop();
+    if (event.ranges) {
+      pushSelectionToHistory(event, dest);
+      if (allowSelectionOnly && !event.equals(doc.sel)) {
+        setSelection(doc, event, {clearRedo: false});
+        return
+      }
+      selAfter = event;
+    }
+    else { break }
+  }
+
+  // Build up a reverse change object to add to the opposite history
+  // stack (redo when undoing, and vice versa).
+  var antiChanges = [];
+  pushSelectionToHistory(selAfter, dest);
+  dest.push({changes: antiChanges, generation: hist.generation});
+  hist.generation = event.generation || ++hist.maxGeneration;
+
+  var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange");
+
+  var loop = function ( i ) {
+    var change = event.changes[i];
+    change.origin = type;
+    if (filter && !filterChange(doc, change, false)) {
+      source.length = 0;
+      return {}
+    }
+
+    antiChanges.push(historyChangeFromChange(doc, change));
+
+    var after = i ? computeSelAfterChange(doc, change) : lst(source);
+    makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change));
+    if (!i && doc.cm) { doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)}); }
+    var rebased = [];
+
+    // Propagate to the linked documents
+    linkedDocs(doc, function (doc, sharedHist) {
+      if (!sharedHist && indexOf(rebased, doc.history) == -1) {
+        rebaseHist(doc.history, change);
+        rebased.push(doc.history);
+      }
+      makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change));
+    });
+  };
+
+  for (var i$1 = event.changes.length - 1; i$1 >= 0; --i$1) {
+    var returned = loop( i$1 );
+
+    if ( returned ) return returned.v;
+  }
+}
+
+// Sub-views need their line numbers shifted when text is added
+// above or below them in the parent document.
+function shiftDoc(doc, distance) {
+  if (distance == 0) { return }
+  doc.first += distance;
+  doc.sel = new Selection(map(doc.sel.ranges, function (range) { return new Range(
+    Pos(range.anchor.line + distance, range.anchor.ch),
+    Pos(range.head.line + distance, range.head.ch)
+  ); }), doc.sel.primIndex);
+  if (doc.cm) {
+    regChange(doc.cm, doc.first, doc.first - distance, distance);
+    for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++)
+      { regLineChange(doc.cm, l, "gutter"); }
+  }
+}
+
+// More lower-level change function, handling only a single document
+// (not linked ones).
+function makeChangeSingleDoc(doc, change, selAfter, spans) {
+  if (doc.cm && !doc.cm.curOp)
+    { return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans) }
+
+  if (change.to.line < doc.first) {
+    shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line));
+    return
+  }
+  if (change.from.line > doc.lastLine()) { return }
+
+  // Clip the change to the size of this doc
+  if (change.from.line < doc.first) {
+    var shift = change.text.length - 1 - (doc.first - change.from.line);
+    shiftDoc(doc, shift);
+    change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch),
+              text: [lst(change.text)], origin: change.origin};
+  }
+  var last = doc.lastLine();
+  if (change.to.line > last) {
+    change = {from: change.from, to: Pos(last, getLine(doc, last).text.length),
+              text: [change.text[0]], origin: change.origin};
+  }
+
+  change.removed = getBetween(doc, change.from, change.to);
+
+  if (!selAfter) { selAfter = computeSelAfterChange(doc, change); }
+  if (doc.cm) { makeChangeSingleDocInEditor(doc.cm, change, spans); }
+  else { updateDoc(doc, change, spans); }
+  setSelectionNoUndo(doc, selAfter, sel_dontScroll);
+}
+
+// Handle the interaction of a change to a document with the editor
+// that this document is part of.
+function makeChangeSingleDocInEditor(cm, change, spans) {
+  var doc = cm.doc, display = cm.display, from = change.from, to = change.to;
+
+  var recomputeMaxLength = false, checkWidthStart = from.line;
+  if (!cm.options.lineWrapping) {
+    checkWidthStart = lineNo(visualLine(getLine(doc, from.line)));
+    doc.iter(checkWidthStart, to.line + 1, function (line) {
+      if (line == display.maxLine) {
+        recomputeMaxLength = true;
+        return true
+      }
+    });
+  }
+
+  if (doc.sel.contains(change.from, change.to) > -1)
+    { signalCursorActivity(cm); }
+
+  updateDoc(doc, change, spans, estimateHeight(cm));
+
+  if (!cm.options.lineWrapping) {
+    doc.iter(checkWidthStart, from.line + change.text.length, function (line) {
+      var len = lineLength(line);
+      if (len > display.maxLineLength) {
+        display.maxLine = line;
+        display.maxLineLength = len;
+        display.maxLineChanged = true;
+        recomputeMaxLength = false;
+      }
+    });
+    if (recomputeMaxLength) { cm.curOp.updateMaxLine = true; }
+  }
+
+  retreatFrontier(doc, from.line);
+  startWorker(cm, 400);
+
+  var lendiff = change.text.length - (to.line - from.line) - 1;
+  // Remember that these lines changed, for updating the display
+  if (change.full)
+    { regChange(cm); }
+  else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change))
+    { regLineChange(cm, from.line, "text"); }
+  else
+    { regChange(cm, from.line, to.line + 1, lendiff); }
+
+  var changesHandler = hasHandler(cm, "changes"), changeHandler = hasHandler(cm, "change");
+  if (changeHandler || changesHandler) {
+    var obj = {
+      from: from, to: to,
+      text: change.text,
+      removed: change.removed,
+      origin: change.origin
+    };
+    if (changeHandler) { signalLater(cm, "change", cm, obj); }
+    if (changesHandler) { (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj); }
+  }
+  cm.display.selForContextMenu = null;
+}
+
+function replaceRange(doc, code, from, to, origin) {
+  if (!to) { to = from; }
+  if (cmp(to, from) < 0) { var tmp = to; to = from; from = tmp; }
+  if (typeof code == "string") { code = doc.splitLines(code); }
+  makeChange(doc, {from: from, to: to, text: code, origin: origin});
+}
+
+// Rebasing/resetting history to deal with externally-sourced changes
+
+function rebaseHistSelSingle(pos, from, to, diff) {
+  if (to < pos.line) {
+    pos.line += diff;
+  } else if (from < pos.line) {
+    pos.line = from;
+    pos.ch = 0;
+  }
+}
+
+// Tries to rebase an array of history events given a change in the
+// document. If the change touches the same lines as the event, the
+// event, and everything 'behind' it, is discarded. If the change is
+// before the event, the event's positions are updated. Uses a
+// copy-on-write scheme for the positions, to avoid having to
+// reallocate them all on every rebase, but also avoid problems with
+// shared position objects being unsafely updated.
+function rebaseHistArray(array, from, to, diff) {
+  for (var i = 0; i < array.length; ++i) {
+    var sub = array[i], ok = true;
+    if (sub.ranges) {
+      if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; }
+      for (var j = 0; j < sub.ranges.length; j++) {
+        rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff);
+        rebaseHistSelSingle(sub.ranges[j].head, from, to, diff);
+      }
+      continue
+    }
+    for (var j$1 = 0; j$1 < sub.changes.length; ++j$1) {
+      var cur = sub.changes[j$1];
+      if (to < cur.from.line) {
+        cur.from = Pos(cur.from.line + diff, cur.from.ch);
+        cur.to = Pos(cur.to.line + diff, cur.to.ch);
+      } else if (from <= cur.to.line) {
+        ok = false;
+        break
+      }
+    }
+    if (!ok) {
+      array.splice(0, i + 1);
+      i = 0;
+    }
+  }
+}
+
+function rebaseHist(hist, change) {
+  var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1;
+  rebaseHistArray(hist.done, from, to, diff);
+  rebaseHistArray(hist.undone, from, to, diff);
+}
+
+// Utility for applying a change to a line by handle or number,
+// returning the number and optionally registering the line as
+// changed.
+function changeLine(doc, handle, changeType, op) {
+  var no = handle, line = handle;
+  if (typeof handle == "number") { line = getLine(doc, clipLine(doc, handle)); }
+  else { no = lineNo(handle); }
+  if (no == null) { return null }
+  if (op(line, no) && doc.cm) { regLineChange(doc.cm, no, changeType); }
+  return line
+}
+
+// The document is represented as a BTree consisting of leaves, with
+// chunk of lines in them, and branches, with up to ten leaves or
+// other branch nodes below them. The top node is always a branch
+// node, and is the document object itself (meaning it has
+// additional methods and properties).
+//
+// All nodes have parent links. The tree is used both to go from
+// line numbers to line objects, and to go from objects to numbers.
+// It also indexes by height, and is used to convert between height
+// and line object, and to find the total height of the document.
+//
+// See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html
+
+function LeafChunk(lines) {
+  var this$1 = this;
+
+  this.lines = lines;
+  this.parent = null;
+  var height = 0;
+  for (var i = 0; i < lines.length; ++i) {
+    lines[i].parent = this$1;
+    height += lines[i].height;
+  }
+  this.height = height;
+}
+
+LeafChunk.prototype = {
+  chunkSize: function chunkSize() { return this.lines.length },
+
+  // Remove the n lines at offset 'at'.
+  removeInner: function removeInner(at, n) {
+    var this$1 = this;
+
+    for (var i = at, e = at + n; i < e; ++i) {
+      var line = this$1.lines[i];
+      this$1.height -= line.height;
+      cleanUpLine(line);
+      signalLater(line, "delete");
+    }
+    this.lines.splice(at, n);
+  },
+
+  // Helper used to collapse a small branch into a single leaf.
+  collapse: function collapse(lines) {
+    lines.push.apply(lines, this.lines);
+  },
+
+  // Insert the given array of lines at offset 'at', count them as
+  // having the given height.
+  insertInner: function insertInner(at, lines, height) {
+    var this$1 = this;
+
+    this.height += height;
+    this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at));
+    for (var i = 0; i < lines.length; ++i) { lines[i].parent = this$1; }
+  },
+
+  // Used to iterate over a part of the tree.
+  iterN: function iterN(at, n, op) {
+    var this$1 = this;
+
+    for (var e = at + n; at < e; ++at)
+      { if (op(this$1.lines[at])) { return true } }
+  }
+};
+
+function BranchChunk(children) {
+  var this$1 = this;
+
+  this.children = children;
+  var size = 0, height = 0;
+  for (var i = 0; i < children.length; ++i) {
+    var ch = children[i];
+    size += ch.chunkSize(); height += ch.height;
+    ch.parent = this$1;
+  }
+  this.size = size;
+  this.height = height;
+  this.parent = null;
+}
+
+BranchChunk.prototype = {
+  chunkSize: function chunkSize() { return this.size },
+
+  removeInner: function removeInner(at, n) {
+    var this$1 = this;
+
+    this.size -= n;
+    for (var i = 0; i < this.children.length; ++i) {
+      var child = this$1.children[i], sz = child.chunkSize();
+      if (at < sz) {
+        var rm = Math.min(n, sz - at), oldHeight = child.height;
+        child.removeInner(at, rm);
+        this$1.height -= oldHeight - child.height;
+        if (sz == rm) { this$1.children.splice(i--, 1); child.parent = null; }
+        if ((n -= rm) == 0) { break }
+        at = 0;
+      } else { at -= sz; }
+    }
+    // If the result is smaller than 25 lines, ensure that it is a
+    // single leaf node.
+    if (this.size - n < 25 &&
+        (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) {
+      var lines = [];
+      this.collapse(lines);
+      this.children = [new LeafChunk(lines)];
+      this.children[0].parent = this;
+    }
+  },
+
+  collapse: function collapse(lines) {
+    var this$1 = this;
+
+    for (var i = 0; i < this.children.length; ++i) { this$1.children[i].collapse(lines); }
+  },
+
+  insertInner: function insertInner(at, lines, height) {
+    var this$1 = this;
+
+    this.size += lines.length;
+    this.height += height;
+    for (var i = 0; i < this.children.length; ++i) {
+      var child = this$1.children[i], sz = child.chunkSize();
+      if (at <= sz) {
+        child.insertInner(at, lines, height);
+        if (child.lines && child.lines.length > 50) {
+          // To avoid memory thrashing when child.lines is huge (e.g. first view of a large file), it's never spliced.
+          // Instead, small slices are taken. They're taken in order because sequential memory accesses are fastest.
+          var remaining = child.lines.length % 25 + 25;
+          for (var pos = remaining; pos < child.lines.length;) {
+            var leaf = new LeafChunk(child.lines.slice(pos, pos += 25));
+            child.height -= leaf.height;
+            this$1.children.splice(++i, 0, leaf);
+            leaf.parent = this$1;
+          }
+          child.lines = child.lines.slice(0, remaining);
+          this$1.maybeSpill();
+        }
+        break
+      }
+      at -= sz;
+    }
+  },
+
+  // When a node has grown, check whether it should be split.
+  maybeSpill: function maybeSpill() {
+    if (this.children.length <= 10) { return }
+    var me = this;
+    do {
+      var spilled = me.children.splice(me.children.length - 5, 5);
+      var sibling = new BranchChunk(spilled);
+      if (!me.parent) { // Become the parent node
+        var copy = new BranchChunk(me.children);
+        copy.parent = me;
+        me.children = [copy, sibling];
+        me = copy;
+     } else {
+        me.size -= sibling.size;
+        me.height -= sibling.height;
+        var myIndex = indexOf(me.parent.children, me);
+        me.parent.children.splice(myIndex + 1, 0, sibling);
+      }
+      sibling.parent = me.parent;
+    } while (me.children.length > 10)
+    me.parent.maybeSpill();
+  },
+
+  iterN: function iterN(at, n, op) {
+    var this$1 = this;
+
+    for (var i = 0; i < this.children.length; ++i) {
+      var child = this$1.children[i], sz = child.chunkSize();
+      if (at < sz) {
+        var used = Math.min(n, sz - at);
+        if (child.iterN(at, used, op)) { return true }
+        if ((n -= used) == 0) { break }
+        at = 0;
+      } else { at -= sz; }
+    }
+  }
+};
+
+// Line widgets are block elements displayed above or below a line.
+
+var LineWidget = function(doc, node, options) {
+  var this$1 = this;
+
+  if (options) { for (var opt in options) { if (options.hasOwnProperty(opt))
+    { this$1[opt] = options[opt]; } } }
+  this.doc = doc;
+  this.node = node;
+};
+
+LineWidget.prototype.clear = function () {
+    var this$1 = this;
+
+  var cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line);
+  if (no == null || !ws) { return }
+  for (var i = 0; i < ws.length; ++i) { if (ws[i] == this$1) { ws.splice(i--, 1); } }
+  if (!ws.length) { line.widgets = null; }
+  var height = widgetHeight(this);
+  updateLineHeight(line, Math.max(0, line.height - height));
+  if (cm) {
+    runInOp(cm, function () {
+      adjustScrollWhenAboveVisible(cm, line, -height);
+      regLineChange(cm, no, "widget");
+    });
+    signalLater(cm, "lineWidgetCleared", cm, this, no);
+  }
+};
+
+LineWidget.prototype.changed = function () {
+    var this$1 = this;
+
+  var oldH = this.height, cm = this.doc.cm, line = this.line;
+  this.height = null;
+  var diff = widgetHeight(this) - oldH;
+  if (!diff) { return }
+  updateLineHeight(line, line.height + diff);
+  if (cm) {
+    runInOp(cm, function () {
+      cm.curOp.forceUpdate = true;
+      adjustScrollWhenAboveVisible(cm, line, diff);
+      signalLater(cm, "lineWidgetChanged", cm, this$1, lineNo(line));
+    });
+  }
+};
+eventMixin(LineWidget);
+
+function adjustScrollWhenAboveVisible(cm, line, diff) {
+  if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop))
+    { addToScrollTop(cm, diff); }
+}
+
+function addLineWidget(doc, handle, node, options) {
+  var widget = new LineWidget(doc, node, options);
+  var cm = doc.cm;
+  if (cm && widget.noHScroll) { cm.display.alignWidgets = true; }
+  changeLine(doc, handle, "widget", function (line) {
+    var widgets = line.widgets || (line.widgets = []);
+    if (widget.insertAt == null) { widgets.push(widget); }
+    else { widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget); }
+    widget.line = line;
+    if (cm && !lineIsHidden(doc, line)) {
+      var aboveVisible = heightAtLine(line) < doc.scrollTop;
+      updateLineHeight(line, line.height + widgetHeight(widget));
+      if (aboveVisible) { addToScrollTop(cm, widget.height); }
+      cm.curOp.forceUpdate = true;
+    }
+    return true
+  });
+  signalLater(cm, "lineWidgetAdded", cm, widget, typeof handle == "number" ? handle : lineNo(handle));
+  return widget
+}
+
+// TEXTMARKERS
+
+// Created with markText and setBookmark methods. A TextMarker is a
+// handle that can be used to clear or find a marked position in the
+// document. Line objects hold arrays (markedSpans) containing
+// {from, to, marker} object pointing to such marker objects, and
+// indicating that such a marker is present on that line. Multiple
+// lines may point to the same marker when it spans across lines.
+// The spans will have null for their from/to properties when the
+// marker continues beyond the start/end of the line. Markers have
+// links back to the lines they currently touch.
+
+// Collapsed markers have unique ids, in order to be able to order
+// them, which is needed for uniquely determining an outer marker
+// when they overlap (they may nest, but not partially overlap).
+var nextMarkerId = 0;
+
+var TextMarker = function(doc, type) {
+  this.lines = [];
+  this.type = type;
+  this.doc = doc;
+  this.id = ++nextMarkerId;
+};
+
+// Clear the marker.
+TextMarker.prototype.clear = function () {
+    var this$1 = this;
+
+  if (this.explicitlyCleared) { return }
+  var cm = this.doc.cm, withOp = cm && !cm.curOp;
+  if (withOp) { startOperation(cm); }
+  if (hasHandler(this, "clear")) {
+    var found = this.find();
+    if (found) { signalLater(this, "clear", found.from, found.to); }
+  }
+  var min = null, max = null;
+  for (var i = 0; i < this.lines.length; ++i) {
+    var line = this$1.lines[i];
+    var span = getMarkedSpanFor(line.markedSpans, this$1);
+    if (cm && !this$1.collapsed) { regLineChange(cm, lineNo(line), "text"); }
+    else if (cm) {
+      if (span.to != null) { max = lineNo(line); }
+      if (span.from != null) { min = lineNo(line); }
+    }
+    line.markedSpans = removeMarkedSpan(line.markedSpans, span);
+    if (span.from == null && this$1.collapsed && !lineIsHidden(this$1.doc, line) && cm)
+      { updateLineHeight(line, textHeight(cm.display)); }
+  }
+  if (cm && this.collapsed && !cm.options.lineWrapping) { for (var i$1 = 0; i$1 < this.lines.length; ++i$1) {
+    var visual = visualLine(this$1.lines[i$1]), len = lineLength(visual);
+    if (len > cm.display.maxLineLength) {
+      cm.display.maxLine = visual;
+      cm.display.maxLineLength = len;
+      cm.display.maxLineChanged = true;
+    }
+  } }
+
+  if (min != null && cm && this.collapsed) { regChange(cm, min, max + 1); }
+  this.lines.length = 0;
+  this.explicitlyCleared = true;
+  if (this.atomic && this.doc.cantEdit) {
+    this.doc.cantEdit = false;
+    if (cm) { reCheckSelection(cm.doc); }
+  }
+  if (cm) { signalLater(cm, "markerCleared", cm, this, min, max); }
+  if (withOp) { endOperation(cm); }
+  if (this.parent) { this.parent.clear(); }
+};
+
+// Find the position of the marker in the document. Returns a {from,
+// to} object by default. Side can be passed to get a specific side
+// -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the
+// Pos objects returned contain a line object, rather than a line
+// number (used to prevent looking up the same line twice).
+TextMarker.prototype.find = function (side, lineObj) {
+    var this$1 = this;
+
+  if (side == null && this.type == "bookmark") { side = 1; }
+  var from, to;
+  for (var i = 0; i < this.lines.length; ++i) {
+    var line = this$1.lines[i];
+    var span = getMarkedSpanFor(line.markedSpans, this$1);
+    if (span.from != null) {
+      from = Pos(lineObj ? line : lineNo(line), span.from);
+      if (side == -1) { return from }
+    }
+    if (span.to != null) {
+      to = Pos(lineObj ? line : lineNo(line), span.to);
+      if (side == 1) { return to }
+    }
+  }
+  return from && {from: from, to: to}
+};
+
+// Signals that the marker's widget changed, and surrounding layout
+// should be recomputed.
+TextMarker.prototype.changed = function () {
+    var this$1 = this;
+
+  var pos = this.find(-1, true), widget = this, cm = this.doc.cm;
+  if (!pos || !cm) { return }
+  runInOp(cm, function () {
+    var line = pos.line, lineN = lineNo(pos.line);
+    var view = findViewForLine(cm, lineN);
+    if (view) {
+      clearLineMeasurementCacheFor(view);
+      cm.curOp.selectionChanged = cm.curOp.forceUpdate = true;
+    }
+    cm.curOp.updateMaxLine = true;
+    if (!lineIsHidden(widget.doc, line) && widget.height != null) {
+      var oldHeight = widget.height;
+      widget.height = null;
+      var dHeight = widgetHeight(widget) - oldHeight;
+      if (dHeight)
+        { updateLineHeight(line, line.height + dHeight); }
+    }
+    signalLater(cm, "markerChanged", cm, this$1);
+  });
+};
+
+TextMarker.prototype.attachLine = function (line) {
+  if (!this.lines.length && this.doc.cm) {
+    var op = this.doc.cm.curOp;
+    if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1)
+      { (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this); }
+  }
+  this.lines.push(line);
+};
+
+TextMarker.prototype.detachLine = function (line) {
+  this.lines.splice(indexOf(this.lines, line), 1);
+  if (!this.lines.length && this.doc.cm) {
+    var op = this.doc.cm.curOp;(op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this);
+  }
+};
+eventMixin(TextMarker);
+
+// Create a marker, wire it up to the right lines, and
+function markText(doc, from, to, options, type) {
+  // Shared markers (across linked documents) are handled separately
+  // (markTextShared will call out to this again, once per
+  // document).
+  if (options && options.shared) { return markTextShared(doc, from, to, options, type) }
+  // Ensure we are in an operation.
+  if (doc.cm && !doc.cm.curOp) { return operation(doc.cm, markText)(doc, from, to, options, type) }
+
+  var marker = new TextMarker(doc, type), diff = cmp(from, to);
+  if (options) { copyObj(options, marker, false); }
+  // Don't connect empty markers unless clearWhenEmpty is false
+  if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false)
+    { return marker }
+  if (marker.replacedWith) {
+    // Showing up as a widget implies collapsed (widget replaces text)
+    marker.collapsed = true;
+    marker.widgetNode = eltP("span", [marker.replacedWith], "CodeMirror-widget");
+    if (!options.handleMouseEvents) { marker.widgetNode.setAttribute("cm-ignore-events", "true"); }
+    if (options.insertLeft) { marker.widgetNode.insertLeft = true; }
+  }
+  if (marker.collapsed) {
+    if (conflictingCollapsedRange(doc, from.line, from, to, marker) ||
+        from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker))
+      { throw new Error("Inserting collapsed marker partially overlapping an existing one") }
+    seeCollapsedSpans();
+  }
+
+  if (marker.addToHistory)
+    { addChangeToHistory(doc, {from: from, to: to, origin: "markText"}, doc.sel, NaN); }
+
+  var curLine = from.line, cm = doc.cm, updateMaxLine;
+  doc.iter(curLine, to.line + 1, function (line) {
+    if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine)
+      { updateMaxLine = true; }
+    if (marker.collapsed && curLine != from.line) { updateLineHeight(line, 0); }
+    addMarkedSpan(line, new MarkedSpan(marker,
+                                       curLine == from.line ? from.ch : null,
+                                       curLine == to.line ? to.ch : null));
+    ++curLine;
+  });
+  // lineIsHidden depends on the presence of the spans, so needs a second pass
+  if (marker.collapsed) { doc.iter(from.line, to.line + 1, function (line) {
+    if (lineIsHidden(doc, line)) { updateLineHeight(line, 0); }
+  }); }
+
+  if (marker.clearOnEnter) { on(marker, "beforeCursorEnter", function () { return marker.clear(); }); }
+
+  if (marker.readOnly) {
+    seeReadOnlySpans();
+    if (doc.history.done.length || doc.history.undone.length)
+      { doc.clearHistory(); }
+  }
+  if (marker.collapsed) {
+    marker.id = ++nextMarkerId;
+    marker.atomic = true;
+  }
+  if (cm) {
+    // Sync editor state
+    if (updateMaxLine) { cm.curOp.updateMaxLine = true; }
+    if (marker.collapsed)
+      { regChange(cm, from.line, to.line + 1); }
+    else if (marker.className || marker.title || marker.startStyle || marker.endStyle || marker.css)
+      { for (var i = from.line; i <= to.line; i++) { regLineChange(cm, i, "text"); } }
+    if (marker.atomic) { reCheckSelection(cm.doc); }
+    signalLater(cm, "markerAdded", cm, marker);
+  }
+  return marker
+}
+
+// SHARED TEXTMARKERS
+
+// A shared marker spans multiple linked documents. It is
+// implemented as a meta-marker-object controlling multiple normal
+// markers.
+var SharedTextMarker = function(markers, primary) {
+  var this$1 = this;
+
+  this.markers = markers;
+  this.primary = primary;
+  for (var i = 0; i < markers.length; ++i)
+    { markers[i].parent = this$1; }
+};
+
+SharedTextMarker.prototype.clear = function () {
+    var this$1 = this;
+
+  if (this.explicitlyCleared) { return }
+  this.explicitlyCleared = true;
+  for (var i = 0; i < this.markers.length; ++i)
+    { this$1.markers[i].clear(); }
+  signalLater(this, "clear");
+};
+
+SharedTextMarker.prototype.find = function (side, lineObj) {
+  return this.primary.find(side, lineObj)
+};
+eventMixin(SharedTextMarker);
+
+function markTextShared(doc, from, to, options, type) {
+  options = copyObj(options);
+  options.shared = false;
+  var markers = [markText(doc, from, to, options, type)], primary = markers[0];
+  var widget = options.widgetNode;
+  linkedDocs(doc, function (doc) {
+    if (widget) { options.widgetNode = widget.cloneNode(true); }
+    markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type));
+    for (var i = 0; i < doc.linked.length; ++i)
+      { if (doc.linked[i].isParent) { return } }
+    primary = lst(markers);
+  });
+  return new SharedTextMarker(markers, primary)
+}
+
+function findSharedMarkers(doc) {
+  return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), function (m) { return m.parent; })
+}
+
+function copySharedMarkers(doc, markers) {
+  for (var i = 0; i < markers.length; i++) {
+    var marker = markers[i], pos = marker.find();
+    var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to);
+    if (cmp(mFrom, mTo)) {
+      var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type);
+      marker.markers.push(subMark);
+      subMark.parent = marker;
+    }
+  }
+}
+
+function detachSharedMarkers(markers) {
+  var loop = function ( i ) {
+    var marker = markers[i], linked = [marker.primary.doc];
+    linkedDocs(marker.primary.doc, function (d) { return linked.push(d); });
+    for (var j = 0; j < marker.markers.length; j++) {
+      var subMarker = marker.markers[j];
+      if (indexOf(linked, subMarker.doc) == -1) {
+        subMarker.parent = null;
+        marker.markers.splice(j--, 1);
+      }
+    }
+  };
+
+  for (var i = 0; i < markers.length; i++) loop( i );
+}
+
+var nextDocId = 0;
+var Doc = function(text, mode, firstLine, lineSep, direction) {
+  if (!(this instanceof Doc)) { return new Doc(text, mode, firstLine, lineSep, direction) }
+  if (firstLine == null) { firstLine = 0; }
+
+  BranchChunk.call(this, [new LeafChunk([new Line("", null)])]);
+  this.first = firstLine;
+  this.scrollTop = this.scrollLeft = 0;
+  this.cantEdit = false;
+  this.cleanGeneration = 1;
+  this.modeFrontier = this.highlightFrontier = firstLine;
+  var start = Pos(firstLine, 0);
+  this.sel = simpleSelection(start);
+  this.history = new History(null);
+  this.id = ++nextDocId;
+  this.modeOption = mode;
+  this.lineSep = lineSep;
+  this.direction = (direction == "rtl") ? "rtl" : "ltr";
+  this.extend = false;
+
+  if (typeof text == "string") { text = this.splitLines(text); }
+  updateDoc(this, {from: start, to: start, text: text});
+  setSelection(this, simpleSelection(start), sel_dontScroll);
+};
+
+Doc.prototype = createObj(BranchChunk.prototype, {
+  constructor: Doc,
+  // Iterate over the document. Supports two forms -- with only one
+  // argument, it calls that for each line in the document. With
+  // three, it iterates over the range given by the first two (with
+  // the second being non-inclusive).
+  iter: function(from, to, op) {
+    if (op) { this.iterN(from - this.first, to - from, op); }
+    else { this.iterN(this.first, this.first + this.size, from); }
+  },
+
+  // Non-public interface for adding and removing lines.
+  insert: function(at, lines) {
+    var height = 0;
+    for (var i = 0; i < lines.length; ++i) { height += lines[i].height; }
+    this.insertInner(at - this.first, lines, height);
+  },
+  remove: function(at, n) { this.removeInner(at - this.first, n); },
+
+  // From here, the methods are part of the public interface. Most
+  // are also available from CodeMirror (editor) instances.
+
+  getValue: function(lineSep) {
+    var lines = getLines(this, this.first, this.first + this.size);
+    if (lineSep === false) { return lines }
+    return lines.join(lineSep || this.lineSeparator())
+  },
+  setValue: docMethodOp(function(code) {
+    var top = Pos(this.first, 0), last = this.first + this.size - 1;
+    makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length),
+                      text: this.splitLines(code), origin: "setValue", full: true}, true);
+    if (this.cm) { scrollToCoords(this.cm, 0, 0); }
+    setSelection(this, simpleSelection(top), sel_dontScroll);
+  }),
+  replaceRange: function(code, from, to, origin) {
+    from = clipPos(this, from);
+    to = to ? clipPos(this, to) : from;
+    replaceRange(this, code, from, to, origin);
+  },
+  getRange: function(from, to, lineSep) {
+    var lines = getBetween(this, clipPos(this, from), clipPos(this, to));
+    if (lineSep === false) { return lines }
+    return lines.join(lineSep || this.lineSeparator())
+  },
+
+  getLine: function(line) {var l = this.getLineHandle(line); return l && l.text},
+
+  getLineHandle: function(line) {if (isLine(this, line)) { return getLine(this, line) }},
+  getLineNumber: function(line) {return lineNo(line)},
+
+  getLineHandleVisualStart: function(line) {
+    if (typeof line == "number") { line = getLine(this, line); }
+    return visualLine(line)
+  },
+
+  lineCount: function() {return this.size},
+  firstLine: function() {return this.first},
+  lastLine: function() {return this.first + this.size - 1},
+
+  clipPos: function(pos) {return clipPos(this, pos)},
+
+  getCursor: function(start) {
+    var range$$1 = this.sel.primary(), pos;
+    if (start == null || start == "head") { pos = range$$1.head; }
+    else if (start == "anchor") { pos = range$$1.anchor; }
+    else if (start == "end" || start == "to" || start === false) { pos = range$$1.to(); }
+    else { pos = range$$1.from(); }
+    return pos
+  },
+  listSelections: function() { return this.sel.ranges },
+  somethingSelected: function() {return this.sel.somethingSelected()},
+
+  setCursor: docMethodOp(function(line, ch, options) {
+    setSimpleSelection(this, clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line), null, options);
+  }),
+  setSelection: docMethodOp(function(anchor, head, options) {
+    setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options);
+  }),
+  extendSelection: docMethodOp(function(head, other, options) {
+    extendSelection(this, clipPos(this, head), other && clipPos(this, other), options);
+  }),
+  extendSelections: docMethodOp(function(heads, options) {
+    extendSelections(this, clipPosArray(this, heads), options);
+  }),
+  extendSelectionsBy: docMethodOp(function(f, options) {
+    var heads = map(this.sel.ranges, f);
+    extendSelections(this, clipPosArray(this, heads), options);
+  }),
+  setSelections: docMethodOp(function(ranges, primary, options) {
+    var this$1 = this;
+
+    if (!ranges.length) { return }
+    var out = [];
+    for (var i = 0; i < ranges.length; i++)
+      { out[i] = new Range(clipPos(this$1, ranges[i].anchor),
+                         clipPos(this$1, ranges[i].head)); }
+    if (primary == null) { primary = Math.min(ranges.length - 1, this.sel.primIndex); }
+    setSelection(this, normalizeSelection(out, primary), options);
+  }),
+  addSelection: docMethodOp(function(anchor, head, options) {
+    var ranges = this.sel.ranges.slice(0);
+    ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor)));
+    setSelection(this, normalizeSelection(ranges, ranges.length - 1), options);
+  }),
+
+  getSelection: function(lineSep) {
+    var this$1 = this;
+
+    var ranges = this.sel.ranges, lines;
+    for (var i = 0; i < ranges.length; i++) {
+      var sel = getBetween(this$1, ranges[i].from(), ranges[i].to());
+      lines = lines ? lines.concat(sel) : sel;
+    }
+    if (lineSep === false) { return lines }
+    else { return lines.join(lineSep || this.lineSeparator()) }
+  },
+  getSelections: function(lineSep) {
+    var this$1 = this;
+
+    var parts = [], ranges = this.sel.ranges;
+    for (var i = 0; i < ranges.length; i++) {
+      var sel = getBetween(this$1, ranges[i].from(), ranges[i].to());
+      if (lineSep !== false) { sel = sel.join(lineSep || this$1.lineSeparator()); }
+      parts[i] = sel;
+    }
+    return parts
+  },
+  replaceSelection: function(code, collapse, origin) {
+    var dup = [];
+    for (var i = 0; i < this.sel.ranges.length; i++)
+      { dup[i] = code; }
+    this.replaceSelections(dup, collapse, origin || "+input");
+  },
+  replaceSelections: docMethodOp(function(code, collapse, origin) {
+    var this$1 = this;
+
+    var changes = [], sel = this.sel;
+    for (var i = 0; i < sel.ranges.length; i++) {
+      var range$$1 = sel.ranges[i];
+      changes[i] = {from: range$$1.from(), to: range$$1.to(), text: this$1.splitLines(code[i]), origin: origin};
+    }
+    var newSel = collapse && collapse != "end" && computeReplacedSel(this, changes, collapse);
+    for (var i$1 = changes.length - 1; i$1 >= 0; i$1--)
+      { makeChange(this$1, changes[i$1]); }
+    if (newSel) { setSelectionReplaceHistory(this, newSel); }
+    else if (this.cm) { ensureCursorVisible(this.cm); }
+  }),
+  undo: docMethodOp(function() {makeChangeFromHistory(this, "undo");}),
+  redo: docMethodOp(function() {makeChangeFromHistory(this, "redo");}),
+  undoSelection: docMethodOp(function() {makeChangeFromHistory(this, "undo", true);}),
+  redoSelection: docMethodOp(function() {makeChangeFromHistory(this, "redo", true);}),
+
+  setExtending: function(val) {this.extend = val;},
+  getExtending: function() {return this.extend},
+
+  historySize: function() {
+    var hist = this.history, done = 0, undone = 0;
+    for (var i = 0; i < hist.done.length; i++) { if (!hist.done[i].ranges) { ++done; } }
+    for (var i$1 = 0; i$1 < hist.undone.length; i$1++) { if (!hist.undone[i$1].ranges) { ++undone; } }
+    return {undo: done, redo: undone}
+  },
+  clearHistory: function() {this.history = new History(this.history.maxGeneration);},
+
+  markClean: function() {
+    this.cleanGeneration = this.changeGeneration(true);
+  },
+  changeGeneration: function(forceSplit) {
+    if (forceSplit)
+      { this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null; }
+    return this.history.generation
+  },
+  isClean: function (gen) {
+    return this.history.generation == (gen || this.cleanGeneration)
+  },
+
+  getHistory: function() {
+    return {done: copyHistoryArray(this.history.done),
+            undone: copyHistoryArray(this.history.undone)}
+  },
+  setHistory: function(histData) {
+    var hist = this.history = new History(this.history.maxGeneration);
+    hist.done = copyHistoryArray(histData.done.slice(0), null, true);
+    hist.undone = copyHistoryArray(histData.undone.slice(0), null, true);
+  },
+
+  setGutterMarker: docMethodOp(function(line, gutterID, value) {
+    return changeLine(this, line, "gutter", function (line) {
+      var markers = line.gutterMarkers || (line.gutterMarkers = {});
+      markers[gutterID] = value;
+      if (!value && isEmpty(markers)) { line.gutterMarkers = null; }
+      return true
+    })
+  }),
+
+  clearGutter: docMethodOp(function(gutterID) {
+    var this$1 = this;
+
+    this.iter(function (line) {
+      if (line.gutterMarkers && line.gutterMarkers[gutterID]) {
+        changeLine(this$1, line, "gutter", function () {
+          line.gutterMarkers[gutterID] = null;
+          if (isEmpty(line.gutterMarkers)) { line.gutterMarkers = null; }
+          return true
+        });
+      }
+    });
+  }),
+
+  lineInfo: function(line) {
+    var n;
+    if (typeof line == "number") {
+      if (!isLine(this, line)) { return null }
+      n = line;
+      line = getLine(this, line);
+      if (!line) { return null }
+    } else {
+      n = lineNo(line);
+      if (n == null) { return null }
+    }
+    return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers,
+            textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass,
+            widgets: line.widgets}
+  },
+
+  addLineClass: docMethodOp(function(handle, where, cls) {
+    return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) {
+      var prop = where == "text" ? "textClass"
+               : where == "background" ? "bgClass"
+               : where == "gutter" ? "gutterClass" : "wrapClass";
+      if (!line[prop]) { line[prop] = cls; }
+      else if (classTest(cls).test(line[prop])) { return false }
+      else { line[prop] += " " + cls; }
+      return true
+    })
+  }),
+  removeLineClass: docMethodOp(function(handle, where, cls) {
+    return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) {
+      var prop = where == "text" ? "textClass"
+               : where == "background" ? "bgClass"
+               : where == "gutter" ? "gutterClass" : "wrapClass";
+      var cur = line[prop];
+      if (!cur) { return false }
+      else if (cls == null) { line[prop] = null; }
+      else {
+        var found = cur.match(classTest(cls));
+        if (!found) { return false }
+        var end = found.index + found[0].length;
+        line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null;
+      }
+      return true
+    })
+  }),
+
+  addLineWidget: docMethodOp(function(handle, node, options) {
+    return addLineWidget(this, handle, node, options)
+  }),
+  removeLineWidget: function(widget) { widget.clear(); },
+
+  markText: function(from, to, options) {
+    return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || "range")
+  },
+  setBookmark: function(pos, options) {
+    var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options),
+                    insertLeft: options && options.insertLeft,
+                    clearWhenEmpty: false, shared: options && options.shared,
+                    handleMouseEvents: options && options.handleMouseEvents};
+    pos = clipPos(this, pos);
+    return markText(this, pos, pos, realOpts, "bookmark")
+  },
+  findMarksAt: function(pos) {
+    pos = clipPos(this, pos);
+    var markers = [], spans = getLine(this, pos.line).markedSpans;
+    if (spans) { for (var i = 0; i < spans.length; ++i) {
+      var span = spans[i];
+      if ((span.from == null || span.from <= pos.ch) &&
+          (span.to == null || span.to >= pos.ch))
+        { markers.push(span.marker.parent || span.marker); }
+    } }
+    return markers
+  },
+  findMarks: function(from, to, filter) {
+    from = clipPos(this, from); to = clipPos(this, to);
+    var found = [], lineNo$$1 = from.line;
+    this.iter(from.line, to.line + 1, function (line) {
+      var spans = line.markedSpans;
+      if (spans) { for (var i = 0; i < spans.length; i++) {
+        var span = spans[i];
+        if (!(span.to != null && lineNo$$1 == from.line && from.ch >= span.to ||
+              span.from == null && lineNo$$1 != from.line ||
+              span.from != null && lineNo$$1 == to.line && span.from >= to.ch) &&
+            (!filter || filter(span.marker)))
+          { found.push(span.marker.parent || span.marker); }
+      } }
+      ++lineNo$$1;
+    });
+    return found
+  },
+  getAllMarks: function() {
+    var markers = [];
+    this.iter(function (line) {
+      var sps = line.markedSpans;
+      if (sps) { for (var i = 0; i < sps.length; ++i)
+        { if (sps[i].from != null) { markers.push(sps[i].marker); } } }
+    });
+    return markers
+  },
+
+  posFromIndex: function(off) {
+    var ch, lineNo$$1 = this.first, sepSize = this.lineSeparator().length;
+    this.iter(function (line) {
+      var sz = line.text.length + sepSize;
+      if (sz > off) { ch = off; return true }
+      off -= sz;
+      ++lineNo$$1;
+    });
+    return clipPos(this, Pos(lineNo$$1, ch))
+  },
+  indexFromPos: function (coords) {
+    coords = clipPos(this, coords);
+    var index = coords.ch;
+    if (coords.line < this.first || coords.ch < 0) { return 0 }
+    var sepSize = this.lineSeparator().length;
+    this.iter(this.first, coords.line, function (line) { // iter aborts when callback returns a truthy value
+      index += line.text.length + sepSize;
+    });
+    return index
+  },
+
+  copy: function(copyHistory) {
+    var doc = new Doc(getLines(this, this.first, this.first + this.size),
+                      this.modeOption, this.first, this.lineSep, this.direction);
+    doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft;
+    doc.sel = this.sel;
+    doc.extend = false;
+    if (copyHistory) {
+      doc.history.undoDepth = this.history.undoDepth;
+      doc.setHistory(this.getHistory());
+    }
+    return doc
+  },
+
+  linkedDoc: function(options) {
+    if (!options) { options = {}; }
+    var from = this.first, to = this.first + this.size;
+    if (options.from != null && options.from > from) { from = options.from; }
+    if (options.to != null && options.to < to) { to = options.to; }
+    var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep, this.direction);
+    if (options.sharedHist) { copy.history = this.history
+    ; }(this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist});
+    copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}];
+    copySharedMarkers(copy, findSharedMarkers(this));
+    return copy
+  },
+  unlinkDoc: function(other) {
+    var this$1 = this;
+
+    if (other instanceof CodeMirror$1) { other = other.doc; }
+    if (this.linked) { for (var i = 0; i < this.linked.length; ++i) {
+      var link = this$1.linked[i];
+      if (link.doc != other) { continue }
+      this$1.linked.splice(i, 1);
+      other.unlinkDoc(this$1);
+      detachSharedMarkers(findSharedMarkers(this$1));
+      break
+    } }
+    // If the histories were shared, split them again
+    if (other.history == this.history) {
+      var splitIds = [other.id];
+      linkedDocs(other, function (doc) { return splitIds.push(doc.id); }, true);
+      other.history = new History(null);
+      other.history.done = copyHistoryArray(this.history.done, splitIds);
+      other.history.undone = copyHistoryArray(this.history.undone, splitIds);
+    }
+  },
+  iterLinkedDocs: function(f) {linkedDocs(this, f);},
+
+  getMode: function() {return this.mode},
+  getEditor: function() {return this.cm},
+
+  splitLines: function(str) {
+    if (this.lineSep) { return str.split(this.lineSep) }
+    return splitLinesAuto(str)
+  },
+  lineSeparator: function() { return this.lineSep || "\n" },
+
+  setDirection: docMethodOp(function (dir) {
+    if (dir != "rtl") { dir = "ltr"; }
+    if (dir == this.direction) { return }
+    this.direction = dir;
+    this.iter(function (line) { return line.order = null; });
+    if (this.cm) { directionChanged(this.cm); }
+  })
+});
+
+// Public alias.
+Doc.prototype.eachLine = Doc.prototype.iter;
+
+// Kludge to work around strange IE behavior where it'll sometimes
+// re-fire a series of drag-related events right after the drop (#1551)
+var lastDrop = 0;
+
+function onDrop(e) {
+  var cm = this;
+  clearDragCursor(cm);
+  if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e))
+    { return }
+  e_preventDefault(e);
+  if (ie) { lastDrop = +new Date; }
+  var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files;
+  if (!pos || cm.isReadOnly()) { return }
+  // Might be a file drop, in which case we simply extract the text
+  // and insert it.
+  if (files && files.length && window.FileReader && window.File) {
+    var n = files.length, text = Array(n), read = 0;
+    var loadFile = function (file, i) {
+      if (cm.options.allowDropFileTypes &&
+          indexOf(cm.options.allowDropFileTypes, file.type) == -1)
+        { return }
+
+      var reader = new FileReader;
+      reader.onload = operation(cm, function () {
+        var content = reader.result;
+        if (/[\x00-\x08\x0e-\x1f]{2}/.test(content)) { content = ""; }
+        text[i] = content;
+        if (++read == n) {
+          pos = clipPos(cm.doc, pos);
+          var change = {from: pos, to: pos,
+                        text: cm.doc.splitLines(text.join(cm.doc.lineSeparator())),
+                        origin: "paste"};
+          makeChange(cm.doc, change);
+          setSelectionReplaceHistory(cm.doc, simpleSelection(pos, changeEnd(change)));
+        }
+      });
+      reader.readAsText(file);
+    };
+    for (var i = 0; i < n; ++i) { loadFile(files[i], i); }
+  } else { // Normal drop
+    // Don't do a replace if the drop happened inside of the selected text.
+    if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) {
+      cm.state.draggingText(e);
+      // Ensure the editor is re-focused
+      setTimeout(function () { return cm.display.input.focus(); }, 20);
+      return
+    }
+    try {
+      var text$1 = e.dataTransfer.getData("Text");
+      if (text$1) {
+        var selected;
+        if (cm.state.draggingText && !cm.state.draggingText.copy)
+          { selected = cm.listSelections(); }
+        setSelectionNoUndo(cm.doc, simpleSelection(pos, pos));
+        if (selected) { for (var i$1 = 0; i$1 < selected.length; ++i$1)
+          { replaceRange(cm.doc, "", selected[i$1].anchor, selected[i$1].head, "drag"); } }
+        cm.replaceSelection(text$1, "around", "paste");
+        cm.display.input.focus();
+      }
+    }
+    catch(e){}
+  }
+}
+
+function onDragStart(cm, e) {
+  if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return }
+  if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) { return }
+
+  e.dataTransfer.setData("Text", cm.getSelection());
+  e.dataTransfer.effectAllowed = "copyMove";
+
+  // Use dummy image instead of default browsers image.
+  // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.
+  if (e.dataTransfer.setDragImage && !safari) {
+    var img = elt("img", null, null, "position: fixed; left: 0; top: 0;");
+    img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";
+    if (presto) {
+      img.width = img.height = 1;
+      cm.display.wrapper.appendChild(img);
+      // Force a relayout, or Opera won't use our image for some obscure reason
+      img._top = img.offsetTop;
+    }
+    e.dataTransfer.setDragImage(img, 0, 0);
+    if (presto) { img.parentNode.removeChild(img); }
+  }
+}
+
+function onDragOver(cm, e) {
+  var pos = posFromMouse(cm, e);
+  if (!pos) { return }
+  var frag = document.createDocumentFragment();
+  drawSelectionCursor(cm, pos, frag);
+  if (!cm.display.dragCursor) {
+    cm.display.dragCursor = elt("div", null, "CodeMirror-cursors CodeMirror-dragcursors");
+    cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv);
+  }
+  removeChildrenAndAdd(cm.display.dragCursor, frag);
+}
+
+function clearDragCursor(cm) {
+  if (cm.display.dragCursor) {
+    cm.display.lineSpace.removeChild(cm.display.dragCursor);
+    cm.display.dragCursor = null;
+  }
+}
+
+// These must be handled carefully, because naively registering a
+// handler for each editor will cause the editors to never be
+// garbage collected.
+
+function forEachCodeMirror(f) {
+  if (!document.getElementsByClassName) { return }
+  var byClass = document.getElementsByClassName("CodeMirror");
+  for (var i = 0; i < byClass.length; i++) {
+    var cm = byClass[i].CodeMirror;
+    if (cm) { f(cm); }
+  }
+}
+
+var globalsRegistered = false;
+function ensureGlobalHandlers() {
+  if (globalsRegistered) { return }
+  registerGlobalHandlers();
+  globalsRegistered = true;
+}
+function registerGlobalHandlers() {
+  // When the window resizes, we need to refresh active editors.
+  var resizeTimer;
+  on(window, "resize", function () {
+    if (resizeTimer == null) { resizeTimer = setTimeout(function () {
+      resizeTimer = null;
+      forEachCodeMirror(onResize);
+    }, 100); }
+  });
+  // When the window loses focus, we want to show the editor as blurred
+  on(window, "blur", function () { return forEachCodeMirror(onBlur); });
+}
+// Called when the window resizes
+function onResize(cm) {
+  var d = cm.display;
+  if (d.lastWrapHeight == d.wrapper.clientHeight && d.lastWrapWidth == d.wrapper.clientWidth)
+    { return }
+  // Might be a text scaling operation, clear size caches.
+  d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;
+  d.scrollbarsClipped = false;
+  cm.setSize();
+}
+
+var keyNames = {
+  3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt",
+  19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End",
+  36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert",
+  46: "Delete", 59: ";", 61: "=", 91: "Mod", 92: "Mod", 93: "Mod",
+  106: "*", 107: "=", 109: "-", 110: ".", 111: "/", 127: "Delete",
+  173: "-", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\",
+  221: "]", 222: "'", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete",
+  63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert"
+};
+
+// Number keys
+for (var i = 0; i < 10; i++) { keyNames[i + 48] = keyNames[i + 96] = String(i); }
+// Alphabetic keys
+for (var i$1 = 65; i$1 <= 90; i$1++) { keyNames[i$1] = String.fromCharCode(i$1); }
+// Function keys
+for (var i$2 = 1; i$2 <= 12; i$2++) { keyNames[i$2 + 111] = keyNames[i$2 + 63235] = "F" + i$2; }
+
+var keyMap = {};
+
+keyMap.basic = {
+  "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown",
+  "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown",
+  "Delete": "delCharAfter", "Backspace": "delCharBefore", "Shift-Backspace": "delCharBefore",
+  "Tab": "defaultTab", "Shift-Tab": "indentAuto",
+  "Enter": "newlineAndIndent", "Insert": "toggleOverwrite",
+  "Esc": "singleSelection"
+};
+// Note that the save and find-related commands aren't defined by
+// default. User code or addons can define them. Unknown commands
+// are simply ignored.
+keyMap.pcDefault = {
+  "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo",
+  "Ctrl-Home": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Up": "goLineUp", "Ctrl-Down": "goLineDown",
+  "Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd",
+  "Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find",
+  "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll",
+  "Ctrl-[": "indentLess", "Ctrl-]": "indentMore",
+  "Ctrl-U": "undoSelection", "Shift-Ctrl-U": "redoSelection", "Alt-U": "redoSelection",
+  fallthrough: "basic"
+};
+// Very basic readline/emacs-style bindings, which are standard on Mac.
+keyMap.emacsy = {
+  "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown",
+  "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd",
+  "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore",
+  "Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars",
+  "Ctrl-O": "openLine"
+};
+keyMap.macDefault = {
+  "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo",
+  "Cmd-Home": "goDocStart", "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goGroupLeft",
+  "Alt-Right": "goGroupRight", "Cmd-Left": "goLineLeft", "Cmd-Right": "goLineRight", "Alt-Backspace": "delGroupBefore",
+  "Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find",
+  "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll",
+  "Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delWrappedLineLeft", "Cmd-Delete": "delWrappedLineRight",
+  "Cmd-U": "undoSelection", "Shift-Cmd-U": "redoSelection", "Ctrl-Up": "goDocStart", "Ctrl-Down": "goDocEnd",
+  fallthrough: ["basic", "emacsy"]
+};
+keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault;
+
+// KEYMAP DISPATCH
+
+function normalizeKeyName(name) {
+  var parts = name.split(/-(?!$)/);
+  name = parts[parts.length - 1];
+  var alt, ctrl, shift, cmd;
+  for (var i = 0; i < parts.length - 1; i++) {
+    var mod = parts[i];
+    if (/^(cmd|meta|m)$/i.test(mod)) { cmd = true; }
+    else if (/^a(lt)?$/i.test(mod)) { alt = true; }
+    else if (/^(c|ctrl|control)$/i.test(mod)) { ctrl = true; }
+    else if (/^s(hift)?$/i.test(mod)) { shift = true; }
+    else { throw new Error("Unrecognized modifier name: " + mod) }
+  }
+  if (alt) { name = "Alt-" + name; }
+  if (ctrl) { name = "Ctrl-" + name; }
+  if (cmd) { name = "Cmd-" + name; }
+  if (shift) { name = "Shift-" + name; }
+  return name
+}
+
+// This is a kludge to keep keymaps mostly working as raw objects
+// (backwards compatibility) while at the same time support features
+// like normalization and multi-stroke key bindings. It compiles a
+// new normalized keymap, and then updates the old object to reflect
+// this.
+function normalizeKeyMap(keymap) {
+  var copy = {};
+  for (var keyname in keymap) { if (keymap.hasOwnProperty(keyname)) {
+    var value = keymap[keyname];
+    if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) { continue }
+    if (value == "...") { delete keymap[keyname]; continue }
+
+    var keys = map(keyname.split(" "), normalizeKeyName);
+    for (var i = 0; i < keys.length; i++) {
+      var val = (void 0), name = (void 0);
+      if (i == keys.length - 1) {
+        name = keys.join(" ");
+        val = value;
+      } else {
+        name = keys.slice(0, i + 1).join(" ");
+        val = "...";
+      }
+      var prev = copy[name];
+      if (!prev) { copy[name] = val; }
+      else if (prev != val) { throw new Error("Inconsistent bindings for " + name) }
+    }
+    delete keymap[keyname];
+  } }
+  for (var prop in copy) { keymap[prop] = copy[prop]; }
+  return keymap
+}
+
+function lookupKey(key, map$$1, handle, context) {
+  map$$1 = getKeyMap(map$$1);
+  var found = map$$1.call ? map$$1.call(key, context) : map$$1[key];
+  if (found === false) { return "nothing" }
+  if (found === "...") { return "multi" }
+  if (found != null && handle(found)) { return "handled" }
+
+  if (map$$1.fallthrough) {
+    if (Object.prototype.toString.call(map$$1.fallthrough) != "[object Array]")
+      { return lookupKey(key, map$$1.fallthrough, handle, context) }
+    for (var i = 0; i < map$$1.fallthrough.length; i++) {
+      var result = lookupKey(key, map$$1.fallthrough[i], handle, context);
+      if (result) { return result }
+    }
+  }
+}
+
+// Modifier key presses don't count as 'real' key presses for the
+// purpose of keymap fallthrough.
+function isModifierKey(value) {
+  var name = typeof value == "string" ? value : keyNames[value.keyCode];
+  return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod"
+}
+
+function addModifierNames(name, event, noShift) {
+  var base = name;
+  if (event.altKey && base != "Alt") { name = "Alt-" + name; }
+  if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != "Ctrl") { name = "Ctrl-" + name; }
+  if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != "Cmd") { name = "Cmd-" + name; }
+  if (!noShift && event.shiftKey && base != "Shift") { name = "Shift-" + name; }
+  return name
+}
+
+// Look up the name of a key as indicated by an event object.
+function keyName(event, noShift) {
+  if (presto && event.keyCode == 34 && event["char"]) { return false }
+  var name = keyNames[event.keyCode];
+  if (name == null || event.altGraphKey) { return false }
+  return addModifierNames(name, event, noShift)
+}
+
+function getKeyMap(val) {
+  return typeof val == "string" ? keyMap[val] : val
+}
+
+// Helper for deleting text near the selection(s), used to implement
+// backspace, delete, and similar functionality.
+function deleteNearSelection(cm, compute) {
+  var ranges = cm.doc.sel.ranges, kill = [];
+  // Build up a set of ranges to kill first, merging overlapping
+  // ranges.
+  for (var i = 0; i < ranges.length; i++) {
+    var toKill = compute(ranges[i]);
+    while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) {
+      var replaced = kill.pop();
+      if (cmp(replaced.from, toKill.from) < 0) {
+        toKill.from = replaced.from;
+        break
+      }
+    }
+    kill.push(toKill);
+  }
+  // Next, remove those actual ranges.
+  runInOp(cm, function () {
+    for (var i = kill.length - 1; i >= 0; i--)
+      { replaceRange(cm.doc, "", kill[i].from, kill[i].to, "+delete"); }
+    ensureCursorVisible(cm);
+  });
+}
+
+// Commands are parameter-less actions that can be performed on an
+// editor, mostly used for keybindings.
+var commands = {
+  selectAll: selectAll,
+  singleSelection: function (cm) { return cm.setSelection(cm.getCursor("anchor"), cm.getCursor("head"), sel_dontScroll); },
+  killLine: function (cm) { return deleteNearSelection(cm, function (range) {
+    if (range.empty()) {
+      var len = getLine(cm.doc, range.head.line).text.length;
+      if (range.head.ch == len && range.head.line < cm.lastLine())
+        { return {from: range.head, to: Pos(range.head.line + 1, 0)} }
+      else
+        { return {from: range.head, to: Pos(range.head.line, len)} }
+    } else {
+      return {from: range.from(), to: range.to()}
+    }
+  }); },
+  deleteLine: function (cm) { return deleteNearSelection(cm, function (range) { return ({
+    from: Pos(range.from().line, 0),
+    to: clipPos(cm.doc, Pos(range.to().line + 1, 0))
+  }); }); },
+  delLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { return ({
+    from: Pos(range.from().line, 0), to: range.from()
+  }); }); },
+  delWrappedLineLeft: function (cm) { return deleteNearSelection(cm, function (range) {
+    var top = cm.charCoords(range.head, "div").top + 5;
+    var leftPos = cm.coordsChar({left: 0, top: top}, "div");
+    return {from: leftPos, to: range.from()}
+  }); },
+  delWrappedLineRight: function (cm) { return deleteNearSelection(cm, function (range) {
+    var top = cm.charCoords(range.head, "div").top + 5;
+    var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div");
+    return {from: range.from(), to: rightPos }
+  }); },
+  undo: function (cm) { return cm.undo(); },
+  redo: function (cm) { return cm.redo(); },
+  undoSelection: function (cm) { return cm.undoSelection(); },
+  redoSelection: function (cm) { return cm.redoSelection(); },
+  goDocStart: function (cm) { return cm.extendSelection(Pos(cm.firstLine(), 0)); },
+  goDocEnd: function (cm) { return cm.extendSelection(Pos(cm.lastLine())); },
+  goLineStart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStart(cm, range.head.line); },
+    {origin: "+move", bias: 1}
+  ); },
+  goLineStartSmart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStartSmart(cm, range.head); },
+    {origin: "+move", bias: 1}
+  ); },
+  goLineEnd: function (cm) { return cm.extendSelectionsBy(function (range) { return lineEnd(cm, range.head.line); },
+    {origin: "+move", bias: -1}
+  ); },
+  goLineRight: function (cm) { return cm.extendSelectionsBy(function (range) {
+    var top = cm.charCoords(range.head, "div").top + 5;
+    return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div")
+  }, sel_move); },
+  goLineLeft: function (cm) { return cm.extendSelectionsBy(function (range) {
+    var top = cm.charCoords(range.head, "div").top + 5;
+    return cm.coordsChar({left: 0, top: top}, "div")
+  }, sel_move); },
+  goLineLeftSmart: function (cm) { return cm.extendSelectionsBy(function (range) {
+    var top = cm.charCoords(range.head, "div").top + 5;
+    var pos = cm.coordsChar({left: 0, top: top}, "div");
+    if (pos.ch < cm.getLine(pos.line).search(/\S/)) { return lineStartSmart(cm, range.head) }
+    return pos
+  }, sel_move); },
+  goLineUp: function (cm) { return cm.moveV(-1, "line"); },
+  goLineDown: function (cm) { return cm.moveV(1, "line"); },
+  goPageUp: function (cm) { return cm.moveV(-1, "page"); },
+  goPageDown: function (cm) { return cm.moveV(1, "page"); },
+  goCharLeft: function (cm) { return cm.moveH(-1, "char"); },
+  goCharRight: function (cm) { return cm.moveH(1, "char"); },
+  goColumnLeft: function (cm) { return cm.moveH(-1, "column"); },
+  goColumnRight: function (cm) { return cm.moveH(1, "column"); },
+  goWordLeft: function (cm) { return cm.moveH(-1, "word"); },
+  goGroupRight: function (cm) { return cm.moveH(1, "group"); },
+  goGroupLeft: function (cm) { return cm.moveH(-1, "group"); },
+  goWordRight: function (cm) { return cm.moveH(1, "word"); },
+  delCharBefore: function (cm) { return cm.deleteH(-1, "char"); },
+  delCharAfter: function (cm) { return cm.deleteH(1, "char"); },
+  delWordBefore: function (cm) { return cm.deleteH(-1, "word"); },
+  delWordAfter: function (cm) { return cm.deleteH(1, "word"); },
+  delGroupBefore: function (cm) { return cm.deleteH(-1, "group"); },
+  delGroupAfter: function (cm) { return cm.deleteH(1, "group"); },
+  indentAuto: function (cm) { return cm.indentSelection("smart"); },
+  indentMore: function (cm) { return cm.indentSelection("add"); },
+  indentLess: function (cm) { return cm.indentSelection("subtract"); },
+  insertTab: function (cm) { return cm.replaceSelection("\t"); },
+  insertSoftTab: function (cm) {
+    var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize;
+    for (var i = 0; i < ranges.length; i++) {
+      var pos = ranges[i].from();
+      var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize);
+      spaces.push(spaceStr(tabSize - col % tabSize));
+    }
+    cm.replaceSelections(spaces);
+  },
+  defaultTab: function (cm) {
+    if (cm.somethingSelected()) { cm.indentSelection("add"); }
+    else { cm.execCommand("insertTab"); }
+  },
+  // Swap the two chars left and right of each selection's head.
+  // Move cursor behind the two swapped characters afterwards.
+  //
+  // Doesn't consider line feeds a character.
+  // Doesn't scan more than one line above to find a character.
+  // Doesn't do anything on an empty line.
+  // Doesn't do anything with non-empty selections.
+  transposeChars: function (cm) { return runInOp(cm, function () {
+    var ranges = cm.listSelections(), newSel = [];
+    for (var i = 0; i < ranges.length; i++) {
+      if (!ranges[i].empty()) { continue }
+      var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text;
+      if (line) {
+        if (cur.ch == line.length) { cur = new Pos(cur.line, cur.ch - 1); }
+        if (cur.ch > 0) {
+          cur = new Pos(cur.line, cur.ch + 1);
+          cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2),
+                          Pos(cur.line, cur.ch - 2), cur, "+transpose");
+        } else if (cur.line > cm.doc.first) {
+          var prev = getLine(cm.doc, cur.line - 1).text;
+          if (prev) {
+            cur = new Pos(cur.line, 1);
+            cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() +
+                            prev.charAt(prev.length - 1),
+                            Pos(cur.line - 1, prev.length - 1), cur, "+transpose");
+          }
+        }
+      }
+      newSel.push(new Range(cur, cur));
+    }
+    cm.setSelections(newSel);
+  }); },
+  newlineAndIndent: function (cm) { return runInOp(cm, function () {
+    var sels = cm.listSelections();
+    for (var i = sels.length - 1; i >= 0; i--)
+      { cm.replaceRange(cm.doc.lineSeparator(), sels[i].anchor, sels[i].head, "+input"); }
+    sels = cm.listSelections();
+    for (var i$1 = 0; i$1 < sels.length; i$1++)
+      { cm.indentLine(sels[i$1].from().line, null, true); }
+    ensureCursorVisible(cm);
+  }); },
+  openLine: function (cm) { return cm.replaceSelection("\n", "start"); },
+  toggleOverwrite: function (cm) { return cm.toggleOverwrite(); }
+};
+
+
+function lineStart(cm, lineN) {
+  var line = getLine(cm.doc, lineN);
+  var visual = visualLine(line);
+  if (visual != line) { lineN = lineNo(visual); }
+  return endOfLine(true, cm, visual, lineN, 1)
+}
+function lineEnd(cm, lineN) {
+  var line = getLine(cm.doc, lineN);
+  var visual = visualLineEnd(line);
+  if (visual != line) { lineN = lineNo(visual); }
+  return endOfLine(true, cm, line, lineN, -1)
+}
+function lineStartSmart(cm, pos) {
+  var start = lineStart(cm, pos.line);
+  var line = getLine(cm.doc, start.line);
+  var order = getOrder(line, cm.doc.direction);
+  if (!order || order[0].level == 0) {
+    var firstNonWS = Math.max(0, line.text.search(/\S/));
+    var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch;
+    return Pos(start.line, inWS ? 0 : firstNonWS, start.sticky)
+  }
+  return start
+}
+
+// Run a handler that was bound to a key.
+function doHandleBinding(cm, bound, dropShift) {
+  if (typeof bound == "string") {
+    bound = commands[bound];
+    if (!bound) { return false }
+  }
+  // Ensure previous input has been read, so that the handler sees a
+  // consistent view of the document
+  cm.display.input.ensurePolled();
+  var prevShift = cm.display.shift, done = false;
+  try {
+    if (cm.isReadOnly()) { cm.state.suppressEdits = true; }
+    if (dropShift) { cm.display.shift = false; }
+    done = bound(cm) != Pass;
+  } finally {
+    cm.display.shift = prevShift;
+    cm.state.suppressEdits = false;
+  }
+  return done
+}
+
+function lookupKeyForEditor(cm, name, handle) {
+  for (var i = 0; i < cm.state.keyMaps.length; i++) {
+    var result = lookupKey(name, cm.state.keyMaps[i], handle, cm);
+    if (result) { return result }
+  }
+  return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm))
+    || lookupKey(name, cm.options.keyMap, handle, cm)
+}
+
+// Note that, despite the name, this function is also used to check
+// for bound mouse clicks.
+
+var stopSeq = new Delayed;
+function dispatchKey(cm, name, e, handle) {
+  var seq = cm.state.keySeq;
+  if (seq) {
+    if (isModifierKey(name)) { return "handled" }
+    stopSeq.set(50, function () {
+      if (cm.state.keySeq == seq) {
+        cm.state.keySeq = null;
+        cm.display.input.reset();
+      }
+    });
+    name = seq + " " + name;
+  }
+  var result = lookupKeyForEditor(cm, name, handle);
+
+  if (result == "multi")
+    { cm.state.keySeq = name; }
+  if (result == "handled")
+    { signalLater(cm, "keyHandled", cm, name, e); }
+
+  if (result == "handled" || result == "multi") {
+    e_preventDefault(e);
+    restartBlink(cm);
+  }
+
+  if (seq && !result && /\'$/.test(name)) {
+    e_preventDefault(e);
+    return true
+  }
+  return !!result
+}
+
+// Handle a key from the keydown event.
+function handleKeyBinding(cm, e) {
+  var name = keyName(e, true);
+  if (!name) { return false }
+
+  if (e.shiftKey && !cm.state.keySeq) {
+    // First try to resolve full name (including 'Shift-'). Failing
+    // that, see if there is a cursor-motion command (starting with
+    // 'go') bound to the keyname without 'Shift-'.
+    return dispatchKey(cm, "Shift-" + name, e, function (b) { return doHandleBinding(cm, b, true); })
+        || dispatchKey(cm, name, e, function (b) {
+             if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion)
+               { return doHandleBinding(cm, b) }
+           })
+  } else {
+    return dispatchKey(cm, name, e, function (b) { return doHandleBinding(cm, b); })
+  }
+}
+
+// Handle a key from the keypress event
+function handleCharBinding(cm, e, ch) {
+  return dispatchKey(cm, "'" + ch + "'", e, function (b) { return doHandleBinding(cm, b, true); })
+}
+
+var lastStoppedKey = null;
+function onKeyDown(e) {
+  var cm = this;
+  cm.curOp.focus = activeElt();
+  if (signalDOMEvent(cm, e)) { return }
+  // IE does strange things with escape.
+  if (ie && ie_version < 11 && e.keyCode == 27) { e.returnValue = false; }
+  var code = e.keyCode;
+  cm.display.shift = code == 16 || e.shiftKey;
+  var handled = handleKeyBinding(cm, e);
+  if (presto) {
+    lastStoppedKey = handled ? code : null;
+    // Opera has no cut event... we try to at least catch the key combo
+    if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey))
+      { cm.replaceSelection("", null, "cut"); }
+  }
+
+  // Turn mouse into crosshair when Alt is held on Mac.
+  if (code == 18 && !/\bCodeMirror-crosshair\b/.test(cm.display.lineDiv.className))
+    { showCrossHair(cm); }
+}
+
+function showCrossHair(cm) {
+  var lineDiv = cm.display.lineDiv;
+  addClass(lineDiv, "CodeMirror-crosshair");
+
+  function up(e) {
+    if (e.keyCode == 18 || !e.altKey) {
+      rmClass(lineDiv, "CodeMirror-crosshair");
+      off(document, "keyup", up);
+      off(document, "mouseover", up);
+    }
+  }
+  on(document, "keyup", up);
+  on(document, "mouseover", up);
+}
+
+function onKeyUp(e) {
+  if (e.keyCode == 16) { this.doc.sel.shift = false; }
+  signalDOMEvent(this, e);
+}
+
+function onKeyPress(e) {
+  var cm = this;
+  if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) { return }
+  var keyCode = e.keyCode, charCode = e.charCode;
+  if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return}
+  if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) { return }
+  var ch = String.fromCharCode(charCode == null ? keyCode : charCode);
+  // Some browsers fire keypress events for backspace
+  if (ch == "\x08") { return }
+  if (handleCharBinding(cm, e, ch)) { return }
+  cm.display.input.onKeyPress(e);
+}
+
+var DOUBLECLICK_DELAY = 400;
+
+var PastClick = function(time, pos, button) {
+  this.time = time;
+  this.pos = pos;
+  this.button = button;
+};
+
+PastClick.prototype.compare = function (time, pos, button) {
+  return this.time + DOUBLECLICK_DELAY > time &&
+    cmp(pos, this.pos) == 0 && button == this.button
+};
+
+var lastClick;
+var lastDoubleClick;
+function clickRepeat(pos, button) {
+  var now = +new Date;
+  if (lastDoubleClick && lastDoubleClick.compare(now, pos, button)) {
+    lastClick = lastDoubleClick = null;
+    return "triple"
+  } else if (lastClick && lastClick.compare(now, pos, button)) {
+    lastDoubleClick = new PastClick(now, pos, button);
+    lastClick = null;
+    return "double"
+  } else {
+    lastClick = new PastClick(now, pos, button);
+    lastDoubleClick = null;
+    return "single"
+  }
+}
+
+// A mouse down can be a single click, double click, triple click,
+// start of selection drag, start of text drag, new cursor
+// (ctrl-click), rectangle drag (alt-drag), or xwin
+// middle-click-paste. Or it might be a click on something we should
+// not interfere with, such as a scrollbar or widget.
+function onMouseDown(e) {
+  var cm = this, display = cm.display;
+  if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) { return }
+  display.input.ensurePolled();
+  display.shift = e.shiftKey;
+
+  if (eventInWidget(display, e)) {
+    if (!webkit) {
+      // Briefly turn off draggability, to allow widgets to do
+      // normal dragging things.
+      display.scroller.draggable = false;
+      setTimeout(function () { return display.scroller.draggable = true; }, 100);
+    }
+    return
+  }
+  if (clickInGutter(cm, e)) { return }
+  var pos = posFromMouse(cm, e), button = e_button(e), repeat = pos ? clickRepeat(pos, button) : "single";
+  window.focus();
+
+  // #3261: make sure, that we're not starting a second selection
+  if (button == 1 && cm.state.selectingText)
+    { cm.state.selectingText(e); }
+
+  if (pos && handleMappedButton(cm, button, pos, repeat, e)) { return }
+
+  if (button == 1) {
+    if (pos) { leftButtonDown(cm, pos, repeat, e); }
+    else if (e_target(e) == display.scroller) { e_preventDefault(e); }
+  } else if (button == 2) {
+    if (pos) { extendSelection(cm.doc, pos); }
+    setTimeout(function () { return display.input.focus(); }, 20);
+  } else if (button == 3) {
+    if (captureRightClick) { onContextMenu(cm, e); }
+    else { delayBlurEvent(cm); }
+  }
+}
+
+function handleMappedButton(cm, button, pos, repeat, event) {
+  var name = "Click";
+  if (repeat == "double") { name = "Double" + name; }
+  else if (repeat == "triple") { name = "Triple" + name; }
+  name = (button == 1 ? "Left" : button == 2 ? "Middle" : "Right") + name;
+
+  return dispatchKey(cm,  addModifierNames(name, event), event, function (bound) {
+    if (typeof bound == "string") { bound = commands[bound]; }
+    if (!bound) { return false }
+    var done = false;
+    try {
+      if (cm.isReadOnly()) { cm.state.suppressEdits = true; }
+      done = bound(cm, pos) != Pass;
+    } finally {
+      cm.state.suppressEdits = false;
+    }
+    return done
+  })
+}
+
+function configureMouse(cm, repeat, event) {
+  var option = cm.getOption("configureMouse");
+  var value = option ? option(cm, repeat, event) : {};
+  if (value.unit == null) {
+    var rect = chromeOS ? event.shiftKey && event.metaKey : event.altKey;
+    value.unit = rect ? "rectangle" : repeat == "single" ? "char" : repeat == "double" ? "word" : "line";
+  }
+  if (value.extend == null || cm.doc.extend) { value.extend = cm.doc.extend || event.shiftKey; }
+  if (value.addNew == null) { value.addNew = mac ? event.metaKey : event.ctrlKey; }
+  if (value.moveOnDrag == null) { value.moveOnDrag = !(mac ? event.altKey : event.ctrlKey); }
+  return value
+}
+
+function leftButtonDown(cm, pos, repeat, event) {
+  if (ie) { setTimeout(bind(ensureFocus, cm), 0); }
+  else { cm.curOp.focus = activeElt(); }
+
+  var behavior = configureMouse(cm, repeat, event);
+
+  var sel = cm.doc.sel, contained;
+  if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() &&
+      repeat == "single" && (contained = sel.contains(pos)) > -1 &&
+      (cmp((contained = sel.ranges[contained]).from(), pos) < 0 || pos.xRel > 0) &&
+      (cmp(contained.to(), pos) > 0 || pos.xRel < 0))
+    { leftButtonStartDrag(cm, event, pos, behavior); }
+  else
+    { leftButtonSelect(cm, event, pos, behavior); }
+}
+
+// Start a text drag. When it ends, see if any dragging actually
+// happen, and treat as a click if it didn't.
+function leftButtonStartDrag(cm, event, pos, behavior) {
+  var display = cm.display, moved = false;
+  var dragEnd = operation(cm, function (e) {
+    if (webkit) { display.scroller.draggable = false; }
+    cm.state.draggingText = false;
+    off(document, "mouseup", dragEnd);
+    off(document, "mousemove", mouseMove);
+    off(display.scroller, "dragstart", dragStart);
+    off(display.scroller, "drop", dragEnd);
+    if (!moved) {
+      e_preventDefault(e);
+      if (!behavior.addNew)
+        { extendSelection(cm.doc, pos, null, null, behavior.extend); }
+      // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081)
+      if (webkit || ie && ie_version == 9)
+        { setTimeout(function () {document.body.focus(); display.input.focus();}, 20); }
+      else
+        { display.input.focus(); }
+    }
+  });
+  var mouseMove = function(e2) {
+    moved = moved || Math.abs(event.clientX - e2.clientX) + Math.abs(event.clientY - e2.clientY) >= 10;
+  };
+  var dragStart = function () { return moved = true; };
+  // Let the drag handler handle this.
+  if (webkit) { display.scroller.draggable = true; }
+  cm.state.draggingText = dragEnd;
+  dragEnd.copy = !behavior.moveOnDrag;
+  // IE's approach to draggable
+  if (display.scroller.dragDrop) { display.scroller.dragDrop(); }
+  on(document, "mouseup", dragEnd);
+  on(document, "mousemove", mouseMove);
+  on(display.scroller, "dragstart", dragStart);
+  on(display.scroller, "drop", dragEnd);
+
+  delayBlurEvent(cm);
+  setTimeout(function () { return display.input.focus(); }, 20);
+}
+
+function rangeForUnit(cm, pos, unit) {
+  if (unit == "char") { return new Range(pos, pos) }
+  if (unit == "word") { return cm.findWordAt(pos) }
+  if (unit == "line") { return new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))) }
+  var result = unit(cm, pos);
+  return new Range(result.from, result.to)
+}
+
+// Normal selection, as opposed to text dragging.
+function leftButtonSelect(cm, event, start, behavior) {
+  var display = cm.display, doc = cm.doc;
+  e_preventDefault(event);
+
+  var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges;
+  if (behavior.addNew && !behavior.extend) {
+    ourIndex = doc.sel.contains(start);
+    if (ourIndex > -1)
+      { ourRange = ranges[ourIndex]; }
+    else
+      { ourRange = new Range(start, start); }
+  } else {
+    ourRange = doc.sel.primary();
+    ourIndex = doc.sel.primIndex;
+  }
+
+  if (behavior.unit == "rectangle") {
+    if (!behavior.addNew) { ourRange = new Range(start, start); }
+    start = posFromMouse(cm, event, true, true);
+    ourIndex = -1;
+  } else {
+    var range$$1 = rangeForUnit(cm, start, behavior.unit);
+    if (behavior.extend)
+      { ourRange = extendRange(ourRange, range$$1.anchor, range$$1.head, behavior.extend); }
+    else
+      { ourRange = range$$1; }
+  }
+
+  if (!behavior.addNew) {
+    ourIndex = 0;
+    setSelection(doc, new Selection([ourRange], 0), sel_mouse);
+    startSel = doc.sel;
+  } else if (ourIndex == -1) {
+    ourIndex = ranges.length;
+    setSelection(doc, normalizeSelection(ranges.concat([ourRange]), ourIndex),
+                 {scroll: false, origin: "*mouse"});
+  } else if (ranges.length > 1 && ranges[ourIndex].empty() && behavior.unit == "char" && !behavior.extend) {
+    setSelection(doc, normalizeSelection(ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0),
+                 {scroll: false, origin: "*mouse"});
+    startSel = doc.sel;
+  } else {
+    replaceOneSelection(doc, ourIndex, ourRange, sel_mouse);
+  }
+
+  var lastPos = start;
+  function extendTo(pos) {
+    if (cmp(lastPos, pos) == 0) { return }
+    lastPos = pos;
+
+    if (behavior.unit == "rectangle") {
+      var ranges = [], tabSize = cm.options.tabSize;
+      var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize);
+      var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize);
+      var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol);
+      for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line));
+           line <= end; line++) {
+        var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize);
+        if (left == right)
+          { ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos))); }
+        else if (text.length > leftPos)
+          { ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize)))); }
+      }
+      if (!ranges.length) { ranges.push(new Range(start, start)); }
+      setSelection(doc, normalizeSelection(startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex),
+                   {origin: "*mouse", scroll: false});
+      cm.scrollIntoView(pos);
+    } else {
+      var oldRange = ourRange;
+      var range$$1 = rangeForUnit(cm, pos, behavior.unit);
+      var anchor = oldRange.anchor, head;
+      if (cmp(range$$1.anchor, anchor) > 0) {
+        head = range$$1.head;
+        anchor = minPos(oldRange.from(), range$$1.anchor);
+      } else {
+        head = range$$1.anchor;
+        anchor = maxPos(oldRange.to(), range$$1.head);
+      }
+      var ranges$1 = startSel.ranges.slice(0);
+      ranges$1[ourIndex] = new Range(clipPos(doc, anchor), head);
+      setSelection(doc, normalizeSelection(ranges$1, ourIndex), sel_mouse);
+    }
+  }
+
+  var editorSize = display.wrapper.getBoundingClientRect();
+  // Used to ensure timeout re-tries don't fire when another extend
+  // happened in the meantime (clearTimeout isn't reliable -- at
+  // least on Chrome, the timeouts still happen even when cleared,
+  // if the clear happens after their scheduled firing time).
+  var counter = 0;
+
+  function extend(e) {
+    var curCount = ++counter;
+    var cur = posFromMouse(cm, e, true, behavior.unit == "rectangle");
+    if (!cur) { return }
+    if (cmp(cur, lastPos) != 0) {
+      cm.curOp.focus = activeElt();
+      extendTo(cur);
+      var visible = visibleLines(display, doc);
+      if (cur.line >= visible.to || cur.line < visible.from)
+        { setTimeout(operation(cm, function () {if (counter == curCount) { extend(e); }}), 150); }
+    } else {
+      var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0;
+      if (outside) { setTimeout(operation(cm, function () {
+        if (counter != curCount) { return }
+        display.scroller.scrollTop += outside;
+        extend(e);
+      }), 50); }
+    }
+  }
+
+  function done(e) {
+    cm.state.selectingText = false;
+    counter = Infinity;
+    e_preventDefault(e);
+    display.input.focus();
+    off(document, "mousemove", move);
+    off(document, "mouseup", up);
+    doc.history.lastSelOrigin = null;
+  }
+
+  var move = operation(cm, function (e) {
+    if (!e_button(e)) { done(e); }
+    else { extend(e); }
+  });
+  var up = operation(cm, done);
+  cm.state.selectingText = up;
+  on(document, "mousemove", move);
+  on(document, "mouseup", up);
+}
+
+
+// Determines whether an event happened in the gutter, and fires the
+// handlers for the corresponding event.
+function gutterEvent(cm, e, type, prevent) {
+  var mX, mY;
+  try { mX = e.clientX; mY = e.clientY; }
+  catch(e) { return false }
+  if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) { return false }
+  if (prevent) { e_preventDefault(e); }
+
+  var display = cm.display;
+  var lineBox = display.lineDiv.getBoundingClientRect();
+
+  if (mY > lineBox.bottom || !hasHandler(cm, type)) { return e_defaultPrevented(e) }
+  mY -= lineBox.top - display.viewOffset;
+
+  for (var i = 0; i < cm.options.gutters.length; ++i) {
+    var g = display.gutters.childNodes[i];
+    if (g && g.getBoundingClientRect().right >= mX) {
+      var line = lineAtHeight(cm.doc, mY);
+      var gutter = cm.options.gutters[i];
+      signal(cm, type, cm, line, gutter, e);
+      return e_defaultPrevented(e)
+    }
+  }
+}
+
+function clickInGutter(cm, e) {
+  return gutterEvent(cm, e, "gutterClick", true)
+}
+
+// CONTEXT MENU HANDLING
+
+// To make the context menu work, we need to briefly unhide the
+// textarea (making it as unobtrusive as possible) to let the
+// right-click take effect on it.
+function onContextMenu(cm, e) {
+  if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) { return }
+  if (signalDOMEvent(cm, e, "contextmenu")) { return }
+  cm.display.input.onContextMenu(e);
+}
+
+function contextMenuInGutter(cm, e) {
+  if (!hasHandler(cm, "gutterContextMenu")) { return false }
+  return gutterEvent(cm, e, "gutterContextMenu", false)
+}
+
+function themeChanged(cm) {
+  cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") +
+    cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-");
+  clearCaches(cm);
+}
+
+var Init = {toString: function(){return "CodeMirror.Init"}};
+
+var defaults = {};
+var optionHandlers = {};
+
+function defineOptions(CodeMirror) {
+  var optionHandlers = CodeMirror.optionHandlers;
+
+  function option(name, deflt, handle, notOnInit) {
+    CodeMirror.defaults[name] = deflt;
+    if (handle) { optionHandlers[name] =
+      notOnInit ? function (cm, val, old) {if (old != Init) { handle(cm, val, old); }} : handle; }
+  }
+
+  CodeMirror.defineOption = option;
+
+  // Passed to option handlers when there is no old value.
+  CodeMirror.Init = Init;
+
+  // These two are, on init, called from the constructor because they
+  // have to be initialized before the editor can start at all.
+  option("value", "", function (cm, val) { return cm.setValue(val); }, true);
+  option("mode", null, function (cm, val) {
+    cm.doc.modeOption = val;
+    loadMode(cm);
+  }, true);
+
+  option("indentUnit", 2, loadMode, true);
+  option("indentWithTabs", false);
+  option("smartIndent", true);
+  option("tabSize", 4, function (cm) {
+    resetModeState(cm);
+    clearCaches(cm);
+    regChange(cm);
+  }, true);
+  option("lineSeparator", null, function (cm, val) {
+    cm.doc.lineSep = val;
+    if (!val) { return }
+    var newBreaks = [], lineNo = cm.doc.first;
+    cm.doc.iter(function (line) {
+      for (var pos = 0;;) {
+        var found = line.text.indexOf(val, pos);
+        if (found == -1) { break }
+        pos = found + val.length;
+        newBreaks.push(Pos(lineNo, found));
+      }
+      lineNo++;
+    });
+    for (var i = newBreaks.length - 1; i >= 0; i--)
+      { replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length)); }
+  });
+  option("specialChars", /[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b-\u200f\u2028\u2029\ufeff]/g, function (cm, val, old) {
+    cm.state.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g");
+    if (old != Init) { cm.refresh(); }
+  });
+  option("specialCharPlaceholder", defaultSpecialCharPlaceholder, function (cm) { return cm.refresh(); }, true);
+  option("electricChars", true);
+  option("inputStyle", mobile ? "contenteditable" : "textarea", function () {
+    throw new Error("inputStyle can not (yet) be changed in a running editor") // FIXME
+  }, true);
+  option("spellcheck", false, function (cm, val) { return cm.getInputField().spellcheck = val; }, true);
+  option("rtlMoveVisually", !windows);
+  option("wholeLineUpdateBefore", true);
+
+  option("theme", "default", function (cm) {
+    themeChanged(cm);
+    guttersChanged(cm);
+  }, true);
+  option("keyMap", "default", function (cm, val, old) {
+    var next = getKeyMap(val);
+    var prev = old != Init && getKeyMap(old);
+    if (prev && prev.detach) { prev.detach(cm, next); }
+    if (next.attach) { next.attach(cm, prev || null); }
+  });
+  option("extraKeys", null);
+  option("configureMouse", null);
+
+  option("lineWrapping", false, wrappingChanged, true);
+  option("gutters", [], function (cm) {
+    setGuttersForLineNumbers(cm.options);
+    guttersChanged(cm);
+  }, true);
+  option("fixedGutter", true, function (cm, val) {
+    cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0";
+    cm.refresh();
+  }, true);
+  option("coverGutterNextToScrollbar", false, function (cm) { return updateScrollbars(cm); }, true);
+  option("scrollbarStyle", "native", function (cm) {
+    initScrollbars(cm);
+    updateScrollbars(cm);
+    cm.display.scrollbars.setScrollTop(cm.doc.scrollTop);
+    cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft);
+  }, true);
+  option("lineNumbers", false, function (cm) {
+    setGuttersForLineNumbers(cm.options);
+    guttersChanged(cm);
+  }, true);
+  option("firstLineNumber", 1, guttersChanged, true);
+  option("lineNumberFormatter", function (integer) { return integer; }, guttersChanged, true);
+  option("showCursorWhenSelecting", false, updateSelection, true);
+
+  option("resetSelectionOnContextMenu", true);
+  option("lineWiseCopyCut", true);
+  option("pasteLinesPerSelection", true);
+
+  option("readOnly", false, function (cm, val) {
+    if (val == "nocursor") {
+      onBlur(cm);
+      cm.display.input.blur();
+    }
+    cm.display.input.readOnlyChanged(val);
+  });
+  option("disableInput", false, function (cm, val) {if (!val) { cm.display.input.reset(); }}, true);
+  option("dragDrop", true, dragDropChanged);
+  option("allowDropFileTypes", null);
+
+  option("cursorBlinkRate", 530);
+  option("cursorScrollMargin", 0);
+  option("cursorHeight", 1, updateSelection, true);
+  option("singleCursorHeightPerLine", true, updateSelection, true);
+  option("workTime", 100);
+  option("workDelay", 100);
+  option("flattenSpans", true, resetModeState, true);
+  option("addModeClass", false, resetModeState, true);
+  option("pollInterval", 100);
+  option("undoDepth", 200, function (cm, val) { return cm.doc.history.undoDepth = val; });
+  option("historyEventDelay", 1250);
+  option("viewportMargin", 10, function (cm) { return cm.refresh(); }, true);
+  option("maxHighlightLength", 10000, resetModeState, true);
+  option("moveInputWithCursor", true, function (cm, val) {
+    if (!val) { cm.display.input.resetPosition(); }
+  });
+
+  option("tabindex", null, function (cm, val) { return cm.display.input.getField().tabIndex = val || ""; });
+  option("autofocus", null);
+  option("direction", "ltr", function (cm, val) { return cm.doc.setDirection(val); }, true);
+}
+
+function guttersChanged(cm) {
+  updateGutters(cm);
+  regChange(cm);
+  alignHorizontally(cm);
+}
+
+function dragDropChanged(cm, value, old) {
+  var wasOn = old && old != Init;
+  if (!value != !wasOn) {
+    var funcs = cm.display.dragFunctions;
+    var toggle = value ? on : off;
+    toggle(cm.display.scroller, "dragstart", funcs.start);
+    toggle(cm.display.scroller, "dragenter", funcs.enter);
+    toggle(cm.display.scroller, "dragover", funcs.over);
+    toggle(cm.display.scroller, "dragleave", funcs.leave);
+    toggle(cm.display.scroller, "drop", funcs.drop);
+  }
+}
+
+function wrappingChanged(cm) {
+  if (cm.options.lineWrapping) {
+    addClass(cm.display.wrapper, "CodeMirror-wrap");
+    cm.display.sizer.style.minWidth = "";
+    cm.display.sizerWidth = null;
+  } else {
+    rmClass(cm.display.wrapper, "CodeMirror-wrap");
+    findMaxLine(cm);
+  }
+  estimateLineHeights(cm);
+  regChange(cm);
+  clearCaches(cm);
+  setTimeout(function () { return updateScrollbars(cm); }, 100);
+}
+
+// A CodeMirror instance represents an editor. This is the object
+// that user code is usually dealing with.
+
+function CodeMirror$1(place, options) {
+  var this$1 = this;
+
+  if (!(this instanceof CodeMirror$1)) { return new CodeMirror$1(place, options) }
+
+  this.options = options = options ? copyObj(options) : {};
+  // Determine effective options based on given values and defaults.
+  copyObj(defaults, options, false);
+  setGuttersForLineNumbers(options);
+
+  var doc = options.value;
+  if (typeof doc == "string") { doc = new Doc(doc, options.mode, null, options.lineSeparator, options.direction); }
+  this.doc = doc;
+
+  var input = new CodeMirror$1.inputStyles[options.inputStyle](this);
+  var display = this.display = new Display(place, doc, input);
+  display.wrapper.CodeMirror = this;
+  updateGutters(this);
+  themeChanged(this);
+  if (options.lineWrapping)
+    { this.display.wrapper.className += " CodeMirror-wrap"; }
+  initScrollbars(this);
+
+  this.state = {
+    keyMaps: [],  // stores maps added by addKeyMap
+    overlays: [], // highlighting overlays, as added by addOverlay
+    modeGen: 0,   // bumped when mode/overlay changes, used to invalidate highlighting info
+    overwrite: false,
+    delayingBlurEvent: false,
+    focused: false,
+    suppressEdits: false, // used to disable editing during key handlers when in readOnly mode
+    pasteIncoming: false, cutIncoming: false, // help recognize paste/cut edits in input.poll
+    selectingText: false,
+    draggingText: false,
+    highlight: new Delayed(), // stores highlight worker timeout
+    keySeq: null,  // Unfinished key sequence
+    specialChars: null
+  };
+
+  if (options.autofocus && !mobile) { display.input.focus(); }
+
+  // Override magic textarea content restore that IE sometimes does
+  // on our hidden textarea on reload
+  if (ie && ie_version < 11) { setTimeout(function () { return this$1.display.input.reset(true); }, 20); }
+
+  registerEventHandlers(this);
+  ensureGlobalHandlers();
+
+  startOperation(this);
+  this.curOp.forceUpdate = true;
+  attachDoc(this, doc);
+
+  if ((options.autofocus && !mobile) || this.hasFocus())
+    { setTimeout(bind(onFocus, this), 20); }
+  else
+    { onBlur(this); }
+
+  for (var opt in optionHandlers) { if (optionHandlers.hasOwnProperty(opt))
+    { optionHandlers[opt](this$1, options[opt], Init); } }
+  maybeUpdateLineNumberWidth(this);
+  if (options.finishInit) { options.finishInit(this); }
+  for (var i = 0; i < initHooks.length; ++i) { initHooks[i](this$1); }
+  endOperation(this);
+  // Suppress optimizelegibility in Webkit, since it breaks text
+  // measuring on line wrapping boundaries.
+  if (webkit && options.lineWrapping &&
+      getComputedStyle(display.lineDiv).textRendering == "optimizelegibility")
+    { display.lineDiv.style.textRendering = "auto"; }
+}
+
+// The default configuration options.
+CodeMirror$1.defaults = defaults;
+// Functions to run when options are changed.
+CodeMirror$1.optionHandlers = optionHandlers;
+
+// Attach the necessary event handlers when initializing the editor
+function registerEventHandlers(cm) {
+  var d = cm.display;
+  on(d.scroller, "mousedown", operation(cm, onMouseDown));
+  // Older IE's will not fire a second mousedown for a double click
+  if (ie && ie_version < 11)
+    { on(d.scroller, "dblclick", operation(cm, function (e) {
+      if (signalDOMEvent(cm, e)) { return }
+      var pos = posFromMouse(cm, e);
+      if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) { return }
+      e_preventDefault(e);
+      var word = cm.findWordAt(pos);
+      extendSelection(cm.doc, word.anchor, word.head);
+    })); }
+  else
+    { on(d.scroller, "dblclick", function (e) { return signalDOMEvent(cm, e) || e_preventDefault(e); }); }
+  // Some browsers fire contextmenu *after* opening the menu, at
+  // which point we can't mess with it anymore. Context menu is
+  // handled in onMouseDown for these browsers.
+  if (!captureRightClick) { on(d.scroller, "contextmenu", function (e) { return onContextMenu(cm, e); }); }
+
+  // Used to suppress mouse event handling when a touch happens
+  var touchFinished, prevTouch = {end: 0};
+  function finishTouch() {
+    if (d.activeTouch) {
+      touchFinished = setTimeout(function () { return d.activeTouch = null; }, 1000);
+      prevTouch = d.activeTouch;
+      prevTouch.end = +new Date;
+    }
+  }
+  function isMouseLikeTouchEvent(e) {
+    if (e.touches.length != 1) { return false }
+    var touch = e.touches[0];
+    return touch.radiusX <= 1 && touch.radiusY <= 1
+  }
+  function farAway(touch, other) {
+    if (other.left == null) { return true }
+    var dx = other.left - touch.left, dy = other.top - touch.top;
+    return dx * dx + dy * dy > 20 * 20
+  }
+  on(d.scroller, "touchstart", function (e) {
+    if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e)) {
+      d.input.ensurePolled();
+      clearTimeout(touchFinished);
+      var now = +new Date;
+      d.activeTouch = {start: now, moved: false,
+                       prev: now - prevTouch.end <= 300 ? prevTouch : null};
+      if (e.touches.length == 1) {
+        d.activeTouch.left = e.touches[0].pageX;
+        d.activeTouch.top = e.touches[0].pageY;
+      }
+    }
+  });
+  on(d.scroller, "touchmove", function () {
+    if (d.activeTouch) { d.activeTouch.moved = true; }
+  });
+  on(d.scroller, "touchend", function (e) {
+    var touch = d.activeTouch;
+    if (touch && !eventInWidget(d, e) && touch.left != null &&
+        !touch.moved && new Date - touch.start < 300) {
+      var pos = cm.coordsChar(d.activeTouch, "page"), range;
+      if (!touch.prev || farAway(touch, touch.prev)) // Single tap
+        { range = new Range(pos, pos); }
+      else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap
+        { range = cm.findWordAt(pos); }
+      else // Triple tap
+        { range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); }
+      cm.setSelection(range.anchor, range.head);
+      cm.focus();
+      e_preventDefault(e);
+    }
+    finishTouch();
+  });
+  on(d.scroller, "touchcancel", finishTouch);
+
+  // Sync scrolling between fake scrollbars and real scrollable
+  // area, ensure viewport is updated when scrolling.
+  on(d.scroller, "scroll", function () {
+    if (d.scroller.clientHeight) {
+      updateScrollTop(cm, d.scroller.scrollTop);
+      setScrollLeft(cm, d.scroller.scrollLeft, true);
+      signal(cm, "scroll", cm);
+    }
+  });
+
+  // Listen to wheel events in order to try and update the viewport on time.
+  on(d.scroller, "mousewheel", function (e) { return onScrollWheel(cm, e); });
+  on(d.scroller, "DOMMouseScroll", function (e) { return onScrollWheel(cm, e); });
+
+  // Prevent wrapper from ever scrolling
+  on(d.wrapper, "scroll", function () { return d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; });
+
+  d.dragFunctions = {
+    enter: function (e) {if (!signalDOMEvent(cm, e)) { e_stop(e); }},
+    over: function (e) {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e); }},
+    start: function (e) { return onDragStart(cm, e); },
+    drop: operation(cm, onDrop),
+    leave: function (e) {if (!signalDOMEvent(cm, e)) { clearDragCursor(cm); }}
+  };
+
+  var inp = d.input.getField();
+  on(inp, "keyup", function (e) { return onKeyUp.call(cm, e); });
+  on(inp, "keydown", operation(cm, onKeyDown));
+  on(inp, "keypress", operation(cm, onKeyPress));
+  on(inp, "focus", function (e) { return onFocus(cm, e); });
+  on(inp, "blur", function (e) { return onBlur(cm, e); });
+}
+
+var initHooks = [];
+CodeMirror$1.defineInitHook = function (f) { return initHooks.push(f); };
+
+// Indent the given line. The how parameter can be "smart",
+// "add"/null, "subtract", or "prev". When aggressive is false
+// (typically set to true for forced single-line indents), empty
+// lines are not indented, and places where the mode returns Pass
+// are left alone.
+function indentLine(cm, n, how, aggressive) {
+  var doc = cm.doc, state;
+  if (how == null) { how = "add"; }
+  if (how == "smart") {
+    // Fall back to "prev" when the mode doesn't have an indentation
+    // method.
+    if (!doc.mode.indent) { how = "prev"; }
+    else { state = getContextBefore(cm, n).state; }
+  }
+
+  var tabSize = cm.options.tabSize;
+  var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize);
+  if (line.stateAfter) { line.stateAfter = null; }
+  var curSpaceString = line.text.match(/^\s*/)[0], indentation;
+  if (!aggressive && !/\S/.test(line.text)) {
+    indentation = 0;
+    how = "not";
+  } else if (how == "smart") {
+    indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text);
+    if (indentation == Pass || indentation > 150) {
+      if (!aggressive) { return }
+      how = "prev";
+    }
+  }
+  if (how == "prev") {
+    if (n > doc.first) { indentation = countColumn(getLine(doc, n-1).text, null, tabSize); }
+    else { indentation = 0; }
+  } else if (how == "add") {
+    indentation = curSpace + cm.options.indentUnit;
+  } else if (how == "subtract") {
+    indentation = curSpace - cm.options.indentUnit;
+  } else if (typeof how == "number") {
+    indentation = curSpace + how;
+  }
+  indentation = Math.max(0, indentation);
+
+  var indentString = "", pos = 0;
+  if (cm.options.indentWithTabs)
+    { for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t";} }
+  if (pos < indentation) { indentString += spaceStr(indentation - pos); }
+
+  if (indentString != curSpaceString) {
+    replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input");
+    line.stateAfter = null;
+    return true
+  } else {
+    // Ensure that, if the cursor was in the whitespace at the start
+    // of the line, it is moved to the end of that space.
+    for (var i$1 = 0; i$1 < doc.sel.ranges.length; i$1++) {
+      var range = doc.sel.ranges[i$1];
+      if (range.head.line == n && range.head.ch < curSpaceString.length) {
+        var pos$1 = Pos(n, curSpaceString.length);
+        replaceOneSelection(doc, i$1, new Range(pos$1, pos$1));
+        break
+      }
+    }
+  }
+}
+
+// This will be set to a {lineWise: bool, text: [string]} object, so
+// that, when pasting, we know what kind of selections the copied
+// text was made out of.
+var lastCopied = null;
+
+function setLastCopied(newLastCopied) {
+  lastCopied = newLastCopied;
+}
+
+function applyTextInput(cm, inserted, deleted, sel, origin) {
+  var doc = cm.doc;
+  cm.display.shift = false;
+  if (!sel) { sel = doc.sel; }
+
+  var paste = cm.state.pasteIncoming || origin == "paste";
+  var textLines = splitLinesAuto(inserted), multiPaste = null;
+  // When pasing N lines into N selections, insert one line per selection
+  if (paste && sel.ranges.length > 1) {
+    if (lastCopied && lastCopied.text.join("\n") == inserted) {
+      if (sel.ranges.length % lastCopied.text.length == 0) {
+        multiPaste = [];
+        for (var i = 0; i < lastCopied.text.length; i++)
+          { multiPaste.push(doc.splitLines(lastCopied.text[i])); }
+      }
+    } else if (textLines.length == sel.ranges.length && cm.options.pasteLinesPerSelection) {
+      multiPaste = map(textLines, function (l) { return [l]; });
+    }
+  }
+
+  var updateInput;
+  // Normal behavior is to insert the new text into every selection
+  for (var i$1 = sel.ranges.length - 1; i$1 >= 0; i$1--) {
+    var range$$1 = sel.ranges[i$1];
+    var from = range$$1.from(), to = range$$1.to();
+    if (range$$1.empty()) {
+      if (deleted && deleted > 0) // Handle deletion
+        { from = Pos(from.line, from.ch - deleted); }
+      else if (cm.state.overwrite && !paste) // Handle overwrite
+        { to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length)); }
+      else if (lastCopied && lastCopied.lineWise && lastCopied.text.join("\n") == inserted)
+        { from = to = Pos(from.line, 0); }
+    }
+    updateInput = cm.curOp.updateInput;
+    var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i$1 % multiPaste.length] : textLines,
+                       origin: origin || (paste ? "paste" : cm.state.cutIncoming ? "cut" : "+input")};
+    makeChange(cm.doc, changeEvent);
+    signalLater(cm, "inputRead", cm, changeEvent);
+  }
+  if (inserted && !paste)
+    { triggerElectric(cm, inserted); }
+
+  ensureCursorVisible(cm);
+  cm.curOp.updateInput = updateInput;
+  cm.curOp.typing = true;
+  cm.state.pasteIncoming = cm.state.cutIncoming = false;
+}
+
+function handlePaste(e, cm) {
+  var pasted = e.clipboardData && e.clipboardData.getData("Text");
+  if (pasted) {
+    e.preventDefault();
+    if (!cm.isReadOnly() && !cm.options.disableInput)
+      { runInOp(cm, function () { return applyTextInput(cm, pasted, 0, null, "paste"); }); }
+    return true
+  }
+}
+
+function triggerElectric(cm, inserted) {
+  // When an 'electric' character is inserted, immediately trigger a reindent
+  if (!cm.options.electricChars || !cm.options.smartIndent) { return }
+  var sel = cm.doc.sel;
+
+  for (var i = sel.ranges.length - 1; i >= 0; i--) {
+    var range$$1 = sel.ranges[i];
+    if (range$$1.head.ch > 100 || (i && sel.ranges[i - 1].head.line == range$$1.head.line)) { continue }
+    var mode = cm.getModeAt(range$$1.head);
+    var indented = false;
+    if (mode.electricChars) {
+      for (var j = 0; j < mode.electricChars.length; j++)
+        { if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) {
+          indented = indentLine(cm, range$$1.head.line, "smart");
+          break
+        } }
+    } else if (mode.electricInput) {
+      if (mode.electricInput.test(getLine(cm.doc, range$$1.head.line).text.slice(0, range$$1.head.ch)))
+        { indented = indentLine(cm, range$$1.head.line, "smart"); }
+    }
+    if (indented) { signalLater(cm, "electricInput", cm, range$$1.head.line); }
+  }
+}
+
+function copyableRanges(cm) {
+  var text = [], ranges = [];
+  for (var i = 0; i < cm.doc.sel.ranges.length; i++) {
+    var line = cm.doc.sel.ranges[i].head.line;
+    var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)};
+    ranges.push(lineRange);
+    text.push(cm.getRange(lineRange.anchor, lineRange.head));
+  }
+  return {text: text, ranges: ranges}
+}
+
+function disableBrowserMagic(field, spellcheck) {
+  field.setAttribute("autocorrect", "off");
+  field.setAttribute("autocapitalize", "off");
+  field.setAttribute("spellcheck", !!spellcheck);
+}
+
+function hiddenTextarea() {
+  var te = elt("textarea", null, null, "position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none");
+  var div = elt("div", [te], null, "overflow: hidden; position: relative; width: 3px; height: 0px;");
+  // The textarea is kept positioned near the cursor to prevent the
+  // fact that it'll be scrolled into view on input from scrolling
+  // our fake cursor out of view. On webkit, when wrap=off, paste is
+  // very slow. So make the area wide instead.
+  if (webkit) { te.style.width = "1000px"; }
+  else { te.setAttribute("wrap", "off"); }
+  // If border: 0; -- iOS fails to open keyboard (issue #1287)
+  if (ios) { te.style.border = "1px solid black"; }
+  disableBrowserMagic(te);
+  return div
+}
+
+// The publicly visible API. Note that methodOp(f) means
+// 'wrap f in an operation, performed on its `this` parameter'.
+
+// This is not the complete set of editor methods. Most of the
+// methods defined on the Doc type are also injected into
+// CodeMirror.prototype, for backwards compatibility and
+// convenience.
+
+var addEditorMethods = function(CodeMirror) {
+  var optionHandlers = CodeMirror.optionHandlers;
+
+  var helpers = CodeMirror.helpers = {};
+
+  CodeMirror.prototype = {
+    constructor: CodeMirror,
+    focus: function(){window.focus(); this.display.input.focus();},
+
+    setOption: function(option, value) {
+      var options = this.options, old = options[option];
+      if (options[option] == value && option != "mode") { return }
+      options[option] = value;
+      if (optionHandlers.hasOwnProperty(option))
+        { operation(this, optionHandlers[option])(this, value, old); }
+      signal(this, "optionChange", this, option);
+    },
+
+    getOption: function(option) {return this.options[option]},
+    getDoc: function() {return this.doc},
+
+    addKeyMap: function(map$$1, bottom) {
+      this.state.keyMaps[bottom ? "push" : "unshift"](getKeyMap(map$$1));
+    },
+    removeKeyMap: function(map$$1) {
+      var maps = this.state.keyMaps;
+      for (var i = 0; i < maps.length; ++i)
+        { if (maps[i] == map$$1 || maps[i].name == map$$1) {
+          maps.splice(i, 1);
+          return true
+        } }
+    },
+
+    addOverlay: methodOp(function(spec, options) {
+      var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec);
+      if (mode.startState) { throw new Error("Overlays may not be stateful.") }
+      insertSorted(this.state.overlays,
+                   {mode: mode, modeSpec: spec, opaque: options && options.opaque,
+                    priority: (options && options.priority) || 0},
+                   function (overlay) { return overlay.priority; });
+      this.state.modeGen++;
+      regChange(this);
+    }),
+    removeOverlay: methodOp(function(spec) {
+      var this$1 = this;
+
+      var overlays = this.state.overlays;
+      for (var i = 0; i < overlays.length; ++i) {
+        var cur = overlays[i].modeSpec;
+        if (cur == spec || typeof spec == "string" && cur.name == spec) {
+          overlays.splice(i, 1);
+          this$1.state.modeGen++;
+          regChange(this$1);
+          return
+        }
+      }
+    }),
+
+    indentLine: methodOp(function(n, dir, aggressive) {
+      if (typeof dir != "string" && typeof dir != "number") {
+        if (dir == null) { dir = this.options.smartIndent ? "smart" : "prev"; }
+        else { dir = dir ? "add" : "subtract"; }
+      }
+      if (isLine(this.doc, n)) { indentLine(this, n, dir, aggressive); }
+    }),
+    indentSelection: methodOp(function(how) {
+      var this$1 = this;
+
+      var ranges = this.doc.sel.ranges, end = -1;
+      for (var i = 0; i < ranges.length; i++) {
+        var range$$1 = ranges[i];
+        if (!range$$1.empty()) {
+          var from = range$$1.from(), to = range$$1.to();
+          var start = Math.max(end, from.line);
+          end = Math.min(this$1.lastLine(), to.line - (to.ch ? 0 : 1)) + 1;
+          for (var j = start; j < end; ++j)
+            { indentLine(this$1, j, how); }
+          var newRanges = this$1.doc.sel.ranges;
+          if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0)
+            { replaceOneSelection(this$1.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll); }
+        } else if (range$$1.head.line > end) {
+          indentLine(this$1, range$$1.head.line, how, true);
+          end = range$$1.head.line;
+          if (i == this$1.doc.sel.primIndex) { ensureCursorVisible(this$1); }
+        }
+      }
+    }),
+
+    // Fetch the parser token for a given character. Useful for hacks
+    // that want to inspect the mode state (say, for completion).
+    getTokenAt: function(pos, precise) {
+      return takeToken(this, pos, precise)
+    },
+
+    getLineTokens: function(line, precise) {
+      return takeToken(this, Pos(line), precise, true)
+    },
+
+    getTokenTypeAt: function(pos) {
+      pos = clipPos(this.doc, pos);
+      var styles = getLineStyles(this, getLine(this.doc, pos.line));
+      var before = 0, after = (styles.length - 1) / 2, ch = pos.ch;
+      var type;
+      if (ch == 0) { type = styles[2]; }
+      else { for (;;) {
+        var mid = (before + after) >> 1;
+        if ((mid ? styles[mid * 2 - 1] : 0) >= ch) { after = mid; }
+        else if (styles[mid * 2 + 1] < ch) { before = mid + 1; }
+        else { type = styles[mid * 2 + 2]; break }
+      } }
+      var cut = type ? type.indexOf("overlay ") : -1;
+      return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1)
+    },
+
+    getModeAt: function(pos) {
+      var mode = this.doc.mode;
+      if (!mode.innerMode) { return mode }
+      return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode
+    },
+
+    getHelper: function(pos, type) {
+      return this.getHelpers(pos, type)[0]
+    },
+
+    getHelpers: function(pos, type) {
+      var this$1 = this;
+
+      var found = [];
+      if (!helpers.hasOwnProperty(type)) { return found }
+      var help = helpers[type], mode = this.getModeAt(pos);
+      if (typeof mode[type] == "string") {
+        if (help[mode[type]]) { found.push(help[mode[type]]); }
+      } else if (mode[type]) {
+        for (var i = 0; i < mode[type].length; i++) {
+          var val = help[mode[type][i]];
+          if (val) { found.push(val); }
+        }
+      } else if (mode.helperType && help[mode.helperType]) {
+        found.push(help[mode.helperType]);
+      } else if (help[mode.name]) {
+        found.push(help[mode.name]);
+      }
+      for (var i$1 = 0; i$1 < help._global.length; i$1++) {
+        var cur = help._global[i$1];
+        if (cur.pred(mode, this$1) && indexOf(found, cur.val) == -1)
+          { found.push(cur.val); }
+      }
+      return found
+    },
+
+    getStateAfter: function(line, precise) {
+      var doc = this.doc;
+      line = clipLine(doc, line == null ? doc.first + doc.size - 1: line);
+      return getContextBefore(this, line + 1, precise).state
+    },
+
+    cursorCoords: function(start, mode) {
+      var pos, range$$1 = this.doc.sel.primary();
+      if (start == null) { pos = range$$1.head; }
+      else if (typeof start == "object") { pos = clipPos(this.doc, start); }
+      else { pos = start ? range$$1.from() : range$$1.to(); }
+      return cursorCoords(this, pos, mode || "page")
+    },
+
+    charCoords: function(pos, mode) {
+      return charCoords(this, clipPos(this.doc, pos), mode || "page")
+    },
+
+    coordsChar: function(coords, mode) {
+      coords = fromCoordSystem(this, coords, mode || "page");
+      return coordsChar(this, coords.left, coords.top)
+    },
+
+    lineAtHeight: function(height, mode) {
+      height = fromCoordSystem(this, {top: height, left: 0}, mode || "page").top;
+      return lineAtHeight(this.doc, height + this.display.viewOffset)
+    },
+    heightAtLine: function(line, mode, includeWidgets) {
+      var end = false, lineObj;
+      if (typeof line == "number") {
+        var last = this.doc.first + this.doc.size - 1;
+        if (line < this.doc.first) { line = this.doc.first; }
+        else if (line > last) { line = last; end = true; }
+        lineObj = getLine(this.doc, line);
+      } else {
+        lineObj = line;
+      }
+      return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || "page", includeWidgets || end).top +
+        (end ? this.doc.height - heightAtLine(lineObj) : 0)
+    },
+
+    defaultTextHeight: function() { return textHeight(this.display) },
+    defaultCharWidth: function() { return charWidth(this.display) },
+
+    getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo}},
+
+    addWidget: function(pos, node, scroll, vert, horiz) {
+      var display = this.display;
+      pos = cursorCoords(this, clipPos(this.doc, pos));
+      var top = pos.bottom, left = pos.left;
+      node.style.position = "absolute";
+      node.setAttribute("cm-ignore-events", "true");
+      this.display.input.setUneditable(node);
+      display.sizer.appendChild(node);
+      if (vert == "over") {
+        top = pos.top;
+      } else if (vert == "above" || vert == "near") {
+        var vspace = Math.max(display.wrapper.clientHeight, this.doc.height),
+        hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth);
+        // Default to positioning above (if specified and possible); otherwise default to positioning below
+        if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight)
+          { top = pos.top - node.offsetHeight; }
+        else if (pos.bottom + node.offsetHeight <= vspace)
+          { top = pos.bottom; }
+        if (left + node.offsetWidth > hspace)
+          { left = hspace - node.offsetWidth; }
+      }
+      node.style.top = top + "px";
+      node.style.left = node.style.right = "";
+      if (horiz == "right") {
+        left = display.sizer.clientWidth - node.offsetWidth;
+        node.style.right = "0px";
+      } else {
+        if (horiz == "left") { left = 0; }
+        else if (horiz == "middle") { left = (display.sizer.clientWidth - node.offsetWidth) / 2; }
+        node.style.left = left + "px";
+      }
+      if (scroll)
+        { scrollIntoView(this, {left: left, top: top, right: left + node.offsetWidth, bottom: top + node.offsetHeight}); }
+    },
+
+    triggerOnKeyDown: methodOp(onKeyDown),
+    triggerOnKeyPress: methodOp(onKeyPress),
+    triggerOnKeyUp: onKeyUp,
+    triggerOnMouseDown: methodOp(onMouseDown),
+
+    execCommand: function(cmd) {
+      if (commands.hasOwnProperty(cmd))
+        { return commands[cmd].call(null, this) }
+    },
+
+    triggerElectric: methodOp(function(text) { triggerElectric(this, text); }),
+
+    findPosH: function(from, amount, unit, visually) {
+      var this$1 = this;
+
+      var dir = 1;
+      if (amount < 0) { dir = -1; amount = -amount; }
+      var cur = clipPos(this.doc, from);
+      for (var i = 0; i < amount; ++i) {
+        cur = findPosH(this$1.doc, cur, dir, unit, visually);
+        if (cur.hitSide) { break }
+      }
+      return cur
+    },
+
+    moveH: methodOp(function(dir, unit) {
+      var this$1 = this;
+
+      this.extendSelectionsBy(function (range$$1) {
+        if (this$1.display.shift || this$1.doc.extend || range$$1.empty())
+          { return findPosH(this$1.doc, range$$1.head, dir, unit, this$1.options.rtlMoveVisually) }
+        else
+          { return dir < 0 ? range$$1.from() : range$$1.to() }
+      }, sel_move);
+    }),
+
+    deleteH: methodOp(function(dir, unit) {
+      var sel = this.doc.sel, doc = this.doc;
+      if (sel.somethingSelected())
+        { doc.replaceSelection("", null, "+delete"); }
+      else
+        { deleteNearSelection(this, function (range$$1) {
+          var other = findPosH(doc, range$$1.head, dir, unit, false);
+          return dir < 0 ? {from: other, to: range$$1.head} : {from: range$$1.head, to: other}
+        }); }
+    }),
+
+    findPosV: function(from, amount, unit, goalColumn) {
+      var this$1 = this;
+
+      var dir = 1, x = goalColumn;
+      if (amount < 0) { dir = -1; amount = -amount; }
+      var cur = clipPos(this.doc, from);
+      for (var i = 0; i < amount; ++i) {
+        var coords = cursorCoords(this$1, cur, "div");
+        if (x == null) { x = coords.left; }
+        else { coords.left = x; }
+        cur = findPosV(this$1, coords, dir, unit);
+        if (cur.hitSide) { break }
+      }
+      return cur
+    },
+
+    moveV: methodOp(function(dir, unit) {
+      var this$1 = this;
+
+      var doc = this.doc, goals = [];
+      var collapse = !this.display.shift && !doc.extend && doc.sel.somethingSelected();
+      doc.extendSelectionsBy(function (range$$1) {
+        if (collapse)
+          { return dir < 0 ? range$$1.from() : range$$1.to() }
+        var headPos = cursorCoords(this$1, range$$1.head, "div");
+        if (range$$1.goalColumn != null) { headPos.left = range$$1.goalColumn; }
+        goals.push(headPos.left);
+        var pos = findPosV(this$1, headPos, dir, unit);
+        if (unit == "page" && range$$1 == doc.sel.primary())
+          { addToScrollTop(this$1, charCoords(this$1, pos, "div").top - headPos.top); }
+        return pos
+      }, sel_move);
+      if (goals.length) { for (var i = 0; i < doc.sel.ranges.length; i++)
+        { doc.sel.ranges[i].goalColumn = goals[i]; } }
+    }),
+
+    // Find the word at the given position (as returned by coordsChar).
+    findWordAt: function(pos) {
+      var doc = this.doc, line = getLine(doc, pos.line).text;
+      var start = pos.ch, end = pos.ch;
+      if (line) {
+        var helper = this.getHelper(pos, "wordChars");
+        if ((pos.sticky == "before" || end == line.length) && start) { --start; } else { ++end; }
+        var startChar = line.charAt(start);
+        var check = isWordChar(startChar, helper)
+          ? function (ch) { return isWordChar(ch, helper); }
+          : /\s/.test(startChar) ? function (ch) { return /\s/.test(ch); }
+          : function (ch) { return (!/\s/.test(ch) && !isWordChar(ch)); };
+        while (start > 0 && check(line.charAt(start - 1))) { --start; }
+        while (end < line.length && check(line.charAt(end))) { ++end; }
+      }
+      return new Range(Pos(pos.line, start), Pos(pos.line, end))
+    },
+
+    toggleOverwrite: function(value) {
+      if (value != null && value == this.state.overwrite) { return }
+      if (this.state.overwrite = !this.state.overwrite)
+        { addClass(this.display.cursorDiv, "CodeMirror-overwrite"); }
+      else
+        { rmClass(this.display.cursorDiv, "CodeMirror-overwrite"); }
+
+      signal(this, "overwriteToggle", this, this.state.overwrite);
+    },
+    hasFocus: function() { return this.display.input.getField() == activeElt() },
+    isReadOnly: function() { return !!(this.options.readOnly || this.doc.cantEdit) },
+
+    scrollTo: methodOp(function (x, y) { scrollToCoords(this, x, y); }),
+    getScrollInfo: function() {
+      var scroller = this.display.scroller;
+      return {left: scroller.scrollLeft, top: scroller.scrollTop,
+              height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight,
+              width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth,
+              clientHeight: displayHeight(this), clientWidth: displayWidth(this)}
+    },
+
+    scrollIntoView: methodOp(function(range$$1, margin) {
+      if (range$$1 == null) {
+        range$$1 = {from: this.doc.sel.primary().head, to: null};
+        if (margin == null) { margin = this.options.cursorScrollMargin; }
+      } else if (typeof range$$1 == "number") {
+        range$$1 = {from: Pos(range$$1, 0), to: null};
+      } else if (range$$1.from == null) {
+        range$$1 = {from: range$$1, to: null};
+      }
+      if (!range$$1.to) { range$$1.to = range$$1.from; }
+      range$$1.margin = margin || 0;
+
+      if (range$$1.from.line != null) {
+        scrollToRange(this, range$$1);
+      } else {
+        scrollToCoordsRange(this, range$$1.from, range$$1.to, range$$1.margin);
+      }
+    }),
+
+    setSize: methodOp(function(width, height) {
+      var this$1 = this;
+
+      var interpret = function (val) { return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val; };
+      if (width != null) { this.display.wrapper.style.width = interpret(width); }
+      if (height != null) { this.display.wrapper.style.height = interpret(height); }
+      if (this.options.lineWrapping) { clearLineMeasurementCache(this); }
+      var lineNo$$1 = this.display.viewFrom;
+      this.doc.iter(lineNo$$1, this.display.viewTo, function (line) {
+        if (line.widgets) { for (var i = 0; i < line.widgets.length; i++)
+          { if (line.widgets[i].noHScroll) { regLineChange(this$1, lineNo$$1, "widget"); break } } }
+        ++lineNo$$1;
+      });
+      this.curOp.forceUpdate = true;
+      signal(this, "refresh", this);
+    }),
+
+    operation: function(f){return runInOp(this, f)},
+
+    refresh: methodOp(function() {
+      var oldHeight = this.display.cachedTextHeight;
+      regChange(this);
+      this.curOp.forceUpdate = true;
+      clearCaches(this);
+      scrollToCoords(this, this.doc.scrollLeft, this.doc.scrollTop);
+      updateGutterSpace(this);
+      if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5)
+        { estimateLineHeights(this); }
+      signal(this, "refresh", this);
+    }),
+
+    swapDoc: methodOp(function(doc) {
+      var old = this.doc;
+      old.cm = null;
+      attachDoc(this, doc);
+      clearCaches(this);
+      this.display.input.reset();
+      scrollToCoords(this, doc.scrollLeft, doc.scrollTop);
+      this.curOp.forceScroll = true;
+      signalLater(this, "swapDoc", this, old);
+      return old
+    }),
+
+    getInputField: function(){return this.display.input.getField()},
+    getWrapperElement: function(){return this.display.wrapper},
+    getScrollerElement: function(){return this.display.scroller},
+    getGutterElement: function(){return this.display.gutters}
+  };
+  eventMixin(CodeMirror);
+
+  CodeMirror.registerHelper = function(type, name, value) {
+    if (!helpers.hasOwnProperty(type)) { helpers[type] = CodeMirror[type] = {_global: []}; }
+    helpers[type][name] = value;
+  };
+  CodeMirror.registerGlobalHelper = function(type, name, predicate, value) {
+    CodeMirror.registerHelper(type, name, value);
+    helpers[type]._global.push({pred: predicate, val: value});
+  };
+};
+
+// Used for horizontal relative motion. Dir is -1 or 1 (left or
+// right), unit can be "char", "column" (like char, but doesn't
+// cross line boundaries), "word" (across next word), or "group" (to
+// the start of next group of word or non-word-non-whitespace
+// chars). The visually param controls whether, in right-to-left
+// text, direction 1 means to move towards the next index in the
+// string, or towards the character to the right of the current
+// position. The resulting position will have a hitSide=true
+// property if it reached the end of the document.
+function findPosH(doc, pos, dir, unit, visually) {
+  var oldPos = pos;
+  var origDir = dir;
+  var lineObj = getLine(doc, pos.line);
+  function findNextLine() {
+    var l = pos.line + dir;
+    if (l < doc.first || l >= doc.first + doc.size) { return false }
+    pos = new Pos(l, pos.ch, pos.sticky);
+    return lineObj = getLine(doc, l)
+  }
+  function moveOnce(boundToLine) {
+    var next;
+    if (visually) {
+      next = moveVisually(doc.cm, lineObj, pos, dir);
+    } else {
+      next = moveLogically(lineObj, pos, dir);
+    }
+    if (next == null) {
+      if (!boundToLine && findNextLine())
+        { pos = endOfLine(visually, doc.cm, lineObj, pos.line, dir); }
+      else
+        { return false }
+    } else {
+      pos = next;
+    }
+    return true
+  }
+
+  if (unit == "char") {
+    moveOnce();
+  } else if (unit == "column") {
+    moveOnce(true);
+  } else if (unit == "word" || unit == "group") {
+    var sawType = null, group = unit == "group";
+    var helper = doc.cm && doc.cm.getHelper(pos, "wordChars");
+    for (var first = true;; first = false) {
+      if (dir < 0 && !moveOnce(!first)) { break }
+      var cur = lineObj.text.charAt(pos.ch) || "\n";
+      var type = isWordChar(cur, helper) ? "w"
+        : group && cur == "\n" ? "n"
+        : !group || /\s/.test(cur) ? null
+        : "p";
+      if (group && !first && !type) { type = "s"; }
+      if (sawType && sawType != type) {
+        if (dir < 0) {dir = 1; moveOnce(); pos.sticky = "after";}
+        break
+      }
+
+      if (type) { sawType = type; }
+      if (dir > 0 && !moveOnce(!first)) { break }
+    }
+  }
+  var result = skipAtomic(doc, pos, oldPos, origDir, true);
+  if (equalCursorPos(oldPos, result)) { result.hitSide = true; }
+  return result
+}
+
+// For relative vertical movement. Dir may be -1 or 1. Unit can be
+// "page" or "line". The resulting position will have a hitSide=true
+// property if it reached the end of the document.
+function findPosV(cm, pos, dir, unit) {
+  var doc = cm.doc, x = pos.left, y;
+  if (unit == "page") {
+    var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight);
+    var moveAmount = Math.max(pageSize - .5 * textHeight(cm.display), 3);
+    y = (dir > 0 ? pos.bottom : pos.top) + dir * moveAmount;
+
+  } else if (unit == "line") {
+    y = dir > 0 ? pos.bottom + 3 : pos.top - 3;
+  }
+  var target;
+  for (;;) {
+    target = coordsChar(cm, x, y);
+    if (!target.outside) { break }
+    if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break }
+    y += dir * 5;
+  }
+  return target
+}
+
+// CONTENTEDITABLE INPUT STYLE
+
+var ContentEditableInput = function(cm) {
+  this.cm = cm;
+  this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null;
+  this.polling = new Delayed();
+  this.composing = null;
+  this.gracePeriod = false;
+  this.readDOMTimeout = null;
+};
+
+ContentEditableInput.prototype.init = function (display) {
+    var this$1 = this;
+
+  var input = this, cm = input.cm;
+  var div = input.div = display.lineDiv;
+  disableBrowserMagic(div, cm.options.spellcheck);
+
+  on(div, "paste", function (e) {
+    if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { return }
+    // IE doesn't fire input events, so we schedule a read for the pasted content in this way
+    if (ie_version <= 11) { setTimeout(operation(cm, function () { return this$1.updateFromDOM(); }), 20); }
+  });
+
+  on(div, "compositionstart", function (e) {
+    this$1.composing = {data: e.data, done: false};
+  });
+  on(div, "compositionupdate", function (e) {
+    if (!this$1.composing) { this$1.composing = {data: e.data, done: false}; }
+  });
+  on(div, "compositionend", function (e) {
+    if (this$1.composing) {
+      if (e.data != this$1.composing.data) { this$1.readFromDOMSoon(); }
+      this$1.composing.done = true;
+    }
+  });
+
+  on(div, "touchstart", function () { return input.forceCompositionEnd(); });
+
+  on(div, "input", function () {
+    if (!this$1.composing) { this$1.readFromDOMSoon(); }
+  });
+
+  function onCopyCut(e) {
+    if (signalDOMEvent(cm, e)) { return }
+    if (cm.somethingSelected()) {
+      setLastCopied({lineWise: false, text: cm.getSelections()});
+      if (e.type == "cut") { cm.replaceSelection("", null, "cut"); }
+    } else if (!cm.options.lineWiseCopyCut) {
+      return
+    } else {
+      var ranges = copyableRanges(cm);
+      setLastCopied({lineWise: true, text: ranges.text});
+      if (e.type == "cut") {
+        cm.operation(function () {
+          cm.setSelections(ranges.ranges, 0, sel_dontScroll);
+          cm.replaceSelection("", null, "cut");
+        });
+      }
+    }
+    if (e.clipboardData) {
+      e.clipboardData.clearData();
+      var content = lastCopied.text.join("\n");
+      // iOS exposes the clipboard API, but seems to discard content inserted into it
+      e.clipboardData.setData("Text", content);
+      if (e.clipboardData.getData("Text") == content) {
+        e.preventDefault();
+        return
+      }
+    }
+    // Old-fashioned briefly-focus-a-textarea hack
+    var kludge = hiddenTextarea(), te = kludge.firstChild;
+    cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild);
+    te.value = lastCopied.text.join("\n");
+    var hadFocus = document.activeElement;
+    selectInput(te);
+    setTimeout(function () {
+      cm.display.lineSpace.removeChild(kludge);
+      hadFocus.focus();
+      if (hadFocus == div) { input.showPrimarySelection(); }
+    }, 50);
+  }
+  on(div, "copy", onCopyCut);
+  on(div, "cut", onCopyCut);
+};
+
+ContentEditableInput.prototype.prepareSelection = function () {
+  var result = prepareSelection(this.cm, false);
+  result.focus = this.cm.state.focused;
+  return result
+};
+
+ContentEditableInput.prototype.showSelection = function (info, takeFocus) {
+  if (!info || !this.cm.display.view.length) { return }
+  if (info.focus || takeFocus) { this.showPrimarySelection(); }
+  this.showMultipleSelections(info);
+};
+
+ContentEditableInput.prototype.showPrimarySelection = function () {
+  var sel = window.getSelection(), cm = this.cm, prim = cm.doc.sel.primary();
+  var from = prim.from(), to = prim.to();
+
+  if (cm.display.viewTo == cm.display.viewFrom || from.line >= cm.display.viewTo || to.line < cm.display.viewFrom) {
+    sel.removeAllRanges();
+    return
+  }
+
+  var curAnchor = domToPos(cm, sel.anchorNode, sel.anchorOffset);
+  var curFocus = domToPos(cm, sel.focusNode, sel.focusOffset);
+  if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad &&
+      cmp(minPos(curAnchor, curFocus), from) == 0 &&
+      cmp(maxPos(curAnchor, curFocus), to) == 0)
+    { return }
+
+  var view = cm.display.view;
+  var start = (from.line >= cm.display.viewFrom && posToDOM(cm, from)) ||
+      {node: view[0].measure.map[2], offset: 0};
+  var end = to.line < cm.display.viewTo && posToDOM(cm, to);
+  if (!end) {
+    var measure = view[view.length - 1].measure;
+    var map$$1 = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map;
+    end = {node: map$$1[map$$1.length - 1], offset: map$$1[map$$1.length - 2] - map$$1[map$$1.length - 3]};
+  }
+
+  if (!start || !end) {
+    sel.removeAllRanges();
+    return
+  }
+
+  var old = sel.rangeCount && sel.getRangeAt(0), rng;
+  try { rng = range(start.node, start.offset, end.offset, end.node); }
+  catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible
+  if (rng) {
+    if (!gecko && cm.state.focused) {
+      sel.collapse(start.node, start.offset);
+      if (!rng.collapsed) {
+        sel.removeAllRanges();
+        sel.addRange(rng);
+      }
+    } else {
+      sel.removeAllRanges();
+      sel.addRange(rng);
+    }
+    if (old && sel.anchorNode == null) { sel.addRange(old); }
+    else if (gecko) { this.startGracePeriod(); }
+  }
+  this.rememberSelection();
+};
+
+ContentEditableInput.prototype.startGracePeriod = function () {
+    var this$1 = this;
+
+  clearTimeout(this.gracePeriod);
+  this.gracePeriod = setTimeout(function () {
+    this$1.gracePeriod = false;
+    if (this$1.selectionChanged())
+      { this$1.cm.operation(function () { return this$1.cm.curOp.selectionChanged = true; }); }
+  }, 20);
+};
+
+ContentEditableInput.prototype.showMultipleSelections = function (info) {
+  removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors);
+  removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection);
+};
+
+ContentEditableInput.prototype.rememberSelection = function () {
+  var sel = window.getSelection();
+  this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset;
+  this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset;
+};
+
+ContentEditableInput.prototype.selectionInEditor = function () {
+  var sel = window.getSelection();
+  if (!sel.rangeCount) { return false }
+  var node = sel.getRangeAt(0).commonAncestorContainer;
+  return contains(this.div, node)
+};
+
+ContentEditableInput.prototype.focus = function () {
+  if (this.cm.options.readOnly != "nocursor") {
+    if (!this.selectionInEditor())
+      { this.showSelection(this.prepareSelection(), true); }
+    this.div.focus();
+  }
+};
+ContentEditableInput.prototype.blur = function () { this.div.blur(); };
+ContentEditableInput.prototype.getField = function () { return this.div };
+
+ContentEditableInput.prototype.supportsTouch = function () { return true };
+
+ContentEditableInput.prototype.receivedFocus = function () {
+  var input = this;
+  if (this.selectionInEditor())
+    { this.pollSelection(); }
+  else
+    { runInOp(this.cm, function () { return input.cm.curOp.selectionChanged = true; }); }
+
+  function poll() {
+    if (input.cm.state.focused) {
+      input.pollSelection();
+      input.polling.set(input.cm.options.pollInterval, poll);
+    }
+  }
+  this.polling.set(this.cm.options.pollInterval, poll);
+};
+
+ContentEditableInput.prototype.selectionChanged = function () {
+  var sel = window.getSelection();
+  return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset ||
+    sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset
+};
+
+ContentEditableInput.prototype.pollSelection = function () {
+  if (this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged()) { return }
+  var sel = window.getSelection(), cm = this.cm;
+  // On Android Chrome (version 56, at least), backspacing into an
+  // uneditable block element will put the cursor in that element,
+  // and then, because it's not editable, hide the virtual keyboard.
+  // Because Android doesn't allow us to actually detect backspace
+  // presses in a sane way, this code checks for when that happens
+  // and simulates a backspace press in this case.
+  if (android && chrome && this.cm.options.gutters.length && isInGutter(sel.anchorNode)) {
+    this.cm.triggerOnKeyDown({type: "keydown", keyCode: 8, preventDefault: Math.abs});
+    this.blur();
+    this.focus();
+    return
+  }
+  if (this.composing) { return }
+  this.rememberSelection();
+  var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset);
+  var head = domToPos(cm, sel.focusNode, sel.focusOffset);
+  if (anchor && head) { runInOp(cm, function () {
+    setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll);
+    if (anchor.bad || head.bad) { cm.curOp.selectionChanged = true; }
+  }); }
+};
+
+ContentEditableInput.prototype.pollContent = function () {
+  if (this.readDOMTimeout != null) {
+    clearTimeout(this.readDOMTimeout);
+    this.readDOMTimeout = null;
+  }
+
+  var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary();
+  var from = sel.from(), to = sel.to();
+  if (from.ch == 0 && from.line > cm.firstLine())
+    { from = Pos(from.line - 1, getLine(cm.doc, from.line - 1).length); }
+  if (to.ch == getLine(cm.doc, to.line).text.length && to.line < cm.lastLine())
+    { to = Pos(to.line + 1, 0); }
+  if (from.line < display.viewFrom || to.line > display.viewTo - 1) { return false }
+
+  var fromIndex, fromLine, fromNode;
+  if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) {
+    fromLine = lineNo(display.view[0].line);
+    fromNode = display.view[0].node;
+  } else {
+    fromLine = lineNo(display.view[fromIndex].line);
+    fromNode = display.view[fromIndex - 1].node.nextSibling;
+  }
+  var toIndex = findViewIndex(cm, to.line);
+  var toLine, toNode;
+  if (toIndex == display.view.length - 1) {
+    toLine = display.viewTo - 1;
+    toNode = display.lineDiv.lastChild;
+  } else {
+    toLine = lineNo(display.view[toIndex + 1].line) - 1;
+    toNode = display.view[toIndex + 1].node.previousSibling;
+  }
+
+  if (!fromNode) { return false }
+  var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine));
+  var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length));
+  while (newText.length > 1 && oldText.length > 1) {
+    if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine--; }
+    else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++; }
+    else { break }
+  }
+
+  var cutFront = 0, cutEnd = 0;
+  var newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length);
+  while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront))
+    { ++cutFront; }
+  var newBot = lst(newText), oldBot = lst(oldText);
+  var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0),
+                           oldBot.length - (oldText.length == 1 ? cutFront : 0));
+  while (cutEnd < maxCutEnd &&
+         newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1))
+    { ++cutEnd; }
+  // Try to move start of change to start of selection if ambiguous
+  if (newText.length == 1 && oldText.length == 1 && fromLine == from.line) {
+    while (cutFront && cutFront > from.ch &&
+           newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) {
+      cutFront--;
+      cutEnd++;
+    }
+  }
+
+  newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd).replace(/^\u200b+/, "");
+  newText[0] = newText[0].slice(cutFront).replace(/\u200b+$/, "");
+
+  var chFrom = Pos(fromLine, cutFront);
+  var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0);
+  if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) {
+    replaceRange(cm.doc, newText, chFrom, chTo, "+input");
+    return true
+  }
+};
+
+ContentEditableInput.prototype.ensurePolled = function () {
+  this.forceCompositionEnd();
+};
+ContentEditableInput.prototype.reset = function () {
+  this.forceCompositionEnd();
+};
+ContentEditableInput.prototype.forceCompositionEnd = function () {
+  if (!this.composing) { return }
+  clearTimeout(this.readDOMTimeout);
+  this.composing = null;
+  this.updateFromDOM();
+  this.div.blur();
+  this.div.focus();
+};
+ContentEditableInput.prototype.readFromDOMSoon = function () {
+    var this$1 = this;
+
+  if (this.readDOMTimeout != null) { return }
+  this.readDOMTimeout = setTimeout(function () {
+    this$1.readDOMTimeout = null;
+    if (this$1.composing) {
+      if (this$1.composing.done) { this$1.composing = null; }
+      else { return }
+    }
+    this$1.updateFromDOM();
+  }, 80);
+};
+
+ContentEditableInput.prototype.updateFromDOM = function () {
+    var this$1 = this;
+
+  if (this.cm.isReadOnly() || !this.pollContent())
+    { runInOp(this.cm, function () { return regChange(this$1.cm); }); }
+};
+
+ContentEditableInput.prototype.setUneditable = function (node) {
+  node.contentEditable = "false";
+};
+
+ContentEditableInput.prototype.onKeyPress = function (e) {
+  if (e.charCode == 0) { return }
+  e.preventDefault();
+  if (!this.cm.isReadOnly())
+    { operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0); }
+};
+
+ContentEditableInput.prototype.readOnlyChanged = function (val) {
+  this.div.contentEditable = String(val != "nocursor");
+};
+
+ContentEditableInput.prototype.onContextMenu = function () {};
+ContentEditableInput.prototype.resetPosition = function () {};
+
+ContentEditableInput.prototype.needsContentAttribute = true;
+
+function posToDOM(cm, pos) {
+  var view = findViewForLine(cm, pos.line);
+  if (!view || view.hidden) { return null }
+  var line = getLine(cm.doc, pos.line);
+  var info = mapFromLineView(view, line, pos.line);
+
+  var order = getOrder(line, cm.doc.direction), side = "left";
+  if (order) {
+    var partPos = getBidiPartAt(order, pos.ch);
+    side = partPos % 2 ? "right" : "left";
+  }
+  var result = nodeAndOffsetInLineMap(info.map, pos.ch, side);
+  result.offset = result.collapse == "right" ? result.end : result.start;
+  return result
+}
+
+function isInGutter(node) {
+  for (var scan = node; scan; scan = scan.parentNode)
+    { if (/CodeMirror-gutter-wrapper/.test(scan.className)) { return true } }
+  return false
+}
+
+function badPos(pos, bad) { if (bad) { pos.bad = true; } return pos }
+
+function domTextBetween(cm, from, to, fromLine, toLine) {
+  var text = "", closing = false, lineSep = cm.doc.lineSeparator();
+  function recognizeMarker(id) { return function (marker) { return marker.id == id; } }
+  function close() {
+    if (closing) {
+      text += lineSep;
+      closing = false;
+    }
+  }
+  function addText(str) {
+    if (str) {
+      close();
+      text += str;
+    }
+  }
+  function walk(node) {
+    if (node.nodeType == 1) {
+      var cmText = node.getAttribute("cm-text");
+      if (cmText != null) {
+        addText(cmText || node.textContent.replace(/\u200b/g, ""));
+        return
+      }
+      var markerID = node.getAttribute("cm-marker"), range$$1;
+      if (markerID) {
+        var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID));
+        if (found.length && (range$$1 = found[0].find()))
+          { addText(getBetween(cm.doc, range$$1.from, range$$1.to).join(lineSep)); }
+        return
+      }
+      if (node.getAttribute("contenteditable") == "false") { return }
+      var isBlock = /^(pre|div|p)$/i.test(node.nodeName);
+      if (isBlock) { close(); }
+      for (var i = 0; i < node.childNodes.length; i++)
+        { walk(node.childNodes[i]); }
+      if (isBlock) { closing = true; }
+    } else if (node.nodeType == 3) {
+      addText(node.nodeValue);
+    }
+  }
+  for (;;) {
+    walk(from);
+    if (from == to) { break }
+    from = from.nextSibling;
+  }
+  return text
+}
+
+function domToPos(cm, node, offset) {
+  var lineNode;
+  if (node == cm.display.lineDiv) {
+    lineNode = cm.display.lineDiv.childNodes[offset];
+    if (!lineNode) { return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true) }
+    node = null; offset = 0;
+  } else {
+    for (lineNode = node;; lineNode = lineNode.parentNode) {
+      if (!lineNode || lineNode == cm.display.lineDiv) { return null }
+      if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) { break }
+    }
+  }
+  for (var i = 0; i < cm.display.view.length; i++) {
+    var lineView = cm.display.view[i];
+    if (lineView.node == lineNode)
+      { return locateNodeInLineView(lineView, node, offset) }
+  }
+}
+
+function locateNodeInLineView(lineView, node, offset) {
+  var wrapper = lineView.text.firstChild, bad = false;
+  if (!node || !contains(wrapper, node)) { return badPos(Pos(lineNo(lineView.line), 0), true) }
+  if (node == wrapper) {
+    bad = true;
+    node = wrapper.childNodes[offset];
+    offset = 0;
+    if (!node) {
+      var line = lineView.rest ? lst(lineView.rest) : lineView.line;
+      return badPos(Pos(lineNo(line), line.text.length), bad)
+    }
+  }
+
+  var textNode = node.nodeType == 3 ? node : null, topNode = node;
+  if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) {
+    textNode = node.firstChild;
+    if (offset) { offset = textNode.nodeValue.length; }
+  }
+  while (topNode.parentNode != wrapper) { topNode = topNode.parentNode; }
+  var measure = lineView.measure, maps = measure.maps;
+
+  function find(textNode, topNode, offset) {
+    for (var i = -1; i < (maps ? maps.length : 0); i++) {
+      var map$$1 = i < 0 ? measure.map : maps[i];
+      for (var j = 0; j < map$$1.length; j += 3) {
+        var curNode = map$$1[j + 2];
+        if (curNode == textNode || curNode == topNode) {
+          var line = lineNo(i < 0 ? lineView.line : lineView.rest[i]);
+          var ch = map$$1[j] + offset;
+          if (offset < 0 || curNode != textNode) { ch = map$$1[j + (offset ? 1 : 0)]; }
+          return Pos(line, ch)
+        }
+      }
+    }
+  }
+  var found = find(textNode, topNode, offset);
+  if (found) { return badPos(found, bad) }
+
+  // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems
+  for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) {
+    found = find(after, after.firstChild, 0);
+    if (found)
+      { return badPos(Pos(found.line, found.ch - dist), bad) }
+    else
+      { dist += after.textContent.length; }
+  }
+  for (var before = topNode.previousSibling, dist$1 = offset; before; before = before.previousSibling) {
+    found = find(before, before.firstChild, -1);
+    if (found)
+      { return badPos(Pos(found.line, found.ch + dist$1), bad) }
+    else
+      { dist$1 += before.textContent.length; }
+  }
+}
+
+// TEXTAREA INPUT STYLE
+
+var TextareaInput = function(cm) {
+  this.cm = cm;
+  // See input.poll and input.reset
+  this.prevInput = "";
+
+  // Flag that indicates whether we expect input to appear real soon
+  // now (after some event like 'keypress' or 'input') and are
+  // polling intensively.
+  this.pollingFast = false;
+  // Self-resetting timeout for the poller
+  this.polling = new Delayed();
+  // Tracks when input.reset has punted to just putting a short
+  // string into the textarea instead of the full selection.
+  this.inaccurateSelection = false;
+  // Used to work around IE issue with selection being forgotten when focus moves away from textarea
+  this.hasSelection = false;
+  this.composing = null;
+};
+
+TextareaInput.prototype.init = function (display) {
+    var this$1 = this;
+
+  var input = this, cm = this.cm;
+
+  // Wraps and hides input textarea
+  var div = this.wrapper = hiddenTextarea();
+  // The semihidden textarea that is focused when the editor is
+  // focused, and receives input.
+  var te = this.textarea = div.firstChild;
+  display.wrapper.insertBefore(div, display.wrapper.firstChild);
+
+  // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore)
+  if (ios) { te.style.width = "0px"; }
+
+  on(te, "input", function () {
+    if (ie && ie_version >= 9 && this$1.hasSelection) { this$1.hasSelection = null; }
+    input.poll();
+  });
+
+  on(te, "paste", function (e) {
+    if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { return }
+
+    cm.state.pasteIncoming = true;
+    input.fastPoll();
+  });
+
+  function prepareCopyCut(e) {
+    if (signalDOMEvent(cm, e)) { return }
+    if (cm.somethingSelected()) {
+      setLastCopied({lineWise: false, text: cm.getSelections()});
+      if (input.inaccurateSelection) {
+        input.prevInput = "";
+        input.inaccurateSelection = false;
+        te.value = lastCopied.text.join("\n");
+        selectInput(te);
+      }
+    } else if (!cm.options.lineWiseCopyCut) {
+      return
+    } else {
+      var ranges = copyableRanges(cm);
+      setLastCopied({lineWise: true, text: ranges.text});
+      if (e.type == "cut") {
+        cm.setSelections(ranges.ranges, null, sel_dontScroll);
+      } else {
+        input.prevInput = "";
+        te.value = ranges.text.join("\n");
+        selectInput(te);
+      }
+    }
+    if (e.type == "cut") { cm.state.cutIncoming = true; }
+  }
+  on(te, "cut", prepareCopyCut);
+  on(te, "copy", prepareCopyCut);
+
+  on(display.scroller, "paste", function (e) {
+    if (eventInWidget(display, e) || signalDOMEvent(cm, e)) { return }
+    cm.state.pasteIncoming = true;
+    input.focus();
+  });
+
+  // Prevent normal selection in the editor (we handle our own)
+  on(display.lineSpace, "selectstart", function (e) {
+    if (!eventInWidget(display, e)) { e_preventDefault(e); }
+  });
+
+  on(te, "compositionstart", function () {
+    var start = cm.getCursor("from");
+    if (input.composing) { input.composing.range.clear(); }
+    input.composing = {
+      start: start,
+      range: cm.markText(start, cm.getCursor("to"), {className: "CodeMirror-composing"})
+    };
+  });
+  on(te, "compositionend", function () {
+    if (input.composing) {
+      input.poll();
+      input.composing.range.clear();
+      input.composing = null;
+    }
+  });
+};
+
+TextareaInput.prototype.prepareSelection = function () {
+  // Redraw the selection and/or cursor
+  var cm = this.cm, display = cm.display, doc = cm.doc;
+  var result = prepareSelection(cm);
+
+  // Move the hidden textarea near the cursor to prevent scrolling artifacts
+  if (cm.options.moveInputWithCursor) {
+    var headPos = cursorCoords(cm, doc.sel.primary().head, "div");
+    var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect();
+    result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10,
+                                        headPos.top + lineOff.top - wrapOff.top));
+    result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10,
+                                         headPos.left + lineOff.left - wrapOff.left));
+  }
+
+  return result
+};
+
+TextareaInput.prototype.showSelection = function (drawn) {
+  var cm = this.cm, display = cm.display;
+  removeChildrenAndAdd(display.cursorDiv, drawn.cursors);
+  removeChildrenAndAdd(display.selectionDiv, drawn.selection);
+  if (drawn.teTop != null) {
+    this.wrapper.style.top = drawn.teTop + "px";
+    this.wrapper.style.left = drawn.teLeft + "px";
+  }
+};
+
+// Reset the input to correspond to the selection (or to be empty,
+// when not typing and nothing is selected)
+TextareaInput.prototype.reset = function (typing) {
+  if (this.contextMenuPending || this.composing) { return }
+  var minimal, selected, cm = this.cm, doc = cm.doc;
+  if (cm.somethingSelected()) {
+    this.prevInput = "";
+    var range$$1 = doc.sel.primary();
+    minimal = hasCopyEvent &&
+      (range$$1.to().line - range$$1.from().line > 100 || (selected = cm.getSelection()).length > 1000);
+    var content = minimal ? "-" : selected || cm.getSelection();
+    this.textarea.value = content;
+    if (cm.state.focused) { selectInput(this.textarea); }
+    if (ie && ie_version >= 9) { this.hasSelection = content; }
+  } else if (!typing) {
+    this.prevInput = this.textarea.value = "";
+    if (ie && ie_version >= 9) { this.hasSelection = null; }
+  }
+  this.inaccurateSelection = minimal;
+};
+
+TextareaInput.prototype.getField = function () { return this.textarea };
+
+TextareaInput.prototype.supportsTouch = function () { return false };
+
+TextareaInput.prototype.focus = function () {
+  if (this.cm.options.readOnly != "nocursor" && (!mobile || activeElt() != this.textarea)) {
+    try { this.textarea.focus(); }
+    catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM
+  }
+};
+
+TextareaInput.prototype.blur = function () { this.textarea.blur(); };
+
+TextareaInput.prototype.resetPosition = function () {
+  this.wrapper.style.top = this.wrapper.style.left = 0;
+};
+
+TextareaInput.prototype.receivedFocus = function () { this.slowPoll(); };
+
+// Poll for input changes, using the normal rate of polling. This
+// runs as long as the editor is focused.
+TextareaInput.prototype.slowPoll = function () {
+    var this$1 = this;
+
+  if (this.pollingFast) { return }
+  this.polling.set(this.cm.options.pollInterval, function () {
+    this$1.poll();
+    if (this$1.cm.state.focused) { this$1.slowPoll(); }
+  });
+};
+
+// When an event has just come in that is likely to add or change
+// something in the input textarea, we poll faster, to ensure that
+// the change appears on the screen quickly.
+TextareaInput.prototype.fastPoll = function () {
+  var missed = false, input = this;
+  input.pollingFast = true;
+  function p() {
+    var changed = input.poll();
+    if (!changed && !missed) {missed = true; input.polling.set(60, p);}
+    else {input.pollingFast = false; input.slowPoll();}
+  }
+  input.polling.set(20, p);
+};
+
+// Read input from the textarea, and update the document to match.
+// When something is selected, it is present in the textarea, and
+// selected (unless it is huge, in which case a placeholder is
+// used). When nothing is selected, the cursor sits after previously
+// seen text (can be empty), which is stored in prevInput (we must
+// not reset the textarea when typing, because that breaks IME).
+TextareaInput.prototype.poll = function () {
+    var this$1 = this;
+
+  var cm = this.cm, input = this.textarea, prevInput = this.prevInput;
+  // Since this is called a *lot*, try to bail out as cheaply as
+  // possible when it is clear that nothing happened. hasSelection
+  // will be the case when there is a lot of text in the textarea,
+  // in which case reading its value would be expensive.
+  if (this.contextMenuPending || !cm.state.focused ||
+      (hasSelection(input) && !prevInput && !this.composing) ||
+      cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq)
+    { return false }
+
+  var text = input.value;
+  // If nothing changed, bail.
+  if (text == prevInput && !cm.somethingSelected()) { return false }
+  // Work around nonsensical selection resetting in IE9/10, and
+  // inexplicable appearance of private area unicode characters on
+  // some key combos in Mac (#2689).
+  if (ie && ie_version >= 9 && this.hasSelection === text ||
+      mac && /[\uf700-\uf7ff]/.test(text)) {
+    cm.display.input.reset();
+    return false
+  }
+
+  if (cm.doc.sel == cm.display.selForContextMenu) {
+    var first = text.charCodeAt(0);
+    if (first == 0x200b && !prevInput) { prevInput = "\u200b"; }
+    if (first == 0x21da) { this.reset(); return this.cm.execCommand("undo") }
+  }
+  // Find the part of the input that is actually new
+  var same = 0, l = Math.min(prevInput.length, text.length);
+  while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) { ++same; }
+
+  runInOp(cm, function () {
+    applyTextInput(cm, text.slice(same), prevInput.length - same,
+                   null, this$1.composing ? "*compose" : null);
+
+    // Don't leave long text in the textarea, since it makes further polling slow
+    if (text.length > 1000 || text.indexOf("\n") > -1) { input.value = this$1.prevInput = ""; }
+    else { this$1.prevInput = text; }
+
+    if (this$1.composing) {
+      this$1.composing.range.clear();
+      this$1.composing.range = cm.markText(this$1.composing.start, cm.getCursor("to"),
+                                         {className: "CodeMirror-composing"});
+    }
+  });
+  return true
+};
+
+TextareaInput.prototype.ensurePolled = function () {
+  if (this.pollingFast && this.poll()) { this.pollingFast = false; }
+};
+
+TextareaInput.prototype.onKeyPress = function () {
+  if (ie && ie_version >= 9) { this.hasSelection = null; }
+  this.fastPoll();
+};
+
+TextareaInput.prototype.onContextMenu = function (e) {
+  var input = this, cm = input.cm, display = cm.display, te = input.textarea;
+  var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop;
+  if (!pos || presto) { return } // Opera is difficult.
+
+  // Reset the current text selection only if the click is done outside of the selection
+  // and 'resetSelectionOnContextMenu' option is true.
+  var reset = cm.options.resetSelectionOnContextMenu;
+  if (reset && cm.doc.sel.contains(pos) == -1)
+    { operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll); }
+
+  var oldCSS = te.style.cssText, oldWrapperCSS = input.wrapper.style.cssText;
+  input.wrapper.style.cssText = "position: absolute";
+  var wrapperBox = input.wrapper.getBoundingClientRect();
+  te.style.cssText = "position: absolute; width: 30px; height: 30px;\n      top: " + (e.clientY - wrapperBox.top - 5) + "px; left: " + (e.clientX - wrapperBox.left - 5) + "px;\n      z-index: 1000; background: " + (ie ? "rgba(255, 255, 255, .05)" : "transparent") + ";\n      outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);";
+  var oldScrollY;
+  if (webkit) { oldScrollY = window.scrollY; } // Work around Chrome issue (#2712)
+  display.input.focus();
+  if (webkit) { window.scrollTo(null, oldScrollY); }
+  display.input.reset();
+  // Adds "Select all" to context menu in FF
+  if (!cm.somethingSelected()) { te.value = input.prevInput = " "; }
+  input.contextMenuPending = true;
+  display.selForContextMenu = cm.doc.sel;
+  clearTimeout(display.detectingSelectAll);
+
+  // Select-all will be greyed out if there's nothing to select, so
+  // this adds a zero-width space so that we can later check whether
+  // it got selected.
+  function prepareSelectAllHack() {
+    if (te.selectionStart != null) {
+      var selected = cm.somethingSelected();
+      var extval = "\u200b" + (selected ? te.value : "");
+      te.value = "\u21da"; // Used to catch context-menu undo
+      te.value = extval;
+      input.prevInput = selected ? "" : "\u200b";
+      te.selectionStart = 1; te.selectionEnd = extval.length;
+      // Re-set this, in case some other handler touched the
+      // selection in the meantime.
+      display.selForContextMenu = cm.doc.sel;
+    }
+  }
+  function rehide() {
+    input.contextMenuPending = false;
+    input.wrapper.style.cssText = oldWrapperCSS;
+    te.style.cssText = oldCSS;
+    if (ie && ie_version < 9) { display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos); }
+
+    // Try to detect the user choosing select-all
+    if (te.selectionStart != null) {
+      if (!ie || (ie && ie_version < 9)) { prepareSelectAllHack(); }
+      var i = 0, poll = function () {
+        if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 &&
+            te.selectionEnd > 0 && input.prevInput == "\u200b") {
+          operation(cm, selectAll)(cm);
+        } else if (i++ < 10) {
+          display.detectingSelectAll = setTimeout(poll, 500);
+        } else {
+          display.selForContextMenu = null;
+          display.input.reset();
+        }
+      };
+      display.detectingSelectAll = setTimeout(poll, 200);
+    }
+  }
+
+  if (ie && ie_version >= 9) { prepareSelectAllHack(); }
+  if (captureRightClick) {
+    e_stop(e);
+    var mouseup = function () {
+      off(window, "mouseup", mouseup);
+      setTimeout(rehide, 20);
+    };
+    on(window, "mouseup", mouseup);
+  } else {
+    setTimeout(rehide, 50);
+  }
+};
+
+TextareaInput.prototype.readOnlyChanged = function (val) {
+  if (!val) { this.reset(); }
+  this.textarea.disabled = val == "nocursor";
+};
+
+TextareaInput.prototype.setUneditable = function () {};
+
+TextareaInput.prototype.needsContentAttribute = false;
+
+function fromTextArea(textarea, options) {
+  options = options ? copyObj(options) : {};
+  options.value = textarea.value;
+  if (!options.tabindex && textarea.tabIndex)
+    { options.tabindex = textarea.tabIndex; }
+  if (!options.placeholder && textarea.placeholder)
+    { options.placeholder = textarea.placeholder; }
+  // Set autofocus to true if this textarea is focused, or if it has
+  // autofocus and no other element is focused.
+  if (options.autofocus == null) {
+    var hasFocus = activeElt();
+    options.autofocus = hasFocus == textarea ||
+      textarea.getAttribute("autofocus") != null && hasFocus == document.body;
+  }
+
+  function save() {textarea.value = cm.getValue();}
+
+  var realSubmit;
+  if (textarea.form) {
+    on(textarea.form, "submit", save);
+    // Deplorable hack to make the submit method do the right thing.
+    if (!options.leaveSubmitMethodAlone) {
+      var form = textarea.form;
+      realSubmit = form.submit;
+      try {
+        var wrappedSubmit = form.submit = function () {
+          save();
+          form.submit = realSubmit;
+          form.submit();
+          form.submit = wrappedSubmit;
+        };
+      } catch(e) {}
+    }
+  }
+
+  options.finishInit = function (cm) {
+    cm.save = save;
+    cm.getTextArea = function () { return textarea; };
+    cm.toTextArea = function () {
+      cm.toTextArea = isNaN; // Prevent this from being ran twice
+      save();
+      textarea.parentNode.removeChild(cm.getWrapperElement());
+      textarea.style.display = "";
+      if (textarea.form) {
+        off(textarea.form, "submit", save);
+        if (typeof textarea.form.submit == "function")
+          { textarea.form.submit = realSubmit; }
+      }
+    };
+  };
+
+  textarea.style.display = "none";
+  var cm = CodeMirror$1(function (node) { return textarea.parentNode.insertBefore(node, textarea.nextSibling); },
+    options);
+  return cm
+}
+
+function addLegacyProps(CodeMirror) {
+  CodeMirror.off = off;
+  CodeMirror.on = on;
+  CodeMirror.wheelEventPixels = wheelEventPixels;
+  CodeMirror.Doc = Doc;
+  CodeMirror.splitLines = splitLinesAuto;
+  CodeMirror.countColumn = countColumn;
+  CodeMirror.findColumn = findColumn;
+  CodeMirror.isWordChar = isWordCharBasic;
+  CodeMirror.Pass = Pass;
+  CodeMirror.signal = signal;
+  CodeMirror.Line = Line;
+  CodeMirror.changeEnd = changeEnd;
+  CodeMirror.scrollbarModel = scrollbarModel;
+  CodeMirror.Pos = Pos;
+  CodeMirror.cmpPos = cmp;
+  CodeMirror.modes = modes;
+  CodeMirror.mimeModes = mimeModes;
+  CodeMirror.resolveMode = resolveMode;
+  CodeMirror.getMode = getMode;
+  CodeMirror.modeExtensions = modeExtensions;
+  CodeMirror.extendMode = extendMode;
+  CodeMirror.copyState = copyState;
+  CodeMirror.startState = startState;
+  CodeMirror.innerMode = innerMode;
+  CodeMirror.commands = commands;
+  CodeMirror.keyMap = keyMap;
+  CodeMirror.keyName = keyName;
+  CodeMirror.isModifierKey = isModifierKey;
+  CodeMirror.lookupKey = lookupKey;
+  CodeMirror.normalizeKeyMap = normalizeKeyMap;
+  CodeMirror.StringStream = StringStream;
+  CodeMirror.SharedTextMarker = SharedTextMarker;
+  CodeMirror.TextMarker = TextMarker;
+  CodeMirror.LineWidget = LineWidget;
+  CodeMirror.e_preventDefault = e_preventDefault;
+  CodeMirror.e_stopPropagation = e_stopPropagation;
+  CodeMirror.e_stop = e_stop;
+  CodeMirror.addClass = addClass;
+  CodeMirror.contains = contains;
+  CodeMirror.rmClass = rmClass;
+  CodeMirror.keyNames = keyNames;
+}
+
+// EDITOR CONSTRUCTOR
+
+defineOptions(CodeMirror$1);
+
+addEditorMethods(CodeMirror$1);
+
+// Set up methods on CodeMirror's prototype to redirect to the editor's document.
+var dontDelegate = "iter insert remove copy getEditor constructor".split(" ");
+for (var prop in Doc.prototype) { if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0)
+  { CodeMirror$1.prototype[prop] = (function(method) {
+    return function() {return method.apply(this.doc, arguments)}
+  })(Doc.prototype[prop]); } }
+
+eventMixin(Doc);
+
+// INPUT HANDLING
+
+CodeMirror$1.inputStyles = {"textarea": TextareaInput, "contenteditable": ContentEditableInput};
+
+// MODE DEFINITION AND QUERYING
+
+// Extra arguments are stored as the mode's dependencies, which is
+// used by (legacy) mechanisms like loadmode.js to automatically
+// load a mode. (Preferred mechanism is the require/define calls.)
+CodeMirror$1.defineMode = function(name/*, mode, 鈥�*/) {
+  if (!CodeMirror$1.defaults.mode && name != "null") { CodeMirror$1.defaults.mode = name; }
+  defineMode.apply(this, arguments);
+};
+
+CodeMirror$1.defineMIME = defineMIME;
+
+// Minimal default mode.
+CodeMirror$1.defineMode("null", function () { return ({token: function (stream) { return stream.skipToEnd(); }}); });
+CodeMirror$1.defineMIME("text/plain", "null");
+
+// EXTENSIONS
+
+CodeMirror$1.defineExtension = function (name, func) {
+  CodeMirror$1.prototype[name] = func;
+};
+CodeMirror$1.defineDocExtension = function (name, func) {
+  Doc.prototype[name] = func;
+};
+
+CodeMirror$1.fromTextArea = fromTextArea;
+
+addLegacyProps(CodeMirror$1);
+
+CodeMirror$1.version = "5.27.4";
+
+return CodeMirror$1;
+
+})));
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/codemirror.lib.clike-lint.js b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/codemirror.lib.clike-lint.js
new file mode 100644
index 0000000..5ea9b18
--- /dev/null
+++ b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/codemirror.lib.clike-lint.js
@@ -0,0 +1,802 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+(function(mod) {
+  if (typeof exports == "object" && typeof module == "object") // CommonJS
+    mod(require("../../lib/codemirror"));
+  else if (typeof define == "function" && define.amd) // AMD
+    define(["../../lib/codemirror"], mod);
+  else // Plain browser env
+    mod(CodeMirror);
+})(function(CodeMirror) {
+"use strict";
+
+function Context(indented, column, type, info, align, prev) {
+  this.indented = indented;
+  this.column = column;
+  this.type = type;
+  this.info = info;
+  this.align = align;
+  this.prev = prev;
+}
+function pushContext(state, col, type, info) {
+  var indent = state.indented;
+  if (state.context && state.context.type == "statement" && type != "statement")
+    indent = state.context.indented;
+  return state.context = new Context(indent, col, type, info, null, state.context);
+}
+function popContext(state) {
+  var t = state.context.type;
+  if (t == ")" || t == "]" || t == "}")
+    state.indented = state.context.indented;
+  return state.context = state.context.prev;
+}
+
+function typeBefore(stream, state, pos) {
+  if (state.prevToken == "variable" || state.prevToken == "type") return true;
+  if (/\S(?:[^- ]>|[*\]])\s*$|\*$/.test(stream.string.slice(0, pos))) return true;
+  if (state.typeAtEndOfLine && stream.column() == stream.indentation()) return true;
+}
+
+function isTopScope(context) {
+  for (;;) {
+    if (!context || context.type == "top") return true;
+    if (context.type == "}" && context.prev.info != "namespace") return false;
+    context = context.prev;
+  }
+}
+
+CodeMirror.defineMode("clike", function(config, parserConfig) {
+  var indentUnit = config.indentUnit,
+      statementIndentUnit = parserConfig.statementIndentUnit || indentUnit,
+      dontAlignCalls = parserConfig.dontAlignCalls,
+      keywords = parserConfig.keywords || {},
+      types = parserConfig.types || {},
+      builtin = parserConfig.builtin || {},
+      blockKeywords = parserConfig.blockKeywords || {},
+      defKeywords = parserConfig.defKeywords || {},
+      atoms = parserConfig.atoms || {},
+      hooks = parserConfig.hooks || {},
+      multiLineStrings = parserConfig.multiLineStrings,
+      indentStatements = parserConfig.indentStatements !== false,
+      indentSwitch = parserConfig.indentSwitch !== false,
+      namespaceSeparator = parserConfig.namespaceSeparator,
+      isPunctuationChar = parserConfig.isPunctuationChar || /[\[\]{}\(\),;\:\.]/,
+      numberStart = parserConfig.numberStart || /[\d\.]/,
+      number = parserConfig.number || /^(?:0x[a-f\d]+|0b[01]+|(?:\d+\.?\d*|\.\d+)(?:e[-+]?\d+)?)(u|ll?|l|f)?/i,
+      isOperatorChar = parserConfig.isOperatorChar || /[+\-*&%=<>!?|\/]/,
+      isIdentifierChar = parserConfig.isIdentifierChar || /[\w\$_\xa1-\uffff]/;
+
+  var curPunc, isDefKeyword;
+
+  function tokenBase(stream, state) {
+    var ch = stream.next();
+    if (hooks[ch]) {
+      var result = hooks[ch](stream, state);
+      if (result !== false) return result;
+    }
+    if (ch == '"' || ch == "'") {
+      state.tokenize = tokenString(ch);
+      return state.tokenize(stream, state);
+    }
+    if (isPunctuationChar.test(ch)) {
+      curPunc = ch;
+      return null;
+    }
+    if (numberStart.test(ch)) {
+      stream.backUp(1)
+      if (stream.match(number)) return "number"
+      stream.next()
+    }
+    if (ch == "/") {
+      if (stream.eat("*")) {
+        state.tokenize = tokenComment;
+        return tokenComment(stream, state);
+      }
+      if (stream.eat("/")) {
+        stream.skipToEnd();
+        return "comment";
+      }
+    }
+    if (isOperatorChar.test(ch)) {
+      while (!stream.match(/^\/[\/*]/, false) && stream.eat(isOperatorChar)) {}
+      return "operator";
+    }
+    stream.eatWhile(isIdentifierChar);
+    if (namespaceSeparator) while (stream.match(namespaceSeparator))
+      stream.eatWhile(isIdentifierChar);
+
+    var cur = stream.current();
+    if (contains(keywords, cur)) {
+      if (contains(blockKeywords, cur)) curPunc = "newstatement";
+      if (contains(defKeywords, cur)) isDefKeyword = true;
+      return "keyword";
+    }
+    if (contains(types, cur)) return "type";
+    if (contains(builtin, cur)) {
+      if (contains(blockKeywords, cur)) curPunc = "newstatement";
+      return "builtin";
+    }
+    if (contains(atoms, cur)) return "atom";
+    return "variable";
+  }
+
+  function tokenString(quote) {
+    return function(stream, state) {
+      var escaped = false, next, end = false;
+      while ((next = stream.next()) != null) {
+        if (next == quote && !escaped) {end = true; break;}
+        escaped = !escaped && next == "\\";
+      }
+      if (end || !(escaped || multiLineStrings))
+        state.tokenize = null;
+      return "string";
+    };
+  }
+
+  function tokenComment(stream, state) {
+    var maybeEnd = false, ch;
+    while (ch = stream.next()) {
+      if (ch == "/" && maybeEnd) {
+        state.tokenize = null;
+        break;
+      }
+      maybeEnd = (ch == "*");
+    }
+    return "comment";
+  }
+
+  function maybeEOL(stream, state) {
+    if (parserConfig.typeFirstDefinitions && stream.eol() && isTopScope(state.context))
+      state.typeAtEndOfLine = typeBefore(stream, state, stream.pos)
+  }
+
+  // Interface
+
+  return {
+    startState: function(basecolumn) {
+      return {
+        tokenize: null,
+        context: new Context((basecolumn || 0) - indentUnit, 0, "top", null, false),
+        indented: 0,
+        startOfLine: true,
+        prevToken: null
+      };
+    },
+
+    token: function(stream, state) {
+      var ctx = state.context;
+      if (stream.sol()) {
+        if (ctx.align == null) ctx.align = false;
+        state.indented = stream.indentation();
+        state.startOfLine = true;
+      }
+      if (stream.eatSpace()) { maybeEOL(stream, state); return null; }
+      curPunc = isDefKeyword = null;
+      var style = (state.tokenize || tokenBase)(stream, state);
+      if (style == "comment" || style == "meta") return style;
+      if (ctx.align == null) ctx.align = true;
+
+      if (curPunc == ";" || curPunc == ":" || (curPunc == "," && stream.match(/^\s*(?:\/\/.*)?$/, false)))
+        while (state.context.type == "statement") popContext(state);
+      else if (curPunc == "{") pushContext(state, stream.column(), "}");
+      else if (curPunc == "[") pushContext(state, stream.column(), "]");
+      else if (curPunc == "(") pushContext(state, stream.column(), ")");
+      else if (curPunc == "}") {
+        while (ctx.type == "statement") ctx = popContext(state);
+        if (ctx.type == "}") ctx = popContext(state);
+        while (ctx.type == "statement") ctx = popContext(state);
+      }
+      else if (curPunc == ctx.type) popContext(state);
+      else if (indentStatements &&
+               (((ctx.type == "}" || ctx.type == "top") && curPunc != ";") ||
+                (ctx.type == "statement" && curPunc == "newstatement"))) {
+        pushContext(state, stream.column(), "statement", stream.current());
+      }
+
+      if (style == "variable" &&
+          ((state.prevToken == "def" ||
+            (parserConfig.typeFirstDefinitions && typeBefore(stream, state, stream.start) &&
+             isTopScope(state.context) && stream.match(/^\s*\(/, false)))))
+        style = "def";
+
+      if (hooks.token) {
+        var result = hooks.token(stream, state, style);
+        if (result !== undefined) style = result;
+      }
+
+      if (style == "def" && parserConfig.styleDefs === false) style = "variable";
+
+      state.startOfLine = false;
+      state.prevToken = isDefKeyword ? "def" : style || curPunc;
+      maybeEOL(stream, state);
+      return style;
+    },
+
+    indent: function(state, textAfter) {
+      if (state.tokenize != tokenBase && state.tokenize != null || state.typeAtEndOfLine) return CodeMirror.Pass;
+      var ctx = state.context, firstChar = textAfter && textAfter.charAt(0);
+      if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev;
+      if (parserConfig.dontIndentStatements)
+        while (ctx.type == "statement" && parserConfig.dontIndentStatements.test(ctx.info))
+          ctx = ctx.prev
+      if (hooks.indent) {
+        var hook = hooks.indent(state, ctx, textAfter);
+        if (typeof hook == "number") return hook
+      }
+      var closing = firstChar == ctx.type;
+      var switchBlock = ctx.prev && ctx.prev.info == "switch";
+      if (parserConfig.allmanIndentation && /[{(]/.test(firstChar)) {
+        while (ctx.type != "top" && ctx.type != "}") ctx = ctx.prev
+        return ctx.indented
+      }
+      if (ctx.type == "statement")
+        return ctx.indented + (firstChar == "{" ? 0 : statementIndentUnit);
+      if (ctx.align && (!dontAlignCalls || ctx.type != ")"))
+        return ctx.column + (closing ? 0 : 1);
+      if (ctx.type == ")" && !closing)
+        return ctx.indented + statementIndentUnit;
+
+      return ctx.indented + (closing ? 0 : indentUnit) +
+        (!closing && switchBlock && !/^(?:case|default)\b/.test(textAfter) ? indentUnit : 0);
+    },
+
+    electricInput: indentSwitch ? /^\s*(?:case .*?:|default:|\{\}?|\})$/ : /^\s*[{}]$/,
+    blockCommentStart: "/*",
+    blockCommentEnd: "*/",
+    lineComment: "//",
+    fold: "brace"
+  };
+});
+
+  function words(str) {
+    var obj = {}, words = str.split(" ");
+    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
+    return obj;
+  }
+  function contains(words, word) {
+    if (typeof words === "function") {
+      return words(word);
+    } else {
+      return words.propertyIsEnumerable(word);
+    }
+  }
+  var cKeywords = "auto if break case register continue return default do sizeof " +
+    "static else struct switch extern typedef union for goto while enum const volatile";
+  var cTypes = "int long char short double float unsigned signed void size_t ptrdiff_t";
+
+  function cppHook(stream, state) {
+    if (!state.startOfLine) return false
+    for (var ch, next = null; ch = stream.peek();) {
+      if (ch == "\\" && stream.match(/^.$/)) {
+        next = cppHook
+        break
+      } else if (ch == "/" && stream.match(/^\/[\/\*]/, false)) {
+        break
+      }
+      stream.next()
+    }
+    state.tokenize = next
+    return "meta"
+  }
+
+  function pointerHook(_stream, state) {
+    if (state.prevToken == "type") return "type";
+    return false;
+  }
+
+  function cpp14Literal(stream) {
+    stream.eatWhile(/[\w\.']/);
+    return "number";
+  }
+
+  function cpp11StringHook(stream, state) {
+    stream.backUp(1);
+    // Raw strings.
+    if (stream.match(/(R|u8R|uR|UR|LR)/)) {
+      var match = stream.match(/"([^\s\\()]{0,16})\(/);
+      if (!match) {
+        return false;
+      }
+      state.cpp11RawStringDelim = match[1];
+      state.tokenize = tokenRawString;
+      return tokenRawString(stream, state);
+    }
+    // Unicode strings/chars.
+    if (stream.match(/(u8|u|U|L)/)) {
+      if (stream.match(/["']/, /* eat */ false)) {
+        return "string";
+      }
+      return false;
+    }
+    // Ignore this hook.
+    stream.next();
+    return false;
+  }
+
+  function cppLooksLikeConstructor(word) {
+    var lastTwo = /(\w+)::~?(\w+)$/.exec(word);
+    return lastTwo && lastTwo[1] == lastTwo[2];
+  }
+
+  // C#-style strings where "" escapes a quote.
+  function tokenAtString(stream, state) {
+    var next;
+    while ((next = stream.next()) != null) {
+      if (next == '"' && !stream.eat('"')) {
+        state.tokenize = null;
+        break;
+      }
+    }
+    return "string";
+  }
+
+  // C++11 raw string literal is <prefix>"<delim>( anything )<delim>", where
+  // <delim> can be a string up to 16 characters long.
+  function tokenRawString(stream, state) {
+    // Escape characters that have special regex meanings.
+    var delim = state.cpp11RawStringDelim.replace(/[^\w\s]/g, '\\$&');
+    var match = stream.match(new RegExp(".*?\\)" + delim + '"'));
+    if (match)
+      state.tokenize = null;
+    else
+      stream.skipToEnd();
+    return "string";
+  }
+
+  function def(mimes, mode) {
+    if (typeof mimes == "string") mimes = [mimes];
+    var words = [];
+    function add(obj) {
+      if (obj) for (var prop in obj) if (obj.hasOwnProperty(prop))
+        words.push(prop);
+    }
+    add(mode.keywords);
+    add(mode.types);
+    add(mode.builtin);
+    add(mode.atoms);
+    if (words.length) {
+      mode.helperType = mimes[0];
+      CodeMirror.registerHelper("hintWords", mimes[0], words);
+    }
+
+    for (var i = 0; i < mimes.length; ++i)
+      CodeMirror.defineMIME(mimes[i], mode);
+  }
+
+  def(["text/x-csrc", "text/x-c", "text/x-chdr"], {
+    name: "clike",
+    keywords: words(cKeywords),
+    types: words(cTypes + " bool _Complex _Bool float_t double_t intptr_t intmax_t " +
+                 "int8_t int16_t int32_t int64_t uintptr_t uintmax_t uint8_t uint16_t " +
+                 "uint32_t uint64_t"),
+    blockKeywords: words("case do else for if switch while struct"),
+    defKeywords: words("struct"),
+    typeFirstDefinitions: true,
+    atoms: words("null true false"),
+    hooks: {"#": cppHook, "*": pointerHook},
+    modeProps: {fold: ["brace", "include"]}
+  });
+
+  def(["text/x-c++src", "text/x-c++hdr"], {
+    name: "clike",
+    keywords: words(cKeywords + " asm dynamic_cast namespace reinterpret_cast try explicit new " +
+                    "static_cast typeid catch operator template typename class friend private " +
+                    "this using const_cast inline public throw virtual delete mutable protected " +
+                    "alignas alignof constexpr decltype nullptr noexcept thread_local final " +
+                    "static_assert override"),
+    types: words(cTypes + " bool wchar_t"),
+    blockKeywords: words("catch class do else finally for if struct switch try while"),
+    defKeywords: words("class namespace struct enum union"),
+    typeFirstDefinitions: true,
+    atoms: words("true false null"),
+    dontIndentStatements: /^template$/,
+    isIdentifierChar: /[\w\$_~\xa1-\uffff]/,
+    hooks: {
+      "#": cppHook,
+      "*": pointerHook,
+      "u": cpp11StringHook,
+      "U": cpp11StringHook,
+      "L": cpp11StringHook,
+      "R": cpp11StringHook,
+      "0": cpp14Literal,
+      "1": cpp14Literal,
+      "2": cpp14Literal,
+      "3": cpp14Literal,
+      "4": cpp14Literal,
+      "5": cpp14Literal,
+      "6": cpp14Literal,
+      "7": cpp14Literal,
+      "8": cpp14Literal,
+      "9": cpp14Literal,
+      token: function(stream, state, style) {
+        if (style == "variable" && stream.peek() == "(" &&
+            (state.prevToken == ";" || state.prevToken == null ||
+             state.prevToken == "}") &&
+            cppLooksLikeConstructor(stream.current()))
+          return "def";
+      }
+    },
+    namespaceSeparator: "::",
+    modeProps: {fold: ["brace", "include"]}
+  });
+
+  def("text/x-java", {
+    name: "clike",
+    keywords: words("abstract assert break case catch class const continue default " +
+                    "do else enum extends final finally float for goto if implements import " +
+                    "instanceof interface native new package private protected public " +
+                    "return static strictfp super switch synchronized this throw throws transient " +
+                    "try volatile while @interface"),
+    types: words("byte short int long float double boolean char void Boolean Byte Character Double Float " +
+                 "Integer Long Number Object Short String StringBuffer StringBuilder Void"),
+    blockKeywords: words("catch class do else finally for if switch try while"),
+    defKeywords: words("class interface package enum @interface"),
+    typeFirstDefinitions: true,
+    atoms: words("true false null"),
+    number: /^(?:0x[a-f\d_]+|0b[01_]+|(?:[\d_]+\.?\d*|\.\d+)(?:e[-+]?[\d_]+)?)(u|ll?|l|f)?/i,
+    hooks: {
+      "@": function(stream) {
+        // Don't match the @interface keyword.
+        if (stream.match('interface', false)) return false;
+
+        stream.eatWhile(/[\w\$_]/);
+        return "meta";
+      }
+    },
+    modeProps: {fold: ["brace", "import"]}
+  });
+
+  def("text/x-csharp", {
+    name: "clike",
+    keywords: words("abstract as async await base break case catch checked class const continue" +
+                    " default delegate do else enum event explicit extern finally fixed for" +
+                    " foreach goto if implicit in interface internal is lock namespace new" +
+                    " operator out override params private protected public readonly ref return sealed" +
+                    " sizeof stackalloc static struct switch this throw try typeof unchecked" +
+                    " unsafe using virtual void volatile while add alias ascending descending dynamic from get" +
+                    " global group into join let orderby partial remove select set value var yield"),
+    types: words("Action Boolean Byte Char DateTime DateTimeOffset Decimal Double Func" +
+                 " Guid Int16 Int32 Int64 Object SByte Single String Task TimeSpan UInt16 UInt32" +
+                 " UInt64 bool byte char decimal double short int long object"  +
+                 " sbyte float string ushort uint ulong"),
+    blockKeywords: words("catch class do else finally for foreach if struct switch try while"),
+    defKeywords: words("class interface namespace struct var"),
+    typeFirstDefinitions: true,
+    atoms: words("true false null"),
+    hooks: {
+      "@": function(stream, state) {
+        if (stream.eat('"')) {
+          state.tokenize = tokenAtString;
+          return tokenAtString(stream, state);
+        }
+        stream.eatWhile(/[\w\$_]/);
+        return "meta";
+      }
+    }
+  });
+
+  function tokenTripleString(stream, state) {
+    var escaped = false;
+    while (!stream.eol()) {
+      if (!escaped && stream.match('"""')) {
+        state.tokenize = null;
+        break;
+      }
+      escaped = stream.next() == "\\" && !escaped;
+    }
+    return "string";
+  }
+
+  def("text/x-scala", {
+    name: "clike",
+    keywords: words(
+
+      /* scala */
+      "abstract case catch class def do else extends final finally for forSome if " +
+      "implicit import lazy match new null object override package private protected return " +
+      "sealed super this throw trait try type val var while with yield _ " +
+
+      /* package scala */
+      "assert assume require print println printf readLine readBoolean readByte readShort " +
+      "readChar readInt readLong readFloat readDouble"
+    ),
+    types: words(
+      "AnyVal App Application Array BufferedIterator BigDecimal BigInt Char Console Either " +
+      "Enumeration Equiv Error Exception Fractional Function IndexedSeq Int Integral Iterable " +
+      "Iterator List Map Numeric Nil NotNull Option Ordered Ordering PartialFunction PartialOrdering " +
+      "Product Proxy Range Responder Seq Serializable Set Specializable Stream StringBuilder " +
+      "StringContext Symbol Throwable Traversable TraversableOnce Tuple Unit Vector " +
+
+      /* package java.lang */
+      "Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable " +
+      "Compiler Double Exception Float Integer Long Math Number Object Package Pair Process " +
+      "Runtime Runnable SecurityManager Short StackTraceElement StrictMath String " +
+      "StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void"
+    ),
+    multiLineStrings: true,
+    blockKeywords: words("catch class enum do else finally for forSome if match switch try while"),
+    defKeywords: words("class enum def object package trait type val var"),
+    atoms: words("true false null"),
+    indentStatements: false,
+    indentSwitch: false,
+    isOperatorChar: /[+\-*&%=<>!?|\/#:@]/,
+    hooks: {
+      "@": function(stream) {
+        stream.eatWhile(/[\w\$_]/);
+        return "meta";
+      },
+      '"': function(stream, state) {
+        if (!stream.match('""')) return false;
+        state.tokenize = tokenTripleString;
+        return state.tokenize(stream, state);
+      },
+      "'": function(stream) {
+        stream.eatWhile(/[\w\$_\xa1-\uffff]/);
+        return "atom";
+      },
+      "=": function(stream, state) {
+        var cx = state.context
+        if (cx.type == "}" && cx.align && stream.eat(">")) {
+          state.context = new Context(cx.indented, cx.column, cx.type, cx.info, null, cx.prev)
+          return "operator"
+        } else {
+          return false
+        }
+      }
+    },
+    modeProps: {closeBrackets: {triples: '"'}}
+  });
+
+  function tokenKotlinString(tripleString){
+    return function (stream, state) {
+      var escaped = false, next, end = false;
+      while (!stream.eol()) {
+        if (!tripleString && !escaped && stream.match('"') ) {end = true; break;}
+        if (tripleString && stream.match('"""')) {end = true; break;}
+        next = stream.next();
+        if(!escaped && next == "$" && stream.match('{'))
+          stream.skipTo("}");
+        escaped = !escaped && next == "\\" && !tripleString;
+      }
+      if (end || !tripleString)
+        state.tokenize = null;
+      return "string";
+    }
+  }
+
+  def("text/x-kotlin", {
+    name: "clike",
+    keywords: words(
+      /*keywords*/
+      "package as typealias class interface this super val " +
+      "var fun for is in This throw return " +
+      "break continue object if else while do try when !in !is as? " +
+
+      /*soft keywords*/
+      "file import where by get set abstract enum open inner override private public internal " +
+      "protected catch finally out final vararg reified dynamic companion constructor init " +
+      "sealed field property receiver param sparam lateinit data inline noinline tailrec " +
+      "external annotation crossinline const operator infix suspend"
+    ),
+    types: words(
+      /* package java.lang */
+      "Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable " +
+      "Compiler Double Exception Float Integer Long Math Number Object Package Pair Process " +
+      "Runtime Runnable SecurityManager Short StackTraceElement StrictMath String " +
+      "StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void"
+    ),
+    intendSwitch: false,
+    indentStatements: false,
+    multiLineStrings: true,
+    number: /^(?:0x[a-f\d_]+|0b[01_]+|(?:[\d_]+\.?\d*|\.\d+)(?:e[-+]?[\d_]+)?)(u|ll?|l|f)?/i,
+    blockKeywords: words("catch class do else finally for if where try while enum"),
+    defKeywords: words("class val var object package interface fun"),
+    atoms: words("true false null this"),
+    hooks: {
+      '"': function(stream, state) {
+        state.tokenize = tokenKotlinString(stream.match('""'));
+        return state.tokenize(stream, state);
+      }
+    },
+    modeProps: {closeBrackets: {triples: '"'}}
+  });
+
+  def(["x-shader/x-vertex", "x-shader/x-fragment"], {
+    name: "clike",
+    keywords: words("sampler1D sampler2D sampler3D samplerCube " +
+                    "sampler1DShadow sampler2DShadow " +
+                    "const attribute uniform varying " +
+                    "break continue discard return " +
+                    "for while do if else struct " +
+                    "in out inout"),
+    types: words("float int bool void " +
+                 "vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 " +
+                 "mat2 mat3 mat4"),
+    blockKeywords: words("for while do if else struct"),
+    builtin: words("radians degrees sin cos tan asin acos atan " +
+                    "pow exp log exp2 sqrt inversesqrt " +
+                    "abs sign floor ceil fract mod min max clamp mix step smoothstep " +
+                    "length distance dot cross normalize ftransform faceforward " +
+                    "reflect refract matrixCompMult " +
+                    "lessThan lessThanEqual greaterThan greaterThanEqual " +
+                    "equal notEqual any all not " +
+                    "texture1D texture1DProj texture1DLod texture1DProjLod " +
+                    "texture2D texture2DProj texture2DLod texture2DProjLod " +
+                    "texture3D texture3DProj texture3DLod texture3DProjLod " +
+                    "textureCube textureCubeLod " +
+                    "shadow1D shadow2D shadow1DProj shadow2DProj " +
+                    "shadow1DLod shadow2DLod shadow1DProjLod shadow2DProjLod " +
+                    "dFdx dFdy fwidth " +
+                    "noise1 noise2 noise3 noise4"),
+    atoms: words("true false " +
+                "gl_FragColor gl_SecondaryColor gl_Normal gl_Vertex " +
+                "gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 " +
+                "gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 " +
+                "gl_FogCoord gl_PointCoord " +
+                "gl_Position gl_PointSize gl_ClipVertex " +
+                "gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor " +
+                "gl_TexCoord gl_FogFragCoord " +
+                "gl_FragCoord gl_FrontFacing " +
+                "gl_FragData gl_FragDepth " +
+                "gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix " +
+                "gl_TextureMatrix gl_NormalMatrix gl_ModelViewMatrixInverse " +
+                "gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse " +
+                "gl_TexureMatrixTranspose gl_ModelViewMatrixInverseTranspose " +
+                "gl_ProjectionMatrixInverseTranspose " +
+                "gl_ModelViewProjectionMatrixInverseTranspose " +
+                "gl_TextureMatrixInverseTranspose " +
+                "gl_NormalScale gl_DepthRange gl_ClipPlane " +
+                "gl_Point gl_FrontMaterial gl_BackMaterial gl_LightSource gl_LightModel " +
+                "gl_FrontLightModelProduct gl_BackLightModelProduct " +
+                "gl_TextureColor gl_EyePlaneS gl_EyePlaneT gl_EyePlaneR gl_EyePlaneQ " +
+                "gl_FogParameters " +
+                "gl_MaxLights gl_MaxClipPlanes gl_MaxTextureUnits gl_MaxTextureCoords " +
+                "gl_MaxVertexAttribs gl_MaxVertexUniformComponents gl_MaxVaryingFloats " +
+                "gl_MaxVertexTextureImageUnits gl_MaxTextureImageUnits " +
+                "gl_MaxFragmentUniformComponents gl_MaxCombineTextureImageUnits " +
+                "gl_MaxDrawBuffers"),
+    indentSwitch: false,
+    hooks: {"#": cppHook},
+    modeProps: {fold: ["brace", "include"]}
+  });
+
+  def("text/x-nesc", {
+    name: "clike",
+    keywords: words(cKeywords + "as atomic async call command component components configuration event generic " +
+                    "implementation includes interface module new norace nx_struct nx_union post provides " +
+                    "signal task uses abstract extends"),
+    types: words(cTypes),
+    blockKeywords: words("case do else for if switch while struct"),
+    atoms: words("null true false"),
+    hooks: {"#": cppHook},
+    modeProps: {fold: ["brace", "include"]}
+  });
+
+  def("text/x-objectivec", {
+    name: "clike",
+    keywords: words(cKeywords + "inline restrict _Bool _Complex _Imaginary BOOL Class bycopy byref id IMP in " +
+                    "inout nil oneway out Protocol SEL self super atomic nonatomic retain copy readwrite readonly"),
+    types: words(cTypes),
+    atoms: words("YES NO NULL NILL ON OFF true false"),
+    hooks: {
+      "@": function(stream) {
+        stream.eatWhile(/[\w\$]/);
+        return "keyword";
+      },
+      "#": cppHook,
+      indent: function(_state, ctx, textAfter) {
+        if (ctx.type == "statement" && /^@\w/.test(textAfter)) return ctx.indented
+      }
+    },
+    modeProps: {fold: "brace"}
+  });
+
+  def("text/x-squirrel", {
+    name: "clike",
+    keywords: words("base break clone continue const default delete enum extends function in class" +
+                    " foreach local resume return this throw typeof yield constructor instanceof static"),
+    types: words(cTypes),
+    blockKeywords: words("case catch class else for foreach if switch try while"),
+    defKeywords: words("function local class"),
+    typeFirstDefinitions: true,
+    atoms: words("true false null"),
+    hooks: {"#": cppHook},
+    modeProps: {fold: ["brace", "include"]}
+  });
+
+  // Ceylon Strings need to deal with interpolation
+  var stringTokenizer = null;
+  function tokenCeylonString(type) {
+    return function(stream, state) {
+      var escaped = false, next, end = false;
+      while (!stream.eol()) {
+        if (!escaped && stream.match('"') &&
+              (type == "single" || stream.match('""'))) {
+          end = true;
+          break;
+        }
+        if (!escaped && stream.match('``')) {
+          stringTokenizer = tokenCeylonString(type);
+          end = true;
+          break;
+        }
+        next = stream.next();
+        escaped = type == "single" && !escaped && next == "\\";
+      }
+      if (end)
+          state.tokenize = null;
+      return "string";
+    }
+  }
+
+  def("text/x-ceylon", {
+    name: "clike",
+    keywords: words("abstracts alias assembly assert assign break case catch class continue dynamic else" +
+                    " exists extends finally for function given if import in interface is let module new" +
+                    " nonempty object of out outer package return satisfies super switch then this throw" +
+                    " try value void while"),
+    types: function(word) {
+        // In Ceylon all identifiers that start with an uppercase are types
+        var first = word.charAt(0);
+        return (first === first.toUpperCase() && first !== first.toLowerCase());
+    },
+    blockKeywords: words("case catch class dynamic else finally for function if interface module new object switch try while"),
+    defKeywords: words("class dynamic function interface module object package value"),
+    builtin: words("abstract actual aliased annotation by default deprecated doc final formal late license" +
+                   " native optional sealed see serializable shared suppressWarnings tagged throws variable"),
+    isPunctuationChar: /[\[\]{}\(\),;\:\.`]/,
+    isOperatorChar: /[+\-*&%=<>!?|^~:\/]/,
+    numberStart: /[\d#$]/,
+    number: /^(?:#[\da-fA-F_]+|\$[01_]+|[\d_]+[kMGTPmunpf]?|[\d_]+\.[\d_]+(?:[eE][-+]?\d+|[kMGTPmunpf]|)|)/i,
+    multiLineStrings: true,
+    typeFirstDefinitions: true,
+    atoms: words("true false null larger smaller equal empty finished"),
+    indentSwitch: false,
+    styleDefs: false,
+    hooks: {
+      "@": function(stream) {
+        stream.eatWhile(/[\w\$_]/);
+        return "meta";
+      },
+      '"': function(stream, state) {
+          state.tokenize = tokenCeylonString(stream.match('""') ? "triple" : "single");
+          return state.tokenize(stream, state);
+        },
+      '`': function(stream, state) {
+          if (!stringTokenizer || !stream.match('`')) return false;
+          state.tokenize = stringTokenizer;
+          stringTokenizer = null;
+          return state.tokenize(stream, state);
+        },
+      "'": function(stream) {
+        stream.eatWhile(/[\w\$_\xa1-\uffff]/);
+        return "atom";
+      },
+      token: function(_stream, state, style) {
+          if ((style == "variable" || style == "type") &&
+              state.prevToken == ".") {
+            return "variable-2";
+          }
+        }
+    },
+    modeProps: {
+        fold: ["brace", "import"],
+        closeBrackets: {triples: '"'}
+    }
+  });
+
+});
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/codemirror.lib.json-lint.js b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/codemirror.lib.json-lint.js
new file mode 100644
index 0000000..9298987
--- /dev/null
+++ b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/codemirror.lib.json-lint.js
@@ -0,0 +1,448 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* Jison generated parser */
+var jsonlint = (function(){
+var parser = {trace: function trace() { },
+yy: {},
+symbols_: {"error":2,"JSONString":3,"STRING":4,"JSONNumber":5,"NUMBER":6,"JSONNullLiteral":7,"NULL":8,"JSONBooleanLiteral":9,"TRUE":10,"FALSE":11,"JSONText":12,"JSONValue":13,"EOF":14,"JSONObject":15,"JSONArray":16,"{":17,"}":18,"JSONMemberList":19,"JSONMember":20,":":21,",":22,"[":23,"]":24,"JSONElementList":25,"$accept":0,"$end":1},
+terminals_: {2:"error",4:"STRING",6:"NUMBER",8:"NULL",10:"TRUE",11:"FALSE",14:"EOF",17:"{",18:"}",21:":",22:",",23:"[",24:"]"},
+productions_: [0,[3,1],[5,1],[7,1],[9,1],[9,1],[12,2],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[15,2],[15,3],[20,3],[19,1],[19,3],[16,2],[16,3],[25,1],[25,3]],
+performAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) {
+
+var $0 = $$.length - 1;
+switch (yystate) {
+case 1: // replace escaped characters with actual character
+          this.$ = yytext.replace(/\\(\\|")/g, "$"+"1")
+                     .replace(/\\n/g,'\n')
+                     .replace(/\\r/g,'\r')
+                     .replace(/\\t/g,'\t')
+                     .replace(/\\v/g,'\v')
+                     .replace(/\\f/g,'\f')
+                     .replace(/\\b/g,'\b');
+
+break;
+case 2:this.$ = Number(yytext);
+break;
+case 3:this.$ = null;
+break;
+case 4:this.$ = true;
+break;
+case 5:this.$ = false;
+break;
+case 6:return this.$ = $$[$0-1];
+break;
+case 13:this.$ = {};
+break;
+case 14:this.$ = $$[$0-1];
+break;
+case 15:this.$ = [$$[$0-2], $$[$0]];
+break;
+case 16:this.$ = {}; this.$[$$[$0][0]] = $$[$0][1];
+break;
+case 17:this.$ = $$[$0-2]; $$[$0-2][$$[$0][0]] = $$[$0][1];
+break;
+case 18:this.$ = [];
+break;
+case 19:this.$ = $$[$0-1];
+break;
+case 20:this.$ = [$$[$0]];
+break;
+case 21:this.$ = $$[$0-2]; $$[$0-2].push($$[$0]);
+break;
+}
+},
+table: [{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],12:1,13:2,15:7,16:8,17:[1,14],23:[1,15]},{1:[3]},{14:[1,16]},{14:[2,7],18:[2,7],22:[2,7],24:[2,7]},{14:[2,8],18:[2,8],22:[2,8],24:[2,8]},{14:[2,9],18:[2,9],22:[2,9],24:[2,9]},{14:[2,10],18:[2,10],22:[2,10],24:[2,10]},{14:[2,11],18:[2,11],22:[2,11],24:[2,11]},{14:[2,12],18:[2,12],22:[2,12],24:[2,12]},{14:[2,3],18:[2,3],22:[2,3],24:[2,3]},{14:[2,4],18:[2,4],22:[2,4],24:[2,4]},{14:[2,5],18:[2,5],22:[2,5],24:[2,5]},{14:[2,1],18:[2,1],21:[2,1],22:[2,1],24:[2,1]},{14:[2,2],18:[2,2],22:[2,2],24:[2,2]},{3:20,4:[1,12],18:[1,17],19:18,20:19},{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],13:23,15:7,16:8,17:[1,14],23:[1,15],24:[1,21],25:22},{1:[2,6]},{14:[2,13],18:[2,13],22:[2,13],24:[2,13]},{18:[1,24],22:[1,25]},{18:[2,16],22:[2,16]},{21:[1,26]},{14:[2,18],18:[2,18],22:[2,18],24:[2,18]},{22:[1,28],24:[1,27]},{22:[2,20],24:[2,20]},{14:[2,14],18:[2,14],22:[2,14],24:[2,14]},{3:20,4:[1,12],20:29},{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],13:30,15:7,16:8,17:[1,14],23:[1,15]},{14:[2,19],18:[2,19],22:[2,19],24:[2,19]},{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],13:31,15:7,16:8,17:[1,14],23:[1,15]},{18:[2,17],22:[2,17]},{18:[2,15],22:[2,15]},{22:[2,21],24:[2,21]}],
+defaultActions: {16:[2,6]},
+parseError: function parseError(str, hash) {
+    throw new Error(str);
+},
+parse: function parse(input) {
+    var self = this,
+        stack = [0],
+        vstack = [null], // semantic value stack
+        lstack = [], // location stack
+        table = this.table,
+        yytext = '',
+        yylineno = 0,
+        yyleng = 0,
+        recovering = 0,
+        TERROR = 2,
+        EOF = 1;
+
+    //this.reductionCount = this.shiftCount = 0;
+
+    this.lexer.setInput(input);
+    this.lexer.yy = this.yy;
+    this.yy.lexer = this.lexer;
+    if (typeof this.lexer.yylloc == 'undefined')
+        this.lexer.yylloc = {};
+    var yyloc = this.lexer.yylloc;
+    lstack.push(yyloc);
+
+    if (typeof this.yy.parseError === 'function')
+        this.parseError = this.yy.parseError;
+
+    function popStack (n) {
+        stack.length = stack.length - 2*n;
+        vstack.length = vstack.length - n;
+        lstack.length = lstack.length - n;
+    }
+
+    function lex() {
+        var token;
+        token = self.lexer.lex() || 1; // $end = 1
+        // if token isn't its numeric value, convert
+        if (typeof token !== 'number') {
+            token = self.symbols_[token] || token;
+        }
+        return token;
+    }
+
+    var symbol, preErrorSymbol, state, action, a, r, yyval={},p,len,newState, expected;
+    while (true) {
+        // retreive state number from top of stack
+        state = stack[stack.length-1];
+
+        // use default actions if available
+        if (this.defaultActions[state]) {
+            action = this.defaultActions[state];
+        } else {
+            if (symbol == null)
+                symbol = lex();
+            // read action for current state and first input
+            action = table[state] && table[state][symbol];
+        }
+
+        // handle parse error
+        _handle_error:
+        if (typeof action === 'undefined' || !action.length || !action[0]) {
+
+            if (!recovering) {
+                // Report error
+                expected = [];
+                for (p in table[state]) if (this.terminals_[p] && p > 2) {
+                    expected.push("'"+this.terminals_[p]+"'");
+                }
+                var errStr = '';
+                if (this.lexer.showPosition) {
+                    errStr = 'Parse error on line '+(yylineno+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+expected.join(', ') + ", got '" + this.terminals_[symbol]+ "'";
+                } else {
+                    errStr = 'Parse error on line '+(yylineno+1)+": Unexpected " +
+                                  (symbol == 1 /*EOF*/ ? "end of input" :
+                                              ("'"+(this.terminals_[symbol] || symbol)+"'"));
+                }
+                this.parseError(errStr,
+                    {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected});
+            }
+
+            // just recovered from another error
+            if (recovering == 3) {
+                if (symbol == EOF) {
+                    throw new Error(errStr || 'Parsing halted.');
+                }
+
+                // discard current lookahead and grab another
+                yyleng = this.lexer.yyleng;
+                yytext = this.lexer.yytext;
+                yylineno = this.lexer.yylineno;
+                yyloc = this.lexer.yylloc;
+                symbol = lex();
+            }
+
+            // try to recover from error
+            while (1) {
+                // check for error recovery rule in this state
+                if ((TERROR.toString()) in table[state]) {
+                    break;
+                }
+                if (state == 0) {
+                    throw new Error(errStr || 'Parsing halted.');
+                }
+                popStack(1);
+                state = stack[stack.length-1];
+            }
+
+            preErrorSymbol = symbol; // save the lookahead token
+            symbol = TERROR;         // insert generic error symbol as new lookahead
+            state = stack[stack.length-1];
+            action = table[state] && table[state][TERROR];
+            recovering = 3; // allow 3 real symbols to be shifted before reporting a new error
+        }
+
+        // this shouldn't happen, unless resolve defaults are off
+        if (action[0] instanceof Array && action.length > 1) {
+            throw new Error('Parse Error: multiple actions possible at state: '+state+', token: '+symbol);
+        }
+
+        switch (action[0]) {
+
+            case 1: // shift
+                //this.shiftCount++;
+
+                stack.push(symbol);
+                vstack.push(this.lexer.yytext);
+                lstack.push(this.lexer.yylloc);
+                stack.push(action[1]); // push state
+                symbol = null;
+                if (!preErrorSymbol) { // normal execution/no error
+                    yyleng = this.lexer.yyleng;
+                    yytext = this.lexer.yytext;
+                    yylineno = this.lexer.yylineno;
+                    yyloc = this.lexer.yylloc;
+                    if (recovering > 0)
+                        recovering--;
+                } else { // error just occurred, resume old lookahead f/ before error
+                    symbol = preErrorSymbol;
+                    preErrorSymbol = null;
+                }
+                break;
+
+            case 2: // reduce
+                //this.reductionCount++;
+
+                len = this.productions_[action[1]][1];
+
+                // perform semantic action
+                yyval.$ = vstack[vstack.length-len]; // default to $$ = $1
+                // default location, uses first token for firsts, last for lasts
+                yyval._$ = {
+                    first_line: lstack[lstack.length-(len||1)].first_line,
+                    last_line: lstack[lstack.length-1].last_line,
+                    first_column: lstack[lstack.length-(len||1)].first_column,
+                    last_column: lstack[lstack.length-1].last_column
+                };
+                r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack);
+
+                if (typeof r !== 'undefined') {
+                    return r;
+                }
+
+                // pop off stack
+                if (len) {
+                    stack = stack.slice(0,-1*len*2);
+                    vstack = vstack.slice(0, -1*len);
+                    lstack = lstack.slice(0, -1*len);
+                }
+
+                stack.push(this.productions_[action[1]][0]);    // push nonterminal (reduce)
+                vstack.push(yyval.$);
+                lstack.push(yyval._$);
+                // goto new state = table[STATE][NONTERMINAL]
+                newState = table[stack[stack.length-2]][stack[stack.length-1]];
+                stack.push(newState);
+                break;
+
+            case 3: // accept
+                return true;
+        }
+
+    }
+
+    return true;
+}};
+/* Jison generated lexer */
+var lexer = (function(){
+var lexer = ({EOF:1,
+parseError:function parseError(str, hash) {
+        if (this.yy.parseError) {
+            this.yy.parseError(str, hash);
+        } else {
+            throw new Error(str);
+        }
+    },
+setInput:function (input) {
+        this._input = input;
+        this._more = this._less = this.done = false;
+        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};
+        return this;
+    },
+input:function () {
+        var ch = this._input[0];
+        this.yytext+=ch;
+        this.yyleng++;
+        this.match+=ch;
+        this.matched+=ch;
+        var lines = ch.match(/\n/);
+        if (lines) this.yylineno++;
+        this._input = this._input.slice(1);
+        return ch;
+    },
+unput:function (ch) {
+        this._input = ch + this._input;
+        return this;
+    },
+more:function () {
+        this._more = true;
+        return this;
+    },
+less:function (n) {
+        this._input = this.match.slice(n) + this._input;
+    },
+pastInput:function () {
+        var past = this.matched.substr(0, this.matched.length - this.match.length);
+        return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
+    },
+upcomingInput:function () {
+        var next = this.match;
+        if (next.length < 20) {
+            next += this._input.substr(0, 20-next.length);
+        }
+        return (next.substr(0,20)+(next.length > 20 ? '...':'')).replace(/\n/g, "");
+    },
+showPosition:function () {
+        var pre = this.pastInput();
+        var c = new Array(pre.length + 1).join("-");
+        return pre + this.upcomingInput() + "\n" + c+"^";
+    },
+next:function () {
+        if (this.done) {
+            return this.EOF;
+        }
+        if (!this._input) this.done = true;
+
+        var token,
+            match,
+            tempMatch,
+            index,
+            col,
+            lines;
+        if (!this._more) {
+            this.yytext = '';
+            this.match = '';
+        }
+        var rules = this._currentRules();
+        for (var i=0;i < rules.length; i++) {
+            tempMatch = this._input.match(this.rules[rules[i]]);
+            if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
+                match = tempMatch;
+                index = i;
+                if (!this.options.flex) break;
+            }
+        }
+        if (match) {
+            lines = match[0].match(/\n.*/g);
+            if (lines) this.yylineno += lines.length;
+            this.yylloc = {first_line: this.yylloc.last_line,
+                           last_line: this.yylineno+1,
+                           first_column: this.yylloc.last_column,
+                           last_column: lines ? lines[lines.length-1].length-1 : this.yylloc.last_column + match[0].length}
+            this.yytext += match[0];
+            this.match += match[0];
+            this.yyleng = this.yytext.length;
+            this._more = false;
+            this._input = this._input.slice(match[0].length);
+            this.matched += match[0];
+            token = this.performAction.call(this, this.yy, this, rules[index],this.conditionStack[this.conditionStack.length-1]);
+            if (this.done && this._input) this.done = false;
+            if (token) return token;
+            else return;
+        }
+        if (this._input === "") {
+            return this.EOF;
+        } else {
+            this.parseError('Lexical error on line '+(this.yylineno+1)+'. Unrecognized text.\n'+this.showPosition(),
+                    {text: "", token: null, line: this.yylineno});
+        }
+    },
+lex:function lex() {
+        var r = this.next();
+        if (typeof r !== 'undefined') {
+            return r;
+        } else {
+            return this.lex();
+        }
+    },
+begin:function begin(condition) {
+        this.conditionStack.push(condition);
+    },
+popState:function popState() {
+        return this.conditionStack.pop();
+    },
+_currentRules:function _currentRules() {
+        return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules;
+    },
+topState:function () {
+        return this.conditionStack[this.conditionStack.length-2];
+    },
+pushState:function begin(condition) {
+        this.begin(condition);
+    }});
+lexer.options = {};
+lexer.performAction = function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
+
+var YYSTATE=YY_START
+switch($avoiding_name_collisions) {
+case 0:/* skip whitespace */
+break;
+case 1:return 6
+break;
+case 2:yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2); return 4
+break;
+case 3:return 17
+break;
+case 4:return 18
+break;
+case 5:return 23
+break;
+case 6:return 24
+break;
+case 7:return 22
+break;
+case 8:return 21
+break;
+case 9:return 10
+break;
+case 10:return 11
+break;
+case 11:return 8
+break;
+case 12:return 14
+break;
+case 13:return 'INVALID'
+break;
+}
+};
+lexer.rules = [/^(?:\s+)/,/^(?:(-?([0-9]|[1-9][0-9]+))(\.[0-9]+)?([eE][-+]?[0-9]+)?\b)/,/^(?:"(?:\\[\\"bfnrt/]|\\u[a-fA-F0-9]{4}|[^\\\0-\x09\x0a-\x1f"])*")/,/^(?:\{)/,/^(?:\})/,/^(?:\[)/,/^(?:\])/,/^(?:,)/,/^(?::)/,/^(?:true\b)/,/^(?:false\b)/,/^(?:null\b)/,/^(?:$)/,/^(?:.)/];
+lexer.conditions = {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13],"inclusive":true}};
+
+
+;
+return lexer;})()
+parser.lexer = lexer;
+return parser;
+})();
+if (typeof require !== 'undefined' && typeof exports !== 'undefined') {
+exports.parser = jsonlint;
+exports.parse = function () { return jsonlint.parse.apply(jsonlint, arguments); }
+exports.main = function commonjsMain(args) {
+    if (!args[1])
+        throw new Error('Usage: '+args[0]+' FILE');
+    if (typeof process !== 'undefined') {
+        var source = require('fs').readFileSync(require('path').join(process.cwd(), args[1]), "utf8");
+    } else {
+        var cwd = require("file").path(require("file").cwd());
+        var source = cwd.join(args[1]).read({charset: "utf-8"});
+    }
+    return exports.parser.parse(source);
+}
+if (typeof module !== 'undefined' && require.main === module) {
+  exports.main(typeof process !== 'undefined' ? process.argv.slice(1) : require("system").args);
+}
+}
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/diff_match_patch.js b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/diff_match_patch.js
new file mode 100644
index 0000000..c41b513
--- /dev/null
+++ b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/diff_match_patch.js
@@ -0,0 +1,49 @@
+(function(){function diff_match_patch(){this.Diff_Timeout=1;this.Diff_EditCost=4;this.Match_Threshold=0.5;this.Match_Distance=1E3;this.Patch_DeleteThreshold=0.5;this.Patch_Margin=4;this.Match_MaxBits=32}
+diff_match_patch.prototype.diff_main=function(a,b,c,d){"undefined"==typeof d&&(d=0>=this.Diff_Timeout?Number.MAX_VALUE:(new Date).getTime()+1E3*this.Diff_Timeout);if(null==a||null==b)throw Error("Null input. (diff_main)");if(a==b)return a?[[0,a]]:[];"undefined"==typeof c&&(c=!0);var e=c,f=this.diff_commonPrefix(a,b);c=a.substring(0,f);a=a.substring(f);b=b.substring(f);var f=this.diff_commonSuffix(a,b),g=a.substring(a.length-f);a=a.substring(0,a.length-f);b=b.substring(0,b.length-f);a=this.diff_compute_(a,
+b,e,d);c&&a.unshift([0,c]);g&&a.push([0,g]);this.diff_cleanupMerge(a);return a};
+diff_match_patch.prototype.diff_compute_=function(a,b,c,d){if(!a)return[[1,b]];if(!b)return[[-1,a]];var e=a.length>b.length?a:b,f=a.length>b.length?b:a,g=e.indexOf(f);return-1!=g?(c=[[1,e.substring(0,g)],[0,f],[1,e.substring(g+f.length)]],a.length>b.length&&(c[0][0]=c[2][0]=-1),c):1==f.length?[[-1,a],[1,b]]:(e=this.diff_halfMatch_(a,b))?(f=e[0],a=e[1],g=e[2],b=e[3],e=e[4],f=this.diff_main(f,g,c,d),c=this.diff_main(a,b,c,d),f.concat([[0,e]],c)):c&&100<a.length&&100<b.length?this.diff_lineMode_(a,b,
+d):this.diff_bisect_(a,b,d)};
+diff_match_patch.prototype.diff_lineMode_=function(a,b,c){var d=this.diff_linesToChars_(a,b);a=d.chars1;b=d.chars2;d=d.lineArray;a=this.diff_main(a,b,!1,c);this.diff_charsToLines_(a,d);this.diff_cleanupSemantic(a);a.push([0,""]);for(var e=d=b=0,f="",g="";b<a.length;){switch(a[b][0]){case 1:e++;g+=a[b][1];break;case -1:d++;f+=a[b][1];break;case 0:if(1<=d&&1<=e){a.splice(b-d-e,d+e);b=b-d-e;d=this.diff_main(f,g,!1,c);for(e=d.length-1;0<=e;e--)a.splice(b,0,d[e]);b+=d.length}d=e=0;g=f=""}b++}a.pop();return a};
+diff_match_patch.prototype.diff_bisect_=function(a,b,c){for(var d=a.length,e=b.length,f=Math.ceil((d+e)/2),g=f,h=2*f,j=Array(h),i=Array(h),k=0;k<h;k++)j[k]=-1,i[k]=-1;j[g+1]=0;i[g+1]=0;for(var k=d-e,q=0!=k%2,r=0,t=0,p=0,w=0,v=0;v<f&&!((new Date).getTime()>c);v++){for(var n=-v+r;n<=v-t;n+=2){var l=g+n,m;m=n==-v||n!=v&&j[l-1]<j[l+1]?j[l+1]:j[l-1]+1;for(var s=m-n;m<d&&s<e&&a.charAt(m)==b.charAt(s);)m++,s++;j[l]=m;if(m>d)t+=2;else if(s>e)r+=2;else if(q&&(l=g+k-n,0<=l&&l<h&&-1!=i[l])){var u=d-i[l];if(m>=
+u)return this.diff_bisectSplit_(a,b,m,s,c)}}for(n=-v+p;n<=v-w;n+=2){l=g+n;u=n==-v||n!=v&&i[l-1]<i[l+1]?i[l+1]:i[l-1]+1;for(m=u-n;u<d&&m<e&&a.charAt(d-u-1)==b.charAt(e-m-1);)u++,m++;i[l]=u;if(u>d)w+=2;else if(m>e)p+=2;else if(!q&&(l=g+k-n,0<=l&&(l<h&&-1!=j[l])&&(m=j[l],s=g+m-l,u=d-u,m>=u)))return this.diff_bisectSplit_(a,b,m,s,c)}}return[[-1,a],[1,b]]};
+diff_match_patch.prototype.diff_bisectSplit_=function(a,b,c,d,e){var f=a.substring(0,c),g=b.substring(0,d);a=a.substring(c);b=b.substring(d);f=this.diff_main(f,g,!1,e);e=this.diff_main(a,b,!1,e);return f.concat(e)};
+diff_match_patch.prototype.diff_linesToChars_=function(a,b){function c(a){for(var b="",c=0,f=-1,g=d.length;f<a.length-1;){f=a.indexOf("\n",c);-1==f&&(f=a.length-1);var r=a.substring(c,f+1),c=f+1;(e.hasOwnProperty?e.hasOwnProperty(r):void 0!==e[r])?b+=String.fromCharCode(e[r]):(b+=String.fromCharCode(g),e[r]=g,d[g++]=r)}return b}var d=[],e={};d[0]="";var f=c(a),g=c(b);return{chars1:f,chars2:g,lineArray:d}};
+diff_match_patch.prototype.diff_charsToLines_=function(a,b){for(var c=0;c<a.length;c++){for(var d=a[c][1],e=[],f=0;f<d.length;f++)e[f]=b[d.charCodeAt(f)];a[c][1]=e.join("")}};diff_match_patch.prototype.diff_commonPrefix=function(a,b){if(!a||!b||a.charAt(0)!=b.charAt(0))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(f,e)==b.substring(f,e)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};
+diff_match_patch.prototype.diff_commonSuffix=function(a,b){if(!a||!b||a.charAt(a.length-1)!=b.charAt(b.length-1))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(a.length-e,a.length-f)==b.substring(b.length-e,b.length-f)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};
+diff_match_patch.prototype.diff_commonOverlap_=function(a,b){var c=a.length,d=b.length;if(0==c||0==d)return 0;c>d?a=a.substring(c-d):c<d&&(b=b.substring(0,c));c=Math.min(c,d);if(a==b)return c;for(var d=0,e=1;;){var f=a.substring(c-e),f=b.indexOf(f);if(-1==f)return d;e+=f;if(0==f||a.substring(c-e)==b.substring(0,e))d=e,e++}};
+diff_match_patch.prototype.diff_halfMatch_=function(a,b){function c(a,b,c){for(var d=a.substring(c,c+Math.floor(a.length/4)),e=-1,g="",h,j,n,l;-1!=(e=b.indexOf(d,e+1));){var m=f.diff_commonPrefix(a.substring(c),b.substring(e)),s=f.diff_commonSuffix(a.substring(0,c),b.substring(0,e));g.length<s+m&&(g=b.substring(e-s,e)+b.substring(e,e+m),h=a.substring(0,c-s),j=a.substring(c+m),n=b.substring(0,e-s),l=b.substring(e+m))}return 2*g.length>=a.length?[h,j,n,l,g]:null}if(0>=this.Diff_Timeout)return null;
+var d=a.length>b.length?a:b,e=a.length>b.length?b:a;if(4>d.length||2*e.length<d.length)return null;var f=this,g=c(d,e,Math.ceil(d.length/4)),d=c(d,e,Math.ceil(d.length/2)),h;if(!g&&!d)return null;h=d?g?g[4].length>d[4].length?g:d:d:g;var j;a.length>b.length?(g=h[0],d=h[1],e=h[2],j=h[3]):(e=h[0],j=h[1],g=h[2],d=h[3]);h=h[4];return[g,d,e,j,h]};
+diff_match_patch.prototype.diff_cleanupSemantic=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=0,h=0,j=0,i=0;f<a.length;)0==a[f][0]?(c[d++]=f,g=j,h=i,i=j=0,e=a[f][1]):(1==a[f][0]?j+=a[f][1].length:i+=a[f][1].length,e&&(e.length<=Math.max(g,h)&&e.length<=Math.max(j,i))&&(a.splice(c[d-1],0,[-1,e]),a[c[d-1]+1][0]=1,d--,d--,f=0<d?c[d-1]:-1,i=j=h=g=0,e=null,b=!0)),f++;b&&this.diff_cleanupMerge(a);this.diff_cleanupSemanticLossless(a);for(f=1;f<a.length;){if(-1==a[f-1][0]&&1==a[f][0]){b=a[f-1][1];c=a[f][1];
+d=this.diff_commonOverlap_(b,c);e=this.diff_commonOverlap_(c,b);if(d>=e){if(d>=b.length/2||d>=c.length/2)a.splice(f,0,[0,c.substring(0,d)]),a[f-1][1]=b.substring(0,b.length-d),a[f+1][1]=c.substring(d),f++}else if(e>=b.length/2||e>=c.length/2)a.splice(f,0,[0,b.substring(0,e)]),a[f-1][0]=1,a[f-1][1]=c.substring(0,c.length-e),a[f+1][0]=-1,a[f+1][1]=b.substring(e),f++;f++}f++}};
+diff_match_patch.prototype.diff_cleanupSemanticLossless=function(a){function b(a,b){if(!a||!b)return 6;var c=a.charAt(a.length-1),d=b.charAt(0),e=c.match(diff_match_patch.nonAlphaNumericRegex_),f=d.match(diff_match_patch.nonAlphaNumericRegex_),g=e&&c.match(diff_match_patch.whitespaceRegex_),h=f&&d.match(diff_match_patch.whitespaceRegex_),c=g&&c.match(diff_match_patch.linebreakRegex_),d=h&&d.match(diff_match_patch.linebreakRegex_),i=c&&a.match(diff_match_patch.blanklineEndRegex_),j=d&&b.match(diff_match_patch.blanklineStartRegex_);
+return i||j?5:c||d?4:e&&!g&&h?3:g||h?2:e||f?1:0}for(var c=1;c<a.length-1;){if(0==a[c-1][0]&&0==a[c+1][0]){var d=a[c-1][1],e=a[c][1],f=a[c+1][1],g=this.diff_commonSuffix(d,e);if(g)var h=e.substring(e.length-g),d=d.substring(0,d.length-g),e=h+e.substring(0,e.length-g),f=h+f;for(var g=d,h=e,j=f,i=b(d,e)+b(e,f);e.charAt(0)===f.charAt(0);){var d=d+e.charAt(0),e=e.substring(1)+f.charAt(0),f=f.substring(1),k=b(d,e)+b(e,f);k>=i&&(i=k,g=d,h=e,j=f)}a[c-1][1]!=g&&(g?a[c-1][1]=g:(a.splice(c-1,1),c--),a[c][1]=
+h,j?a[c+1][1]=j:(a.splice(c+1,1),c--))}c++}};diff_match_patch.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;diff_match_patch.whitespaceRegex_=/\s/;diff_match_patch.linebreakRegex_=/[\r\n]/;diff_match_patch.blanklineEndRegex_=/\n\r?\n$/;diff_match_patch.blanklineStartRegex_=/^\r?\n\r?\n/;
+diff_match_patch.prototype.diff_cleanupEfficiency=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=!1,h=!1,j=!1,i=!1;f<a.length;){if(0==a[f][0])a[f][1].length<this.Diff_EditCost&&(j||i)?(c[d++]=f,g=j,h=i,e=a[f][1]):(d=0,e=null),j=i=!1;else if(-1==a[f][0]?i=!0:j=!0,e&&(g&&h&&j&&i||e.length<this.Diff_EditCost/2&&3==g+h+j+i))a.splice(c[d-1],0,[-1,e]),a[c[d-1]+1][0]=1,d--,e=null,g&&h?(j=i=!0,d=0):(d--,f=0<d?c[d-1]:-1,j=i=!1),b=!0;f++}b&&this.diff_cleanupMerge(a)};
+diff_match_patch.prototype.diff_cleanupMerge=function(a){a.push([0,""]);for(var b=0,c=0,d=0,e="",f="",g;b<a.length;)switch(a[b][0]){case 1:d++;f+=a[b][1];b++;break;case -1:c++;e+=a[b][1];b++;break;case 0:1<c+d?(0!==c&&0!==d&&(g=this.diff_commonPrefix(f,e),0!==g&&(0<b-c-d&&0==a[b-c-d-1][0]?a[b-c-d-1][1]+=f.substring(0,g):(a.splice(0,0,[0,f.substring(0,g)]),b++),f=f.substring(g),e=e.substring(g)),g=this.diff_commonSuffix(f,e),0!==g&&(a[b][1]=f.substring(f.length-g)+a[b][1],f=f.substring(0,f.length-
+g),e=e.substring(0,e.length-g))),0===c?a.splice(b-d,c+d,[1,f]):0===d?a.splice(b-c,c+d,[-1,e]):a.splice(b-c-d,c+d,[-1,e],[1,f]),b=b-c-d+(c?1:0)+(d?1:0)+1):0!==b&&0==a[b-1][0]?(a[b-1][1]+=a[b][1],a.splice(b,1)):b++,c=d=0,f=e=""}""===a[a.length-1][1]&&a.pop();c=!1;for(b=1;b<a.length-1;)0==a[b-1][0]&&0==a[b+1][0]&&(a[b][1].substring(a[b][1].length-a[b-1][1].length)==a[b-1][1]?(a[b][1]=a[b-1][1]+a[b][1].substring(0,a[b][1].length-a[b-1][1].length),a[b+1][1]=a[b-1][1]+a[b+1][1],a.splice(b-1,1),c=!0):a[b][1].substring(0,
+a[b+1][1].length)==a[b+1][1]&&(a[b-1][1]+=a[b+1][1],a[b][1]=a[b][1].substring(a[b+1][1].length)+a[b+1][1],a.splice(b+1,1),c=!0)),b++;c&&this.diff_cleanupMerge(a)};diff_match_patch.prototype.diff_xIndex=function(a,b){var c=0,d=0,e=0,f=0,g;for(g=0;g<a.length;g++){1!==a[g][0]&&(c+=a[g][1].length);-1!==a[g][0]&&(d+=a[g][1].length);if(c>b)break;e=c;f=d}return a.length!=g&&-1===a[g][0]?f:f+(b-e)};
+diff_match_patch.prototype.diff_prettyHtml=function(a){for(var b=[],c=/&/g,d=/</g,e=/>/g,f=/\n/g,g=0;g<a.length;g++){var h=a[g][0],j=a[g][1],j=j.replace(c,"&amp;").replace(d,"&lt;").replace(e,"&gt;").replace(f,"&para;<br>");switch(h){case 1:b[g]='<ins style="background:#e6ffe6;">'+j+"</ins>";break;case -1:b[g]='<del style="background:#ffe6e6;">'+j+"</del>";break;case 0:b[g]="<span>"+j+"</span>"}}return b.join("")};
+diff_match_patch.prototype.diff_text1=function(a){for(var b=[],c=0;c<a.length;c++)1!==a[c][0]&&(b[c]=a[c][1]);return b.join("")};diff_match_patch.prototype.diff_text2=function(a){for(var b=[],c=0;c<a.length;c++)-1!==a[c][0]&&(b[c]=a[c][1]);return b.join("")};diff_match_patch.prototype.diff_levenshtein=function(a){for(var b=0,c=0,d=0,e=0;e<a.length;e++){var f=a[e][0],g=a[e][1];switch(f){case 1:c+=g.length;break;case -1:d+=g.length;break;case 0:b+=Math.max(c,d),d=c=0}}return b+=Math.max(c,d)};
+diff_match_patch.prototype.diff_toDelta=function(a){for(var b=[],c=0;c<a.length;c++)switch(a[c][0]){case 1:b[c]="+"+encodeURI(a[c][1]);break;case -1:b[c]="-"+a[c][1].length;break;case 0:b[c]="="+a[c][1].length}return b.join("\t").replace(/%20/g," ")};
+diff_match_patch.prototype.diff_fromDelta=function(a,b){for(var c=[],d=0,e=0,f=b.split(/\t/g),g=0;g<f.length;g++){var h=f[g].substring(1);switch(f[g].charAt(0)){case "+":try{c[d++]=[1,decodeURI(h)]}catch(j){throw Error("Illegal escape in diff_fromDelta: "+h);}break;case "-":case "=":var i=parseInt(h,10);if(isNaN(i)||0>i)throw Error("Invalid number in diff_fromDelta: "+h);h=a.substring(e,e+=i);"="==f[g].charAt(0)?c[d++]=[0,h]:c[d++]=[-1,h];break;default:if(f[g])throw Error("Invalid diff operation in diff_fromDelta: "+
+f[g]);}}if(e!=a.length)throw Error("Delta length ("+e+") does not equal source text length ("+a.length+").");return c};diff_match_patch.prototype.match_main=function(a,b,c){if(null==a||null==b||null==c)throw Error("Null input. (match_main)");c=Math.max(0,Math.min(c,a.length));return a==b?0:a.length?a.substring(c,c+b.length)==b?c:this.match_bitap_(a,b,c):-1};
+diff_match_patch.prototype.match_bitap_=function(a,b,c){function d(a,d){var e=a/b.length,g=Math.abs(c-d);return!f.Match_Distance?g?1:e:e+g/f.Match_Distance}if(b.length>this.Match_MaxBits)throw Error("Pattern too long for this browser.");var e=this.match_alphabet_(b),f=this,g=this.Match_Threshold,h=a.indexOf(b,c);-1!=h&&(g=Math.min(d(0,h),g),h=a.lastIndexOf(b,c+b.length),-1!=h&&(g=Math.min(d(0,h),g)));for(var j=1<<b.length-1,h=-1,i,k,q=b.length+a.length,r,t=0;t<b.length;t++){i=0;for(k=q;i<k;)d(t,c+
+k)<=g?i=k:q=k,k=Math.floor((q-i)/2+i);q=k;i=Math.max(1,c-k+1);var p=Math.min(c+k,a.length)+b.length;k=Array(p+2);for(k[p+1]=(1<<t)-1;p>=i;p--){var w=e[a.charAt(p-1)];k[p]=0===t?(k[p+1]<<1|1)&w:(k[p+1]<<1|1)&w|((r[p+1]|r[p])<<1|1)|r[p+1];if(k[p]&j&&(w=d(t,p-1),w<=g))if(g=w,h=p-1,h>c)i=Math.max(1,2*c-h);else break}if(d(t+1,c)>g)break;r=k}return h};
+diff_match_patch.prototype.match_alphabet_=function(a){for(var b={},c=0;c<a.length;c++)b[a.charAt(c)]=0;for(c=0;c<a.length;c++)b[a.charAt(c)]|=1<<a.length-c-1;return b};
+diff_match_patch.prototype.patch_addContext_=function(a,b){if(0!=b.length){for(var c=b.substring(a.start2,a.start2+a.length1),d=0;b.indexOf(c)!=b.lastIndexOf(c)&&c.length<this.Match_MaxBits-this.Patch_Margin-this.Patch_Margin;)d+=this.Patch_Margin,c=b.substring(a.start2-d,a.start2+a.length1+d);d+=this.Patch_Margin;(c=b.substring(a.start2-d,a.start2))&&a.diffs.unshift([0,c]);(d=b.substring(a.start2+a.length1,a.start2+a.length1+d))&&a.diffs.push([0,d]);a.start1-=c.length;a.start2-=c.length;a.length1+=
+c.length+d.length;a.length2+=c.length+d.length}};
+diff_match_patch.prototype.patch_make=function(a,b,c){var d;if("string"==typeof a&&"string"==typeof b&&"undefined"==typeof c)d=a,b=this.diff_main(d,b,!0),2<b.length&&(this.diff_cleanupSemantic(b),this.diff_cleanupEfficiency(b));else if(a&&"object"==typeof a&&"undefined"==typeof b&&"undefined"==typeof c)b=a,d=this.diff_text1(b);else if("string"==typeof a&&b&&"object"==typeof b&&"undefined"==typeof c)d=a;else if("string"==typeof a&&"string"==typeof b&&c&&"object"==typeof c)d=a,b=c;else throw Error("Unknown call format to patch_make.");
+if(0===b.length)return[];c=[];a=new diff_match_patch.patch_obj;for(var e=0,f=0,g=0,h=d,j=0;j<b.length;j++){var i=b[j][0],k=b[j][1];!e&&0!==i&&(a.start1=f,a.start2=g);switch(i){case 1:a.diffs[e++]=b[j];a.length2+=k.length;d=d.substring(0,g)+k+d.substring(g);break;case -1:a.length1+=k.length;a.diffs[e++]=b[j];d=d.substring(0,g)+d.substring(g+k.length);break;case 0:k.length<=2*this.Patch_Margin&&e&&b.length!=j+1?(a.diffs[e++]=b[j],a.length1+=k.length,a.length2+=k.length):k.length>=2*this.Patch_Margin&&
+e&&(this.patch_addContext_(a,h),c.push(a),a=new diff_match_patch.patch_obj,e=0,h=d,f=g)}1!==i&&(f+=k.length);-1!==i&&(g+=k.length)}e&&(this.patch_addContext_(a,h),c.push(a));return c};diff_match_patch.prototype.patch_deepCopy=function(a){for(var b=[],c=0;c<a.length;c++){var d=a[c],e=new diff_match_patch.patch_obj;e.diffs=[];for(var f=0;f<d.diffs.length;f++)e.diffs[f]=d.diffs[f].slice();e.start1=d.start1;e.start2=d.start2;e.length1=d.length1;e.length2=d.length2;b[c]=e}return b};
+diff_match_patch.prototype.patch_apply=function(a,b){if(0==a.length)return[b,[]];a=this.patch_deepCopy(a);var c=this.patch_addPadding(a);b=c+b+c;this.patch_splitMax(a);for(var d=0,e=[],f=0;f<a.length;f++){var g=a[f].start2+d,h=this.diff_text1(a[f].diffs),j,i=-1;if(h.length>this.Match_MaxBits){if(j=this.match_main(b,h.substring(0,this.Match_MaxBits),g),-1!=j&&(i=this.match_main(b,h.substring(h.length-this.Match_MaxBits),g+h.length-this.Match_MaxBits),-1==i||j>=i))j=-1}else j=this.match_main(b,h,g);
+if(-1==j)e[f]=!1,d-=a[f].length2-a[f].length1;else if(e[f]=!0,d=j-g,g=-1==i?b.substring(j,j+h.length):b.substring(j,i+this.Match_MaxBits),h==g)b=b.substring(0,j)+this.diff_text2(a[f].diffs)+b.substring(j+h.length);else if(g=this.diff_main(h,g,!1),h.length>this.Match_MaxBits&&this.diff_levenshtein(g)/h.length>this.Patch_DeleteThreshold)e[f]=!1;else{this.diff_cleanupSemanticLossless(g);for(var h=0,k,i=0;i<a[f].diffs.length;i++){var q=a[f].diffs[i];0!==q[0]&&(k=this.diff_xIndex(g,h));1===q[0]?b=b.substring(0,
+j+k)+q[1]+b.substring(j+k):-1===q[0]&&(b=b.substring(0,j+k)+b.substring(j+this.diff_xIndex(g,h+q[1].length)));-1!==q[0]&&(h+=q[1].length)}}}b=b.substring(c.length,b.length-c.length);return[b,e]};
+diff_match_patch.prototype.patch_addPadding=function(a){for(var b=this.Patch_Margin,c="",d=1;d<=b;d++)c+=String.fromCharCode(d);for(d=0;d<a.length;d++)a[d].start1+=b,a[d].start2+=b;var d=a[0],e=d.diffs;if(0==e.length||0!=e[0][0])e.unshift([0,c]),d.start1-=b,d.start2-=b,d.length1+=b,d.length2+=b;else if(b>e[0][1].length){var f=b-e[0][1].length;e[0][1]=c.substring(e[0][1].length)+e[0][1];d.start1-=f;d.start2-=f;d.length1+=f;d.length2+=f}d=a[a.length-1];e=d.diffs;0==e.length||0!=e[e.length-1][0]?(e.push([0,
+c]),d.length1+=b,d.length2+=b):b>e[e.length-1][1].length&&(f=b-e[e.length-1][1].length,e[e.length-1][1]+=c.substring(0,f),d.length1+=f,d.length2+=f);return c};
+diff_match_patch.prototype.patch_splitMax=function(a){for(var b=this.Match_MaxBits,c=0;c<a.length;c++)if(!(a[c].length1<=b)){var d=a[c];a.splice(c--,1);for(var e=d.start1,f=d.start2,g="";0!==d.diffs.length;){var h=new diff_match_patch.patch_obj,j=!0;h.start1=e-g.length;h.start2=f-g.length;""!==g&&(h.length1=h.length2=g.length,h.diffs.push([0,g]));for(;0!==d.diffs.length&&h.length1<b-this.Patch_Margin;){var g=d.diffs[0][0],i=d.diffs[0][1];1===g?(h.length2+=i.length,f+=i.length,h.diffs.push(d.diffs.shift()),
+j=!1):-1===g&&1==h.diffs.length&&0==h.diffs[0][0]&&i.length>2*b?(h.length1+=i.length,e+=i.length,j=!1,h.diffs.push([g,i]),d.diffs.shift()):(i=i.substring(0,b-h.length1-this.Patch_Margin),h.length1+=i.length,e+=i.length,0===g?(h.length2+=i.length,f+=i.length):j=!1,h.diffs.push([g,i]),i==d.diffs[0][1]?d.diffs.shift():d.diffs[0][1]=d.diffs[0][1].substring(i.length))}g=this.diff_text2(h.diffs);g=g.substring(g.length-this.Patch_Margin);i=this.diff_text1(d.diffs).substring(0,this.Patch_Margin);""!==i&&
+(h.length1+=i.length,h.length2+=i.length,0!==h.diffs.length&&0===h.diffs[h.diffs.length-1][0]?h.diffs[h.diffs.length-1][1]+=i:h.diffs.push([0,i]));j||a.splice(++c,0,h)}}};diff_match_patch.prototype.patch_toText=function(a){for(var b=[],c=0;c<a.length;c++)b[c]=a[c];return b.join("")};
+diff_match_patch.prototype.patch_fromText=function(a){var b=[];if(!a)return b;a=a.split("\n");for(var c=0,d=/^@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@$/;c<a.length;){var e=a[c].match(d);if(!e)throw Error("Invalid patch string: "+a[c]);var f=new diff_match_patch.patch_obj;b.push(f);f.start1=parseInt(e[1],10);""===e[2]?(f.start1--,f.length1=1):"0"==e[2]?f.length1=0:(f.start1--,f.length1=parseInt(e[2],10));f.start2=parseInt(e[3],10);""===e[4]?(f.start2--,f.length2=1):"0"==e[4]?f.length2=0:(f.start2--,f.length2=
+parseInt(e[4],10));for(c++;c<a.length;){e=a[c].charAt(0);try{var g=decodeURI(a[c].substring(1))}catch(h){throw Error("Illegal escape in patch_fromText: "+g);}if("-"==e)f.diffs.push([-1,g]);else if("+"==e)f.diffs.push([1,g]);else if(" "==e)f.diffs.push([0,g]);else if("@"==e)break;else if(""!==e)throw Error('Invalid patch mode "'+e+'" in: '+g);c++}}return b};diff_match_patch.patch_obj=function(){this.diffs=[];this.start2=this.start1=null;this.length2=this.length1=0};
+diff_match_patch.patch_obj.prototype.toString=function(){var a,b;a=0===this.length1?this.start1+",0":1==this.length1?this.start1+1:this.start1+1+","+this.length1;b=0===this.length2?this.start2+",0":1==this.length2?this.start2+1:this.start2+1+","+this.length2;a=["@@ -"+a+" +"+b+" @@\n"];var c;for(b=0;b<this.diffs.length;b++){switch(this.diffs[b][0]){case 1:c="+";break;case -1:c="-";break;case 0:c=" "}a[b+1]=c+encodeURI(this.diffs[b][1])+"\n"}return a.join("").replace(/%20/g," ")};
+this.diff_match_patch=diff_match_patch;this.DIFF_DELETE=-1;this.DIFF_INSERT=1;this.DIFF_EQUAL=0;})()
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/javascript.js b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/javascript.js
new file mode 100644
index 0000000..b6b4510
--- /dev/null
+++ b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/javascript.js
@@ -0,0 +1,831 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+(function(mod) {
+  if (typeof exports == "object" && typeof module == "object") // CommonJS
+    mod(require("../../lib/codemirror"));
+  else if (typeof define == "function" && define.amd) // AMD
+    define(["../../lib/codemirror"], mod);
+  else // Plain browser env
+    mod(CodeMirror);
+})(function(CodeMirror) {
+"use strict";
+
+function expressionAllowed(stream, state, backUp) {
+  return /^(?:operator|sof|keyword c|case|new|export|default|[\[{}\(,;:]|=>)$/.test(state.lastType) ||
+    (state.lastType == "quasi" && /\{\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0))))
+}
+
+CodeMirror.defineMode("javascript", function(config, parserConfig) {
+  var indentUnit = config.indentUnit;
+  var statementIndent = parserConfig.statementIndent;
+  var jsonldMode = parserConfig.jsonld;
+  var jsonMode = parserConfig.json || jsonldMode;
+  var isTS = parserConfig.typescript;
+  var wordRE = parserConfig.wordCharacters || /[\w$\xa1-\uffff]/;
+
+  // Tokenizer
+
+  var keywords = function(){
+    function kw(type) {return {type: type, style: "keyword"};}
+    var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c");
+    var operator = kw("operator"), atom = {type: "atom", style: "atom"};
+
+    var jsKeywords = {
+      "if": kw("if"), "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B,
+      "return": C, "break": C, "continue": C, "new": kw("new"), "delete": C, "throw": C, "debugger": C,
+      "var": kw("var"), "const": kw("var"), "let": kw("var"),
+      "function": kw("function"), "catch": kw("catch"),
+      "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"),
+      "in": operator, "typeof": operator, "instanceof": operator,
+      "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom,
+      "this": kw("this"), "class": kw("class"), "super": kw("atom"),
+      "yield": C, "export": kw("export"), "import": kw("import"), "extends": C,
+      "await": C
+    };
+
+    // Extend the 'normal' keywords with the TypeScript language extensions
+    if (isTS) {
+      var type = {type: "variable", style: "type"};
+      var tsKeywords = {
+        // object-like things
+        "interface": kw("class"),
+        "implements": C,
+        "namespace": C,
+        "module": kw("module"),
+        "enum": kw("module"),
+
+        // scope modifiers
+        "public": kw("modifier"),
+        "private": kw("modifier"),
+        "protected": kw("modifier"),
+        "abstract": kw("modifier"),
+
+        // types
+        "string": type, "number": type, "boolean": type, "any": type
+      };
+
+      for (var attr in tsKeywords) {
+        jsKeywords[attr] = tsKeywords[attr];
+      }
+    }
+
+    return jsKeywords;
+  }();
+
+  var isOperatorChar = /[+\-*&%=<>!?|~^@]/;
+  var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/;
+
+  function readRegexp(stream) {
+    var escaped = false, next, inSet = false;
+    while ((next = stream.next()) != null) {
+      if (!escaped) {
+        if (next == "/" && !inSet) return;
+        if (next == "[") inSet = true;
+        else if (inSet && next == "]") inSet = false;
+      }
+      escaped = !escaped && next == "\\";
+    }
+  }
+
+  // Used as scratch variables to communicate multiple values without
+  // consing up tons of objects.
+  var type, content;
+  function ret(tp, style, cont) {
+    type = tp; content = cont;
+    return style;
+  }
+  function tokenBase(stream, state) {
+    var ch = stream.next();
+    if (ch == '"' || ch == "'") {
+      state.tokenize = tokenString(ch);
+      return state.tokenize(stream, state);
+    } else if (ch == "." && stream.match(/^\d+(?:[eE][+\-]?\d+)?/)) {
+      return ret("number", "number");
+    } else if (ch == "." && stream.match("..")) {
+      return ret("spread", "meta");
+    } else if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
+      return ret(ch);
+    } else if (ch == "=" && stream.eat(">")) {
+      return ret("=>", "operator");
+    } else if (ch == "0" && stream.eat(/x/i)) {
+      stream.eatWhile(/[\da-f]/i);
+      return ret("number", "number");
+    } else if (ch == "0" && stream.eat(/o/i)) {
+      stream.eatWhile(/[0-7]/i);
+      return ret("number", "number");
+    } else if (ch == "0" && stream.eat(/b/i)) {
+      stream.eatWhile(/[01]/i);
+      return ret("number", "number");
+    } else if (/\d/.test(ch)) {
+      stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/);
+      return ret("number", "number");
+    } else if (ch == "/") {
+      if (stream.eat("*")) {
+        state.tokenize = tokenComment;
+        return tokenComment(stream, state);
+      } else if (stream.eat("/")) {
+        stream.skipToEnd();
+        return ret("comment", "comment");
+      } else if (expressionAllowed(stream, state, 1)) {
+        readRegexp(stream);
+        stream.match(/^\b(([gimyu])(?![gimyu]*\2))+\b/);
+        return ret("regexp", "string-2");
+      } else {
+        stream.eatWhile(isOperatorChar);
+        return ret("operator", "operator", stream.current());
+      }
+    } else if (ch == "`") {
+      state.tokenize = tokenQuasi;
+      return tokenQuasi(stream, state);
+    } else if (ch == "#") {
+      stream.skipToEnd();
+      return ret("error", "error");
+    } else if (isOperatorChar.test(ch)) {
+      if (ch != ">" || !state.lexical || state.lexical.type != ">")
+        stream.eatWhile(isOperatorChar);
+      return ret("operator", "operator", stream.current());
+    } else if (wordRE.test(ch)) {
+      stream.eatWhile(wordRE);
+      var word = stream.current()
+      if (state.lastType != ".") {
+        if (keywords.propertyIsEnumerable(word)) {
+          var kw = keywords[word]
+          return ret(kw.type, kw.style, word)
+        }
+        if (word == "async" && stream.match(/^\s*[\(\w]/, false))
+          return ret("async", "keyword", word)
+      }
+      return ret("variable", "variable", word)
+    }
+  }
+
+  function tokenString(quote) {
+    return function(stream, state) {
+      var escaped = false, next;
+      if (jsonldMode && stream.peek() == "@" && stream.match(isJsonldKeyword)){
+        state.tokenize = tokenBase;
+        return ret("jsonld-keyword", "meta");
+      }
+      while ((next = stream.next()) != null) {
+        if (next == quote && !escaped) break;
+        escaped = !escaped && next == "\\";
+      }
+      if (!escaped) state.tokenize = tokenBase;
+      return ret("string", "string");
+    };
+  }
+
+  function tokenComment(stream, state) {
+    var maybeEnd = false, ch;
+    while (ch = stream.next()) {
+      if (ch == "/" && maybeEnd) {
+        state.tokenize = tokenBase;
+        break;
+      }
+      maybeEnd = (ch == "*");
+    }
+    return ret("comment", "comment");
+  }
+
+  function tokenQuasi(stream, state) {
+    var escaped = false, next;
+    while ((next = stream.next()) != null) {
+      if (!escaped && (next == "`" || next == "$" && stream.eat("{"))) {
+        state.tokenize = tokenBase;
+        break;
+      }
+      escaped = !escaped && next == "\\";
+    }
+    return ret("quasi", "string-2", stream.current());
+  }
+
+  var brackets = "([{}])";
+  // This is a crude lookahead trick to try and notice that we're
+  // parsing the argument patterns for a fat-arrow function before we
+  // actually hit the arrow token. It only works if the arrow is on
+  // the same line as the arguments and there's no strange noise
+  // (comments) in between. Fallback is to only notice when we hit the
+  // arrow, and not declare the arguments as locals for the arrow
+  // body.
+  function findFatArrow(stream, state) {
+    if (state.fatArrowAt) state.fatArrowAt = null;
+    var arrow = stream.string.indexOf("=>", stream.start);
+    if (arrow < 0) return;
+
+    if (isTS) { // Try to skip TypeScript return type declarations after the arguments
+      var m = /:\s*(?:\w+(?:<[^>]*>|\[\])?|\{[^}]*\})\s*$/.exec(stream.string.slice(stream.start, arrow))
+      if (m) arrow = m.index
+    }
+
+    var depth = 0, sawSomething = false;
+    for (var pos = arrow - 1; pos >= 0; --pos) {
+      var ch = stream.string.charAt(pos);
+      var bracket = brackets.indexOf(ch);
+      if (bracket >= 0 && bracket < 3) {
+        if (!depth) { ++pos; break; }
+        if (--depth == 0) { if (ch == "(") sawSomething = true; break; }
+      } else if (bracket >= 3 && bracket < 6) {
+        ++depth;
+      } else if (wordRE.test(ch)) {
+        sawSomething = true;
+      } else if (/["'\/]/.test(ch)) {
+        return;
+      } else if (sawSomething && !depth) {
+        ++pos;
+        break;
+      }
+    }
+    if (sawSomething && !depth) state.fatArrowAt = pos;
+  }
+
+  // Parser
+
+  var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true, "this": true, "jsonld-keyword": true};
+
+  function JSLexical(indented, column, type, align, prev, info) {
+    this.indented = indented;
+    this.column = column;
+    this.type = type;
+    this.prev = prev;
+    this.info = info;
+    if (align != null) this.align = align;
+  }
+
+  function inScope(state, varname) {
+    for (var v = state.localVars; v; v = v.next)
+      if (v.name == varname) return true;
+    for (var cx = state.context; cx; cx = cx.prev) {
+      for (var v = cx.vars; v; v = v.next)
+        if (v.name == varname) return true;
+    }
+  }
+
+  function parseJS(state, style, type, content, stream) {
+    var cc = state.cc;
+    // Communicate our context to the combinators.
+    // (Less wasteful than consing up a hundred closures on every call.)
+    cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; cx.style = style;
+
+    if (!state.lexical.hasOwnProperty("align"))
+      state.lexical.align = true;
+
+    while(true) {
+      var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement;
+      if (combinator(type, content)) {
+        while(cc.length && cc[cc.length - 1].lex)
+          cc.pop()();
+        if (cx.marked) return cx.marked;
+        if (type == "variable" && inScope(state, content)) return "variable-2";
+        return style;
+      }
+    }
+  }
+
+  // Combinator utils
+
+  var cx = {state: null, column: null, marked: null, cc: null};
+  function pass() {
+    for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);
+  }
+  function cont() {
+    pass.apply(null, arguments);
+    return true;
+  }
+  function register(varname) {
+    function inList(list) {
+      for (var v = list; v; v = v.next)
+        if (v.name == varname) return true;
+      return false;
+    }
+    var state = cx.state;
+    cx.marked = "def";
+    if (state.context) {
+      if (inList(state.localVars)) return;
+      state.localVars = {name: varname, next: state.localVars};
+    } else {
+      if (inList(state.globalVars)) return;
+      if (parserConfig.globalVars)
+        state.globalVars = {name: varname, next: state.globalVars};
+    }
+  }
+
+  // Combinators
+
+  var defaultVars = {name: "this", next: {name: "arguments"}};
+  function pushcontext() {
+    cx.state.context = {prev: cx.state.context, vars: cx.state.localVars};
+    cx.state.localVars = defaultVars;
+  }
+  function popcontext() {
+    cx.state.localVars = cx.state.context.vars;
+    cx.state.context = cx.state.context.prev;
+  }
+  function pushlex(type, info) {
+    var result = function() {
+      var state = cx.state, indent = state.indented;
+      if (state.lexical.type == "stat") indent = state.lexical.indented;
+      else for (var outer = state.lexical; outer && outer.type == ")" && outer.align; outer = outer.prev)
+        indent = outer.indented;
+      state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info);
+    };
+    result.lex = true;
+    return result;
+  }
+  function poplex() {
+    var state = cx.state;
+    if (state.lexical.prev) {
+      if (state.lexical.type == ")")
+        state.indented = state.lexical.indented;
+      state.lexical = state.lexical.prev;
+    }
+  }
+  poplex.lex = true;
+
+  function expect(wanted) {
+    function exp(type) {
+      if (type == wanted) return cont();
+      else if (wanted == ";") return pass();
+      else return cont(exp);
+    };
+    return exp;
+  }
+
+  function statement(type, value) {
+    if (type == "var") return cont(pushlex("vardef", value.length), vardef, expect(";"), poplex);
+    if (type == "keyword a") return cont(pushlex("form"), parenExpr, statement, poplex);
+    if (type == "keyword b") return cont(pushlex("form"), statement, poplex);
+    if (type == "{") return cont(pushlex("}"), block, poplex);
+    if (type == ";") return cont();
+    if (type == "if") {
+      if (cx.state.lexical.info == "else" && cx.state.cc[cx.state.cc.length - 1] == poplex)
+        cx.state.cc.pop()();
+      return cont(pushlex("form"), parenExpr, statement, poplex, maybeelse);
+    }
+    if (type == "function") return cont(functiondef);
+    if (type == "for") return cont(pushlex("form"), forspec, statement, poplex);
+    if (type == "variable") {
+      if (isTS && value == "type") {
+        cx.marked = "keyword"
+        return cont(typeexpr, expect("operator"), typeexpr, expect(";"));
+      } else {
+        return cont(pushlex("stat"), maybelabel);
+      }
+    }
+    if (type == "switch") return cont(pushlex("form"), parenExpr, expect("{"), pushlex("}", "switch"),
+                                      block, poplex, poplex);
+    if (type == "case") return cont(expression, expect(":"));
+    if (type == "default") return cont(expect(":"));
+    if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"),
+                                     statement, poplex, popcontext);
+    if (type == "class") return cont(pushlex("form"), className, poplex);
+    if (type == "export") return cont(pushlex("stat"), afterExport, poplex);
+    if (type == "import") return cont(pushlex("stat"), afterImport, poplex);
+    if (type == "module") return cont(pushlex("form"), pattern, expect("{"), pushlex("}"), block, poplex, poplex)
+    if (type == "async") return cont(statement)
+    if (value == "@") return cont(expression, statement)
+    return pass(pushlex("stat"), expression, expect(";"), poplex);
+  }
+  function expression(type) {
+    return expressionInner(type, false);
+  }
+  function expressionNoComma(type) {
+    return expressionInner(type, true);
+  }
+  function parenExpr(type) {
+    if (type != "(") return pass()
+    return cont(pushlex(")"), expression, expect(")"), poplex)
+  }
+  function expressionInner(type, noComma) {
+    if (cx.state.fatArrowAt == cx.stream.start) {
+      var body = noComma ? arrowBodyNoComma : arrowBody;
+      if (type == "(") return cont(pushcontext, pushlex(")"), commasep(pattern, ")"), poplex, expect("=>"), body, popcontext);
+      else if (type == "variable") return pass(pushcontext, pattern, expect("=>"), body, popcontext);
+    }
+
+    var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma;
+    if (atomicTypes.hasOwnProperty(type)) return cont(maybeop);
+    if (type == "function") return cont(functiondef, maybeop);
+    if (type == "class") return cont(pushlex("form"), classExpression, poplex);
+    if (type == "keyword c" || type == "async") return cont(noComma ? maybeexpressionNoComma : maybeexpression);
+    if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeop);
+    if (type == "operator" || type == "spread") return cont(noComma ? expressionNoComma : expression);
+    if (type == "[") return cont(pushlex("]"), arrayLiteral, poplex, maybeop);
+    if (type == "{") return contCommasep(objprop, "}", null, maybeop);
+    if (type == "quasi") return pass(quasi, maybeop);
+    if (type == "new") return cont(maybeTarget(noComma));
+    return cont();
+  }
+  function maybeexpression(type) {
+    if (type.match(/[;\}\)\],]/)) return pass();
+    return pass(expression);
+  }
+  function maybeexpressionNoComma(type) {
+    if (type.match(/[;\}\)\],]/)) return pass();
+    return pass(expressionNoComma);
+  }
+
+  function maybeoperatorComma(type, value) {
+    if (type == ",") return cont(expression);
+    return maybeoperatorNoComma(type, value, false);
+  }
+  function maybeoperatorNoComma(type, value, noComma) {
+    var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma;
+    var expr = noComma == false ? expression : expressionNoComma;
+    if (type == "=>") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext);
+    if (type == "operator") {
+      if (/\+\+|--/.test(value)) return cont(me);
+      if (value == "?") return cont(expression, expect(":"), expr);
+      return cont(expr);
+    }
+    if (type == "quasi") { return pass(quasi, me); }
+    if (type == ";") return;
+    if (type == "(") return contCommasep(expressionNoComma, ")", "call", me);
+    if (type == ".") return cont(property, me);
+    if (type == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me);
+    if (isTS && value == "as") { cx.marked = "keyword"; return cont(typeexpr, me) }
+  }
+  function quasi(type, value) {
+    if (type != "quasi") return pass();
+    if (value.slice(value.length - 2) != "${") return cont(quasi);
+    return cont(expression, continueQuasi);
+  }
+  function continueQuasi(type) {
+    if (type == "}") {
+      cx.marked = "string-2";
+      cx.state.tokenize = tokenQuasi;
+      return cont(quasi);
+    }
+  }
+  function arrowBody(type) {
+    findFatArrow(cx.stream, cx.state);
+    return pass(type == "{" ? statement : expression);
+  }
+  function arrowBodyNoComma(type) {
+    findFatArrow(cx.stream, cx.state);
+    return pass(type == "{" ? statement : expressionNoComma);
+  }
+  function maybeTarget(noComma) {
+    return function(type) {
+      if (type == ".") return cont(noComma ? targetNoComma : target);
+      else return pass(noComma ? expressionNoComma : expression);
+    };
+  }
+  function target(_, value) {
+    if (value == "target") { cx.marked = "keyword"; return cont(maybeoperatorComma); }
+  }
+  function targetNoComma(_, value) {
+    if (value == "target") { cx.marked = "keyword"; return cont(maybeoperatorNoComma); }
+  }
+  function maybelabel(type) {
+    if (type == ":") return cont(poplex, statement);
+    return pass(maybeoperatorComma, expect(";"), poplex);
+  }
+  function property(type) {
+    if (type == "variable") {cx.marked = "property"; return cont();}
+  }
+  function objprop(type, value) {
+    if (type == "async") {
+      cx.marked = "property";
+      return cont(objprop);
+    } else if (type == "variable" || cx.style == "keyword") {
+      cx.marked = "property";
+      if (value == "get" || value == "set") return cont(getterSetter);
+      return cont(afterprop);
+    } else if (type == "number" || type == "string") {
+      cx.marked = jsonldMode ? "property" : (cx.style + " property");
+      return cont(afterprop);
+    } else if (type == "jsonld-keyword") {
+      return cont(afterprop);
+    } else if (type == "modifier") {
+      return cont(objprop)
+    } else if (type == "[") {
+      return cont(expression, expect("]"), afterprop);
+    } else if (type == "spread") {
+      return cont(expression, afterprop);
+    } else if (type == ":") {
+      return pass(afterprop)
+    }
+  }
+  function getterSetter(type) {
+    if (type != "variable") return pass(afterprop);
+    cx.marked = "property";
+    return cont(functiondef);
+  }
+  function afterprop(type) {
+    if (type == ":") return cont(expressionNoComma);
+    if (type == "(") return pass(functiondef);
+  }
+  function commasep(what, end, sep) {
+    function proceed(type, value) {
+      if (sep ? sep.indexOf(type) > -1 : type == ",") {
+        var lex = cx.state.lexical;
+        if (lex.info == "call") lex.pos = (lex.pos || 0) + 1;
+        return cont(function(type, value) {
+          if (type == end || value == end) return pass()
+          return pass(what)
+        }, proceed);
+      }
+      if (type == end || value == end) return cont();
+      return cont(expect(end));
+    }
+    return function(type, value) {
+      if (type == end || value == end) return cont();
+      return pass(what, proceed);
+    };
+  }
+  function contCommasep(what, end, info) {
+    for (var i = 3; i < arguments.length; i++)
+      cx.cc.push(arguments[i]);
+    return cont(pushlex(end, info), commasep(what, end), poplex);
+  }
+  function block(type) {
+    if (type == "}") return cont();
+    return pass(statement, block);
+  }
+  function maybetype(type, value) {
+    if (isTS) {
+      if (type == ":") return cont(typeexpr);
+      if (value == "?") return cont(maybetype);
+    }
+  }
+  function typeexpr(type) {
+    if (type == "variable") {cx.marked = "type"; return cont(afterType);}
+    if (type == "string" || type == "number" || type == "atom") return cont(afterType);
+    if (type == "{") return cont(pushlex("}"), commasep(typeprop, "}", ",;"), poplex, afterType)
+    if (type == "(") return cont(commasep(typearg, ")"), maybeReturnType)
+  }
+  function maybeReturnType(type) {
+    if (type == "=>") return cont(typeexpr)
+  }
+  function typeprop(type, value) {
+    if (type == "variable" || cx.style == "keyword") {
+      cx.marked = "property"
+      return cont(typeprop)
+    } else if (value == "?") {
+      return cont(typeprop)
+    } else if (type == ":") {
+      return cont(typeexpr)
+    } else if (type == "[") {
+      return cont(expression, maybetype, expect("]"), typeprop)
+    }
+  }
+  function typearg(type) {
+    if (type == "variable") return cont(typearg)
+    else if (type == ":") return cont(typeexpr)
+  }
+  function afterType(type, value) {
+    if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, afterType)
+    if (value == "|" || type == ".") return cont(typeexpr)
+    if (type == "[") return cont(expect("]"), afterType)
+    if (value == "extends") return cont(typeexpr)
+  }
+  function vardef() {
+    return pass(pattern, maybetype, maybeAssign, vardefCont);
+  }
+  function pattern(type, value) {
+    if (type == "modifier") return cont(pattern)
+    if (type == "variable") { register(value); return cont(); }
+    if (type == "spread") return cont(pattern);
+    if (type == "[") return contCommasep(pattern, "]");
+    if (type == "{") return contCommasep(proppattern, "}");
+  }
+  function proppattern(type, value) {
+    if (type == "variable" && !cx.stream.match(/^\s*:/, false)) {
+      register(value);
+      return cont(maybeAssign);
+    }
+    if (type == "variable") cx.marked = "property";
+    if (type == "spread") return cont(pattern);
+    if (type == "}") return pass();
+    return cont(expect(":"), pattern, maybeAssign);
+  }
+  function maybeAssign(_type, value) {
+    if (value == "=") return cont(expressionNoComma);
+  }
+  function vardefCont(type) {
+    if (type == ",") return cont(vardef);
+  }
+  function maybeelse(type, value) {
+    if (type == "keyword b" && value == "else") return cont(pushlex("form", "else"), statement, poplex);
+  }
+  function forspec(type) {
+    if (type == "(") return cont(pushlex(")"), forspec1, expect(")"), poplex);
+  }
+  function forspec1(type) {
+    if (type == "var") return cont(vardef, expect(";"), forspec2);
+    if (type == ";") return cont(forspec2);
+    if (type == "variable") return cont(formaybeinof);
+    return pass(expression, expect(";"), forspec2);
+  }
+  function formaybeinof(_type, value) {
+    if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression); }
+    return cont(maybeoperatorComma, forspec2);
+  }
+  function forspec2(type, value) {
+    if (type == ";") return cont(forspec3);
+    if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression); }
+    return pass(expression, expect(";"), forspec3);
+  }
+  function forspec3(type) {
+    if (type != ")") cont(expression);
+  }
+  function functiondef(type, value) {
+    if (value == "*") {cx.marked = "keyword"; return cont(functiondef);}
+    if (type == "variable") {register(value); return cont(functiondef);}
+    if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, maybetype, statement, popcontext);
+    if (isTS && value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, functiondef)
+  }
+  function funarg(type) {
+    if (type == "spread") return cont(funarg);
+    return pass(pattern, maybetype, maybeAssign);
+  }
+  function classExpression(type, value) {
+    // Class expressions may have an optional name.
+    if (type == "variable") return className(type, value);
+    return classNameAfter(type, value);
+  }
+  function className(type, value) {
+    if (type == "variable") {register(value); return cont(classNameAfter);}
+  }
+  function classNameAfter(type, value) {
+    if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, classNameAfter)
+    if (value == "extends" || value == "implements" || (isTS && type == ","))
+      return cont(isTS ? typeexpr : expression, classNameAfter);
+    if (type == "{") return cont(pushlex("}"), classBody, poplex);
+  }
+  function classBody(type, value) {
+    if (type == "variable" || cx.style == "keyword") {
+      if ((value == "async" || value == "static" || value == "get" || value == "set" ||
+           (isTS && (value == "public" || value == "private" || value == "protected" || value == "readonly" || value == "abstract"))) &&
+          cx.stream.match(/^\s+[\w$\xa1-\uffff]/, false)) {
+        cx.marked = "keyword";
+        return cont(classBody);
+      }
+      cx.marked = "property";
+      return cont(isTS ? classfield : functiondef, classBody);
+    }
+    if (type == "[")
+      return cont(expression, expect("]"), isTS ? classfield : functiondef, classBody)
+    if (value == "*") {
+      cx.marked = "keyword";
+      return cont(classBody);
+    }
+    if (type == ";") return cont(classBody);
+    if (type == "}") return cont();
+    if (value == "@") return cont(expression, classBody)
+  }
+  function classfield(type, value) {
+    if (value == "?") return cont(classfield)
+    if (type == ":") return cont(typeexpr, maybeAssign)
+    if (value == "=") return cont(expressionNoComma)
+    return pass(functiondef)
+  }
+  function afterExport(type, value) {
+    if (value == "*") { cx.marked = "keyword"; return cont(maybeFrom, expect(";")); }
+    if (value == "default") { cx.marked = "keyword"; return cont(expression, expect(";")); }
+    if (type == "{") return cont(commasep(exportField, "}"), maybeFrom, expect(";"));
+    return pass(statement);
+  }
+  function exportField(type, value) {
+    if (value == "as") { cx.marked = "keyword"; return cont(expect("variable")); }
+    if (type == "variable") return pass(expressionNoComma, exportField);
+  }
+  function afterImport(type) {
+    if (type == "string") return cont();
+    return pass(importSpec, maybeMoreImports, maybeFrom);
+  }
+  function importSpec(type, value) {
+    if (type == "{") return contCommasep(importSpec, "}");
+    if (type == "variable") register(value);
+    if (value == "*") cx.marked = "keyword";
+    return cont(maybeAs);
+  }
+  function maybeMoreImports(type) {
+    if (type == ",") return cont(importSpec, maybeMoreImports)
+  }
+  function maybeAs(_type, value) {
+    if (value == "as") { cx.marked = "keyword"; return cont(importSpec); }
+  }
+  function maybeFrom(_type, value) {
+    if (value == "from") { cx.marked = "keyword"; return cont(expression); }
+  }
+  function arrayLiteral(type) {
+    if (type == "]") return cont();
+    return pass(commasep(expressionNoComma, "]"));
+  }
+
+  function isContinuedStatement(state, textAfter) {
+    return state.lastType == "operator" || state.lastType == "," ||
+      isOperatorChar.test(textAfter.charAt(0)) ||
+      /[,.]/.test(textAfter.charAt(0));
+  }
+
+  // Interface
+
+  return {
+    startState: function(basecolumn) {
+      var state = {
+        tokenize: tokenBase,
+        lastType: "sof",
+        cc: [],
+        lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false),
+        localVars: parserConfig.localVars,
+        context: parserConfig.localVars && {vars: parserConfig.localVars},
+        indented: basecolumn || 0
+      };
+      if (parserConfig.globalVars && typeof parserConfig.globalVars == "object")
+        state.globalVars = parserConfig.globalVars;
+      return state;
+    },
+
+    token: function(stream, state) {
+      if (stream.sol()) {
+        if (!state.lexical.hasOwnProperty("align"))
+          state.lexical.align = false;
+        state.indented = stream.indentation();
+        findFatArrow(stream, state);
+      }
+      if (state.tokenize != tokenComment && stream.eatSpace()) return null;
+      var style = state.tokenize(stream, state);
+      if (type == "comment") return style;
+      state.lastType = type == "operator" && (content == "++" || content == "--") ? "incdec" : type;
+      return parseJS(state, style, type, content, stream);
+    },
+
+    indent: function(state, textAfter) {
+      if (state.tokenize == tokenComment) return CodeMirror.Pass;
+      if (state.tokenize != tokenBase) return 0;
+      var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical, top
+      // Kludge to prevent 'maybelse' from blocking lexical scope pops
+      if (!/^\s*else\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) {
+        var c = state.cc[i];
+        if (c == poplex) lexical = lexical.prev;
+        else if (c != maybeelse) break;
+      }
+      while ((lexical.type == "stat" || lexical.type == "form") &&
+             (firstChar == "}" || ((top = state.cc[state.cc.length - 1]) &&
+                                   (top == maybeoperatorComma || top == maybeoperatorNoComma) &&
+                                   !/^[,\.=+\-*:?[\(]/.test(textAfter))))
+        lexical = lexical.prev;
+      if (statementIndent && lexical.type == ")" && lexical.prev.type == "stat")
+        lexical = lexical.prev;
+      var type = lexical.type, closing = firstChar == type;
+
+      if (type == "vardef") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? lexical.info + 1 : 0);
+      else if (type == "form" && firstChar == "{") return lexical.indented;
+      else if (type == "form") return lexical.indented + indentUnit;
+      else if (type == "stat")
+        return lexical.indented + (isContinuedStatement(state, textAfter) ? statementIndent || indentUnit : 0);
+      else if (lexical.info == "switch" && !closing && parserConfig.doubleIndentSwitch != false)
+        return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit);
+      else if (lexical.align) return lexical.column + (closing ? 0 : 1);
+      else return lexical.indented + (closing ? 0 : indentUnit);
+    },
+
+    electricInput: /^\s*(?:case .*?:|default:|\{|\})$/,
+    blockCommentStart: jsonMode ? null : "/*",
+    blockCommentEnd: jsonMode ? null : "*/",
+    lineComment: jsonMode ? null : "//",
+    fold: "brace",
+    closeBrackets: "()[]{}''\"\"``",
+
+    helperType: jsonMode ? "json" : "javascript",
+    jsonldMode: jsonldMode,
+    jsonMode: jsonMode,
+
+    expressionAllowed: expressionAllowed,
+    skipExpression: function(state) {
+      var top = state.cc[state.cc.length - 1]
+      if (top == expression || top == expressionNoComma) state.cc.pop()
+    }
+  };
+});
+
+CodeMirror.registerHelper("wordChars", "javascript", /[\w$]/);
+
+CodeMirror.defineMIME("text/javascript", "javascript");
+CodeMirror.defineMIME("text/ecmascript", "javascript");
+CodeMirror.defineMIME("application/javascript", "javascript");
+CodeMirror.defineMIME("application/x-javascript", "javascript");
+CodeMirror.defineMIME("application/ecmascript", "javascript");
+CodeMirror.defineMIME("application/json", {name: "javascript", json: true});
+CodeMirror.defineMIME("application/x-json", {name: "javascript", json: true});
+CodeMirror.defineMIME("application/ld+json", {name: "javascript", jsonld: true});
+CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true });
+CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true });
+
+});
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/jquery.js b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/jquery.js
new file mode 100644
index 0000000..b061403
--- /dev/null
+++ b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/jquery.js
@@ -0,0 +1,2 @@
+/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(D).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(D(this,e||[],!1))},not:function(e){return this.pushStack(D(this,e||[],!0))},is:function(e){return!!D(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var j,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^key/,we=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Te=/^([^.]*)(?:\.(.+)|)/;function Ce(){return!0}function Ee(){return!1}function Se(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function ke(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)ke(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ee;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Ae(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,Ce)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=Te.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=Te.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click",Ce),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ce:Ee,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Ee,isPropagationStopped:Ee,isImmediatePropagationStopped:Ee,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ce,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ce,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ce,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&be.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&we.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Ae(this,e,Se),!1},trigger:function(){return Ae(this,e),!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return ke(this,e,t,n,r)},one:function(e,t,n,r){return ke(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Ee),this.each(function(){S.event.remove(this,e,n,t)})}});var Ne=/<script|<style|<link/i,De=/checked\s*(?:[^=]|=\s*.checked.)/i,je=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function Pe(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&De.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Pe(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),Le)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,He),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(je,""),u,l))}return n}function Re(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Oe(o[r],a[r]);else Oe(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Re(this,e,!0)},remove:function(e){return Re(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Pe(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||qe(this,e).appendChild(e)})},prepend:function(){return Pe(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=qe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ne.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Pe(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Me=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Ie=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},We=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Fe=new RegExp(ne.join("|"),"i");function Be(e,t,n){var r,i,o,a,s=e.style;return(n=n||Ie(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Me.test(a)&&Fe.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function $e(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px",t.style.height="1px",n.style.height="9px",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=3<parseInt(r.height),re.removeChild(e)),a}}))}();var _e=["Webkit","Moz","ms"],ze=E.createElement("div").style,Ue={};function Xe(e){var t=S.cssProps[e]||Ue[e];return t||(e in ze?e:Ue[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=_e.length;while(n--)if((e=_e[n]+t)in ze)return e}(e)||e)}var Ve=/^(none|table(?!-c[ea]).+)/,Ge=/^--/,Ye={position:"absolute",visibility:"hidden",display:"block"},Qe={letterSpacing:"0",fontWeight:"400"};function Je(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Ke(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Ze(e,t,n){var r=Ie(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=Be(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Me.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Ke(e,t,n||(i?"border":"content"),o,r,a)+"px"}function et(e,t,n,r,i){return new et.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Be(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Ge.test(t),l=e.style;if(u||(t=Xe(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Ge.test(t)||(t=Xe(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Be(e,t,r)),"normal"===i&&t in Qe&&(i=Qe[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ve.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Ze(e,u,n):We(e,Ye,function(){return Ze(e,u,n)})},set:function(e,t,n){var r,i=Ie(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Ke(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Ke(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Je(0,t,s)}}}),S.cssHooks.marginLeft=$e(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Be(e,"marginLeft"))||e.getBoundingClientRect().left-We(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Je)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Ie(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=et).prototype={constructor:et,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=et.propHooks[this.prop];return e&&e.get?e.get(this):et.propHooks._default.get(this)},run:function(e){var t,n=et.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):et.propHooks._default.set(this),this}}).init.prototype=et.prototype,(et.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[Xe(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=et.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=et.prototype.init,S.fx.step={};var tt,nt,rt,it,ot=/^(?:toggle|show|hide)$/,at=/queueHooks$/;function st(){nt&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(st):C.setTimeout(st,S.fx.interval),S.fx.tick())}function ut(){return C.setTimeout(function(){tt=void 0}),tt=Date.now()}function lt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ct(e,t,n){for(var r,i=(ft.tweeners[t]||[]).concat(ft.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ft(o,e,t){var n,a,r=0,i=ft.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=tt||ut(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:tt||ut(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=ft.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ct,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(ft,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],ft.tweeners[n]=ft.tweeners[n]||[],ft.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],ot.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ct(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?ft.prefilters.unshift(e):ft.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=ft(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&at.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(lt(r,!0),e,t,n)}}),S.each({slideDown:lt("show"),slideUp:lt("hide"),slideToggle:lt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(tt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),tt=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){nt||(nt=!0,st())},S.fx.stop=function(){nt=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},rt=E.createElement("input"),it=E.createElement("select").appendChild(E.createElement("option")),rt.type="checkbox",y.checkOn=""!==rt.value,y.optSelected=it.selected,(rt=E.createElement("input")).value="t",rt.type="radio",y.radioValue="t"===rt.value;var pt,dt=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?pt:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),pt={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=dt[t]||S.find.attr;dt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=dt[o],dt[o]=r,r=null!=a(e,t,n)?o:null,dt[o]=i),r}});var ht=/^(?:input|select|textarea|button)$/i,gt=/^(?:a|area)$/i;function vt(e){return(e.match(P)||[]).join(" ")}function yt(e){return e.getAttribute&&e.getAttribute("class")||""}function mt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):ht.test(e.nodeName)||gt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,yt(this)))});if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,yt(this)))});if(!arguments.length)return this.attr("class","");if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,yt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=mt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=yt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+vt(yt(n))+" ").indexOf(t))return!0;return!1}});var xt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(xt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:vt(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var bt=/^(?:focusinfocus|focusoutblur)$/,wt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!bt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,bt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,wt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,wt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var Tt=C.location,Ct={guid:Date.now()},Et=/\?/;S.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||S.error("Invalid XML: "+e),t};var St=/\[\]$/,kt=/\r?\n/g,At=/^(?:submit|button|image|reset|file)$/i,Nt=/^(?:input|select|textarea|keygen)/i;function Dt(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||St.test(n)?i(n,t):Dt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)Dt(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)Dt(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&Nt.test(this.nodeName)&&!At.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(kt,"\r\n")}}):{name:t.name,value:n.replace(kt,"\r\n")}}).get()}});var jt=/%20/g,qt=/#.*$/,Lt=/([?&])_=[^&]*/,Ht=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ot=/^(?:GET|HEAD)$/,Pt=/^\/\//,Rt={},Mt={},It="*/".concat("*"),Wt=E.createElement("a");function Ft(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Bt(t,i,o,a){var s={},u=t===Mt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function $t(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Wt.href=Tt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Tt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Tt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":It,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?$t($t(e,S.ajaxSettings),t):$t(S.ajaxSettings,e)},ajaxPrefilter:Ft(Rt),ajaxTransport:Ft(Mt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Ht.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Tt.href)+"").replace(Pt,Tt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Wt.protocol+"//"+Wt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Bt(Rt,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Ot.test(v.type),f=v.url.replace(qt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(jt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Et.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Lt,"$1"),o=(Et.test(f)?"&":"?")+"_="+Ct.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+It+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Bt(Mt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var _t={0:200,1223:204},zt=S.ajaxSettings.xhr();y.cors=!!zt&&"withCredentials"in zt,y.ajax=zt=!!zt,S.ajaxTransport(function(i){var o,a;if(y.cors||zt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(_t[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=vt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Gt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Gt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Yt=C.jQuery,Qt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Qt),e&&C.jQuery===S&&(C.jQuery=Yt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/loader.js b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/loader.js
new file mode 100644
index 0000000..3fb2043
--- /dev/null
+++ b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/loader.js
@@ -0,0 +1,8 @@
+/*!-----------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.10.1(ebbf400719be21761361804bf63fb3916e64a845)
+ * Released under the MIT license
+ * https://github.com/Microsoft/vscode/blob/master/LICENSE.txt
+ *-----------------------------------------------------------*/
+"use strict";var _amdLoaderGlobal=this,AMDLoader;!function(e){e.global=_amdLoaderGlobal;var t=function(){function t(e){this.isWindows=e.isWindows,this.isNode=e.isNode,this.isElectronRenderer=e.isElectronRenderer,this.isWebWorker=e.isWebWorker}return t.detect=function(){return new t({isWindows:this._isWindows(),isNode:"undefined"!=typeof module&&!!module.exports,isElectronRenderer:"undefined"!=typeof process&&void 0!==process.versions&&void 0!==process.versions.electron&&"renderer"===process.type,isWebWorker:"function"==typeof e.global.importScripts})},t._isWindows=function(){return!!("undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.indexOf("Windows")>=0)||"undefined"!=typeof process&&"win32"===process.platform},t}();e.Environment=t}(AMDLoader||(AMDLoader={}));var AMDLoader;!function(e){var t;!function(e){e[e.LoaderAvailable=1]="LoaderAvailable",e[e.BeginLoadingScript=10]="BeginLoadingScript",e[e.EndLoadingScriptOK=11]="EndLoadingScriptOK",e[e.EndLoadingScriptError=12]="EndLoadingScriptError",e[e.BeginInvokeFactory=21]="BeginInvokeFactory",e[e.EndInvokeFactory=22]="EndInvokeFactory",e[e.NodeBeginEvaluatingScript=31]="NodeBeginEvaluatingScript",e[e.NodeEndEvaluatingScript=32]="NodeEndEvaluatingScript",e[e.NodeBeginNativeRequire=33]="NodeBeginNativeRequire",e[e.NodeEndNativeRequire=34]="NodeEndNativeRequire"}(t=e.LoaderEventType||(e.LoaderEventType={}));var r=function(){return function(e,t,r){this.type=e,this.detail=t,this.timestamp=r}}();e.LoaderEvent=r;var n=function(){function n(e){this._events=[new r(t.LoaderAvailable,"",e)]}return n.prototype.record=function(t,n){this._events.push(new r(t,n,e.Utilities.getHighPerformanceTimestamp()))},n.prototype.getEvents=function(){return this._events},n}();e.LoaderEventRecorder=n;var o=function(){function e(){}return e.prototype.record=function(e,t){},e.prototype.getEvents=function(){return[]},e}();o.INSTANCE=new o,e.NullLoaderEventRecorder=o}(AMDLoader||(AMDLoader={}));var AMDLoader;!function(e){var t=function(){function t(){}return t.fileUriToFilePath=function(e,t){if(t=decodeURI(t),e){if(/^file:\/\/\//.test(t))return t.substr(8);if(/^file:\/\//.test(t))return t.substr(5)}else if(/^file:\/\//.test(t))return t.substr(7);return t},t.startsWith=function(e,t){return e.length>=t.length&&e.substr(0,t.length)===t},t.endsWith=function(e,t){return e.length>=t.length&&e.substr(e.length-t.length)===t},t.containsQueryString=function(e){return/^[^\#]*\?/gi.test(e)},t.isAbsolutePath=function(e){return/^((http:\/\/)|(https:\/\/)|(file:\/\/)|(\/))/.test(e)},t.forEachProperty=function(e,t){if(e){var r=void 0;for(r in e)e.hasOwnProperty(r)&&t(r,e[r])}},t.isEmpty=function(e){var r=!0;return t.forEachProperty(e,function(){r=!1}),r},t.recursiveClone=function(e){if(!e||"object"!=typeof e)return e;var r=Array.isArray(e)?[]:{};return t.forEachProperty(e,function(e,n){r[e]=n&&"object"==typeof n?t.recursiveClone(n):n}),r},t.generateAnonymousModule=function(){return"===anonymous"+t.NEXT_ANONYMOUS_ID+++"==="},t.isAnonymousModule=function(e){return/^===anonymous/.test(e)},t.getHighPerformanceTimestamp=function(){return this.PERFORMANCE_NOW_PROBED||(this.PERFORMANCE_NOW_PROBED=!0,this.HAS_PERFORMANCE_NOW=e.global.performance&&"function"==typeof e.global.performance.now),this.HAS_PERFORMANCE_NOW?e.global.performance.now():Date.now()},t}();t.NEXT_ANONYMOUS_ID=1,t.PERFORMANCE_NOW_PROBED=!1,t.HAS_PERFORMANCE_NOW=!1,e.Utilities=t}(AMDLoader||(AMDLoader={}));var AMDLoader;!function(e){var t=function(){function t(){}return t.validateConfigurationOptions=function(t,r){return"string"!=typeof(r=r||{}).baseUrl&&(r.baseUrl=""),"boolean"!=typeof r.isBuild&&(r.isBuild=!1),"object"!=typeof r.paths&&(r.paths={}),"object"!=typeof r.config&&(r.config={}),void 0===r.catchError&&(r.catchError=t),"string"!=typeof r.urlArgs&&(r.urlArgs=""),"function"!=typeof r.onError&&(r.onError=function(e){return"load"===e.errorCode?(console.error('Loading "'+e.moduleId+'" failed'),console.error("Detail: ",e.detail),e.detail&&e.detail.stack&&console.error(e.detail.stack),console.error("Here are the modules that depend on it:"),void console.error(e.neededBy)):"factory"===e.errorCode?(console.error('The factory method of "'+e.moduleId+'" has thrown an exception'),console.error(e.detail),void(e.detail&&e.detail.stack&&console.error(e.detail.stack))):void 0}),"object"==typeof r.ignoreDuplicateModules&&Array.isArray(r.ignoreDuplicateModules)||(r.ignoreDuplicateModules=[]),r.baseUrl.length>0&&(e.Utilities.endsWith(r.baseUrl,"/")||(r.baseUrl+="/")),Array.isArray(r.nodeModules)||(r.nodeModules=[]),("number"!=typeof r.nodeCachedDataWriteDelay||r.nodeCachedDataWriteDelay<0)&&(r.nodeCachedDataWriteDelay=7e3),"function"!=typeof r.onNodeCachedData&&(r.onNodeCachedData=function(e,t){e&&("cachedDataRejected"===e.errorCode?console.warn("Rejected cached data from file: "+e.path):"unlink"===e.errorCode||"writeFile"===e.errorCode?(console.error("Problems writing cached data file: "+e.path),console.error(e.detail)):console.error(e))}),r},t.mergeConfigurationOptions=function(r,n,o){void 0===n&&(n=null),void 0===o&&(o=null);var i=e.Utilities.recursiveClone(o||{});return e.Utilities.forEachProperty(n,function(t,r){"ignoreDuplicateModules"===t&&void 0!==i.ignoreDuplicateModules?i.ignoreDuplicateModules=i.ignoreDuplicateModules.concat(r):"paths"===t&&void 0!==i.paths?e.Utilities.forEachProperty(r,function(e,t){return i.paths[e]=t}):"config"===t&&void 0!==i.config?e.Utilities.forEachProperty(r,function(e,t){return i.config[e]=t}):i[t]=e.Utilities.recursiveClone(r)}),t.validateConfigurationOptions(r,i)},t}();e.ConfigurationOptionsUtil=t;var r=function(){function r(e,r){if(this._env=e,this.options=t.mergeConfigurationOptions(this._env.isWebWorker,r),this._createIgnoreDuplicateModulesMap(),this._createNodeModulesMap(),this._createSortedPathsRules(),""===this.options.baseUrl){if(this._env.isNode&&this.options.nodeRequire&&this.options.nodeRequire.main&&this.options.nodeRequire.main.filename){var n=this.options.nodeRequire.main.filename,o=Math.max(n.lastIndexOf("/"),n.lastIndexOf("\\"));this.options.baseUrl=n.substring(0,o+1)}if(this._env.isNode&&this.options.nodeMain){var n=this.options.nodeMain,o=Math.max(n.lastIndexOf("/"),n.lastIndexOf("\\"));this.options.baseUrl=n.substring(0,o+1)}}}return r.prototype._createIgnoreDuplicateModulesMap=function(){this.ignoreDuplicateModulesMap={};for(var e=0;e<this.options.ignoreDuplicateModules.length;e++)this.ignoreDuplicateModulesMap[this.options.ignoreDuplicateModules[e]]=!0},r.prototype._createNodeModulesMap=function(){this.nodeModulesMap=Object.create(null);for(var e=0,t=this.options.nodeModules;e<t.length;e++){var r=t[e];this.nodeModulesMap[r]=!0}},r.prototype._createSortedPathsRules=function(){var t=this;this.sortedPathsRules=[],e.Utilities.forEachProperty(this.options.paths,function(e,r){Array.isArray(r)?t.sortedPathsRules.push({from:e,to:r}):t.sortedPathsRules.push({from:e,to:[r]})}),this.sortedPathsRules.sort(function(e,t){return t.from.length-e.from.length})},r.prototype.cloneAndMerge=function(e){return new r(this._env,t.mergeConfigurationOptions(this._env.isWebWorker,e,this.options))},r.prototype.getOptionsLiteral=function(){return this.options},r.prototype._applyPaths=function(t){for(var r,n=0,o=this.sortedPathsRules.length;n<o;n++)if(r=this.sortedPathsRules[n],e.Utilities.startsWith(t,r.from)){for(var i=[],s=0,a=r.to.length;s<a;s++)i.push(r.to[s]+t.substr(r.from.length));return i}return[t]},r.prototype._addUrlArgsToUrl=function(t){return e.Utilities.containsQueryString(t)?t+"&"+this.options.urlArgs:t+"?"+this.options.urlArgs},r.prototype._addUrlArgsIfNecessaryToUrl=function(e){return this.options.urlArgs?this._addUrlArgsToUrl(e):e},r.prototype._addUrlArgsIfNecessaryToUrls=function(e){if(this.options.urlArgs)for(var t=0,r=e.length;t<r;t++)e[t]=this._addUrlArgsToUrl(e[t]);return e},r.prototype.moduleIdToPaths=function(t){if(!0===this.nodeModulesMap[t])return this.isBuild()?["empty:"]:["node|"+t];var r,n=t;if(e.Utilities.endsWith(n,".js")||e.Utilities.isAbsolutePath(n))e.Utilities.endsWith(n,".js")||e.Utilities.containsQueryString(n)||(n+=".js"),r=[n];else for(var o=0,i=(r=this._applyPaths(n)).length;o<i;o++)this.isBuild()&&"empty:"===r[o]||(e.Utilities.isAbsolutePath(r[o])||(r[o]=this.options.baseUrl+r[o]),e.Utilities.endsWith(r[o],".js")||e.Utilities.containsQueryString(r[o])||(r[o]=r[o]+".js"));return this._addUrlArgsIfNecessaryToUrls(r)},r.prototype.requireToUrl=function(t){var r=t;return e.Utilities.isAbsolutePath(r)||(r=this._applyPaths(r)[0],e.Utilities.isAbsolutePath(r)||(r=this.options.baseUrl+r)),this._addUrlArgsIfNecessaryToUrl(r)},r.prototype.isBuild=function(){return this.options.isBuild},r.prototype.isDuplicateMessageIgnoredFor=function(e){return this.ignoreDuplicateModulesMap.hasOwnProperty(e)},r.prototype.getConfigForModule=function(e){if(this.options.config)return this.options.config[e]},r.prototype.shouldCatchError=function(){return this.options.catchError},r.prototype.shouldRecordStats=function(){return this.options.recordStats},r.prototype.onError=function(e){this.options.onError(e)},r}();e.Configuration=r}(AMDLoader||(AMDLoader={}));var AMDLoader;!function(e){var t=function(){function e(e){this.actualScriptLoader=e,this.callbackMap={}}return e.prototype.load=function(e,t,r,n){var o=this,i={callback:r,errorback:n};this.callbackMap.hasOwnProperty(t)?this.callbackMap[t].push(i):(this.callbackMap[t]=[i],this.actualScriptLoader.load(e,t,function(){return o.triggerCallback(t)},function(e){return o.triggerErrorback(t,e)}))},e.prototype.triggerCallback=function(e){var t=this.callbackMap[e];delete this.callbackMap[e];for(var r=0;r<t.length;r++)t[r].callback()},e.prototype.triggerErrorback=function(e,t){var r=this.callbackMap[e];delete this.callbackMap[e];for(var n=0;n<r.length;n++)r[n].errorback(t)},e}(),r=function(){function e(){}return e.prototype.attachListeners=function(e,t,r){var n=function(){e.removeEventListener("load",o),e.removeEventListener("error",i)},o=function(e){n(),t()},i=function(e){n(),r(e)};e.addEventListener("load",o),e.addEventListener("error",i)},e.prototype.load=function(e,t,r,n){var o=document.createElement("script");o.setAttribute("async","async"),o.setAttribute("type","text/javascript"),this.attachListeners(o,r,n),o.setAttribute("src",t),document.getElementsByTagName("head")[0].appendChild(o)},e}(),n=function(){function e(){}return e.prototype.load=function(e,t,r,n){try{importScripts(t),r()}catch(e){n(e)}},e}(),o=function(){function t(e){this._env=e,this._didInitialize=!1,this._didPatchNodeRequire=!1}return t.prototype._init=function(e){if(!this._didInitialize){this._didInitialize=!0,this._fs=e("fs"),this._vm=e("vm"),this._path=e("path"),this._crypto=e("crypto"),this._jsflags="";for(var t=0,r=process.argv;t<r.length;t++){var n=r[t];if(0===n.indexOf("--js-flags=")){this._jsflags=n;break}}}},t.prototype._initNodeRequire=function(t,r){function n(e){var t=e.constructor,r=function(t){try{return e.require(t)}finally{}};return r.resolve=function(r){return t._resolveFilename(r,e)},r.main=process.mainModule,r.extensions=t._extensions,r.cache=t._cache,r}var o=r.getConfig().getOptionsLiteral().nodeCachedDataDir;if(o&&!this._didPatchNodeRequire){this._didPatchNodeRequire=!0;var i=this,s=t("module");s.prototype._compile=function(t,a){t=t.replace(/^#!.*/,"");var d=s.wrap(t),l=i._getCachedDataPath(o,a),u={filename:a};try{u.cachedData=i._fs.readFileSync(l)}catch(e){u.produceCachedData=!0}var c=new i._vm.Script(d,u),h=c.runInThisContext(u),f=i._path.dirname(a),p=n(this),g=[this.exports,p,this,a,f,process,e.global,Buffer],v=h.apply(this.exports,g);return i._processCachedData(r,c,l),v}}},t.prototype.load=function(r,n,o,i){var s=this,a=r.getConfig().getOptionsLiteral(),d=a.nodeRequire||e.global.nodeRequire,l=a.nodeInstrumenter||function(e){return e};this._init(d),this._initNodeRequire(d,r);var u=r.getRecorder();if(/^node\|/.test(n)){var c=n.split("|"),h=null;try{h=d(c[1])}catch(e){return void i(e)}r.enqueueDefineAnonymousModule([],function(){return h}),o()}else n=e.Utilities.fileUriToFilePath(this._env.isWindows,n),this._fs.readFile(n,{encoding:"utf8"},function(e,d){if(e)i(e);else{var c=s._path.normalize(n),h=c;if(s._env.isElectronRenderer){var f=h.match(/^([a-z])\:(.*)/i);h=f?"file:///"+(f[1].toUpperCase()+":"+f[2]).replace(/\\/g,"/"):"file://"+h}var p,g="(function (require, define, __filename, __dirname) { ";if(p=d.charCodeAt(0)===t._BOM?g+d.substring(1)+"\n});":g+d+"\n});",p=l(p,c),a.nodeCachedDataDir){var v=s._getCachedDataPath(a.nodeCachedDataDir,n);s._fs.readFile(v,function(e,t){var i={filename:h,produceCachedData:void 0===t,cachedData:t},a=s._loadAndEvalScript(r,n,h,p,i,u);o(),s._processCachedData(r,a,v)})}else s._loadAndEvalScript(r,n,h,p,{filename:h},u),o()}})},t.prototype._loadAndEvalScript=function(t,r,n,o,i,s){s.record(e.LoaderEventType.NodeBeginEvaluatingScript,r);var a=new this._vm.Script(o,i);return a.runInThisContext(i).call(e.global,t.getGlobalAMDRequireFunc(),t.getGlobalAMDDefineFunc(),n,this._path.dirname(r)),s.record(e.LoaderEventType.NodeEndEvaluatingScript,r),a},t.prototype._getCachedDataPath=function(e,t){var r=this._crypto.createHash("md5").update(t,"utf8").update(this._jsflags,"utf8").digest("hex"),n=this._path.basename(t).replace(/\.js$/,"");return this._path.join(e,n+"-"+r+".code")},t.prototype._processCachedData=function(e,r,n){var o=this;r.cachedDataRejected?(e.getConfig().getOptionsLiteral().onNodeCachedData({errorCode:"cachedDataRejected",path:n}),t._runSoon(function(){return o._fs.unlink(n,function(t){t&&e.getConfig().getOptionsLiteral().onNodeCachedData({errorCode:"unlink",path:n,detail:t})})},e.getConfig().getOptionsLiteral().nodeCachedDataWriteDelay)):r.cachedDataProduced&&(e.getConfig().getOptionsLiteral().onNodeCachedData(void 0,{path:n,length:r.cachedData.length}),t._runSoon(function(){return o._fs.writeFile(n,r.cachedData,function(t){t&&e.getConfig().getOptionsLiteral().onNodeCachedData({errorCode:"writeFile",path:n,detail:t})})},e.getConfig().getOptionsLiteral().nodeCachedDataWriteDelay))},t._runSoon=function(e,t){var r=t+Math.ceil(Math.random()*t);setTimeout(e,r)},t}();o._BOM=65279,e.createScriptLoader=function(e){return new t(e.isWebWorker?new n:e.isNode?new o(e):new r)}}(AMDLoader||(AMDLoader={}));var AMDLoader;!function(e){var t=function(){function t(e){var t=e.lastIndexOf("/");this.fromModulePath=-1!==t?e.substr(0,t+1):""}return t._normalizeModuleId=function(e){var t,r=e;for(t=/\/\.\//;t.test(r);)r=r.replace(t,"/");for(r=r.replace(/^\.\//g,""),t=/\/(([^\/])|([^\/][^\/\.])|([^\/\.][^\/])|([^\/][^\/][^\/]+))\/\.\.\//;t.test(r);)r=r.replace(t,"/");return r=r.replace(/^(([^\/])|([^\/][^\/\.])|([^\/\.][^\/])|([^\/][^\/][^\/]+))\/\.\.\//,"")},t.prototype.resolveModule=function(r){var n=r;return e.Utilities.isAbsolutePath(n)||(e.Utilities.startsWith(n,"./")||e.Utilities.startsWith(n,"../"))&&(n=t._normalizeModuleId(this.fromModulePath+n)),n},t}();t.ROOT=new t(""),e.ModuleIdResolver=t;var r=function(){function t(e,t,r,n,o,i){this.id=e,this.strId=t,this.dependencies=r,this._callback=n,this._errorback=o,this.moduleIdResolver=i,this.exports={},this.exportsPassedIn=!1,this.unresolvedDependenciesCount=this.dependencies.length,this._isComplete=!1}return t._safeInvokeFunction=function(t,r){try{return{returnedValue:t.apply(e.global,r),producedError:null}}catch(e){return{returnedValue:null,producedError:e}}},t._invokeFactory=function(t,r,n,o){return t.isBuild()&&!e.Utilities.isAnonymousModule(r)?{returnedValue:null,producedError:null}:t.shouldCatchError()?this._safeInvokeFunction(n,o):{returnedValue:n.apply(e.global,o),producedError:null}},t.prototype.complete=function(r,n,o){this._isComplete=!0;var i=null;if(this._callback)if("function"==typeof this._callback){r.record(e.LoaderEventType.BeginInvokeFactory,this.strId);var s=t._invokeFactory(n,this.strId,this._callback,o);i=s.producedError,r.record(e.LoaderEventType.EndInvokeFactory,this.strId),i||void 0===s.returnedValue||this.exportsPassedIn&&!e.Utilities.isEmpty(this.exports)||(this.exports=s.returnedValue)}else this.exports=this._callback;i&&n.onError({errorCode:"factory",moduleId:this.strId,detail:i}),this.dependencies=null,this._callback=null,this._errorback=null,this.moduleIdResolver=null},t.prototype.onDependencyError=function(e){return!!this._errorback&&(this._errorback(e),!0)},t.prototype.isComplete=function(){return this._isComplete},t}();e.Module=r;var n=function(){function e(){this._nextId=0,this._strModuleIdToIntModuleId=new Map,this._intModuleIdToStrModuleId=[],this.getModuleId("exports"),this.getModuleId("module"),this.getModuleId("require")}return e.prototype.getMaxModuleId=function(){return this._nextId},e.prototype.getModuleId=function(e){var t=this._strModuleIdToIntModuleId.get(e);return void 0===t&&(t=this._nextId++,this._strModuleIdToIntModuleId.set(e,t),this._intModuleIdToStrModuleId[t]=e),t},e.prototype.getStrModuleId=function(e){return this._intModuleIdToStrModuleId[e]},e}(),o=function(){return function(e){this.id=e}}();o.EXPORTS=new o(0),o.MODULE=new o(1),o.REQUIRE=new o(2),e.RegularDependency=o;var i=function(){return function(e,t,r){this.id=e,this.pluginId=t,this.pluginParam=r}}();e.PluginDependency=i;var s=function(){function s(t,r,o,i,s){void 0===s&&(s=0),this._env=t,this._scriptLoader=r,this._loaderAvailableTimestamp=s,this._defineFunc=o,this._requireFunc=i,this._moduleIdProvider=new n,this._config=new e.Configuration(this._env),this._modules2=[],this._knownModules2=[],this._inverseDependencies2=[],this._inversePluginDependencies2=new Map,this._currentAnnonymousDefineCall=null,this._recorder=null,this._buildInfoPath=[],this._buildInfoDefineStack=[],this._buildInfoDependencies=[]}return s.prototype.reset=function(){return new s(this._env,this._scriptLoader,this._defineFunc,this._requireFunc,this._loaderAvailableTimestamp)},s.prototype.getGlobalAMDDefineFunc=function(){return this._defineFunc},s.prototype.getGlobalAMDRequireFunc=function(){return this._requireFunc},s._findRelevantLocationInStack=function(e,t){for(var r=function(e){return e.replace(/\\/g,"/")},n=r(e),o=t.split(/\n/),i=0;i<o.length;i++){var s=o[i].match(/(.*):(\d+):(\d+)\)?$/);if(s){var a=s[1],d=s[2],l=s[3],u=Math.max(a.lastIndexOf(" ")+1,a.lastIndexOf("(")+1);if(a=a.substr(u),(a=r(a))===n){var c={line:parseInt(d,10),col:parseInt(l,10)};return 1===c.line&&(c.col-="(function (require, define, __filename, __dirname) { ".length),c}}}throw new Error("Could not correlate define call site for needle "+e)},s.prototype.getBuildInfo=function(){if(!this._config.isBuild())return null;for(var e=[],t=0,r=0,n=this._modules2.length;r<n;r++){var o=this._modules2[r];if(o){var i=this._buildInfoPath[o.id]||null,a=this._buildInfoDefineStack[o.id]||null,d=this._buildInfoDependencies[o.id];e[t++]={id:o.strId,path:i,defineLocation:i&&a?s._findRelevantLocationInStack(i,a):null,dependencies:d,shim:null,exports:o.exports}}}return e},s.prototype.getRecorder=function(){return this._recorder||(this._config.shouldRecordStats()?this._recorder=new e.LoaderEventRecorder(this._loaderAvailableTimestamp):this._recorder=e.NullLoaderEventRecorder.INSTANCE),this._recorder},s.prototype.getLoaderEvents=function(){return this.getRecorder().getEvents()},s.prototype.enqueueDefineAnonymousModule=function(e,t){if(null!==this._currentAnnonymousDefineCall)throw new Error("Can only have one anonymous define call per script file");var r=null;this._config.isBuild()&&(r=new Error("StackLocation").stack),this._currentAnnonymousDefineCall={stack:r,dependencies:e,callback:t}},s.prototype.defineModule=function(e,n,o,i,s,a){var d=this;void 0===a&&(a=new t(e));var l=this._moduleIdProvider.getModuleId(e);if(this._modules2[l])this._config.isDuplicateMessageIgnoredFor(e)||console.warn("Duplicate definition of module '"+e+"'");else{var u=new r(l,e,this._normalizeDependencies(n,a),o,i,a);this._modules2[l]=u,this._config.isBuild()&&(this._buildInfoDefineStack[l]=s,this._buildInfoDependencies[l]=u.dependencies.map(function(e){return d._moduleIdProvider.getStrModuleId(e.id)})),this._resolve(u)}},s.prototype._normalizeDependency=function(e,t){if("exports"===e)return o.EXPORTS;if("module"===e)return o.MODULE;if("require"===e)return o.REQUIRE;var r=e.indexOf("!");if(r>=0){var n=t.resolveModule(e.substr(0,r)),s=t.resolveModule(e.substr(r+1)),a=this._moduleIdProvider.getModuleId(n+"!"+s),d=this._moduleIdProvider.getModuleId(n);return new i(a,d,s)}return new o(this._moduleIdProvider.getModuleId(t.resolveModule(e)))},s.prototype._normalizeDependencies=function(e,t){for(var r=[],n=0,o=0,i=e.length;o<i;o++)r[n++]=this._normalizeDependency(e[o],t);return r},s.prototype._relativeRequire=function(t,r,n,o){if("string"==typeof r)return this.synchronousRequire(r,t);this.defineModule(e.Utilities.generateAnonymousModule(),r,n,o,null,t)},s.prototype.synchronousRequire=function(e,r){void 0===r&&(r=new t(e));var n=this._normalizeDependency(e,r),o=this._modules2[n.id];if(!o)throw new Error("Check dependency list! Synchronous require cannot resolve module '"+e+"'. This is the first mention of this module!");if(!o.isComplete())throw new Error("Check dependency list! Synchronous require cannot resolve module '"+e+"'. This module has not been resolved completely yet.");return o.exports},s.prototype.configure=function(t,r){var n=this._config.shouldRecordStats();this._config=r?new e.Configuration(this._env,t):this._config.cloneAndMerge(t),this._config.shouldRecordStats()&&!n&&(this._recorder=null)},s.prototype.getConfig=function(){return this._config},s.prototype._onLoad=function(e){if(null!==this._currentAnnonymousDefineCall){var t=this._currentAnnonymousDefineCall;this._currentAnnonymousDefineCall=null,this.defineModule(this._moduleIdProvider.getStrModuleId(e),t.dependencies,t.callback,null,t.stack)}},s.prototype._createLoadError=function(e,t){var r=this;return{errorCode:"load",moduleId:this._moduleIdProvider.getStrModuleId(e),neededBy:(this._inverseDependencies2[e]||[]).map(function(e){return r._moduleIdProvider.getStrModuleId(e)}),detail:t}},s.prototype._onLoadError=function(e,t){for(var r=this._createLoadError(e,t),n=[],o=0,i=this._moduleIdProvider.getMaxModuleId();o<i;o++)n[o]=!1;var s=!1,a=[];for(a.push(e),n[e]=!0;a.length>0;){var d=a.shift(),l=this._modules2[d];l&&(s=l.onDependencyError(r)||s);var u=this._inverseDependencies2[d];if(u)for(var o=0,i=u.length;o<i;o++){var c=u[o];n[c]||(a.push(c),n[c]=!0)}}s||this._config.onError(r)},s.prototype._hasDependencyPath=function(e,t){var r=this._modules2[e];if(!r)return!1;for(var n=[],o=0,i=this._moduleIdProvider.getMaxModuleId();o<i;o++)n[o]=!1;var s=[];for(s.push(r),n[e]=!0;s.length>0;){var a=s.shift().dependencies;if(a)for(var o=0,i=a.length;o<i;o++){var d=a[o];if(d.id===t)return!0;var l=this._modules2[d.id];l&&!n[d.id]&&(n[d.id]=!0,s.push(l))}}return!1},s.prototype._findCyclePath=function(e,t,r){if(e===t||50===r)return[e];var n=this._modules2[e];if(!n)return null;for(var o=n.dependencies,i=0,s=o.length;i<s;i++){var a=this._findCyclePath(o[i].id,t,r+1);if(null!==a)return a.push(e),a}return null},s.prototype._createRequire=function(t){var r=this,n=function(e,n,o){return r._relativeRequire(t,e,n,o)};return n.toUrl=function(e){return r._config.requireToUrl(t.resolveModule(e))},n.getStats=function(){return r.getLoaderEvents()},n.__$__nodeRequire=e.global.nodeRequire,n},s.prototype._loadModule=function(t){var r=this;if(!this._modules2[t]&&!this._knownModules2[t]){this._knownModules2[t]=!0;var n=this._moduleIdProvider.getStrModuleId(t),o=this._config.moduleIdToPaths(n);this._env.isNode&&-1===n.indexOf("/")&&o.push("node|"+n);var i=-1,s=function(n){if(++i>=o.length)r._onLoadError(t,n);else{var a=o[i],d=r.getRecorder();if(r._config.isBuild()&&"empty:"===a)return r._buildInfoPath[t]=a,r.defineModule(r._moduleIdProvider.getStrModuleId(t),[],null,null,null),void r._onLoad(t);d.record(e.LoaderEventType.BeginLoadingScript,a),r._scriptLoader.load(r,a,function(){r._config.isBuild()&&(r._buildInfoPath[t]=a),d.record(e.LoaderEventType.EndLoadingScriptOK,a),r._onLoad(t)},function(t){d.record(e.LoaderEventType.EndLoadingScriptError,a),s(t)})}};s(null)}},s.prototype._loadPluginDependency=function(e,r){var n=this;if(!this._modules2[r.id]&&!this._knownModules2[r.id]){this._knownModules2[r.id]=!0;var o=function(e){n.defineModule(n._moduleIdProvider.getStrModuleId(r.id),[],e,null,null)};o.error=function(e){n._config.onError(n._createLoadError(r.id,e))},e.load(r.pluginParam,this._createRequire(t.ROOT),o,this._config.getOptionsLiteral())}},s.prototype._resolve=function(e){for(var t=this,r=e.dependencies,n=0,s=r.length;n<s;n++){var a=r[n];if(a!==o.EXPORTS)if(a!==o.MODULE)if(a!==o.REQUIRE){var d=this._modules2[a.id];if(d&&d.isComplete())e.unresolvedDependenciesCount--;else if(this._hasDependencyPath(a.id,e.id)){console.warn("There is a dependency cycle between '"+this._moduleIdProvider.getStrModuleId(a.id)+"' and '"+this._moduleIdProvider.getStrModuleId(e.id)+"'. The cyclic path follows:");var l=this._findCyclePath(a.id,e.id,0);l.reverse(),l.push(a.id),console.warn(l.map(function(e){return t._moduleIdProvider.getStrModuleId(e)}).join(" => \n")),e.unresolvedDependenciesCount--}else if(this._inverseDependencies2[a.id]=this._inverseDependencies2[a.id]||[],this._inverseDependencies2[a.id].push(e.id),a instanceof i){var u=this._modules2[a.pluginId];if(u&&u.isComplete()){this._loadPluginDependency(u.exports,a);continue}var c=this._inversePluginDependencies2.get(a.pluginId);c||(c=[],this._inversePluginDependencies2.set(a.pluginId,c)),c.push(a),this._loadModule(a.pluginId)}else this._loadModule(a.id)}else e.unresolvedDependenciesCount--;else e.unresolvedDependenciesCount--;else e.exportsPassedIn=!0,e.unresolvedDependenciesCount--}0===e.unresolvedDependenciesCount&&this._onModuleComplete(e)},s.prototype._onModuleComplete=function(e){var t=this,r=this.getRecorder();if(!e.isComplete()){for(var n=e.dependencies,i=[],s=0,a=n.length;s<a;s++){var d=n[s];if(d!==o.EXPORTS)if(d!==o.MODULE)if(d!==o.REQUIRE){var l=this._modules2[d.id];i[s]=l?l.exports:null}else i[s]=this._createRequire(e.moduleIdResolver);else i[s]={id:e.strId,config:function(){return t._config.getConfigForModule(e.strId)}};else i[s]=e.exports}e.complete(r,this._config,i);var u=this._inverseDependencies2[e.id];if(this._inverseDependencies2[e.id]=null,u)for(var s=0,a=u.length;s<a;s++){var c=u[s],h=this._modules2[c];h.unresolvedDependenciesCount--,0===h.unresolvedDependenciesCount&&this._onModuleComplete(h)}var f=this._inversePluginDependencies2.get(e.id);if(f){this._inversePluginDependencies2.delete(e.id);for(var s=0,a=f.length;s<a;s++)this._loadPluginDependency(e.exports,f[s])}}},s}();e.ModuleManager=s}(AMDLoader||(AMDLoader={}));var define,AMDLoader;!function(e){function t(){(o=function(e,t,r){"string"!=typeof e&&(r=t,t=e,e=null),"object"==typeof t&&Array.isArray(t)||(r=t,t=null),t||(t=["require","exports","module"]),e?n.defineModule(e,t,r,null,null):n.enqueueDefineAnonymousModule(t,r)}).amd={jQuery:!0};var t=function(e,t){void 0===t&&(t=!1),n.configure(e,t)};(i=function(){if(1===arguments.length){if(arguments[0]instanceof Object&&!Array.isArray(arguments[0]))return void t(arguments[0]);if("string"==typeof arguments[0])return n.synchronousRequire(arguments[0])}if(2!==arguments.length&&3!==arguments.length||!Array.isArray(arguments[0]))throw new Error("Unrecognized require call");n.defineModule(e.Utilities.generateAnonymousModule(),arguments[0],arguments[1],arguments[2],null)}).config=t,i.getConfig=function(){return n.getConfig().getOptionsLiteral()},i.reset=function(){n=n.reset()},i.getBuildInfo=function(){return n.getBuildInfo()},i.getStats=function(){return n.getLoaderEvents()}}function r(){t();var r=e.Environment.detect(),s=e.createScriptLoader(r);if(n=new e.ModuleManager(r,s,o,i,e.Utilities.getHighPerformanceTimestamp()),r.isNode){var a=e.global.require||require,d=function(t){n.getRecorder().record(e.LoaderEventType.NodeBeginNativeRequire,t);try{return a(t)}finally{n.getRecorder().record(e.LoaderEventType.NodeEndNativeRequire,t)}};e.global.nodeRequire=d,i.nodeRequire=d}r.isNode&&!r.isElectronRenderer?(module.exports=i,define=function(){o.apply(null,arguments)},require=i):(void 0!==e.global.require&&"function"!=typeof e.global.require&&i.config(e.global.require),r.isElectronRenderer?define=function(){o.apply(null,arguments)}:e.global.define=define=o,e.global.require=i,e.global.require.__$__nodeRequire=d)}var n=null,o=null,i=null;e.init=r,"undefined"!=typeof doNotInitLoader||"function"==typeof e.global.define&&e.global.define.amd||r()}(AMDLoader||(AMDLoader={}));
+//# sourceMappingURL=../../min-maps/vs/loader.js.map
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/merge.js b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/merge.js
new file mode 100644
index 0000000..ad59c3c
--- /dev/null
+++ b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/merge.js
@@ -0,0 +1,1010 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// declare global: diff_match_patch, DIFF_INSERT, DIFF_DELETE, DIFF_EQUAL
+
+(function(mod) {
+  if (typeof exports == "object" && typeof module == "object") // CommonJS
+    mod(require("../../lib/codemirror")); // Note non-packaged dependency diff_match_patch
+  else if (typeof define == "function" && define.amd) // AMD
+    define(["../../lib/codemirror", "diff_match_patch"], mod);
+  else // Plain browser env
+    mod(CodeMirror);
+})(function(CodeMirror) {
+  "use strict";
+  var Pos = CodeMirror.Pos;
+  var svgNS = "http://www.w3.org/2000/svg";
+
+  function DiffView(mv, type) {
+    this.mv = mv;
+    this.type = type;
+    this.classes = type == "left"
+      ? {chunk: "CodeMirror-merge-l-chunk",
+         start: "CodeMirror-merge-l-chunk-start",
+         end: "CodeMirror-merge-l-chunk-end",
+         insert: "CodeMirror-merge-l-inserted",
+         del: "CodeMirror-merge-l-deleted",
+         connect: "CodeMirror-merge-l-connect"}
+      : {chunk: "CodeMirror-merge-r-chunk",
+         start: "CodeMirror-merge-r-chunk-start",
+         end: "CodeMirror-merge-r-chunk-end",
+         insert: "CodeMirror-merge-r-inserted",
+         del: "CodeMirror-merge-r-deleted",
+         connect: "CodeMirror-merge-r-connect"};
+  }
+
+  DiffView.prototype = {
+    constructor: DiffView,
+    init: function(pane, orig, options) {
+      this.edit = this.mv.edit;
+      ;(this.edit.state.diffViews || (this.edit.state.diffViews = [])).push(this);
+      this.orig = CodeMirror(pane, copyObj({value: orig, readOnly: !this.mv.options.allowEditingOriginals}, copyObj(options)));
+      if (this.mv.options.connect == "align") {
+        if (!this.edit.state.trackAlignable) this.edit.state.trackAlignable = new TrackAlignable(this.edit)
+        this.orig.state.trackAlignable = new TrackAlignable(this.orig)
+      }
+
+      this.orig.state.diffViews = [this];
+      var classLocation = options.chunkClassLocation || "background";
+      if (Object.prototype.toString.call(classLocation) != "[object Array]") classLocation = [classLocation]
+      this.classes.classLocation = classLocation
+
+      this.diff = getDiff(asString(orig), asString(options.value), this.mv.options.ignoreWhitespace);
+      this.chunks = getChunks(this.diff);
+      this.diffOutOfDate = this.dealigned = false;
+      this.needsScrollSync = null
+
+      this.showDifferences = options.showDifferences !== false;
+    },
+    registerEvents: function(otherDv) {
+      this.forceUpdate = registerUpdate(this);
+      setScrollLock(this, true, false);
+      registerScroll(this, otherDv);
+    },
+    setShowDifferences: function(val) {
+      val = val !== false;
+      if (val != this.showDifferences) {
+        this.showDifferences = val;
+        this.forceUpdate("full");
+      }
+    }
+  };
+
+  function ensureDiff(dv) {
+    if (dv.diffOutOfDate) {
+      dv.diff = getDiff(dv.orig.getValue(), dv.edit.getValue(), dv.mv.options.ignoreWhitespace);
+      dv.chunks = getChunks(dv.diff);
+      dv.diffOutOfDate = false;
+      CodeMirror.signal(dv.edit, "updateDiff", dv.diff);
+    }
+  }
+
+  var updating = false;
+  function registerUpdate(dv) {
+    var edit = {from: 0, to: 0, marked: []};
+    var orig = {from: 0, to: 0, marked: []};
+    var debounceChange, updatingFast = false;
+    function update(mode) {
+      updating = true;
+      updatingFast = false;
+      if (mode == "full") {
+        if (dv.svg) clear(dv.svg);
+        if (dv.copyButtons) clear(dv.copyButtons);
+        clearMarks(dv.edit, edit.marked, dv.classes);
+        clearMarks(dv.orig, orig.marked, dv.classes);
+        edit.from = edit.to = orig.from = orig.to = 0;
+      }
+      ensureDiff(dv);
+      if (dv.showDifferences) {
+        updateMarks(dv.edit, dv.diff, edit, DIFF_INSERT, dv.classes);
+        updateMarks(dv.orig, dv.diff, orig, DIFF_DELETE, dv.classes);
+      }
+
+      if (dv.mv.options.connect == "align")
+        alignChunks(dv);
+      makeConnections(dv);
+      if (dv.needsScrollSync != null) syncScroll(dv, dv.needsScrollSync)
+
+      updating = false;
+    }
+    function setDealign(fast) {
+      if (updating) return;
+      dv.dealigned = true;
+      set(fast);
+    }
+    function set(fast) {
+      if (updating || updatingFast) return;
+      clearTimeout(debounceChange);
+      if (fast === true) updatingFast = true;
+      debounceChange = setTimeout(update, fast === true ? 20 : 250);
+    }
+    function change(_cm, change) {
+      if (!dv.diffOutOfDate) {
+        dv.diffOutOfDate = true;
+        edit.from = edit.to = orig.from = orig.to = 0;
+      }
+      // Update faster when a line was added/removed
+      setDealign(change.text.length - 1 != change.to.line - change.from.line);
+    }
+    function swapDoc() {
+      dv.diffOutOfDate = true;
+      dv.dealigned = true;
+      update("full");
+    }
+    dv.edit.on("change", change);
+    dv.orig.on("change", change);
+    dv.edit.on("swapDoc", swapDoc);
+    dv.orig.on("swapDoc", swapDoc);
+    if (dv.mv.options.connect == "align") {
+      CodeMirror.on(dv.edit.state.trackAlignable, "realign", setDealign)
+      CodeMirror.on(dv.orig.state.trackAlignable, "realign", setDealign)
+    }
+    dv.edit.on("viewportChange", function() { set(false); });
+    dv.orig.on("viewportChange", function() { set(false); });
+    update();
+    return update;
+  }
+
+  function registerScroll(dv, otherDv) {
+    dv.edit.on("scroll", function() {
+      syncScroll(dv, true) && makeConnections(dv);
+    });
+    dv.orig.on("scroll", function() {
+      syncScroll(dv, false) && makeConnections(dv);
+      if (otherDv) syncScroll(otherDv, true) && makeConnections(otherDv);
+    });
+  }
+
+  function syncScroll(dv, toOrig) {
+    // Change handler will do a refresh after a timeout when diff is out of date
+    if (dv.diffOutOfDate) {
+      if (dv.lockScroll && dv.needsScrollSync == null) dv.needsScrollSync = toOrig
+      return false
+    }
+    dv.needsScrollSync = null
+    if (!dv.lockScroll) return true;
+    var editor, other, now = +new Date;
+    if (toOrig) { editor = dv.edit; other = dv.orig; }
+    else { editor = dv.orig; other = dv.edit; }
+    // Don't take action if the position of this editor was recently set
+    // (to prevent feedback loops)
+    if (editor.state.scrollSetBy == dv && (editor.state.scrollSetAt || 0) + 250 > now) return false;
+
+    var sInfo = editor.getScrollInfo();
+    if (dv.mv.options.connect == "align") {
+      targetPos = sInfo.top;
+    } else {
+      var halfScreen = .5 * sInfo.clientHeight, midY = sInfo.top + halfScreen;
+      var mid = editor.lineAtHeight(midY, "local");
+      var around = chunkBoundariesAround(dv.chunks, mid, toOrig);
+      var off = getOffsets(editor, toOrig ? around.edit : around.orig);
+      var offOther = getOffsets(other, toOrig ? around.orig : around.edit);
+      var ratio = (midY - off.top) / (off.bot - off.top);
+      var targetPos = (offOther.top - halfScreen) + ratio * (offOther.bot - offOther.top);
+
+      var botDist, mix;
+      // Some careful tweaking to make sure no space is left out of view
+      // when scrolling to top or bottom.
+      if (targetPos > sInfo.top && (mix = sInfo.top / halfScreen) < 1) {
+        targetPos = targetPos * mix + sInfo.top * (1 - mix);
+      } else if ((botDist = sInfo.height - sInfo.clientHeight - sInfo.top) < halfScreen) {
+        var otherInfo = other.getScrollInfo();
+        var botDistOther = otherInfo.height - otherInfo.clientHeight - targetPos;
+        if (botDistOther > botDist && (mix = botDist / halfScreen) < 1)
+          targetPos = targetPos * mix + (otherInfo.height - otherInfo.clientHeight - botDist) * (1 - mix);
+      }
+    }
+
+    other.scrollTo(sInfo.left, targetPos);
+    other.state.scrollSetAt = now;
+    other.state.scrollSetBy = dv;
+    return true;
+  }
+
+  function getOffsets(editor, around) {
+    var bot = around.after;
+    if (bot == null) bot = editor.lastLine() + 1;
+    return {top: editor.heightAtLine(around.before || 0, "local"),
+            bot: editor.heightAtLine(bot, "local")};
+  }
+
+  function setScrollLock(dv, val, action) {
+    dv.lockScroll = val;
+    if (val && action != false) syncScroll(dv, DIFF_INSERT) && makeConnections(dv);
+    dv.lockButton.innerHTML = val ? "\u21db\u21da" : "\u21db&nbsp;&nbsp;\u21da";
+  }
+
+  // Updating the marks for editor content
+
+  function removeClass(editor, line, classes) {
+    var locs = classes.classLocation
+    for (var i = 0; i < locs.length; i++) {
+      editor.removeLineClass(line, locs[i], classes.chunk);
+      editor.removeLineClass(line, locs[i], classes.start);
+      editor.removeLineClass(line, locs[i], classes.end);
+    }
+  }
+
+  function clearMarks(editor, arr, classes) {
+    for (var i = 0; i < arr.length; ++i) {
+      var mark = arr[i];
+      if (mark instanceof CodeMirror.TextMarker)
+        mark.clear();
+      else if (mark.parent)
+        removeClass(editor, mark, classes);
+    }
+    arr.length = 0;
+  }
+
+  // FIXME maybe add a margin around viewport to prevent too many updates
+  function updateMarks(editor, diff, state, type, classes) {
+    var vp = editor.getViewport();
+    editor.operation(function() {
+      if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) {
+        clearMarks(editor, state.marked, classes);
+        markChanges(editor, diff, type, state.marked, vp.from, vp.to, classes);
+        state.from = vp.from; state.to = vp.to;
+      } else {
+        if (vp.from < state.from) {
+          markChanges(editor, diff, type, state.marked, vp.from, state.from, classes);
+          state.from = vp.from;
+        }
+        if (vp.to > state.to) {
+          markChanges(editor, diff, type, state.marked, state.to, vp.to, classes);
+          state.to = vp.to;
+        }
+      }
+    });
+  }
+
+  function addClass(editor, lineNr, classes, main, start, end) {
+    var locs = classes.classLocation, line = editor.getLineHandle(lineNr);
+    for (var i = 0; i < locs.length; i++) {
+      if (main) editor.addLineClass(line, locs[i], classes.chunk);
+      if (start) editor.addLineClass(line, locs[i], classes.start);
+      if (end) editor.addLineClass(line, locs[i], classes.end);
+    }
+    return line;
+  }
+
+  function markChanges(editor, diff, type, marks, from, to, classes) {
+    var pos = Pos(0, 0);
+    var top = Pos(from, 0), bot = editor.clipPos(Pos(to - 1));
+    var cls = type == DIFF_DELETE ? classes.del : classes.insert;
+    function markChunk(start, end) {
+      var bfrom = Math.max(from, start), bto = Math.min(to, end);
+      for (var i = bfrom; i < bto; ++i)
+        marks.push(addClass(editor, i, classes, true, i == start, i == end - 1));
+      // When the chunk is empty, make sure a horizontal line shows up
+      if (start == end && bfrom == end && bto == end) {
+        if (bfrom)
+          marks.push(addClass(editor, bfrom - 1, classes, false, false, true));
+        else
+          marks.push(addClass(editor, bfrom, classes, false, true, false));
+      }
+    }
+
+    var chunkStart = 0, pending = false;
+    for (var i = 0; i < diff.length; ++i) {
+      var part = diff[i], tp = part[0], str = part[1];
+      if (tp == DIFF_EQUAL) {
+        var cleanFrom = pos.line + (startOfLineClean(diff, i) ? 0 : 1);
+        moveOver(pos, str);
+        var cleanTo = pos.line + (endOfLineClean(diff, i) ? 1 : 0);
+        if (cleanTo > cleanFrom) {
+          if (pending) { markChunk(chunkStart, cleanFrom); pending = false }
+          chunkStart = cleanTo;
+        }
+      } else {
+        pending = true
+        if (tp == type) {
+          var end = moveOver(pos, str, true);
+          var a = posMax(top, pos), b = posMin(bot, end);
+          if (!posEq(a, b))
+            marks.push(editor.markText(a, b, {className: cls}));
+          pos = end;
+        }
+      }
+    }
+    if (pending) markChunk(chunkStart, pos.line + 1);
+  }
+
+  // Updating the gap between editor and original
+
+  function makeConnections(dv) {
+    if (!dv.showDifferences) return;
+
+    if (dv.svg) {
+      clear(dv.svg);
+      var w = dv.gap.offsetWidth;
+      attrs(dv.svg, "width", w, "height", dv.gap.offsetHeight);
+    }
+    if (dv.copyButtons) clear(dv.copyButtons);
+
+    var vpEdit = dv.edit.getViewport(), vpOrig = dv.orig.getViewport();
+    var outerTop = dv.mv.wrap.getBoundingClientRect().top
+    var sTopEdit = outerTop - dv.edit.getScrollerElement().getBoundingClientRect().top + dv.edit.getScrollInfo().top
+    var sTopOrig = outerTop - dv.orig.getScrollerElement().getBoundingClientRect().top + dv.orig.getScrollInfo().top;
+    for (var i = 0; i < dv.chunks.length; i++) {
+      var ch = dv.chunks[i];
+      if (ch.editFrom <= vpEdit.to && ch.editTo >= vpEdit.from &&
+          ch.origFrom <= vpOrig.to && ch.origTo >= vpOrig.from)
+        drawConnectorsForChunk(dv, ch, sTopOrig, sTopEdit, w);
+    }
+  }
+
+  function getMatchingOrigLine(editLine, chunks) {
+    var editStart = 0, origStart = 0;
+    for (var i = 0; i < chunks.length; i++) {
+      var chunk = chunks[i];
+      if (chunk.editTo > editLine && chunk.editFrom <= editLine) return null;
+      if (chunk.editFrom > editLine) break;
+      editStart = chunk.editTo;
+      origStart = chunk.origTo;
+    }
+    return origStart + (editLine - editStart);
+  }
+
+  // Combines information about chunks and widgets/markers to return
+  // an array of lines, in a single editor, that probably need to be
+  // aligned with their counterparts in the editor next to it.
+  function alignableFor(cm, chunks, isOrig) {
+    var tracker = cm.state.trackAlignable
+    var start = cm.firstLine(), trackI = 0
+    var result = []
+    for (var i = 0;; i++) {
+      var chunk = chunks[i]
+      var chunkStart = !chunk ? 1e9 : isOrig ? chunk.origFrom : chunk.editFrom
+      for (; trackI < tracker.alignable.length; trackI += 2) {
+        var n = tracker.alignable[trackI] + 1
+        if (n <= start) continue
+        if (n <= chunkStart) result.push(n)
+        else break
+      }
+      if (!chunk) break
+      result.push(start = isOrig ? chunk.origTo : chunk.editTo)
+    }
+    return result
+  }
+
+  // Given information about alignable lines in two editors, fill in
+  // the result (an array of three-element arrays) to reflect the
+  // lines that need to be aligned with each other.
+  function mergeAlignable(result, origAlignable, chunks, setIndex) {
+    var rI = 0, origI = 0, chunkI = 0, diff = 0
+    outer: for (;; rI++) {
+      var nextR = result[rI], nextO = origAlignable[origI]
+      if (!nextR && nextO == null) break
+
+      var rLine = nextR ? nextR[0] : 1e9, oLine = nextO == null ? 1e9 : nextO
+      while (chunkI < chunks.length) {
+        var chunk = chunks[chunkI]
+        if (chunk.origFrom <= oLine && chunk.origTo > oLine) {
+          origI++
+          rI--
+          continue outer;
+        }
+        if (chunk.editTo > rLine) {
+          if (chunk.editFrom <= rLine) continue outer;
+          break
+        }
+        diff += (chunk.origTo - chunk.origFrom) - (chunk.editTo - chunk.editFrom)
+        chunkI++
+      }
+      if (rLine == oLine - diff) {
+        nextR[setIndex] = oLine
+        origI++
+      } else if (rLine < oLine - diff) {
+        nextR[setIndex] = rLine + diff
+      } else {
+        var record = [oLine - diff, null, null]
+        record[setIndex] = oLine
+        result.splice(rI, 0, record)
+        origI++
+      }
+    }
+  }
+
+  function findAlignedLines(dv, other) {
+    var alignable = alignableFor(dv.edit, dv.chunks, false), result = []
+    if (other) for (var i = 0, j = 0; i < other.chunks.length; i++) {
+      var n = other.chunks[i].editTo
+      while (j < alignable.length && alignable[j] < n) j++
+      if (j == alignable.length || alignable[j] != n) alignable.splice(j++, 0, n)
+    }
+    for (var i = 0; i < alignable.length; i++)
+      result.push([alignable[i], null, null])
+
+    mergeAlignable(result, alignableFor(dv.orig, dv.chunks, true), dv.chunks, 1)
+    if (other)
+      mergeAlignable(result, alignableFor(other.orig, other.chunks, true), other.chunks, 2)
+
+    return result
+  }
+
+  function alignChunks(dv, force) {
+    if (!dv.dealigned && !force) return;
+    if (!dv.orig.curOp) return dv.orig.operation(function() {
+      alignChunks(dv, force);
+    });
+
+    dv.dealigned = false;
+    var other = dv.mv.left == dv ? dv.mv.right : dv.mv.left;
+    if (other) {
+      ensureDiff(other);
+      other.dealigned = false;
+    }
+    var linesToAlign = findAlignedLines(dv, other);
+
+    // Clear old aligners
+    var aligners = dv.mv.aligners;
+    for (var i = 0; i < aligners.length; i++)
+      aligners[i].clear();
+    aligners.length = 0;
+
+    var cm = [dv.edit, dv.orig], scroll = [];
+    if (other) cm.push(other.orig);
+    for (var i = 0; i < cm.length; i++)
+      scroll.push(cm[i].getScrollInfo().top);
+
+    for (var ln = 0; ln < linesToAlign.length; ln++)
+      alignLines(cm, linesToAlign[ln], aligners);
+
+    for (var i = 0; i < cm.length; i++)
+      cm[i].scrollTo(null, scroll[i]);
+  }
+
+  function alignLines(cm, lines, aligners) {
+    var maxOffset = 0, offset = [];
+    for (var i = 0; i < cm.length; i++) if (lines[i] != null) {
+      var off = cm[i].heightAtLine(lines[i], "local");
+      offset[i] = off;
+      maxOffset = Math.max(maxOffset, off);
+    }
+    for (var i = 0; i < cm.length; i++) if (lines[i] != null) {
+      var diff = maxOffset - offset[i];
+      if (diff > 1)
+        aligners.push(padAbove(cm[i], lines[i], diff));
+    }
+  }
+
+  function padAbove(cm, line, size) {
+    var above = true;
+    if (line > cm.lastLine()) {
+      line--;
+      above = false;
+    }
+    var elt = document.createElement("div");
+    elt.className = "CodeMirror-merge-spacer";
+    elt.style.height = size + "px"; elt.style.minWidth = "1px";
+    return cm.addLineWidget(line, elt, {height: size, above: above, mergeSpacer: true, handleMouseEvents: true});
+  }
+
+  function drawConnectorsForChunk(dv, chunk, sTopOrig, sTopEdit, w) {
+    var flip = dv.type == "left";
+    var top = dv.orig.heightAtLine(chunk.origFrom, "local", true) - sTopOrig;
+    if (dv.svg) {
+      var topLpx = top;
+      var topRpx = dv.edit.heightAtLine(chunk.editFrom, "local", true) - sTopEdit;
+      if (flip) { var tmp = topLpx; topLpx = topRpx; topRpx = tmp; }
+      var botLpx = dv.orig.heightAtLine(chunk.origTo, "local", true) - sTopOrig;
+      var botRpx = dv.edit.heightAtLine(chunk.editTo, "local", true) - sTopEdit;
+      if (flip) { var tmp = botLpx; botLpx = botRpx; botRpx = tmp; }
+      var curveTop = " C " + w/2 + " " + topRpx + " " + w/2 + " " + topLpx + " " + (w + 2) + " " + topLpx;
+      var curveBot = " C " + w/2 + " " + botLpx + " " + w/2 + " " + botRpx + " -1 " + botRpx;
+      attrs(dv.svg.appendChild(document.createElementNS(svgNS, "path")),
+            "d", "M -1 " + topRpx + curveTop + " L " + (w + 2) + " " + botLpx + curveBot + " z",
+            "class", dv.classes.connect);
+    }
+    if (dv.copyButtons) {
+      var copy = dv.copyButtons.appendChild(elt("div", dv.type == "left" ? "\u21dd" : "\u21dc",
+                                                "CodeMirror-merge-copy"));
+      var editOriginals = dv.mv.options.allowEditingOriginals;
+      copy.title = editOriginals ? "Push to left" : "Revert chunk";
+      copy.chunk = chunk;
+      copy.style.top = (chunk.origTo > chunk.origFrom ? top : dv.edit.heightAtLine(chunk.editFrom, "local") - sTopEdit) + "px";
+
+      if (editOriginals) {
+        var topReverse = dv.edit.heightAtLine(chunk.editFrom, "local") - sTopEdit;
+        var copyReverse = dv.copyButtons.appendChild(elt("div", dv.type == "right" ? "\u21dd" : "\u21dc",
+                                                         "CodeMirror-merge-copy-reverse"));
+        copyReverse.title = "Push to right";
+        copyReverse.chunk = {editFrom: chunk.origFrom, editTo: chunk.origTo,
+                             origFrom: chunk.editFrom, origTo: chunk.editTo};
+        copyReverse.style.top = topReverse + "px";
+        dv.type == "right" ? copyReverse.style.left = "2px" : copyReverse.style.right = "2px";
+      }
+    }
+  }
+
+  function copyChunk(dv, to, from, chunk) {
+    if (dv.diffOutOfDate) return;
+    var origStart = chunk.origTo > from.lastLine() ? Pos(chunk.origFrom - 1) : Pos(chunk.origFrom, 0)
+    var origEnd = Pos(chunk.origTo, 0)
+    var editStart = chunk.editTo > to.lastLine() ? Pos(chunk.editFrom - 1) : Pos(chunk.editFrom, 0)
+    var editEnd = Pos(chunk.editTo, 0)
+    var handler = dv.mv.options.revertChunk
+    if (handler)
+      handler(dv.mv, from, origStart, origEnd, to, editStart, editEnd)
+    else
+      to.replaceRange(from.getRange(origStart, origEnd), editStart, editEnd)
+  }
+
+  // Merge view, containing 0, 1, or 2 diff views.
+
+  var MergeView = CodeMirror.MergeView = function(node, options) {
+    if (!(this instanceof MergeView)) return new MergeView(node, options);
+
+    this.options = options;
+    var origLeft = options.origLeft, origRight = options.origRight == null ? options.orig : options.origRight;
+
+    var hasLeft = origLeft != null, hasRight = origRight != null;
+    var panes = 1 + (hasLeft ? 1 : 0) + (hasRight ? 1 : 0);
+    var wrap = [], left = this.left = null, right = this.right = null;
+    var self = this;
+
+    if (hasLeft) {
+      left = this.left = new DiffView(this, "left");
+      var leftPane = elt("div", null, "CodeMirror-merge-pane CodeMirror-merge-left");
+      wrap.push(leftPane);
+      wrap.push(buildGap(left));
+    }
+
+    var editPane = elt("div", null, "CodeMirror-merge-pane CodeMirror-merge-editor");
+    wrap.push(editPane);
+
+    if (hasRight) {
+      right = this.right = new DiffView(this, "right");
+      wrap.push(buildGap(right));
+      var rightPane = elt("div", null, "CodeMirror-merge-pane CodeMirror-merge-right");
+      wrap.push(rightPane);
+    }
+
+    (hasRight ? rightPane : editPane).className += " CodeMirror-merge-pane-rightmost";
+
+    wrap.push(elt("div", null, null, "height: 0; clear: both;"));
+
+    var wrapElt = this.wrap = node.appendChild(elt("div", wrap, "CodeMirror-merge CodeMirror-merge-" + panes + "pane"));
+    this.edit = CodeMirror(editPane, copyObj(options));
+
+    if (left) left.init(leftPane, origLeft, options);
+    if (right) right.init(rightPane, origRight, options);
+    if (options.collapseIdentical)
+      this.editor().operation(function() {
+        collapseIdenticalStretches(self, options.collapseIdentical);
+      });
+    if (options.connect == "align") {
+      this.aligners = [];
+      alignChunks(this.left || this.right, true);
+    }
+    if (left) left.registerEvents(right)
+    if (right) right.registerEvents(left)
+
+
+    var onResize = function() {
+      if (left) makeConnections(left);
+      if (right) makeConnections(right);
+    };
+    CodeMirror.on(window, "resize", onResize);
+    var resizeInterval = setInterval(function() {
+      for (var p = wrapElt.parentNode; p && p != document.body; p = p.parentNode) {}
+      if (!p) { clearInterval(resizeInterval); CodeMirror.off(window, "resize", onResize); }
+    }, 5000);
+  };
+
+  function buildGap(dv) {
+    var lock = dv.lockButton = elt("div", null, "CodeMirror-merge-scrolllock");
+    lock.title = "Toggle locked scrolling";
+    var lockWrap = elt("div", [lock], "CodeMirror-merge-scrolllock-wrap");
+    CodeMirror.on(lock, "click", function() { setScrollLock(dv, !dv.lockScroll); });
+    var gapElts = [lockWrap];
+    if (dv.mv.options.revertButtons !== false) {
+      dv.copyButtons = elt("div", null, "CodeMirror-merge-copybuttons-" + dv.type);
+      CodeMirror.on(dv.copyButtons, "click", function(e) {
+        var node = e.target || e.srcElement;
+        if (!node.chunk) return;
+        if (node.className == "CodeMirror-merge-copy-reverse") {
+          copyChunk(dv, dv.orig, dv.edit, node.chunk);
+          return;
+        }
+        copyChunk(dv, dv.edit, dv.orig, node.chunk);
+      });
+      gapElts.unshift(dv.copyButtons);
+    }
+    if (dv.mv.options.connect != "align") {
+      var svg = document.createElementNS && document.createElementNS(svgNS, "svg");
+      if (svg && !svg.createSVGRect) svg = null;
+      dv.svg = svg;
+      if (svg) gapElts.push(svg);
+    }
+
+    return dv.gap = elt("div", gapElts, "CodeMirror-merge-gap");
+  }
+
+  MergeView.prototype = {
+    constructor: MergeView,
+    editor: function() { return this.edit; },
+    rightOriginal: function() { return this.right && this.right.orig; },
+    leftOriginal: function() { return this.left && this.left.orig; },
+    setShowDifferences: function(val) {
+      if (this.right) this.right.setShowDifferences(val);
+      if (this.left) this.left.setShowDifferences(val);
+    },
+    rightChunks: function() {
+      if (this.right) { ensureDiff(this.right); return this.right.chunks; }
+    },
+    leftChunks: function() {
+      if (this.left) { ensureDiff(this.left); return this.left.chunks; }
+    }
+  };
+
+  function asString(obj) {
+    if (typeof obj == "string") return obj;
+    else return obj.getValue();
+  }
+
+  // Operations on diffs
+
+  var dmp = new diff_match_patch();
+  function getDiff(a, b, ignoreWhitespace) {
+    var diff = dmp.diff_main(a, b);
+    // The library sometimes leaves in empty parts, which confuse the algorithm
+    for (var i = 0; i < diff.length; ++i) {
+      var part = diff[i];
+      if (ignoreWhitespace ? !/[^ \t]/.test(part[1]) : !part[1]) {
+        diff.splice(i--, 1);
+      } else if (i && diff[i - 1][0] == part[0]) {
+        diff.splice(i--, 1);
+        diff[i][1] += part[1];
+      }
+    }
+    return diff;
+  }
+
+  function getChunks(diff) {
+    var chunks = [];
+    var startEdit = 0, startOrig = 0;
+    var edit = Pos(0, 0), orig = Pos(0, 0);
+    for (var i = 0; i < diff.length; ++i) {
+      var part = diff[i], tp = part[0];
+      if (tp == DIFF_EQUAL) {
+        var startOff = !startOfLineClean(diff, i) || edit.line < startEdit || orig.line < startOrig ? 1 : 0;
+        var cleanFromEdit = edit.line + startOff, cleanFromOrig = orig.line + startOff;
+        moveOver(edit, part[1], null, orig);
+        var endOff = endOfLineClean(diff, i) ? 1 : 0;
+        var cleanToEdit = edit.line + endOff, cleanToOrig = orig.line + endOff;
+        if (cleanToEdit > cleanFromEdit) {
+          if (i) chunks.push({origFrom: startOrig, origTo: cleanFromOrig,
+                              editFrom: startEdit, editTo: cleanFromEdit});
+          startEdit = cleanToEdit; startOrig = cleanToOrig;
+        }
+      } else {
+        moveOver(tp == DIFF_INSERT ? edit : orig, part[1]);
+      }
+    }
+    if (startEdit <= edit.line || startOrig <= orig.line)
+      chunks.push({origFrom: startOrig, origTo: orig.line + 1,
+                   editFrom: startEdit, editTo: edit.line + 1});
+    return chunks;
+  }
+
+  function endOfLineClean(diff, i) {
+    if (i == diff.length - 1) return true;
+    var next = diff[i + 1][1];
+    if ((next.length == 1 && i < diff.length - 2) || next.charCodeAt(0) != 10) return false;
+    if (i == diff.length - 2) return true;
+    next = diff[i + 2][1];
+    return (next.length > 1 || i == diff.length - 3) && next.charCodeAt(0) == 10;
+  }
+
+  function startOfLineClean(diff, i) {
+    if (i == 0) return true;
+    var last = diff[i - 1][1];
+    if (last.charCodeAt(last.length - 1) != 10) return false;
+    if (i == 1) return true;
+    last = diff[i - 2][1];
+    return last.charCodeAt(last.length - 1) == 10;
+  }
+
+  function chunkBoundariesAround(chunks, n, nInEdit) {
+    var beforeE, afterE, beforeO, afterO;
+    for (var i = 0; i < chunks.length; i++) {
+      var chunk = chunks[i];
+      var fromLocal = nInEdit ? chunk.editFrom : chunk.origFrom;
+      var toLocal = nInEdit ? chunk.editTo : chunk.origTo;
+      if (afterE == null) {
+        if (fromLocal > n) { afterE = chunk.editFrom; afterO = chunk.origFrom; }
+        else if (toLocal > n) { afterE = chunk.editTo; afterO = chunk.origTo; }
+      }
+      if (toLocal <= n) { beforeE = chunk.editTo; beforeO = chunk.origTo; }
+      else if (fromLocal <= n) { beforeE = chunk.editFrom; beforeO = chunk.origFrom; }
+    }
+    return {edit: {before: beforeE, after: afterE}, orig: {before: beforeO, after: afterO}};
+  }
+
+  function collapseSingle(cm, from, to) {
+    cm.addLineClass(from, "wrap", "CodeMirror-merge-collapsed-line");
+    var widget = document.createElement("span");
+    widget.className = "CodeMirror-merge-collapsed-widget";
+    widget.title = "Identical text collapsed. Click to expand.";
+    var mark = cm.markText(Pos(from, 0), Pos(to - 1), {
+      inclusiveLeft: true,
+      inclusiveRight: true,
+      replacedWith: widget,
+      clearOnEnter: true
+    });
+    function clear() {
+      mark.clear();
+      cm.removeLineClass(from, "wrap", "CodeMirror-merge-collapsed-line");
+    }
+    CodeMirror.on(widget, "click", clear);
+    return {mark: mark, clear: clear};
+  }
+
+  function collapseStretch(size, editors) {
+    var marks = [];
+    function clear() {
+      for (var i = 0; i < marks.length; i++) marks[i].clear();
+    }
+    for (var i = 0; i < editors.length; i++) {
+      var editor = editors[i];
+      var mark = collapseSingle(editor.cm, editor.line, editor.line + size);
+      marks.push(mark);
+      mark.mark.on("clear", clear);
+    }
+    return marks[0].mark;
+  }
+
+  function unclearNearChunks(dv, margin, off, clear) {
+    for (var i = 0; i < dv.chunks.length; i++) {
+      var chunk = dv.chunks[i];
+      for (var l = chunk.editFrom - margin; l < chunk.editTo + margin; l++) {
+        var pos = l + off;
+        if (pos >= 0 && pos < clear.length) clear[pos] = false;
+      }
+    }
+  }
+
+  function collapseIdenticalStretches(mv, margin) {
+    if (typeof margin != "number") margin = 2;
+    var clear = [], edit = mv.editor(), off = edit.firstLine();
+    for (var l = off, e = edit.lastLine(); l <= e; l++) clear.push(true);
+    if (mv.left) unclearNearChunks(mv.left, margin, off, clear);
+    if (mv.right) unclearNearChunks(mv.right, margin, off, clear);
+
+    for (var i = 0; i < clear.length; i++) {
+      if (clear[i]) {
+        var line = i + off;
+        for (var size = 1; i < clear.length - 1 && clear[i + 1]; i++, size++) {}
+        if (size > margin) {
+          var editors = [{line: line, cm: edit}];
+          if (mv.left) editors.push({line: getMatchingOrigLine(line, mv.left.chunks), cm: mv.left.orig});
+          if (mv.right) editors.push({line: getMatchingOrigLine(line, mv.right.chunks), cm: mv.right.orig});
+          var mark = collapseStretch(size, editors);
+          if (mv.options.onCollapse) mv.options.onCollapse(mv, line, size, mark);
+        }
+      }
+    }
+  }
+
+  // General utilities
+
+  function elt(tag, content, className, style) {
+    var e = document.createElement(tag);
+    if (className) e.className = className;
+    if (style) e.style.cssText = style;
+    if (typeof content == "string") e.appendChild(document.createTextNode(content));
+    else if (content) for (var i = 0; i < content.length; ++i) e.appendChild(content[i]);
+    return e;
+  }
+
+  function clear(node) {
+    for (var count = node.childNodes.length; count > 0; --count)
+      node.removeChild(node.firstChild);
+  }
+
+  function attrs(elt) {
+    for (var i = 1; i < arguments.length; i += 2)
+      elt.setAttribute(arguments[i], arguments[i+1]);
+  }
+
+  function copyObj(obj, target) {
+    if (!target) target = {};
+    for (var prop in obj) if (obj.hasOwnProperty(prop)) target[prop] = obj[prop];
+    return target;
+  }
+
+  function moveOver(pos, str, copy, other) {
+    var out = copy ? Pos(pos.line, pos.ch) : pos, at = 0;
+    for (;;) {
+      var nl = str.indexOf("\n", at);
+      if (nl == -1) break;
+      ++out.line;
+      if (other) ++other.line;
+      at = nl + 1;
+    }
+    out.ch = (at ? 0 : out.ch) + (str.length - at);
+    if (other) other.ch = (at ? 0 : other.ch) + (str.length - at);
+    return out;
+  }
+
+  // Tracks collapsed markers and line widgets, in order to be able to
+  // accurately align the content of two editors.
+
+  var F_WIDGET = 1, F_WIDGET_BELOW = 2, F_MARKER = 4
+
+  function TrackAlignable(cm) {
+    this.cm = cm
+    this.alignable = []
+    this.height = cm.doc.height
+    var self = this
+    cm.on("markerAdded", function(_, marker) {
+      if (!marker.collapsed) return
+      var found = marker.find(1)
+      if (found != null) self.set(found.line, F_MARKER)
+    })
+    cm.on("markerCleared", function(_, marker, _min, max) {
+      if (max != null && marker.collapsed)
+        self.check(max, F_MARKER, self.hasMarker)
+    })
+    cm.on("markerChanged", this.signal.bind(this))
+    cm.on("lineWidgetAdded", function(_, widget, lineNo) {
+      if (widget.mergeSpacer) return
+      if (widget.above) self.set(lineNo - 1, F_WIDGET_BELOW)
+      else self.set(lineNo, F_WIDGET)
+    })
+    cm.on("lineWidgetCleared", function(_, widget, lineNo) {
+      if (widget.mergeSpacer) return
+      if (widget.above) self.check(lineNo - 1, F_WIDGET_BELOW, self.hasWidgetBelow)
+      else self.check(lineNo, F_WIDGET, self.hasWidget)
+    })
+    cm.on("lineWidgetChanged", this.signal.bind(this))
+    cm.on("change", function(_, change) {
+      var start = change.from.line, nBefore = change.to.line - change.from.line
+      var nAfter = change.text.length - 1, end = start + nAfter
+      if (nBefore || nAfter) self.map(start, nBefore, nAfter)
+      self.check(end, F_MARKER, self.hasMarker)
+      if (nBefore || nAfter) self.check(change.from.line, F_MARKER, self.hasMarker)
+    })
+    cm.on("viewportChange", function() {
+      if (self.cm.doc.height != self.height) self.signal()
+    })
+  }
+
+  TrackAlignable.prototype = {
+    signal: function() {
+      CodeMirror.signal(this, "realign")
+      this.height = this.cm.doc.height
+    },
+
+    set: function(n, flags) {
+      var pos = -1
+      for (; pos < this.alignable.length; pos += 2) {
+        var diff = this.alignable[pos] - n
+        if (diff == 0) {
+          if ((this.alignable[pos + 1] & flags) == flags) return
+          this.alignable[pos + 1] |= flags
+          this.signal()
+          return
+        }
+        if (diff > 0) break
+      }
+      this.signal()
+      this.alignable.splice(pos, 0, n, flags)
+    },
+
+    find: function(n) {
+      for (var i = 0; i < this.alignable.length; i += 2)
+        if (this.alignable[i] == n) return i
+      return -1
+    },
+
+    check: function(n, flag, pred) {
+      var found = this.find(n)
+      if (found == -1 || !(this.alignable[found + 1] & flag)) return
+      if (!pred.call(this, n)) {
+        this.signal()
+        var flags = this.alignable[found + 1] & ~flag
+        if (flags) this.alignable[found + 1] = flags
+        else this.alignable.splice(found, 2)
+      }
+    },
+
+    hasMarker: function(n) {
+      var handle = this.cm.getLineHandle(n)
+      if (handle.markedSpans) for (var i = 0; i < handle.markedSpans.length; i++)
+        if (handle.markedSpans[i].mark.collapsed && handle.markedSpans[i].to != null)
+          return true
+      return false
+    },
+
+    hasWidget: function(n) {
+      var handle = this.cm.getLineHandle(n)
+      if (handle.widgets) for (var i = 0; i < handle.widgets.length; i++)
+        if (!handle.widgets[i].above && !handle.widgets[i].mergeSpacer) return true
+      return false
+    },
+
+    hasWidgetBelow: function(n) {
+      if (n == this.cm.lastLine()) return false
+      var handle = this.cm.getLineHandle(n + 1)
+      if (handle.widgets) for (var i = 0; i < handle.widgets.length; i++)
+        if (handle.widgets[i].above && !handle.widgets[i].mergeSpacer) return true
+      return false
+    },
+
+    map: function(from, nBefore, nAfter) {
+      var diff = nAfter - nBefore, to = from + nBefore, widgetFrom = -1, widgetTo = -1
+      for (var i = 0; i < this.alignable.length; i += 2) {
+        var n = this.alignable[i]
+        if (n == from && (this.alignable[i + 1] & F_WIDGET_BELOW)) widgetFrom = i
+        if (n == to && (this.alignable[i + 1] & F_WIDGET_BELOW)) widgetTo = i
+        if (n <= from) continue
+        else if (n < to) this.alignable.splice(i--, 2)
+        else this.alignable[i] += diff
+      }
+      if (widgetFrom > -1) {
+        var flags = this.alignable[widgetFrom + 1]
+        if (flags == F_WIDGET_BELOW) this.alignable.splice(widgetFrom, 2)
+        else this.alignable[widgetFrom + 1] = flags & ~F_WIDGET_BELOW
+      }
+      if (widgetTo > -1 && nAfter)
+        this.set(from + nAfter, F_WIDGET_BELOW)
+    }
+  }
+
+  function posMin(a, b) { return (a.line - b.line || a.ch - b.ch) < 0 ? a : b; }
+  function posMax(a, b) { return (a.line - b.line || a.ch - b.ch) > 0 ? a : b; }
+  function posEq(a, b) { return a.line == b.line && a.ch == b.ch; }
+
+  function findPrevDiff(chunks, start, isOrig) {
+    for (var i = chunks.length - 1; i >= 0; i--) {
+      var chunk = chunks[i];
+      var to = (isOrig ? chunk.origTo : chunk.editTo) - 1;
+      if (to < start) return to;
+    }
+  }
+
+  function findNextDiff(chunks, start, isOrig) {
+    for (var i = 0; i < chunks.length; i++) {
+      var chunk = chunks[i];
+      var from = (isOrig ? chunk.origFrom : chunk.editFrom);
+      if (from > start) return from;
+    }
+  }
+
+  function goNearbyDiff(cm, dir) {
+    var found = null, views = cm.state.diffViews, line = cm.getCursor().line;
+    if (views) for (var i = 0; i < views.length; i++) {
+      var dv = views[i], isOrig = cm == dv.orig;
+      ensureDiff(dv);
+      var pos = dir < 0 ? findPrevDiff(dv.chunks, line, isOrig) : findNextDiff(dv.chunks, line, isOrig);
+      if (pos != null && (found == null || (dir < 0 ? pos > found : pos < found)))
+        found = pos;
+    }
+    if (found != null)
+      cm.setCursor(found, 0);
+    else
+      return CodeMirror.Pass;
+  }
+
+  CodeMirror.commands.goNextDiff = function(cm) {
+    return goNearbyDiff(cm, 1);
+  };
+  CodeMirror.commands.goPrevDiff = function(cm) {
+    return goNearbyDiff(cm, -1);
+  };
+});
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/vs/language/typescript/src/worker.js b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/vs/language/typescript/src/worker.js
new file mode 100644
index 0000000..e38b432
--- /dev/null
+++ b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/vs/language/typescript/src/worker.js
@@ -0,0 +1,18 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+define("vs/language/typescript/lib/lib-ts",[],function(){return{contents:'/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved. \nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0  \n \nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, \nMERCHANTABLITY OR NON-INFRINGEMENT. \n \nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\n/////////////////////////////\n/// ECMAScript APIs\n/////////////////////////////\n\ndeclare const NaN: number;\ndeclare const Infinity: number;\n\n/**\n  * Evaluates JavaScript code and executes it.\n  * @param x A String value that contains valid JavaScript code.\n  */\ndeclare function eval(x: string): any;\n\n/**\n  * Converts A string to an integer.\n  * @param s A string to convert into a number.\n  * @param radix A value between 2 and 36 that specifies the base of the number in numString.\n  * If this argument is not supplied, strings with a prefix of \'0x\' are considered hexadecimal.\n  * All other strings are considered decimal.\n  */\ndeclare function parseInt(s: string, radix?: number): number;\n\n/**\n  * Converts a string to a floating-point number.\n  * @param string A string that contains a floating-point number.\n  */\ndeclare function parseFloat(string: string): number;\n\n/**\n  * Returns a Boolean value that indicates whether a value is the reserved value NaN (not a number).\n  * @param number A numeric value.\n  */\ndeclare function isNaN(number: number): boolean;\n\n/**\n  * Determines whether a supplied number is finite.\n  * @param number Any numeric value.\n  */\ndeclare function isFinite(number: number): boolean;\n\n/**\n  * Gets the unencoded version of an encoded Uniform Resource Identifier (URI).\n  * @param encodedURI A value representing an encoded URI.\n  */\ndeclare function decodeURI(encodedURI: string): string;\n\n/**\n  * Gets the unencoded version of an encoded component of a Uniform Resource Identifier (URI).\n  * @param encodedURIComponent A value representing an encoded URI component.\n  */\ndeclare function decodeURIComponent(encodedURIComponent: string): string;\n\n/**\n  * Encodes a text string as a valid Uniform Resource Identifier (URI)\n  * @param uri A value representing an encoded URI.\n  */\ndeclare function encodeURI(uri: string): string;\n\n/**\n  * Encodes a text string as a valid component of a Uniform Resource Identifier (URI).\n  * @param uriComponent A value representing an encoded URI component.\n  */\ndeclare function encodeURIComponent(uriComponent: string): string;\n\ninterface PropertyDescriptor {\n    configurable?: boolean;\n    enumerable?: boolean;\n    value?: any;\n    writable?: boolean;\n    get?(): any;\n    set?(v: any): void;\n}\n\ninterface PropertyDescriptorMap {\n    [s: string]: PropertyDescriptor;\n}\n\ninterface Object {\n    /** The initial value of Object.prototype.constructor is the standard built-in Object constructor. */\n    constructor: Function;\n\n    /** Returns a string representation of an object. */\n    toString(): string;\n\n    /** Returns a date converted to a string using the current locale. */\n    toLocaleString(): string;\n\n    /** Returns the primitive value of the specified object. */\n    valueOf(): Object;\n\n    /**\n      * Determines whether an object has a property with the specified name.\n      * @param v A property name.\n      */\n    hasOwnProperty(v: string): boolean;\n\n    /**\n      * Determines whether an object exists in another object\'s prototype chain.\n      * @param v Another object whose prototype chain is to be checked.\n      */\n    isPrototypeOf(v: Object): boolean;\n\n    /**\n      * Determines whether a specified property is enumerable.\n      * @param v A property name.\n      */\n    propertyIsEnumerable(v: string): boolean;\n}\n\ninterface ObjectConstructor {\n    new(value?: any): Object;\n    (): any;\n    (value: any): any;\n\n    /** A reference to the prototype for a class of objects. */\n    readonly prototype: Object;\n\n    /**\n      * Returns the prototype of an object.\n      * @param o The object that references the prototype.\n      */\n    getPrototypeOf(o: any): any;\n\n    /**\n      * Gets the own property descriptor of the specified object.\n      * An own property descriptor is one that is defined directly on the object and is not inherited from the object\'s prototype.\n      * @param o Object that contains the property.\n      * @param p Name of the property.\n    */\n    getOwnPropertyDescriptor(o: any, p: string): PropertyDescriptor;\n\n    /**\n      * Returns the names of the own properties of an object. The own properties of an object are those that are defined directly\n      * on that object, and are not inherited from the object\'s prototype. The properties of an object include both fields (objects) and functions.\n      * @param o Object that contains the own properties.\n      */\n    getOwnPropertyNames(o: any): string[];\n\n    /**\n      * Creates an object that has the specified prototype or that has null prototype.\n      * @param o Object to use as a prototype. May be null.\n      */\n    create(o: object | null): any;\n\n    /**\n      * Creates an object that has the specified prototype, and that optionally contains specified properties.\n      * @param o Object to use as a prototype. May be null\n      * @param properties JavaScript object that contains one or more property descriptors.\n      */\n    create(o: object | null, properties: PropertyDescriptorMap & ThisType<any>): any;\n\n    /**\n      * Adds a property to an object, or modifies attributes of an existing property.\n      * @param o Object on which to add or modify the property. This can be a native JavaScript object (that is, a user-defined object or a built in object) or a DOM object.\n      * @param p The property name.\n      * @param attributes Descriptor for the property. It can be for a data property or an accessor property.\n      */\n    defineProperty(o: any, p: string, attributes: PropertyDescriptor & ThisType<any>): any;\n\n    /**\n      * Adds one or more properties to an object, and/or modifies attributes of existing properties.\n      * @param o Object on which to add or modify the properties. This can be a native JavaScript object or a DOM object.\n      * @param properties JavaScript object that contains one or more descriptor objects. Each descriptor object describes a data property or an accessor property.\n      */\n    defineProperties(o: any, properties: PropertyDescriptorMap & ThisType<any>): any;\n\n    /**\n      * Prevents the modification of attributes of existing properties, and prevents the addition of new properties.\n      * @param o Object on which to lock the attributes.\n      */\n    seal<T>(o: T): T;\n\n    /**\n      * Prevents the modification of existing property attributes and values, and prevents the addition of new properties.\n      * @param o Object on which to lock the attributes.\n      */\n    freeze<T>(a: T[]): ReadonlyArray<T>;\n\n    /**\n      * Prevents the modification of existing property attributes and values, and prevents the addition of new properties.\n      * @param o Object on which to lock the attributes.\n      */\n    freeze<T extends Function>(f: T): T;\n\n    /**\n      * Prevents the modification of existing property attributes and values, and prevents the addition of new properties.\n      * @param o Object on which to lock the attributes.\n      */\n    freeze<T>(o: T): Readonly<T>;\n\n    /**\n      * Prevents the addition of new properties to an object.\n      * @param o Object to make non-extensible.\n      */\n    preventExtensions<T>(o: T): T;\n\n    /**\n      * Returns true if existing property attributes cannot be modified in an object and new properties cannot be added to the object.\n      * @param o Object to test.\n      */\n    isSealed(o: any): boolean;\n\n    /**\n      * Returns true if existing property attributes and values cannot be modified in an object, and new properties cannot be added to the object.\n      * @param o Object to test.\n      */\n    isFrozen(o: any): boolean;\n\n    /**\n      * Returns a value that indicates whether new properties can be added to an object.\n      * @param o Object to test.\n      */\n    isExtensible(o: any): boolean;\n\n    /**\n      * Returns the names of the enumerable properties and methods of an object.\n      * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.\n      */\n    keys(o: any): string[];\n}\n\n/**\n  * Provides functionality common to all JavaScript objects.\n  */\ndeclare const Object: ObjectConstructor;\n\n/**\n  * Creates a new function.\n  */\ninterface Function {\n    /**\n      * Calls the function, substituting the specified object for the this value of the function, and the specified array for the arguments of the function.\n      * @param thisArg The object to be used as the this object.\n      * @param argArray A set of arguments to be passed to the function.\n      */\n    apply(this: Function, thisArg: any, argArray?: any): any;\n\n    /**\n      * Calls a method of an object, substituting another object for the current object.\n      * @param thisArg The object to be used as the current object.\n      * @param argArray A list of arguments to be passed to the method.\n      */\n    call(this: Function, thisArg: any, ...argArray: any[]): any;\n\n    /**\n      * For a given function, creates a bound function that has the same body as the original function.\n      * The this object of the bound function is associated with the specified object, and has the specified initial parameters.\n      * @param thisArg An object to which the this keyword can refer inside the new function.\n      * @param argArray A list of arguments to be passed to the new function.\n      */\n    bind(this: Function, thisArg: any, ...argArray: any[]): any;\n\n    /** Returns a string representation of a function. */\n    toString(): string;\n\n    prototype: any;\n    readonly length: number;\n\n    // Non-standard extensions\n    arguments: any;\n    caller: Function;\n}\n\ninterface FunctionConstructor {\n    /**\n      * Creates a new function.\n      * @param args A list of arguments the function accepts.\n      */\n    new(...args: string[]): Function;\n    (...args: string[]): Function;\n    readonly prototype: Function;\n}\n\ndeclare const Function: FunctionConstructor;\n\ninterface IArguments {\n    [index: number]: any;\n    length: number;\n    callee: Function;\n}\n\ninterface String {\n    /** Returns a string representation of a string. */\n    toString(): string;\n\n    /**\n      * Returns the character at the specified index.\n      * @param pos The zero-based index of the desired character.\n      */\n    charAt(pos: number): string;\n\n    /**\n      * Returns the Unicode value of the character at the specified location.\n      * @param index The zero-based index of the desired character. If there is no character at the specified index, NaN is returned.\n      */\n    charCodeAt(index: number): number;\n\n    /**\n      * Returns a string that contains the concatenation of two or more strings.\n      * @param strings The strings to append to the end of the string.\n      */\n    concat(...strings: string[]): string;\n\n    /**\n      * Returns the position of the first occurrence of a substring.\n      * @param searchString The substring to search for in the string\n      * @param position The index at which to begin searching the String object. If omitted, search starts at the beginning of the string.\n      */\n    indexOf(searchString: string, position?: number): number;\n\n    /**\n      * Returns the last occurrence of a substring in the string.\n      * @param searchString The substring to search for.\n      * @param position The index at which to begin searching. If omitted, the search begins at the end of the string.\n      */\n    lastIndexOf(searchString: string, position?: number): number;\n\n    /**\n      * Determines whether two strings are equivalent in the current locale.\n      * @param that String to compare to target string\n      */\n    localeCompare(that: string): number;\n\n    /**\n      * Matches a string with a regular expression, and returns an array containing the results of that search.\n      * @param regexp A variable name or string literal containing the regular expression pattern and flags.\n      */\n    match(regexp: string | RegExp): RegExpMatchArray | null;\n\n    /**\n      * Replaces text in a string, using a regular expression or search string.\n      * @param searchValue A string to search for.\n      * @param replaceValue A string containing the text to replace for every successful match of searchValue in this string.\n      */\n    replace(searchValue: string | RegExp, replaceValue: string): string;\n\n    /**\n      * Replaces text in a string, using a regular expression or search string.\n      * @param searchValue A string to search for.\n      * @param replacer A function that returns the replacement text.\n      */\n    replace(searchValue: string | RegExp, replacer: (substring: string, ...args: any[]) => string): string;\n\n    /**\n      * Finds the first substring match in a regular expression search.\n      * @param regexp The regular expression pattern and applicable flags.\n      */\n    search(regexp: string | RegExp): number;\n\n    /**\n      * Returns a section of a string.\n      * @param start The index to the beginning of the specified portion of stringObj.\n      * @param end The index to the end of the specified portion of stringObj. The substring includes the characters up to, but not including, the character indicated by end.\n      * If this value is not specified, the substring continues to the end of stringObj.\n      */\n    slice(start?: number, end?: number): string;\n\n    /**\n      * Split a string into substrings using the specified separator and return them as an array.\n      * @param separator A string that identifies character or characters to use in separating the string. If omitted, a single-element array containing the entire string is returned.\n      * @param limit A value used to limit the number of elements returned in the array.\n      */\n    split(separator: string | RegExp, limit?: number): string[];\n\n    /**\n      * Returns the substring at the specified location within a String object.\n      * @param start The zero-based index number indicating the beginning of the substring.\n      * @param end Zero-based index number indicating the end of the substring. The substring includes the characters up to, but not including, the character indicated by end.\n      * If end is omitted, the characters from start through the end of the original string are returned.\n      */\n    substring(start: number, end?: number): string;\n\n    /** Converts all the alphabetic characters in a string to lowercase. */\n    toLowerCase(): string;\n\n    /** Converts all alphabetic characters to lowercase, taking into account the host environment\'s current locale. */\n    toLocaleLowerCase(): string;\n\n    /** Converts all the alphabetic characters in a string to uppercase. */\n    toUpperCase(): string;\n\n    /** Returns a string where all alphabetic characters have been converted to uppercase, taking into account the host environment\'s current locale. */\n    toLocaleUpperCase(): string;\n\n    /** Removes the leading and trailing white space and line terminator characters from a string. */\n    trim(): string;\n\n    /** Returns the length of a String object. */\n    readonly length: number;\n\n    // IE extensions\n    /**\n      * Gets a substring beginning at the specified location and having the specified length.\n      * @param from The starting position of the desired substring. The index of the first character in the string is zero.\n      * @param length The number of characters to include in the returned substring.\n      */\n    substr(from: number, length?: number): string;\n\n    /** Returns the primitive value of the specified object. */\n    valueOf(): string;\n\n    readonly [index: number]: string;\n}\n\ninterface StringConstructor {\n    new(value?: any): String;\n    (value?: any): string;\n    readonly prototype: String;\n    fromCharCode(...codes: number[]): string;\n}\n\n/**\n  * Allows manipulation and formatting of text strings and determination and location of substrings within strings.\n  */\ndeclare const String: StringConstructor;\n\ninterface Boolean {\n    /** Returns the primitive value of the specified object. */\n    valueOf(): boolean;\n}\n\ninterface BooleanConstructor {\n    new(value?: any): Boolean;\n    (value?: any): boolean;\n    readonly prototype: Boolean;\n}\n\ndeclare const Boolean: BooleanConstructor;\n\ninterface Number {\n    /**\n      * Returns a string representation of an object.\n      * @param radix Specifies a radix for converting numeric values to strings. This value is only used for numbers.\n      */\n    toString(radix?: number): string;\n\n    /**\n      * Returns a string representing a number in fixed-point notation.\n      * @param fractionDigits Number of digits after the decimal point. Must be in the range 0 - 20, inclusive.\n      */\n    toFixed(fractionDigits?: number): string;\n\n    /**\n      * Returns a string containing a number represented in exponential notation.\n      * @param fractionDigits Number of digits after the decimal point. Must be in the range 0 - 20, inclusive.\n      */\n    toExponential(fractionDigits?: number): string;\n\n    /**\n      * Returns a string containing a number represented either in exponential or fixed-point notation with a specified number of digits.\n      * @param precision Number of significant digits. Must be in the range 1 - 21, inclusive.\n      */\n    toPrecision(precision?: number): string;\n\n    /** Returns the primitive value of the specified object. */\n    valueOf(): number;\n}\n\ninterface NumberConstructor {\n    new(value?: any): Number;\n    (value?: any): number;\n    readonly prototype: Number;\n\n    /** The largest number that can be represented in JavaScript. Equal to approximately 1.79E+308. */\n    readonly MAX_VALUE: number;\n\n    /** The closest number to zero that can be represented in JavaScript. Equal to approximately 5.00E-324. */\n    readonly MIN_VALUE: number;\n\n    /**\n      * A value that is not a number.\n      * In equality comparisons, NaN does not equal any value, including itself. To test whether a value is equivalent to NaN, use the isNaN function.\n      */\n    readonly NaN: number;\n\n    /**\n      * A value that is less than the largest negative number that can be represented in JavaScript.\n      * JavaScript displays NEGATIVE_INFINITY values as -infinity.\n      */\n    readonly NEGATIVE_INFINITY: number;\n\n    /**\n      * A value greater than the largest number that can be represented in JavaScript.\n      * JavaScript displays POSITIVE_INFINITY values as infinity.\n      */\n    readonly POSITIVE_INFINITY: number;\n}\n\n/** An object that represents a number of any kind. All JavaScript numbers are 64-bit floating-point numbers. */\ndeclare const Number: NumberConstructor;\n\ninterface TemplateStringsArray extends ReadonlyArray<string> {\n    readonly raw: ReadonlyArray<string>;\n}\n\ninterface Math {\n    /** The mathematical constant e. This is Euler\'s number, the base of natural logarithms. */\n    readonly E: number;\n    /** The natural logarithm of 10. */\n    readonly LN10: number;\n    /** The natural logarithm of 2. */\n    readonly LN2: number;\n    /** The base-2 logarithm of e. */\n    readonly LOG2E: number;\n    /** The base-10 logarithm of e. */\n    readonly LOG10E: number;\n    /** Pi. This is the ratio of the circumference of a circle to its diameter. */\n    readonly PI: number;\n    /** The square root of 0.5, or, equivalently, one divided by the square root of 2. */\n    readonly SQRT1_2: number;\n    /** The square root of 2. */\n    readonly SQRT2: number;\n    /**\n      * Returns the absolute value of a number (the value without regard to whether it is positive or negative).\n      * For example, the absolute value of -5 is the same as the absolute value of 5.\n      * @param x A numeric expression for which the absolute value is needed.\n      */\n    abs(x: number): number;\n    /**\n      * Returns the arc cosine (or inverse cosine) of a number.\n      * @param x A numeric expression.\n      */\n    acos(x: number): number;\n    /**\n      * Returns the arcsine of a number.\n      * @param x A numeric expression.\n      */\n    asin(x: number): number;\n    /**\n      * Returns the arctangent of a number.\n      * @param x A numeric expression for which the arctangent is needed.\n      */\n    atan(x: number): number;\n    /**\n      * Returns the angle (in radians) from the X axis to a point.\n      * @param y A numeric expression representing the cartesian y-coordinate.\n      * @param x A numeric expression representing the cartesian x-coordinate.\n      */\n    atan2(y: number, x: number): number;\n    /**\n      * Returns the smallest number greater than or equal to its numeric argument.\n      * @param x A numeric expression.\n      */\n    ceil(x: number): number;\n    /**\n      * Returns the cosine of a number.\n      * @param x A numeric expression that contains an angle measured in radians.\n      */\n    cos(x: number): number;\n    /**\n      * Returns e (the base of natural logarithms) raised to a power.\n      * @param x A numeric expression representing the power of e.\n      */\n    exp(x: number): number;\n    /**\n      * Returns the greatest number less than or equal to its numeric argument.\n      * @param x A numeric expression.\n      */\n    floor(x: number): number;\n    /**\n      * Returns the natural logarithm (base e) of a number.\n      * @param x A numeric expression.\n      */\n    log(x: number): number;\n    /**\n      * Returns the larger of a set of supplied numeric expressions.\n      * @param values Numeric expressions to be evaluated.\n      */\n    max(...values: number[]): number;\n    /**\n      * Returns the smaller of a set of supplied numeric expressions.\n      * @param values Numeric expressions to be evaluated.\n      */\n    min(...values: number[]): number;\n    /**\n      * Returns the value of a base expression taken to a specified power.\n      * @param x The base value of the expression.\n      * @param y The exponent value of the expression.\n      */\n    pow(x: number, y: number): number;\n    /** Returns a pseudorandom number between 0 and 1. */\n    random(): number;\n    /**\n      * Returns a supplied numeric expression rounded to the nearest number.\n      * @param x The value to be rounded to the nearest number.\n      */\n    round(x: number): number;\n    /**\n      * Returns the sine of a number.\n      * @param x A numeric expression that contains an angle measured in radians.\n      */\n    sin(x: number): number;\n    /**\n      * Returns the square root of a number.\n      * @param x A numeric expression.\n      */\n    sqrt(x: number): number;\n    /**\n      * Returns the tangent of a number.\n      * @param x A numeric expression that contains an angle measured in radians.\n      */\n    tan(x: number): number;\n}\n/** An intrinsic object that provides basic mathematics functionality and constants. */\ndeclare const Math: Math;\n\n/** Enables basic storage and retrieval of dates and times. */\ninterface Date {\n    /** Returns a string representation of a date. The format of the string depends on the locale. */\n    toString(): string;\n    /** Returns a date as a string value. */\n    toDateString(): string;\n    /** Returns a time as a string value. */\n    toTimeString(): string;\n    /** Returns a value as a string value appropriate to the host environment\'s current locale. */\n    toLocaleString(): string;\n    /** Returns a date as a string value appropriate to the host environment\'s current locale. */\n    toLocaleDateString(): string;\n    /** Returns a time as a string value appropriate to the host environment\'s current locale. */\n    toLocaleTimeString(): string;\n    /** Returns the stored time value in milliseconds since midnight, January 1, 1970 UTC. */\n    valueOf(): number;\n    /** Gets the time value in milliseconds. */\n    getTime(): number;\n    /** Gets the year, using local time. */\n    getFullYear(): number;\n    /** Gets the year using Universal Coordinated Time (UTC). */\n    getUTCFullYear(): number;\n    /** Gets the month, using local time. */\n    getMonth(): number;\n    /** Gets the month of a Date object using Universal Coordinated Time (UTC). */\n    getUTCMonth(): number;\n    /** Gets the day-of-the-month, using local time. */\n    getDate(): number;\n    /** Gets the day-of-the-month, using Universal Coordinated Time (UTC). */\n    getUTCDate(): number;\n    /** Gets the day of the week, using local time. */\n    getDay(): number;\n    /** Gets the day of the week using Universal Coordinated Time (UTC). */\n    getUTCDay(): number;\n    /** Gets the hours in a date, using local time. */\n    getHours(): number;\n    /** Gets the hours value in a Date object using Universal Coordinated Time (UTC). */\n    getUTCHours(): number;\n    /** Gets the minutes of a Date object, using local time. */\n    getMinutes(): number;\n    /** Gets the minutes of a Date object using Universal Coordinated Time (UTC). */\n    getUTCMinutes(): number;\n    /** Gets the seconds of a Date object, using local time. */\n    getSeconds(): number;\n    /** Gets the seconds of a Date object using Universal Coordinated Time (UTC). */\n    getUTCSeconds(): number;\n    /** Gets the milliseconds of a Date, using local time. */\n    getMilliseconds(): number;\n    /** Gets the milliseconds of a Date object using Universal Coordinated Time (UTC). */\n    getUTCMilliseconds(): number;\n    /** Gets the difference in minutes between the time on the local computer and Universal Coordinated Time (UTC). */\n    getTimezoneOffset(): number;\n    /**\n      * Sets the date and time value in the Date object.\n      * @param time A numeric value representing the number of elapsed milliseconds since midnight, January 1, 1970 GMT.\n      */\n    setTime(time: number): number;\n    /**\n      * Sets the milliseconds value in the Date object using local time.\n      * @param ms A numeric value equal to the millisecond value.\n      */\n    setMilliseconds(ms: number): number;\n    /**\n      * Sets the milliseconds value in the Date object using Universal Coordinated Time (UTC).\n      * @param ms A numeric value equal to the millisecond value.\n      */\n    setUTCMilliseconds(ms: number): number;\n\n    /**\n      * Sets the seconds value in the Date object using local time.\n      * @param sec A numeric value equal to the seconds value.\n      * @param ms A numeric value equal to the milliseconds value.\n      */\n    setSeconds(sec: number, ms?: number): number;\n    /**\n      * Sets the seconds value in the Date object using Universal Coordinated Time (UTC).\n      * @param sec A numeric value equal to the seconds value.\n      * @param ms A numeric value equal to the milliseconds value.\n      */\n    setUTCSeconds(sec: number, ms?: number): number;\n    /**\n      * Sets the minutes value in the Date object using local time.\n      * @param min A numeric value equal to the minutes value.\n      * @param sec A numeric value equal to the seconds value.\n      * @param ms A numeric value equal to the milliseconds value.\n      */\n    setMinutes(min: number, sec?: number, ms?: number): number;\n    /**\n      * Sets the minutes value in the Date object using Universal Coordinated Time (UTC).\n      * @param min A numeric value equal to the minutes value.\n      * @param sec A numeric value equal to the seconds value.\n      * @param ms A numeric value equal to the milliseconds value.\n      */\n    setUTCMinutes(min: number, sec?: number, ms?: number): number;\n    /**\n      * Sets the hour value in the Date object using local time.\n      * @param hours A numeric value equal to the hours value.\n      * @param min A numeric value equal to the minutes value.\n      * @param sec A numeric value equal to the seconds value.\n      * @param ms A numeric value equal to the milliseconds value.\n      */\n    setHours(hours: number, min?: number, sec?: number, ms?: number): number;\n    /**\n      * Sets the hours value in the Date object using Universal Coordinated Time (UTC).\n      * @param hours A numeric value equal to the hours value.\n      * @param min A numeric value equal to the minutes value.\n      * @param sec A numeric value equal to the seconds value.\n      * @param ms A numeric value equal to the milliseconds value.\n      */\n    setUTCHours(hours: number, min?: number, sec?: number, ms?: number): number;\n    /**\n      * Sets the numeric day-of-the-month value of the Date object using local time.\n      * @param date A numeric value equal to the day of the month.\n      */\n    setDate(date: number): number;\n    /**\n      * Sets the numeric day of the month in the Date object using Universal Coordinated Time (UTC).\n      * @param date A numeric value equal to the day of the month.\n      */\n    setUTCDate(date: number): number;\n    /**\n      * Sets the month value in the Date object using local time.\n      * @param month A numeric value equal to the month. The value for January is 0, and other month values follow consecutively.\n      * @param date A numeric value representing the day of the month. If this value is not supplied, the value from a call to the getDate method is used.\n      */\n    setMonth(month: number, date?: number): number;\n    /**\n      * Sets the month value in the Date object using Universal Coordinated Time (UTC).\n      * @param month A numeric value equal to the month. The value for January is 0, and other month values follow consecutively.\n      * @param date A numeric value representing the day of the month. If it is not supplied, the value from a call to the getUTCDate method is used.\n      */\n    setUTCMonth(month: number, date?: number): number;\n    /**\n      * Sets the year of the Date object using local time.\n      * @param year A numeric value for the year.\n      * @param month A zero-based numeric value for the month (0 for January, 11 for December). Must be specified if numDate is specified.\n      * @param date A numeric value equal for the day of the month.\n      */\n    setFullYear(year: number, month?: number, date?: number): number;\n    /**\n      * Sets the year value in the Date object using Universal Coordinated Time (UTC).\n      * @param year A numeric value equal to the year.\n      * @param month A numeric value equal to the month. The value for January is 0, and other month values follow consecutively. Must be supplied if numDate is supplied.\n      * @param date A numeric value equal to the day of the month.\n      */\n    setUTCFullYear(year: number, month?: number, date?: number): number;\n    /** Returns a date converted to a string using Universal Coordinated Time (UTC). */\n    toUTCString(): string;\n    /** Returns a date as a string value in ISO format. */\n    toISOString(): string;\n    /** Used by the JSON.stringify method to enable the transformation of an object\'s data for JavaScript Object Notation (JSON) serialization. */\n    toJSON(key?: any): string;\n}\n\ninterface DateConstructor {\n    new(): Date;\n    new(value: number): Date;\n    new(value: string): Date;\n    new(year: number, month: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): Date;\n    (): string;\n    readonly prototype: Date;\n    /**\n      * Parses a string containing a date, and returns the number of milliseconds between that date and midnight, January 1, 1970.\n      * @param s A date string\n      */\n    parse(s: string): number;\n    /**\n      * Returns the number of milliseconds between midnight, January 1, 1970 Universal Coordinated Time (UTC) (or GMT) and the specified date.\n      * @param year The full year designation is required for cross-century date accuracy. If year is between 0 and 99 is used, then year is assumed to be 1900 + year.\n      * @param month The month as an number between 0 and 11 (January to December).\n      * @param date The date as an number between 1 and 31.\n      * @param hours Must be supplied if minutes is supplied. An number from 0 to 23 (midnight to 11pm) that specifies the hour.\n      * @param minutes Must be supplied if seconds is supplied. An number from 0 to 59 that specifies the minutes.\n      * @param seconds Must be supplied if milliseconds is supplied. An number from 0 to 59 that specifies the seconds.\n      * @param ms An number from 0 to 999 that specifies the milliseconds.\n      */\n    UTC(year: number, month: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): number;\n    now(): number;\n}\n\ndeclare const Date: DateConstructor;\n\ninterface RegExpMatchArray extends Array<string> {\n    index?: number;\n    input?: string;\n}\n\ninterface RegExpExecArray extends Array<string> {\n    index: number;\n    input: string;\n}\n\ninterface RegExp {\n    /**\n      * Executes a search on a string using a regular expression pattern, and returns an array containing the results of that search.\n      * @param string The String object or string literal on which to perform the search.\n      */\n    exec(string: string): RegExpExecArray | null;\n\n    /**\n      * Returns a Boolean value that indicates whether or not a pattern exists in a searched string.\n      * @param string String on which to perform the search.\n      */\n    test(string: string): boolean;\n\n    /** Returns a copy of the text of the regular expression pattern. Read-only. The regExp argument is a Regular expression object. It can be a variable name or a literal. */\n    readonly source: string;\n\n    /** Returns a Boolean value indicating the state of the global flag (g) used with a regular expression. Default is false. Read-only. */\n    readonly global: boolean;\n\n    /** Returns a Boolean value indicating the state of the ignoreCase flag (i) used with a regular expression. Default is false. Read-only. */\n    readonly ignoreCase: boolean;\n\n    /** Returns a Boolean value indicating the state of the multiline flag (m) used with a regular expression. Default is false. Read-only. */\n    readonly multiline: boolean;\n\n    lastIndex: number;\n\n    // Non-standard extensions\n    compile(): this;\n}\n\ninterface RegExpConstructor {\n    new(pattern: RegExp | string): RegExp;\n    new(pattern: string, flags?: string): RegExp;\n    (pattern: RegExp | string): RegExp;\n    (pattern: string, flags?: string): RegExp;\n    readonly prototype: RegExp;\n\n    // Non-standard extensions\n    $1: string;\n    $2: string;\n    $3: string;\n    $4: string;\n    $5: string;\n    $6: string;\n    $7: string;\n    $8: string;\n    $9: string;\n    lastMatch: string;\n}\n\ndeclare const RegExp: RegExpConstructor;\n\ninterface Error {\n    name: string;\n    message: string;\n    stack?: string;\n}\n\ninterface ErrorConstructor {\n    new(message?: string): Error;\n    (message?: string): Error;\n    readonly prototype: Error;\n}\n\ndeclare const Error: ErrorConstructor;\n\ninterface EvalError extends Error {\n}\n\ninterface EvalErrorConstructor {\n    new(message?: string): EvalError;\n    (message?: string): EvalError;\n    readonly prototype: EvalError;\n}\n\ndeclare const EvalError: EvalErrorConstructor;\n\ninterface RangeError extends Error {\n}\n\ninterface RangeErrorConstructor {\n    new(message?: string): RangeError;\n    (message?: string): RangeError;\n    readonly prototype: RangeError;\n}\n\ndeclare const RangeError: RangeErrorConstructor;\n\ninterface ReferenceError extends Error {\n}\n\ninterface ReferenceErrorConstructor {\n    new(message?: string): ReferenceError;\n    (message?: string): ReferenceError;\n    readonly prototype: ReferenceError;\n}\n\ndeclare const ReferenceError: ReferenceErrorConstructor;\n\ninterface SyntaxError extends Error {\n}\n\ninterface SyntaxErrorConstructor {\n    new(message?: string): SyntaxError;\n    (message?: string): SyntaxError;\n    readonly prototype: SyntaxError;\n}\n\ndeclare const SyntaxError: SyntaxErrorConstructor;\n\ninterface TypeError extends Error {\n}\n\ninterface TypeErrorConstructor {\n    new(message?: string): TypeError;\n    (message?: string): TypeError;\n    readonly prototype: TypeError;\n}\n\ndeclare const TypeError: TypeErrorConstructor;\n\ninterface URIError extends Error {\n}\n\ninterface URIErrorConstructor {\n    new(message?: string): URIError;\n    (message?: string): URIError;\n    readonly prototype: URIError;\n}\n\ndeclare const URIError: URIErrorConstructor;\n\ninterface JSON {\n    /**\n      * Converts a JavaScript Object Notation (JSON) string into an object.\n      * @param text A valid JSON string.\n      * @param reviver A function that transforms the results. This function is called for each member of the object.\n      * If a member contains nested objects, the nested objects are transformed before the parent object is.\n      */\n    parse(text: string, reviver?: (key: any, value: any) => any): any;\n    /**\n      * Converts a JavaScript value to a JavaScript Object Notation (JSON) string.\n      * @param value A JavaScript value, usually an object or array, to be converted.\n      * @param replacer A function that transforms the results.\n      * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.\n      */\n    stringify(value: any, replacer?: (key: string, value: any) => any, space?: string | number): string;\n    /**\n      * Converts a JavaScript value to a JavaScript Object Notation (JSON) string.\n      * @param value A JavaScript value, usually an object or array, to be converted.\n      * @param replacer An array of strings and numbers that acts as a approved list for selecting the object properties that will be stringified.\n      * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.\n      */\n    stringify(value: any, replacer?: (number | string)[] | null, space?: string | number): string;\n}\n\n/**\n  * An intrinsic object that provides functions to convert JavaScript values to and from the JavaScript Object Notation (JSON) format.\n  */\ndeclare const JSON: JSON;\n\n\n/////////////////////////////\n/// ECMAScript Array API (specially handled by compiler)\n/////////////////////////////\n\ninterface ReadonlyArray<T> {\n    /**\n      * Gets the length of the array. This is a number one higher than the highest element defined in an array.\n      */\n    readonly length: number;\n    /**\n      * Returns a string representation of an array.\n      */\n    toString(): string;\n    /**\n      * Returns a string representation of an array. The elements are converted to string using thier toLocalString methods.\n      */\n    toLocaleString(): string;\n    /**\n      * Combines two or more arrays.\n      * @param items Additional items to add to the end of array1.\n      */\n    concat(...items: T[][]): T[];\n    /**\n      * Combines two or more arrays.\n      * @param items Additional items to add to the end of array1.\n      */\n    concat(...items: (T | T[])[]): T[];\n    /**\n      * Adds all the elements of an array separated by the specified separator string.\n      * @param separator A string used to separate one element of an array from the next in the resulting String. If omitted, the array elements are separated with a comma.\n      */\n    join(separator?: string): string;\n    /**\n      * Returns a section of an array.\n      * @param start The beginning of the specified portion of the array.\n      * @param end The end of the specified portion of the array.\n      */\n    slice(start?: number, end?: number): T[];\n    /**\n      * Returns the index of the first occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0.\n      */\n    indexOf(searchElement: T, fromIndex?: number): number;\n    /**\n      * Returns the index of the last occurrence of a specified value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at the last index in the array.\n      */\n    lastIndexOf(searchElement: T, fromIndex?: number): number;\n    /**\n      * Determines whether all the members of an array satisfy the specified test.\n      * @param callbackfn A function that accepts up to three arguments. The every method calls the callbackfn function for each element in array1 until the callbackfn returns false, or until the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n      */\n    every(callbackfn: (value: T, index: number, array: ReadonlyArray<T>) => boolean, thisArg?: any): boolean;\n    /**\n      * Determines whether the specified callback function returns true for any element of an array.\n      * @param callbackfn A function that accepts up to three arguments. The some method calls the callbackfn function for each element in array1 until the callbackfn returns true, or until the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n      */\n    some(callbackfn: (value: T, index: number, array: ReadonlyArray<T>) => boolean, thisArg?: any): boolean;\n    /**\n      * Performs the specified action for each element in an array.\n      * @param callbackfn  A function that accepts up to three arguments. forEach calls the callbackfn function one time for each element in the array.\n      * @param thisArg  An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n      */\n    forEach(callbackfn: (value: T, index: number, array: ReadonlyArray<T>) => void, thisArg?: any): void;\n    /**\n      * Calls a defined callback function on each element of an array, and returns an array that contains the results.\n      * @param callbackfn A function that accepts up to three arguments. The map method calls the callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n      */\n    map<U>(callbackfn: (value: T, index: number, array: ReadonlyArray<T>) => U, thisArg?: any): U[];\n    /**\n     * Returns the elements of an array that meet the condition specified in a callback function.\n     * @param callbackfn A function that accepts up to three arguments. The filter method calls the callbackfn function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n     */\n    filter<S extends T>(callbackfn: (value: T, index: number, array: ReadonlyArray<T>) => value is S, thisArg?: any): S[];\n    /**\n      * Returns the elements of an array that meet the condition specified in a callback function.\n      * @param callbackfn A function that accepts up to three arguments. The filter method calls the callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n      */\n    filter(callbackfn: (value: T, index: number, array: ReadonlyArray<T>) => any, thisArg?: any): T[];\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.\n      */\n    reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: ReadonlyArray<T>) => T, initialValue?: T): T;\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.\n      */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: ReadonlyArray<T>) => U, initialValue: U): U;\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.\n      */\n    reduceRight(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: ReadonlyArray<T>) => T, initialValue?: T): T;\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.\n      */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: ReadonlyArray<T>) => U, initialValue: U): U;\n\n    readonly [n: number]: T;\n}\n\ninterface Array<T> {\n    /**\n      * Gets or sets the length of the array. This is a number one higher than the highest element defined in an array.\n      */\n    length: number;\n    /**\n      * Returns a string representation of an array.\n      */\n    toString(): string;\n    /**\n      * Returns a string representation of an array. The elements are converted to string using thier toLocalString methods.\n      */\n    toLocaleString(): string;\n    /**\n      * Appends new elements to an array, and returns the new length of the array.\n      * @param items New elements of the Array.\n      */\n    push(...items: T[]): number;\n    /**\n      * Removes the last element from an array and returns it.\n      */\n    pop(): T | undefined;\n    /**\n      * Combines two or more arrays.\n      * @param items Additional items to add to the end of array1.\n      */\n    concat(...items: T[][]): T[];\n    /**\n      * Combines two or more arrays.\n      * @param items Additional items to add to the end of array1.\n      */\n    concat(...items: (T | T[])[]): T[];\n    /**\n      * Adds all the elements of an array separated by the specified separator string.\n      * @param separator A string used to separate one element of an array from the next in the resulting String. If omitted, the array elements are separated with a comma.\n      */\n    join(separator?: string): string;\n    /**\n      * Reverses the elements in an Array.\n      */\n    reverse(): T[];\n    /**\n      * Removes the first element from an array and returns it.\n      */\n    shift(): T | undefined;\n    /**\n      * Returns a section of an array.\n      * @param start The beginning of the specified portion of the array.\n      * @param end The end of the specified portion of the array.\n      */\n    slice(start?: number, end?: number): T[];\n    /**\n      * Sorts an array.\n      * @param compareFn The name of the function used to determine the order of the elements. If omitted, the elements are sorted in ascending, ASCII character order.\n      */\n    sort(compareFn?: (a: T, b: T) => number): this;\n    /**\n      * Removes elements from an array and, if necessary, inserts new elements in their place, returning the deleted elements.\n      * @param start The zero-based location in the array from which to start removing elements.\n      * @param deleteCount The number of elements to remove.\n      */\n    splice(start: number, deleteCount?: number): T[];\n    /**\n      * Removes elements from an array and, if necessary, inserts new elements in their place, returning the deleted elements.\n      * @param start The zero-based location in the array from which to start removing elements.\n      * @param deleteCount The number of elements to remove.\n      * @param items Elements to insert into the array in place of the deleted elements.\n      */\n    splice(start: number, deleteCount: number, ...items: T[]): T[];\n    /**\n      * Inserts new elements at the start of an array.\n      * @param items  Elements to insert at the start of the Array.\n      */\n    unshift(...items: T[]): number;\n    /**\n      * Returns the index of the first occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0.\n      */\n    indexOf(searchElement: T, fromIndex?: number): number;\n    /**\n      * Returns the index of the last occurrence of a specified value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at the last index in the array.\n      */\n    lastIndexOf(searchElement: T, fromIndex?: number): number;\n    /**\n      * Determines whether all the members of an array satisfy the specified test.\n      * @param callbackfn A function that accepts up to three arguments. The every method calls the callbackfn function for each element in array1 until the callbackfn returns false, or until the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n      */\n    every(callbackfn: (value: T, index: number, array: T[]) => boolean, thisArg?: any): boolean;\n    /**\n      * Determines whether the specified callback function returns true for any element of an array.\n      * @param callbackfn A function that accepts up to three arguments. The some method calls the callbackfn function for each element in array1 until the callbackfn returns true, or until the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n      */\n    some(callbackfn: (value: T, index: number, array: T[]) => boolean, thisArg?: any): boolean;\n    /**\n      * Performs the specified action for each element in an array.\n      * @param callbackfn  A function that accepts up to three arguments. forEach calls the callbackfn function one time for each element in the array.\n      * @param thisArg  An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n      */\n    forEach(callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any): void;\n    /**\n      * Calls a defined callback function on each element of an array, and returns an array that contains the results.\n      * @param callbackfn A function that accepts up to three arguments. The map method calls the callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n      */\n    map<U>(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): U[];\n    /**\n     * Returns the elements of an array that meet the condition specified in a callback function.\n     * @param callbackfn A function that accepts up to three arguments. The filter method calls the callbackfn function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n     */\n    filter<S extends T>(callbackfn: (value: T, index: number, array: T[]) => value is S, thisArg?: any): S[];\n    /**\n      * Returns the elements of an array that meet the condition specified in a callback function.\n      * @param callbackfn A function that accepts up to three arguments. The filter method calls the callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n      */\n    filter(callbackfn: (value: T, index: number, array: T[]) => any, thisArg?: any): T[];\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.\n      */\n    reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue?: T): T;\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.\n      */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U;\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.\n      */\n    reduceRight(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue?: T): T;\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.\n      */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U;\n\n    [n: number]: T;\n}\n\ninterface ArrayConstructor {\n    new(arrayLength?: number): any[];\n    new <T>(arrayLength: number): T[];\n    new <T>(...items: T[]): T[];\n    (arrayLength?: number): any[];\n    <T>(arrayLength: number): T[];\n    <T>(...items: T[]): T[];\n    isArray(arg: any): arg is Array<any>;\n    readonly prototype: Array<any>;\n}\n\ndeclare const Array: ArrayConstructor;\n\ninterface TypedPropertyDescriptor<T> {\n    enumerable?: boolean;\n    configurable?: boolean;\n    writable?: boolean;\n    value?: T;\n    get?: () => T;\n    set?: (value: T) => void;\n}\n\ndeclare type ClassDecorator = <TFunction extends Function>(target: TFunction) => TFunction | void;\ndeclare type PropertyDecorator = (target: Object, propertyKey: string | symbol) => void;\ndeclare type MethodDecorator = <T>(target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<T>) => TypedPropertyDescriptor<T> | void;\ndeclare type ParameterDecorator = (target: Object, propertyKey: string | symbol, parameterIndex: number) => void;\n\ndeclare type PromiseConstructorLike = new <T>(executor: (resolve: (value?: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void) => PromiseLike<T>;\n\ninterface PromiseLike<T> {\n    /**\n     * Attaches callbacks for the resolution and/or rejection of the Promise.\n     * @param onfulfilled The callback to execute when the Promise is resolved.\n     * @param onrejected The callback to execute when the Promise is rejected.\n     * @returns A Promise for the completion of which ever callback is executed.\n     */\n    then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null): PromiseLike<TResult1 | TResult2>;\n}\n\n/**\n * Represents the completion of an asynchronous operation\n */\ninterface Promise<T> {\n    /**\n     * Attaches callbacks for the resolution and/or rejection of the Promise.\n     * @param onfulfilled The callback to execute when the Promise is resolved.\n     * @param onrejected The callback to execute when the Promise is rejected.\n     * @returns A Promise for the completion of which ever callback is executed.\n     */\n    then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null): Promise<TResult1 | TResult2>;\n\n    /**\n     * Attaches a callback for only the rejection of the Promise.\n     * @param onrejected The callback to execute when the Promise is rejected.\n     * @returns A Promise for the completion of the callback.\n     */\n    catch<TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | undefined | null): Promise<T | TResult>;\n}\n\ninterface ArrayLike<T> {\n    readonly length: number;\n    readonly [n: number]: T;\n}\n\n/**\n * Make all properties in T optional\n */\ntype Partial<T> = {\n    [P in keyof T]?: T[P];\n};\n\n/**\n * Make all properties in T readonly\n */\ntype Readonly<T> = {\n    readonly [P in keyof T]: T[P];\n};\n\n/**\n * From T pick a set of properties K\n */\ntype Pick<T, K extends keyof T> = {\n    [P in K]: T[P];\n};\n\n/**\n * Construct a type with a set of properties K of type T\n */\ntype Record<K extends string, T> = {\n    [P in K]: T;\n};\n\n/**\n * Marker for contextual \'this\' type\n */\ninterface ThisType<T> { }\n\n/**\n  * Represents a raw buffer of binary data, which is used to store data for the\n  * different typed arrays. ArrayBuffers cannot be read from or written to directly,\n  * but can be passed to a typed array or DataView Object to interpret the raw\n  * buffer as needed.\n  */\ninterface ArrayBuffer {\n    /**\n      * Read-only. The length of the ArrayBuffer (in bytes).\n      */\n    readonly byteLength: number;\n\n    /**\n      * Returns a section of an ArrayBuffer.\n      */\n    slice(begin: number, end?: number): ArrayBuffer;\n}\n\n/**\n * Allowed ArrayBuffer types for the buffer of an ArrayBufferView and related Typed Arrays.\n */\ninterface ArrayBufferTypes {\n    ArrayBuffer: ArrayBuffer;\n}\ntype ArrayBufferLike = ArrayBufferTypes[keyof ArrayBufferTypes];\n\ninterface ArrayBufferConstructor {\n    readonly prototype: ArrayBuffer;\n    new(byteLength: number): ArrayBuffer;\n    isView(arg: any): arg is ArrayBufferView;\n}\ndeclare const ArrayBuffer: ArrayBufferConstructor;\n\ninterface ArrayBufferView {\n    /**\n      * The ArrayBuffer instance referenced by the array.\n      */\n    buffer: ArrayBufferLike;\n\n    /**\n      * The length in bytes of the array.\n      */\n    byteLength: number;\n\n    /**\n      * The offset in bytes of the array.\n      */\n    byteOffset: number;\n}\n\ninterface DataView {\n    readonly buffer: ArrayBuffer;\n    readonly byteLength: number;\n    readonly byteOffset: number;\n    /**\n      * Gets the Float32 value at the specified byte offset from the start of the view. There is\n      * no alignment constraint; multi-byte values may be fetched from any offset.\n      * @param byteOffset The place in the buffer at which the value should be retrieved.\n      */\n    getFloat32(byteOffset: number, littleEndian?: boolean): number;\n\n    /**\n      * Gets the Float64 value at the specified byte offset from the start of the view. There is\n      * no alignment constraint; multi-byte values may be fetched from any offset.\n      * @param byteOffset The place in the buffer at which the value should be retrieved.\n      */\n    getFloat64(byteOffset: number, littleEndian?: boolean): number;\n\n    /**\n      * Gets the Int8 value at the specified byte offset from the start of the view. There is\n      * no alignment constraint; multi-byte values may be fetched from any offset.\n      * @param byteOffset The place in the buffer at which the value should be retrieved.\n      */\n    getInt8(byteOffset: number): number;\n\n    /**\n      * Gets the Int16 value at the specified byte offset from the start of the view. There is\n      * no alignment constraint; multi-byte values may be fetched from any offset.\n      * @param byteOffset The place in the buffer at which the value should be retrieved.\n      */\n    getInt16(byteOffset: number, littleEndian?: boolean): number;\n    /**\n      * Gets the Int32 value at the specified byte offset from the start of the view. There is\n      * no alignment constraint; multi-byte values may be fetched from any offset.\n      * @param byteOffset The place in the buffer at which the value should be retrieved.\n      */\n    getInt32(byteOffset: number, littleEndian?: boolean): number;\n\n    /**\n      * Gets the Uint8 value at the specified byte offset from the start of the view. There is\n      * no alignment constraint; multi-byte values may be fetched from any offset.\n      * @param byteOffset The place in the buffer at which the value should be retrieved.\n      */\n    getUint8(byteOffset: number): number;\n\n    /**\n      * Gets the Uint16 value at the specified byte offset from the start of the view. There is\n      * no alignment constraint; multi-byte values may be fetched from any offset.\n      * @param byteOffset The place in the buffer at which the value should be retrieved.\n      */\n    getUint16(byteOffset: number, littleEndian?: boolean): number;\n\n    /**\n      * Gets the Uint32 value at the specified byte offset from the start of the view. There is\n      * no alignment constraint; multi-byte values may be fetched from any offset.\n      * @param byteOffset The place in the buffer at which the value should be retrieved.\n      */\n    getUint32(byteOffset: number, littleEndian?: boolean): number;\n\n    /**\n      * Stores an Float32 value at the specified byte offset from the start of the view.\n      * @param byteOffset The place in the buffer at which the value should be set.\n      * @param value The value to set.\n      * @param littleEndian If false or undefined, a big-endian value should be written,\n      * otherwise a little-endian value should be written.\n      */\n    setFloat32(byteOffset: number, value: number, littleEndian?: boolean): void;\n\n    /**\n      * Stores an Float64 value at the specified byte offset from the start of the view.\n      * @param byteOffset The place in the buffer at which the value should be set.\n      * @param value The value to set.\n      * @param littleEndian If false or undefined, a big-endian value should be written,\n      * otherwise a little-endian value should be written.\n      */\n    setFloat64(byteOffset: number, value: number, littleEndian?: boolean): void;\n\n    /**\n      * Stores an Int8 value at the specified byte offset from the start of the view.\n      * @param byteOffset The place in the buffer at which the value should be set.\n      * @param value The value to set.\n      */\n    setInt8(byteOffset: number, value: number): void;\n\n    /**\n      * Stores an Int16 value at the specified byte offset from the start of the view.\n      * @param byteOffset The place in the buffer at which the value should be set.\n      * @param value The value to set.\n      * @param littleEndian If false or undefined, a big-endian value should be written,\n      * otherwise a little-endian value should be written.\n      */\n    setInt16(byteOffset: number, value: number, littleEndian?: boolean): void;\n\n    /**\n      * Stores an Int32 value at the specified byte offset from the start of the view.\n      * @param byteOffset The place in the buffer at which the value should be set.\n      * @param value The value to set.\n      * @param littleEndian If false or undefined, a big-endian value should be written,\n      * otherwise a little-endian value should be written.\n      */\n    setInt32(byteOffset: number, value: number, littleEndian?: boolean): void;\n\n    /**\n      * Stores an Uint8 value at the specified byte offset from the start of the view.\n      * @param byteOffset The place in the buffer at which the value should be set.\n      * @param value The value to set.\n      */\n    setUint8(byteOffset: number, value: number): void;\n\n    /**\n      * Stores an Uint16 value at the specified byte offset from the start of the view.\n      * @param byteOffset The place in the buffer at which the value should be set.\n      * @param value The value to set.\n      * @param littleEndian If false or undefined, a big-endian value should be written,\n      * otherwise a little-endian value should be written.\n      */\n    setUint16(byteOffset: number, value: number, littleEndian?: boolean): void;\n\n    /**\n      * Stores an Uint32 value at the specified byte offset from the start of the view.\n      * @param byteOffset The place in the buffer at which the value should be set.\n      * @param value The value to set.\n      * @param littleEndian If false or undefined, a big-endian value should be written,\n      * otherwise a little-endian value should be written.\n      */\n    setUint32(byteOffset: number, value: number, littleEndian?: boolean): void;\n}\n\ninterface DataViewConstructor {\n    new(buffer: ArrayBufferLike, byteOffset?: number, byteLength?: number): DataView;\n}\ndeclare const DataView: DataViewConstructor;\n\n/**\n  * A typed array of 8-bit integer values. The contents are initialized to 0. If the requested\n  * number of bytes could not be allocated an exception is raised.\n  */\ninterface Int8Array {\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * The ArrayBuffer instance referenced by the array.\n      */\n    readonly buffer: ArrayBufferLike;\n\n    /**\n      * The length in bytes of the array.\n      */\n    readonly byteLength: number;\n\n    /**\n      * The offset in bytes of the array.\n      */\n    readonly byteOffset: number;\n\n    /**\n      * Returns the this object after copying a section of the array identified by start and end\n      * to the same array starting at position target\n      * @param target If target is negative, it is treated as length+target where length is the\n      * length of the array.\n      * @param start If start is negative, it is treated as length+start. If end is negative, it\n      * is treated as length+end.\n      * @param end If not specified, length of the this object is used as its default value.\n      */\n    copyWithin(target: number, start: number, end?: number): this;\n\n    /**\n      * Determines whether all the members of an array satisfy the specified test.\n      * @param callbackfn A function that accepts up to three arguments. The every method calls\n      * the callbackfn function for each element in array1 until the callbackfn returns false,\n      * or until the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    every(callbackfn: (value: number, index: number, array: Int8Array) => boolean, thisArg?: any): boolean;\n\n    /**\n        * Returns the this object after filling the section identified by start and end with value\n        * @param value value to fill array section with\n        * @param start index to start filling the array at. If start is negative, it is treated as\n        * length+start where length is the length of the array.\n        * @param end index to stop filling the array at. If end is negative, it is treated as\n        * length+end.\n        */\n    fill(value: number, start?: number, end?: number): this;\n\n    /**\n      * Returns the elements of an array that meet the condition specified in a callback function.\n      * @param callbackfn A function that accepts up to three arguments. The filter method calls\n      * the callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    filter(callbackfn: (value: number, index: number, array: Int8Array) => any, thisArg?: any): Int8Array;\n\n    /**\n      * Returns the value of the first element in the array where predicate is true, and undefined\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found, find\n      * immediately returns that element value. Otherwise, find returns undefined.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number | undefined;\n\n    /**\n      * Returns the index of the first element in the array where predicate is true, and -1\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found,\n      * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    findIndex(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;\n\n    /**\n      * Performs the specified action for each element in an array.\n      * @param callbackfn  A function that accepts up to three arguments. forEach calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg  An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    forEach(callbackfn: (value: number, index: number, array: Int8Array) => void, thisArg?: any): void;\n\n    /**\n      * Returns the index of the first occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      *  search starts at index 0.\n      */\n    indexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * Adds all the elements of an array separated by the specified separator string.\n      * @param separator A string used to separate one element of an array from the next in the\n      * resulting String. If omitted, the array elements are separated with a comma.\n      */\n    join(separator?: string): string;\n\n    /**\n      * Returns the index of the last occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      * search starts at index 0.\n      */\n    lastIndexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * The length of the array.\n      */\n    readonly length: number;\n\n    /**\n      * Calls a defined callback function on each element of an array, and returns an array that\n      * contains the results.\n      * @param callbackfn A function that accepts up to three arguments. The map method calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    map(callbackfn: (this: void, value: number, index: number, array: Int8Array) => number, thisArg?: any): Int8Array;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int8Array) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int8Array) => U, initialValue: U): U;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an\n      * argument instead of an array value.\n      */\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int8Array) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int8Array) => U, initialValue: U): U;\n\n    /**\n      * Reverses the elements in an Array.\n      */\n    reverse(): Int8Array;\n\n    /**\n      * Sets a value or an array of values.\n      * @param array A typed or untyped array of values to set.\n      * @param offset The index in the current array at which the values are to be written.\n      */\n    set(array: ArrayLike<number>, offset?: number): void;\n\n    /**\n      * Returns a section of an array.\n      * @param start The beginning of the specified portion of the array.\n      * @param end The end of the specified portion of the array.\n      */\n    slice(start?: number, end?: number): Int8Array;\n\n    /**\n      * Determines whether the specified callback function returns true for any element of an array.\n      * @param callbackfn A function that accepts up to three arguments. The some method calls the\n      * callbackfn function for each element in array1 until the callbackfn returns true, or until\n      * the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    some(callbackfn: (value: number, index: number, array: Int8Array) => boolean, thisArg?: any): boolean;\n\n    /**\n      * Sorts an array.\n      * @param compareFn The name of the function used to determine the order of the elements. If\n      * omitted, the elements are sorted in ascending, ASCII character order.\n      */\n    sort(compareFn?: (a: number, b: number) => number): this;\n\n    /**\n      * Gets a new Int8Array view of the ArrayBuffer store for this array, referencing the elements\n      * at begin, inclusive, up to end, exclusive.\n      * @param begin The index of the beginning of the array.\n      * @param end The index of the end of the array.\n      */\n    subarray(begin: number, end?: number): Int8Array;\n\n    /**\n      * Converts a number to a string by using the current locale.\n      */\n    toLocaleString(): string;\n\n    /**\n      * Returns a string representation of an array.\n      */\n    toString(): string;\n\n    [index: number]: number;\n}\ninterface Int8ArrayConstructor {\n    readonly prototype: Int8Array;\n    new(length: number): Int8Array;\n    new(array: ArrayLike<number>): Int8Array;\n    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Int8Array;\n\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * Returns a new array from a set of elements.\n      * @param items A set of elements to include in the new array object.\n      */\n    of(...items: number[]): Int8Array;\n\n    /**\n      * Creates an array from an array-like or iterable object.\n      * @param arrayLike An array-like or iterable object to convert to an array.\n      * @param mapfn A mapping function to call on every element of the array.\n      * @param thisArg Value of \'this\' used to invoke the mapfn.\n      */\n    from(arrayLike: ArrayLike<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Int8Array;\n\n\n}\ndeclare const Int8Array: Int8ArrayConstructor;\n\n/**\n  * A typed array of 8-bit unsigned integer values. The contents are initialized to 0. If the\n  * requested number of bytes could not be allocated an exception is raised.\n  */\ninterface Uint8Array {\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * The ArrayBuffer instance referenced by the array.\n      */\n    readonly buffer: ArrayBufferLike;\n\n    /**\n      * The length in bytes of the array.\n      */\n    readonly byteLength: number;\n\n    /**\n      * The offset in bytes of the array.\n      */\n    readonly byteOffset: number;\n\n    /**\n      * Returns the this object after copying a section of the array identified by start and end\n      * to the same array starting at position target\n      * @param target If target is negative, it is treated as length+target where length is the\n      * length of the array.\n      * @param start If start is negative, it is treated as length+start. If end is negative, it\n      * is treated as length+end.\n      * @param end If not specified, length of the this object is used as its default value.\n      */\n    copyWithin(target: number, start: number, end?: number): this;\n\n    /**\n      * Determines whether all the members of an array satisfy the specified test.\n      * @param callbackfn A function that accepts up to three arguments. The every method calls\n      * the callbackfn function for each element in array1 until the callbackfn returns false,\n      * or until the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    every(callbackfn: (value: number, index: number, array: Uint8Array) => boolean, thisArg?: any): boolean;\n\n    /**\n        * Returns the this object after filling the section identified by start and end with value\n        * @param value value to fill array section with\n        * @param start index to start filling the array at. If start is negative, it is treated as\n        * length+start where length is the length of the array.\n        * @param end index to stop filling the array at. If end is negative, it is treated as\n        * length+end.\n        */\n    fill(value: number, start?: number, end?: number): this;\n\n    /**\n      * Returns the elements of an array that meet the condition specified in a callback function.\n      * @param callbackfn A function that accepts up to three arguments. The filter method calls\n      * the callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    filter(callbackfn: (value: number, index: number, array: Uint8Array) => any, thisArg?: any): Uint8Array;\n\n    /**\n      * Returns the value of the first element in the array where predicate is true, and undefined\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found, find\n      * immediately returns that element value. Otherwise, find returns undefined.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number | undefined;\n\n    /**\n      * Returns the index of the first element in the array where predicate is true, and -1\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found,\n      * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    findIndex(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;\n\n    /**\n      * Performs the specified action for each element in an array.\n      * @param callbackfn  A function that accepts up to three arguments. forEach calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg  An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    forEach(callbackfn: (value: number, index: number, array: Uint8Array) => void, thisArg?: any): void;\n\n    /**\n      * Returns the index of the first occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      *  search starts at index 0.\n      */\n    indexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * Adds all the elements of an array separated by the specified separator string.\n      * @param separator A string used to separate one element of an array from the next in the\n      * resulting String. If omitted, the array elements are separated with a comma.\n      */\n    join(separator?: string): string;\n\n    /**\n      * Returns the index of the last occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      * search starts at index 0.\n      */\n    lastIndexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * The length of the array.\n      */\n    readonly length: number;\n\n    /**\n      * Calls a defined callback function on each element of an array, and returns an array that\n      * contains the results.\n      * @param callbackfn A function that accepts up to three arguments. The map method calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    map(callbackfn: (this: void, value: number, index: number, array: Uint8Array) => number, thisArg?: any): Uint8Array;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8Array) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint8Array) => U, initialValue: U): U;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an\n      * argument instead of an array value.\n      */\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8Array) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint8Array) => U, initialValue: U): U;\n\n    /**\n      * Reverses the elements in an Array.\n      */\n    reverse(): Uint8Array;\n\n    /**\n      * Sets a value or an array of values.\n      * @param array A typed or untyped array of values to set.\n      * @param offset The index in the current array at which the values are to be written.\n      */\n    set(array: ArrayLike<number>, offset?: number): void;\n\n    /**\n      * Returns a section of an array.\n      * @param start The beginning of the specified portion of the array.\n      * @param end The end of the specified portion of the array.\n      */\n    slice(start?: number, end?: number): Uint8Array;\n\n    /**\n      * Determines whether the specified callback function returns true for any element of an array.\n      * @param callbackfn A function that accepts up to three arguments. The some method calls the\n      * callbackfn function for each element in array1 until the callbackfn returns true, or until\n      * the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    some(callbackfn: (value: number, index: number, array: Uint8Array) => boolean, thisArg?: any): boolean;\n\n    /**\n      * Sorts an array.\n      * @param compareFn The name of the function used to determine the order of the elements. If\n      * omitted, the elements are sorted in ascending, ASCII character order.\n      */\n    sort(compareFn?: (a: number, b: number) => number): this;\n\n    /**\n      * Gets a new Uint8Array view of the ArrayBuffer store for this array, referencing the elements\n      * at begin, inclusive, up to end, exclusive.\n      * @param begin The index of the beginning of the array.\n      * @param end The index of the end of the array.\n      */\n    subarray(begin: number, end?: number): Uint8Array;\n\n    /**\n      * Converts a number to a string by using the current locale.\n      */\n    toLocaleString(): string;\n\n    /**\n      * Returns a string representation of an array.\n      */\n    toString(): string;\n\n    [index: number]: number;\n}\n\ninterface Uint8ArrayConstructor {\n    readonly prototype: Uint8Array;\n    new(length: number): Uint8Array;\n    new(array: ArrayLike<number>): Uint8Array;\n    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Uint8Array;\n\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * Returns a new array from a set of elements.\n      * @param items A set of elements to include in the new array object.\n      */\n    of(...items: number[]): Uint8Array;\n\n    /**\n      * Creates an array from an array-like or iterable object.\n      * @param arrayLike An array-like or iterable object to convert to an array.\n      * @param mapfn A mapping function to call on every element of the array.\n      * @param thisArg Value of \'this\' used to invoke the mapfn.\n      */\n    from(arrayLike: ArrayLike<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Uint8Array;\n\n}\ndeclare const Uint8Array: Uint8ArrayConstructor;\n\n/**\n  * A typed array of 8-bit unsigned integer (clamped) values. The contents are initialized to 0.\n  * If the requested number of bytes could not be allocated an exception is raised.\n  */\ninterface Uint8ClampedArray {\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * The ArrayBuffer instance referenced by the array.\n      */\n    readonly buffer: ArrayBufferLike;\n\n    /**\n      * The length in bytes of the array.\n      */\n    readonly byteLength: number;\n\n    /**\n      * The offset in bytes of the array.\n      */\n    readonly byteOffset: number;\n\n    /**\n      * Returns the this object after copying a section of the array identified by start and end\n      * to the same array starting at position target\n      * @param target If target is negative, it is treated as length+target where length is the\n      * length of the array.\n      * @param start If start is negative, it is treated as length+start. If end is negative, it\n      * is treated as length+end.\n      * @param end If not specified, length of the this object is used as its default value.\n      */\n    copyWithin(target: number, start: number, end?: number): this;\n\n    /**\n      * Determines whether all the members of an array satisfy the specified test.\n      * @param callbackfn A function that accepts up to three arguments. The every method calls\n      * the callbackfn function for each element in array1 until the callbackfn returns false,\n      * or until the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    every(callbackfn: (value: number, index: number, array: Uint8ClampedArray) => boolean, thisArg?: any): boolean;\n\n    /**\n        * Returns the this object after filling the section identified by start and end with value\n        * @param value value to fill array section with\n        * @param start index to start filling the array at. If start is negative, it is treated as\n        * length+start where length is the length of the array.\n        * @param end index to stop filling the array at. If end is negative, it is treated as\n        * length+end.\n        */\n    fill(value: number, start?: number, end?: number): this;\n\n    /**\n      * Returns the elements of an array that meet the condition specified in a callback function.\n      * @param callbackfn A function that accepts up to three arguments. The filter method calls\n      * the callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    filter(callbackfn: (value: number, index: number, array: Uint8ClampedArray) => any, thisArg?: any): Uint8ClampedArray;\n\n    /**\n      * Returns the value of the first element in the array where predicate is true, and undefined\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found, find\n      * immediately returns that element value. Otherwise, find returns undefined.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number | undefined;\n\n    /**\n      * Returns the index of the first element in the array where predicate is true, and -1\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found,\n      * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    findIndex(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;\n\n    /**\n      * Performs the specified action for each element in an array.\n      * @param callbackfn  A function that accepts up to three arguments. forEach calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg  An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    forEach(callbackfn: (value: number, index: number, array: Uint8ClampedArray) => void, thisArg?: any): void;\n\n    /**\n      * Returns the index of the first occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      *  search starts at index 0.\n      */\n    indexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * Adds all the elements of an array separated by the specified separator string.\n      * @param separator A string used to separate one element of an array from the next in the\n      * resulting String. If omitted, the array elements are separated with a comma.\n      */\n    join(separator?: string): string;\n\n    /**\n      * Returns the index of the last occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      * search starts at index 0.\n      */\n    lastIndexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * The length of the array.\n      */\n    readonly length: number;\n\n    /**\n      * Calls a defined callback function on each element of an array, and returns an array that\n      * contains the results.\n      * @param callbackfn A function that accepts up to three arguments. The map method calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    map(callbackfn: (this: void, value: number, index: number, array: Uint8ClampedArray) => number, thisArg?: any): Uint8ClampedArray;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => U, initialValue: U): U;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an\n      * argument instead of an array value.\n      */\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => U, initialValue: U): U;\n\n    /**\n      * Reverses the elements in an Array.\n      */\n    reverse(): Uint8ClampedArray;\n\n    /**\n      * Sets a value or an array of values.\n      * @param array A typed or untyped array of values to set.\n      * @param offset The index in the current array at which the values are to be written.\n      */\n    set(array: ArrayLike<number>, offset?: number): void;\n\n    /**\n      * Returns a section of an array.\n      * @param start The beginning of the specified portion of the array.\n      * @param end The end of the specified portion of the array.\n      */\n    slice(start?: number, end?: number): Uint8ClampedArray;\n\n    /**\n      * Determines whether the specified callback function returns true for any element of an array.\n      * @param callbackfn A function that accepts up to three arguments. The some method calls the\n      * callbackfn function for each element in array1 until the callbackfn returns true, or until\n      * the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    some(callbackfn: (value: number, index: number, array: Uint8ClampedArray) => boolean, thisArg?: any): boolean;\n\n    /**\n      * Sorts an array.\n      * @param compareFn The name of the function used to determine the order of the elements. If\n      * omitted, the elements are sorted in ascending, ASCII character order.\n      */\n    sort(compareFn?: (a: number, b: number) => number): this;\n\n    /**\n      * Gets a new Uint8ClampedArray view of the ArrayBuffer store for this array, referencing the elements\n      * at begin, inclusive, up to end, exclusive.\n      * @param begin The index of the beginning of the array.\n      * @param end The index of the end of the array.\n      */\n    subarray(begin: number, end?: number): Uint8ClampedArray;\n\n    /**\n      * Converts a number to a string by using the current locale.\n      */\n    toLocaleString(): string;\n\n    /**\n      * Returns a string representation of an array.\n      */\n    toString(): string;\n\n    [index: number]: number;\n}\n\ninterface Uint8ClampedArrayConstructor {\n    readonly prototype: Uint8ClampedArray;\n    new(length: number): Uint8ClampedArray;\n    new(array: ArrayLike<number>): Uint8ClampedArray;\n    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Uint8ClampedArray;\n\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * Returns a new array from a set of elements.\n      * @param items A set of elements to include in the new array object.\n      */\n    of(...items: number[]): Uint8ClampedArray;\n\n    /**\n      * Creates an array from an array-like or iterable object.\n      * @param arrayLike An array-like or iterable object to convert to an array.\n      * @param mapfn A mapping function to call on every element of the array.\n      * @param thisArg Value of \'this\' used to invoke the mapfn.\n      */\n    from(arrayLike: ArrayLike<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Uint8ClampedArray;\n}\ndeclare const Uint8ClampedArray: Uint8ClampedArrayConstructor;\n\n/**\n  * A typed array of 16-bit signed integer values. The contents are initialized to 0. If the\n  * requested number of bytes could not be allocated an exception is raised.\n  */\ninterface Int16Array {\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * The ArrayBuffer instance referenced by the array.\n      */\n    readonly buffer: ArrayBufferLike;\n\n    /**\n      * The length in bytes of the array.\n      */\n    readonly byteLength: number;\n\n    /**\n      * The offset in bytes of the array.\n      */\n    readonly byteOffset: number;\n\n    /**\n      * Returns the this object after copying a section of the array identified by start and end\n      * to the same array starting at position target\n      * @param target If target is negative, it is treated as length+target where length is the\n      * length of the array.\n      * @param start If start is negative, it is treated as length+start. If end is negative, it\n      * is treated as length+end.\n      * @param end If not specified, length of the this object is used as its default value.\n      */\n    copyWithin(target: number, start: number, end?: number): this;\n\n    /**\n      * Determines whether all the members of an array satisfy the specified test.\n      * @param callbackfn A function that accepts up to three arguments. The every method calls\n      * the callbackfn function for each element in array1 until the callbackfn returns false,\n      * or until the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    every(callbackfn: (value: number, index: number, array: Int16Array) => boolean, thisArg?: any): boolean;\n\n    /**\n        * Returns the this object after filling the section identified by start and end with value\n        * @param value value to fill array section with\n        * @param start index to start filling the array at. If start is negative, it is treated as\n        * length+start where length is the length of the array.\n        * @param end index to stop filling the array at. If end is negative, it is treated as\n        * length+end.\n        */\n    fill(value: number, start?: number, end?: number): this;\n\n    /**\n      * Returns the elements of an array that meet the condition specified in a callback function.\n      * @param callbackfn A function that accepts up to three arguments. The filter method calls\n      * the callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    filter(callbackfn: (this: void, value: number, index: number, array: Int16Array) => any, thisArg?: any): Int16Array;\n\n    /**\n      * Returns the value of the first element in the array where predicate is true, and undefined\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found, find\n      * immediately returns that element value. Otherwise, find returns undefined.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number | undefined;\n\n    /**\n      * Returns the index of the first element in the array where predicate is true, and -1\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found,\n      * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    findIndex(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;\n\n    /**\n      * Performs the specified action for each element in an array.\n      * @param callbackfn  A function that accepts up to three arguments. forEach calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg  An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    forEach(callbackfn: (value: number, index: number, array: Int16Array) => void, thisArg?: any): void;\n    /**\n      * Returns the index of the first occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      *  search starts at index 0.\n      */\n    indexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * Adds all the elements of an array separated by the specified separator string.\n      * @param separator A string used to separate one element of an array from the next in the\n      * resulting String. If omitted, the array elements are separated with a comma.\n      */\n    join(separator?: string): string;\n\n    /**\n      * Returns the index of the last occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      * search starts at index 0.\n      */\n    lastIndexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * The length of the array.\n      */\n    readonly length: number;\n\n    /**\n      * Calls a defined callback function on each element of an array, and returns an array that\n      * contains the results.\n      * @param callbackfn A function that accepts up to three arguments. The map method calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    map(callbackfn: (this: void, value: number, index: number, array: Int16Array) => number, thisArg?: any): Int16Array;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int16Array) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int16Array) => U, initialValue: U): U;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an\n      * argument instead of an array value.\n      */\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int16Array) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int16Array) => U, initialValue: U): U;\n\n    /**\n      * Reverses the elements in an Array.\n      */\n    reverse(): Int16Array;\n\n    /**\n      * Sets a value or an array of values.\n      * @param array A typed or untyped array of values to set.\n      * @param offset The index in the current array at which the values are to be written.\n      */\n    set(array: ArrayLike<number>, offset?: number): void;\n\n    /**\n      * Returns a section of an array.\n      * @param start The beginning of the specified portion of the array.\n      * @param end The end of the specified portion of the array.\n      */\n    slice(start?: number, end?: number): Int16Array;\n\n    /**\n      * Determines whether the specified callback function returns true for any element of an array.\n      * @param callbackfn A function that accepts up to three arguments. The some method calls the\n      * callbackfn function for each element in array1 until the callbackfn returns true, or until\n      * the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    some(callbackfn: (value: number, index: number, array: Int16Array) => boolean, thisArg?: any): boolean;\n\n    /**\n      * Sorts an array.\n      * @param compareFn The name of the function used to determine the order of the elements. If\n      * omitted, the elements are sorted in ascending, ASCII character order.\n      */\n    sort(compareFn?: (a: number, b: number) => number): this;\n\n    /**\n      * Gets a new Int16Array view of the ArrayBuffer store for this array, referencing the elements\n      * at begin, inclusive, up to end, exclusive.\n      * @param begin The index of the beginning of the array.\n      * @param end The index of the end of the array.\n      */\n    subarray(begin: number, end?: number): Int16Array;\n\n    /**\n      * Converts a number to a string by using the current locale.\n      */\n    toLocaleString(): string;\n\n    /**\n      * Returns a string representation of an array.\n      */\n    toString(): string;\n\n    [index: number]: number;\n}\n\ninterface Int16ArrayConstructor {\n    readonly prototype: Int16Array;\n    new(length: number): Int16Array;\n    new(array: ArrayLike<number>): Int16Array;\n    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Int16Array;\n\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * Returns a new array from a set of elements.\n      * @param items A set of elements to include in the new array object.\n      */\n    of(...items: number[]): Int16Array;\n\n    /**\n      * Creates an array from an array-like or iterable object.\n      * @param arrayLike An array-like or iterable object to convert to an array.\n      * @param mapfn A mapping function to call on every element of the array.\n      * @param thisArg Value of \'this\' used to invoke the mapfn.\n      */\n    from(arrayLike: ArrayLike<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Int16Array;\n\n\n}\ndeclare const Int16Array: Int16ArrayConstructor;\n\n/**\n  * A typed array of 16-bit unsigned integer values. The contents are initialized to 0. If the\n  * requested number of bytes could not be allocated an exception is raised.\n  */\ninterface Uint16Array {\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * The ArrayBuffer instance referenced by the array.\n      */\n    readonly buffer: ArrayBufferLike;\n\n    /**\n      * The length in bytes of the array.\n      */\n    readonly byteLength: number;\n\n    /**\n      * The offset in bytes of the array.\n      */\n    readonly byteOffset: number;\n\n    /**\n      * Returns the this object after copying a section of the array identified by start and end\n      * to the same array starting at position target\n      * @param target If target is negative, it is treated as length+target where length is the\n      * length of the array.\n      * @param start If start is negative, it is treated as length+start. If end is negative, it\n      * is treated as length+end.\n      * @param end If not specified, length of the this object is used as its default value.\n      */\n    copyWithin(target: number, start: number, end?: number): this;\n\n    /**\n      * Determines whether all the members of an array satisfy the specified test.\n      * @param callbackfn A function that accepts up to three arguments. The every method calls\n      * the callbackfn function for each element in array1 until the callbackfn returns false,\n      * or until the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    every(callbackfn: (value: number, index: number, array: Uint16Array) => boolean, thisArg?: any): boolean;\n\n    /**\n        * Returns the this object after filling the section identified by start and end with value\n        * @param value value to fill array section with\n        * @param start index to start filling the array at. If start is negative, it is treated as\n        * length+start where length is the length of the array.\n        * @param end index to stop filling the array at. If end is negative, it is treated as\n        * length+end.\n        */\n    fill(value: number, start?: number, end?: number): this;\n\n    /**\n      * Returns the elements of an array that meet the condition specified in a callback function.\n      * @param callbackfn A function that accepts up to three arguments. The filter method calls\n      * the callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    filter(callbackfn: (value: number, index: number, array: Uint16Array) => any, thisArg?: any): Uint16Array;\n\n    /**\n      * Returns the value of the first element in the array where predicate is true, and undefined\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found, find\n      * immediately returns that element value. Otherwise, find returns undefined.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number | undefined;\n\n    /**\n      * Returns the index of the first element in the array where predicate is true, and -1\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found,\n      * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    findIndex(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;\n\n    /**\n      * Performs the specified action for each element in an array.\n      * @param callbackfn  A function that accepts up to three arguments. forEach calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg  An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    forEach(callbackfn: (value: number, index: number, array: Uint16Array) => void, thisArg?: any): void;\n\n    /**\n      * Returns the index of the first occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      *  search starts at index 0.\n      */\n    indexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * Adds all the elements of an array separated by the specified separator string.\n      * @param separator A string used to separate one element of an array from the next in the\n      * resulting String. If omitted, the array elements are separated with a comma.\n      */\n    join(separator?: string): string;\n\n    /**\n      * Returns the index of the last occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      * search starts at index 0.\n      */\n    lastIndexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * The length of the array.\n      */\n    readonly length: number;\n\n    /**\n      * Calls a defined callback function on each element of an array, and returns an array that\n      * contains the results.\n      * @param callbackfn A function that accepts up to three arguments. The map method calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    map(callbackfn: (this: void, value: number, index: number, array: Uint16Array) => number, thisArg?: any): Uint16Array;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint16Array) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint16Array) => U, initialValue: U): U;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an\n      * argument instead of an array value.\n      */\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint16Array) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint16Array) => U, initialValue: U): U;\n\n    /**\n      * Reverses the elements in an Array.\n      */\n    reverse(): Uint16Array;\n\n    /**\n      * Sets a value or an array of values.\n      * @param array A typed or untyped array of values to set.\n      * @param offset The index in the current array at which the values are to be written.\n      */\n    set(array: ArrayLike<number>, offset?: number): void;\n\n    /**\n      * Returns a section of an array.\n      * @param start The beginning of the specified portion of the array.\n      * @param end The end of the specified portion of the array.\n      */\n    slice(start?: number, end?: number): Uint16Array;\n\n    /**\n      * Determines whether the specified callback function returns true for any element of an array.\n      * @param callbackfn A function that accepts up to three arguments. The some method calls the\n      * callbackfn function for each element in array1 until the callbackfn returns true, or until\n      * the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    some(callbackfn: (value: number, index: number, array: Uint16Array) => boolean, thisArg?: any): boolean;\n\n    /**\n      * Sorts an array.\n      * @param compareFn The name of the function used to determine the order of the elements. If\n      * omitted, the elements are sorted in ascending, ASCII character order.\n      */\n    sort(compareFn?: (a: number, b: number) => number): this;\n\n    /**\n      * Gets a new Uint16Array view of the ArrayBuffer store for this array, referencing the elements\n      * at begin, inclusive, up to end, exclusive.\n      * @param begin The index of the beginning of the array.\n      * @param end The index of the end of the array.\n      */\n    subarray(begin: number, end?: number): Uint16Array;\n\n    /**\n      * Converts a number to a string by using the current locale.\n      */\n    toLocaleString(): string;\n\n    /**\n      * Returns a string representation of an array.\n      */\n    toString(): string;\n\n    [index: number]: number;\n}\n\ninterface Uint16ArrayConstructor {\n    readonly prototype: Uint16Array;\n    new(length: number): Uint16Array;\n    new(array: ArrayLike<number>): Uint16Array;\n    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Uint16Array;\n\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * Returns a new array from a set of elements.\n      * @param items A set of elements to include in the new array object.\n      */\n    of(...items: number[]): Uint16Array;\n\n    /**\n      * Creates an array from an array-like or iterable object.\n      * @param arrayLike An array-like or iterable object to convert to an array.\n      * @param mapfn A mapping function to call on every element of the array.\n      * @param thisArg Value of \'this\' used to invoke the mapfn.\n      */\n    from(arrayLike: ArrayLike<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Uint16Array;\n\n\n}\ndeclare const Uint16Array: Uint16ArrayConstructor;\n/**\n  * A typed array of 32-bit signed integer values. The contents are initialized to 0. If the\n  * requested number of bytes could not be allocated an exception is raised.\n  */\ninterface Int32Array {\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * The ArrayBuffer instance referenced by the array.\n      */\n    readonly buffer: ArrayBufferLike;\n\n    /**\n      * The length in bytes of the array.\n      */\n    readonly byteLength: number;\n\n    /**\n      * The offset in bytes of the array.\n      */\n    readonly byteOffset: number;\n\n    /**\n      * Returns the this object after copying a section of the array identified by start and end\n      * to the same array starting at position target\n      * @param target If target is negative, it is treated as length+target where length is the\n      * length of the array.\n      * @param start If start is negative, it is treated as length+start. If end is negative, it\n      * is treated as length+end.\n      * @param end If not specified, length of the this object is used as its default value.\n      */\n    copyWithin(target: number, start: number, end?: number): this;\n\n    /**\n      * Determines whether all the members of an array satisfy the specified test.\n      * @param callbackfn A function that accepts up to three arguments. The every method calls\n      * the callbackfn function for each element in array1 until the callbackfn returns false,\n      * or until the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    every(callbackfn: (value: number, index: number, array: Int32Array) => boolean, thisArg?: any): boolean;\n\n    /**\n        * Returns the this object after filling the section identified by start and end with value\n        * @param value value to fill array section with\n        * @param start index to start filling the array at. If start is negative, it is treated as\n        * length+start where length is the length of the array.\n        * @param end index to stop filling the array at. If end is negative, it is treated as\n        * length+end.\n        */\n    fill(value: number, start?: number, end?: number): this;\n\n    /**\n      * Returns the elements of an array that meet the condition specified in a callback function.\n      * @param callbackfn A function that accepts up to three arguments. The filter method calls\n      * the callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    filter(callbackfn: (value: number, index: number, array: Int32Array) => any, thisArg?: any): Int32Array;\n\n    /**\n      * Returns the value of the first element in the array where predicate is true, and undefined\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found, find\n      * immediately returns that element value. Otherwise, find returns undefined.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number | undefined;\n\n    /**\n      * Returns the index of the first element in the array where predicate is true, and -1\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found,\n      * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    findIndex(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;\n\n    /**\n      * Performs the specified action for each element in an array.\n      * @param callbackfn  A function that accepts up to three arguments. forEach calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg  An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    forEach(callbackfn: (value: number, index: number, array: Int32Array) => void, thisArg?: any): void;\n\n    /**\n      * Returns the index of the first occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      *  search starts at index 0.\n      */\n    indexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * Adds all the elements of an array separated by the specified separator string.\n      * @param separator A string used to separate one element of an array from the next in the\n      * resulting String. If omitted, the array elements are separated with a comma.\n      */\n    join(separator?: string): string;\n\n    /**\n      * Returns the index of the last occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      * search starts at index 0.\n      */\n    lastIndexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * The length of the array.\n      */\n    readonly length: number;\n\n    /**\n      * Calls a defined callback function on each element of an array, and returns an array that\n      * contains the results.\n      * @param callbackfn A function that accepts up to three arguments. The map method calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    map(callbackfn: (value: number, index: number, array: Int32Array) => number, thisArg?: any): Int32Array;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int32Array) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int32Array) => U, initialValue: U): U;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an\n      * argument instead of an array value.\n      */\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int32Array) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int32Array) => U, initialValue: U): U;\n\n    /**\n      * Reverses the elements in an Array.\n      */\n    reverse(): Int32Array;\n\n    /**\n      * Sets a value or an array of values.\n      * @param array A typed or untyped array of values to set.\n      * @param offset The index in the current array at which the values are to be written.\n      */\n    set(array: ArrayLike<number>, offset?: number): void;\n\n    /**\n      * Returns a section of an array.\n      * @param start The beginning of the specified portion of the array.\n      * @param end The end of the specified portion of the array.\n      */\n    slice(start?: number, end?: number): Int32Array;\n\n    /**\n      * Determines whether the specified callback function returns true for any element of an array.\n      * @param callbackfn A function that accepts up to three arguments. The some method calls the\n      * callbackfn function for each element in array1 until the callbackfn returns true, or until\n      * the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    some(callbackfn: (value: number, index: number, array: Int32Array) => boolean, thisArg?: any): boolean;\n\n    /**\n      * Sorts an array.\n      * @param compareFn The name of the function used to determine the order of the elements. If\n      * omitted, the elements are sorted in ascending, ASCII character order.\n      */\n    sort(compareFn?: (a: number, b: number) => number): this;\n\n    /**\n      * Gets a new Int32Array view of the ArrayBuffer store for this array, referencing the elements\n      * at begin, inclusive, up to end, exclusive.\n      * @param begin The index of the beginning of the array.\n      * @param end The index of the end of the array.\n      */\n    subarray(begin: number, end?: number): Int32Array;\n\n    /**\n      * Converts a number to a string by using the current locale.\n      */\n    toLocaleString(): string;\n\n    /**\n      * Returns a string representation of an array.\n      */\n    toString(): string;\n\n    [index: number]: number;\n}\n\ninterface Int32ArrayConstructor {\n    readonly prototype: Int32Array;\n    new(length: number): Int32Array;\n    new(array: ArrayLike<number>): Int32Array;\n    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Int32Array;\n\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * Returns a new array from a set of elements.\n      * @param items A set of elements to include in the new array object.\n      */\n    of(...items: number[]): Int32Array;\n\n    /**\n      * Creates an array from an array-like or iterable object.\n      * @param arrayLike An array-like or iterable object to convert to an array.\n      * @param mapfn A mapping function to call on every element of the array.\n      * @param thisArg Value of \'this\' used to invoke the mapfn.\n      */\n    from(arrayLike: ArrayLike<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Int32Array;\n\n}\ndeclare const Int32Array: Int32ArrayConstructor;\n\n/**\n  * A typed array of 32-bit unsigned integer values. The contents are initialized to 0. If the\n  * requested number of bytes could not be allocated an exception is raised.\n  */\ninterface Uint32Array {\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * The ArrayBuffer instance referenced by the array.\n      */\n    readonly buffer: ArrayBufferLike;\n\n    /**\n      * The length in bytes of the array.\n      */\n    readonly byteLength: number;\n\n    /**\n      * The offset in bytes of the array.\n      */\n    readonly byteOffset: number;\n\n    /**\n      * Returns the this object after copying a section of the array identified by start and end\n      * to the same array starting at position target\n      * @param target If target is negative, it is treated as length+target where length is the\n      * length of the array.\n      * @param start If start is negative, it is treated as length+start. If end is negative, it\n      * is treated as length+end.\n      * @param end If not specified, length of the this object is used as its default value.\n      */\n    copyWithin(target: number, start: number, end?: number): this;\n\n    /**\n      * Determines whether all the members of an array satisfy the specified test.\n      * @param callbackfn A function that accepts up to three arguments. The every method calls\n      * the callbackfn function for each element in array1 until the callbackfn returns false,\n      * or until the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    every(callbackfn: (value: number, index: number, array: Uint32Array) => boolean, thisArg?: any): boolean;\n\n    /**\n        * Returns the this object after filling the section identified by start and end with value\n        * @param value value to fill array section with\n        * @param start index to start filling the array at. If start is negative, it is treated as\n        * length+start where length is the length of the array.\n        * @param end index to stop filling the array at. If end is negative, it is treated as\n        * length+end.\n        */\n    fill(value: number, start?: number, end?: number): this;\n\n    /**\n      * Returns the elements of an array that meet the condition specified in a callback function.\n      * @param callbackfn A function that accepts up to three arguments. The filter method calls\n      * the callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    filter(callbackfn: (value: number, index: number, array: Uint32Array) => any, thisArg?: any): Uint32Array;\n\n    /**\n      * Returns the value of the first element in the array where predicate is true, and undefined\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found, find\n      * immediately returns that element value. Otherwise, find returns undefined.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number | undefined;\n\n    /**\n      * Returns the index of the first element in the array where predicate is true, and -1\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found,\n      * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    findIndex(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;\n\n    /**\n      * Performs the specified action for each element in an array.\n      * @param callbackfn  A function that accepts up to three arguments. forEach calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg  An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    forEach(callbackfn: (value: number, index: number, array: Uint32Array) => void, thisArg?: any): void;\n    /**\n      * Returns the index of the first occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      *  search starts at index 0.\n      */\n    indexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * Adds all the elements of an array separated by the specified separator string.\n      * @param separator A string used to separate one element of an array from the next in the\n      * resulting String. If omitted, the array elements are separated with a comma.\n      */\n    join(separator?: string): string;\n\n    /**\n      * Returns the index of the last occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      * search starts at index 0.\n      */\n    lastIndexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * The length of the array.\n      */\n    readonly length: number;\n\n    /**\n      * Calls a defined callback function on each element of an array, and returns an array that\n      * contains the results.\n      * @param callbackfn A function that accepts up to three arguments. The map method calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    map(callbackfn: (this: void, value: number, index: number, array: Uint32Array) => number, thisArg?: any): Uint32Array;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint32Array) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint32Array) => U, initialValue: U): U;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an\n      * argument instead of an array value.\n      */\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint32Array) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint32Array) => U, initialValue: U): U;\n\n    /**\n      * Reverses the elements in an Array.\n      */\n    reverse(): Uint32Array;\n\n    /**\n      * Sets a value or an array of values.\n      * @param array A typed or untyped array of values to set.\n      * @param offset The index in the current array at which the values are to be written.\n      */\n    set(array: ArrayLike<number>, offset?: number): void;\n\n    /**\n      * Returns a section of an array.\n      * @param start The beginning of the specified portion of the array.\n      * @param end The end of the specified portion of the array.\n      */\n    slice(start?: number, end?: number): Uint32Array;\n\n    /**\n      * Determines whether the specified callback function returns true for any element of an array.\n      * @param callbackfn A function that accepts up to three arguments. The some method calls the\n      * callbackfn function for each element in array1 until the callbackfn returns true, or until\n      * the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    some(callbackfn: (value: number, index: number, array: Uint32Array) => boolean, thisArg?: any): boolean;\n\n    /**\n      * Sorts an array.\n      * @param compareFn The name of the function used to determine the order of the elements. If\n      * omitted, the elements are sorted in ascending, ASCII character order.\n      */\n    sort(compareFn?: (a: number, b: number) => number): this;\n\n    /**\n      * Gets a new Uint32Array view of the ArrayBuffer store for this array, referencing the elements\n      * at begin, inclusive, up to end, exclusive.\n      * @param begin The index of the beginning of the array.\n      * @param end The index of the end of the array.\n      */\n    subarray(begin: number, end?: number): Uint32Array;\n\n    /**\n      * Converts a number to a string by using the current locale.\n      */\n    toLocaleString(): string;\n\n    /**\n      * Returns a string representation of an array.\n      */\n    toString(): string;\n\n    [index: number]: number;\n}\n\ninterface Uint32ArrayConstructor {\n    readonly prototype: Uint32Array;\n    new(length: number): Uint32Array;\n    new(array: ArrayLike<number>): Uint32Array;\n    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Uint32Array;\n\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * Returns a new array from a set of elements.\n      * @param items A set of elements to include in the new array object.\n      */\n    of(...items: number[]): Uint32Array;\n\n    /**\n      * Creates an array from an array-like or iterable object.\n      * @param arrayLike An array-like or iterable object to convert to an array.\n      * @param mapfn A mapping function to call on every element of the array.\n      * @param thisArg Value of \'this\' used to invoke the mapfn.\n      */\n    from(arrayLike: ArrayLike<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Uint32Array;\n\n}\ndeclare const Uint32Array: Uint32ArrayConstructor;\n\n/**\n  * A typed array of 32-bit float values. The contents are initialized to 0. If the requested number\n  * of bytes could not be allocated an exception is raised.\n  */\ninterface Float32Array {\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * The ArrayBuffer instance referenced by the array.\n      */\n    readonly buffer: ArrayBufferLike;\n\n    /**\n      * The length in bytes of the array.\n      */\n    readonly byteLength: number;\n\n    /**\n      * The offset in bytes of the array.\n      */\n    readonly byteOffset: number;\n\n    /**\n      * Returns the this object after copying a section of the array identified by start and end\n      * to the same array starting at position target\n      * @param target If target is negative, it is treated as length+target where length is the\n      * length of the array.\n      * @param start If start is negative, it is treated as length+start. If end is negative, it\n      * is treated as length+end.\n      * @param end If not specified, length of the this object is used as its default value.\n      */\n    copyWithin(target: number, start: number, end?: number): this;\n\n    /**\n      * Determines whether all the members of an array satisfy the specified test.\n      * @param callbackfn A function that accepts up to three arguments. The every method calls\n      * the callbackfn function for each element in array1 until the callbackfn returns false,\n      * or until the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    every(callbackfn: (value: number, index: number, array: Float32Array) => boolean, thisArg?: any): boolean;\n\n    /**\n        * Returns the this object after filling the section identified by start and end with value\n        * @param value value to fill array section with\n        * @param start index to start filling the array at. If start is negative, it is treated as\n        * length+start where length is the length of the array.\n        * @param end index to stop filling the array at. If end is negative, it is treated as\n        * length+end.\n        */\n    fill(value: number, start?: number, end?: number): this;\n\n    /**\n      * Returns the elements of an array that meet the condition specified in a callback function.\n      * @param callbackfn A function that accepts up to three arguments. The filter method calls\n      * the callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    filter(callbackfn: (value: number, index: number, array: Float32Array) => any, thisArg?: any): Float32Array;\n\n    /**\n      * Returns the value of the first element in the array where predicate is true, and undefined\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found, find\n      * immediately returns that element value. Otherwise, find returns undefined.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number | undefined;\n\n    /**\n      * Returns the index of the first element in the array where predicate is true, and -1\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found,\n      * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    findIndex(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;\n\n    /**\n      * Performs the specified action for each element in an array.\n      * @param callbackfn  A function that accepts up to three arguments. forEach calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg  An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    forEach(callbackfn: (value: number, index: number, array: Float32Array) => void, thisArg?: any): void;\n\n    /**\n      * Returns the index of the first occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      *  search starts at index 0.\n      */\n    indexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * Adds all the elements of an array separated by the specified separator string.\n      * @param separator A string used to separate one element of an array from the next in the\n      * resulting String. If omitted, the array elements are separated with a comma.\n      */\n    join(separator?: string): string;\n\n    /**\n      * Returns the index of the last occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      * search starts at index 0.\n      */\n    lastIndexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * The length of the array.\n      */\n    readonly length: number;\n\n    /**\n      * Calls a defined callback function on each element of an array, and returns an array that\n      * contains the results.\n      * @param callbackfn A function that accepts up to three arguments. The map method calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    map(callbackfn: (this: void, value: number, index: number, array: Float32Array) => number, thisArg?: any): Float32Array;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float32Array) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Float32Array) => U, initialValue: U): U;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an\n      * argument instead of an array value.\n      */\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float32Array) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Float32Array) => U, initialValue: U): U;\n\n    /**\n      * Reverses the elements in an Array.\n      */\n    reverse(): Float32Array;\n\n    /**\n      * Sets a value or an array of values.\n      * @param array A typed or untyped array of values to set.\n      * @param offset The index in the current array at which the values are to be written.\n      */\n    set(array: ArrayLike<number>, offset?: number): void;\n\n    /**\n      * Returns a section of an array.\n      * @param start The beginning of the specified portion of the array.\n      * @param end The end of the specified portion of the array.\n      */\n    slice(start?: number, end?: number): Float32Array;\n\n    /**\n      * Determines whether the specified callback function returns true for any element of an array.\n      * @param callbackfn A function that accepts up to three arguments. The some method calls the\n      * callbackfn function for each element in array1 until the callbackfn returns true, or until\n      * the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    some(callbackfn: (value: number, index: number, array: Float32Array) => boolean, thisArg?: any): boolean;\n\n    /**\n      * Sorts an array.\n      * @param compareFn The name of the function used to determine the order of the elements. If\n      * omitted, the elements are sorted in ascending, ASCII character order.\n      */\n    sort(compareFn?: (a: number, b: number) => number): this;\n\n    /**\n      * Gets a new Float32Array view of the ArrayBuffer store for this array, referencing the elements\n      * at begin, inclusive, up to end, exclusive.\n      * @param begin The index of the beginning of the array.\n      * @param end The index of the end of the array.\n      */\n    subarray(begin: number, end?: number): Float32Array;\n\n    /**\n      * Converts a number to a string by using the current locale.\n      */\n    toLocaleString(): string;\n\n    /**\n      * Returns a string representation of an array.\n      */\n    toString(): string;\n\n    [index: number]: number;\n}\n\ninterface Float32ArrayConstructor {\n    readonly prototype: Float32Array;\n    new(length: number): Float32Array;\n    new(array: ArrayLike<number>): Float32Array;\n    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Float32Array;\n\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * Returns a new array from a set of elements.\n      * @param items A set of elements to include in the new array object.\n      */\n    of(...items: number[]): Float32Array;\n\n    /**\n      * Creates an array from an array-like or iterable object.\n      * @param arrayLike An array-like or iterable object to convert to an array.\n      * @param mapfn A mapping function to call on every element of the array.\n      * @param thisArg Value of \'this\' used to invoke the mapfn.\n      */\n    from(arrayLike: ArrayLike<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Float32Array;\n\n\n}\ndeclare const Float32Array: Float32ArrayConstructor;\n\n/**\n  * A typed array of 64-bit float values. The contents are initialized to 0. If the requested\n  * number of bytes could not be allocated an exception is raised.\n  */\ninterface Float64Array {\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * The ArrayBuffer instance referenced by the array.\n      */\n    readonly buffer: ArrayBufferLike;\n\n    /**\n      * The length in bytes of the array.\n      */\n    readonly byteLength: number;\n\n    /**\n      * The offset in bytes of the array.\n      */\n    readonly byteOffset: number;\n\n    /**\n      * Returns the this object after copying a section of the array identified by start and end\n      * to the same array starting at position target\n      * @param target If target is negative, it is treated as length+target where length is the\n      * length of the array.\n      * @param start If start is negative, it is treated as length+start. If end is negative, it\n      * is treated as length+end.\n      * @param end If not specified, length of the this object is used as its default value.\n      */\n    copyWithin(target: number, start: number, end?: number): this;\n\n    /**\n      * Determines whether all the members of an array satisfy the specified test.\n      * @param callbackfn A function that accepts up to three arguments. The every method calls\n      * the callbackfn function for each element in array1 until the callbackfn returns false,\n      * or until the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    every(callbackfn: (value: number, index: number, array: Float64Array) => boolean, thisArg?: any): boolean;\n\n    /**\n        * Returns the this object after filling the section identified by start and end with value\n        * @param value value to fill array section with\n        * @param start index to start filling the array at. If start is negative, it is treated as\n        * length+start where length is the length of the array.\n        * @param end index to stop filling the array at. If end is negative, it is treated as\n        * length+end.\n        */\n    fill(value: number, start?: number, end?: number): this;\n\n    /**\n      * Returns the elements of an array that meet the condition specified in a callback function.\n      * @param callbackfn A function that accepts up to three arguments. The filter method calls\n      * the callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    filter(callbackfn: (value: number, index: number, array: Float64Array) => any, thisArg?: any): Float64Array;\n\n    /**\n      * Returns the value of the first element in the array where predicate is true, and undefined\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found, find\n      * immediately returns that element value. Otherwise, find returns undefined.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number | undefined;\n\n    /**\n      * Returns the index of the first element in the array where predicate is true, and -1\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found,\n      * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    findIndex(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;\n\n    /**\n      * Performs the specified action for each element in an array.\n      * @param callbackfn  A function that accepts up to three arguments. forEach calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg  An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    forEach(callbackfn: (value: number, index: number, array: Float64Array) => void, thisArg?: any): void;\n\n    /**\n      * Returns the index of the first occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      *  search starts at index 0.\n      */\n    indexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * Adds all the elements of an array separated by the specified separator string.\n      * @param separator A string used to separate one element of an array from the next in the\n      * resulting String. If omitted, the array elements are separated with a comma.\n      */\n    join(separator?: string): string;\n\n    /**\n      * Returns the index of the last occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      * search starts at index 0.\n      */\n    lastIndexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * The length of the array.\n      */\n    readonly length: number;\n\n    /**\n      * Calls a defined callback function on each element of an array, and returns an array that\n      * contains the results.\n      * @param callbackfn A function that accepts up to three arguments. The map method calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    map(callbackfn: (this: void, value: number, index: number, array: Float64Array) => number, thisArg?: any): Float64Array;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float64Array) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Float64Array) => U, initialValue: U): U;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an\n      * argument instead of an array value.\n      */\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float64Array) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Float64Array) => U, initialValue: U): U;\n\n    /**\n      * Reverses the elements in an Array.\n      */\n    reverse(): Float64Array;\n\n    /**\n      * Sets a value or an array of values.\n      * @param array A typed or untyped array of values to set.\n      * @param offset The index in the current array at which the values are to be written.\n      */\n    set(array: ArrayLike<number>, offset?: number): void;\n\n    /**\n      * Returns a section of an array.\n      * @param start The beginning of the specified portion of the array.\n      * @param end The end of the specified portion of the array.\n      */\n    slice(start?: number, end?: number): Float64Array;\n\n    /**\n      * Determines whether the specified callback function returns true for any element of an array.\n      * @param callbackfn A function that accepts up to three arguments. The some method calls the\n      * callbackfn function for each element in array1 until the callbackfn returns true, or until\n      * the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    some(callbackfn: (value: number, index: number, array: Float64Array) => boolean, thisArg?: any): boolean;\n\n    /**\n      * Sorts an array.\n      * @param compareFn The name of the function used to determine the order of the elements. If\n      * omitted, the elements are sorted in ascending, ASCII character order.\n      */\n    sort(compareFn?: (a: number, b: number) => number): this;\n\n    /**\n      * Gets a new Float64Array view of the ArrayBuffer store for this array, referencing the elements\n      * at begin, inclusive, up to end, exclusive.\n      * @param begin The index of the beginning of the array.\n      * @param end The index of the end of the array.\n      */\n    subarray(begin: number, end?: number): Float64Array;\n\n    /**\n      * Converts a number to a string by using the current locale.\n      */\n    toLocaleString(): string;\n\n    /**\n      * Returns a string representation of an array.\n      */\n    toString(): string;\n\n    [index: number]: number;\n}\n\ninterface Float64ArrayConstructor {\n    readonly prototype: Float64Array;\n    new(length: number): Float64Array;\n    new(array: ArrayLike<number>): Float64Array;\n    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Float64Array;\n\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * Returns a new array from a set of elements.\n      * @param items A set of elements to include in the new array object.\n      */\n    of(...items: number[]): Float64Array;\n\n    /**\n      * Creates an array from an array-like or iterable object.\n      * @param arrayLike An array-like or iterable object to convert to an array.\n      * @param mapfn A mapping function to call on every element of the array.\n      * @param thisArg Value of \'this\' used to invoke the mapfn.\n      */\n    from(arrayLike: ArrayLike<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Float64Array;\n\n}\ndeclare const Float64Array: Float64ArrayConstructor;\n\n/////////////////////////////\n/// ECMAScript Internationalization API\n/////////////////////////////\n\ndeclare namespace Intl {\n    interface CollatorOptions {\n        usage?: string;\n        localeMatcher?: string;\n        numeric?: boolean;\n        caseFirst?: string;\n        sensitivity?: string;\n        ignorePunctuation?: boolean;\n    }\n\n    interface ResolvedCollatorOptions {\n        locale: string;\n        usage: string;\n        sensitivity: string;\n        ignorePunctuation: boolean;\n        collation: string;\n        caseFirst: string;\n        numeric: boolean;\n    }\n\n    interface Collator {\n        compare(x: string, y: string): number;\n        resolvedOptions(): ResolvedCollatorOptions;\n    }\n    var Collator: {\n        new(locales?: string | string[], options?: CollatorOptions): Collator;\n        (locales?: string | string[], options?: CollatorOptions): Collator;\n        supportedLocalesOf(locales: string | string[], options?: CollatorOptions): string[];\n    };\n\n    interface NumberFormatOptions {\n        localeMatcher?: string;\n        style?: string;\n        currency?: string;\n        currencyDisplay?: string;\n        useGrouping?: boolean;\n        minimumIntegerDigits?: number;\n        minimumFractionDigits?: number;\n        maximumFractionDigits?: number;\n        minimumSignificantDigits?: number;\n        maximumSignificantDigits?: number;\n    }\n\n    interface ResolvedNumberFormatOptions {\n        locale: string;\n        numberingSystem: string;\n        style: string;\n        currency?: string;\n        currencyDisplay?: string;\n        minimumIntegerDigits: number;\n        minimumFractionDigits: number;\n        maximumFractionDigits: number;\n        minimumSignificantDigits?: number;\n        maximumSignificantDigits?: number;\n        useGrouping: boolean;\n    }\n\n    interface NumberFormat {\n        format(value: number): string;\n        resolvedOptions(): ResolvedNumberFormatOptions;\n    }\n    var NumberFormat: {\n        new(locales?: string | string[], options?: NumberFormatOptions): NumberFormat;\n        (locales?: string | string[], options?: NumberFormatOptions): NumberFormat;\n        supportedLocalesOf(locales: string | string[], options?: NumberFormatOptions): string[];\n    };\n\n    interface DateTimeFormatOptions {\n        localeMatcher?: string;\n        weekday?: string;\n        era?: string;\n        year?: string;\n        month?: string;\n        day?: string;\n        hour?: string;\n        minute?: string;\n        second?: string;\n        timeZoneName?: string;\n        formatMatcher?: string;\n        hour12?: boolean;\n        timeZone?: string;\n    }\n\n    interface ResolvedDateTimeFormatOptions {\n        locale: string;\n        calendar: string;\n        numberingSystem: string;\n        timeZone: string;\n        hour12?: boolean;\n        weekday?: string;\n        era?: string;\n        year?: string;\n        month?: string;\n        day?: string;\n        hour?: string;\n        minute?: string;\n        second?: string;\n        timeZoneName?: string;\n    }\n\n    interface DateTimeFormat {\n        format(date?: Date | number): string;\n        resolvedOptions(): ResolvedDateTimeFormatOptions;\n    }\n    var DateTimeFormat: {\n        new(locales?: string | string[], options?: DateTimeFormatOptions): DateTimeFormat;\n        (locales?: string | string[], options?: DateTimeFormatOptions): DateTimeFormat;\n        supportedLocalesOf(locales: string | string[], options?: DateTimeFormatOptions): string[];\n    };\n}\n\ninterface String {\n    /**\n      * Determines whether two strings are equivalent in the current or specified locale.\n      * @param that String to compare to target string\n      * @param locales A locale string or array of locale strings that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used. This parameter must conform to BCP 47 standards; see the Intl.Collator object for details.\n      * @param options An object that contains one or more properties that specify comparison options. see the Intl.Collator object for details.\n      */\n    localeCompare(that: string, locales?: string | string[], options?: Intl.CollatorOptions): number;\n}\n\ninterface Number {\n    /**\n      * Converts a number to a string by using the current or specified locale.\n      * @param locales A locale string or array of locale strings that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used.\n      * @param options An object that contains one or more properties that specify comparison options.\n      */\n    toLocaleString(locales?: string | string[], options?: Intl.NumberFormatOptions): string;\n}\n\ninterface Date {\n    /**\n      * Converts a date and time to a string by using the current or specified locale.\n      * @param locales A locale string or array of locale strings that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used.\n      * @param options An object that contains one or more properties that specify comparison options.\n      */\n    toLocaleString(locales?: string | string[], options?: Intl.DateTimeFormatOptions): string;\n    /**\n      * Converts a date to a string by using the current or specified locale.\n      * @param locales A locale string or array of locale strings that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used.\n      * @param options An object that contains one or more properties that specify comparison options.\n      */\n    toLocaleDateString(locales?: string | string[], options?: Intl.DateTimeFormatOptions): string;\n\n    /**\n      * Converts a time to a string by using the current or specified locale.\n      * @param locales A locale string or array of locale strings that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used.\n      * @param options An object that contains one or more properties that specify comparison options.\n      */\n    toLocaleTimeString(locales?: string | string[], options?: Intl.DateTimeFormatOptions): string;\n}\n\n\n\n/////////////////////////////\n/// DOM APIs\n/////////////////////////////\n\ninterface Account {\n    displayName?: string;\n    id?: string;\n    imageURL?: string;\n    name?: string;\n    rpDisplayName?: string;\n}\n\ninterface Algorithm {\n    name: string;\n}\n\ninterface AnimationEventInit extends EventInit {\n    animationName?: string;\n    elapsedTime?: number;\n}\n\ninterface AssertionOptions {\n    allowList?: ScopedCredentialDescriptor[];\n    extensions?: WebAuthnExtensions;\n    rpId?: USVString;\n    timeoutSeconds?: number;\n}\n\ninterface CacheQueryOptions {\n    cacheName?: string;\n    ignoreMethod?: boolean;\n    ignoreSearch?: boolean;\n    ignoreVary?: boolean;\n}\n\ninterface ClientData {\n    challenge?: string;\n    extensions?: WebAuthnExtensions;\n    hashAlg?: string | Algorithm;\n    origin?: string;\n    rpId?: string;\n    tokenBinding?: string;\n}\n\ninterface CloseEventInit extends EventInit {\n    code?: number;\n    reason?: string;\n    wasClean?: boolean;\n}\n\ninterface CompositionEventInit extends UIEventInit {\n    data?: string;\n}\n\ninterface ConfirmSiteSpecificExceptionsInformation extends ExceptionInformation {\n    arrayOfDomainStrings?: string[];\n}\n\ninterface ConstrainBooleanParameters {\n    exact?: boolean;\n    ideal?: boolean;\n}\n\ninterface ConstrainDOMStringParameters {\n    exact?: string | string[];\n    ideal?: string | string[];\n}\n\ninterface ConstrainDoubleRange extends DoubleRange {\n    exact?: number;\n    ideal?: number;\n}\n\ninterface ConstrainLongRange extends LongRange {\n    exact?: number;\n    ideal?: number;\n}\n\ninterface ConstrainVideoFacingModeParameters {\n    exact?: VideoFacingModeEnum | VideoFacingModeEnum[];\n    ideal?: VideoFacingModeEnum | VideoFacingModeEnum[];\n}\n\ninterface CustomEventInit extends EventInit {\n    detail?: any;\n}\n\ninterface DeviceAccelerationDict {\n    x?: number;\n    y?: number;\n    z?: number;\n}\n\ninterface DeviceLightEventInit extends EventInit {\n    value?: number;\n}\n\ninterface DeviceMotionEventInit extends EventInit {\n    acceleration?: DeviceAccelerationDict;\n    accelerationIncludingGravity?: DeviceAccelerationDict;\n    interval?: number;\n    rotationRate?: DeviceRotationRateDict;\n}\n\ninterface DeviceOrientationEventInit extends EventInit {\n    absolute?: boolean;\n    alpha?: number;\n    beta?: number;\n    gamma?: number;\n}\n\ninterface DeviceRotationRateDict {\n    alpha?: number;\n    beta?: number;\n    gamma?: number;\n}\n\ninterface DOMRectInit {\n    height?: any;\n    width?: any;\n    x?: any;\n    y?: any;\n}\n\ninterface DoubleRange {\n    max?: number;\n    min?: number;\n}\n\ninterface ErrorEventInit extends EventInit {\n    colno?: number;\n    error?: any;\n    filename?: string;\n    lineno?: number;\n    message?: string;\n}\n\ninterface EventInit {\n    scoped?: boolean;\n    bubbles?: boolean;\n    cancelable?: boolean;\n}\n\ninterface EventModifierInit extends UIEventInit {\n    altKey?: boolean;\n    ctrlKey?: boolean;\n    metaKey?: boolean;\n    modifierAltGraph?: boolean;\n    modifierCapsLock?: boolean;\n    modifierFn?: boolean;\n    modifierFnLock?: boolean;\n    modifierHyper?: boolean;\n    modifierNumLock?: boolean;\n    modifierOS?: boolean;\n    modifierScrollLock?: boolean;\n    modifierSuper?: boolean;\n    modifierSymbol?: boolean;\n    modifierSymbolLock?: boolean;\n    shiftKey?: boolean;\n}\n\ninterface ExceptionInformation {\n    domain?: string;\n}\n\ninterface FocusEventInit extends UIEventInit {\n    relatedTarget?: EventTarget;\n}\n\ninterface FocusNavigationEventInit extends EventInit {\n    navigationReason?: string;\n    originHeight?: number;\n    originLeft?: number;\n    originTop?: number;\n    originWidth?: number;\n}\n\ninterface FocusNavigationOrigin {\n    originHeight?: number;\n    originLeft?: number;\n    originTop?: number;\n    originWidth?: number;\n}\n\ninterface GamepadEventInit extends EventInit {\n    gamepad?: Gamepad;\n}\n\ninterface GetNotificationOptions {\n    tag?: string;\n}\n\ninterface HashChangeEventInit extends EventInit {\n    newURL?: string;\n    oldURL?: string;\n}\n\ninterface IDBIndexParameters {\n    multiEntry?: boolean;\n    unique?: boolean;\n}\n\ninterface IDBObjectStoreParameters {\n    autoIncrement?: boolean;\n    keyPath?: IDBKeyPath;\n}\n\ninterface IntersectionObserverEntryInit {\n    boundingClientRect?: DOMRectInit;\n    intersectionRect?: DOMRectInit;\n    rootBounds?: DOMRectInit;\n    target?: Element;\n    time?: number;\n}\n\ninterface IntersectionObserverInit {\n    root?: Element;\n    rootMargin?: string;\n    threshold?: number | number[];\n}\n\ninterface KeyAlgorithm {\n    name?: string;\n}\n\ninterface KeyboardEventInit extends EventModifierInit {\n    code?: string;\n    key?: string;\n    location?: number;\n    repeat?: boolean;\n}\n\ninterface LongRange {\n    max?: number;\n    min?: number;\n}\n\ninterface MediaEncryptedEventInit extends EventInit {\n    initData?: ArrayBuffer;\n    initDataType?: string;\n}\n\ninterface MediaKeyMessageEventInit extends EventInit {\n    message?: ArrayBuffer;\n    messageType?: MediaKeyMessageType;\n}\n\ninterface MediaKeySystemConfiguration {\n    audioCapabilities?: MediaKeySystemMediaCapability[];\n    distinctiveIdentifier?: MediaKeysRequirement;\n    initDataTypes?: string[];\n    persistentState?: MediaKeysRequirement;\n    videoCapabilities?: MediaKeySystemMediaCapability[];\n}\n\ninterface MediaKeySystemMediaCapability {\n    contentType?: string;\n    robustness?: string;\n}\n\ninterface MediaStreamConstraints {\n    audio?: boolean | MediaTrackConstraints;\n    video?: boolean | MediaTrackConstraints;\n}\n\ninterface MediaStreamErrorEventInit extends EventInit {\n    error?: MediaStreamError;\n}\n\ninterface MediaStreamEventInit extends EventInit {\n    stream?: MediaStream;\n}\n\ninterface MediaStreamTrackEventInit extends EventInit {\n    track?: MediaStreamTrack;\n}\n\ninterface MediaTrackCapabilities {\n    aspectRatio?: number | DoubleRange;\n    deviceId?: string;\n    echoCancellation?: boolean[];\n    facingMode?: string;\n    frameRate?: number | DoubleRange;\n    groupId?: string;\n    height?: number | LongRange;\n    sampleRate?: number | LongRange;\n    sampleSize?: number | LongRange;\n    volume?: number | DoubleRange;\n    width?: number | LongRange;\n}\n\ninterface MediaTrackConstraints extends MediaTrackConstraintSet {\n    advanced?: MediaTrackConstraintSet[];\n}\n\ninterface MediaTrackConstraintSet {\n    aspectRatio?: number | ConstrainDoubleRange;\n    deviceId?: string | string[] | ConstrainDOMStringParameters;\n    echoCancelation?: boolean | ConstrainBooleanParameters;\n    facingMode?: string | string[] | ConstrainDOMStringParameters;\n    frameRate?: number | ConstrainDoubleRange;\n    groupId?: string | string[] | ConstrainDOMStringParameters;\n    height?: number | ConstrainLongRange;\n    sampleRate?: number | ConstrainLongRange;\n    sampleSize?: number | ConstrainLongRange;\n    volume?: number | ConstrainDoubleRange;\n    width?: number | ConstrainLongRange;\n}\n\ninterface MediaTrackSettings {\n    aspectRatio?: number;\n    deviceId?: string;\n    echoCancellation?: boolean;\n    facingMode?: string;\n    frameRate?: number;\n    groupId?: string;\n    height?: number;\n    sampleRate?: number;\n    sampleSize?: number;\n    volume?: number;\n    width?: number;\n}\n\ninterface MediaTrackSupportedConstraints {\n    aspectRatio?: boolean;\n    deviceId?: boolean;\n    echoCancellation?: boolean;\n    facingMode?: boolean;\n    frameRate?: boolean;\n    groupId?: boolean;\n    height?: boolean;\n    sampleRate?: boolean;\n    sampleSize?: boolean;\n    volume?: boolean;\n    width?: boolean;\n}\n\ninterface MessageEventInit extends EventInit {\n    lastEventId?: string;\n    channel?: string;\n    data?: any;\n    origin?: string;\n    ports?: MessagePort[];\n    source?: Window;\n}\n\ninterface MouseEventInit extends EventModifierInit {\n    button?: number;\n    buttons?: number;\n    clientX?: number;\n    clientY?: number;\n    relatedTarget?: EventTarget;\n    screenX?: number;\n    screenY?: number;\n}\n\ninterface MSAccountInfo {\n    accountImageUri?: string;\n    accountName?: string;\n    rpDisplayName?: string;\n    userDisplayName?: string;\n    userId?: string;\n}\n\ninterface MSAudioLocalClientEvent extends MSLocalClientEventBase {\n    cpuInsufficientEventRatio?: number;\n    deviceCaptureNotFunctioningEventRatio?: number;\n    deviceClippingEventRatio?: number;\n    deviceEchoEventRatio?: number;\n    deviceGlitchesEventRatio?: number;\n    deviceHalfDuplexAECEventRatio?: number;\n    deviceHowlingEventCount?: number;\n    deviceLowSNREventRatio?: number;\n    deviceLowSpeechLevelEventRatio?: number;\n    deviceMultipleEndpointsEventCount?: number;\n    deviceNearEndToEchoRatioEventRatio?: number;\n    deviceRenderMuteEventRatio?: number;\n    deviceRenderNotFunctioningEventRatio?: number;\n    deviceRenderZeroVolumeEventRatio?: number;\n    networkDelayEventRatio?: number;\n    networkSendQualityEventRatio?: number;\n}\n\ninterface MSAudioRecvPayload extends MSPayloadBase {\n    burstLossLength1?: number;\n    burstLossLength2?: number;\n    burstLossLength3?: number;\n    burstLossLength4?: number;\n    burstLossLength5?: number;\n    burstLossLength6?: number;\n    burstLossLength7?: number;\n    burstLossLength8OrHigher?: number;\n    fecRecvDistance1?: number;\n    fecRecvDistance2?: number;\n    fecRecvDistance3?: number;\n    packetReorderDepthAvg?: number;\n    packetReorderDepthMax?: number;\n    packetReorderRatio?: number;\n    ratioCompressedSamplesAvg?: number;\n    ratioConcealedSamplesAvg?: number;\n    ratioStretchedSamplesAvg?: number;\n    samplingRate?: number;\n    signal?: MSAudioRecvSignal;\n}\n\ninterface MSAudioRecvSignal {\n    initialSignalLevelRMS?: number;\n    recvNoiseLevelCh1?: number;\n    recvSignalLevelCh1?: number;\n    renderLoopbackSignalLevel?: number;\n    renderNoiseLevel?: number;\n    renderSignalLevel?: number;\n}\n\ninterface MSAudioSendPayload extends MSPayloadBase {\n    audioFECUsed?: boolean;\n    samplingRate?: number;\n    sendMutePercent?: number;\n    signal?: MSAudioSendSignal;\n}\n\ninterface MSAudioSendSignal {\n    noiseLevel?: number;\n    sendNoiseLevelCh1?: number;\n    sendSignalLevelCh1?: number;\n}\n\ninterface MSConnectivity {\n    iceType?: MSIceType;\n    iceWarningFlags?: MSIceWarningFlags;\n    relayAddress?: MSRelayAddress;\n}\n\ninterface MSCredentialFilter {\n    accept?: MSCredentialSpec[];\n}\n\ninterface MSCredentialParameters {\n    type?: MSCredentialType;\n}\n\ninterface MSCredentialSpec {\n    id?: string;\n    type?: MSCredentialType;\n}\n\ninterface MSDelay {\n    roundTrip?: number;\n    roundTripMax?: number;\n}\n\ninterface MSDescription extends RTCStats {\n    connectivity?: MSConnectivity;\n    deviceDevName?: string;\n    localAddr?: MSIPAddressInfo;\n    networkconnectivity?: MSNetworkConnectivityInfo;\n    reflexiveLocalIPAddr?: MSIPAddressInfo;\n    remoteAddr?: MSIPAddressInfo;\n    transport?: RTCIceProtocol;\n}\n\ninterface MSFIDOCredentialParameters extends MSCredentialParameters {\n    algorithm?: string | Algorithm;\n    authenticators?: AAGUID[];\n}\n\ninterface MSIceWarningFlags {\n    allocationMessageIntegrityFailed?: boolean;\n    alternateServerReceived?: boolean;\n    connCheckMessageIntegrityFailed?: boolean;\n    connCheckOtherError?: boolean;\n    fipsAllocationFailure?: boolean;\n    multipleRelayServersAttempted?: boolean;\n    noRelayServersConfigured?: boolean;\n    portRangeExhausted?: boolean;\n    pseudoTLSFailure?: boolean;\n    tcpNatConnectivityFailed?: boolean;\n    tcpRelayConnectivityFailed?: boolean;\n    turnAuthUnknownUsernameError?: boolean;\n    turnTcpAllocateFailed?: boolean;\n    turnTcpSendFailed?: boolean;\n    turnTcpTimedOut?: boolean;\n    turnTurnTcpConnectivityFailed?: boolean;\n    turnUdpAllocateFailed?: boolean;\n    turnUdpSendFailed?: boolean;\n    udpLocalConnectivityFailed?: boolean;\n    udpNatConnectivityFailed?: boolean;\n    udpRelayConnectivityFailed?: boolean;\n    useCandidateChecksFailed?: boolean;\n}\n\ninterface MSIPAddressInfo {\n    ipAddr?: string;\n    manufacturerMacAddrMask?: string;\n    port?: number;\n}\n\ninterface MSJitter {\n    interArrival?: number;\n    interArrivalMax?: number;\n    interArrivalSD?: number;\n}\n\ninterface MSLocalClientEventBase extends RTCStats {\n    networkBandwidthLowEventRatio?: number;\n    networkReceiveQualityEventRatio?: number;\n}\n\ninterface MSNetwork extends RTCStats {\n    delay?: MSDelay;\n    jitter?: MSJitter;\n    packetLoss?: MSPacketLoss;\n    utilization?: MSUtilization;\n}\n\ninterface MSNetworkConnectivityInfo {\n    linkspeed?: number;\n    networkConnectionDetails?: string;\n    vpn?: boolean;\n}\n\ninterface MSNetworkInterfaceType {\n    interfaceTypeEthernet?: boolean;\n    interfaceTypePPP?: boolean;\n    interfaceTypeTunnel?: boolean;\n    interfaceTypeWireless?: boolean;\n    interfaceTypeWWAN?: boolean;\n}\n\ninterface MSOutboundNetwork extends MSNetwork {\n    appliedBandwidthLimit?: number;\n}\n\ninterface MSPacketLoss {\n    lossRate?: number;\n    lossRateMax?: number;\n}\n\ninterface MSPayloadBase extends RTCStats {\n    payloadDescription?: string;\n}\n\ninterface MSPortRange {\n    max?: number;\n    min?: number;\n}\n\ninterface MSRelayAddress {\n    port?: number;\n    relayAddress?: string;\n}\n\ninterface MSSignatureParameters {\n    userPrompt?: string;\n}\n\ninterface MSTransportDiagnosticsStats extends RTCStats {\n    allocationTimeInMs?: number;\n    baseAddress?: string;\n    baseInterface?: MSNetworkInterfaceType;\n    iceRole?: RTCIceRole;\n    iceWarningFlags?: MSIceWarningFlags;\n    interfaces?: MSNetworkInterfaceType;\n    localAddress?: string;\n    localAddrType?: MSIceAddrType;\n    localInterface?: MSNetworkInterfaceType;\n    localMR?: string;\n    localMRTCPPort?: number;\n    localSite?: string;\n    msRtcEngineVersion?: string;\n    networkName?: string;\n    numConsentReqReceived?: number;\n    numConsentReqSent?: number;\n    numConsentRespReceived?: number;\n    numConsentRespSent?: number;\n    portRangeMax?: number;\n    portRangeMin?: number;\n    protocol?: RTCIceProtocol;\n    remoteAddress?: string;\n    remoteAddrType?: MSIceAddrType;\n    remoteMR?: string;\n    remoteMRTCPPort?: number;\n    remoteSite?: string;\n    rtpRtcpMux?: boolean;\n    stunVer?: number;\n}\n\ninterface MSUtilization {\n    bandwidthEstimation?: number;\n    bandwidthEstimationAvg?: number;\n    bandwidthEstimationMax?: number;\n    bandwidthEstimationMin?: number;\n    bandwidthEstimationStdDev?: number;\n    packets?: number;\n}\n\ninterface MSVideoPayload extends MSPayloadBase {\n    durationSeconds?: number;\n    resolution?: string;\n    videoBitRateAvg?: number;\n    videoBitRateMax?: number;\n    videoFrameRateAvg?: number;\n    videoPacketLossRate?: number;\n}\n\ninterface MSVideoRecvPayload extends MSVideoPayload {\n    lowBitRateCallPercent?: number;\n    lowFrameRateCallPercent?: number;\n    recvBitRateAverage?: number;\n    recvBitRateMaximum?: number;\n    recvCodecType?: string;\n    recvFpsHarmonicAverage?: number;\n    recvFrameRateAverage?: number;\n    recvNumResSwitches?: number;\n    recvReorderBufferMaxSuccessfullyOrderedExtent?: number;\n    recvReorderBufferMaxSuccessfullyOrderedLateTime?: number;\n    recvReorderBufferPacketsDroppedDueToBufferExhaustion?: number;\n    recvReorderBufferPacketsDroppedDueToTimeout?: number;\n    recvReorderBufferReorderedPackets?: number;\n    recvResolutionHeight?: number;\n    recvResolutionWidth?: number;\n    recvVideoStreamsMax?: number;\n    recvVideoStreamsMin?: number;\n    recvVideoStreamsMode?: number;\n    reorderBufferTotalPackets?: number;\n    videoFrameLossRate?: number;\n    videoPostFECPLR?: number;\n    videoResolutions?: MSVideoResolutionDistribution;\n}\n\ninterface MSVideoResolutionDistribution {\n    cifQuality?: number;\n    h1080Quality?: number;\n    h1440Quality?: number;\n    h2160Quality?: number;\n    h720Quality?: number;\n    vgaQuality?: number;\n}\n\ninterface MSVideoSendPayload extends MSVideoPayload {\n    sendBitRateAverage?: number;\n    sendBitRateMaximum?: number;\n    sendFrameRateAverage?: number;\n    sendResolutionHeight?: number;\n    sendResolutionWidth?: number;\n    sendVideoStreamsMax?: number;\n}\n\ninterface MsZoomToOptions {\n    animate?: string;\n    contentX?: number;\n    contentY?: number;\n    scaleFactor?: number;\n    viewportX?: string;\n    viewportY?: string;\n}\n\ninterface MutationObserverInit {\n    attributeFilter?: string[];\n    attributeOldValue?: boolean;\n    attributes?: boolean;\n    characterData?: boolean;\n    characterDataOldValue?: boolean;\n    childList?: boolean;\n    subtree?: boolean;\n}\n\ninterface NotificationOptions {\n    body?: string;\n    dir?: NotificationDirection;\n    icon?: string;\n    lang?: string;\n    tag?: string;\n}\n\ninterface ObjectURLOptions {\n    oneTimeOnly?: boolean;\n}\n\ninterface PaymentCurrencyAmount {\n    currency?: string;\n    currencySystem?: string;\n    value?: string;\n}\n\ninterface PaymentDetails {\n    displayItems?: PaymentItem[];\n    error?: string;\n    modifiers?: PaymentDetailsModifier[];\n    shippingOptions?: PaymentShippingOption[];\n    total?: PaymentItem;\n}\n\ninterface PaymentDetailsModifier {\n    additionalDisplayItems?: PaymentItem[];\n    data?: any;\n    supportedMethods?: string[];\n    total?: PaymentItem;\n}\n\ninterface PaymentItem {\n    amount?: PaymentCurrencyAmount;\n    label?: string;\n    pending?: boolean;\n}\n\ninterface PaymentMethodData {\n    data?: any;\n    supportedMethods?: string[];\n}\n\ninterface PaymentOptions {\n    requestPayerEmail?: boolean;\n    requestPayerName?: boolean;\n    requestPayerPhone?: boolean;\n    requestShipping?: boolean;\n    shippingType?: string;\n}\n\ninterface PaymentRequestUpdateEventInit extends EventInit {\n}\n\ninterface PaymentShippingOption {\n    amount?: PaymentCurrencyAmount;\n    id?: string;\n    label?: string;\n    selected?: boolean;\n}\n\ninterface PeriodicWaveConstraints {\n    disableNormalization?: boolean;\n}\n\ninterface PointerEventInit extends MouseEventInit {\n    height?: number;\n    isPrimary?: boolean;\n    pointerId?: number;\n    pointerType?: string;\n    pressure?: number;\n    tiltX?: number;\n    tiltY?: number;\n    width?: number;\n}\n\ninterface PopStateEventInit extends EventInit {\n    state?: any;\n}\n\ninterface PositionOptions {\n    enableHighAccuracy?: boolean;\n    maximumAge?: number;\n    timeout?: number;\n}\n\ninterface ProgressEventInit extends EventInit {\n    lengthComputable?: boolean;\n    loaded?: number;\n    total?: number;\n}\n\ninterface PushSubscriptionOptionsInit {\n    applicationServerKey?: any;\n    userVisibleOnly?: boolean;\n}\n\ninterface RegistrationOptions {\n    scope?: string;\n}\n\ninterface RequestInit {\n    body?: any;\n    cache?: RequestCache;\n    credentials?: RequestCredentials;\n    headers?: any;\n    integrity?: string;\n    keepalive?: boolean;\n    method?: string;\n    mode?: RequestMode;\n    redirect?: RequestRedirect;\n    referrer?: string;\n    referrerPolicy?: ReferrerPolicy;\n    window?: any;\n}\n\ninterface ResponseInit {\n    headers?: any;\n    status?: number;\n    statusText?: string;\n}\n\ninterface RTCConfiguration {\n    bundlePolicy?: RTCBundlePolicy;\n    iceServers?: RTCIceServer[];\n    iceTransportPolicy?: RTCIceTransportPolicy;\n    peerIdentity?: string;\n}\n\ninterface RTCDtlsFingerprint {\n    algorithm?: string;\n    value?: string;\n}\n\ninterface RTCDtlsParameters {\n    fingerprints?: RTCDtlsFingerprint[];\n    role?: RTCDtlsRole;\n}\n\ninterface RTCDTMFToneChangeEventInit extends EventInit {\n    tone?: string;\n}\n\ninterface RTCIceCandidateAttributes extends RTCStats {\n    addressSourceUrl?: string;\n    candidateType?: RTCStatsIceCandidateType;\n    ipAddress?: string;\n    portNumber?: number;\n    priority?: number;\n    transport?: string;\n}\n\ninterface RTCIceCandidateComplete {\n}\n\ninterface RTCIceCandidateDictionary {\n    foundation?: string;\n    ip?: string;\n    msMTurnSessionId?: string;\n    port?: number;\n    priority?: number;\n    protocol?: RTCIceProtocol;\n    relatedAddress?: string;\n    relatedPort?: number;\n    tcpType?: RTCIceTcpCandidateType;\n    type?: RTCIceCandidateType;\n}\n\ninterface RTCIceCandidateInit {\n    candidate?: string;\n    sdpMid?: string;\n    sdpMLineIndex?: number;\n}\n\ninterface RTCIceCandidatePair {\n    local?: RTCIceCandidateDictionary;\n    remote?: RTCIceCandidateDictionary;\n}\n\ninterface RTCIceCandidatePairStats extends RTCStats {\n    availableIncomingBitrate?: number;\n    availableOutgoingBitrate?: number;\n    bytesReceived?: number;\n    bytesSent?: number;\n    localCandidateId?: string;\n    nominated?: boolean;\n    priority?: number;\n    readable?: boolean;\n    remoteCandidateId?: string;\n    roundTripTime?: number;\n    state?: RTCStatsIceCandidatePairState;\n    transportId?: string;\n    writable?: boolean;\n}\n\ninterface RTCIceGatherOptions {\n    gatherPolicy?: RTCIceGatherPolicy;\n    iceservers?: RTCIceServer[];\n    portRange?: MSPortRange;\n}\n\ninterface RTCIceParameters {\n    iceLite?: boolean;\n    password?: string;\n    usernameFragment?: string;\n}\n\ninterface RTCIceServer {\n    credential?: string;\n    urls?: any;\n    username?: string;\n}\n\ninterface RTCInboundRTPStreamStats extends RTCRTPStreamStats {\n    bytesReceived?: number;\n    fractionLost?: number;\n    jitter?: number;\n    packetsLost?: number;\n    packetsReceived?: number;\n}\n\ninterface RTCMediaStreamTrackStats extends RTCStats {\n    audioLevel?: number;\n    echoReturnLoss?: number;\n    echoReturnLossEnhancement?: number;\n    frameHeight?: number;\n    framesCorrupted?: number;\n    framesDecoded?: number;\n    framesDropped?: number;\n    framesPerSecond?: number;\n    framesReceived?: number;\n    framesSent?: number;\n    frameWidth?: number;\n    remoteSource?: boolean;\n    ssrcIds?: string[];\n    trackIdentifier?: string;\n}\n\ninterface RTCOfferOptions {\n    iceRestart?: boolean;\n    offerToReceiveAudio?: number;\n    offerToReceiveVideo?: number;\n    voiceActivityDetection?: boolean;\n}\n\ninterface RTCOutboundRTPStreamStats extends RTCRTPStreamStats {\n    bytesSent?: number;\n    packetsSent?: number;\n    roundTripTime?: number;\n    targetBitrate?: number;\n}\n\ninterface RTCPeerConnectionIceEventInit extends EventInit {\n    candidate?: RTCIceCandidate;\n}\n\ninterface RTCRtcpFeedback {\n    parameter?: string;\n    type?: string;\n}\n\ninterface RTCRtcpParameters {\n    cname?: string;\n    mux?: boolean;\n    reducedSize?: boolean;\n    ssrc?: number;\n}\n\ninterface RTCRtpCapabilities {\n    codecs?: RTCRtpCodecCapability[];\n    fecMechanisms?: string[];\n    headerExtensions?: RTCRtpHeaderExtension[];\n}\n\ninterface RTCRtpCodecCapability {\n    clockRate?: number;\n    kind?: string;\n    maxptime?: number;\n    maxSpatialLayers?: number;\n    maxTemporalLayers?: number;\n    name?: string;\n    numChannels?: number;\n    options?: any;\n    parameters?: any;\n    preferredPayloadType?: number;\n    ptime?: number;\n    rtcpFeedback?: RTCRtcpFeedback[];\n    svcMultiStreamSupport?: boolean;\n}\n\ninterface RTCRtpCodecParameters {\n    clockRate?: number;\n    maxptime?: number;\n    name?: string;\n    numChannels?: number;\n    parameters?: any;\n    payloadType?: any;\n    ptime?: number;\n    rtcpFeedback?: RTCRtcpFeedback[];\n}\n\ninterface RTCRtpContributingSource {\n    audioLevel?: number;\n    csrc?: number;\n    timestamp?: number;\n}\n\ninterface RTCRtpEncodingParameters {\n    active?: boolean;\n    codecPayloadType?: number;\n    dependencyEncodingIds?: string[];\n    encodingId?: string;\n    fec?: RTCRtpFecParameters;\n    framerateScale?: number;\n    maxBitrate?: number;\n    maxFramerate?: number;\n    minQuality?: number;\n    priority?: number;\n    resolutionScale?: number;\n    rtx?: RTCRtpRtxParameters;\n    ssrc?: number;\n    ssrcRange?: RTCSsrcRange;\n}\n\ninterface RTCRtpFecParameters {\n    mechanism?: string;\n    ssrc?: number;\n}\n\ninterface RTCRtpHeaderExtension {\n    kind?: string;\n    preferredEncrypt?: boolean;\n    preferredId?: number;\n    uri?: string;\n}\n\ninterface RTCRtpHeaderExtensionParameters {\n    encrypt?: boolean;\n    id?: number;\n    uri?: string;\n}\n\ninterface RTCRtpParameters {\n    codecs?: RTCRtpCodecParameters[];\n    degradationPreference?: RTCDegradationPreference;\n    encodings?: RTCRtpEncodingParameters[];\n    headerExtensions?: RTCRtpHeaderExtensionParameters[];\n    muxId?: string;\n    rtcp?: RTCRtcpParameters;\n}\n\ninterface RTCRtpRtxParameters {\n    ssrc?: number;\n}\n\ninterface RTCRTPStreamStats extends RTCStats {\n    associateStatsId?: string;\n    codecId?: string;\n    firCount?: number;\n    isRemote?: boolean;\n    mediaTrackId?: string;\n    nackCount?: number;\n    pliCount?: number;\n    sliCount?: number;\n    ssrc?: string;\n    transportId?: string;\n}\n\ninterface RTCRtpUnhandled {\n    muxId?: string;\n    payloadType?: number;\n    ssrc?: number;\n}\n\ninterface RTCSessionDescriptionInit {\n    sdp?: string;\n    type?: RTCSdpType;\n}\n\ninterface RTCSrtpKeyParam {\n    keyMethod?: string;\n    keySalt?: string;\n    lifetime?: string;\n    mkiLength?: number;\n    mkiValue?: number;\n}\n\ninterface RTCSrtpSdesParameters {\n    cryptoSuite?: string;\n    keyParams?: RTCSrtpKeyParam[];\n    sessionParams?: string[];\n    tag?: number;\n}\n\ninterface RTCSsrcRange {\n    max?: number;\n    min?: number;\n}\n\ninterface RTCStats {\n    id?: string;\n    msType?: MSStatsType;\n    timestamp?: number;\n    type?: RTCStatsType;\n}\n\ninterface RTCStatsReport {\n}\n\ninterface RTCTransportStats extends RTCStats {\n    activeConnection?: boolean;\n    bytesReceived?: number;\n    bytesSent?: number;\n    localCertificateId?: string;\n    remoteCertificateId?: string;\n    rtcpTransportStatsId?: string;\n    selectedCandidatePairId?: string;\n}\n\ninterface ScopedCredentialDescriptor {\n    id?: any;\n    transports?: Transport[];\n    type?: ScopedCredentialType;\n}\n\ninterface ScopedCredentialOptions {\n    excludeList?: ScopedCredentialDescriptor[];\n    extensions?: WebAuthnExtensions;\n    rpId?: USVString;\n    timeoutSeconds?: number;\n}\n\ninterface ScopedCredentialParameters {\n    algorithm?: string | Algorithm;\n    type?: ScopedCredentialType;\n}\n\ninterface ServiceWorkerMessageEventInit extends EventInit {\n    data?: any;\n    lastEventId?: string;\n    origin?: string;\n    ports?: MessagePort[];\n    source?: ServiceWorker | MessagePort;\n}\n\ninterface SpeechSynthesisEventInit extends EventInit {\n    charIndex?: number;\n    elapsedTime?: number;\n    name?: string;\n    utterance?: SpeechSynthesisUtterance;\n}\n\ninterface StoreExceptionsInformation extends ExceptionInformation {\n    detailURI?: string;\n    explanationString?: string;\n    siteName?: string;\n}\n\ninterface StoreSiteSpecificExceptionsInformation extends StoreExceptionsInformation {\n    arrayOfDomainStrings?: string[];\n}\n\ninterface TrackEventInit extends EventInit {\n    track?: VideoTrack | AudioTrack | TextTrack;\n}\n\ninterface TransitionEventInit extends EventInit {\n    elapsedTime?: number;\n    propertyName?: string;\n}\n\ninterface UIEventInit extends EventInit {\n    detail?: number;\n    view?: Window;\n}\n\ninterface WebAuthnExtensions {\n}\n\ninterface WebGLContextAttributes {\n    failIfMajorPerformanceCaveat?: boolean;\n    alpha?: boolean;\n    antialias?: boolean;\n    depth?: boolean;\n    premultipliedAlpha?: boolean;\n    preserveDrawingBuffer?: boolean;\n    stencil?: boolean;\n}\n\ninterface WebGLContextEventInit extends EventInit {\n    statusMessage?: string;\n}\n\ninterface WheelEventInit extends MouseEventInit {\n    deltaMode?: number;\n    deltaX?: number;\n    deltaY?: number;\n    deltaZ?: number;\n}\n\ninterface EventListener {\n    (evt: Event): void;\n}\n\ninterface WebKitEntriesCallback {\n    (evt: Event): void;\n}\n\ninterface WebKitErrorCallback {\n    (evt: Event): void;\n}\n\ninterface WebKitFileCallback {\n    (evt: Event): void;\n}\n\ninterface AnalyserNode extends AudioNode {\n    fftSize: number;\n    readonly frequencyBinCount: number;\n    maxDecibels: number;\n    minDecibels: number;\n    smoothingTimeConstant: number;\n    getByteFrequencyData(array: Uint8Array): void;\n    getByteTimeDomainData(array: Uint8Array): void;\n    getFloatFrequencyData(array: Float32Array): void;\n    getFloatTimeDomainData(array: Float32Array): void;\n}\n\ndeclare var AnalyserNode: {\n    prototype: AnalyserNode;\n    new(): AnalyserNode;\n};\n\ninterface ANGLE_instanced_arrays {\n    drawArraysInstancedANGLE(mode: number, first: number, count: number, primcount: number): void;\n    drawElementsInstancedANGLE(mode: number, count: number, type: number, offset: number, primcount: number): void;\n    vertexAttribDivisorANGLE(index: number, divisor: number): void;\n    readonly VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE: number;\n}\n\ndeclare var ANGLE_instanced_arrays: {\n    prototype: ANGLE_instanced_arrays;\n    new(): ANGLE_instanced_arrays;\n    readonly VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE: number;\n};\n\ninterface AnimationEvent extends Event {\n    readonly animationName: string;\n    readonly elapsedTime: number;\n    initAnimationEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, animationNameArg: string, elapsedTimeArg: number): void;\n}\n\ndeclare var AnimationEvent: {\n    prototype: AnimationEvent;\n    new(typeArg: string, eventInitDict?: AnimationEventInit): AnimationEvent;\n};\n\ninterface ApplicationCacheEventMap {\n    "cached": Event;\n    "checking": Event;\n    "downloading": Event;\n    "error": Event;\n    "noupdate": Event;\n    "obsolete": Event;\n    "progress": ProgressEvent;\n    "updateready": Event;\n}\n\ninterface ApplicationCache extends EventTarget {\n    oncached: (this: ApplicationCache, ev: Event) => any;\n    onchecking: (this: ApplicationCache, ev: Event) => any;\n    ondownloading: (this: ApplicationCache, ev: Event) => any;\n    onerror: (this: ApplicationCache, ev: Event) => any;\n    onnoupdate: (this: ApplicationCache, ev: Event) => any;\n    onobsolete: (this: ApplicationCache, ev: Event) => any;\n    onprogress: (this: ApplicationCache, ev: ProgressEvent) => any;\n    onupdateready: (this: ApplicationCache, ev: Event) => any;\n    readonly status: number;\n    abort(): void;\n    swapCache(): void;\n    update(): void;\n    readonly CHECKING: number;\n    readonly DOWNLOADING: number;\n    readonly IDLE: number;\n    readonly OBSOLETE: number;\n    readonly UNCACHED: number;\n    readonly UPDATEREADY: number;\n    addEventListener<K extends keyof ApplicationCacheEventMap>(type: K, listener: (this: ApplicationCache, ev: ApplicationCacheEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var ApplicationCache: {\n    prototype: ApplicationCache;\n    new(): ApplicationCache;\n    readonly CHECKING: number;\n    readonly DOWNLOADING: number;\n    readonly IDLE: number;\n    readonly OBSOLETE: number;\n    readonly UNCACHED: number;\n    readonly UPDATEREADY: number;\n};\n\ninterface Attr extends Node {\n    readonly name: string;\n    readonly ownerElement: Element;\n    readonly prefix: string | null;\n    readonly specified: boolean;\n    value: string;\n}\n\ndeclare var Attr: {\n    prototype: Attr;\n    new(): Attr;\n};\n\ninterface AudioBuffer {\n    readonly duration: number;\n    readonly length: number;\n    readonly numberOfChannels: number;\n    readonly sampleRate: number;\n    copyFromChannel(destination: Float32Array, channelNumber: number, startInChannel?: number): void;\n    copyToChannel(source: Float32Array, channelNumber: number, startInChannel?: number): void;\n    getChannelData(channel: number): Float32Array;\n}\n\ndeclare var AudioBuffer: {\n    prototype: AudioBuffer;\n    new(): AudioBuffer;\n};\n\ninterface AudioBufferSourceNodeEventMap {\n    "ended": MediaStreamErrorEvent;\n}\n\ninterface AudioBufferSourceNode extends AudioNode {\n    buffer: AudioBuffer | null;\n    readonly detune: AudioParam;\n    loop: boolean;\n    loopEnd: number;\n    loopStart: number;\n    onended: (this: AudioBufferSourceNode, ev: MediaStreamErrorEvent) => any;\n    readonly playbackRate: AudioParam;\n    start(when?: number, offset?: number, duration?: number): void;\n    stop(when?: number): void;\n    addEventListener<K extends keyof AudioBufferSourceNodeEventMap>(type: K, listener: (this: AudioBufferSourceNode, ev: AudioBufferSourceNodeEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var AudioBufferSourceNode: {\n    prototype: AudioBufferSourceNode;\n    new(): AudioBufferSourceNode;\n};\n\ninterface AudioContextEventMap {\n    "statechange": Event;\n}\n\ninterface AudioContextBase extends EventTarget {\n    readonly currentTime: number;\n    readonly destination: AudioDestinationNode;\n    readonly listener: AudioListener;\n    onstatechange: (this: AudioContext, ev: Event) => any;\n    readonly sampleRate: number;\n    readonly state: AudioContextState;\n    close(): Promise<void>;\n    createAnalyser(): AnalyserNode;\n    createBiquadFilter(): BiquadFilterNode;\n    createBuffer(numberOfChannels: number, length: number, sampleRate: number): AudioBuffer;\n    createBufferSource(): AudioBufferSourceNode;\n    createChannelMerger(numberOfInputs?: number): ChannelMergerNode;\n    createChannelSplitter(numberOfOutputs?: number): ChannelSplitterNode;\n    createConvolver(): ConvolverNode;\n    createDelay(maxDelayTime?: number): DelayNode;\n    createDynamicsCompressor(): DynamicsCompressorNode;\n    createGain(): GainNode;\n    createIIRFilter(feedforward: number[], feedback: number[]): IIRFilterNode;\n    createMediaElementSource(mediaElement: HTMLMediaElement): MediaElementAudioSourceNode;\n    createMediaStreamSource(mediaStream: MediaStream): MediaStreamAudioSourceNode;\n    createOscillator(): OscillatorNode;\n    createPanner(): PannerNode;\n    createPeriodicWave(real: Float32Array, imag: Float32Array, constraints?: PeriodicWaveConstraints): PeriodicWave;\n    createScriptProcessor(bufferSize?: number, numberOfInputChannels?: number, numberOfOutputChannels?: number): ScriptProcessorNode;\n    createStereoPanner(): StereoPannerNode;\n    createWaveShaper(): WaveShaperNode;\n    decodeAudioData(audioData: ArrayBuffer, successCallback?: DecodeSuccessCallback, errorCallback?: DecodeErrorCallback): Promise<AudioBuffer>;\n    resume(): Promise<void>;\n    addEventListener<K extends keyof AudioContextEventMap>(type: K, listener: (this: AudioContext, ev: AudioContextEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ninterface AudioContext extends AudioContextBase {\n    suspend(): Promise<void>;\n}\n\ndeclare var AudioContext: {\n    prototype: AudioContext;\n    new(): AudioContext;\n};\n\ninterface AudioDestinationNode extends AudioNode {\n    readonly maxChannelCount: number;\n}\n\ndeclare var AudioDestinationNode: {\n    prototype: AudioDestinationNode;\n    new(): AudioDestinationNode;\n};\n\ninterface AudioListener {\n    dopplerFactor: number;\n    speedOfSound: number;\n    setOrientation(x: number, y: number, z: number, xUp: number, yUp: number, zUp: number): void;\n    setPosition(x: number, y: number, z: number): void;\n    setVelocity(x: number, y: number, z: number): void;\n}\n\ndeclare var AudioListener: {\n    prototype: AudioListener;\n    new(): AudioListener;\n};\n\ninterface AudioNode extends EventTarget {\n    channelCount: number;\n    channelCountMode: ChannelCountMode;\n    channelInterpretation: ChannelInterpretation;\n    readonly context: AudioContext;\n    readonly numberOfInputs: number;\n    readonly numberOfOutputs: number;\n    connect(destination: AudioNode, output?: number, input?: number): AudioNode;\n    connect(destination: AudioParam, output?: number): void;\n    disconnect(output?: number): void;\n    disconnect(destination: AudioNode, output?: number, input?: number): void;\n    disconnect(destination: AudioParam, output?: number): void;\n}\n\ndeclare var AudioNode: {\n    prototype: AudioNode;\n    new(): AudioNode;\n};\n\ninterface AudioParam {\n    readonly defaultValue: number;\n    value: number;\n    cancelScheduledValues(startTime: number): AudioParam;\n    exponentialRampToValueAtTime(value: number, endTime: number): AudioParam;\n    linearRampToValueAtTime(value: number, endTime: number): AudioParam;\n    setTargetAtTime(target: number, startTime: number, timeConstant: number): AudioParam;\n    setValueAtTime(value: number, startTime: number): AudioParam;\n    setValueCurveAtTime(values: Float32Array, startTime: number, duration: number): AudioParam;\n}\n\ndeclare var AudioParam: {\n    prototype: AudioParam;\n    new(): AudioParam;\n};\n\ninterface AudioProcessingEvent extends Event {\n    readonly inputBuffer: AudioBuffer;\n    readonly outputBuffer: AudioBuffer;\n    readonly playbackTime: number;\n}\n\ndeclare var AudioProcessingEvent: {\n    prototype: AudioProcessingEvent;\n    new(): AudioProcessingEvent;\n};\n\ninterface AudioTrack {\n    enabled: boolean;\n    readonly id: string;\n    kind: string;\n    readonly label: string;\n    language: string;\n    readonly sourceBuffer: SourceBuffer;\n}\n\ndeclare var AudioTrack: {\n    prototype: AudioTrack;\n    new(): AudioTrack;\n};\n\ninterface AudioTrackListEventMap {\n    "addtrack": TrackEvent;\n    "change": Event;\n    "removetrack": TrackEvent;\n}\n\ninterface AudioTrackList extends EventTarget {\n    readonly length: number;\n    onaddtrack: (this: AudioTrackList, ev: TrackEvent) => any;\n    onchange: (this: AudioTrackList, ev: Event) => any;\n    onremovetrack: (this: AudioTrackList, ev: TrackEvent) => any;\n    getTrackById(id: string): AudioTrack | null;\n    item(index: number): AudioTrack;\n    addEventListener<K extends keyof AudioTrackListEventMap>(type: K, listener: (this: AudioTrackList, ev: AudioTrackListEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n    [index: number]: AudioTrack;\n}\n\ndeclare var AudioTrackList: {\n    prototype: AudioTrackList;\n    new(): AudioTrackList;\n};\n\ninterface BarProp {\n    readonly visible: boolean;\n}\n\ndeclare var BarProp: {\n    prototype: BarProp;\n    new(): BarProp;\n};\n\ninterface BeforeUnloadEvent extends Event {\n    returnValue: any;\n}\n\ndeclare var BeforeUnloadEvent: {\n    prototype: BeforeUnloadEvent;\n    new(): BeforeUnloadEvent;\n};\n\ninterface BiquadFilterNode extends AudioNode {\n    readonly detune: AudioParam;\n    readonly frequency: AudioParam;\n    readonly gain: AudioParam;\n    readonly Q: AudioParam;\n    type: BiquadFilterType;\n    getFrequencyResponse(frequencyHz: Float32Array, magResponse: Float32Array, phaseResponse: Float32Array): void;\n}\n\ndeclare var BiquadFilterNode: {\n    prototype: BiquadFilterNode;\n    new(): BiquadFilterNode;\n};\n\ninterface Blob {\n    readonly size: number;\n    readonly type: string;\n    msClose(): void;\n    msDetachStream(): any;\n    slice(start?: number, end?: number, contentType?: string): Blob;\n}\n\ndeclare var Blob: {\n    prototype: Blob;\n    new (blobParts?: any[], options?: BlobPropertyBag): Blob;\n};\n\ninterface Cache {\n    add(request: RequestInfo): Promise<void>;\n    addAll(requests: RequestInfo[]): Promise<void>;\n    delete(request: RequestInfo, options?: CacheQueryOptions): Promise<boolean>;\n    keys(request?: RequestInfo, options?: CacheQueryOptions): any;\n    match(request: RequestInfo, options?: CacheQueryOptions): Promise<Response>;\n    matchAll(request?: RequestInfo, options?: CacheQueryOptions): any;\n    put(request: RequestInfo, response: Response): Promise<void>;\n}\n\ndeclare var Cache: {\n    prototype: Cache;\n    new(): Cache;\n};\n\ninterface CacheStorage {\n    delete(cacheName: string): Promise<boolean>;\n    has(cacheName: string): Promise<boolean>;\n    keys(): any;\n    match(request: RequestInfo, options?: CacheQueryOptions): Promise<any>;\n    open(cacheName: string): Promise<Cache>;\n}\n\ndeclare var CacheStorage: {\n    prototype: CacheStorage;\n    new(): CacheStorage;\n};\n\ninterface CanvasGradient {\n    addColorStop(offset: number, color: string): void;\n}\n\ndeclare var CanvasGradient: {\n    prototype: CanvasGradient;\n    new(): CanvasGradient;\n};\n\ninterface CanvasPattern {\n    setTransform(matrix: SVGMatrix): void;\n}\n\ndeclare var CanvasPattern: {\n    prototype: CanvasPattern;\n    new(): CanvasPattern;\n};\n\ninterface CanvasRenderingContext2D extends Object, CanvasPathMethods {\n    readonly canvas: HTMLCanvasElement;\n    fillStyle: string | CanvasGradient | CanvasPattern;\n    font: string;\n    globalAlpha: number;\n    globalCompositeOperation: string;\n    imageSmoothingEnabled: boolean;\n    lineCap: string;\n    lineDashOffset: number;\n    lineJoin: string;\n    lineWidth: number;\n    miterLimit: number;\n    msFillRule: CanvasFillRule;\n    shadowBlur: number;\n    shadowColor: string;\n    shadowOffsetX: number;\n    shadowOffsetY: number;\n    strokeStyle: string | CanvasGradient | CanvasPattern;\n    textAlign: string;\n    textBaseline: string;\n    mozImageSmoothingEnabled: boolean;\n    webkitImageSmoothingEnabled: boolean;\n    oImageSmoothingEnabled: boolean;\n    beginPath(): void;\n    clearRect(x: number, y: number, w: number, h: number): void;\n    clip(fillRule?: CanvasFillRule): void;\n    createImageData(imageDataOrSw: number | ImageData, sh?: number): ImageData;\n    createLinearGradient(x0: number, y0: number, x1: number, y1: number): CanvasGradient;\n    createPattern(image: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement, repetition: string): CanvasPattern;\n    createRadialGradient(x0: number, y0: number, r0: number, x1: number, y1: number, r1: number): CanvasGradient;\n    drawFocusIfNeeded(element: Element): void;\n    drawImage(image: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap, dstX: number, dstY: number): void;\n    drawImage(image: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap, dstX: number, dstY: number, dstW: number, dstH: number): void;\n    drawImage(image: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap, srcX: number, srcY: number, srcW: number, srcH: number, dstX: number, dstY: number, dstW: number, dstH: number): void;\n    fill(fillRule?: CanvasFillRule): void;\n    fillRect(x: number, y: number, w: number, h: number): void;\n    fillText(text: string, x: number, y: number, maxWidth?: number): void;\n    getImageData(sx: number, sy: number, sw: number, sh: number): ImageData;\n    getLineDash(): number[];\n    isPointInPath(x: number, y: number, fillRule?: CanvasFillRule): boolean;\n    measureText(text: string): TextMetrics;\n    putImageData(imagedata: ImageData, dx: number, dy: number, dirtyX?: number, dirtyY?: number, dirtyWidth?: number, dirtyHeight?: number): void;\n    restore(): void;\n    rotate(angle: number): void;\n    save(): void;\n    scale(x: number, y: number): void;\n    setLineDash(segments: number[]): void;\n    setTransform(m11: number, m12: number, m21: number, m22: number, dx: number, dy: number): void;\n    stroke(path?: Path2D): void;\n    strokeRect(x: number, y: number, w: number, h: number): void;\n    strokeText(text: string, x: number, y: number, maxWidth?: number): void;\n    transform(m11: number, m12: number, m21: number, m22: number, dx: number, dy: number): void;\n    translate(x: number, y: number): void;\n}\n\ndeclare var CanvasRenderingContext2D: {\n    prototype: CanvasRenderingContext2D;\n    new(): CanvasRenderingContext2D;\n};\n\ninterface CDATASection extends Text {\n}\n\ndeclare var CDATASection: {\n    prototype: CDATASection;\n    new(): CDATASection;\n};\n\ninterface ChannelMergerNode extends AudioNode {\n}\n\ndeclare var ChannelMergerNode: {\n    prototype: ChannelMergerNode;\n    new(): ChannelMergerNode;\n};\n\ninterface ChannelSplitterNode extends AudioNode {\n}\n\ndeclare var ChannelSplitterNode: {\n    prototype: ChannelSplitterNode;\n    new(): ChannelSplitterNode;\n};\n\ninterface CharacterData extends Node, ChildNode {\n    data: string;\n    readonly length: number;\n    appendData(arg: string): void;\n    deleteData(offset: number, count: number): void;\n    insertData(offset: number, arg: string): void;\n    replaceData(offset: number, count: number, arg: string): void;\n    substringData(offset: number, count: number): string;\n}\n\ndeclare var CharacterData: {\n    prototype: CharacterData;\n    new(): CharacterData;\n};\n\ninterface ClientRect {\n    bottom: number;\n    readonly height: number;\n    left: number;\n    right: number;\n    top: number;\n    readonly width: number;\n}\n\ndeclare var ClientRect: {\n    prototype: ClientRect;\n    new(): ClientRect;\n};\n\ninterface ClientRectList {\n    readonly length: number;\n    item(index: number): ClientRect;\n    [index: number]: ClientRect;\n}\n\ndeclare var ClientRectList: {\n    prototype: ClientRectList;\n    new(): ClientRectList;\n};\n\ninterface ClipboardEvent extends Event {\n    readonly clipboardData: DataTransfer;\n}\n\ndeclare var ClipboardEvent: {\n    prototype: ClipboardEvent;\n    new(type: string, eventInitDict?: ClipboardEventInit): ClipboardEvent;\n};\n\ninterface CloseEvent extends Event {\n    readonly code: number;\n    readonly reason: string;\n    readonly wasClean: boolean;\n    initCloseEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, wasCleanArg: boolean, codeArg: number, reasonArg: string): void;\n}\n\ndeclare var CloseEvent: {\n    prototype: CloseEvent;\n    new(typeArg: string, eventInitDict?: CloseEventInit): CloseEvent;\n};\n\ninterface Comment extends CharacterData {\n    text: string;\n}\n\ndeclare var Comment: {\n    prototype: Comment;\n    new(): Comment;\n};\n\ninterface CompositionEvent extends UIEvent {\n    readonly data: string;\n    readonly locale: string;\n    initCompositionEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, dataArg: string, locale: string): void;\n}\n\ndeclare var CompositionEvent: {\n    prototype: CompositionEvent;\n    new(typeArg: string, eventInitDict?: CompositionEventInit): CompositionEvent;\n};\n\ninterface Console {\n    assert(test?: boolean, message?: string, ...optionalParams: any[]): void;\n    clear(): void;\n    count(countTitle?: string): void;\n    debug(message?: any, ...optionalParams: any[]): void;\n    dir(value?: any, ...optionalParams: any[]): void;\n    dirxml(value: any): void;\n    error(message?: any, ...optionalParams: any[]): void;\n    exception(message?: string, ...optionalParams: any[]): void;\n    group(groupTitle?: string, ...optionalParams: any[]): void;\n    groupCollapsed(groupTitle?: string, ...optionalParams: any[]): void;\n    groupEnd(): void;\n    info(message?: any, ...optionalParams: any[]): void;\n    log(message?: any, ...optionalParams: any[]): void;\n    msIsIndependentlyComposed(element: Element): boolean;\n    profile(reportName?: string): void;\n    profileEnd(): void;\n    select(element: Element): void;\n    table(...data: any[]): void;\n    time(timerName?: string): void;\n    timeEnd(timerName?: string): void;\n    trace(message?: any, ...optionalParams: any[]): void;\n    warn(message?: any, ...optionalParams: any[]): void;\n}\n\ndeclare var Console: {\n    prototype: Console;\n    new(): Console;\n};\n\ninterface ConvolverNode extends AudioNode {\n    buffer: AudioBuffer | null;\n    normalize: boolean;\n}\n\ndeclare var ConvolverNode: {\n    prototype: ConvolverNode;\n    new(): ConvolverNode;\n};\n\ninterface Coordinates {\n    readonly accuracy: number;\n    readonly altitude: number | null;\n    readonly altitudeAccuracy: number | null;\n    readonly heading: number | null;\n    readonly latitude: number;\n    readonly longitude: number;\n    readonly speed: number | null;\n}\n\ndeclare var Coordinates: {\n    prototype: Coordinates;\n    new(): Coordinates;\n};\n\ninterface Crypto extends Object, RandomSource {\n    readonly subtle: SubtleCrypto;\n}\n\ndeclare var Crypto: {\n    prototype: Crypto;\n    new(): Crypto;\n};\n\ninterface CryptoKey {\n    readonly algorithm: KeyAlgorithm;\n    readonly extractable: boolean;\n    readonly type: string;\n    readonly usages: string[];\n}\n\ndeclare var CryptoKey: {\n    prototype: CryptoKey;\n    new(): CryptoKey;\n};\n\ninterface CryptoKeyPair {\n    privateKey: CryptoKey;\n    publicKey: CryptoKey;\n}\n\ndeclare var CryptoKeyPair: {\n    prototype: CryptoKeyPair;\n    new(): CryptoKeyPair;\n};\n\ninterface CSS {\n    supports(property: string, value?: string): boolean;\n}\ndeclare var CSS: CSS;\n\ninterface CSSConditionRule extends CSSGroupingRule {\n    conditionText: string;\n}\n\ndeclare var CSSConditionRule: {\n    prototype: CSSConditionRule;\n    new(): CSSConditionRule;\n};\n\ninterface CSSFontFaceRule extends CSSRule {\n    readonly style: CSSStyleDeclaration;\n}\n\ndeclare var CSSFontFaceRule: {\n    prototype: CSSFontFaceRule;\n    new(): CSSFontFaceRule;\n};\n\ninterface CSSGroupingRule extends CSSRule {\n    readonly cssRules: CSSRuleList;\n    deleteRule(index: number): void;\n    insertRule(rule: string, index: number): number;\n}\n\ndeclare var CSSGroupingRule: {\n    prototype: CSSGroupingRule;\n    new(): CSSGroupingRule;\n};\n\ninterface CSSImportRule extends CSSRule {\n    readonly href: string;\n    readonly media: MediaList;\n    readonly styleSheet: CSSStyleSheet;\n}\n\ndeclare var CSSImportRule: {\n    prototype: CSSImportRule;\n    new(): CSSImportRule;\n};\n\ninterface CSSKeyframeRule extends CSSRule {\n    keyText: string;\n    readonly style: CSSStyleDeclaration;\n}\n\ndeclare var CSSKeyframeRule: {\n    prototype: CSSKeyframeRule;\n    new(): CSSKeyframeRule;\n};\n\ninterface CSSKeyframesRule extends CSSRule {\n    readonly cssRules: CSSRuleList;\n    name: string;\n    appendRule(rule: string): void;\n    deleteRule(rule: string): void;\n    findRule(rule: string): CSSKeyframeRule;\n}\n\ndeclare var CSSKeyframesRule: {\n    prototype: CSSKeyframesRule;\n    new(): CSSKeyframesRule;\n};\n\ninterface CSSMediaRule extends CSSConditionRule {\n    readonly media: MediaList;\n}\n\ndeclare var CSSMediaRule: {\n    prototype: CSSMediaRule;\n    new(): CSSMediaRule;\n};\n\ninterface CSSNamespaceRule extends CSSRule {\n    readonly namespaceURI: string;\n    readonly prefix: string;\n}\n\ndeclare var CSSNamespaceRule: {\n    prototype: CSSNamespaceRule;\n    new(): CSSNamespaceRule;\n};\n\ninterface CSSPageRule extends CSSRule {\n    readonly pseudoClass: string;\n    readonly selector: string;\n    selectorText: string;\n    readonly style: CSSStyleDeclaration;\n}\n\ndeclare var CSSPageRule: {\n    prototype: CSSPageRule;\n    new(): CSSPageRule;\n};\n\ninterface CSSRule {\n    cssText: string;\n    readonly parentRule: CSSRule;\n    readonly parentStyleSheet: CSSStyleSheet;\n    readonly type: number;\n    readonly CHARSET_RULE: number;\n    readonly FONT_FACE_RULE: number;\n    readonly IMPORT_RULE: number;\n    readonly KEYFRAME_RULE: number;\n    readonly KEYFRAMES_RULE: number;\n    readonly MEDIA_RULE: number;\n    readonly NAMESPACE_RULE: number;\n    readonly PAGE_RULE: number;\n    readonly STYLE_RULE: number;\n    readonly SUPPORTS_RULE: number;\n    readonly UNKNOWN_RULE: number;\n    readonly VIEWPORT_RULE: number;\n}\n\ndeclare var CSSRule: {\n    prototype: CSSRule;\n    new(): CSSRule;\n    readonly CHARSET_RULE: number;\n    readonly FONT_FACE_RULE: number;\n    readonly IMPORT_RULE: number;\n    readonly KEYFRAME_RULE: number;\n    readonly KEYFRAMES_RULE: number;\n    readonly MEDIA_RULE: number;\n    readonly NAMESPACE_RULE: number;\n    readonly PAGE_RULE: number;\n    readonly STYLE_RULE: number;\n    readonly SUPPORTS_RULE: number;\n    readonly UNKNOWN_RULE: number;\n    readonly VIEWPORT_RULE: number;\n};\n\ninterface CSSRuleList {\n    readonly length: number;\n    item(index: number): CSSRule;\n    [index: number]: CSSRule;\n}\n\ndeclare var CSSRuleList: {\n    prototype: CSSRuleList;\n    new(): CSSRuleList;\n};\n\ninterface CSSStyleDeclaration {\n    alignContent: string | null;\n    alignItems: string | null;\n    alignmentBaseline: string | null;\n    alignSelf: string | null;\n    animation: string | null;\n    animationDelay: string | null;\n    animationDirection: string | null;\n    animationDuration: string | null;\n    animationFillMode: string | null;\n    animationIterationCount: string | null;\n    animationName: string | null;\n    animationPlayState: string | null;\n    animationTimingFunction: string | null;\n    backfaceVisibility: string | null;\n    background: string | null;\n    backgroundAttachment: string | null;\n    backgroundClip: string | null;\n    backgroundColor: string | null;\n    backgroundImage: string | null;\n    backgroundOrigin: string | null;\n    backgroundPosition: string | null;\n    backgroundPositionX: string | null;\n    backgroundPositionY: string | null;\n    backgroundRepeat: string | null;\n    backgroundSize: string | null;\n    baselineShift: string | null;\n    border: string | null;\n    borderBottom: string | null;\n    borderBottomColor: string | null;\n    borderBottomLeftRadius: string | null;\n    borderBottomRightRadius: string | null;\n    borderBottomStyle: string | null;\n    borderBottomWidth: string | null;\n    borderCollapse: string | null;\n    borderColor: string | null;\n    borderImage: string | null;\n    borderImageOutset: string | null;\n    borderImageRepeat: string | null;\n    borderImageSlice: string | null;\n    borderImageSource: string | null;\n    borderImageWidth: string | null;\n    borderLeft: string | null;\n    borderLeftColor: string | null;\n    borderLeftStyle: string | null;\n    borderLeftWidth: string | null;\n    borderRadius: string | null;\n    borderRight: string | null;\n    borderRightColor: string | null;\n    borderRightStyle: string | null;\n    borderRightWidth: string | null;\n    borderSpacing: string | null;\n    borderStyle: string | null;\n    borderTop: string | null;\n    borderTopColor: string | null;\n    borderTopLeftRadius: string | null;\n    borderTopRightRadius: string | null;\n    borderTopStyle: string | null;\n    borderTopWidth: string | null;\n    borderWidth: string | null;\n    bottom: string | null;\n    boxShadow: string | null;\n    boxSizing: string | null;\n    breakAfter: string | null;\n    breakBefore: string | null;\n    breakInside: string | null;\n    captionSide: string | null;\n    clear: string | null;\n    clip: string | null;\n    clipPath: string | null;\n    clipRule: string | null;\n    color: string | null;\n    colorInterpolationFilters: string | null;\n    columnCount: any;\n    columnFill: string | null;\n    columnGap: any;\n    columnRule: string | null;\n    columnRuleColor: any;\n    columnRuleStyle: string | null;\n    columnRuleWidth: any;\n    columns: string | null;\n    columnSpan: string | null;\n    columnWidth: any;\n    content: string | null;\n    counterIncrement: string | null;\n    counterReset: string | null;\n    cssFloat: string | null;\n    cssText: string;\n    cursor: string | null;\n    direction: string | null;\n    display: string | null;\n    dominantBaseline: string | null;\n    emptyCells: string | null;\n    enableBackground: string | null;\n    fill: string | null;\n    fillOpacity: string | null;\n    fillRule: string | null;\n    filter: string | null;\n    flex: string | null;\n    flexBasis: string | null;\n    flexDirection: string | null;\n    flexFlow: string | null;\n    flexGrow: string | null;\n    flexShrink: string | null;\n    flexWrap: string | null;\n    floodColor: string | null;\n    floodOpacity: string | null;\n    font: string | null;\n    fontFamily: string | null;\n    fontFeatureSettings: string | null;\n    fontSize: string | null;\n    fontSizeAdjust: string | null;\n    fontStretch: string | null;\n    fontStyle: string | null;\n    fontVariant: string | null;\n    fontWeight: string | null;\n    glyphOrientationHorizontal: string | null;\n    glyphOrientationVertical: string | null;\n    height: string | null;\n    imeMode: string | null;\n    justifyContent: string | null;\n    kerning: string | null;\n    layoutGrid: string | null;\n    layoutGridChar: string | null;\n    layoutGridLine: string | null;\n    layoutGridMode: string | null;\n    layoutGridType: string | null;\n    left: string | null;\n    readonly length: number;\n    letterSpacing: string | null;\n    lightingColor: string | null;\n    lineBreak: string | null;\n    lineHeight: string | null;\n    listStyle: string | null;\n    listStyleImage: string | null;\n    listStylePosition: string | null;\n    listStyleType: string | null;\n    margin: string | null;\n    marginBottom: string | null;\n    marginLeft: string | null;\n    marginRight: string | null;\n    marginTop: string | null;\n    marker: string | null;\n    markerEnd: string | null;\n    markerMid: string | null;\n    markerStart: string | null;\n    mask: string | null;\n    maxHeight: string | null;\n    maxWidth: string | null;\n    minHeight: string | null;\n    minWidth: string | null;\n    msContentZoomChaining: string | null;\n    msContentZooming: string | null;\n    msContentZoomLimit: string | null;\n    msContentZoomLimitMax: any;\n    msContentZoomLimitMin: any;\n    msContentZoomSnap: string | null;\n    msContentZoomSnapPoints: string | null;\n    msContentZoomSnapType: string | null;\n    msFlowFrom: string | null;\n    msFlowInto: string | null;\n    msFontFeatureSettings: string | null;\n    msGridColumn: any;\n    msGridColumnAlign: string | null;\n    msGridColumns: string | null;\n    msGridColumnSpan: any;\n    msGridRow: any;\n    msGridRowAlign: string | null;\n    msGridRows: string | null;\n    msGridRowSpan: any;\n    msHighContrastAdjust: string | null;\n    msHyphenateLimitChars: string | null;\n    msHyphenateLimitLines: any;\n    msHyphenateLimitZone: any;\n    msHyphens: string | null;\n    msImeAlign: string | null;\n    msOverflowStyle: string | null;\n    msScrollChaining: string | null;\n    msScrollLimit: string | null;\n    msScrollLimitXMax: any;\n    msScrollLimitXMin: any;\n    msScrollLimitYMax: any;\n    msScrollLimitYMin: any;\n    msScrollRails: string | null;\n    msScrollSnapPointsX: string | null;\n    msScrollSnapPointsY: string | null;\n    msScrollSnapType: string | null;\n    msScrollSnapX: string | null;\n    msScrollSnapY: string | null;\n    msScrollTranslation: string | null;\n    msTextCombineHorizontal: string | null;\n    msTextSizeAdjust: any;\n    msTouchAction: string | null;\n    msTouchSelect: string | null;\n    msUserSelect: string | null;\n    msWrapFlow: string;\n    msWrapMargin: any;\n    msWrapThrough: string;\n    opacity: string | null;\n    order: string | null;\n    orphans: string | null;\n    outline: string | null;\n    outlineColor: string | null;\n    outlineOffset: string | null;\n    outlineStyle: string | null;\n    outlineWidth: string | null;\n    overflow: string | null;\n    overflowX: string | null;\n    overflowY: string | null;\n    padding: string | null;\n    paddingBottom: string | null;\n    paddingLeft: string | null;\n    paddingRight: string | null;\n    paddingTop: string | null;\n    pageBreakAfter: string | null;\n    pageBreakBefore: string | null;\n    pageBreakInside: string | null;\n    readonly parentRule: CSSRule;\n    perspective: string | null;\n    perspectiveOrigin: string | null;\n    pointerEvents: string | null;\n    position: string | null;\n    quotes: string | null;\n    right: string | null;\n    rotate: string | null;\n    rubyAlign: string | null;\n    rubyOverhang: string | null;\n    rubyPosition: string | null;\n    scale: string | null;\n    stopColor: string | null;\n    stopOpacity: string | null;\n    stroke: string | null;\n    strokeDasharray: string | null;\n    strokeDashoffset: string | null;\n    strokeLinecap: string | null;\n    strokeLinejoin: string | null;\n    strokeMiterlimit: string | null;\n    strokeOpacity: string | null;\n    strokeWidth: string | null;\n    tableLayout: string | null;\n    textAlign: string | null;\n    textAlignLast: string | null;\n    textAnchor: string | null;\n    textDecoration: string | null;\n    textIndent: string | null;\n    textJustify: string | null;\n    textKashida: string | null;\n    textKashidaSpace: string | null;\n    textOverflow: string | null;\n    textShadow: string | null;\n    textTransform: string | null;\n    textUnderlinePosition: string | null;\n    top: string | null;\n    touchAction: string | null;\n    transform: string | null;\n    transformOrigin: string | null;\n    transformStyle: string | null;\n    transition: string | null;\n    transitionDelay: string | null;\n    transitionDuration: string | null;\n    transitionProperty: string | null;\n    transitionTimingFunction: string | null;\n    translate: string | null;\n    unicodeBidi: string | null;\n    verticalAlign: string | null;\n    visibility: string | null;\n    webkitAlignContent: string | null;\n    webkitAlignItems: string | null;\n    webkitAlignSelf: string | null;\n    webkitAnimation: string | null;\n    webkitAnimationDelay: string | null;\n    webkitAnimationDirection: string | null;\n    webkitAnimationDuration: string | null;\n    webkitAnimationFillMode: string | null;\n    webkitAnimationIterationCount: string | null;\n    webkitAnimationName: string | null;\n    webkitAnimationPlayState: string | null;\n    webkitAnimationTimingFunction: string | null;\n    webkitAppearance: string | null;\n    webkitBackfaceVisibility: string | null;\n    webkitBackgroundClip: string | null;\n    webkitBackgroundOrigin: string | null;\n    webkitBackgroundSize: string | null;\n    webkitBorderBottomLeftRadius: string | null;\n    webkitBorderBottomRightRadius: string | null;\n    webkitBorderImage: string | null;\n    webkitBorderRadius: string | null;\n    webkitBorderTopLeftRadius: string | null;\n    webkitBorderTopRightRadius: string | null;\n    webkitBoxAlign: string | null;\n    webkitBoxDirection: string | null;\n    webkitBoxFlex: string | null;\n    webkitBoxOrdinalGroup: string | null;\n    webkitBoxOrient: string | null;\n    webkitBoxPack: string | null;\n    webkitBoxSizing: string | null;\n    webkitColumnBreakAfter: string | null;\n    webkitColumnBreakBefore: string | null;\n    webkitColumnBreakInside: string | null;\n    webkitColumnCount: any;\n    webkitColumnGap: any;\n    webkitColumnRule: string | null;\n    webkitColumnRuleColor: any;\n    webkitColumnRuleStyle: string | null;\n    webkitColumnRuleWidth: any;\n    webkitColumns: string | null;\n    webkitColumnSpan: string | null;\n    webkitColumnWidth: any;\n    webkitFilter: string | null;\n    webkitFlex: string | null;\n    webkitFlexBasis: string | null;\n    webkitFlexDirection: string | null;\n    webkitFlexFlow: string | null;\n    webkitFlexGrow: string | null;\n    webkitFlexShrink: string | null;\n    webkitFlexWrap: string | null;\n    webkitJustifyContent: string | null;\n    webkitOrder: string | null;\n    webkitPerspective: string | null;\n    webkitPerspectiveOrigin: string | null;\n    webkitTapHighlightColor: string | null;\n    webkitTextFillColor: string | null;\n    webkitTextSizeAdjust: any;\n    webkitTextStroke: string | null;\n    webkitTextStrokeColor: string | null;\n    webkitTextStrokeWidth: string | null;\n    webkitTransform: string | null;\n    webkitTransformOrigin: string | null;\n    webkitTransformStyle: string | null;\n    webkitTransition: string | null;\n    webkitTransitionDelay: string | null;\n    webkitTransitionDuration: string | null;\n    webkitTransitionProperty: string | null;\n    webkitTransitionTimingFunction: string | null;\n    webkitUserModify: string | null;\n    webkitUserSelect: string | null;\n    webkitWritingMode: string | null;\n    whiteSpace: string | null;\n    widows: string | null;\n    width: string | null;\n    wordBreak: string | null;\n    wordSpacing: string | null;\n    wordWrap: string | null;\n    writingMode: string | null;\n    zIndex: string | null;\n    zoom: string | null;\n    resize: string | null;\n    userSelect: string | null;\n    getPropertyPriority(propertyName: string): string;\n    getPropertyValue(propertyName: string): string;\n    item(index: number): string;\n    removeProperty(propertyName: string): string;\n    setProperty(propertyName: string, value: string | null, priority?: string): void;\n    [index: number]: string;\n}\n\ndeclare var CSSStyleDeclaration: {\n    prototype: CSSStyleDeclaration;\n    new(): CSSStyleDeclaration;\n};\n\ninterface CSSStyleRule extends CSSRule {\n    readonly readOnly: boolean;\n    selectorText: string;\n    readonly style: CSSStyleDeclaration;\n}\n\ndeclare var CSSStyleRule: {\n    prototype: CSSStyleRule;\n    new(): CSSStyleRule;\n};\n\ninterface CSSStyleSheet extends StyleSheet {\n    readonly cssRules: CSSRuleList;\n    cssText: string;\n    readonly id: string;\n    readonly imports: StyleSheetList;\n    readonly isAlternate: boolean;\n    readonly isPrefAlternate: boolean;\n    readonly ownerRule: CSSRule;\n    readonly owningElement: Element;\n    readonly pages: StyleSheetPageList;\n    readonly readOnly: boolean;\n    readonly rules: CSSRuleList;\n    addImport(bstrURL: string, lIndex?: number): number;\n    addPageRule(bstrSelector: string, bstrStyle: string, lIndex?: number): number;\n    addRule(bstrSelector: string, bstrStyle?: string, lIndex?: number): number;\n    deleteRule(index?: number): void;\n    insertRule(rule: string, index?: number): number;\n    removeImport(lIndex: number): void;\n    removeRule(lIndex: number): void;\n}\n\ndeclare var CSSStyleSheet: {\n    prototype: CSSStyleSheet;\n    new(): CSSStyleSheet;\n};\n\ninterface CSSSupportsRule extends CSSConditionRule {\n}\n\ndeclare var CSSSupportsRule: {\n    prototype: CSSSupportsRule;\n    new(): CSSSupportsRule;\n};\n\ninterface CustomEvent extends Event {\n    readonly detail: any;\n    initCustomEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, detailArg: any): void;\n}\n\ndeclare var CustomEvent: {\n    prototype: CustomEvent;\n    new(typeArg: string, eventInitDict?: CustomEventInit): CustomEvent;\n};\n\ninterface DataCue extends TextTrackCue {\n    data: ArrayBuffer;\n    addEventListener<K extends keyof TextTrackCueEventMap>(type: K, listener: (this: DataCue, ev: TextTrackCueEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var DataCue: {\n    prototype: DataCue;\n    new(): DataCue;\n};\n\ninterface DataTransfer {\n    dropEffect: string;\n    effectAllowed: string;\n    readonly files: FileList;\n    readonly items: DataTransferItemList;\n    readonly types: string[];\n    clearData(format?: string): boolean;\n    getData(format: string): string;\n    setData(format: string, data: string): boolean;\n    setDragImage(image: Element, x: number, y: number): void;\n}\n\ndeclare var DataTransfer: {\n    prototype: DataTransfer;\n    new(): DataTransfer;\n};\n\ninterface DataTransferItem {\n    readonly kind: string;\n    readonly type: string;\n    getAsFile(): File | null;\n    getAsString(_callback: FunctionStringCallback | null): void;\n    webkitGetAsEntry(): any;\n}\n\ndeclare var DataTransferItem: {\n    prototype: DataTransferItem;\n    new(): DataTransferItem;\n};\n\ninterface DataTransferItemList {\n    readonly length: number;\n    add(data: File): DataTransferItem | null;\n    clear(): void;\n    item(index: number): DataTransferItem;\n    remove(index: number): void;\n    [index: number]: DataTransferItem;\n}\n\ndeclare var DataTransferItemList: {\n    prototype: DataTransferItemList;\n    new(): DataTransferItemList;\n};\n\ninterface DeferredPermissionRequest {\n    readonly id: number;\n    readonly type: MSWebViewPermissionType;\n    readonly uri: string;\n    allow(): void;\n    deny(): void;\n}\n\ndeclare var DeferredPermissionRequest: {\n    prototype: DeferredPermissionRequest;\n    new(): DeferredPermissionRequest;\n};\n\ninterface DelayNode extends AudioNode {\n    readonly delayTime: AudioParam;\n}\n\ndeclare var DelayNode: {\n    prototype: DelayNode;\n    new(): DelayNode;\n};\n\ninterface DeviceAcceleration {\n    readonly x: number | null;\n    readonly y: number | null;\n    readonly z: number | null;\n}\n\ndeclare var DeviceAcceleration: {\n    prototype: DeviceAcceleration;\n    new(): DeviceAcceleration;\n};\n\ninterface DeviceLightEvent extends Event {\n    readonly value: number;\n}\n\ndeclare var DeviceLightEvent: {\n    prototype: DeviceLightEvent;\n    new(typeArg: string, eventInitDict?: DeviceLightEventInit): DeviceLightEvent;\n};\n\ninterface DeviceMotionEvent extends Event {\n    readonly acceleration: DeviceAcceleration | null;\n    readonly accelerationIncludingGravity: DeviceAcceleration | null;\n    readonly interval: number | null;\n    readonly rotationRate: DeviceRotationRate | null;\n    initDeviceMotionEvent(type: string, bubbles: boolean, cancelable: boolean, acceleration: DeviceAccelerationDict | null, accelerationIncludingGravity: DeviceAccelerationDict | null, rotationRate: DeviceRotationRateDict | null, interval: number | null): void;\n}\n\ndeclare var DeviceMotionEvent: {\n    prototype: DeviceMotionEvent;\n    new(typeArg: string, eventInitDict?: DeviceMotionEventInit): DeviceMotionEvent;\n};\n\ninterface DeviceOrientationEvent extends Event {\n    readonly absolute: boolean;\n    readonly alpha: number | null;\n    readonly beta: number | null;\n    readonly gamma: number | null;\n    initDeviceOrientationEvent(type: string, bubbles: boolean, cancelable: boolean, alpha: number | null, beta: number | null, gamma: number | null, absolute: boolean): void;\n}\n\ndeclare var DeviceOrientationEvent: {\n    prototype: DeviceOrientationEvent;\n    new(typeArg: string, eventInitDict?: DeviceOrientationEventInit): DeviceOrientationEvent;\n};\n\ninterface DeviceRotationRate {\n    readonly alpha: number | null;\n    readonly beta: number | null;\n    readonly gamma: number | null;\n}\n\ndeclare var DeviceRotationRate: {\n    prototype: DeviceRotationRate;\n    new(): DeviceRotationRate;\n};\n\ninterface DocumentEventMap extends GlobalEventHandlersEventMap {\n    "abort": UIEvent;\n    "activate": UIEvent;\n    "beforeactivate": UIEvent;\n    "beforedeactivate": UIEvent;\n    "blur": FocusEvent;\n    "canplay": Event;\n    "canplaythrough": Event;\n    "change": Event;\n    "click": MouseEvent;\n    "contextmenu": PointerEvent;\n    "dblclick": MouseEvent;\n    "deactivate": UIEvent;\n    "drag": DragEvent;\n    "dragend": DragEvent;\n    "dragenter": DragEvent;\n    "dragleave": DragEvent;\n    "dragover": DragEvent;\n    "dragstart": DragEvent;\n    "drop": DragEvent;\n    "durationchange": Event;\n    "emptied": Event;\n    "ended": MediaStreamErrorEvent;\n    "error": ErrorEvent;\n    "focus": FocusEvent;\n    "fullscreenchange": Event;\n    "fullscreenerror": Event;\n    "input": Event;\n    "invalid": Event;\n    "keydown": KeyboardEvent;\n    "keypress": KeyboardEvent;\n    "keyup": KeyboardEvent;\n    "load": Event;\n    "loadeddata": Event;\n    "loadedmetadata": Event;\n    "loadstart": Event;\n    "mousedown": MouseEvent;\n    "mousemove": MouseEvent;\n    "mouseout": MouseEvent;\n    "mouseover": MouseEvent;\n    "mouseup": MouseEvent;\n    "mousewheel": WheelEvent;\n    "MSContentZoom": UIEvent;\n    "MSGestureChange": MSGestureEvent;\n    "MSGestureDoubleTap": MSGestureEvent;\n    "MSGestureEnd": MSGestureEvent;\n    "MSGestureHold": MSGestureEvent;\n    "MSGestureStart": MSGestureEvent;\n    "MSGestureTap": MSGestureEvent;\n    "MSInertiaStart": MSGestureEvent;\n    "MSManipulationStateChanged": MSManipulationEvent;\n    "MSPointerCancel": MSPointerEvent;\n    "MSPointerDown": MSPointerEvent;\n    "MSPointerEnter": MSPointerEvent;\n    "MSPointerLeave": MSPointerEvent;\n    "MSPointerMove": MSPointerEvent;\n    "MSPointerOut": MSPointerEvent;\n    "MSPointerOver": MSPointerEvent;\n    "MSPointerUp": MSPointerEvent;\n    "mssitemodejumplistitemremoved": MSSiteModeEvent;\n    "msthumbnailclick": MSSiteModeEvent;\n    "pause": Event;\n    "play": Event;\n    "playing": Event;\n    "pointerlockchange": Event;\n    "pointerlockerror": Event;\n    "progress": ProgressEvent;\n    "ratechange": Event;\n    "readystatechange": Event;\n    "reset": Event;\n    "scroll": UIEvent;\n    "seeked": Event;\n    "seeking": Event;\n    "select": UIEvent;\n    "selectionchange": Event;\n    "selectstart": Event;\n    "stalled": Event;\n    "stop": Event;\n    "submit": Event;\n    "suspend": Event;\n    "timeupdate": Event;\n    "touchcancel": TouchEvent;\n    "touchend": TouchEvent;\n    "touchmove": TouchEvent;\n    "touchstart": TouchEvent;\n    "volumechange": Event;\n    "waiting": Event;\n    "webkitfullscreenchange": Event;\n    "webkitfullscreenerror": Event;\n}\n\ninterface Document extends Node, GlobalEventHandlers, NodeSelector, DocumentEvent, ParentNode, DocumentOrShadowRoot {\n    /**\n     * Gets the object that has the focus when the parent document has focus.\n     */\n    readonly activeElement: Element;\n    /**\n     * Sets or gets the color of all active links in the document.\n     */\n    alinkColor: string;\n    /**\n     * Returns a reference to the collection of elements contained by the object.\n     */\n    readonly all: HTMLAllCollection;\n    /**\n     * Retrieves a collection of all a objects that have a name and/or id property. Objects in this collection are in HTML source order.\n     */\n    anchors: HTMLCollectionOf<HTMLAnchorElement>;\n    /**\n     * Retrieves a collection of all applet objects in the document.\n     */\n    applets: HTMLCollectionOf<HTMLAppletElement>;\n    /**\n     * Deprecated. Sets or retrieves a value that indicates the background color behind the object.\n     */\n    bgColor: string;\n    /**\n     * Specifies the beginning and end of the document body.\n     */\n    body: HTMLElement;\n    readonly characterSet: string;\n    /**\n     * Gets or sets the character set used to encode the object.\n     */\n    charset: string;\n    /**\n     * Gets a value that indicates whether standards-compliant mode is switched on for the object.\n     */\n    readonly compatMode: string;\n    cookie: string;\n    readonly currentScript: HTMLScriptElement | SVGScriptElement;\n    readonly defaultView: Window;\n    /**\n     * Sets or gets a value that indicates whether the document can be edited.\n     */\n    designMode: string;\n    /**\n     * Sets or retrieves a value that indicates the reading order of the object.\n     */\n    dir: string;\n    /**\n     * Gets an object representing the document type declaration associated with the current document.\n     */\n    readonly doctype: DocumentType;\n    /**\n     * Gets a reference to the root node of the document.\n     */\n    documentElement: HTMLElement;\n    /**\n     * Sets or gets the security domain of the document.\n     */\n    domain: string;\n    /**\n     * Retrieves a collection of all embed objects in the document.\n     */\n    embeds: HTMLCollectionOf<HTMLEmbedElement>;\n    /**\n     * Sets or gets the foreground (text) color of the document.\n     */\n    fgColor: string;\n    /**\n     * Retrieves a collection, in source order, of all form objects in the document.\n     */\n    forms: HTMLCollectionOf<HTMLFormElement>;\n    readonly fullscreenElement: Element | null;\n    readonly fullscreenEnabled: boolean;\n    readonly head: HTMLHeadElement;\n    readonly hidden: boolean;\n    /**\n     * Retrieves a collection, in source order, of img objects in the document.\n     */\n    images: HTMLCollectionOf<HTMLImageElement>;\n    /**\n     * Gets the implementation object of the current document.\n     */\n    readonly implementation: DOMImplementation;\n    /**\n     * Returns the character encoding used to create the webpage that is loaded into the document object.\n     */\n    readonly inputEncoding: string | null;\n    /**\n     * Gets the date that the page was last modified, if the page supplies one.\n     */\n    readonly lastModified: string;\n    /**\n     * Sets or gets the color of the document links.\n     */\n    linkColor: string;\n    /**\n     * Retrieves a collection of all a objects that specify the href property and all area objects in the document.\n     */\n    links: HTMLCollectionOf<HTMLAnchorElement | HTMLAreaElement>;\n    /**\n     * Contains information about the current URL.\n     */\n    readonly location: Location;\n    msCapsLockWarningOff: boolean;\n    msCSSOMElementFloatMetrics: boolean;\n    /**\n     * Fires when the user aborts the download.\n     * @param ev The event.\n     */\n    onabort: (this: Document, ev: UIEvent) => any;\n    /**\n     * Fires when the object is set as the active element.\n     * @param ev The event.\n     */\n    onactivate: (this: Document, ev: UIEvent) => any;\n    /**\n     * Fires immediately before the object is set as the active element.\n     * @param ev The event.\n     */\n    onbeforeactivate: (this: Document, ev: UIEvent) => any;\n    /**\n     * Fires immediately before the activeElement is changed from the current object to another object in the parent document.\n     * @param ev The event.\n     */\n    onbeforedeactivate: (this: Document, ev: UIEvent) => any;\n    /**\n     * Fires when the object loses the input focus.\n     * @param ev The focus event.\n     */\n    onblur: (this: Document, ev: FocusEvent) => any;\n    /**\n     * Occurs when playback is possible, but would require further buffering.\n     * @param ev The event.\n     */\n    oncanplay: (this: Document, ev: Event) => any;\n    oncanplaythrough: (this: Document, ev: Event) => any;\n    /**\n     * Fires when the contents of the object or selection have changed.\n     * @param ev The event.\n     */\n    onchange: (this: Document, ev: Event) => any;\n    /**\n     * Fires when the user clicks the left mouse button on the object\n     * @param ev The mouse event.\n     */\n    onclick: (this: Document, ev: MouseEvent) => any;\n    /**\n     * Fires when the user clicks the right mouse button in the client area, opening the context menu.\n     * @param ev The mouse event.\n     */\n    oncontextmenu: (this: Document, ev: PointerEvent) => any;\n    /**\n     * Fires when the user double-clicks the object.\n     * @param ev The mouse event.\n     */\n    ondblclick: (this: Document, ev: MouseEvent) => any;\n    /**\n     * Fires when the activeElement is changed from the current object to another object in the parent document.\n     * @param ev The UI Event\n     */\n    ondeactivate: (this: Document, ev: UIEvent) => any;\n    /**\n     * Fires on the source object continuously during a drag operation.\n     * @param ev The event.\n     */\n    ondrag: (this: Document, ev: DragEvent) => any;\n    /**\n     * Fires on the source object when the user releases the mouse at the close of a drag operation.\n     * @param ev The event.\n     */\n    ondragend: (this: Document, ev: DragEvent) => any;\n    /**\n     * Fires on the target element when the user drags the object to a valid drop target.\n     * @param ev The drag event.\n     */\n    ondragenter: (this: Document, ev: DragEvent) => any;\n    /**\n     * Fires on the target object when the user moves the mouse out of a valid drop target during a drag operation.\n     * @param ev The drag event.\n     */\n    ondragleave: (this: Document, ev: DragEvent) => any;\n    /**\n     * Fires on the target element continuously while the user drags the object over a valid drop target.\n     * @param ev The event.\n     */\n    ondragover: (this: Document, ev: DragEvent) => any;\n    /**\n     * Fires on the source object when the user starts to drag a text selection or selected object.\n     * @param ev The event.\n     */\n    ondragstart: (this: Document, ev: DragEvent) => any;\n    ondrop: (this: Document, ev: DragEvent) => any;\n    /**\n     * Occurs when the duration attribute is updated.\n     * @param ev The event.\n     */\n    ondurationchange: (this: Document, ev: Event) => any;\n    /**\n     * Occurs when the media element is reset to its initial state.\n     * @param ev The event.\n     */\n    onemptied: (this: Document, ev: Event) => any;\n    /**\n     * Occurs when the end of playback is reached.\n     * @param ev The event\n     */\n    onended: (this: Document, ev: MediaStreamErrorEvent) => any;\n    /**\n     * Fires when an error occurs during object loading.\n     * @param ev The event.\n     */\n    onerror: (this: Document, ev: ErrorEvent) => any;\n    /**\n     * Fires when the object receives focus.\n     * @param ev The event.\n     */\n    onfocus: (this: Document, ev: FocusEvent) => any;\n    onfullscreenchange: (this: Document, ev: Event) => any;\n    onfullscreenerror: (this: Document, ev: Event) => any;\n    oninput: (this: Document, ev: Event) => any;\n    oninvalid: (this: Document, ev: Event) => any;\n    /**\n     * Fires when the user presses a key.\n     * @param ev The keyboard event\n     */\n    onkeydown: (this: Document, ev: KeyboardEvent) => any;\n    /**\n     * Fires when the user presses an alphanumeric key.\n     * @param ev The event.\n     */\n    onkeypress: (this: Document, ev: KeyboardEvent) => any;\n    /**\n     * Fires when the user releases a key.\n     * @param ev The keyboard event\n     */\n    onkeyup: (this: Document, ev: KeyboardEvent) => any;\n    /**\n     * Fires immediately after the browser loads the object.\n     * @param ev The event.\n     */\n    onload: (this: Document, ev: Event) => any;\n    /**\n     * Occurs when media data is loaded at the current playback position.\n     * @param ev The event.\n     */\n    onloadeddata: (this: Document, ev: Event) => any;\n    /**\n     * Occurs when the duration and dimensions of the media have been determined.\n     * @param ev The event.\n     */\n    onloadedmetadata: (this: Document, ev: Event) => any;\n    /**\n     * Occurs when Internet Explorer begins looking for media data.\n     * @param ev The event.\n     */\n    onloadstart: (this: Document, ev: Event) => any;\n    /**\n     * Fires when the user clicks the object with either mouse button.\n     * @param ev The mouse event.\n     */\n    onmousedown: (this: Document, ev: MouseEvent) => any;\n    /**\n     * Fires when the user moves the mouse over the object.\n     * @param ev The mouse event.\n     */\n    onmousemove: (this: Document, ev: MouseEvent) => any;\n    /**\n     * Fires when the user moves the mouse pointer outside the boundaries of the object.\n     * @param ev The mouse event.\n     */\n    onmouseout: (this: Document, ev: MouseEvent) => any;\n    /**\n     * Fires when the user moves the mouse pointer into the object.\n     * @param ev The mouse event.\n     */\n    onmouseover: (this: Document, ev: MouseEvent) => any;\n    /**\n     * Fires when the user releases a mouse button while the mouse is over the object.\n     * @param ev The mouse event.\n     */\n    onmouseup: (this: Document, ev: MouseEvent) => any;\n    /**\n     * Fires when the wheel button is rotated.\n     * @param ev The mouse event\n     */\n    onmousewheel: (this: Document, ev: WheelEvent) => any;\n    onmscontentzoom: (this: Document, ev: UIEvent) => any;\n    onmsgesturechange: (this: Document, ev: MSGestureEvent) => any;\n    onmsgesturedoubletap: (this: Document, ev: MSGestureEvent) => any;\n    onmsgestureend: (this: Document, ev: MSGestureEvent) => any;\n    onmsgesturehold: (this: Document, ev: MSGestureEvent) => any;\n    onmsgesturestart: (this: Document, ev: MSGestureEvent) => any;\n    onmsgesturetap: (this: Document, ev: MSGestureEvent) => any;\n    onmsinertiastart: (this: Document, ev: MSGestureEvent) => any;\n    onmsmanipulationstatechanged: (this: Document, ev: MSManipulationEvent) => any;\n    onmspointercancel: (this: Document, ev: MSPointerEvent) => any;\n    onmspointerdown: (this: Document, ev: MSPointerEvent) => any;\n    onmspointerenter: (this: Document, ev: MSPointerEvent) => any;\n    onmspointerleave: (this: Document, ev: MSPointerEvent) => any;\n    onmspointermove: (this: Document, ev: MSPointerEvent) => any;\n    onmspointerout: (this: Document, ev: MSPointerEvent) => any;\n    onmspointerover: (this: Document, ev: MSPointerEvent) => any;\n    onmspointerup: (this: Document, ev: MSPointerEvent) => any;\n    /**\n     * Occurs when an item is removed from a Jump List of a webpage running in Site Mode.\n     * @param ev The event.\n     */\n    onmssitemodejumplistitemremoved: (this: Document, ev: MSSiteModeEvent) => any;\n    /**\n     * Occurs when a user clicks a button in a Thumbnail Toolbar of a webpage running in Site Mode.\n     * @param ev The event.\n     */\n    onmsthumbnailclick: (this: Document, ev: MSSiteModeEvent) => any;\n    /**\n     * Occurs when playback is paused.\n     * @param ev The event.\n     */\n    onpause: (this: Document, ev: Event) => any;\n    /**\n     * Occurs when the play method is requested.\n     * @param ev The event.\n     */\n    onplay: (this: Document, ev: Event) => any;\n    /**\n     * Occurs when the audio or video has started playing.\n     * @param ev The event.\n     */\n    onplaying: (this: Document, ev: Event) => any;\n    onpointerlockchange: (this: Document, ev: Event) => any;\n    onpointerlockerror: (this: Document, ev: Event) => any;\n    /**\n     * Occurs to indicate progress while downloading media data.\n     * @param ev The event.\n     */\n    onprogress: (this: Document, ev: ProgressEvent) => any;\n    /**\n     * Occurs when the playback rate is increased or decreased.\n     * @param ev The event.\n     */\n    onratechange: (this: Document, ev: Event) => any;\n    /**\n     * Fires when the state of the object has changed.\n     * @param ev The event\n     */\n    onreadystatechange: (this: Document, ev: Event) => any;\n    /**\n     * Fires when the user resets a form.\n     * @param ev The event.\n     */\n    onreset: (this: Document, ev: Event) => any;\n    /**\n     * Fires when the user repositions the scroll box in the scroll bar on the object.\n     * @param ev The event.\n     */\n    onscroll: (this: Document, ev: UIEvent) => any;\n    /**\n     * Occurs when the seek operation ends.\n     * @param ev The event.\n     */\n    onseeked: (this: Document, ev: Event) => any;\n    /**\n     * Occurs when the current playback position is moved.\n     * @param ev The event.\n     */\n    onseeking: (this: Document, ev: Event) => any;\n    /**\n     * Fires when the current selection changes.\n     * @param ev The event.\n     */\n    onselect: (this: Document, ev: UIEvent) => any;\n    /**\n     * Fires when the selection state of a document changes.\n     * @param ev The event.\n     */\n    onselectionchange: (this: Document, ev: Event) => any;\n    onselectstart: (this: Document, ev: Event) => any;\n    /**\n     * Occurs when the download has stopped.\n     * @param ev The event.\n     */\n    onstalled: (this: Document, ev: Event) => any;\n    /**\n     * Fires when the user clicks the Stop button or leaves the Web page.\n     * @param ev The event.\n     */\n    onstop: (this: Document, ev: Event) => any;\n    onsubmit: (this: Document, ev: Event) => any;\n    /**\n     * Occurs if the load operation has been intentionally halted.\n     * @param ev The event.\n     */\n    onsuspend: (this: Document, ev: Event) => any;\n    /**\n     * Occurs to indicate the current playback position.\n     * @param ev The event.\n     */\n    ontimeupdate: (this: Document, ev: Event) => any;\n    ontouchcancel: (ev: TouchEvent) => any;\n    ontouchend: (ev: TouchEvent) => any;\n    ontouchmove: (ev: TouchEvent) => any;\n    ontouchstart: (ev: TouchEvent) => any;\n    /**\n     * Occurs when the volume is changed, or playback is muted or unmuted.\n     * @param ev The event.\n     */\n    onvolumechange: (this: Document, ev: Event) => any;\n    /**\n     * Occurs when playback stops because the next frame of a video resource is not available.\n     * @param ev The event.\n     */\n    onwaiting: (this: Document, ev: Event) => any;\n    onwebkitfullscreenchange: (this: Document, ev: Event) => any;\n    onwebkitfullscreenerror: (this: Document, ev: Event) => any;\n    plugins: HTMLCollectionOf<HTMLEmbedElement>;\n    readonly pointerLockElement: Element;\n    /**\n     * Retrieves a value that indicates the current state of the object.\n     */\n    readonly readyState: string;\n    /**\n     * Gets the URL of the location that referred the user to the current page.\n     */\n    readonly referrer: string;\n    /**\n     * Gets the root svg element in the document hierarchy.\n     */\n    readonly rootElement: SVGSVGElement;\n    /**\n     * Retrieves a collection of all script objects in the document.\n     */\n    scripts: HTMLCollectionOf<HTMLScriptElement>;\n    readonly scrollingElement: Element | null;\n    /**\n     * Retrieves a collection of styleSheet objects representing the style sheets that correspond to each instance of a link or style object in the document.\n     */\n    readonly styleSheets: StyleSheetList;\n    /**\n     * Contains the title of the document.\n     */\n    title: string;\n    /**\n     * Sets or gets the URL for the current document.\n     */\n    readonly URL: string;\n    /**\n     * Gets the URL for the document, stripped of any character encoding.\n     */\n    readonly URLUnencoded: string;\n    readonly visibilityState: VisibilityState;\n    /**\n     * Sets or gets the color of the links that the user has visited.\n     */\n    vlinkColor: string;\n    readonly webkitCurrentFullScreenElement: Element | null;\n    readonly webkitFullscreenElement: Element | null;\n    readonly webkitFullscreenEnabled: boolean;\n    readonly webkitIsFullScreen: boolean;\n    readonly xmlEncoding: string | null;\n    xmlStandalone: boolean;\n    /**\n     * Gets or sets the version attribute specified in the declaration of an XML document.\n     */\n    xmlVersion: string | null;\n    adoptNode<T extends Node>(source: T): T;\n    captureEvents(): void;\n    caretRangeFromPoint(x: number, y: number): Range;\n    clear(): void;\n    /**\n     * Closes an output stream and forces the sent data to display.\n     */\n    close(): void;\n    /**\n     * Creates an attribute object with a specified name.\n     * @param name String that sets the attribute object\'s name.\n     */\n    createAttribute(name: string): Attr;\n    createAttributeNS(namespaceURI: string | null, qualifiedName: string): Attr;\n    createCDATASection(data: string): CDATASection;\n    /**\n     * Creates a comment object with the specified data.\n     * @param data Sets the comment object\'s data.\n     */\n    createComment(data: string): Comment;\n    /**\n     * Creates a new document.\n     */\n    createDocumentFragment(): DocumentFragment;\n    /**\n     * Creates an instance of the element for the specified tag.\n     * @param tagName The name of an element.\n     */\n    createElement<K extends keyof HTMLElementTagNameMap>(tagName: K): HTMLElementTagNameMap[K];\n    createElement(tagName: string): HTMLElement;\n    createElementNS(namespaceURI: "http://www.w3.org/1999/xhtml", qualifiedName: string): HTMLElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "a"): SVGAElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "circle"): SVGCircleElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "clipPath"): SVGClipPathElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "componentTransferFunction"): SVGComponentTransferFunctionElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "defs"): SVGDefsElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "desc"): SVGDescElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "ellipse"): SVGEllipseElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feBlend"): SVGFEBlendElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feColorMatrix"): SVGFEColorMatrixElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feComponentTransfer"): SVGFEComponentTransferElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feComposite"): SVGFECompositeElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feConvolveMatrix"): SVGFEConvolveMatrixElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feDiffuseLighting"): SVGFEDiffuseLightingElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feDisplacementMap"): SVGFEDisplacementMapElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feDistantLight"): SVGFEDistantLightElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feFlood"): SVGFEFloodElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feFuncA"): SVGFEFuncAElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feFuncB"): SVGFEFuncBElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feFuncG"): SVGFEFuncGElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feFuncR"): SVGFEFuncRElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feGaussianBlur"): SVGFEGaussianBlurElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feImage"): SVGFEImageElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feMerge"): SVGFEMergeElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feMergeNode"): SVGFEMergeNodeElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feMorphology"): SVGFEMorphologyElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feOffset"): SVGFEOffsetElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "fePointLight"): SVGFEPointLightElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feSpecularLighting"): SVGFESpecularLightingElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feSpotLight"): SVGFESpotLightElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feTile"): SVGFETileElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feTurbulence"): SVGFETurbulenceElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "filter"): SVGFilterElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "foreignObject"): SVGForeignObjectElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "g"): SVGGElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "image"): SVGImageElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "gradient"): SVGGradientElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "line"): SVGLineElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "linearGradient"): SVGLinearGradientElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "marker"): SVGMarkerElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "mask"): SVGMaskElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "path"): SVGPathElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "metadata"): SVGMetadataElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "pattern"): SVGPatternElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "polygon"): SVGPolygonElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "polyline"): SVGPolylineElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "radialGradient"): SVGRadialGradientElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "rect"): SVGRectElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "svg"): SVGSVGElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "script"): SVGScriptElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "stop"): SVGStopElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "style"): SVGStyleElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "switch"): SVGSwitchElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "symbol"): SVGSymbolElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "tspan"): SVGTSpanElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "textContent"): SVGTextContentElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "text"): SVGTextElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "textPath"): SVGTextPathElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "textPositioning"): SVGTextPositioningElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "title"): SVGTitleElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "use"): SVGUseElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "view"): SVGViewElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: string): SVGElement;\n    createElementNS(namespaceURI: string | null, qualifiedName: string): Element;\n    createExpression(expression: string, resolver: XPathNSResolver): XPathExpression;\n    /**\n     * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.\n     * @param root The root element or node to start traversing on.\n     * @param whatToShow The type of nodes or elements to appear in the node list\n     * @param filter A custom NodeFilter function to use. For more information, see filter. Use null for no filter.\n     * @param entityReferenceExpansion A flag that specifies whether entity reference nodes are expanded.\n     */\n    createNodeIterator(root: Node, whatToShow?: number, filter?: NodeFilter, entityReferenceExpansion?: boolean): NodeIterator;\n    createNSResolver(nodeResolver: Node): XPathNSResolver;\n    createProcessingInstruction(target: string, data: string): ProcessingInstruction;\n    /**\n     *  Returns an empty range object that has both of its boundary points positioned at the beginning of the document.\n     */\n    createRange(): Range;\n    /**\n     * Creates a text string from the specified value.\n     * @param data String that specifies the nodeValue property of the text node.\n     */\n    createTextNode(data: string): Text;\n    createTouch(view: Window, target: EventTarget, identifier: number, pageX: number, pageY: number, screenX: number, screenY: number): Touch;\n    createTouchList(...touches: Touch[]): TouchList;\n    /**\n     * Creates a TreeWalker object that you can use to traverse filtered lists of nodes or elements in a document.\n     * @param root The root element or node to start traversing on.\n     * @param whatToShow The type of nodes or elements to appear in the node list. For more information, see whatToShow.\n     * @param filter A custom NodeFilter function to use.\n     * @param entityReferenceExpansion A flag that specifies whether entity reference nodes are expanded.\n     */\n    createTreeWalker(root: Node, whatToShow?: number, filter?: NodeFilter, entityReferenceExpansion?: boolean): TreeWalker;\n    /**\n     * Returns the element for the specified x coordinate and the specified y coordinate.\n     * @param x The x-offset\n     * @param y The y-offset\n     */\n    elementFromPoint(x: number, y: number): Element;\n    evaluate(expression: string, contextNode: Node, resolver: XPathNSResolver | null, type: number, result: XPathResult | null): XPathResult;\n    /**\n     * Executes a command on the current document, current selection, or the given range.\n     * @param commandId String that specifies the command to execute. This command can be any of the command identifiers that can be executed in script.\n     * @param showUI Display the user interface, defaults to false.\n     * @param value Value to assign.\n     */\n    execCommand(commandId: string, showUI?: boolean, value?: any): boolean;\n    /**\n     * Displays help information for the given command identifier.\n     * @param commandId Displays help information for the given command identifier.\n     */\n    execCommandShowHelp(commandId: string): boolean;\n    exitFullscreen(): void;\n    exitPointerLock(): void;\n    /**\n     * Causes the element to receive the focus and executes the code specified by the onfocus event.\n     */\n    focus(): void;\n    /**\n     * Returns a reference to the first object with the specified value of the ID or NAME attribute.\n     * @param elementId String that specifies the ID value. Case-insensitive.\n     */\n    getElementById(elementId: string): HTMLElement | null;\n    getElementsByClassName(classNames: string): HTMLCollectionOf<Element>;\n    /**\n     * Gets a collection of objects based on the value of the NAME or ID attribute.\n     * @param elementName Gets a collection of objects based on the value of the NAME or ID attribute.\n     */\n    getElementsByName(elementName: string): NodeListOf<HTMLElement>;\n    /**\n     * Retrieves a collection of objects based on the specified element name.\n     * @param name Specifies the name of an element.\n     */\n    getElementsByTagName<K extends keyof ElementListTagNameMap>(tagname: K): ElementListTagNameMap[K];\n    getElementsByTagName(tagname: string): NodeListOf<Element>;\n    getElementsByTagNameNS(namespaceURI: "http://www.w3.org/1999/xhtml", localName: string): HTMLCollectionOf<HTMLElement>;\n    getElementsByTagNameNS(namespaceURI: "http://www.w3.org/2000/svg", localName: string): HTMLCollectionOf<SVGElement>;\n    getElementsByTagNameNS(namespaceURI: string, localName: string): HTMLCollectionOf<Element>;\n    /**\n     * Returns an object representing the current selection of the document that is loaded into the object displaying a webpage.\n     */\n    getSelection(): Selection;\n    /**\n     * Gets a value indicating whether the object currently has focus.\n     */\n    hasFocus(): boolean;\n    importNode<T extends Node>(importedNode: T, deep: boolean): T;\n    msElementsFromPoint(x: number, y: number): NodeListOf<Element>;\n    msElementsFromRect(left: number, top: number, width: number, height: number): NodeListOf<Element>;\n    /**\n     * Opens a new window and loads a document specified by a given URL. Also, opens a new window that uses the url parameter and the name parameter to collect the output of the write method and the writeln method.\n     * @param url Specifies a MIME type for the document.\n     * @param name Specifies the name of the window. This name is used as the value for the TARGET attribute on a form or an anchor element.\n     * @param features Contains a list of items separated by commas. Each item consists of an option and a value, separated by an equals sign (for example, "fullscreen=yes, toolbar=yes"). The following values are supported.\n     * @param replace Specifies whether the existing entry for the document is replaced in the history list.\n     */\n    open(url?: string, name?: string, features?: string, replace?: boolean): Document;\n    /**\n     * Returns a Boolean value that indicates whether a specified command can be successfully executed using execCommand, given the current state of the document.\n     * @param commandId Specifies a command identifier.\n     */\n    queryCommandEnabled(commandId: string): boolean;\n    /**\n     * Returns a Boolean value that indicates whether the specified command is in the indeterminate state.\n     * @param commandId String that specifies a command identifier.\n     */\n    queryCommandIndeterm(commandId: string): boolean;\n    /**\n     * Returns a Boolean value that indicates the current state of the command.\n     * @param commandId String that specifies a command identifier.\n     */\n    queryCommandState(commandId: string): boolean;\n    /**\n     * Returns a Boolean value that indicates whether the current command is supported on the current range.\n     * @param commandId Specifies a command identifier.\n     */\n    queryCommandSupported(commandId: string): boolean;\n    /**\n     * Retrieves the string associated with a command.\n     * @param commandId String that contains the identifier of a command. This can be any command identifier given in the list of Command Identifiers.\n     */\n    queryCommandText(commandId: string): string;\n    /**\n     * Returns the current value of the document, range, or current selection for the given command.\n     * @param commandId String that specifies a command identifier.\n     */\n    queryCommandValue(commandId: string): string;\n    releaseEvents(): void;\n    /**\n     * Allows updating the print settings for the page.\n     */\n    updateSettings(): void;\n    webkitCancelFullScreen(): void;\n    webkitExitFullscreen(): void;\n    /**\n     * Writes one or more HTML expressions to a document in the specified window.\n     * @param content Specifies the text and HTML tags to write.\n     */\n    write(...content: string[]): void;\n    /**\n     * Writes one or more HTML expressions, followed by a carriage return, to a document in the specified window.\n     * @param content The text and HTML tags to write.\n     */\n    writeln(...content: string[]): void;\n    addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var Document: {\n    prototype: Document;\n    new(): Document;\n};\n\ninterface DocumentFragment extends Node, NodeSelector, ParentNode {\n    getElementById(elementId: string): HTMLElement | null;\n}\n\ndeclare var DocumentFragment: {\n    prototype: DocumentFragment;\n    new(): DocumentFragment;\n};\n\ninterface DocumentType extends Node, ChildNode {\n    readonly entities: NamedNodeMap;\n    readonly internalSubset: string | null;\n    readonly name: string;\n    readonly notations: NamedNodeMap;\n    readonly publicId: string;\n    readonly systemId: string;\n}\n\ndeclare var DocumentType: {\n    prototype: DocumentType;\n    new(): DocumentType;\n};\n\ninterface DOMError {\n    readonly name: string;\n    toString(): string;\n}\n\ndeclare var DOMError: {\n    prototype: DOMError;\n    new(): DOMError;\n};\n\ninterface DOMException {\n    readonly code: number;\n    readonly message: string;\n    readonly name: string;\n    toString(): string;\n    readonly ABORT_ERR: number;\n    readonly DATA_CLONE_ERR: number;\n    readonly DOMSTRING_SIZE_ERR: number;\n    readonly HIERARCHY_REQUEST_ERR: number;\n    readonly INDEX_SIZE_ERR: number;\n    readonly INUSE_ATTRIBUTE_ERR: number;\n    readonly INVALID_ACCESS_ERR: number;\n    readonly INVALID_CHARACTER_ERR: number;\n    readonly INVALID_MODIFICATION_ERR: number;\n    readonly INVALID_NODE_TYPE_ERR: number;\n    readonly INVALID_STATE_ERR: number;\n    readonly NAMESPACE_ERR: number;\n    readonly NETWORK_ERR: number;\n    readonly NO_DATA_ALLOWED_ERR: number;\n    readonly NO_MODIFICATION_ALLOWED_ERR: number;\n    readonly NOT_FOUND_ERR: number;\n    readonly NOT_SUPPORTED_ERR: number;\n    readonly PARSE_ERR: number;\n    readonly QUOTA_EXCEEDED_ERR: number;\n    readonly SECURITY_ERR: number;\n    readonly SERIALIZE_ERR: number;\n    readonly SYNTAX_ERR: number;\n    readonly TIMEOUT_ERR: number;\n    readonly TYPE_MISMATCH_ERR: number;\n    readonly URL_MISMATCH_ERR: number;\n    readonly VALIDATION_ERR: number;\n    readonly WRONG_DOCUMENT_ERR: number;\n}\n\ndeclare var DOMException: {\n    prototype: DOMException;\n    new(): DOMException;\n    readonly ABORT_ERR: number;\n    readonly DATA_CLONE_ERR: number;\n    readonly DOMSTRING_SIZE_ERR: number;\n    readonly HIERARCHY_REQUEST_ERR: number;\n    readonly INDEX_SIZE_ERR: number;\n    readonly INUSE_ATTRIBUTE_ERR: number;\n    readonly INVALID_ACCESS_ERR: number;\n    readonly INVALID_CHARACTER_ERR: number;\n    readonly INVALID_MODIFICATION_ERR: number;\n    readonly INVALID_NODE_TYPE_ERR: number;\n    readonly INVALID_STATE_ERR: number;\n    readonly NAMESPACE_ERR: number;\n    readonly NETWORK_ERR: number;\n    readonly NO_DATA_ALLOWED_ERR: number;\n    readonly NO_MODIFICATION_ALLOWED_ERR: number;\n    readonly NOT_FOUND_ERR: number;\n    readonly NOT_SUPPORTED_ERR: number;\n    readonly PARSE_ERR: number;\n    readonly QUOTA_EXCEEDED_ERR: number;\n    readonly SECURITY_ERR: number;\n    readonly SERIALIZE_ERR: number;\n    readonly SYNTAX_ERR: number;\n    readonly TIMEOUT_ERR: number;\n    readonly TYPE_MISMATCH_ERR: number;\n    readonly URL_MISMATCH_ERR: number;\n    readonly VALIDATION_ERR: number;\n    readonly WRONG_DOCUMENT_ERR: number;\n};\n\ninterface DOMImplementation {\n    createDocument(namespaceURI: string | null, qualifiedName: string | null, doctype: DocumentType | null): Document;\n    createDocumentType(qualifiedName: string, publicId: string, systemId: string): DocumentType;\n    createHTMLDocument(title: string): Document;\n    hasFeature(feature: string | null, version: string | null): boolean;\n}\n\ndeclare var DOMImplementation: {\n    prototype: DOMImplementation;\n    new(): DOMImplementation;\n};\n\ninterface DOMParser {\n    parseFromString(source: string, mimeType: string): Document;\n}\n\ndeclare var DOMParser: {\n    prototype: DOMParser;\n    new(): DOMParser;\n};\n\ninterface DOMSettableTokenList extends DOMTokenList {\n    value: string;\n}\n\ndeclare var DOMSettableTokenList: {\n    prototype: DOMSettableTokenList;\n    new(): DOMSettableTokenList;\n};\n\ninterface DOMStringList {\n    readonly length: number;\n    contains(str: string): boolean;\n    item(index: number): string | null;\n    [index: number]: string;\n}\n\ndeclare var DOMStringList: {\n    prototype: DOMStringList;\n    new(): DOMStringList;\n};\n\ninterface DOMStringMap {\n    [name: string]: string | undefined;\n}\n\ndeclare var DOMStringMap: {\n    prototype: DOMStringMap;\n    new(): DOMStringMap;\n};\n\ninterface DOMTokenList {\n    readonly length: number;\n    add(...token: string[]): void;\n    contains(token: string): boolean;\n    item(index: number): string;\n    remove(...token: string[]): void;\n    toggle(token: string, force?: boolean): boolean;\n    toString(): string;\n    [index: number]: string;\n}\n\ndeclare var DOMTokenList: {\n    prototype: DOMTokenList;\n    new(): DOMTokenList;\n};\n\ninterface DragEvent extends MouseEvent {\n    readonly dataTransfer: DataTransfer;\n    initDragEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, ctrlKeyArg: boolean, altKeyArg: boolean, shiftKeyArg: boolean, metaKeyArg: boolean, buttonArg: number, relatedTargetArg: EventTarget, dataTransferArg: DataTransfer): void;\n    msConvertURL(file: File, targetType: string, targetURL?: string): void;\n}\n\ndeclare var DragEvent: {\n    prototype: DragEvent;\n    new(type: "drag" | "dragend" | "dragenter" | "dragexit" | "dragleave" | "dragover" | "dragstart" | "drop", dragEventInit?: { dataTransfer?: DataTransfer }): DragEvent;\n};\n\ninterface DynamicsCompressorNode extends AudioNode {\n    readonly attack: AudioParam;\n    readonly knee: AudioParam;\n    readonly ratio: AudioParam;\n    readonly reduction: number;\n    readonly release: AudioParam;\n    readonly threshold: AudioParam;\n}\n\ndeclare var DynamicsCompressorNode: {\n    prototype: DynamicsCompressorNode;\n    new(): DynamicsCompressorNode;\n};\n\ninterface ElementEventMap extends GlobalEventHandlersEventMap {\n    "ariarequest": Event;\n    "command": Event;\n    "gotpointercapture": PointerEvent;\n    "lostpointercapture": PointerEvent;\n    "MSGestureChange": MSGestureEvent;\n    "MSGestureDoubleTap": MSGestureEvent;\n    "MSGestureEnd": MSGestureEvent;\n    "MSGestureHold": MSGestureEvent;\n    "MSGestureStart": MSGestureEvent;\n    "MSGestureTap": MSGestureEvent;\n    "MSGotPointerCapture": MSPointerEvent;\n    "MSInertiaStart": MSGestureEvent;\n    "MSLostPointerCapture": MSPointerEvent;\n    "MSPointerCancel": MSPointerEvent;\n    "MSPointerDown": MSPointerEvent;\n    "MSPointerEnter": MSPointerEvent;\n    "MSPointerLeave": MSPointerEvent;\n    "MSPointerMove": MSPointerEvent;\n    "MSPointerOut": MSPointerEvent;\n    "MSPointerOver": MSPointerEvent;\n    "MSPointerUp": MSPointerEvent;\n    "touchcancel": TouchEvent;\n    "touchend": TouchEvent;\n    "touchmove": TouchEvent;\n    "touchstart": TouchEvent;\n    "webkitfullscreenchange": Event;\n    "webkitfullscreenerror": Event;\n}\n\ninterface Element extends Node, GlobalEventHandlers, ElementTraversal, NodeSelector, ChildNode, ParentNode {\n    readonly classList: DOMTokenList;\n    className: string;\n    readonly clientHeight: number;\n    readonly clientLeft: number;\n    readonly clientTop: number;\n    readonly clientWidth: number;\n    id: string;\n    innerHTML: string;\n    msContentZoomFactor: number;\n    readonly msRegionOverflow: string;\n    onariarequest: (this: Element, ev: Event) => any;\n    oncommand: (this: Element, ev: Event) => any;\n    ongotpointercapture: (this: Element, ev: PointerEvent) => any;\n    onlostpointercapture: (this: Element, ev: PointerEvent) => any;\n    onmsgesturechange: (this: Element, ev: MSGestureEvent) => any;\n    onmsgesturedoubletap: (this: Element, ev: MSGestureEvent) => any;\n    onmsgestureend: (this: Element, ev: MSGestureEvent) => any;\n    onmsgesturehold: (this: Element, ev: MSGestureEvent) => any;\n    onmsgesturestart: (this: Element, ev: MSGestureEvent) => any;\n    onmsgesturetap: (this: Element, ev: MSGestureEvent) => any;\n    onmsgotpointercapture: (this: Element, ev: MSPointerEvent) => any;\n    onmsinertiastart: (this: Element, ev: MSGestureEvent) => any;\n    onmslostpointercapture: (this: Element, ev: MSPointerEvent) => any;\n    onmspointercancel: (this: Element, ev: MSPointerEvent) => any;\n    onmspointerdown: (this: Element, ev: MSPointerEvent) => any;\n    onmspointerenter: (this: Element, ev: MSPointerEvent) => any;\n    onmspointerleave: (this: Element, ev: MSPointerEvent) => any;\n    onmspointermove: (this: Element, ev: MSPointerEvent) => any;\n    onmspointerout: (this: Element, ev: MSPointerEvent) => any;\n    onmspointerover: (this: Element, ev: MSPointerEvent) => any;\n    onmspointerup: (this: Element, ev: MSPointerEvent) => any;\n    ontouchcancel: (ev: TouchEvent) => any;\n    ontouchend: (ev: TouchEvent) => any;\n    ontouchmove: (ev: TouchEvent) => any;\n    ontouchstart: (ev: TouchEvent) => any;\n    onwebkitfullscreenchange: (this: Element, ev: Event) => any;\n    onwebkitfullscreenerror: (this: Element, ev: Event) => any;\n    outerHTML: string;\n    readonly prefix: string | null;\n    readonly scrollHeight: number;\n    scrollLeft: number;\n    scrollTop: number;\n    readonly scrollWidth: number;\n    readonly tagName: string;\n    readonly assignedSlot: HTMLSlotElement | null;\n    slot: string;\n    readonly shadowRoot: ShadowRoot | null;\n    getAttribute(name: string): string | null;\n    getAttributeNode(name: string): Attr;\n    getAttributeNodeNS(namespaceURI: string, localName: string): Attr;\n    getAttributeNS(namespaceURI: string, localName: string): string;\n    getBoundingClientRect(): ClientRect;\n    getClientRects(): ClientRectList;\n    getElementsByTagName<K extends keyof ElementListTagNameMap>(name: K): ElementListTagNameMap[K];\n    getElementsByTagName(name: string): NodeListOf<Element>;\n    getElementsByTagNameNS(namespaceURI: "http://www.w3.org/1999/xhtml", localName: string): HTMLCollectionOf<HTMLElement>;\n    getElementsByTagNameNS(namespaceURI: "http://www.w3.org/2000/svg", localName: string): HTMLCollectionOf<SVGElement>;\n    getElementsByTagNameNS(namespaceURI: string, localName: string): HTMLCollectionOf<Element>;\n    hasAttribute(name: string): boolean;\n    hasAttributeNS(namespaceURI: string, localName: string): boolean;\n    msGetRegionContent(): MSRangeCollection;\n    msGetUntransformedBounds(): ClientRect;\n    msMatchesSelector(selectors: string): boolean;\n    msReleasePointerCapture(pointerId: number): void;\n    msSetPointerCapture(pointerId: number): void;\n    msZoomTo(args: MsZoomToOptions): void;\n    releasePointerCapture(pointerId: number): void;\n    removeAttribute(qualifiedName: string): void;\n    removeAttributeNode(oldAttr: Attr): Attr;\n    removeAttributeNS(namespaceURI: string, localName: string): void;\n    requestFullscreen(): void;\n    requestPointerLock(): void;\n    setAttribute(name: string, value: string): void;\n    setAttributeNode(newAttr: Attr): Attr;\n    setAttributeNodeNS(newAttr: Attr): Attr;\n    setAttributeNS(namespaceURI: string, qualifiedName: string, value: string): void;\n    setPointerCapture(pointerId: number): void;\n    webkitMatchesSelector(selectors: string): boolean;\n    webkitRequestFullscreen(): void;\n    webkitRequestFullScreen(): void;\n    getElementsByClassName(classNames: string): NodeListOf<Element>;\n    matches(selector: string): boolean;\n    closest(selector: string): Element | null;\n    scrollIntoView(arg?: boolean | ScrollIntoViewOptions): void;\n    scroll(options?: ScrollToOptions): void;\n    scroll(x: number, y: number): void;\n    scrollTo(options?: ScrollToOptions): void;\n    scrollTo(x: number, y: number): void;\n    scrollBy(options?: ScrollToOptions): void;\n    scrollBy(x: number, y: number): void;\n    insertAdjacentElement(position: InsertPosition, insertedElement: Element): Element | null;\n    insertAdjacentHTML(where: InsertPosition, html: string): void;\n    insertAdjacentText(where: InsertPosition, text: string): void;\n    attachShadow(shadowRootInitDict: ShadowRootInit): ShadowRoot;\n    addEventListener<K extends keyof ElementEventMap>(type: K, listener: (this: Element, ev: ElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var Element: {\n    prototype: Element;\n    new(): Element;\n};\n\ninterface ErrorEvent extends Event {\n    readonly colno: number;\n    readonly error: any;\n    readonly filename: string;\n    readonly lineno: number;\n    readonly message: string;\n    initErrorEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, messageArg: string, filenameArg: string, linenoArg: number): void;\n}\n\ndeclare var ErrorEvent: {\n    prototype: ErrorEvent;\n    new(type: string, errorEventInitDict?: ErrorEventInit): ErrorEvent;\n};\n\ninterface Event {\n    readonly bubbles: boolean;\n    readonly cancelable: boolean;\n    cancelBubble: boolean;\n    readonly currentTarget: EventTarget;\n    readonly defaultPrevented: boolean;\n    readonly eventPhase: number;\n    readonly isTrusted: boolean;\n    returnValue: boolean;\n    readonly srcElement: Element | null;\n    readonly target: EventTarget;\n    readonly timeStamp: number;\n    readonly type: string;\n    readonly scoped: boolean;\n    initEvent(eventTypeArg: string, canBubbleArg: boolean, cancelableArg: boolean): void;\n    preventDefault(): void;\n    stopImmediatePropagation(): void;\n    stopPropagation(): void;\n    deepPath(): EventTarget[];\n    readonly AT_TARGET: number;\n    readonly BUBBLING_PHASE: number;\n    readonly CAPTURING_PHASE: number;\n}\n\ndeclare var Event: {\n    prototype: Event;\n    new(typeArg: string, eventInitDict?: EventInit): Event;\n    readonly AT_TARGET: number;\n    readonly BUBBLING_PHASE: number;\n    readonly CAPTURING_PHASE: number;\n};\n\ninterface EventTarget {\n    addEventListener(type: string, listener?: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;\n    dispatchEvent(evt: Event): boolean;\n    removeEventListener(type: string, listener?: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;\n}\n\ndeclare var EventTarget: {\n    prototype: EventTarget;\n    new(): EventTarget;\n};\n\ninterface EXT_frag_depth {\n}\n\ndeclare var EXT_frag_depth: {\n    prototype: EXT_frag_depth;\n    new(): EXT_frag_depth;\n};\n\ninterface EXT_texture_filter_anisotropic {\n    readonly MAX_TEXTURE_MAX_ANISOTROPY_EXT: number;\n    readonly TEXTURE_MAX_ANISOTROPY_EXT: number;\n}\n\ndeclare var EXT_texture_filter_anisotropic: {\n    prototype: EXT_texture_filter_anisotropic;\n    new(): EXT_texture_filter_anisotropic;\n    readonly MAX_TEXTURE_MAX_ANISOTROPY_EXT: number;\n    readonly TEXTURE_MAX_ANISOTROPY_EXT: number;\n};\n\ninterface ExtensionScriptApis {\n    extensionIdToShortId(extensionId: string): number;\n    fireExtensionApiTelemetry(functionName: string, isSucceeded: boolean, isSupported: boolean): void;\n    genericFunction(routerAddress: any, parameters?: string, callbackId?: number): void;\n    genericSynchronousFunction(functionId: number, parameters?: string): string;\n    getExtensionId(): string;\n    registerGenericFunctionCallbackHandler(callbackHandler: any): void;\n    registerGenericPersistentCallbackHandler(callbackHandler: any): void;\n}\n\ndeclare var ExtensionScriptApis: {\n    prototype: ExtensionScriptApis;\n    new(): ExtensionScriptApis;\n};\n\ninterface External {\n}\n\ndeclare var External: {\n    prototype: External;\n    new(): External;\n};\n\ninterface File extends Blob {\n    readonly lastModifiedDate: any;\n    readonly name: string;\n    readonly webkitRelativePath: string;\n}\n\ndeclare var File: {\n    prototype: File;\n    new (parts: (ArrayBuffer | ArrayBufferView | Blob | string)[], filename: string, properties?: FilePropertyBag): File;\n};\n\ninterface FileList {\n    readonly length: number;\n    item(index: number): File;\n    [index: number]: File;\n}\n\ndeclare var FileList: {\n    prototype: FileList;\n    new(): FileList;\n};\n\ninterface FileReader extends EventTarget, MSBaseReader {\n    readonly error: DOMError;\n    readAsArrayBuffer(blob: Blob): void;\n    readAsBinaryString(blob: Blob): void;\n    readAsDataURL(blob: Blob): void;\n    readAsText(blob: Blob, encoding?: string): void;\n    addEventListener<K extends keyof MSBaseReaderEventMap>(type: K, listener: (this: FileReader, ev: MSBaseReaderEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var FileReader: {\n    prototype: FileReader;\n    new(): FileReader;\n};\n\ninterface FocusEvent extends UIEvent {\n    readonly relatedTarget: EventTarget;\n    initFocusEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, relatedTargetArg: EventTarget): void;\n}\n\ndeclare var FocusEvent: {\n    prototype: FocusEvent;\n    new(typeArg: string, eventInitDict?: FocusEventInit): FocusEvent;\n};\n\ninterface FocusNavigationEvent extends Event {\n    readonly navigationReason: NavigationReason;\n    readonly originHeight: number;\n    readonly originLeft: number;\n    readonly originTop: number;\n    readonly originWidth: number;\n    requestFocus(): void;\n}\n\ndeclare var FocusNavigationEvent: {\n    prototype: FocusNavigationEvent;\n    new(type: string, eventInitDict?: FocusNavigationEventInit): FocusNavigationEvent;\n};\n\ninterface FormData {\n    append(name: string, value: string | Blob, fileName?: string): void;\n    delete(name: string): void;\n    get(name: string): FormDataEntryValue | null;\n    getAll(name: string): FormDataEntryValue[];\n    has(name: string): boolean;\n    set(name: string, value: string | Blob, fileName?: string): void;\n}\n\ndeclare var FormData: {\n    prototype: FormData;\n    new (form?: HTMLFormElement): FormData;\n};\n\ninterface GainNode extends AudioNode {\n    readonly gain: AudioParam;\n}\n\ndeclare var GainNode: {\n    prototype: GainNode;\n    new(): GainNode;\n};\n\ninterface Gamepad {\n    readonly axes: number[];\n    readonly buttons: GamepadButton[];\n    readonly connected: boolean;\n    readonly id: string;\n    readonly index: number;\n    readonly mapping: string;\n    readonly timestamp: number;\n}\n\ndeclare var Gamepad: {\n    prototype: Gamepad;\n    new(): Gamepad;\n};\n\ninterface GamepadButton {\n    readonly pressed: boolean;\n    readonly value: number;\n}\n\ndeclare var GamepadButton: {\n    prototype: GamepadButton;\n    new(): GamepadButton;\n};\n\ninterface GamepadEvent extends Event {\n    readonly gamepad: Gamepad;\n}\n\ndeclare var GamepadEvent: {\n    prototype: GamepadEvent;\n    new(typeArg: string, eventInitDict?: GamepadEventInit): GamepadEvent;\n};\n\ninterface Geolocation {\n    clearWatch(watchId: number): void;\n    getCurrentPosition(successCallback: PositionCallback, errorCallback?: PositionErrorCallback, options?: PositionOptions): void;\n    watchPosition(successCallback: PositionCallback, errorCallback?: PositionErrorCallback, options?: PositionOptions): number;\n}\n\ndeclare var Geolocation: {\n    prototype: Geolocation;\n    new(): Geolocation;\n};\n\ninterface HashChangeEvent extends Event {\n    readonly newURL: string | null;\n    readonly oldURL: string | null;\n}\n\ndeclare var HashChangeEvent: {\n    prototype: HashChangeEvent;\n    new(typeArg: string, eventInitDict?: HashChangeEventInit): HashChangeEvent;\n};\n\ninterface Headers {\n    append(name: string, value: string): void;\n    delete(name: string): void;\n    forEach(callback: ForEachCallback): void;\n    get(name: string): string | null;\n    has(name: string): boolean;\n    set(name: string, value: string): void;\n}\n\ndeclare var Headers: {\n    prototype: Headers;\n    new(init?: any): Headers;\n};\n\ninterface History {\n    readonly length: number;\n    readonly state: any;\n    scrollRestoration: ScrollRestoration;\n    back(): void;\n    forward(): void;\n    go(delta?: number): void;\n    pushState(data: any, title: string, url?: string | null): void;\n    replaceState(data: any, title: string, url?: string | null): void;\n}\n\ndeclare var History: {\n    prototype: History;\n    new(): History;\n};\n\ninterface HTMLAllCollection {\n    readonly length: number;\n    item(nameOrIndex?: string): HTMLCollection | Element | null;\n    namedItem(name: string): HTMLCollection | Element | null;\n    [index: number]: Element;\n}\n\ndeclare var HTMLAllCollection: {\n    prototype: HTMLAllCollection;\n    new(): HTMLAllCollection;\n};\n\ninterface HTMLAnchorElement extends HTMLElement {\n    /**\n     * Sets or retrieves the character set used to encode the object.\n     */\n    charset: string;\n    /**\n     * Sets or retrieves the coordinates of the object.\n     */\n    coords: string;\n    download: string;\n    /**\n     * Contains the anchor portion of the URL including the hash sign (#).\n     */\n    hash: string;\n    /**\n     * Contains the hostname and port values of the URL.\n     */\n    host: string;\n    /**\n     * Contains the hostname of a URL.\n     */\n    hostname: string;\n    /**\n     * Sets or retrieves a destination URL or an anchor point.\n     */\n    href: string;\n    /**\n     * Sets or retrieves the language code of the object.\n     */\n    hreflang: string;\n    Methods: string;\n    readonly mimeType: string;\n    /**\n     * Sets or retrieves the shape of the object.\n     */\n    name: string;\n    readonly nameProp: string;\n    /**\n     * Contains the pathname of the URL.\n     */\n    pathname: string;\n    /**\n     * Sets or retrieves the port number associated with a URL.\n     */\n    port: string;\n    /**\n     * Contains the protocol of the URL.\n     */\n    protocol: string;\n    readonly protocolLong: string;\n    /**\n     * Sets or retrieves the relationship between the object and the destination of the link.\n     */\n    rel: string;\n    /**\n     * Sets or retrieves the relationship between the object and the destination of the link.\n     */\n    rev: string;\n    /**\n     * Sets or retrieves the substring of the href property that follows the question mark.\n     */\n    search: string;\n    /**\n     * Sets or retrieves the shape of the object.\n     */\n    shape: string;\n    /**\n     * Sets or retrieves the window or frame at which to target content.\n     */\n    target: string;\n    /**\n     * Retrieves or sets the text of the object as a string.\n     */\n    text: string;\n    type: string;\n    urn: string;\n    /**\n     * Returns a string representation of an object.\n     */\n    toString(): string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLAnchorElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLAnchorElement: {\n    prototype: HTMLAnchorElement;\n    new(): HTMLAnchorElement;\n};\n\ninterface HTMLAppletElement extends HTMLElement {\n    align: string;\n    /**\n     * Sets or retrieves a text alternative to the graphic.\n     */\n    alt: string;\n    /**\n     * Gets or sets the optional alternative HTML script to execute if the object fails to load.\n     */\n    altHtml: string;\n    /**\n     * Sets or retrieves a character string that can be used to implement your own archive functionality for the object.\n     */\n    archive: string;\n    /**\n     * Retrieves a string of the URL where the object tag can be found. This is often the href of the document that the object is in, or the value set by a base element.\n     */\n    readonly BaseHref: string;\n    border: string;\n    code: string;\n    /**\n     * Sets or retrieves the URL of the component.\n     */\n    codeBase: string;\n    /**\n     * Sets or retrieves the Internet media type for the code associated with the object.\n     */\n    codeType: string;\n    /**\n     * Address of a pointer to the document this page or frame contains. If there is no document, then null will be returned.\n     */\n    readonly contentDocument: Document;\n    /**\n     * Sets or retrieves the URL that references the data of the object.\n     */\n    data: string;\n    /**\n     * Sets or retrieves a character string that can be used to implement your own declare functionality for the object.\n     */\n    declare: boolean;\n    readonly form: HTMLFormElement;\n    /**\n     * Sets or retrieves the height of the object.\n     */\n    height: string;\n    hspace: number;\n    /**\n     * Sets or retrieves the shape of the object.\n     */\n    name: string;\n    object: string | null;\n    /**\n     * Sets or retrieves a message to be displayed while an object is loading.\n     */\n    standby: string;\n    /**\n     * Returns the content type of the object.\n     */\n    type: string;\n    /**\n     * Sets or retrieves the URL, often with a bookmark extension (#name), to use as a client-side image map.\n     */\n    useMap: string;\n    vspace: number;\n    width: number;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLAppletElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLAppletElement: {\n    prototype: HTMLAppletElement;\n    new(): HTMLAppletElement;\n};\n\ninterface HTMLAreaElement extends HTMLElement {\n    /**\n     * Sets or retrieves a text alternative to the graphic.\n     */\n    alt: string;\n    /**\n     * Sets or retrieves the coordinates of the object.\n     */\n    coords: string;\n    download: string;\n    /**\n     * Sets or retrieves the subsection of the href property that follows the number sign (#).\n     */\n    hash: string;\n    /**\n     * Sets or retrieves the hostname and port number of the location or URL.\n     */\n    host: string;\n    /**\n     * Sets or retrieves the host name part of the location or URL.\n     */\n    hostname: string;\n    /**\n     * Sets or retrieves a destination URL or an anchor point.\n     */\n    href: string;\n    /**\n     * Sets or gets whether clicks in this region cause action.\n     */\n    noHref: boolean;\n    /**\n     * Sets or retrieves the file name or path specified by the object.\n     */\n    pathname: string;\n    /**\n     * Sets or retrieves the port number associated with a URL.\n     */\n    port: string;\n    /**\n     * Sets or retrieves the protocol portion of a URL.\n     */\n    protocol: string;\n    rel: string;\n    /**\n     * Sets or retrieves the substring of the href property that follows the question mark.\n     */\n    search: string;\n    /**\n     * Sets or retrieves the shape of the object.\n     */\n    shape: string;\n    /**\n     * Sets or retrieves the window or frame at which to target content.\n     */\n    target: string;\n    /**\n     * Returns a string representation of an object.\n     */\n    toString(): string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLAreaElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLAreaElement: {\n    prototype: HTMLAreaElement;\n    new(): HTMLAreaElement;\n};\n\ninterface HTMLAreasCollection extends HTMLCollectionBase {\n}\n\ndeclare var HTMLAreasCollection: {\n    prototype: HTMLAreasCollection;\n    new(): HTMLAreasCollection;\n};\n\ninterface HTMLAudioElement extends HTMLMediaElement {\n    addEventListener<K extends keyof HTMLMediaElementEventMap>(type: K, listener: (this: HTMLAudioElement, ev: HTMLMediaElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLAudioElement: {\n    prototype: HTMLAudioElement;\n    new(): HTMLAudioElement;\n};\n\ninterface HTMLBaseElement extends HTMLElement {\n    /**\n     * Gets or sets the baseline URL on which relative links are based.\n     */\n    href: string;\n    /**\n     * Sets or retrieves the window or frame at which to target content.\n     */\n    target: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLBaseElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLBaseElement: {\n    prototype: HTMLBaseElement;\n    new(): HTMLBaseElement;\n};\n\ninterface HTMLBaseFontElement extends HTMLElement, DOML2DeprecatedColorProperty {\n    /**\n     * Sets or retrieves the current typeface family.\n     */\n    face: string;\n    /**\n     * Sets or retrieves the font size of the object.\n     */\n    size: number;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLBaseFontElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLBaseFontElement: {\n    prototype: HTMLBaseFontElement;\n    new(): HTMLBaseFontElement;\n};\n\ninterface HTMLBodyElementEventMap extends HTMLElementEventMap {\n    "afterprint": Event;\n    "beforeprint": Event;\n    "beforeunload": BeforeUnloadEvent;\n    "blur": FocusEvent;\n    "error": ErrorEvent;\n    "focus": FocusEvent;\n    "hashchange": HashChangeEvent;\n    "load": Event;\n    "message": MessageEvent;\n    "offline": Event;\n    "online": Event;\n    "orientationchange": Event;\n    "pagehide": PageTransitionEvent;\n    "pageshow": PageTransitionEvent;\n    "popstate": PopStateEvent;\n    "resize": UIEvent;\n    "scroll": UIEvent;\n    "storage": StorageEvent;\n    "unload": Event;\n}\n\ninterface HTMLBodyElement extends HTMLElement {\n    aLink: any;\n    background: string;\n    bgColor: any;\n    bgProperties: string;\n    link: any;\n    noWrap: boolean;\n    onafterprint: (this: HTMLBodyElement, ev: Event) => any;\n    onbeforeprint: (this: HTMLBodyElement, ev: Event) => any;\n    onbeforeunload: (this: HTMLBodyElement, ev: BeforeUnloadEvent) => any;\n    onblur: (this: HTMLBodyElement, ev: FocusEvent) => any;\n    onerror: (this: HTMLBodyElement, ev: ErrorEvent) => any;\n    onfocus: (this: HTMLBodyElement, ev: FocusEvent) => any;\n    onhashchange: (this: HTMLBodyElement, ev: HashChangeEvent) => any;\n    onload: (this: HTMLBodyElement, ev: Event) => any;\n    onmessage: (this: HTMLBodyElement, ev: MessageEvent) => any;\n    onoffline: (this: HTMLBodyElement, ev: Event) => any;\n    ononline: (this: HTMLBodyElement, ev: Event) => any;\n    onorientationchange: (this: HTMLBodyElement, ev: Event) => any;\n    onpagehide: (this: HTMLBodyElement, ev: PageTransitionEvent) => any;\n    onpageshow: (this: HTMLBodyElement, ev: PageTransitionEvent) => any;\n    onpopstate: (this: HTMLBodyElement, ev: PopStateEvent) => any;\n    onresize: (this: HTMLBodyElement, ev: UIEvent) => any;\n    onscroll: (this: HTMLBodyElement, ev: UIEvent) => any;\n    onstorage: (this: HTMLBodyElement, ev: StorageEvent) => any;\n    onunload: (this: HTMLBodyElement, ev: Event) => any;\n    text: any;\n    vLink: any;\n    addEventListener<K extends keyof HTMLBodyElementEventMap>(type: K, listener: (this: HTMLBodyElement, ev: HTMLBodyElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLBodyElement: {\n    prototype: HTMLBodyElement;\n    new(): HTMLBodyElement;\n};\n\ninterface HTMLBRElement extends HTMLElement {\n    /**\n     * Sets or retrieves the side on which floating objects are not to be positioned when any IHTMLBlockElement is inserted into the document.\n     */\n    clear: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLBRElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLBRElement: {\n    prototype: HTMLBRElement;\n    new(): HTMLBRElement;\n};\n\ninterface HTMLButtonElement extends HTMLElement {\n    /**\n     * Provides a way to direct a user to a specific field when a document loads. This can provide both direction and convenience for a user, reducing the need to click or tab to a field when a page opens. This attribute is true when present on an element, and false when missing.\n     */\n    autofocus: boolean;\n    disabled: boolean;\n    /**\n     * Retrieves a reference to the form that the object is embedded in.\n     */\n    readonly form: HTMLFormElement;\n    /**\n     * Overrides the action attribute (where the data on a form is sent) on the parent form element.\n     */\n    formAction: string;\n    /**\n     * Used to override the encoding (formEnctype attribute) specified on the form element.\n     */\n    formEnctype: string;\n    /**\n     * Overrides the submit method attribute previously specified on a form element.\n     */\n    formMethod: string;\n    /**\n     * Overrides any validation or required attributes on a form or form elements to allow it to be submitted without validation. This can be used to create a "save draft"-type submit option.\n     */\n    formNoValidate: string;\n    /**\n     * Overrides the target attribute on a form element.\n     */\n    formTarget: string;\n    /**\n     * Sets or retrieves the name of the object.\n     */\n    name: string;\n    status: any;\n    /**\n     * Gets the classification and default behavior of the button.\n     */\n    type: string;\n    /**\n     * Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting.\n     */\n    readonly validationMessage: string;\n    /**\n     * Returns a  ValidityState object that represents the validity states of an element.\n     */\n    readonly validity: ValidityState;\n    /**\n     * Sets or retrieves the default or selected value of the control.\n     */\n    value: string;\n    /**\n     * Returns whether an element will successfully validate based on forms validation rules and constraints.\n     */\n    readonly willValidate: boolean;\n    /**\n     * Returns whether a form will validate when it is submitted, without having to submit it.\n     */\n    checkValidity(): boolean;\n    /**\n     * Sets a custom error message that is displayed when a form is submitted.\n     * @param error Sets a custom error message that is displayed when a form is submitted.\n     */\n    setCustomValidity(error: string): void;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLButtonElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLButtonElement: {\n    prototype: HTMLButtonElement;\n    new(): HTMLButtonElement;\n};\n\ninterface HTMLCanvasElement extends HTMLElement {\n    /**\n     * Gets or sets the height of a canvas element on a document.\n     */\n    height: number;\n    /**\n     * Gets or sets the width of a canvas element on a document.\n     */\n    width: number;\n    /**\n     * Returns an object that provides methods and properties for drawing and manipulating images and graphics on a canvas element in a document. A context object includes information about colors, line widths, fonts, and other graphic parameters that can be drawn on a canvas.\n     * @param contextId The identifier (ID) of the type of canvas to create. Internet Explorer 9 and Internet Explorer 10 support only a 2-D context using canvas.getContext("2d"); IE11 Preview also supports 3-D or WebGL context using canvas.getContext("experimental-webgl");\n     */\n    getContext(contextId: "2d", contextAttributes?: Canvas2DContextAttributes): CanvasRenderingContext2D | null;\n    getContext(contextId: "webgl" | "experimental-webgl", contextAttributes?: WebGLContextAttributes): WebGLRenderingContext | null;\n    getContext(contextId: string, contextAttributes?: {}): CanvasRenderingContext2D | WebGLRenderingContext | null;\n    /**\n     * Returns a blob object encoded as a Portable Network Graphics (PNG) format from a canvas image or drawing.\n     */\n    msToBlob(): Blob;\n    /**\n     * Returns the content of the current canvas as an image that you can use as a source for another canvas or an HTML element.\n     * @param type The standard MIME type for the image format to return. If you do not specify this parameter, the default value is a PNG format image.\n     */\n    toDataURL(type?: string, ...args: any[]): string;\n    toBlob(callback: (result: Blob | null) => void, type?: string, ...arguments: any[]): void;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLCanvasElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLCanvasElement: {\n    prototype: HTMLCanvasElement;\n    new(): HTMLCanvasElement;\n};\n\ninterface HTMLCollectionBase {\n    /**\n     * Sets or retrieves the number of objects in a collection.\n     */\n    readonly length: number;\n    /**\n     * Retrieves an object from various collections.\n     */\n    item(index: number): Element;\n    [index: number]: Element;\n}\n\ninterface HTMLCollection extends HTMLCollectionBase {\n    /**\n     * Retrieves a select object or an object from an options collection.\n     */\n    namedItem(name: string): Element | null;\n}\n\ndeclare var HTMLCollection: {\n    prototype: HTMLCollection;\n    new(): HTMLCollection;\n};\n\ninterface HTMLDataElement extends HTMLElement {\n    value: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDataElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLDataElement: {\n    prototype: HTMLDataElement;\n    new(): HTMLDataElement;\n};\n\ninterface HTMLDataListElement extends HTMLElement {\n    options: HTMLCollectionOf<HTMLOptionElement>;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDataListElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLDataListElement: {\n    prototype: HTMLDataListElement;\n    new(): HTMLDataListElement;\n};\n\ninterface HTMLDirectoryElement extends HTMLElement {\n    compact: boolean;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDirectoryElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLDirectoryElement: {\n    prototype: HTMLDirectoryElement;\n    new(): HTMLDirectoryElement;\n};\n\ninterface HTMLDivElement extends HTMLElement {\n    /**\n     * Sets or retrieves how the object is aligned with adjacent text.\n     */\n    align: string;\n    /**\n     * Sets or retrieves whether the browser automatically performs wordwrap.\n     */\n    noWrap: boolean;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDivElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLDivElement: {\n    prototype: HTMLDivElement;\n    new(): HTMLDivElement;\n};\n\ninterface HTMLDListElement extends HTMLElement {\n    compact: boolean;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDListElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLDListElement: {\n    prototype: HTMLDListElement;\n    new(): HTMLDListElement;\n};\n\ninterface HTMLDocument extends Document {\n    addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: HTMLDocument, ev: DocumentEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLDocument: {\n    prototype: HTMLDocument;\n    new(): HTMLDocument;\n};\n\ninterface HTMLElementEventMap extends ElementEventMap {\n    "abort": UIEvent;\n    "activate": UIEvent;\n    "beforeactivate": UIEvent;\n    "beforecopy": ClipboardEvent;\n    "beforecut": ClipboardEvent;\n    "beforedeactivate": UIEvent;\n    "beforepaste": ClipboardEvent;\n    "blur": FocusEvent;\n    "canplay": Event;\n    "canplaythrough": Event;\n    "change": Event;\n    "click": MouseEvent;\n    "contextmenu": PointerEvent;\n    "copy": ClipboardEvent;\n    "cuechange": Event;\n    "cut": ClipboardEvent;\n    "dblclick": MouseEvent;\n    "deactivate": UIEvent;\n    "drag": DragEvent;\n    "dragend": DragEvent;\n    "dragenter": DragEvent;\n    "dragleave": DragEvent;\n    "dragover": DragEvent;\n    "dragstart": DragEvent;\n    "drop": DragEvent;\n    "durationchange": Event;\n    "emptied": Event;\n    "ended": MediaStreamErrorEvent;\n    "error": ErrorEvent;\n    "focus": FocusEvent;\n    "input": Event;\n    "invalid": Event;\n    "keydown": KeyboardEvent;\n    "keypress": KeyboardEvent;\n    "keyup": KeyboardEvent;\n    "load": Event;\n    "loadeddata": Event;\n    "loadedmetadata": Event;\n    "loadstart": Event;\n    "mousedown": MouseEvent;\n    "mouseenter": MouseEvent;\n    "mouseleave": MouseEvent;\n    "mousemove": MouseEvent;\n    "mouseout": MouseEvent;\n    "mouseover": MouseEvent;\n    "mouseup": MouseEvent;\n    "mousewheel": WheelEvent;\n    "MSContentZoom": UIEvent;\n    "MSManipulationStateChanged": MSManipulationEvent;\n    "paste": ClipboardEvent;\n    "pause": Event;\n    "play": Event;\n    "playing": Event;\n    "progress": ProgressEvent;\n    "ratechange": Event;\n    "reset": Event;\n    "scroll": UIEvent;\n    "seeked": Event;\n    "seeking": Event;\n    "select": UIEvent;\n    "selectstart": Event;\n    "stalled": Event;\n    "submit": Event;\n    "suspend": Event;\n    "timeupdate": Event;\n    "volumechange": Event;\n    "waiting": Event;\n}\n\ninterface HTMLElement extends Element {\n    accessKey: string;\n    readonly children: HTMLCollection;\n    contentEditable: string;\n    readonly dataset: DOMStringMap;\n    dir: string;\n    draggable: boolean;\n    hidden: boolean;\n    hideFocus: boolean;\n    innerText: string;\n    readonly isContentEditable: boolean;\n    lang: string;\n    readonly offsetHeight: number;\n    readonly offsetLeft: number;\n    readonly offsetParent: Element;\n    readonly offsetTop: number;\n    readonly offsetWidth: number;\n    onabort: (this: HTMLElement, ev: UIEvent) => any;\n    onactivate: (this: HTMLElement, ev: UIEvent) => any;\n    onbeforeactivate: (this: HTMLElement, ev: UIEvent) => any;\n    onbeforecopy: (this: HTMLElement, ev: ClipboardEvent) => any;\n    onbeforecut: (this: HTMLElement, ev: ClipboardEvent) => any;\n    onbeforedeactivate: (this: HTMLElement, ev: UIEvent) => any;\n    onbeforepaste: (this: HTMLElement, ev: ClipboardEvent) => any;\n    onblur: (this: HTMLElement, ev: FocusEvent) => any;\n    oncanplay: (this: HTMLElement, ev: Event) => any;\n    oncanplaythrough: (this: HTMLElement, ev: Event) => any;\n    onchange: (this: HTMLElement, ev: Event) => any;\n    onclick: (this: HTMLElement, ev: MouseEvent) => any;\n    oncontextmenu: (this: HTMLElement, ev: PointerEvent) => any;\n    oncopy: (this: HTMLElement, ev: ClipboardEvent) => any;\n    oncuechange: (this: HTMLElement, ev: Event) => any;\n    oncut: (this: HTMLElement, ev: ClipboardEvent) => any;\n    ondblclick: (this: HTMLElement, ev: MouseEvent) => any;\n    ondeactivate: (this: HTMLElement, ev: UIEvent) => any;\n    ondrag: (this: HTMLElement, ev: DragEvent) => any;\n    ondragend: (this: HTMLElement, ev: DragEvent) => any;\n    ondragenter: (this: HTMLElement, ev: DragEvent) => any;\n    ondragleave: (this: HTMLElement, ev: DragEvent) => any;\n    ondragover: (this: HTMLElement, ev: DragEvent) => any;\n    ondragstart: (this: HTMLElement, ev: DragEvent) => any;\n    ondrop: (this: HTMLElement, ev: DragEvent) => any;\n    ondurationchange: (this: HTMLElement, ev: Event) => any;\n    onemptied: (this: HTMLElement, ev: Event) => any;\n    onended: (this: HTMLElement, ev: MediaStreamErrorEvent) => any;\n    onerror: (this: HTMLElement, ev: ErrorEvent) => any;\n    onfocus: (this: HTMLElement, ev: FocusEvent) => any;\n    oninput: (this: HTMLElement, ev: Event) => any;\n    oninvalid: (this: HTMLElement, ev: Event) => any;\n    onkeydown: (this: HTMLElement, ev: KeyboardEvent) => any;\n    onkeypress: (this: HTMLElement, ev: KeyboardEvent) => any;\n    onkeyup: (this: HTMLElement, ev: KeyboardEvent) => any;\n    onload: (this: HTMLElement, ev: Event) => any;\n    onloadeddata: (this: HTMLElement, ev: Event) => any;\n    onloadedmetadata: (this: HTMLElement, ev: Event) => any;\n    onloadstart: (this: HTMLElement, ev: Event) => any;\n    onmousedown: (this: HTMLElement, ev: MouseEvent) => any;\n    onmouseenter: (this: HTMLElement, ev: MouseEvent) => any;\n    onmouseleave: (this: HTMLElement, ev: MouseEvent) => any;\n    onmousemove: (this: HTMLElement, ev: MouseEvent) => any;\n    onmouseout: (this: HTMLElement, ev: MouseEvent) => any;\n    onmouseover: (this: HTMLElement, ev: MouseEvent) => any;\n    onmouseup: (this: HTMLElement, ev: MouseEvent) => any;\n    onmousewheel: (this: HTMLElement, ev: WheelEvent) => any;\n    onmscontentzoom: (this: HTMLElement, ev: UIEvent) => any;\n    onmsmanipulationstatechanged: (this: HTMLElement, ev: MSManipulationEvent) => any;\n    onpaste: (this: HTMLElement, ev: ClipboardEvent) => any;\n    onpause: (this: HTMLElement, ev: Event) => any;\n    onplay: (this: HTMLElement, ev: Event) => any;\n    onplaying: (this: HTMLElement, ev: Event) => any;\n    onprogress: (this: HTMLElement, ev: ProgressEvent) => any;\n    onratechange: (this: HTMLElement, ev: Event) => any;\n    onreset: (this: HTMLElement, ev: Event) => any;\n    onscroll: (this: HTMLElement, ev: UIEvent) => any;\n    onseeked: (this: HTMLElement, ev: Event) => any;\n    onseeking: (this: HTMLElement, ev: Event) => any;\n    onselect: (this: HTMLElement, ev: UIEvent) => any;\n    onselectstart: (this: HTMLElement, ev: Event) => any;\n    onstalled: (this: HTMLElement, ev: Event) => any;\n    onsubmit: (this: HTMLElement, ev: Event) => any;\n    onsuspend: (this: HTMLElement, ev: Event) => any;\n    ontimeupdate: (this: HTMLElement, ev: Event) => any;\n    onvolumechange: (this: HTMLElement, ev: Event) => any;\n    onwaiting: (this: HTMLElement, ev: Event) => any;\n    outerText: string;\n    spellcheck: boolean;\n    readonly style: CSSStyleDeclaration;\n    tabIndex: number;\n    title: string;\n    blur(): void;\n    click(): void;\n    dragDrop(): boolean;\n    focus(): void;\n    msGetInputContext(): MSInputMethodContext;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLElement: {\n    prototype: HTMLElement;\n    new(): HTMLElement;\n};\n\ninterface HTMLEmbedElement extends HTMLElement, GetSVGDocument {\n    /**\n     * Sets or retrieves the height of the object.\n     */\n    height: string;\n    hidden: any;\n    /**\n     * Gets or sets whether the DLNA PlayTo device is available.\n     */\n    msPlayToDisabled: boolean;\n    /**\n     * Gets or sets the path to the preferred media source. This enables the Play To target device to stream the media content, which can be DRM protected, from a different location, such as a cloud media server.\n     */\n    msPlayToPreferredSourceUri: string;\n    /**\n     * Gets or sets the primary DLNA PlayTo device.\n     */\n    msPlayToPrimary: boolean;\n    /**\n     * Gets the source associated with the media element for use by the PlayToManager.\n     */\n    readonly msPlayToSource: any;\n    /**\n     * Sets or retrieves the name of the object.\n     */\n    name: string;\n    /**\n     * Retrieves the palette used for the embedded document.\n     */\n    readonly palette: string;\n    /**\n     * Retrieves the URL of the plug-in used to view an embedded document.\n     */\n    readonly pluginspage: string;\n    readonly readyState: string;\n    /**\n     * Sets or retrieves a URL to be loaded by the object.\n     */\n    src: string;\n    /**\n     * Sets or retrieves the height and width units of the embed object.\n     */\n    units: string;\n    /**\n     * Sets or retrieves the width of the object.\n     */\n    width: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLEmbedElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLEmbedElement: {\n    prototype: HTMLEmbedElement;\n    new(): HTMLEmbedElement;\n};\n\ninterface HTMLFieldSetElement extends HTMLElement {\n    /**\n     * Sets or retrieves how the object is aligned with adjacent text.\n     */\n    align: string;\n    disabled: boolean;\n    /**\n     * Retrieves a reference to the form that the object is embedded in.\n     */\n    readonly form: HTMLFormElement;\n    name: string;\n    /**\n     * Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting.\n     */\n    readonly validationMessage: string;\n    /**\n     * Returns a  ValidityState object that represents the validity states of an element.\n     */\n    readonly validity: ValidityState;\n    /**\n     * Returns whether an element will successfully validate based on forms validation rules and constraints.\n     */\n    readonly willValidate: boolean;\n    /**\n     * Returns whether a form will validate when it is submitted, without having to submit it.\n     */\n    checkValidity(): boolean;\n    /**\n     * Sets a custom error message that is displayed when a form is submitted.\n     * @param error Sets a custom error message that is displayed when a form is submitted.\n     */\n    setCustomValidity(error: string): void;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLFieldSetElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLFieldSetElement: {\n    prototype: HTMLFieldSetElement;\n    new(): HTMLFieldSetElement;\n};\n\ninterface HTMLFontElement extends HTMLElement, DOML2DeprecatedColorProperty, DOML2DeprecatedSizeProperty {\n    /**\n     * Sets or retrieves the current typeface family.\n     */\n    face: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLFontElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLFontElement: {\n    prototype: HTMLFontElement;\n    new(): HTMLFontElement;\n};\n\ninterface HTMLFormControlsCollection extends HTMLCollectionBase {\n    namedItem(name: string): HTMLCollection | Element | null;\n}\n\ndeclare var HTMLFormControlsCollection: {\n    prototype: HTMLFormControlsCollection;\n    new(): HTMLFormControlsCollection;\n};\n\ninterface HTMLFormElement extends HTMLElement {\n    /**\n     * Sets or retrieves a list of character encodings for input data that must be accepted by the server processing the form.\n     */\n    acceptCharset: string;\n    /**\n     * Sets or retrieves the URL to which the form content is sent for processing.\n     */\n    action: string;\n    /**\n     * Specifies whether autocomplete is applied to an editable text field.\n     */\n    autocomplete: string;\n    /**\n     * Retrieves a collection, in source order, of all controls in a given form.\n     */\n    readonly elements: HTMLFormControlsCollection;\n    /**\n     * Sets or retrieves the MIME encoding for the form.\n     */\n    encoding: string;\n    /**\n     * Sets or retrieves the encoding type for the form.\n     */\n    enctype: string;\n    /**\n     * Sets or retrieves the number of objects in a collection.\n     */\n    readonly length: number;\n    /**\n     * Sets or retrieves how to send the form data to the server.\n     */\n    method: string;\n    /**\n     * Sets or retrieves the name of the object.\n     */\n    name: string;\n    /**\n     * Designates a form that is not validated when submitted.\n     */\n    noValidate: boolean;\n    /**\n     * Sets or retrieves the window or frame at which to target content.\n     */\n    target: string;\n    /**\n     * Returns whether a form will validate when it is submitted, without having to submit it.\n     */\n    checkValidity(): boolean;\n    /**\n     * Retrieves a form object or an object from an elements collection.\n     * @param name Variant of type Number or String that specifies the object or collection to retrieve. If this parameter is a Number, it is the zero-based index of the object. If this parameter is a string, all objects with matching name or id properties are retrieved, and a collection is returned if more than one match is made.\n     * @param index Variant of type Number that specifies the zero-based index of the object to retrieve when a collection is returned.\n     */\n    item(name?: any, index?: any): any;\n    /**\n     * Retrieves a form object or an object from an elements collection.\n     */\n    namedItem(name: string): any;\n    /**\n     * Fires when the user resets a form.\n     */\n    reset(): void;\n    /**\n     * Fires when a FORM is about to be submitted.\n     */\n    submit(): void;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLFormElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n    [name: string]: any;\n}\n\ndeclare var HTMLFormElement: {\n    prototype: HTMLFormElement;\n    new(): HTMLFormElement;\n};\n\ninterface HTMLFrameElementEventMap extends HTMLElementEventMap {\n    "load": Event;\n}\n\ninterface HTMLFrameElement extends HTMLElement, GetSVGDocument {\n    /**\n     * Specifies the properties of a border drawn around an object.\n     */\n    border: string;\n    /**\n     * Sets or retrieves the border color of the object.\n     */\n    borderColor: any;\n    /**\n     * Retrieves the document object of the page or frame.\n     */\n    readonly contentDocument: Document;\n    /**\n     * Retrieves the object of the specified.\n     */\n    readonly contentWindow: Window;\n    /**\n     * Sets or retrieves whether to display a border for the frame.\n     */\n    frameBorder: string;\n    /**\n     * Sets or retrieves the amount of additional space between the frames.\n     */\n    frameSpacing: any;\n    /**\n     * Sets or retrieves the height of the object.\n     */\n    height: string | number;\n    /**\n     * Sets or retrieves a URI to a long description of the object.\n     */\n    longDesc: string;\n    /**\n     * Sets or retrieves the top and bottom margin heights before displaying the text in a frame.\n     */\n    marginHeight: string;\n    /**\n     * Sets or retrieves the left and right margin widths before displaying the text in a frame.\n     */\n    marginWidth: string;\n    /**\n     * Sets or retrieves the frame name.\n     */\n    name: string;\n    /**\n     * Sets or retrieves whether the user can resize the frame.\n     */\n    noResize: boolean;\n    /**\n     * Raised when the object has been completely received from the server.\n     */\n    onload: (this: HTMLFrameElement, ev: Event) => any;\n    /**\n     * Sets or retrieves whether the frame can be scrolled.\n     */\n    scrolling: string;\n    /**\n     * Sets or retrieves a URL to be loaded by the object.\n     */\n    src: string;\n    /**\n     * Sets or retrieves the width of the object.\n     */\n    width: string | number;\n    addEventListener<K extends keyof HTMLFrameElementEventMap>(type: K, listener: (this: HTMLFrameElement, ev: HTMLFrameElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLFrameElement: {\n    prototype: HTMLFrameElement;\n    new(): HTMLFrameElement;\n};\n\ninterface HTMLFrameSetElementEventMap extends HTMLElementEventMap {\n    "afterprint": Event;\n    "beforeprint": Event;\n    "beforeunload": BeforeUnloadEvent;\n    "blur": FocusEvent;\n    "error": ErrorEvent;\n    "focus": FocusEvent;\n    "hashchange": HashChangeEvent;\n    "load": Event;\n    "message": MessageEvent;\n    "offline": Event;\n    "online": Event;\n    "orientationchange": Event;\n    "pagehide": PageTransitionEvent;\n    "pageshow": PageTransitionEvent;\n    "popstate": PopStateEvent;\n    "resize": UIEvent;\n    "scroll": UIEvent;\n    "storage": StorageEvent;\n    "unload": Event;\n}\n\ninterface HTMLFrameSetElement extends HTMLElement {\n    border: string;\n    /**\n     * Sets or retrieves the border color of the object.\n     */\n    borderColor: any;\n    /**\n     * Sets or retrieves the frame widths of the object.\n     */\n    cols: string;\n    /**\n     * Sets or retrieves whether to display a border for the frame.\n     */\n    frameBorder: string;\n    /**\n     * Sets or retrieves the amount of additional space between the frames.\n     */\n    frameSpacing: any;\n    name: string;\n    onafterprint: (this: HTMLFrameSetElement, ev: Event) => any;\n    onbeforeprint: (this: HTMLFrameSetElement, ev: Event) => any;\n    onbeforeunload: (this: HTMLFrameSetElement, ev: BeforeUnloadEvent) => any;\n    /**\n     * Fires when the object loses the input focus.\n     */\n    onblur: (this: HTMLFrameSetElement, ev: FocusEvent) => any;\n    onerror: (this: HTMLFrameSetElement, ev: ErrorEvent) => any;\n    /**\n     * Fires when the object receives focus.\n     */\n    onfocus: (this: HTMLFrameSetElement, ev: FocusEvent) => any;\n    onhashchange: (this: HTMLFrameSetElement, ev: HashChangeEvent) => any;\n    onload: (this: HTMLFrameSetElement, ev: Event) => any;\n    onmessage: (this: HTMLFrameSetElement, ev: MessageEvent) => any;\n    onoffline: (this: HTMLFrameSetElement, ev: Event) => any;\n    ononline: (this: HTMLFrameSetElement, ev: Event) => any;\n    onorientationchange: (this: HTMLFrameSetElement, ev: Event) => any;\n    onpagehide: (this: HTMLFrameSetElement, ev: PageTransitionEvent) => any;\n    onpageshow: (this: HTMLFrameSetElement, ev: PageTransitionEvent) => any;\n    onpopstate: (this: HTMLFrameSetElement, ev: PopStateEvent) => any;\n    onresize: (this: HTMLFrameSetElement, ev: UIEvent) => any;\n    onscroll: (this: HTMLFrameSetElement, ev: UIEvent) => any;\n    onstorage: (this: HTMLFrameSetElement, ev: StorageEvent) => any;\n    onunload: (this: HTMLFrameSetElement, ev: Event) => any;\n    /**\n     * Sets or retrieves the frame heights of the object.\n     */\n    rows: string;\n    addEventListener<K extends keyof HTMLFrameSetElementEventMap>(type: K, listener: (this: HTMLFrameSetElement, ev: HTMLFrameSetElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLFrameSetElement: {\n    prototype: HTMLFrameSetElement;\n    new(): HTMLFrameSetElement;\n};\n\ninterface HTMLHeadElement extends HTMLElement {\n    profile: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLHeadElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLHeadElement: {\n    prototype: HTMLHeadElement;\n    new(): HTMLHeadElement;\n};\n\ninterface HTMLHeadingElement extends HTMLElement {\n    /**\n     * Sets or retrieves a value that indicates the table alignment.\n     */\n    align: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLHeadingElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLHeadingElement: {\n    prototype: HTMLHeadingElement;\n    new(): HTMLHeadingElement;\n};\n\ninterface HTMLHRElement extends HTMLElement, DOML2DeprecatedColorProperty, DOML2DeprecatedSizeProperty {\n    /**\n     * Sets or retrieves how the object is aligned with adjacent text.\n     */\n    align: string;\n    /**\n     * Sets or retrieves whether the horizontal rule is drawn with 3-D shading.\n     */\n    noShade: boolean;\n    /**\n     * Sets or retrieves the width of the object.\n     */\n    width: number;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLHRElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLHRElement: {\n    prototype: HTMLHRElement;\n    new(): HTMLHRElement;\n};\n\ninterface HTMLHtmlElement extends HTMLElement {\n    /**\n     * Sets or retrieves the DTD version that governs the current document.\n     */\n    version: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLHtmlElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLHtmlElement: {\n    prototype: HTMLHtmlElement;\n    new(): HTMLHtmlElement;\n};\n\ninterface HTMLIFrameElementEventMap extends HTMLElementEventMap {\n    "load": Event;\n}\n\ninterface HTMLIFrameElement extends HTMLElement, GetSVGDocument {\n    /**\n     * Sets or retrieves how the object is aligned with adjacent text.\n     */\n    align: string;\n    allowFullscreen: boolean;\n    allowPaymentRequest: boolean;\n    /**\n     * Specifies the properties of a border drawn around an object.\n     */\n    border: string;\n    /**\n     * Retrieves the document object of the page or frame.\n     */\n    readonly contentDocument: Document;\n    /**\n     * Retrieves the object of the specified.\n     */\n    readonly contentWindow: Window;\n    /**\n     * Sets or retrieves whether to display a border for the frame.\n     */\n    frameBorder: string;\n    /**\n     * Sets or retrieves the amount of additional space between the frames.\n     */\n    frameSpacing: any;\n    /**\n     * Sets or retrieves the height of the object.\n     */\n    height: string;\n    /**\n     * Sets or retrieves the horizontal margin for the object.\n     */\n    hspace: number;\n    /**\n     * Sets or retrieves a URI to a long description of the object.\n     */\n    longDesc: string;\n    /**\n     * Sets or retrieves the top and bottom margin heights before displaying the text in a frame.\n     */\n    marginHeight: string;\n    /**\n     * Sets or retrieves the left and right margin widths before displaying the text in a frame.\n     */\n    marginWidth: string;\n    /**\n     * Sets or retrieves the frame name.\n     */\n    name: string;\n    /**\n     * Sets or retrieves whether the user can resize the frame.\n     */\n    noResize: boolean;\n    /**\n     * Raised when the object has been completely received from the server.\n     */\n    onload: (this: HTMLIFrameElement, ev: Event) => any;\n    readonly sandbox: DOMSettableTokenList;\n    /**\n     * Sets or retrieves whether the frame can be scrolled.\n     */\n    scrolling: string;\n    /**\n     * Sets or retrieves a URL to be loaded by the object.\n     */\n    src: string;\n    /**\n     * Sets or retrieves the vertical margin for the object.\n     */\n    vspace: number;\n    /**\n     * Sets or retrieves the width of the object.\n     */\n    width: string;\n    addEventListener<K extends keyof HTMLIFrameElementEventMap>(type: K, listener: (this: HTMLIFrameElement, ev: HTMLIFrameElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLIFrameElement: {\n    prototype: HTMLIFrameElement;\n    new(): HTMLIFrameElement;\n};\n\ninterface HTMLImageElement extends HTMLElement {\n    /**\n     * Sets or retrieves how the object is aligned with adjacent text.\n     */\n    align: string;\n    /**\n     * Sets or retrieves a text alternative to the graphic.\n     */\n    alt: string;\n    /**\n     * Specifies the properties of a border drawn around an object.\n     */\n    border: string;\n    /**\n     * Retrieves whether the object is fully loaded.\n     */\n    readonly complete: boolean;\n    crossOrigin: string | null;\n    readonly currentSrc: string;\n    /**\n     * Sets or retrieves the height of the object.\n     */\n    height: number;\n    /**\n     * Sets or retrieves the width of the border to draw around the object.\n     */\n    hspace: number;\n    /**\n     * Sets or retrieves whether the image is a server-side image map.\n     */\n    isMap: boolean;\n    /**\n     * Sets or retrieves a Uniform Resource Identifier (URI) to a long description of the object.\n     */\n    longDesc: string;\n    lowsrc: string;\n    /**\n     * Gets or sets whether the DLNA PlayTo device is available.\n     */\n    msPlayToDisabled: boolean;\n    msPlayToPreferredSourceUri: string;\n    /**\n     * Gets or sets the primary DLNA PlayTo device.\n     */\n    msPlayToPrimary: boolean;\n    /**\n     * Gets the source associated with the media element for use by the PlayToManager.\n     */\n    readonly msPlayToSource: any;\n    /**\n     * Sets or retrieves the name of the object.\n     */\n    name: string;\n    /**\n     * The original height of the image resource before sizing.\n     */\n    readonly naturalHeight: number;\n    /**\n     * The original width of the image resource before sizing.\n     */\n    readonly naturalWidth: number;\n    sizes: string;\n    /**\n     * The address or URL of the a media resource that is to be considered.\n     */\n    src: string;\n    srcset: string;\n    /**\n     * Sets or retrieves the URL, often with a bookmark extension (#name), to use as a client-side image map.\n     */\n    useMap: string;\n    /**\n     * Sets or retrieves the vertical margin for the object.\n     */\n    vspace: number;\n    /**\n     * Sets or retrieves the width of the object.\n     */\n    width: number;\n    readonly x: number;\n    readonly y: number;\n    msGetAsCastingSource(): any;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLImageElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLImageElement: {\n    prototype: HTMLImageElement;\n    new(): HTMLImageElement;\n};\n\ninterface HTMLInputElement extends HTMLElement {\n    /**\n     * Sets or retrieves a comma-separated list of content types.\n     */\n    accept: string;\n    /**\n     * Sets or retrieves how the object is aligned with adjacent text.\n     */\n    align: string;\n    /**\n     * Sets or retrieves a text alternative to the graphic.\n     */\n    alt: string;\n    /**\n     * Specifies whether autocomplete is applied to an editable text field.\n     */\n    autocomplete: string;\n    /**\n     * Provides a way to direct a user to a specific field when a document loads. This can provide both direction and convenience for a user, reducing the need to click or tab to a field when a page opens. This attribute is true when present on an element, and false when missing.\n     */\n    autofocus: boolean;\n    /**\n     * Sets or retrieves the width of the border to draw around the object.\n     */\n    border: string;\n    /**\n     * Sets or retrieves the state of the check box or radio button.\n     */\n    checked: boolean;\n    /**\n     * Retrieves whether the object is fully loaded.\n     */\n    readonly complete: boolean;\n    /**\n     * Sets or retrieves the state of the check box or radio button.\n     */\n    defaultChecked: boolean;\n    /**\n     * Sets or retrieves the initial contents of the object.\n     */\n    defaultValue: string;\n    disabled: boolean;\n    /**\n     * Returns a FileList object on a file type input object.\n     */\n    readonly files: FileList | null;\n    /**\n     * Retrieves a reference to the form that the object is embedded in.\n     */\n    readonly form: HTMLFormElement;\n    /**\n     * Overrides the action attribute (where the data on a form is sent) on the parent form element.\n     */\n    formAction: string;\n    /**\n     * Used to override the encoding (formEnctype attribute) specified on the form element.\n     */\n    formEnctype: string;\n    /**\n     * Overrides the submit method attribute previously specified on a form element.\n     */\n    formMethod: string;\n    /**\n     * Overrides any validation or required attributes on a form or form elements to allow it to be submitted without validation. This can be used to create a "save draft"-type submit option.\n     */\n    formNoValidate: string;\n    /**\n     * Overrides the target attribute on a form element.\n     */\n    formTarget: string;\n    /**\n     * Sets or retrieves the height of the object.\n     */\n    height: string;\n    /**\n     * Sets or retrieves the width of the border to draw around the object.\n     */\n    hspace: number;\n    indeterminate: boolean;\n    /**\n     * Specifies the ID of a pre-defined datalist of options for an input element.\n     */\n    readonly list: HTMLElement;\n    /**\n     * Defines the maximum acceptable value for an input element with type="number".When used with the min and step attributes, lets you control the range and increment (such as only even numbers) that the user can enter into an input field.\n     */\n    max: string;\n    /**\n     * Sets or retrieves the maximum number of characters that the user can enter in a text control.\n     */\n    maxLength: number;\n    /**\n     * Defines the minimum acceptable value for an input element with type="number". When used with the max and step attributes, lets you control the range and increment (such as even numbers only) that the user can enter into an input field.\n     */\n    min: string;\n    /**\n     * Sets or retrieves the Boolean value indicating whether multiple items can be selected from a list.\n     */\n    multiple: boolean;\n    /**\n     * Sets or retrieves the name of the object.\n     */\n    name: string;\n    /**\n     * Gets or sets a string containing a regular expression that the user\'s input must match.\n     */\n    pattern: string;\n    /**\n     * Gets or sets a text string that is displayed in an input field as a hint or prompt to users as the format or type of information they need to enter.The text appears in an input field until the user puts focus on the field.\n     */\n    placeholder: string;\n    readOnly: boolean;\n    /**\n     * When present, marks an element that can\'t be submitted without a value.\n     */\n    required: boolean;\n    selectionDirection: string;\n    /**\n     * Gets or sets the end position or offset of a text selection.\n     */\n    selectionEnd: number;\n    /**\n     * Gets or sets the starting position or offset of a text selection.\n     */\n    selectionStart: number;\n    size: number;\n    /**\n     * The address or URL of the a media resource that is to be considered.\n     */\n    src: string;\n    status: boolean;\n    /**\n     * Defines an increment or jump between values that you want to allow the user to enter. When used with the max and min attributes, lets you control the range and increment (for example, allow only even numbers) that the user can enter into an input field.\n     */\n    step: string;\n    /**\n     * Returns the content type of the object.\n     */\n    type: string;\n    /**\n     * Sets or retrieves the URL, often with a bookmark extension (#name), to use as a client-side image map.\n     */\n    useMap: string;\n    /**\n     * Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting.\n     */\n    readonly validationMessage: string;\n    /**\n     * Returns a  ValidityState object that represents the validity states of an element.\n     */\n    readonly validity: ValidityState;\n    /**\n     * Returns the value of the data at the cursor\'s current position.\n     */\n    value: string;\n    valueAsDate: Date;\n    /**\n     * Returns the input field value as a number.\n     */\n    valueAsNumber: number;\n    /**\n     * Sets or retrieves the vertical margin for the object.\n     */\n    vspace: number;\n    webkitdirectory: boolean;\n    /**\n     * Sets or retrieves the width of the object.\n     */\n    width: string;\n    /**\n     * Returns whether an element will successfully validate based on forms validation rules and constraints.\n     */\n    readonly willValidate: boolean;\n    minLength: number;\n    /**\n     * Returns whether a form will validate when it is submitted, without having to submit it.\n     */\n    checkValidity(): boolean;\n    /**\n     * Makes the selection equal to the current object.\n     */\n    select(): void;\n    /**\n     * Sets a custom error message that is displayed when a form is submitted.\n     * @param error Sets a custom error message that is displayed when a form is submitted.\n     */\n    setCustomValidity(error: string): void;\n    /**\n     * Sets the start and end positions of a selection in a text field.\n     * @param start The offset into the text field for the start of the selection.\n     * @param end The offset into the text field for the end of the selection.\n     */\n    setSelectionRange(start?: number, end?: number, direction?: string): void;\n    /**\n     * Decrements a range input control\'s value by the value given by the Step attribute. If the optional parameter is used, it will decrement the input control\'s step value multiplied by the parameter\'s value.\n     * @param n Value to decrement the value by.\n     */\n    stepDown(n?: number): void;\n    /**\n     * Increments a range input control\'s value by the value given by the Step attribute. If the optional parameter is used, will increment the input control\'s value by that value.\n     * @param n Value to increment the value by.\n     */\n    stepUp(n?: number): void;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLInputElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLInputElement: {\n    prototype: HTMLInputElement;\n    new(): HTMLInputElement;\n};\n\ninterface HTMLLabelElement extends HTMLElement {\n    /**\n     * Retrieves a reference to the form that the object is embedded in.\n     */\n    readonly form: HTMLFormElement;\n    /**\n     * Sets or retrieves the object to which the given label object is assigned.\n     */\n    htmlFor: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLLabelElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLLabelElement: {\n    prototype: HTMLLabelElement;\n    new(): HTMLLabelElement;\n};\n\ninterface HTMLLegendElement extends HTMLElement {\n    /**\n     * Retrieves a reference to the form that the object is embedded in.\n     */\n    align: string;\n    /**\n     * Retrieves a reference to the form that the object is embedded in.\n     */\n    readonly form: HTMLFormElement;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLLegendElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLLegendElement: {\n    prototype: HTMLLegendElement;\n    new(): HTMLLegendElement;\n};\n\ninterface HTMLLIElement extends HTMLElement {\n    type: string;\n    /**\n     * Sets or retrieves the value of a list item.\n     */\n    value: number;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLLIElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLLIElement: {\n    prototype: HTMLLIElement;\n    new(): HTMLLIElement;\n};\n\ninterface HTMLLinkElement extends HTMLElement, LinkStyle {\n    /**\n     * Sets or retrieves the character set used to encode the object.\n     */\n    charset: string;\n    disabled: boolean;\n    /**\n     * Sets or retrieves a destination URL or an anchor point.\n     */\n    href: string;\n    /**\n     * Sets or retrieves the language code of the object.\n     */\n    hreflang: string;\n    /**\n     * Sets or retrieves the media type.\n     */\n    media: string;\n    /**\n     * Sets or retrieves the relationship between the object and the destination of the link.\n     */\n    rel: string;\n    /**\n     * Sets or retrieves the relationship between the object and the destination of the link.\n     */\n    rev: string;\n    /**\n     * Sets or retrieves the window or frame at which to target content.\n     */\n    target: string;\n    /**\n     * Sets or retrieves the MIME type of the object.\n     */\n    type: string;\n    import?: Document;\n    integrity: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLLinkElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLLinkElement: {\n    prototype: HTMLLinkElement;\n    new(): HTMLLinkElement;\n};\n\ninterface HTMLMapElement extends HTMLElement {\n    /**\n     * Retrieves a collection of the area objects defined for the given map object.\n     */\n    readonly areas: HTMLAreasCollection;\n    /**\n     * Sets or retrieves the name of the object.\n     */\n    name: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLMapElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLMapElement: {\n    prototype: HTMLMapElement;\n    new(): HTMLMapElement;\n};\n\ninterface HTMLMarqueeElementEventMap extends HTMLElementEventMap {\n    "bounce": Event;\n    "finish": Event;\n    "start": Event;\n}\n\ninterface HTMLMarqueeElement extends HTMLElement {\n    behavior: string;\n    bgColor: any;\n    direction: string;\n    height: string;\n    hspace: number;\n    loop: number;\n    onbounce: (this: HTMLMarqueeElement, ev: Event) => any;\n    onfinish: (this: HTMLMarqueeElement, ev: Event) => any;\n    onstart: (this: HTMLMarqueeElement, ev: Event) => any;\n    scrollAmount: number;\n    scrollDelay: number;\n    trueSpeed: boolean;\n    vspace: number;\n    width: string;\n    start(): void;\n    stop(): void;\n    addEventListener<K extends keyof HTMLMarqueeElementEventMap>(type: K, listener: (this: HTMLMarqueeElement, ev: HTMLMarqueeElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLMarqueeElement: {\n    prototype: HTMLMarqueeElement;\n    new(): HTMLMarqueeElement;\n};\n\ninterface HTMLMediaElementEventMap extends HTMLElementEventMap {\n    "encrypted": MediaEncryptedEvent;\n    "msneedkey": MSMediaKeyNeededEvent;\n}\n\ninterface HTMLMediaElement extends HTMLElement {\n    /**\n     * Returns an AudioTrackList object with the audio tracks for a given video element.\n     */\n    readonly audioTracks: AudioTrackList;\n    /**\n     * Gets or sets a value that indicates whether to start playing the media automatically.\n     */\n    autoplay: boolean;\n    /**\n     * Gets a collection of buffered time ranges.\n     */\n    readonly buffered: TimeRanges;\n    /**\n     * Gets or sets a flag that indicates whether the client provides a set of controls for the media (in case the developer does not include controls for the player).\n     */\n    controls: boolean;\n    crossOrigin: string | null;\n    /**\n     * Gets the address or URL of the current media resource that is selected by IHTMLMediaElement.\n     */\n    readonly currentSrc: string;\n    /**\n     * Gets or sets the current playback position, in seconds.\n     */\n    currentTime: number;\n    defaultMuted: boolean;\n    /**\n     * Gets or sets the default playback rate when the user is not using fast forward or reverse for a video or audio resource.\n     */\n    defaultPlaybackRate: number;\n    /**\n     * Returns the duration in seconds of the current media resource. A NaN value is returned if duration is not available, or Infinity if the media resource is streaming.\n     */\n    readonly duration: number;\n    /**\n     * Gets information about whether the playback has ended or not.\n     */\n    readonly ended: boolean;\n    /**\n     * Returns an object representing the current error state of the audio or video element.\n     */\n    readonly error: MediaError;\n    /**\n     * Gets or sets a flag to specify whether playback should restart after it completes.\n     */\n    loop: boolean;\n    readonly mediaKeys: MediaKeys | null;\n    /**\n     * Specifies the purpose of the audio or video media, such as background audio or alerts.\n     */\n    msAudioCategory: string;\n    /**\n     * Specifies the output device id that the audio will be sent to.\n     */\n    msAudioDeviceType: string;\n    readonly msGraphicsTrustStatus: MSGraphicsTrust;\n    /**\n     * Gets the MSMediaKeys object, which is used for decrypting media data, that is associated with this media element.\n     */\n    readonly msKeys: MSMediaKeys;\n    /**\n     * Gets or sets whether the DLNA PlayTo device is available.\n     */\n    msPlayToDisabled: boolean;\n    /**\n     * Gets or sets the path to the preferred media source. This enables the Play To target device to stream the media content, which can be DRM protected, from a different location, such as a cloud media server.\n     */\n    msPlayToPreferredSourceUri: string;\n    /**\n     * Gets or sets the primary DLNA PlayTo device.\n     */\n    msPlayToPrimary: boolean;\n    /**\n     * Gets the source associated with the media element for use by the PlayToManager.\n     */\n    readonly msPlayToSource: any;\n    /**\n     * Specifies whether or not to enable low-latency playback on the media element.\n     */\n    msRealTime: boolean;\n    /**\n     * Gets or sets a flag that indicates whether the audio (either audio or the audio track on video media) is muted.\n     */\n    muted: boolean;\n    /**\n     * Gets the current network activity for the element.\n     */\n    readonly networkState: number;\n    onencrypted: (this: HTMLMediaElement, ev: MediaEncryptedEvent) => any;\n    onmsneedkey: (this: HTMLMediaElement, ev: MSMediaKeyNeededEvent) => any;\n    /**\n     * Gets a flag that specifies whether playback is paused.\n     */\n    readonly paused: boolean;\n    /**\n     * Gets or sets the current rate of speed for the media resource to play. This speed is expressed as a multiple of the normal speed of the media resource.\n     */\n    playbackRate: number;\n    /**\n     * Gets TimeRanges for the current media resource that has been played.\n     */\n    readonly played: TimeRanges;\n    /**\n     * Gets or sets the current playback position, in seconds.\n     */\n    preload: string;\n    readyState: number;\n    /**\n     * Returns a TimeRanges object that represents the ranges of the current media resource that can be seeked.\n     */\n    readonly seekable: TimeRanges;\n    /**\n     * Gets a flag that indicates whether the the client is currently moving to a new playback position in the media resource.\n     */\n    readonly seeking: boolean;\n    /**\n     * The address or URL of the a media resource that is to be considered.\n     */\n    src: string;\n    srcObject: MediaStream | null;\n    readonly textTracks: TextTrackList;\n    readonly videoTracks: VideoTrackList;\n    /**\n     * Gets or sets the volume level for audio portions of the media element.\n     */\n    volume: number;\n    addTextTrack(kind: string, label?: string, language?: string): TextTrack;\n    /**\n     * Returns a string that specifies whether the client can play a given media resource type.\n     */\n    canPlayType(type: string): string;\n    /**\n     * Resets the audio or video object and loads a new media resource.\n     */\n    load(): void;\n    /**\n     * Clears all effects from the media pipeline.\n     */\n    msClearEffects(): void;\n    msGetAsCastingSource(): any;\n    /**\n     * Inserts the specified audio effect into media pipeline.\n     */\n    msInsertAudioEffect(activatableClassId: string, effectRequired: boolean, config?: any): void;\n    msSetMediaKeys(mediaKeys: MSMediaKeys): void;\n    /**\n     * Specifies the media protection manager for a given media pipeline.\n     */\n    msSetMediaProtectionManager(mediaProtectionManager?: any): void;\n    /**\n     * Pauses the current playback and sets paused to TRUE. This can be used to test whether the media is playing or paused. You can also use the pause or play events to tell whether the media is playing or not.\n     */\n    pause(): void;\n    /**\n     * Loads and starts playback of a media resource.\n     */\n    play(): Promise<void>;\n    setMediaKeys(mediaKeys: MediaKeys | null): Promise<void>;\n    readonly HAVE_CURRENT_DATA: number;\n    readonly HAVE_ENOUGH_DATA: number;\n    readonly HAVE_FUTURE_DATA: number;\n    readonly HAVE_METADATA: number;\n    readonly HAVE_NOTHING: number;\n    readonly NETWORK_EMPTY: number;\n    readonly NETWORK_IDLE: number;\n    readonly NETWORK_LOADING: number;\n    readonly NETWORK_NO_SOURCE: number;\n    addEventListener<K extends keyof HTMLMediaElementEventMap>(type: K, listener: (this: HTMLMediaElement, ev: HTMLMediaElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLMediaElement: {\n    prototype: HTMLMediaElement;\n    new(): HTMLMediaElement;\n    readonly HAVE_CURRENT_DATA: number;\n    readonly HAVE_ENOUGH_DATA: number;\n    readonly HAVE_FUTURE_DATA: number;\n    readonly HAVE_METADATA: number;\n    readonly HAVE_NOTHING: number;\n    readonly NETWORK_EMPTY: number;\n    readonly NETWORK_IDLE: number;\n    readonly NETWORK_LOADING: number;\n    readonly NETWORK_NO_SOURCE: number;\n};\n\ninterface HTMLMenuElement extends HTMLElement {\n    compact: boolean;\n    type: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLMenuElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLMenuElement: {\n    prototype: HTMLMenuElement;\n    new(): HTMLMenuElement;\n};\n\ninterface HTMLMetaElement extends HTMLElement {\n    /**\n     * Sets or retrieves the character set used to encode the object.\n     */\n    charset: string;\n    /**\n     * Gets or sets meta-information to associate with httpEquiv or name.\n     */\n    content: string;\n    /**\n     * Gets or sets information used to bind the value of a content attribute of a meta element to an HTTP response header.\n     */\n    httpEquiv: string;\n    /**\n     * Sets or retrieves the value specified in the content attribute of the meta object.\n     */\n    name: string;\n    /**\n     * Sets or retrieves a scheme to be used in interpreting the value of a property specified for the object.\n     */\n    scheme: string;\n    /**\n     * Sets or retrieves the URL property that will be loaded after the specified time has elapsed.\n     */\n    url: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLMetaElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLMetaElement: {\n    prototype: HTMLMetaElement;\n    new(): HTMLMetaElement;\n};\n\ninterface HTMLMeterElement extends HTMLElement {\n    high: number;\n    low: number;\n    max: number;\n    min: number;\n    optimum: number;\n    value: number;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLMeterElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLMeterElement: {\n    prototype: HTMLMeterElement;\n    new(): HTMLMeterElement;\n};\n\ninterface HTMLModElement extends HTMLElement {\n    /**\n     * Sets or retrieves reference information about the object.\n     */\n    cite: string;\n    /**\n     * Sets or retrieves the date and time of a modification to the object.\n     */\n    dateTime: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLModElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLModElement: {\n    prototype: HTMLModElement;\n    new(): HTMLModElement;\n};\n\ninterface HTMLObjectElement extends HTMLElement, GetSVGDocument {\n    align: string;\n    /**\n     * Sets or retrieves a text alternative to the graphic.\n     */\n    alt: string;\n    /**\n     * Gets or sets the optional alternative HTML script to execute if the object fails to load.\n     */\n    altHtml: string;\n    /**\n     * Sets or retrieves a character string that can be used to implement your own archive functionality for the object.\n     */\n    archive: string;\n    /**\n     * Retrieves a string of the URL where the object tag can be found. This is often the href of the document that the object is in, or the value set by a base element.\n     */\n    readonly BaseHref: string;\n    border: string;\n    /**\n     * Sets or retrieves the URL of the file containing the compiled Java class.\n     */\n    code: string;\n    /**\n     * Sets or retrieves the URL of the component.\n     */\n    codeBase: string;\n    /**\n     * Sets or retrieves the Internet media type for the code associated with the object.\n     */\n    codeType: string;\n    /**\n     * Retrieves the document object of the page or frame.\n     */\n    readonly contentDocument: Document;\n    /**\n     * Sets or retrieves the URL that references the data of the object.\n     */\n    data: string;\n    declare: boolean;\n    /**\n     * Retrieves a reference to the form that the object is embedded in.\n     */\n    readonly form: HTMLFormElement;\n    /**\n     * Sets or retrieves the height of the object.\n     */\n    height: string;\n    hspace: number;\n    /**\n     * Gets or sets whether the DLNA PlayTo device is available.\n     */\n    msPlayToDisabled: boolean;\n    /**\n     * Gets or sets the path to the preferred media source. This enables the Play To target device to stream the media content, which can be DRM protected, from a different location, such as a cloud media server.\n     */\n    msPlayToPreferredSourceUri: string;\n    /**\n     * Gets or sets the primary DLNA PlayTo device.\n     */\n    msPlayToPrimary: boolean;\n    /**\n     * Gets the source associated with the media element for use by the PlayToManager.\n     */\n    readonly msPlayToSource: any;\n    /**\n     * Sets or retrieves the name of the object.\n     */\n    name: string;\n    readonly readyState: number;\n    /**\n     * Sets or retrieves a message to be displayed while an object is loading.\n     */\n    standby: string;\n    /**\n     * Sets or retrieves the MIME type of the object.\n     */\n    type: string;\n    /**\n     * Sets or retrieves the URL, often with a bookmark extension (#name), to use as a client-side image map.\n     */\n    useMap: string;\n    /**\n     * Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting.\n     */\n    readonly validationMessage: string;\n    /**\n     * Returns a  ValidityState object that represents the validity states of an element.\n     */\n    readonly validity: ValidityState;\n    vspace: number;\n    /**\n     * Sets or retrieves the width of the object.\n     */\n    width: string;\n    /**\n     * Returns whether an element will successfully validate based on forms validation rules and constraints.\n     */\n    readonly willValidate: boolean;\n    /**\n     * Returns whether a form will validate when it is submitted, without having to submit it.\n     */\n    checkValidity(): boolean;\n    /**\n     * Sets a custom error message that is displayed when a form is submitted.\n     * @param error Sets a custom error message that is displayed when a form is submitted.\n     */\n    setCustomValidity(error: string): void;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLObjectElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLObjectElement: {\n    prototype: HTMLObjectElement;\n    new(): HTMLObjectElement;\n};\n\ninterface HTMLOListElement extends HTMLElement {\n    compact: boolean;\n    /**\n     * The starting number.\n     */\n    start: number;\n    type: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLOListElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLOListElement: {\n    prototype: HTMLOListElement;\n    new(): HTMLOListElement;\n};\n\ninterface HTMLOptGroupElement extends HTMLElement {\n    /**\n     * Sets or retrieves the status of an option.\n     */\n    defaultSelected: boolean;\n    disabled: boolean;\n    /**\n     * Retrieves a reference to the form that the object is embedded in.\n     */\n    readonly form: HTMLFormElement;\n    /**\n     * Sets or retrieves the ordinal position of an option in a list box.\n     */\n    readonly index: number;\n    /**\n     * Sets or retrieves a value that you can use to implement your own label functionality for the object.\n     */\n    label: string;\n    /**\n     * Sets or retrieves whether the option in the list box is the default item.\n     */\n    selected: boolean;\n    /**\n     * Sets or retrieves the text string specified by the option tag.\n     */\n    readonly text: string;\n    /**\n     * Sets or retrieves the value which is returned to the server when the form control is submitted.\n     */\n    value: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLOptGroupElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLOptGroupElement: {\n    prototype: HTMLOptGroupElement;\n    new(): HTMLOptGroupElement;\n};\n\ninterface HTMLOptionElement extends HTMLElement {\n    /**\n     * Sets or retrieves the status of an option.\n     */\n    defaultSelected: boolean;\n    disabled: boolean;\n    /**\n     * Retrieves a reference to the form that the object is embedded in.\n     */\n    readonly form: HTMLFormElement;\n    /**\n     * Sets or retrieves the ordinal position of an option in a list box.\n     */\n    readonly index: number;\n    /**\n     * Sets or retrieves a value that you can use to implement your own label functionality for the object.\n     */\n    label: string;\n    /**\n     * Sets or retrieves whether the option in the list box is the default item.\n     */\n    selected: boolean;\n    /**\n     * Sets or retrieves the text string specified by the option tag.\n     */\n    text: string;\n    /**\n     * Sets or retrieves the value which is returned to the server when the form control is submitted.\n     */\n    value: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLOptionElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLOptionElement: {\n    prototype: HTMLOptionElement;\n    new(): HTMLOptionElement;\n};\n\ninterface HTMLOptionsCollection extends HTMLCollectionOf<HTMLOptionElement> {\n    length: number;\n    selectedIndex: number;\n    add(element: HTMLOptionElement | HTMLOptGroupElement, before?: HTMLElement | number): void;\n    remove(index: number): void;\n}\n\ndeclare var HTMLOptionsCollection: {\n    prototype: HTMLOptionsCollection;\n    new(): HTMLOptionsCollection;\n};\n\ninterface HTMLOutputElement extends HTMLElement {\n    defaultValue: string;\n    readonly form: HTMLFormElement;\n    readonly htmlFor: DOMSettableTokenList;\n    name: string;\n    readonly type: string;\n    readonly validationMessage: string;\n    readonly validity: ValidityState;\n    value: string;\n    readonly willValidate: boolean;\n    checkValidity(): boolean;\n    reportValidity(): boolean;\n    setCustomValidity(error: string): void;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLOutputElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLOutputElement: {\n    prototype: HTMLOutputElement;\n    new(): HTMLOutputElement;\n};\n\ninterface HTMLParagraphElement extends HTMLElement {\n    /**\n     * Sets or retrieves how the object is aligned with adjacent text.\n     */\n    align: string;\n    clear: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLParagraphElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLParagraphElement: {\n    prototype: HTMLParagraphElement;\n    new(): HTMLParagraphElement;\n};\n\ninterface HTMLParamElement extends HTMLElement {\n    /**\n     * Sets or retrieves the name of an input parameter for an element.\n     */\n    name: string;\n    /**\n     * Sets or retrieves the content type of the resource designated by the value attribute.\n     */\n    type: string;\n    /**\n     * Sets or retrieves the value of an input parameter for an element.\n     */\n    value: string;\n    /**\n     * Sets or retrieves the data type of the value attribute.\n     */\n    valueType: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLParamElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLParamElement: {\n    prototype: HTMLParamElement;\n    new(): HTMLParamElement;\n};\n\ninterface HTMLPictureElement extends HTMLElement {\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLPictureElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLPictureElement: {\n    prototype: HTMLPictureElement;\n    new(): HTMLPictureElement;\n};\n\ninterface HTMLPreElement extends HTMLElement {\n    /**\n     * Sets or gets a value that you can use to implement your own width functionality for the object.\n     */\n    width: number;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLPreElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLPreElement: {\n    prototype: HTMLPreElement;\n    new(): HTMLPreElement;\n};\n\ninterface HTMLProgressElement extends HTMLElement {\n    /**\n     * Retrieves a reference to the form that the object is embedded in.\n     */\n    readonly form: HTMLFormElement;\n    /**\n     * Defines the maximum, or "done" value for a progress element.\n     */\n    max: number;\n    /**\n     * Returns the quotient of value/max when the value attribute is set (determinate progress bar), or -1 when the value attribute is missing (indeterminate progress bar).\n     */\n    readonly position: number;\n    /**\n     * Sets or gets the current value of a progress element. The value must be a non-negative number between 0 and the max value.\n     */\n    value: number;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLProgressElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLProgressElement: {\n    prototype: HTMLProgressElement;\n    new(): HTMLProgressElement;\n};\n\ninterface HTMLQuoteElement extends HTMLElement {\n    /**\n     * Sets or retrieves reference information about the object.\n     */\n    cite: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLQuoteElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLQuoteElement: {\n    prototype: HTMLQuoteElement;\n    new(): HTMLQuoteElement;\n};\n\ninterface HTMLScriptElement extends HTMLElement {\n    async: boolean;\n    /**\n     * Sets or retrieves the character set used to encode the object.\n     */\n    charset: string;\n    crossOrigin: string | null;\n    /**\n     * Sets or retrieves the status of the script.\n     */\n    defer: boolean;\n    /**\n     * Sets or retrieves the event for which the script is written.\n     */\n    event: string;\n    /**\n     * Sets or retrieves the object that is bound to the event script.\n     */\n    htmlFor: string;\n    /**\n     * Retrieves the URL to an external file that contains the source code or data.\n     */\n    src: string;\n    /**\n     * Retrieves or sets the text of the object as a string.\n     */\n    text: string;\n    /**\n     * Sets or retrieves the MIME type for the associated scripting engine.\n     */\n    type: string;\n    integrity: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLScriptElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLScriptElement: {\n    prototype: HTMLScriptElement;\n    new(): HTMLScriptElement;\n};\n\ninterface HTMLSelectElement extends HTMLElement {\n    /**\n     * Provides a way to direct a user to a specific field when a document loads. This can provide both direction and convenience for a user, reducing the need to click or tab to a field when a page opens. This attribute is true when present on an element, and false when missing.\n     */\n    autofocus: boolean;\n    disabled: boolean;\n    /**\n     * Retrieves a reference to the form that the object is embedded in.\n     */\n    readonly form: HTMLFormElement;\n    /**\n     * Sets or retrieves the number of objects in a collection.\n     */\n    length: number;\n    /**\n     * Sets or retrieves the Boolean value indicating whether multiple items can be selected from a list.\n     */\n    multiple: boolean;\n    /**\n     * Sets or retrieves the name of the object.\n     */\n    name: string;\n    readonly options: HTMLOptionsCollection;\n    /**\n     * When present, marks an element that can\'t be submitted without a value.\n     */\n    required: boolean;\n    /**\n     * Sets or retrieves the index of the selected option in a select object.\n     */\n    selectedIndex: number;\n    selectedOptions: HTMLCollectionOf<HTMLOptionElement>;\n    /**\n     * Sets or retrieves the number of rows in the list box.\n     */\n    size: number;\n    /**\n     * Retrieves the type of select control based on the value of the MULTIPLE attribute.\n     */\n    readonly type: string;\n    /**\n     * Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting.\n     */\n    readonly validationMessage: string;\n    /**\n     * Returns a  ValidityState object that represents the validity states of an element.\n     */\n    readonly validity: ValidityState;\n    /**\n     * Sets or retrieves the value which is returned to the server when the form control is submitted.\n     */\n    value: string;\n    /**\n     * Returns whether an element will successfully validate based on forms validation rules and constraints.\n     */\n    readonly willValidate: boolean;\n    /**\n     * Adds an element to the areas, controlRange, or options collection.\n     * @param element Variant of type Number that specifies the index position in the collection where the element is placed. If no value is given, the method places the element at the end of the collection.\n     * @param before Variant of type Object that specifies an element to insert before, or null to append the object to the collection.\n     */\n    add(element: HTMLElement, before?: HTMLElement | number): void;\n    /**\n     * Returns whether a form will validate when it is submitted, without having to submit it.\n     */\n    checkValidity(): boolean;\n    /**\n     * Retrieves a select object or an object from an options collection.\n     * @param name Variant of type Number or String that specifies the object or collection to retrieve. If this parameter is an integer, it is the zero-based index of the object. If this parameter is a string, all objects with matching name or id properties are retrieved, and a collection is returned if more than one match is made.\n     * @param index Variant of type Number that specifies the zero-based index of the object to retrieve when a collection is returned.\n     */\n    item(name?: any, index?: any): any;\n    /**\n     * Retrieves a select object or an object from an options collection.\n     * @param namedItem A String that specifies the name or id property of the object to retrieve. A collection is returned if more than one match is made.\n     */\n    namedItem(name: string): any;\n    /**\n     * Removes an element from the collection.\n     * @param index Number that specifies the zero-based index of the element to remove from the collection.\n     */\n    remove(index?: number): void;\n    /**\n     * Sets a custom error message that is displayed when a form is submitted.\n     * @param error Sets a custom error message that is displayed when a form is submitted.\n     */\n    setCustomValidity(error: string): void;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLSelectElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n    [name: string]: any;\n}\n\ndeclare var HTMLSelectElement: {\n    prototype: HTMLSelectElement;\n    new(): HTMLSelectElement;\n};\n\ninterface HTMLSourceElement extends HTMLElement {\n    /**\n     * Gets or sets the intended media type of the media source.\n     */\n    media: string;\n    msKeySystem: string;\n    sizes: string;\n    /**\n     * The address or URL of the a media resource that is to be considered.\n     */\n    src: string;\n    srcset: string;\n    /**\n     * Gets or sets the MIME type of a media resource.\n     */\n    type: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLSourceElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLSourceElement: {\n    prototype: HTMLSourceElement;\n    new(): HTMLSourceElement;\n};\n\ninterface HTMLSpanElement extends HTMLElement {\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLSpanElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLSpanElement: {\n    prototype: HTMLSpanElement;\n    new(): HTMLSpanElement;\n};\n\ninterface HTMLStyleElement extends HTMLElement, LinkStyle {\n    disabled: boolean;\n    /**\n     * Sets or retrieves the media type.\n     */\n    media: string;\n    /**\n     * Retrieves the CSS language in which the style sheet is written.\n     */\n    type: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLStyleElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLStyleElement: {\n    prototype: HTMLStyleElement;\n    new(): HTMLStyleElement;\n};\n\ninterface HTMLTableCaptionElement extends HTMLElement {\n    /**\n     * Sets or retrieves the alignment of the caption or legend.\n     */\n    align: string;\n    /**\n     * Sets or retrieves whether the caption appears at the top or bottom of the table.\n     */\n    vAlign: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableCaptionElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLTableCaptionElement: {\n    prototype: HTMLTableCaptionElement;\n    new(): HTMLTableCaptionElement;\n};\n\ninterface HTMLTableCellElement extends HTMLElement, HTMLTableAlignment {\n    /**\n     * Sets or retrieves abbreviated text for the object.\n     */\n    abbr: string;\n    /**\n     * Sets or retrieves how the object is aligned with adjacent text.\n     */\n    align: string;\n    /**\n     * Sets or retrieves a comma-delimited list of conceptual categories associated with the object.\n     */\n    axis: string;\n    bgColor: any;\n    /**\n     * Retrieves the position of the object in the cells collection of a row.\n     */\n    readonly cellIndex: number;\n    /**\n     * Sets or retrieves the number columns in the table that the object should span.\n     */\n    colSpan: number;\n    /**\n     * Sets or retrieves a list of header cells that provide information for the object.\n     */\n    headers: string;\n    /**\n     * Sets or retrieves the height of the object.\n     */\n    height: any;\n    /**\n     * Sets or retrieves whether the browser automatically performs wordwrap.\n     */\n    noWrap: boolean;\n    /**\n     * Sets or retrieves how many rows in a table the cell should span.\n     */\n    rowSpan: number;\n    /**\n     * Sets or retrieves the group of cells in a table to which the object\'s information applies.\n     */\n    scope: string;\n    /**\n     * Sets or retrieves the width of the object.\n     */\n    width: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableCellElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLTableCellElement: {\n    prototype: HTMLTableCellElement;\n    new(): HTMLTableCellElement;\n};\n\ninterface HTMLTableColElement extends HTMLElement, HTMLTableAlignment {\n    /**\n     * Sets or retrieves the alignment of the object relative to the display or table.\n     */\n    align: string;\n    /**\n     * Sets or retrieves the number of columns in the group.\n     */\n    span: number;\n    /**\n     * Sets or retrieves the width of the object.\n     */\n    width: any;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableColElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLTableColElement: {\n    prototype: HTMLTableColElement;\n    new(): HTMLTableColElement;\n};\n\ninterface HTMLTableDataCellElement extends HTMLTableCellElement {\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableDataCellElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLTableDataCellElement: {\n    prototype: HTMLTableDataCellElement;\n    new(): HTMLTableDataCellElement;\n};\n\ninterface HTMLTableElement extends HTMLElement {\n    /**\n     * Sets or retrieves a value that indicates the table alignment.\n     */\n    align: string;\n    bgColor: any;\n    /**\n     * Sets or retrieves the width of the border to draw around the object.\n     */\n    border: string;\n    /**\n     * Sets or retrieves the border color of the object.\n     */\n    borderColor: any;\n    /**\n     * Retrieves the caption object of a table.\n     */\n    caption: HTMLTableCaptionElement;\n    /**\n     * Sets or retrieves the amount of space between the border of the cell and the content of the cell.\n     */\n    cellPadding: string;\n    /**\n     * Sets or retrieves the amount of space between cells in a table.\n     */\n    cellSpacing: string;\n    /**\n     * Sets or retrieves the number of columns in the table.\n     */\n    cols: number;\n    /**\n     * Sets or retrieves the way the border frame around the table is displayed.\n     */\n    frame: string;\n    /**\n     * Sets or retrieves the height of the object.\n     */\n    height: any;\n    /**\n     * Sets or retrieves the number of horizontal rows contained in the object.\n     */\n    rows: HTMLCollectionOf<HTMLTableRowElement>;\n    /**\n     * Sets or retrieves which dividing lines (inner borders) are displayed.\n     */\n    rules: string;\n    /**\n     * Sets or retrieves a description and/or structure of the object.\n     */\n    summary: string;\n    /**\n     * Retrieves a collection of all tBody objects in the table. Objects in this collection are in source order.\n     */\n    tBodies: HTMLCollectionOf<HTMLTableSectionElement>;\n    /**\n     * Retrieves the tFoot object of the table.\n     */\n    tFoot: HTMLTableSectionElement;\n    /**\n     * Retrieves the tHead object of the table.\n     */\n    tHead: HTMLTableSectionElement;\n    /**\n     * Sets or retrieves the width of the object.\n     */\n    width: string;\n    /**\n     * Creates an empty caption element in the table.\n     */\n    createCaption(): HTMLTableCaptionElement;\n    /**\n     * Creates an empty tBody element in the table.\n     */\n    createTBody(): HTMLTableSectionElement;\n    /**\n     * Creates an empty tFoot element in the table.\n     */\n    createTFoot(): HTMLTableSectionElement;\n    /**\n     * Returns the tHead element object if successful, or null otherwise.\n     */\n    createTHead(): HTMLTableSectionElement;\n    /**\n     * Deletes the caption element and its contents from the table.\n     */\n    deleteCaption(): void;\n    /**\n     * Removes the specified row (tr) from the element and from the rows collection.\n     * @param index Number that specifies the zero-based position in the rows collection of the row to remove.\n     */\n    deleteRow(index?: number): void;\n    /**\n     * Deletes the tFoot element and its contents from the table.\n     */\n    deleteTFoot(): void;\n    /**\n     * Deletes the tHead element and its contents from the table.\n     */\n    deleteTHead(): void;\n    /**\n     * Creates a new row (tr) in the table, and adds the row to the rows collection.\n     * @param index Number that specifies where to insert the row in the rows collection. The default value is -1, which appends the new row to the end of the rows collection.\n     */\n    insertRow(index?: number): HTMLTableRowElement;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLTableElement: {\n    prototype: HTMLTableElement;\n    new(): HTMLTableElement;\n};\n\ninterface HTMLTableHeaderCellElement extends HTMLTableCellElement {\n    /**\n     * Sets or retrieves the group of cells in a table to which the object\'s information applies.\n     */\n    scope: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableHeaderCellElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLTableHeaderCellElement: {\n    prototype: HTMLTableHeaderCellElement;\n    new(): HTMLTableHeaderCellElement;\n};\n\ninterface HTMLTableRowElement extends HTMLElement, HTMLTableAlignment {\n    /**\n     * Sets or retrieves how the object is aligned with adjacent text.\n     */\n    align: string;\n    bgColor: any;\n    /**\n     * Retrieves a collection of all cells in the table row.\n     */\n    cells: HTMLCollectionOf<HTMLTableDataCellElement | HTMLTableHeaderCellElement>;\n    /**\n     * Sets or retrieves the height of the object.\n     */\n    height: any;\n    /**\n     * Retrieves the position of the object in the rows collection for the table.\n     */\n    readonly rowIndex: number;\n    /**\n     * Retrieves the position of the object in the collection.\n     */\n    readonly sectionRowIndex: number;\n    /**\n     * Removes the specified cell from the table row, as well as from the cells collection.\n     * @param index Number that specifies the zero-based position of the cell to remove from the table row. If no value is provided, the last cell in the cells collection is deleted.\n     */\n    deleteCell(index?: number): void;\n    /**\n     * Creates a new cell in the table row, and adds the cell to the cells collection.\n     * @param index Number that specifies where to insert the cell in the tr. The default value is -1, which appends the new cell to the end of the cells collection.\n     */\n    insertCell(index?: number): HTMLTableDataCellElement;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableRowElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLTableRowElement: {\n    prototype: HTMLTableRowElement;\n    new(): HTMLTableRowElement;\n};\n\ninterface HTMLTableSectionElement extends HTMLElement, HTMLTableAlignment {\n    /**\n     * Sets or retrieves a value that indicates the table alignment.\n     */\n    align: string;\n    /**\n     * Sets or retrieves the number of horizontal rows contained in the object.\n     */\n    rows: HTMLCollectionOf<HTMLTableRowElement>;\n    /**\n     * Removes the specified row (tr) from the element and from the rows collection.\n     * @param index Number that specifies the zero-based position in the rows collection of the row to remove.\n     */\n    deleteRow(index?: number): void;\n    /**\n     * Creates a new row (tr) in the table, and adds the row to the rows collection.\n     * @param index Number that specifies where to insert the row in the rows collection. The default value is -1, which appends the new row to the end of the rows collection.\n     */\n    insertRow(index?: number): HTMLTableRowElement;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableSectionElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLTableSectionElement: {\n    prototype: HTMLTableSectionElement;\n    new(): HTMLTableSectionElement;\n};\n\ninterface HTMLTemplateElement extends HTMLElement {\n    readonly content: DocumentFragment;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTemplateElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLTemplateElement: {\n    prototype: HTMLTemplateElement;\n    new(): HTMLTemplateElement;\n};\n\ninterface HTMLTextAreaElement extends HTMLElement {\n    /**\n     * Provides a way to direct a user to a specific field when a document loads. This can provide both direction and convenience for a user, reducing the need to click or tab to a field when a page opens. This attribute is true when present on an element, and false when missing.\n     */\n    autofocus: boolean;\n    /**\n     * Sets or retrieves the width of the object.\n     */\n    cols: number;\n    /**\n     * Sets or retrieves the initial contents of the object.\n     */\n    defaultValue: string;\n    disabled: boolean;\n    /**\n     * Retrieves a reference to the form that the object is embedded in.\n     */\n    readonly form: HTMLFormElement;\n    /**\n     * Sets or retrieves the maximum number of characters that the user can enter in a text control.\n     */\n    maxLength: number;\n    /**\n     * Sets or retrieves the name of the object.\n     */\n    name: string;\n    /**\n     * Gets or sets a text string that is displayed in an input field as a hint or prompt to users as the format or type of information they need to enter.The text appears in an input field until the user puts focus on the field.\n     */\n    placeholder: string;\n    /**\n     * Sets or retrieves the value indicated whether the content of the object is read-only.\n     */\n    readOnly: boolean;\n    /**\n     * When present, marks an element that can\'t be submitted without a value.\n     */\n    required: boolean;\n    /**\n     * Sets or retrieves the number of horizontal rows contained in the object.\n     */\n    rows: number;\n    /**\n     * Gets or sets the end position or offset of a text selection.\n     */\n    selectionEnd: number;\n    /**\n     * Gets or sets the starting position or offset of a text selection.\n     */\n    selectionStart: number;\n    /**\n     * Sets or retrieves the value indicating whether the control is selected.\n     */\n    status: any;\n    /**\n     * Retrieves the type of control.\n     */\n    readonly type: string;\n    /**\n     * Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting.\n     */\n    readonly validationMessage: string;\n    /**\n     * Returns a  ValidityState object that represents the validity states of an element.\n     */\n    readonly validity: ValidityState;\n    /**\n     * Retrieves or sets the text in the entry field of the textArea element.\n     */\n    value: string;\n    /**\n     * Returns whether an element will successfully validate based on forms validation rules and constraints.\n     */\n    readonly willValidate: boolean;\n    /**\n     * Sets or retrieves how to handle wordwrapping in the object.\n     */\n    wrap: string;\n    minLength: number;\n    /**\n     * Returns whether a form will validate when it is submitted, without having to submit it.\n     */\n    checkValidity(): boolean;\n    /**\n     * Highlights the input area of a form element.\n     */\n    select(): void;\n    /**\n     * Sets a custom error message that is displayed when a form is submitted.\n     * @param error Sets a custom error message that is displayed when a form is submitted.\n     */\n    setCustomValidity(error: string): void;\n    /**\n     * Sets the start and end positions of a selection in a text field.\n     * @param start The offset into the text field for the start of the selection.\n     * @param end The offset into the text field for the end of the selection.\n     */\n    setSelectionRange(start: number, end: number): void;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTextAreaElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLTextAreaElement: {\n    prototype: HTMLTextAreaElement;\n    new(): HTMLTextAreaElement;\n};\n\ninterface HTMLTimeElement extends HTMLElement {\n    dateTime: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTimeElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLTimeElement: {\n    prototype: HTMLTimeElement;\n    new(): HTMLTimeElement;\n};\n\ninterface HTMLTitleElement extends HTMLElement {\n    /**\n     * Retrieves or sets the text of the object as a string.\n     */\n    text: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTitleElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLTitleElement: {\n    prototype: HTMLTitleElement;\n    new(): HTMLTitleElement;\n};\n\ninterface HTMLTrackElement extends HTMLElement {\n    default: boolean;\n    kind: string;\n    label: string;\n    readonly readyState: number;\n    src: string;\n    srclang: string;\n    readonly track: TextTrack;\n    readonly ERROR: number;\n    readonly LOADED: number;\n    readonly LOADING: number;\n    readonly NONE: number;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTrackElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLTrackElement: {\n    prototype: HTMLTrackElement;\n    new(): HTMLTrackElement;\n    readonly ERROR: number;\n    readonly LOADED: number;\n    readonly LOADING: number;\n    readonly NONE: number;\n};\n\ninterface HTMLUListElement extends HTMLElement {\n    compact: boolean;\n    type: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLUListElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLUListElement: {\n    prototype: HTMLUListElement;\n    new(): HTMLUListElement;\n};\n\ninterface HTMLUnknownElement extends HTMLElement {\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLUnknownElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLUnknownElement: {\n    prototype: HTMLUnknownElement;\n    new(): HTMLUnknownElement;\n};\n\ninterface HTMLVideoElementEventMap extends HTMLMediaElementEventMap {\n    "MSVideoFormatChanged": Event;\n    "MSVideoFrameStepCompleted": Event;\n    "MSVideoOptimalLayoutChanged": Event;\n}\n\ninterface HTMLVideoElement extends HTMLMediaElement {\n    /**\n     * Gets or sets the height of the video element.\n     */\n    height: number;\n    msHorizontalMirror: boolean;\n    readonly msIsLayoutOptimalForPlayback: boolean;\n    readonly msIsStereo3D: boolean;\n    msStereo3DPackingMode: string;\n    msStereo3DRenderMode: string;\n    msZoom: boolean;\n    onMSVideoFormatChanged: (this: HTMLVideoElement, ev: Event) => any;\n    onMSVideoFrameStepCompleted: (this: HTMLVideoElement, ev: Event) => any;\n    onMSVideoOptimalLayoutChanged: (this: HTMLVideoElement, ev: Event) => any;\n    /**\n     * Gets or sets a URL of an image to display, for example, like a movie poster. This can be a still frame from the video, or another image if no video data is available.\n     */\n    poster: string;\n    /**\n     * Gets the intrinsic height of a video in CSS pixels, or zero if the dimensions are not known.\n     */\n    readonly videoHeight: number;\n    /**\n     * Gets the intrinsic width of a video in CSS pixels, or zero if the dimensions are not known.\n     */\n    readonly videoWidth: number;\n    readonly webkitDisplayingFullscreen: boolean;\n    readonly webkitSupportsFullscreen: boolean;\n    /**\n     * Gets or sets the width of the video element.\n     */\n    width: number;\n    getVideoPlaybackQuality(): VideoPlaybackQuality;\n    msFrameStep(forward: boolean): void;\n    msInsertVideoEffect(activatableClassId: string, effectRequired: boolean, config?: any): void;\n    msSetVideoRectangle(left: number, top: number, right: number, bottom: number): void;\n    webkitEnterFullscreen(): void;\n    webkitEnterFullScreen(): void;\n    webkitExitFullscreen(): void;\n    webkitExitFullScreen(): void;\n    addEventListener<K extends keyof HTMLVideoElementEventMap>(type: K, listener: (this: HTMLVideoElement, ev: HTMLVideoElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLVideoElement: {\n    prototype: HTMLVideoElement;\n    new(): HTMLVideoElement;\n};\n\ninterface IDBCursor {\n    readonly direction: IDBCursorDirection;\n    key: IDBKeyRange | IDBValidKey;\n    readonly primaryKey: any;\n    source: IDBObjectStore | IDBIndex;\n    advance(count: number): void;\n    continue(key?: IDBKeyRange | IDBValidKey): void;\n    delete(): IDBRequest;\n    update(value: any): IDBRequest;\n    readonly NEXT: string;\n    readonly NEXT_NO_DUPLICATE: string;\n    readonly PREV: string;\n    readonly PREV_NO_DUPLICATE: string;\n}\n\ndeclare var IDBCursor: {\n    prototype: IDBCursor;\n    new(): IDBCursor;\n    readonly NEXT: string;\n    readonly NEXT_NO_DUPLICATE: string;\n    readonly PREV: string;\n    readonly PREV_NO_DUPLICATE: string;\n};\n\ninterface IDBCursorWithValue extends IDBCursor {\n    readonly value: any;\n}\n\ndeclare var IDBCursorWithValue: {\n    prototype: IDBCursorWithValue;\n    new(): IDBCursorWithValue;\n};\n\ninterface IDBDatabaseEventMap {\n    "abort": Event;\n    "error": Event;\n}\n\ninterface IDBDatabase extends EventTarget {\n    readonly name: string;\n    readonly objectStoreNames: DOMStringList;\n    onabort: (this: IDBDatabase, ev: Event) => any;\n    onerror: (this: IDBDatabase, ev: Event) => any;\n    version: number;\n    onversionchange: (ev: IDBVersionChangeEvent) => any;\n    close(): void;\n    createObjectStore(name: string, optionalParameters?: IDBObjectStoreParameters): IDBObjectStore;\n    deleteObjectStore(name: string): void;\n    transaction(storeNames: string | string[], mode?: IDBTransactionMode): IDBTransaction;\n    addEventListener(type: "versionchange", listener: (ev: IDBVersionChangeEvent) => any, useCapture?: boolean): void;\n    addEventListener<K extends keyof IDBDatabaseEventMap>(type: K, listener: (this: IDBDatabase, ev: IDBDatabaseEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var IDBDatabase: {\n    prototype: IDBDatabase;\n    new(): IDBDatabase;\n};\n\ninterface IDBFactory {\n    cmp(first: any, second: any): number;\n    deleteDatabase(name: string): IDBOpenDBRequest;\n    open(name: string, version?: number): IDBOpenDBRequest;\n}\n\ndeclare var IDBFactory: {\n    prototype: IDBFactory;\n    new(): IDBFactory;\n};\n\ninterface IDBIndex {\n    keyPath: string | string[];\n    readonly name: string;\n    readonly objectStore: IDBObjectStore;\n    readonly unique: boolean;\n    multiEntry: boolean;\n    count(key?: IDBKeyRange | IDBValidKey): IDBRequest;\n    get(key: IDBKeyRange | IDBValidKey): IDBRequest;\n    getKey(key: IDBKeyRange | IDBValidKey): IDBRequest;\n    openCursor(range?: IDBKeyRange | IDBValidKey, direction?: IDBCursorDirection): IDBRequest;\n    openKeyCursor(range?: IDBKeyRange | IDBValidKey, direction?: IDBCursorDirection): IDBRequest;\n}\n\ndeclare var IDBIndex: {\n    prototype: IDBIndex;\n    new(): IDBIndex;\n};\n\ninterface IDBKeyRange {\n    readonly lower: any;\n    readonly lowerOpen: boolean;\n    readonly upper: any;\n    readonly upperOpen: boolean;\n}\n\ndeclare var IDBKeyRange: {\n    prototype: IDBKeyRange;\n    new(): IDBKeyRange;\n    bound(lower: any, upper: any, lowerOpen?: boolean, upperOpen?: boolean): IDBKeyRange;\n    lowerBound(lower: any, open?: boolean): IDBKeyRange;\n    only(value: any): IDBKeyRange;\n    upperBound(upper: any, open?: boolean): IDBKeyRange;\n};\n\ninterface IDBObjectStore {\n    readonly indexNames: DOMStringList;\n    keyPath: string | string[];\n    readonly name: string;\n    readonly transaction: IDBTransaction;\n    autoIncrement: boolean;\n    add(value: any, key?: IDBKeyRange | IDBValidKey): IDBRequest;\n    clear(): IDBRequest;\n    count(key?: IDBKeyRange | IDBValidKey): IDBRequest;\n    createIndex(name: string, keyPath: string | string[], optionalParameters?: IDBIndexParameters): IDBIndex;\n    delete(key: IDBKeyRange | IDBValidKey): IDBRequest;\n    deleteIndex(indexName: string): void;\n    get(key: any): IDBRequest;\n    index(name: string): IDBIndex;\n    openCursor(range?: IDBKeyRange | IDBValidKey, direction?: IDBCursorDirection): IDBRequest;\n    put(value: any, key?: IDBKeyRange | IDBValidKey): IDBRequest;\n}\n\ndeclare var IDBObjectStore: {\n    prototype: IDBObjectStore;\n    new(): IDBObjectStore;\n};\n\ninterface IDBOpenDBRequestEventMap extends IDBRequestEventMap {\n    "blocked": Event;\n    "upgradeneeded": IDBVersionChangeEvent;\n}\n\ninterface IDBOpenDBRequest extends IDBRequest {\n    onblocked: (this: IDBOpenDBRequest, ev: Event) => any;\n    onupgradeneeded: (this: IDBOpenDBRequest, ev: IDBVersionChangeEvent) => any;\n    addEventListener<K extends keyof IDBOpenDBRequestEventMap>(type: K, listener: (this: IDBOpenDBRequest, ev: IDBOpenDBRequestEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var IDBOpenDBRequest: {\n    prototype: IDBOpenDBRequest;\n    new(): IDBOpenDBRequest;\n};\n\ninterface IDBRequestEventMap {\n    "error": Event;\n    "success": Event;\n}\n\ninterface IDBRequest extends EventTarget {\n    readonly error: DOMException;\n    onerror: (this: IDBRequest, ev: Event) => any;\n    onsuccess: (this: IDBRequest, ev: Event) => any;\n    readonly readyState: IDBRequestReadyState;\n    readonly result: any;\n    source: IDBObjectStore | IDBIndex | IDBCursor;\n    readonly transaction: IDBTransaction;\n    addEventListener<K extends keyof IDBRequestEventMap>(type: K, listener: (this: IDBRequest, ev: IDBRequestEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var IDBRequest: {\n    prototype: IDBRequest;\n    new(): IDBRequest;\n};\n\ninterface IDBTransactionEventMap {\n    "abort": Event;\n    "complete": Event;\n    "error": Event;\n}\n\ninterface IDBTransaction extends EventTarget {\n    readonly db: IDBDatabase;\n    readonly error: DOMException;\n    readonly mode: IDBTransactionMode;\n    onabort: (this: IDBTransaction, ev: Event) => any;\n    oncomplete: (this: IDBTransaction, ev: Event) => any;\n    onerror: (this: IDBTransaction, ev: Event) => any;\n    abort(): void;\n    objectStore(name: string): IDBObjectStore;\n    readonly READ_ONLY: string;\n    readonly READ_WRITE: string;\n    readonly VERSION_CHANGE: string;\n    addEventListener<K extends keyof IDBTransactionEventMap>(type: K, listener: (this: IDBTransaction, ev: IDBTransactionEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var IDBTransaction: {\n    prototype: IDBTransaction;\n    new(): IDBTransaction;\n    readonly READ_ONLY: string;\n    readonly READ_WRITE: string;\n    readonly VERSION_CHANGE: string;\n};\n\ninterface IDBVersionChangeEvent extends Event {\n    readonly newVersion: number | null;\n    readonly oldVersion: number;\n}\n\ndeclare var IDBVersionChangeEvent: {\n    prototype: IDBVersionChangeEvent;\n    new(): IDBVersionChangeEvent;\n};\n\ninterface IIRFilterNode extends AudioNode {\n    getFrequencyResponse(frequencyHz: Float32Array, magResponse: Float32Array, phaseResponse: Float32Array): void;\n}\n\ndeclare var IIRFilterNode: {\n    prototype: IIRFilterNode;\n    new(): IIRFilterNode;\n};\n\ninterface ImageData {\n    data: Uint8ClampedArray;\n    readonly height: number;\n    readonly width: number;\n}\n\ndeclare var ImageData: {\n    prototype: ImageData;\n    new(width: number, height: number): ImageData;\n    new(array: Uint8ClampedArray, width: number, height: number): ImageData;\n};\n\ninterface IntersectionObserver {\n    readonly root: Element | null;\n    readonly rootMargin: string;\n    readonly thresholds: number[];\n    disconnect(): void;\n    observe(target: Element): void;\n    takeRecords(): IntersectionObserverEntry[];\n    unobserve(target: Element): void;\n}\n\ndeclare var IntersectionObserver: {\n    prototype: IntersectionObserver;\n    new(callback: IntersectionObserverCallback, options?: IntersectionObserverInit): IntersectionObserver;\n};\n\ninterface IntersectionObserverEntry {\n    readonly boundingClientRect: ClientRect;\n    readonly intersectionRatio: number;\n    readonly intersectionRect: ClientRect;\n    readonly rootBounds: ClientRect;\n    readonly target: Element;\n    readonly time: number;\n}\n\ndeclare var IntersectionObserverEntry: {\n    prototype: IntersectionObserverEntry;\n    new(intersectionObserverEntryInit: IntersectionObserverEntryInit): IntersectionObserverEntry;\n};\n\ninterface KeyboardEvent extends UIEvent {\n    readonly altKey: boolean;\n    readonly char: string | null;\n    readonly charCode: number;\n    readonly ctrlKey: boolean;\n    readonly key: string;\n    readonly keyCode: number;\n    readonly locale: string;\n    readonly location: number;\n    readonly metaKey: boolean;\n    readonly repeat: boolean;\n    readonly shiftKey: boolean;\n    readonly which: number;\n    readonly code: string;\n    getModifierState(keyArg: string): boolean;\n    initKeyboardEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, keyArg: string, locationArg: number, modifiersListArg: string, repeat: boolean, locale: string): void;\n    readonly DOM_KEY_LOCATION_JOYSTICK: number;\n    readonly DOM_KEY_LOCATION_LEFT: number;\n    readonly DOM_KEY_LOCATION_MOBILE: number;\n    readonly DOM_KEY_LOCATION_NUMPAD: number;\n    readonly DOM_KEY_LOCATION_RIGHT: number;\n    readonly DOM_KEY_LOCATION_STANDARD: number;\n}\n\ndeclare var KeyboardEvent: {\n    prototype: KeyboardEvent;\n    new(typeArg: string, eventInitDict?: KeyboardEventInit): KeyboardEvent;\n    readonly DOM_KEY_LOCATION_JOYSTICK: number;\n    readonly DOM_KEY_LOCATION_LEFT: number;\n    readonly DOM_KEY_LOCATION_MOBILE: number;\n    readonly DOM_KEY_LOCATION_NUMPAD: number;\n    readonly DOM_KEY_LOCATION_RIGHT: number;\n    readonly DOM_KEY_LOCATION_STANDARD: number;\n};\n\ninterface ListeningStateChangedEvent extends Event {\n    readonly label: string;\n    readonly state: ListeningState;\n}\n\ndeclare var ListeningStateChangedEvent: {\n    prototype: ListeningStateChangedEvent;\n    new(): ListeningStateChangedEvent;\n};\n\ninterface Location {\n    hash: string;\n    host: string;\n    hostname: string;\n    href: string;\n    readonly origin: string;\n    pathname: string;\n    port: string;\n    protocol: string;\n    search: string;\n    assign(url: string): void;\n    reload(forcedReload?: boolean): void;\n    replace(url: string): void;\n    toString(): string;\n}\n\ndeclare var Location: {\n    prototype: Location;\n    new(): Location;\n};\n\ninterface LongRunningScriptDetectedEvent extends Event {\n    readonly executionTime: number;\n    stopPageScriptExecution: boolean;\n}\n\ndeclare var LongRunningScriptDetectedEvent: {\n    prototype: LongRunningScriptDetectedEvent;\n    new(): LongRunningScriptDetectedEvent;\n};\n\ninterface MediaDeviceInfo {\n    readonly deviceId: string;\n    readonly groupId: string;\n    readonly kind: MediaDeviceKind;\n    readonly label: string;\n}\n\ndeclare var MediaDeviceInfo: {\n    prototype: MediaDeviceInfo;\n    new(): MediaDeviceInfo;\n};\n\ninterface MediaDevicesEventMap {\n    "devicechange": Event;\n}\n\ninterface MediaDevices extends EventTarget {\n    ondevicechange: (this: MediaDevices, ev: Event) => any;\n    enumerateDevices(): any;\n    getSupportedConstraints(): MediaTrackSupportedConstraints;\n    getUserMedia(constraints: MediaStreamConstraints): Promise<MediaStream>;\n    addEventListener<K extends keyof MediaDevicesEventMap>(type: K, listener: (this: MediaDevices, ev: MediaDevicesEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var MediaDevices: {\n    prototype: MediaDevices;\n    new(): MediaDevices;\n};\n\ninterface MediaElementAudioSourceNode extends AudioNode {\n}\n\ndeclare var MediaElementAudioSourceNode: {\n    prototype: MediaElementAudioSourceNode;\n    new(): MediaElementAudioSourceNode;\n};\n\ninterface MediaEncryptedEvent extends Event {\n    readonly initData: ArrayBuffer | null;\n    readonly initDataType: string;\n}\n\ndeclare var MediaEncryptedEvent: {\n    prototype: MediaEncryptedEvent;\n    new(type: string, eventInitDict?: MediaEncryptedEventInit): MediaEncryptedEvent;\n};\n\ninterface MediaError {\n    readonly code: number;\n    readonly msExtendedCode: number;\n    readonly MEDIA_ERR_ABORTED: number;\n    readonly MEDIA_ERR_DECODE: number;\n    readonly MEDIA_ERR_NETWORK: number;\n    readonly MEDIA_ERR_SRC_NOT_SUPPORTED: number;\n    readonly MS_MEDIA_ERR_ENCRYPTED: number;\n}\n\ndeclare var MediaError: {\n    prototype: MediaError;\n    new(): MediaError;\n    readonly MEDIA_ERR_ABORTED: number;\n    readonly MEDIA_ERR_DECODE: number;\n    readonly MEDIA_ERR_NETWORK: number;\n    readonly MEDIA_ERR_SRC_NOT_SUPPORTED: number;\n    readonly MS_MEDIA_ERR_ENCRYPTED: number;\n};\n\ninterface MediaKeyMessageEvent extends Event {\n    readonly message: ArrayBuffer;\n    readonly messageType: MediaKeyMessageType;\n}\n\ndeclare var MediaKeyMessageEvent: {\n    prototype: MediaKeyMessageEvent;\n    new(type: string, eventInitDict?: MediaKeyMessageEventInit): MediaKeyMessageEvent;\n};\n\ninterface MediaKeys {\n    createSession(sessionType?: MediaKeySessionType): MediaKeySession;\n    setServerCertificate(serverCertificate: any): Promise<void>;\n}\n\ndeclare var MediaKeys: {\n    prototype: MediaKeys;\n    new(): MediaKeys;\n};\n\ninterface MediaKeySession extends EventTarget {\n    readonly closed: Promise<void>;\n    readonly expiration: number;\n    readonly keyStatuses: MediaKeyStatusMap;\n    readonly sessionId: string;\n    close(): Promise<void>;\n    generateRequest(initDataType: string, initData: any): Promise<void>;\n    load(sessionId: string): Promise<boolean>;\n    remove(): Promise<void>;\n    update(response: any): Promise<void>;\n}\n\ndeclare var MediaKeySession: {\n    prototype: MediaKeySession;\n    new(): MediaKeySession;\n};\n\ninterface MediaKeyStatusMap {\n    readonly size: number;\n    forEach(callback: ForEachCallback): void;\n    get(keyId: any): MediaKeyStatus;\n    has(keyId: any): boolean;\n}\n\ndeclare var MediaKeyStatusMap: {\n    prototype: MediaKeyStatusMap;\n    new(): MediaKeyStatusMap;\n};\n\ninterface MediaKeySystemAccess {\n    readonly keySystem: string;\n    createMediaKeys(): Promise<MediaKeys>;\n    getConfiguration(): MediaKeySystemConfiguration;\n}\n\ndeclare var MediaKeySystemAccess: {\n    prototype: MediaKeySystemAccess;\n    new(): MediaKeySystemAccess;\n};\n\ninterface MediaList {\n    readonly length: number;\n    mediaText: string;\n    appendMedium(newMedium: string): void;\n    deleteMedium(oldMedium: string): void;\n    item(index: number): string;\n    toString(): string;\n    [index: number]: string;\n}\n\ndeclare var MediaList: {\n    prototype: MediaList;\n    new(): MediaList;\n};\n\ninterface MediaQueryList {\n    readonly matches: boolean;\n    readonly media: string;\n    addListener(listener: MediaQueryListListener): void;\n    removeListener(listener: MediaQueryListListener): void;\n}\n\ndeclare var MediaQueryList: {\n    prototype: MediaQueryList;\n    new(): MediaQueryList;\n};\n\ninterface MediaSource extends EventTarget {\n    readonly activeSourceBuffers: SourceBufferList;\n    duration: number;\n    readonly readyState: string;\n    readonly sourceBuffers: SourceBufferList;\n    addSourceBuffer(type: string): SourceBuffer;\n    endOfStream(error?: number): void;\n    removeSourceBuffer(sourceBuffer: SourceBuffer): void;\n}\n\ndeclare var MediaSource: {\n    prototype: MediaSource;\n    new(): MediaSource;\n    isTypeSupported(type: string): boolean;\n};\n\ninterface MediaStreamEventMap {\n    "active": Event;\n    "addtrack": MediaStreamTrackEvent;\n    "inactive": Event;\n    "removetrack": MediaStreamTrackEvent;\n}\n\ninterface MediaStream extends EventTarget {\n    readonly active: boolean;\n    readonly id: string;\n    onactive: (this: MediaStream, ev: Event) => any;\n    onaddtrack: (this: MediaStream, ev: MediaStreamTrackEvent) => any;\n    oninactive: (this: MediaStream, ev: Event) => any;\n    onremovetrack: (this: MediaStream, ev: MediaStreamTrackEvent) => any;\n    addTrack(track: MediaStreamTrack): void;\n    clone(): MediaStream;\n    getAudioTracks(): MediaStreamTrack[];\n    getTrackById(trackId: string): MediaStreamTrack | null;\n    getTracks(): MediaStreamTrack[];\n    getVideoTracks(): MediaStreamTrack[];\n    removeTrack(track: MediaStreamTrack): void;\n    stop(): void;\n    addEventListener<K extends keyof MediaStreamEventMap>(type: K, listener: (this: MediaStream, ev: MediaStreamEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var MediaStream: {\n    prototype: MediaStream;\n    new(streamOrTracks?: MediaStream | MediaStreamTrack[]): MediaStream;\n};\n\ninterface MediaStreamAudioSourceNode extends AudioNode {\n}\n\ndeclare var MediaStreamAudioSourceNode: {\n    prototype: MediaStreamAudioSourceNode;\n    new(): MediaStreamAudioSourceNode;\n};\n\ninterface MediaStreamError {\n    readonly constraintName: string | null;\n    readonly message: string | null;\n    readonly name: string;\n}\n\ndeclare var MediaStreamError: {\n    prototype: MediaStreamError;\n    new(): MediaStreamError;\n};\n\ninterface MediaStreamErrorEvent extends Event {\n    readonly error: MediaStreamError | null;\n}\n\ndeclare var MediaStreamErrorEvent: {\n    prototype: MediaStreamErrorEvent;\n    new(typeArg: string, eventInitDict?: MediaStreamErrorEventInit): MediaStreamErrorEvent;\n};\n\ninterface MediaStreamEvent extends Event {\n    readonly stream: MediaStream | null;\n}\n\ndeclare var MediaStreamEvent: {\n    prototype: MediaStreamEvent;\n    new(type: string, eventInitDict: MediaStreamEventInit): MediaStreamEvent;\n};\n\ninterface MediaStreamTrackEventMap {\n    "ended": MediaStreamErrorEvent;\n    "mute": Event;\n    "overconstrained": MediaStreamErrorEvent;\n    "unmute": Event;\n}\n\ninterface MediaStreamTrack extends EventTarget {\n    enabled: boolean;\n    readonly id: string;\n    readonly kind: string;\n    readonly label: string;\n    readonly muted: boolean;\n    onended: (this: MediaStreamTrack, ev: MediaStreamErrorEvent) => any;\n    onmute: (this: MediaStreamTrack, ev: Event) => any;\n    onoverconstrained: (this: MediaStreamTrack, ev: MediaStreamErrorEvent) => any;\n    onunmute: (this: MediaStreamTrack, ev: Event) => any;\n    readonly readonly: boolean;\n    readonly readyState: MediaStreamTrackState;\n    readonly remote: boolean;\n    applyConstraints(constraints: MediaTrackConstraints): Promise<void>;\n    clone(): MediaStreamTrack;\n    getCapabilities(): MediaTrackCapabilities;\n    getConstraints(): MediaTrackConstraints;\n    getSettings(): MediaTrackSettings;\n    stop(): void;\n    addEventListener<K extends keyof MediaStreamTrackEventMap>(type: K, listener: (this: MediaStreamTrack, ev: MediaStreamTrackEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var MediaStreamTrack: {\n    prototype: MediaStreamTrack;\n    new(): MediaStreamTrack;\n};\n\ninterface MediaStreamTrackEvent extends Event {\n    readonly track: MediaStreamTrack;\n}\n\ndeclare var MediaStreamTrackEvent: {\n    prototype: MediaStreamTrackEvent;\n    new(typeArg: string, eventInitDict?: MediaStreamTrackEventInit): MediaStreamTrackEvent;\n};\n\ninterface MessageChannel {\n    readonly port1: MessagePort;\n    readonly port2: MessagePort;\n}\n\ndeclare var MessageChannel: {\n    prototype: MessageChannel;\n    new(): MessageChannel;\n};\n\ninterface MessageEvent extends Event {\n    readonly data: any;\n    readonly origin: string;\n    readonly ports: any;\n    readonly source: Window;\n    initMessageEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, dataArg: any, originArg: string, lastEventIdArg: string, sourceArg: Window): void;\n}\n\ndeclare var MessageEvent: {\n    prototype: MessageEvent;\n    new(type: string, eventInitDict?: MessageEventInit): MessageEvent;\n};\n\ninterface MessagePortEventMap {\n    "message": MessageEvent;\n}\n\ninterface MessagePort extends EventTarget {\n    onmessage: (this: MessagePort, ev: MessageEvent) => any;\n    close(): void;\n    postMessage(message?: any, transfer?: any[]): void;\n    start(): void;\n    addEventListener<K extends keyof MessagePortEventMap>(type: K, listener: (this: MessagePort, ev: MessagePortEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var MessagePort: {\n    prototype: MessagePort;\n    new(): MessagePort;\n};\n\ninterface MimeType {\n    readonly description: string;\n    readonly enabledPlugin: Plugin;\n    readonly suffixes: string;\n    readonly type: string;\n}\n\ndeclare var MimeType: {\n    prototype: MimeType;\n    new(): MimeType;\n};\n\ninterface MimeTypeArray {\n    readonly length: number;\n    item(index: number): Plugin;\n    namedItem(type: string): Plugin;\n    [index: number]: Plugin;\n}\n\ndeclare var MimeTypeArray: {\n    prototype: MimeTypeArray;\n    new(): MimeTypeArray;\n};\n\ninterface MouseEvent extends UIEvent {\n    readonly altKey: boolean;\n    readonly button: number;\n    readonly buttons: number;\n    readonly clientX: number;\n    readonly clientY: number;\n    readonly ctrlKey: boolean;\n    readonly fromElement: Element;\n    readonly layerX: number;\n    readonly layerY: number;\n    readonly metaKey: boolean;\n    readonly movementX: number;\n    readonly movementY: number;\n    readonly offsetX: number;\n    readonly offsetY: number;\n    readonly pageX: number;\n    readonly pageY: number;\n    readonly relatedTarget: EventTarget;\n    readonly screenX: number;\n    readonly screenY: number;\n    readonly shiftKey: boolean;\n    readonly toElement: Element;\n    readonly which: number;\n    readonly x: number;\n    readonly y: number;\n    getModifierState(keyArg: string): boolean;\n    initMouseEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, ctrlKeyArg: boolean, altKeyArg: boolean, shiftKeyArg: boolean, metaKeyArg: boolean, buttonArg: number, relatedTargetArg: EventTarget | null): void;\n}\n\ndeclare var MouseEvent: {\n    prototype: MouseEvent;\n    new(typeArg: string, eventInitDict?: MouseEventInit): MouseEvent;\n};\n\ninterface MSApp {\n    clearTemporaryWebDataAsync(): MSAppAsyncOperation;\n    createBlobFromRandomAccessStream(type: string, seeker: any): Blob;\n    createDataPackage(object: any): any;\n    createDataPackageFromSelection(): any;\n    createFileFromStorageFile(storageFile: any): File;\n    createStreamFromInputStream(type: string, inputStream: any): MSStream;\n    execAsyncAtPriority(asynchronousCallback: MSExecAtPriorityFunctionCallback, priority: string, ...args: any[]): void;\n    execAtPriority(synchronousCallback: MSExecAtPriorityFunctionCallback, priority: string, ...args: any[]): any;\n    getCurrentPriority(): string;\n    getHtmlPrintDocumentSourceAsync(htmlDoc: any): Promise<any>;\n    getViewId(view: any): any;\n    isTaskScheduledAtPriorityOrHigher(priority: string): boolean;\n    pageHandlesAllApplicationActivations(enabled: boolean): void;\n    suppressSubdownloadCredentialPrompts(suppress: boolean): void;\n    terminateApp(exceptionObject: any): void;\n    readonly CURRENT: string;\n    readonly HIGH: string;\n    readonly IDLE: string;\n    readonly NORMAL: string;\n}\ndeclare var MSApp: MSApp;\n\ninterface MSAppAsyncOperationEventMap {\n    "complete": Event;\n    "error": Event;\n}\n\ninterface MSAppAsyncOperation extends EventTarget {\n    readonly error: DOMError;\n    oncomplete: (this: MSAppAsyncOperation, ev: Event) => any;\n    onerror: (this: MSAppAsyncOperation, ev: Event) => any;\n    readonly readyState: number;\n    readonly result: any;\n    start(): void;\n    readonly COMPLETED: number;\n    readonly ERROR: number;\n    readonly STARTED: number;\n    addEventListener<K extends keyof MSAppAsyncOperationEventMap>(type: K, listener: (this: MSAppAsyncOperation, ev: MSAppAsyncOperationEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var MSAppAsyncOperation: {\n    prototype: MSAppAsyncOperation;\n    new(): MSAppAsyncOperation;\n    readonly COMPLETED: number;\n    readonly ERROR: number;\n    readonly STARTED: number;\n};\n\ninterface MSAssertion {\n    readonly id: string;\n    readonly type: MSCredentialType;\n}\n\ndeclare var MSAssertion: {\n    prototype: MSAssertion;\n    new(): MSAssertion;\n};\n\ninterface MSBlobBuilder {\n    append(data: any, endings?: string): void;\n    getBlob(contentType?: string): Blob;\n}\n\ndeclare var MSBlobBuilder: {\n    prototype: MSBlobBuilder;\n    new(): MSBlobBuilder;\n};\n\ninterface MSCredentials {\n    getAssertion(challenge: string, filter?: MSCredentialFilter, params?: MSSignatureParameters): Promise<MSAssertion>;\n    makeCredential(accountInfo: MSAccountInfo, params: MSCredentialParameters[], challenge?: string): Promise<MSAssertion>;\n}\n\ndeclare var MSCredentials: {\n    prototype: MSCredentials;\n    new(): MSCredentials;\n};\n\ninterface MSFIDOCredentialAssertion extends MSAssertion {\n    readonly algorithm: string | Algorithm;\n    readonly attestation: any;\n    readonly publicKey: string;\n    readonly transportHints: MSTransportType[];\n}\n\ndeclare var MSFIDOCredentialAssertion: {\n    prototype: MSFIDOCredentialAssertion;\n    new(): MSFIDOCredentialAssertion;\n};\n\ninterface MSFIDOSignature {\n    readonly authnrData: string;\n    readonly clientData: string;\n    readonly signature: string;\n}\n\ndeclare var MSFIDOSignature: {\n    prototype: MSFIDOSignature;\n    new(): MSFIDOSignature;\n};\n\ninterface MSFIDOSignatureAssertion extends MSAssertion {\n    readonly signature: MSFIDOSignature;\n}\n\ndeclare var MSFIDOSignatureAssertion: {\n    prototype: MSFIDOSignatureAssertion;\n    new(): MSFIDOSignatureAssertion;\n};\n\ninterface MSGesture {\n    target: Element;\n    addPointer(pointerId: number): void;\n    stop(): void;\n}\n\ndeclare var MSGesture: {\n    prototype: MSGesture;\n    new(): MSGesture;\n};\n\ninterface MSGestureEvent extends UIEvent {\n    readonly clientX: number;\n    readonly clientY: number;\n    readonly expansion: number;\n    readonly gestureObject: any;\n    readonly hwTimestamp: number;\n    readonly offsetX: number;\n    readonly offsetY: number;\n    readonly rotation: number;\n    readonly scale: number;\n    readonly screenX: number;\n    readonly screenY: number;\n    readonly translationX: number;\n    readonly translationY: number;\n    readonly velocityAngular: number;\n    readonly velocityExpansion: number;\n    readonly velocityX: number;\n    readonly velocityY: number;\n    initGestureEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, offsetXArg: number, offsetYArg: number, translationXArg: number, translationYArg: number, scaleArg: number, expansionArg: number, rotationArg: number, velocityXArg: number, velocityYArg: number, velocityExpansionArg: number, velocityAngularArg: number, hwTimestampArg: number): void;\n    readonly MSGESTURE_FLAG_BEGIN: number;\n    readonly MSGESTURE_FLAG_CANCEL: number;\n    readonly MSGESTURE_FLAG_END: number;\n    readonly MSGESTURE_FLAG_INERTIA: number;\n    readonly MSGESTURE_FLAG_NONE: number;\n}\n\ndeclare var MSGestureEvent: {\n    prototype: MSGestureEvent;\n    new(): MSGestureEvent;\n    readonly MSGESTURE_FLAG_BEGIN: number;\n    readonly MSGESTURE_FLAG_CANCEL: number;\n    readonly MSGESTURE_FLAG_END: number;\n    readonly MSGESTURE_FLAG_INERTIA: number;\n    readonly MSGESTURE_FLAG_NONE: number;\n};\n\ninterface MSGraphicsTrust {\n    readonly constrictionActive: boolean;\n    readonly status: string;\n}\n\ndeclare var MSGraphicsTrust: {\n    prototype: MSGraphicsTrust;\n    new(): MSGraphicsTrust;\n};\n\ninterface MSHTMLWebViewElement extends HTMLElement {\n    readonly canGoBack: boolean;\n    readonly canGoForward: boolean;\n    readonly containsFullScreenElement: boolean;\n    readonly documentTitle: string;\n    height: number;\n    readonly settings: MSWebViewSettings;\n    src: string;\n    width: number;\n    addWebAllowedObject(name: string, applicationObject: any): void;\n    buildLocalStreamUri(contentIdentifier: string, relativePath: string): string;\n    capturePreviewToBlobAsync(): MSWebViewAsyncOperation;\n    captureSelectedContentToDataPackageAsync(): MSWebViewAsyncOperation;\n    getDeferredPermissionRequestById(id: number): DeferredPermissionRequest;\n    getDeferredPermissionRequests(): DeferredPermissionRequest[];\n    goBack(): void;\n    goForward(): void;\n    invokeScriptAsync(scriptName: string, ...args: any[]): MSWebViewAsyncOperation;\n    navigate(uri: string): void;\n    navigateFocus(navigationReason: NavigationReason, origin: FocusNavigationOrigin): void;\n    navigateToLocalStreamUri(source: string, streamResolver: any): void;\n    navigateToString(contents: string): void;\n    navigateWithHttpRequestMessage(requestMessage: any): void;\n    refresh(): void;\n    stop(): void;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: MSHTMLWebViewElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var MSHTMLWebViewElement: {\n    prototype: MSHTMLWebViewElement;\n    new(): MSHTMLWebViewElement;\n};\n\ninterface MSInputMethodContextEventMap {\n    "MSCandidateWindowHide": Event;\n    "MSCandidateWindowShow": Event;\n    "MSCandidateWindowUpdate": Event;\n}\n\ninterface MSInputMethodContext extends EventTarget {\n    readonly compositionEndOffset: number;\n    readonly compositionStartOffset: number;\n    oncandidatewindowhide: (this: MSInputMethodContext, ev: Event) => any;\n    oncandidatewindowshow: (this: MSInputMethodContext, ev: Event) => any;\n    oncandidatewindowupdate: (this: MSInputMethodContext, ev: Event) => any;\n    readonly target: HTMLElement;\n    getCandidateWindowClientRect(): ClientRect;\n    getCompositionAlternatives(): string[];\n    hasComposition(): boolean;\n    isCandidateWindowVisible(): boolean;\n    addEventListener<K extends keyof MSInputMethodContextEventMap>(type: K, listener: (this: MSInputMethodContext, ev: MSInputMethodContextEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var MSInputMethodContext: {\n    prototype: MSInputMethodContext;\n    new(): MSInputMethodContext;\n};\n\ninterface MSManipulationEvent extends UIEvent {\n    readonly currentState: number;\n    readonly inertiaDestinationX: number;\n    readonly inertiaDestinationY: number;\n    readonly lastState: number;\n    initMSManipulationEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, lastState: number, currentState: number): void;\n    readonly MS_MANIPULATION_STATE_ACTIVE: number;\n    readonly MS_MANIPULATION_STATE_CANCELLED: number;\n    readonly MS_MANIPULATION_STATE_COMMITTED: number;\n    readonly MS_MANIPULATION_STATE_DRAGGING: number;\n    readonly MS_MANIPULATION_STATE_INERTIA: number;\n    readonly MS_MANIPULATION_STATE_PRESELECT: number;\n    readonly MS_MANIPULATION_STATE_SELECTING: number;\n    readonly MS_MANIPULATION_STATE_STOPPED: number;\n}\n\ndeclare var MSManipulationEvent: {\n    prototype: MSManipulationEvent;\n    new(): MSManipulationEvent;\n    readonly MS_MANIPULATION_STATE_ACTIVE: number;\n    readonly MS_MANIPULATION_STATE_CANCELLED: number;\n    readonly MS_MANIPULATION_STATE_COMMITTED: number;\n    readonly MS_MANIPULATION_STATE_DRAGGING: number;\n    readonly MS_MANIPULATION_STATE_INERTIA: number;\n    readonly MS_MANIPULATION_STATE_PRESELECT: number;\n    readonly MS_MANIPULATION_STATE_SELECTING: number;\n    readonly MS_MANIPULATION_STATE_STOPPED: number;\n};\n\ninterface MSMediaKeyError {\n    readonly code: number;\n    readonly systemCode: number;\n    readonly MS_MEDIA_KEYERR_CLIENT: number;\n    readonly MS_MEDIA_KEYERR_DOMAIN: number;\n    readonly MS_MEDIA_KEYERR_HARDWARECHANGE: number;\n    readonly MS_MEDIA_KEYERR_OUTPUT: number;\n    readonly MS_MEDIA_KEYERR_SERVICE: number;\n    readonly MS_MEDIA_KEYERR_UNKNOWN: number;\n}\n\ndeclare var MSMediaKeyError: {\n    prototype: MSMediaKeyError;\n    new(): MSMediaKeyError;\n    readonly MS_MEDIA_KEYERR_CLIENT: number;\n    readonly MS_MEDIA_KEYERR_DOMAIN: number;\n    readonly MS_MEDIA_KEYERR_HARDWARECHANGE: number;\n    readonly MS_MEDIA_KEYERR_OUTPUT: number;\n    readonly MS_MEDIA_KEYERR_SERVICE: number;\n    readonly MS_MEDIA_KEYERR_UNKNOWN: number;\n};\n\ninterface MSMediaKeyMessageEvent extends Event {\n    readonly destinationURL: string | null;\n    readonly message: Uint8Array;\n}\n\ndeclare var MSMediaKeyMessageEvent: {\n    prototype: MSMediaKeyMessageEvent;\n    new(): MSMediaKeyMessageEvent;\n};\n\ninterface MSMediaKeyNeededEvent extends Event {\n    readonly initData: Uint8Array | null;\n}\n\ndeclare var MSMediaKeyNeededEvent: {\n    prototype: MSMediaKeyNeededEvent;\n    new(): MSMediaKeyNeededEvent;\n};\n\ninterface MSMediaKeys {\n    readonly keySystem: string;\n    createSession(type: string, initData: Uint8Array, cdmData?: Uint8Array): MSMediaKeySession;\n}\n\ndeclare var MSMediaKeys: {\n    prototype: MSMediaKeys;\n    new(keySystem: string): MSMediaKeys;\n    isTypeSupported(keySystem: string, type?: string): boolean;\n    isTypeSupportedWithFeatures(keySystem: string, type?: string): string;\n};\n\ninterface MSMediaKeySession extends EventTarget {\n    readonly error: MSMediaKeyError | null;\n    readonly keySystem: string;\n    readonly sessionId: string;\n    close(): void;\n    update(key: Uint8Array): void;\n}\n\ndeclare var MSMediaKeySession: {\n    prototype: MSMediaKeySession;\n    new(): MSMediaKeySession;\n};\n\ninterface MSPointerEvent extends MouseEvent {\n    readonly currentPoint: any;\n    readonly height: number;\n    readonly hwTimestamp: number;\n    readonly intermediatePoints: any;\n    readonly isPrimary: boolean;\n    readonly pointerId: number;\n    readonly pointerType: any;\n    readonly pressure: number;\n    readonly rotation: number;\n    readonly tiltX: number;\n    readonly tiltY: number;\n    readonly width: number;\n    getCurrentPoint(element: Element): void;\n    getIntermediatePoints(element: Element): void;\n    initPointerEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, ctrlKeyArg: boolean, altKeyArg: boolean, shiftKeyArg: boolean, metaKeyArg: boolean, buttonArg: number, relatedTargetArg: EventTarget, offsetXArg: number, offsetYArg: number, widthArg: number, heightArg: number, pressure: number, rotation: number, tiltX: number, tiltY: number, pointerIdArg: number, pointerType: any, hwTimestampArg: number, isPrimary: boolean): void;\n}\n\ndeclare var MSPointerEvent: {\n    prototype: MSPointerEvent;\n    new(typeArg: string, eventInitDict?: PointerEventInit): MSPointerEvent;\n};\n\ninterface MSRangeCollection {\n    readonly length: number;\n    item(index: number): Range;\n    [index: number]: Range;\n}\n\ndeclare var MSRangeCollection: {\n    prototype: MSRangeCollection;\n    new(): MSRangeCollection;\n};\n\ninterface MSSiteModeEvent extends Event {\n    readonly actionURL: string;\n    readonly buttonID: number;\n}\n\ndeclare var MSSiteModeEvent: {\n    prototype: MSSiteModeEvent;\n    new(): MSSiteModeEvent;\n};\n\ninterface MSStream {\n    readonly type: string;\n    msClose(): void;\n    msDetachStream(): any;\n}\n\ndeclare var MSStream: {\n    prototype: MSStream;\n    new(): MSStream;\n};\n\ninterface MSStreamReader extends EventTarget, MSBaseReader {\n    readonly error: DOMError;\n    readAsArrayBuffer(stream: MSStream, size?: number): void;\n    readAsBinaryString(stream: MSStream, size?: number): void;\n    readAsBlob(stream: MSStream, size?: number): void;\n    readAsDataURL(stream: MSStream, size?: number): void;\n    readAsText(stream: MSStream, encoding?: string, size?: number): void;\n    addEventListener<K extends keyof MSBaseReaderEventMap>(type: K, listener: (this: MSStreamReader, ev: MSBaseReaderEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var MSStreamReader: {\n    prototype: MSStreamReader;\n    new(): MSStreamReader;\n};\n\ninterface MSWebViewAsyncOperationEventMap {\n    "complete": Event;\n    "error": Event;\n}\n\ninterface MSWebViewAsyncOperation extends EventTarget {\n    readonly error: DOMError;\n    oncomplete: (this: MSWebViewAsyncOperation, ev: Event) => any;\n    onerror: (this: MSWebViewAsyncOperation, ev: Event) => any;\n    readonly readyState: number;\n    readonly result: any;\n    readonly target: MSHTMLWebViewElement;\n    readonly type: number;\n    start(): void;\n    readonly COMPLETED: number;\n    readonly ERROR: number;\n    readonly STARTED: number;\n    readonly TYPE_CAPTURE_PREVIEW_TO_RANDOM_ACCESS_STREAM: number;\n    readonly TYPE_CREATE_DATA_PACKAGE_FROM_SELECTION: number;\n    readonly TYPE_INVOKE_SCRIPT: number;\n    addEventListener<K extends keyof MSWebViewAsyncOperationEventMap>(type: K, listener: (this: MSWebViewAsyncOperation, ev: MSWebViewAsyncOperationEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var MSWebViewAsyncOperation: {\n    prototype: MSWebViewAsyncOperation;\n    new(): MSWebViewAsyncOperation;\n    readonly COMPLETED: number;\n    readonly ERROR: number;\n    readonly STARTED: number;\n    readonly TYPE_CAPTURE_PREVIEW_TO_RANDOM_ACCESS_STREAM: number;\n    readonly TYPE_CREATE_DATA_PACKAGE_FROM_SELECTION: number;\n    readonly TYPE_INVOKE_SCRIPT: number;\n};\n\ninterface MSWebViewSettings {\n    isIndexedDBEnabled: boolean;\n    isJavaScriptEnabled: boolean;\n}\n\ndeclare var MSWebViewSettings: {\n    prototype: MSWebViewSettings;\n    new(): MSWebViewSettings;\n};\n\ninterface MutationEvent extends Event {\n    readonly attrChange: number;\n    readonly attrName: string;\n    readonly newValue: string;\n    readonly prevValue: string;\n    readonly relatedNode: Node;\n    initMutationEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, relatedNodeArg: Node, prevValueArg: string, newValueArg: string, attrNameArg: string, attrChangeArg: number): void;\n    readonly ADDITION: number;\n    readonly MODIFICATION: number;\n    readonly REMOVAL: number;\n}\n\ndeclare var MutationEvent: {\n    prototype: MutationEvent;\n    new(): MutationEvent;\n    readonly ADDITION: number;\n    readonly MODIFICATION: number;\n    readonly REMOVAL: number;\n};\n\ninterface MutationObserver {\n    disconnect(): void;\n    observe(target: Node, options: MutationObserverInit): void;\n    takeRecords(): MutationRecord[];\n}\n\ndeclare var MutationObserver: {\n    prototype: MutationObserver;\n    new(callback: MutationCallback): MutationObserver;\n};\n\ninterface MutationRecord {\n    readonly addedNodes: NodeList;\n    readonly attributeName: string | null;\n    readonly attributeNamespace: string | null;\n    readonly nextSibling: Node | null;\n    readonly oldValue: string | null;\n    readonly previousSibling: Node | null;\n    readonly removedNodes: NodeList;\n    readonly target: Node;\n    readonly type: string;\n}\n\ndeclare var MutationRecord: {\n    prototype: MutationRecord;\n    new(): MutationRecord;\n};\n\ninterface NamedNodeMap {\n    readonly length: number;\n    getNamedItem(name: string): Attr;\n    getNamedItemNS(namespaceURI: string | null, localName: string | null): Attr;\n    item(index: number): Attr;\n    removeNamedItem(name: string): Attr;\n    removeNamedItemNS(namespaceURI: string | null, localName: string | null): Attr;\n    setNamedItem(arg: Attr): Attr;\n    setNamedItemNS(arg: Attr): Attr;\n    [index: number]: Attr;\n}\n\ndeclare var NamedNodeMap: {\n    prototype: NamedNodeMap;\n    new(): NamedNodeMap;\n};\n\ninterface NavigationCompletedEvent extends NavigationEvent {\n    readonly isSuccess: boolean;\n    readonly webErrorStatus: number;\n}\n\ndeclare var NavigationCompletedEvent: {\n    prototype: NavigationCompletedEvent;\n    new(): NavigationCompletedEvent;\n};\n\ninterface NavigationEvent extends Event {\n    readonly uri: string;\n}\n\ndeclare var NavigationEvent: {\n    prototype: NavigationEvent;\n    new(): NavigationEvent;\n};\n\ninterface NavigationEventWithReferrer extends NavigationEvent {\n    readonly referer: string;\n}\n\ndeclare var NavigationEventWithReferrer: {\n    prototype: NavigationEventWithReferrer;\n    new(): NavigationEventWithReferrer;\n};\n\ninterface Navigator extends Object, NavigatorID, NavigatorOnLine, NavigatorContentUtils, NavigatorStorageUtils, NavigatorGeolocation, MSNavigatorDoNotTrack, MSFileSaver, NavigatorBeacon, NavigatorConcurrentHardware, NavigatorUserMedia {\n    readonly authentication: WebAuthentication;\n    readonly cookieEnabled: boolean;\n    gamepadInputEmulation: GamepadInputEmulationType;\n    readonly language: string;\n    readonly maxTouchPoints: number;\n    readonly mimeTypes: MimeTypeArray;\n    readonly msManipulationViewsEnabled: boolean;\n    readonly msMaxTouchPoints: number;\n    readonly msPointerEnabled: boolean;\n    readonly plugins: PluginArray;\n    readonly pointerEnabled: boolean;\n    readonly serviceWorker: ServiceWorkerContainer;\n    readonly webdriver: boolean;\n    readonly hardwareConcurrency: number;\n    readonly languages: string[];\n    getGamepads(): Gamepad[];\n    javaEnabled(): boolean;\n    msLaunchUri(uri: string, successCallback?: MSLaunchUriCallback, noHandlerCallback?: MSLaunchUriCallback): void;\n    requestMediaKeySystemAccess(keySystem: string, supportedConfigurations: MediaKeySystemConfiguration[]): Promise<MediaKeySystemAccess>;\n    vibrate(pattern: number | number[]): boolean;\n}\n\ndeclare var Navigator: {\n    prototype: Navigator;\n    new(): Navigator;\n};\n\ninterface Node extends EventTarget {\n    readonly attributes: NamedNodeMap;\n    readonly baseURI: string | null;\n    readonly childNodes: NodeList;\n    readonly firstChild: Node | null;\n    readonly lastChild: Node | null;\n    readonly localName: string | null;\n    readonly namespaceURI: string | null;\n    readonly nextSibling: Node | null;\n    readonly nodeName: string;\n    readonly nodeType: number;\n    nodeValue: string | null;\n    readonly ownerDocument: Document;\n    readonly parentElement: HTMLElement | null;\n    readonly parentNode: Node | null;\n    readonly previousSibling: Node | null;\n    textContent: string | null;\n    appendChild<T extends Node>(newChild: T): T;\n    cloneNode(deep?: boolean): Node;\n    compareDocumentPosition(other: Node): number;\n    contains(child: Node): boolean;\n    hasAttributes(): boolean;\n    hasChildNodes(): boolean;\n    insertBefore<T extends Node>(newChild: T, refChild: Node | null): T;\n    isDefaultNamespace(namespaceURI: string | null): boolean;\n    isEqualNode(arg: Node): boolean;\n    isSameNode(other: Node): boolean;\n    lookupNamespaceURI(prefix: string | null): string | null;\n    lookupPrefix(namespaceURI: string | null): string | null;\n    normalize(): void;\n    removeChild<T extends Node>(oldChild: T): T;\n    replaceChild<T extends Node>(newChild: Node, oldChild: T): T;\n    readonly ATTRIBUTE_NODE: number;\n    readonly CDATA_SECTION_NODE: number;\n    readonly COMMENT_NODE: number;\n    readonly DOCUMENT_FRAGMENT_NODE: number;\n    readonly DOCUMENT_NODE: number;\n    readonly DOCUMENT_POSITION_CONTAINED_BY: number;\n    readonly DOCUMENT_POSITION_CONTAINS: number;\n    readonly DOCUMENT_POSITION_DISCONNECTED: number;\n    readonly DOCUMENT_POSITION_FOLLOWING: number;\n    readonly DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: number;\n    readonly DOCUMENT_POSITION_PRECEDING: number;\n    readonly DOCUMENT_TYPE_NODE: number;\n    readonly ELEMENT_NODE: number;\n    readonly ENTITY_NODE: number;\n    readonly ENTITY_REFERENCE_NODE: number;\n    readonly NOTATION_NODE: number;\n    readonly PROCESSING_INSTRUCTION_NODE: number;\n    readonly TEXT_NODE: number;\n}\n\ndeclare var Node: {\n    prototype: Node;\n    new(): Node;\n    readonly ATTRIBUTE_NODE: number;\n    readonly CDATA_SECTION_NODE: number;\n    readonly COMMENT_NODE: number;\n    readonly DOCUMENT_FRAGMENT_NODE: number;\n    readonly DOCUMENT_NODE: number;\n    readonly DOCUMENT_POSITION_CONTAINED_BY: number;\n    readonly DOCUMENT_POSITION_CONTAINS: number;\n    readonly DOCUMENT_POSITION_DISCONNECTED: number;\n    readonly DOCUMENT_POSITION_FOLLOWING: number;\n    readonly DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: number;\n    readonly DOCUMENT_POSITION_PRECEDING: number;\n    readonly DOCUMENT_TYPE_NODE: number;\n    readonly ELEMENT_NODE: number;\n    readonly ENTITY_NODE: number;\n    readonly ENTITY_REFERENCE_NODE: number;\n    readonly NOTATION_NODE: number;\n    readonly PROCESSING_INSTRUCTION_NODE: number;\n    readonly TEXT_NODE: number;\n};\n\ninterface NodeFilter {\n    acceptNode(n: Node): number;\n}\n\ndeclare var NodeFilter: {\n    readonly FILTER_ACCEPT: number;\n    readonly FILTER_REJECT: number;\n    readonly FILTER_SKIP: number;\n    readonly SHOW_ALL: number;\n    readonly SHOW_ATTRIBUTE: number;\n    readonly SHOW_CDATA_SECTION: number;\n    readonly SHOW_COMMENT: number;\n    readonly SHOW_DOCUMENT: number;\n    readonly SHOW_DOCUMENT_FRAGMENT: number;\n    readonly SHOW_DOCUMENT_TYPE: number;\n    readonly SHOW_ELEMENT: number;\n    readonly SHOW_ENTITY: number;\n    readonly SHOW_ENTITY_REFERENCE: number;\n    readonly SHOW_NOTATION: number;\n    readonly SHOW_PROCESSING_INSTRUCTION: number;\n    readonly SHOW_TEXT: number;\n};\n\ninterface NodeIterator {\n    readonly expandEntityReferences: boolean;\n    readonly filter: NodeFilter;\n    readonly root: Node;\n    readonly whatToShow: number;\n    detach(): void;\n    nextNode(): Node;\n    previousNode(): Node;\n}\n\ndeclare var NodeIterator: {\n    prototype: NodeIterator;\n    new(): NodeIterator;\n};\n\ninterface NodeList {\n    readonly length: number;\n    item(index: number): Node;\n    [index: number]: Node;\n}\n\ndeclare var NodeList: {\n    prototype: NodeList;\n    new(): NodeList;\n};\n\ninterface NotificationEventMap {\n    "click": Event;\n    "close": Event;\n    "error": Event;\n    "show": Event;\n}\n\ninterface Notification extends EventTarget {\n    readonly body: string;\n    readonly dir: NotificationDirection;\n    readonly icon: string;\n    readonly lang: string;\n    onclick: (this: Notification, ev: Event) => any;\n    onclose: (this: Notification, ev: Event) => any;\n    onerror: (this: Notification, ev: Event) => any;\n    onshow: (this: Notification, ev: Event) => any;\n    readonly permission: NotificationPermission;\n    readonly tag: string;\n    readonly title: string;\n    close(): void;\n    addEventListener<K extends keyof NotificationEventMap>(type: K, listener: (this: Notification, ev: NotificationEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var Notification: {\n    prototype: Notification;\n    new(title: string, options?: NotificationOptions): Notification;\n    requestPermission(callback?: NotificationPermissionCallback): Promise<NotificationPermission>;\n};\n\ninterface OES_element_index_uint {\n}\n\ndeclare var OES_element_index_uint: {\n    prototype: OES_element_index_uint;\n    new(): OES_element_index_uint;\n};\n\ninterface OES_standard_derivatives {\n    readonly FRAGMENT_SHADER_DERIVATIVE_HINT_OES: number;\n}\n\ndeclare var OES_standard_derivatives: {\n    prototype: OES_standard_derivatives;\n    new(): OES_standard_derivatives;\n    readonly FRAGMENT_SHADER_DERIVATIVE_HINT_OES: number;\n};\n\ninterface OES_texture_float {\n}\n\ndeclare var OES_texture_float: {\n    prototype: OES_texture_float;\n    new(): OES_texture_float;\n};\n\ninterface OES_texture_float_linear {\n}\n\ndeclare var OES_texture_float_linear: {\n    prototype: OES_texture_float_linear;\n    new(): OES_texture_float_linear;\n};\n\ninterface OES_texture_half_float {\n    readonly HALF_FLOAT_OES: number;\n}\n\ndeclare var OES_texture_half_float: {\n    prototype: OES_texture_half_float;\n    new(): OES_texture_half_float;\n    readonly HALF_FLOAT_OES: number;\n};\n\ninterface OES_texture_half_float_linear {\n}\n\ndeclare var OES_texture_half_float_linear: {\n    prototype: OES_texture_half_float_linear;\n    new(): OES_texture_half_float_linear;\n};\n\ninterface OfflineAudioCompletionEvent extends Event {\n    readonly renderedBuffer: AudioBuffer;\n}\n\ndeclare var OfflineAudioCompletionEvent: {\n    prototype: OfflineAudioCompletionEvent;\n    new(): OfflineAudioCompletionEvent;\n};\n\ninterface OfflineAudioContextEventMap extends AudioContextEventMap {\n    "complete": OfflineAudioCompletionEvent;\n}\n\ninterface OfflineAudioContext extends AudioContextBase {\n    readonly length: number;\n    oncomplete: (this: OfflineAudioContext, ev: OfflineAudioCompletionEvent) => any;\n    startRendering(): Promise<AudioBuffer>;\n    suspend(suspendTime: number): Promise<void>;\n    addEventListener<K extends keyof OfflineAudioContextEventMap>(type: K, listener: (this: OfflineAudioContext, ev: OfflineAudioContextEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var OfflineAudioContext: {\n    prototype: OfflineAudioContext;\n    new(numberOfChannels: number, length: number, sampleRate: number): OfflineAudioContext;\n};\n\ninterface OscillatorNodeEventMap {\n    "ended": MediaStreamErrorEvent;\n}\n\ninterface OscillatorNode extends AudioNode {\n    readonly detune: AudioParam;\n    readonly frequency: AudioParam;\n    onended: (this: OscillatorNode, ev: MediaStreamErrorEvent) => any;\n    type: OscillatorType;\n    setPeriodicWave(periodicWave: PeriodicWave): void;\n    start(when?: number): void;\n    stop(when?: number): void;\n    addEventListener<K extends keyof OscillatorNodeEventMap>(type: K, listener: (this: OscillatorNode, ev: OscillatorNodeEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var OscillatorNode: {\n    prototype: OscillatorNode;\n    new(): OscillatorNode;\n};\n\ninterface OverflowEvent extends UIEvent {\n    readonly horizontalOverflow: boolean;\n    readonly orient: number;\n    readonly verticalOverflow: boolean;\n    readonly BOTH: number;\n    readonly HORIZONTAL: number;\n    readonly VERTICAL: number;\n}\n\ndeclare var OverflowEvent: {\n    prototype: OverflowEvent;\n    new(): OverflowEvent;\n    readonly BOTH: number;\n    readonly HORIZONTAL: number;\n    readonly VERTICAL: number;\n};\n\ninterface PageTransitionEvent extends Event {\n    readonly persisted: boolean;\n}\n\ndeclare var PageTransitionEvent: {\n    prototype: PageTransitionEvent;\n    new(): PageTransitionEvent;\n};\n\ninterface PannerNode extends AudioNode {\n    coneInnerAngle: number;\n    coneOuterAngle: number;\n    coneOuterGain: number;\n    distanceModel: DistanceModelType;\n    maxDistance: number;\n    panningModel: PanningModelType;\n    refDistance: number;\n    rolloffFactor: number;\n    setOrientation(x: number, y: number, z: number): void;\n    setPosition(x: number, y: number, z: number): void;\n    setVelocity(x: number, y: number, z: number): void;\n}\n\ndeclare var PannerNode: {\n    prototype: PannerNode;\n    new(): PannerNode;\n};\n\ninterface Path2D extends Object, CanvasPathMethods {\n}\n\ndeclare var Path2D: {\n    prototype: Path2D;\n    new(path?: Path2D): Path2D;\n};\n\ninterface PaymentAddress {\n    readonly addressLine: string[];\n    readonly city: string;\n    readonly country: string;\n    readonly dependentLocality: string;\n    readonly languageCode: string;\n    readonly organization: string;\n    readonly phone: string;\n    readonly postalCode: string;\n    readonly recipient: string;\n    readonly region: string;\n    readonly sortingCode: string;\n    toJSON(): any;\n}\n\ndeclare var PaymentAddress: {\n    prototype: PaymentAddress;\n    new(): PaymentAddress;\n};\n\ninterface PaymentRequestEventMap {\n    "shippingaddresschange": Event;\n    "shippingoptionchange": Event;\n}\n\ninterface PaymentRequest extends EventTarget {\n    onshippingaddresschange: (this: PaymentRequest, ev: Event) => any;\n    onshippingoptionchange: (this: PaymentRequest, ev: Event) => any;\n    readonly shippingAddress: PaymentAddress | null;\n    readonly shippingOption: string | null;\n    readonly shippingType: PaymentShippingType | null;\n    abort(): Promise<void>;\n    show(): Promise<PaymentResponse>;\n    addEventListener<K extends keyof PaymentRequestEventMap>(type: K, listener: (this: PaymentRequest, ev: PaymentRequestEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var PaymentRequest: {\n    prototype: PaymentRequest;\n    new(methodData: PaymentMethodData[], details: PaymentDetails, options?: PaymentOptions): PaymentRequest;\n};\n\ninterface PaymentRequestUpdateEvent extends Event {\n    updateWith(d: Promise<PaymentDetails>): void;\n}\n\ndeclare var PaymentRequestUpdateEvent: {\n    prototype: PaymentRequestUpdateEvent;\n    new(type: string, eventInitDict?: PaymentRequestUpdateEventInit): PaymentRequestUpdateEvent;\n};\n\ninterface PaymentResponse {\n    readonly details: any;\n    readonly methodName: string;\n    readonly payerEmail: string | null;\n    readonly payerName: string | null;\n    readonly payerPhone: string | null;\n    readonly shippingAddress: PaymentAddress | null;\n    readonly shippingOption: string | null;\n    complete(result?: PaymentComplete): Promise<void>;\n    toJSON(): any;\n}\n\ndeclare var PaymentResponse: {\n    prototype: PaymentResponse;\n    new(): PaymentResponse;\n};\n\ninterface Performance {\n    readonly navigation: PerformanceNavigation;\n    readonly timing: PerformanceTiming;\n    clearMarks(markName?: string): void;\n    clearMeasures(measureName?: string): void;\n    clearResourceTimings(): void;\n    getEntries(): any;\n    getEntriesByName(name: string, entryType?: string): any;\n    getEntriesByType(entryType: string): any;\n    getMarks(markName?: string): any;\n    getMeasures(measureName?: string): any;\n    mark(markName: string): void;\n    measure(measureName: string, startMarkName?: string, endMarkName?: string): void;\n    now(): number;\n    setResourceTimingBufferSize(maxSize: number): void;\n    toJSON(): any;\n}\n\ndeclare var Performance: {\n    prototype: Performance;\n    new(): Performance;\n};\n\ninterface PerformanceEntry {\n    readonly duration: number;\n    readonly entryType: string;\n    readonly name: string;\n    readonly startTime: number;\n}\n\ndeclare var PerformanceEntry: {\n    prototype: PerformanceEntry;\n    new(): PerformanceEntry;\n};\n\ninterface PerformanceMark extends PerformanceEntry {\n}\n\ndeclare var PerformanceMark: {\n    prototype: PerformanceMark;\n    new(): PerformanceMark;\n};\n\ninterface PerformanceMeasure extends PerformanceEntry {\n}\n\ndeclare var PerformanceMeasure: {\n    prototype: PerformanceMeasure;\n    new(): PerformanceMeasure;\n};\n\ninterface PerformanceNavigation {\n    readonly redirectCount: number;\n    readonly type: number;\n    toJSON(): any;\n    readonly TYPE_BACK_FORWARD: number;\n    readonly TYPE_NAVIGATE: number;\n    readonly TYPE_RELOAD: number;\n    readonly TYPE_RESERVED: number;\n}\n\ndeclare var PerformanceNavigation: {\n    prototype: PerformanceNavigation;\n    new(): PerformanceNavigation;\n    readonly TYPE_BACK_FORWARD: number;\n    readonly TYPE_NAVIGATE: number;\n    readonly TYPE_RELOAD: number;\n    readonly TYPE_RESERVED: number;\n};\n\ninterface PerformanceNavigationTiming extends PerformanceEntry {\n    readonly connectEnd: number;\n    readonly connectStart: number;\n    readonly domainLookupEnd: number;\n    readonly domainLookupStart: number;\n    readonly domComplete: number;\n    readonly domContentLoadedEventEnd: number;\n    readonly domContentLoadedEventStart: number;\n    readonly domInteractive: number;\n    readonly domLoading: number;\n    readonly fetchStart: number;\n    readonly loadEventEnd: number;\n    readonly loadEventStart: number;\n    readonly navigationStart: number;\n    readonly redirectCount: number;\n    readonly redirectEnd: number;\n    readonly redirectStart: number;\n    readonly requestStart: number;\n    readonly responseEnd: number;\n    readonly responseStart: number;\n    readonly type: NavigationType;\n    readonly unloadEventEnd: number;\n    readonly unloadEventStart: number;\n}\n\ndeclare var PerformanceNavigationTiming: {\n    prototype: PerformanceNavigationTiming;\n    new(): PerformanceNavigationTiming;\n};\n\ninterface PerformanceResourceTiming extends PerformanceEntry {\n    readonly connectEnd: number;\n    readonly connectStart: number;\n    readonly domainLookupEnd: number;\n    readonly domainLookupStart: number;\n    readonly fetchStart: number;\n    readonly initiatorType: string;\n    readonly redirectEnd: number;\n    readonly redirectStart: number;\n    readonly requestStart: number;\n    readonly responseEnd: number;\n    readonly responseStart: number;\n}\n\ndeclare var PerformanceResourceTiming: {\n    prototype: PerformanceResourceTiming;\n    new(): PerformanceResourceTiming;\n};\n\ninterface PerformanceTiming {\n    readonly connectEnd: number;\n    readonly connectStart: number;\n    readonly domainLookupEnd: number;\n    readonly domainLookupStart: number;\n    readonly domComplete: number;\n    readonly domContentLoadedEventEnd: number;\n    readonly domContentLoadedEventStart: number;\n    readonly domInteractive: number;\n    readonly domLoading: number;\n    readonly fetchStart: number;\n    readonly loadEventEnd: number;\n    readonly loadEventStart: number;\n    readonly msFirstPaint: number;\n    readonly navigationStart: number;\n    readonly redirectEnd: number;\n    readonly redirectStart: number;\n    readonly requestStart: number;\n    readonly responseEnd: number;\n    readonly responseStart: number;\n    readonly unloadEventEnd: number;\n    readonly unloadEventStart: number;\n    readonly secureConnectionStart: number;\n    toJSON(): any;\n}\n\ndeclare var PerformanceTiming: {\n    prototype: PerformanceTiming;\n    new(): PerformanceTiming;\n};\n\ninterface PerfWidgetExternal {\n    readonly activeNetworkRequestCount: number;\n    readonly averageFrameTime: number;\n    readonly averagePaintTime: number;\n    readonly extraInformationEnabled: boolean;\n    readonly independentRenderingEnabled: boolean;\n    readonly irDisablingContentString: string;\n    readonly irStatusAvailable: boolean;\n    readonly maxCpuSpeed: number;\n    readonly paintRequestsPerSecond: number;\n    readonly performanceCounter: number;\n    readonly performanceCounterFrequency: number;\n    addEventListener(eventType: string, callback: Function): void;\n    getMemoryUsage(): number;\n    getProcessCpuUsage(): number;\n    getRecentCpuUsage(last: number | null): any;\n    getRecentFrames(last: number | null): any;\n    getRecentMemoryUsage(last: number | null): any;\n    getRecentPaintRequests(last: number | null): any;\n    removeEventListener(eventType: string, callback: Function): void;\n    repositionWindow(x: number, y: number): void;\n    resizeWindow(width: number, height: number): void;\n}\n\ndeclare var PerfWidgetExternal: {\n    prototype: PerfWidgetExternal;\n    new(): PerfWidgetExternal;\n};\n\ninterface PeriodicWave {\n}\n\ndeclare var PeriodicWave: {\n    prototype: PeriodicWave;\n    new(): PeriodicWave;\n};\n\ninterface PermissionRequest extends DeferredPermissionRequest {\n    readonly state: MSWebViewPermissionState;\n    defer(): void;\n}\n\ndeclare var PermissionRequest: {\n    prototype: PermissionRequest;\n    new(): PermissionRequest;\n};\n\ninterface PermissionRequestedEvent extends Event {\n    readonly permissionRequest: PermissionRequest;\n}\n\ndeclare var PermissionRequestedEvent: {\n    prototype: PermissionRequestedEvent;\n    new(): PermissionRequestedEvent;\n};\n\ninterface Plugin {\n    readonly description: string;\n    readonly filename: string;\n    readonly length: number;\n    readonly name: string;\n    readonly version: string;\n    item(index: number): MimeType;\n    namedItem(type: string): MimeType;\n    [index: number]: MimeType;\n}\n\ndeclare var Plugin: {\n    prototype: Plugin;\n    new(): Plugin;\n};\n\ninterface PluginArray {\n    readonly length: number;\n    item(index: number): Plugin;\n    namedItem(name: string): Plugin;\n    refresh(reload?: boolean): void;\n    [index: number]: Plugin;\n}\n\ndeclare var PluginArray: {\n    prototype: PluginArray;\n    new(): PluginArray;\n};\n\ninterface PointerEvent extends MouseEvent {\n    readonly currentPoint: any;\n    readonly height: number;\n    readonly hwTimestamp: number;\n    readonly intermediatePoints: any;\n    readonly isPrimary: boolean;\n    readonly pointerId: number;\n    readonly pointerType: any;\n    readonly pressure: number;\n    readonly rotation: number;\n    readonly tiltX: number;\n    readonly tiltY: number;\n    readonly width: number;\n    getCurrentPoint(element: Element): void;\n    getIntermediatePoints(element: Element): void;\n    initPointerEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, ctrlKeyArg: boolean, altKeyArg: boolean, shiftKeyArg: boolean, metaKeyArg: boolean, buttonArg: number, relatedTargetArg: EventTarget, offsetXArg: number, offsetYArg: number, widthArg: number, heightArg: number, pressure: number, rotation: number, tiltX: number, tiltY: number, pointerIdArg: number, pointerType: any, hwTimestampArg: number, isPrimary: boolean): void;\n}\n\ndeclare var PointerEvent: {\n    prototype: PointerEvent;\n    new(typeArg: string, eventInitDict?: PointerEventInit): PointerEvent;\n};\n\ninterface PopStateEvent extends Event {\n    readonly state: any;\n    initPopStateEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, stateArg: any): void;\n}\n\ndeclare var PopStateEvent: {\n    prototype: PopStateEvent;\n    new(typeArg: string, eventInitDict?: PopStateEventInit): PopStateEvent;\n};\n\ninterface Position {\n    readonly coords: Coordinates;\n    readonly timestamp: number;\n}\n\ndeclare var Position: {\n    prototype: Position;\n    new(): Position;\n};\n\ninterface PositionError {\n    readonly code: number;\n    readonly message: string;\n    toString(): string;\n    readonly PERMISSION_DENIED: number;\n    readonly POSITION_UNAVAILABLE: number;\n    readonly TIMEOUT: number;\n}\n\ndeclare var PositionError: {\n    prototype: PositionError;\n    new(): PositionError;\n    readonly PERMISSION_DENIED: number;\n    readonly POSITION_UNAVAILABLE: number;\n    readonly TIMEOUT: number;\n};\n\ninterface ProcessingInstruction extends CharacterData {\n    readonly target: string;\n}\n\ndeclare var ProcessingInstruction: {\n    prototype: ProcessingInstruction;\n    new(): ProcessingInstruction;\n};\n\ninterface ProgressEvent extends Event {\n    readonly lengthComputable: boolean;\n    readonly loaded: number;\n    readonly total: number;\n    initProgressEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, lengthComputableArg: boolean, loadedArg: number, totalArg: number): void;\n}\n\ndeclare var ProgressEvent: {\n    prototype: ProgressEvent;\n    new(type: string, eventInitDict?: ProgressEventInit): ProgressEvent;\n};\n\ninterface PushManager {\n    getSubscription(): Promise<PushSubscription>;\n    permissionState(options?: PushSubscriptionOptionsInit): Promise<PushPermissionState>;\n    subscribe(options?: PushSubscriptionOptionsInit): Promise<PushSubscription>;\n}\n\ndeclare var PushManager: {\n    prototype: PushManager;\n    new(): PushManager;\n};\n\ninterface PushSubscription {\n    readonly endpoint: USVString;\n    readonly options: PushSubscriptionOptions;\n    getKey(name: PushEncryptionKeyName): ArrayBuffer | null;\n    toJSON(): any;\n    unsubscribe(): Promise<boolean>;\n}\n\ndeclare var PushSubscription: {\n    prototype: PushSubscription;\n    new(): PushSubscription;\n};\n\ninterface PushSubscriptionOptions {\n    readonly applicationServerKey: ArrayBuffer | null;\n    readonly userVisibleOnly: boolean;\n}\n\ndeclare var PushSubscriptionOptions: {\n    prototype: PushSubscriptionOptions;\n    new(): PushSubscriptionOptions;\n};\n\ninterface Range {\n    readonly collapsed: boolean;\n    readonly commonAncestorContainer: Node;\n    readonly endContainer: Node;\n    readonly endOffset: number;\n    readonly startContainer: Node;\n    readonly startOffset: number;\n    cloneContents(): DocumentFragment;\n    cloneRange(): Range;\n    collapse(toStart: boolean): void;\n    compareBoundaryPoints(how: number, sourceRange: Range): number;\n    createContextualFragment(fragment: string): DocumentFragment;\n    deleteContents(): void;\n    detach(): void;\n    expand(Unit: ExpandGranularity): boolean;\n    extractContents(): DocumentFragment;\n    getBoundingClientRect(): ClientRect;\n    getClientRects(): ClientRectList;\n    insertNode(newNode: Node): void;\n    selectNode(refNode: Node): void;\n    selectNodeContents(refNode: Node): void;\n    setEnd(refNode: Node, offset: number): void;\n    setEndAfter(refNode: Node): void;\n    setEndBefore(refNode: Node): void;\n    setStart(refNode: Node, offset: number): void;\n    setStartAfter(refNode: Node): void;\n    setStartBefore(refNode: Node): void;\n    surroundContents(newParent: Node): void;\n    toString(): string;\n    readonly END_TO_END: number;\n    readonly END_TO_START: number;\n    readonly START_TO_END: number;\n    readonly START_TO_START: number;\n}\n\ndeclare var Range: {\n    prototype: Range;\n    new(): Range;\n    readonly END_TO_END: number;\n    readonly END_TO_START: number;\n    readonly START_TO_END: number;\n    readonly START_TO_START: number;\n};\n\ninterface ReadableStream {\n    readonly locked: boolean;\n    cancel(): Promise<void>;\n    getReader(): ReadableStreamReader;\n}\n\ndeclare var ReadableStream: {\n    prototype: ReadableStream;\n    new(): ReadableStream;\n};\n\ninterface ReadableStreamReader {\n    cancel(): Promise<void>;\n    read(): Promise<any>;\n    releaseLock(): void;\n}\n\ndeclare var ReadableStreamReader: {\n    prototype: ReadableStreamReader;\n    new(): ReadableStreamReader;\n};\n\ninterface Request extends Object, Body {\n    readonly cache: RequestCache;\n    readonly credentials: RequestCredentials;\n    readonly destination: RequestDestination;\n    readonly headers: Headers;\n    readonly integrity: string;\n    readonly keepalive: boolean;\n    readonly method: string;\n    readonly mode: RequestMode;\n    readonly redirect: RequestRedirect;\n    readonly referrer: string;\n    readonly referrerPolicy: ReferrerPolicy;\n    readonly type: RequestType;\n    readonly url: string;\n    clone(): Request;\n}\n\ndeclare var Request: {\n    prototype: Request;\n    new(input: Request | string, init?: RequestInit): Request;\n};\n\ninterface Response extends Object, Body {\n    readonly body: ReadableStream | null;\n    readonly headers: Headers;\n    readonly ok: boolean;\n    readonly status: number;\n    readonly statusText: string;\n    readonly type: ResponseType;\n    readonly url: string;\n    clone(): Response;\n}\n\ndeclare var Response: {\n    prototype: Response;\n    new(body?: any, init?: ResponseInit): Response;\n    error: () => Response;\n    redirect: (url: string, status?: number) => Response;\n};\n\ninterface RTCDtlsTransportEventMap {\n    "dtlsstatechange": RTCDtlsTransportStateChangedEvent;\n    "error": Event;\n}\n\ninterface RTCDtlsTransport extends RTCStatsProvider {\n    ondtlsstatechange: ((this: RTCDtlsTransport, ev: RTCDtlsTransportStateChangedEvent) => any) | null;\n    onerror: ((this: RTCDtlsTransport, ev: Event) => any) | null;\n    readonly state: RTCDtlsTransportState;\n    readonly transport: RTCIceTransport;\n    getLocalParameters(): RTCDtlsParameters;\n    getRemoteCertificates(): ArrayBuffer[];\n    getRemoteParameters(): RTCDtlsParameters | null;\n    start(remoteParameters: RTCDtlsParameters): void;\n    stop(): void;\n    addEventListener<K extends keyof RTCDtlsTransportEventMap>(type: K, listener: (this: RTCDtlsTransport, ev: RTCDtlsTransportEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var RTCDtlsTransport: {\n    prototype: RTCDtlsTransport;\n    new(transport: RTCIceTransport): RTCDtlsTransport;\n};\n\ninterface RTCDtlsTransportStateChangedEvent extends Event {\n    readonly state: RTCDtlsTransportState;\n}\n\ndeclare var RTCDtlsTransportStateChangedEvent: {\n    prototype: RTCDtlsTransportStateChangedEvent;\n    new(): RTCDtlsTransportStateChangedEvent;\n};\n\ninterface RTCDtmfSenderEventMap {\n    "tonechange": RTCDTMFToneChangeEvent;\n}\n\ninterface RTCDtmfSender extends EventTarget {\n    readonly canInsertDTMF: boolean;\n    readonly duration: number;\n    readonly interToneGap: number;\n    ontonechange: (this: RTCDtmfSender, ev: RTCDTMFToneChangeEvent) => any;\n    readonly sender: RTCRtpSender;\n    readonly toneBuffer: string;\n    insertDTMF(tones: string, duration?: number, interToneGap?: number): void;\n    addEventListener<K extends keyof RTCDtmfSenderEventMap>(type: K, listener: (this: RTCDtmfSender, ev: RTCDtmfSenderEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var RTCDtmfSender: {\n    prototype: RTCDtmfSender;\n    new(sender: RTCRtpSender): RTCDtmfSender;\n};\n\ninterface RTCDTMFToneChangeEvent extends Event {\n    readonly tone: string;\n}\n\ndeclare var RTCDTMFToneChangeEvent: {\n    prototype: RTCDTMFToneChangeEvent;\n    new(typeArg: string, eventInitDict: RTCDTMFToneChangeEventInit): RTCDTMFToneChangeEvent;\n};\n\ninterface RTCIceCandidate {\n    candidate: string | null;\n    sdpMid: string | null;\n    sdpMLineIndex: number | null;\n    toJSON(): any;\n}\n\ndeclare var RTCIceCandidate: {\n    prototype: RTCIceCandidate;\n    new(candidateInitDict?: RTCIceCandidateInit): RTCIceCandidate;\n};\n\ninterface RTCIceCandidatePairChangedEvent extends Event {\n    readonly pair: RTCIceCandidatePair;\n}\n\ndeclare var RTCIceCandidatePairChangedEvent: {\n    prototype: RTCIceCandidatePairChangedEvent;\n    new(): RTCIceCandidatePairChangedEvent;\n};\n\ninterface RTCIceGathererEventMap {\n    "error": Event;\n    "localcandidate": RTCIceGathererEvent;\n}\n\ninterface RTCIceGatherer extends RTCStatsProvider {\n    readonly component: RTCIceComponent;\n    onerror: ((this: RTCIceGatherer, ev: Event) => any) | null;\n    onlocalcandidate: ((this: RTCIceGatherer, ev: RTCIceGathererEvent) => any) | null;\n    createAssociatedGatherer(): RTCIceGatherer;\n    getLocalCandidates(): RTCIceCandidateDictionary[];\n    getLocalParameters(): RTCIceParameters;\n    addEventListener<K extends keyof RTCIceGathererEventMap>(type: K, listener: (this: RTCIceGatherer, ev: RTCIceGathererEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var RTCIceGatherer: {\n    prototype: RTCIceGatherer;\n    new(options: RTCIceGatherOptions): RTCIceGatherer;\n};\n\ninterface RTCIceGathererEvent extends Event {\n    readonly candidate: RTCIceCandidateDictionary | RTCIceCandidateComplete;\n}\n\ndeclare var RTCIceGathererEvent: {\n    prototype: RTCIceGathererEvent;\n    new(): RTCIceGathererEvent;\n};\n\ninterface RTCIceTransportEventMap {\n    "candidatepairchange": RTCIceCandidatePairChangedEvent;\n    "icestatechange": RTCIceTransportStateChangedEvent;\n}\n\ninterface RTCIceTransport extends RTCStatsProvider {\n    readonly component: RTCIceComponent;\n    readonly iceGatherer: RTCIceGatherer | null;\n    oncandidatepairchange: ((this: RTCIceTransport, ev: RTCIceCandidatePairChangedEvent) => any) | null;\n    onicestatechange: ((this: RTCIceTransport, ev: RTCIceTransportStateChangedEvent) => any) | null;\n    readonly role: RTCIceRole;\n    readonly state: RTCIceTransportState;\n    addRemoteCandidate(remoteCandidate: RTCIceCandidateDictionary | RTCIceCandidateComplete): void;\n    createAssociatedTransport(): RTCIceTransport;\n    getNominatedCandidatePair(): RTCIceCandidatePair | null;\n    getRemoteCandidates(): RTCIceCandidateDictionary[];\n    getRemoteParameters(): RTCIceParameters | null;\n    setRemoteCandidates(remoteCandidates: RTCIceCandidateDictionary[]): void;\n    start(gatherer: RTCIceGatherer, remoteParameters: RTCIceParameters, role?: RTCIceRole): void;\n    stop(): void;\n    addEventListener<K extends keyof RTCIceTransportEventMap>(type: K, listener: (this: RTCIceTransport, ev: RTCIceTransportEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var RTCIceTransport: {\n    prototype: RTCIceTransport;\n    new(): RTCIceTransport;\n};\n\ninterface RTCIceTransportStateChangedEvent extends Event {\n    readonly state: RTCIceTransportState;\n}\n\ndeclare var RTCIceTransportStateChangedEvent: {\n    prototype: RTCIceTransportStateChangedEvent;\n    new(): RTCIceTransportStateChangedEvent;\n};\n\ninterface RTCPeerConnectionEventMap {\n    "addstream": MediaStreamEvent;\n    "icecandidate": RTCPeerConnectionIceEvent;\n    "iceconnectionstatechange": Event;\n    "icegatheringstatechange": Event;\n    "negotiationneeded": Event;\n    "removestream": MediaStreamEvent;\n    "signalingstatechange": Event;\n}\n\ninterface RTCPeerConnection extends EventTarget {\n    readonly canTrickleIceCandidates: boolean | null;\n    readonly iceConnectionState: RTCIceConnectionState;\n    readonly iceGatheringState: RTCIceGatheringState;\n    readonly localDescription: RTCSessionDescription | null;\n    onaddstream: (this: RTCPeerConnection, ev: MediaStreamEvent) => any;\n    onicecandidate: (this: RTCPeerConnection, ev: RTCPeerConnectionIceEvent) => any;\n    oniceconnectionstatechange: (this: RTCPeerConnection, ev: Event) => any;\n    onicegatheringstatechange: (this: RTCPeerConnection, ev: Event) => any;\n    onnegotiationneeded: (this: RTCPeerConnection, ev: Event) => any;\n    onremovestream: (this: RTCPeerConnection, ev: MediaStreamEvent) => any;\n    onsignalingstatechange: (this: RTCPeerConnection, ev: Event) => any;\n    readonly remoteDescription: RTCSessionDescription | null;\n    readonly signalingState: RTCSignalingState;\n    addIceCandidate(candidate: RTCIceCandidate, successCallback?: VoidFunction, failureCallback?: RTCPeerConnectionErrorCallback): Promise<void>;\n    addStream(stream: MediaStream): void;\n    close(): void;\n    createAnswer(successCallback?: RTCSessionDescriptionCallback, failureCallback?: RTCPeerConnectionErrorCallback): Promise<RTCSessionDescription>;\n    createOffer(successCallback?: RTCSessionDescriptionCallback, failureCallback?: RTCPeerConnectionErrorCallback, options?: RTCOfferOptions): Promise<RTCSessionDescription>;\n    getConfiguration(): RTCConfiguration;\n    getLocalStreams(): MediaStream[];\n    getRemoteStreams(): MediaStream[];\n    getStats(selector: MediaStreamTrack | null, successCallback?: RTCStatsCallback, failureCallback?: RTCPeerConnectionErrorCallback): Promise<RTCStatsReport>;\n    getStreamById(streamId: string): MediaStream | null;\n    removeStream(stream: MediaStream): void;\n    setLocalDescription(description: RTCSessionDescription, successCallback?: VoidFunction, failureCallback?: RTCPeerConnectionErrorCallback): Promise<void>;\n    setRemoteDescription(description: RTCSessionDescription, successCallback?: VoidFunction, failureCallback?: RTCPeerConnectionErrorCallback): Promise<void>;\n    addEventListener<K extends keyof RTCPeerConnectionEventMap>(type: K, listener: (this: RTCPeerConnection, ev: RTCPeerConnectionEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var RTCPeerConnection: {\n    prototype: RTCPeerConnection;\n    new(configuration: RTCConfiguration): RTCPeerConnection;\n};\n\ninterface RTCPeerConnectionIceEvent extends Event {\n    readonly candidate: RTCIceCandidate;\n}\n\ndeclare var RTCPeerConnectionIceEvent: {\n    prototype: RTCPeerConnectionIceEvent;\n    new(type: string, eventInitDict: RTCPeerConnectionIceEventInit): RTCPeerConnectionIceEvent;\n};\n\ninterface RTCRtpReceiverEventMap {\n    "error": Event;\n}\n\ninterface RTCRtpReceiver extends RTCStatsProvider {\n    onerror: ((this: RTCRtpReceiver, ev: Event) => any) | null;\n    readonly rtcpTransport: RTCDtlsTransport;\n    readonly track: MediaStreamTrack | null;\n    readonly transport: RTCDtlsTransport | RTCSrtpSdesTransport;\n    getContributingSources(): RTCRtpContributingSource[];\n    receive(parameters: RTCRtpParameters): void;\n    requestSendCSRC(csrc: number): void;\n    setTransport(transport: RTCDtlsTransport | RTCSrtpSdesTransport, rtcpTransport?: RTCDtlsTransport): void;\n    stop(): void;\n    addEventListener<K extends keyof RTCRtpReceiverEventMap>(type: K, listener: (this: RTCRtpReceiver, ev: RTCRtpReceiverEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var RTCRtpReceiver: {\n    prototype: RTCRtpReceiver;\n    new(transport: RTCDtlsTransport | RTCSrtpSdesTransport, kind: string, rtcpTransport?: RTCDtlsTransport): RTCRtpReceiver;\n    getCapabilities(kind?: string): RTCRtpCapabilities;\n};\n\ninterface RTCRtpSenderEventMap {\n    "error": Event;\n    "ssrcconflict": RTCSsrcConflictEvent;\n}\n\ninterface RTCRtpSender extends RTCStatsProvider {\n    onerror: ((this: RTCRtpSender, ev: Event) => any) | null;\n    onssrcconflict: ((this: RTCRtpSender, ev: RTCSsrcConflictEvent) => any) | null;\n    readonly rtcpTransport: RTCDtlsTransport;\n    readonly track: MediaStreamTrack;\n    readonly transport: RTCDtlsTransport | RTCSrtpSdesTransport;\n    send(parameters: RTCRtpParameters): void;\n    setTrack(track: MediaStreamTrack): void;\n    setTransport(transport: RTCDtlsTransport | RTCSrtpSdesTransport, rtcpTransport?: RTCDtlsTransport): void;\n    stop(): void;\n    addEventListener<K extends keyof RTCRtpSenderEventMap>(type: K, listener: (this: RTCRtpSender, ev: RTCRtpSenderEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var RTCRtpSender: {\n    prototype: RTCRtpSender;\n    new(track: MediaStreamTrack, transport: RTCDtlsTransport | RTCSrtpSdesTransport, rtcpTransport?: RTCDtlsTransport): RTCRtpSender;\n    getCapabilities(kind?: string): RTCRtpCapabilities;\n};\n\ninterface RTCSessionDescription {\n    sdp: string | null;\n    type: RTCSdpType | null;\n    toJSON(): any;\n}\n\ndeclare var RTCSessionDescription: {\n    prototype: RTCSessionDescription;\n    new(descriptionInitDict?: RTCSessionDescriptionInit): RTCSessionDescription;\n};\n\ninterface RTCSrtpSdesTransportEventMap {\n    "error": Event;\n}\n\ninterface RTCSrtpSdesTransport extends EventTarget {\n    onerror: ((this: RTCSrtpSdesTransport, ev: Event) => any) | null;\n    readonly transport: RTCIceTransport;\n    addEventListener<K extends keyof RTCSrtpSdesTransportEventMap>(type: K, listener: (this: RTCSrtpSdesTransport, ev: RTCSrtpSdesTransportEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var RTCSrtpSdesTransport: {\n    prototype: RTCSrtpSdesTransport;\n    new(transport: RTCIceTransport, encryptParameters: RTCSrtpSdesParameters, decryptParameters: RTCSrtpSdesParameters): RTCSrtpSdesTransport;\n    getLocalParameters(): RTCSrtpSdesParameters[];\n};\n\ninterface RTCSsrcConflictEvent extends Event {\n    readonly ssrc: number;\n}\n\ndeclare var RTCSsrcConflictEvent: {\n    prototype: RTCSsrcConflictEvent;\n    new(): RTCSsrcConflictEvent;\n};\n\ninterface RTCStatsProvider extends EventTarget {\n    getStats(): Promise<RTCStatsReport>;\n    msGetStats(): Promise<RTCStatsReport>;\n}\n\ndeclare var RTCStatsProvider: {\n    prototype: RTCStatsProvider;\n    new(): RTCStatsProvider;\n};\n\ninterface ScopedCredential {\n    readonly id: ArrayBuffer;\n    readonly type: ScopedCredentialType;\n}\n\ndeclare var ScopedCredential: {\n    prototype: ScopedCredential;\n    new(): ScopedCredential;\n};\n\ninterface ScopedCredentialInfo {\n    readonly credential: ScopedCredential;\n    readonly publicKey: CryptoKey;\n}\n\ndeclare var ScopedCredentialInfo: {\n    prototype: ScopedCredentialInfo;\n    new(): ScopedCredentialInfo;\n};\n\ninterface ScreenEventMap {\n    "MSOrientationChange": Event;\n}\n\ninterface Screen extends EventTarget {\n    readonly availHeight: number;\n    readonly availWidth: number;\n    bufferDepth: number;\n    readonly colorDepth: number;\n    readonly deviceXDPI: number;\n    readonly deviceYDPI: number;\n    readonly fontSmoothingEnabled: boolean;\n    readonly height: number;\n    readonly logicalXDPI: number;\n    readonly logicalYDPI: number;\n    readonly msOrientation: string;\n    onmsorientationchange: (this: Screen, ev: Event) => any;\n    readonly pixelDepth: number;\n    readonly systemXDPI: number;\n    readonly systemYDPI: number;\n    readonly width: number;\n    msLockOrientation(orientations: string | string[]): boolean;\n    msUnlockOrientation(): void;\n    addEventListener<K extends keyof ScreenEventMap>(type: K, listener: (this: Screen, ev: ScreenEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var Screen: {\n    prototype: Screen;\n    new(): Screen;\n};\n\ninterface ScriptNotifyEvent extends Event {\n    readonly callingUri: string;\n    readonly value: string;\n}\n\ndeclare var ScriptNotifyEvent: {\n    prototype: ScriptNotifyEvent;\n    new(): ScriptNotifyEvent;\n};\n\ninterface ScriptProcessorNodeEventMap {\n    "audioprocess": AudioProcessingEvent;\n}\n\ninterface ScriptProcessorNode extends AudioNode {\n    readonly bufferSize: number;\n    onaudioprocess: (this: ScriptProcessorNode, ev: AudioProcessingEvent) => any;\n    addEventListener<K extends keyof ScriptProcessorNodeEventMap>(type: K, listener: (this: ScriptProcessorNode, ev: ScriptProcessorNodeEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var ScriptProcessorNode: {\n    prototype: ScriptProcessorNode;\n    new(): ScriptProcessorNode;\n};\n\ninterface Selection {\n    readonly anchorNode: Node;\n    readonly anchorOffset: number;\n    readonly baseNode: Node;\n    readonly baseOffset: number;\n    readonly extentNode: Node;\n    readonly extentOffset: number;\n    readonly focusNode: Node;\n    readonly focusOffset: number;\n    readonly isCollapsed: boolean;\n    readonly rangeCount: number;\n    readonly type: string;\n    addRange(range: Range): void;\n    collapse(parentNode: Node, offset: number): void;\n    collapseToEnd(): void;\n    collapseToStart(): void;\n    containsNode(node: Node, partlyContained: boolean): boolean;\n    deleteFromDocument(): void;\n    empty(): void;\n    extend(newNode: Node, offset: number): void;\n    getRangeAt(index: number): Range;\n    removeAllRanges(): void;\n    removeRange(range: Range): void;\n    selectAllChildren(parentNode: Node): void;\n    setBaseAndExtent(baseNode: Node, baseOffset: number, extentNode: Node, extentOffset: number): void;\n    setPosition(parentNode: Node, offset: number): void;\n    toString(): string;\n}\n\ndeclare var Selection: {\n    prototype: Selection;\n    new(): Selection;\n};\n\ninterface ServiceWorkerEventMap extends AbstractWorkerEventMap {\n    "statechange": Event;\n}\n\ninterface ServiceWorker extends EventTarget, AbstractWorker {\n    onstatechange: (this: ServiceWorker, ev: Event) => any;\n    readonly scriptURL: USVString;\n    readonly state: ServiceWorkerState;\n    postMessage(message: any, transfer?: any[]): void;\n    addEventListener<K extends keyof ServiceWorkerEventMap>(type: K, listener: (this: ServiceWorker, ev: ServiceWorkerEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var ServiceWorker: {\n    prototype: ServiceWorker;\n    new(): ServiceWorker;\n};\n\ninterface ServiceWorkerContainerEventMap {\n    "controllerchange": Event;\n    "message": ServiceWorkerMessageEvent;\n}\n\ninterface ServiceWorkerContainer extends EventTarget {\n    readonly controller: ServiceWorker | null;\n    oncontrollerchange: (this: ServiceWorkerContainer, ev: Event) => any;\n    onmessage: (this: ServiceWorkerContainer, ev: ServiceWorkerMessageEvent) => any;\n    readonly ready: Promise<ServiceWorkerRegistration>;\n    getRegistration(clientURL?: USVString): Promise<any>;\n    getRegistrations(): any;\n    register(scriptURL: USVString, options?: RegistrationOptions): Promise<ServiceWorkerRegistration>;\n    addEventListener<K extends keyof ServiceWorkerContainerEventMap>(type: K, listener: (this: ServiceWorkerContainer, ev: ServiceWorkerContainerEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var ServiceWorkerContainer: {\n    prototype: ServiceWorkerContainer;\n    new(): ServiceWorkerContainer;\n};\n\ninterface ServiceWorkerMessageEvent extends Event {\n    readonly data: any;\n    readonly lastEventId: string;\n    readonly origin: string;\n    readonly ports: MessagePort[] | null;\n    readonly source: ServiceWorker | MessagePort | null;\n}\n\ndeclare var ServiceWorkerMessageEvent: {\n    prototype: ServiceWorkerMessageEvent;\n    new(type: string, eventInitDict?: ServiceWorkerMessageEventInit): ServiceWorkerMessageEvent;\n};\n\ninterface ServiceWorkerRegistrationEventMap {\n    "updatefound": Event;\n}\n\ninterface ServiceWorkerRegistration extends EventTarget {\n    readonly active: ServiceWorker | null;\n    readonly installing: ServiceWorker | null;\n    onupdatefound: (this: ServiceWorkerRegistration, ev: Event) => any;\n    readonly pushManager: PushManager;\n    readonly scope: USVString;\n    readonly sync: SyncManager;\n    readonly waiting: ServiceWorker | null;\n    getNotifications(filter?: GetNotificationOptions): any;\n    showNotification(title: string, options?: NotificationOptions): Promise<void>;\n    unregister(): Promise<boolean>;\n    update(): Promise<void>;\n    addEventListener<K extends keyof ServiceWorkerRegistrationEventMap>(type: K, listener: (this: ServiceWorkerRegistration, ev: ServiceWorkerRegistrationEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var ServiceWorkerRegistration: {\n    prototype: ServiceWorkerRegistration;\n    new(): ServiceWorkerRegistration;\n};\n\ninterface SourceBuffer extends EventTarget {\n    appendWindowEnd: number;\n    appendWindowStart: number;\n    readonly audioTracks: AudioTrackList;\n    readonly buffered: TimeRanges;\n    mode: AppendMode;\n    timestampOffset: number;\n    readonly updating: boolean;\n    readonly videoTracks: VideoTrackList;\n    abort(): void;\n    appendBuffer(data: ArrayBuffer | ArrayBufferView): void;\n    appendStream(stream: MSStream, maxSize?: number): void;\n    remove(start: number, end: number): void;\n}\n\ndeclare var SourceBuffer: {\n    prototype: SourceBuffer;\n    new(): SourceBuffer;\n};\n\ninterface SourceBufferList extends EventTarget {\n    readonly length: number;\n    item(index: number): SourceBuffer;\n    [index: number]: SourceBuffer;\n}\n\ndeclare var SourceBufferList: {\n    prototype: SourceBufferList;\n    new(): SourceBufferList;\n};\n\ninterface SpeechSynthesisEventMap {\n    "voiceschanged": Event;\n}\n\ninterface SpeechSynthesis extends EventTarget {\n    onvoiceschanged: (this: SpeechSynthesis, ev: Event) => any;\n    readonly paused: boolean;\n    readonly pending: boolean;\n    readonly speaking: boolean;\n    cancel(): void;\n    getVoices(): SpeechSynthesisVoice[];\n    pause(): void;\n    resume(): void;\n    speak(utterance: SpeechSynthesisUtterance): void;\n    addEventListener<K extends keyof SpeechSynthesisEventMap>(type: K, listener: (this: SpeechSynthesis, ev: SpeechSynthesisEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SpeechSynthesis: {\n    prototype: SpeechSynthesis;\n    new(): SpeechSynthesis;\n};\n\ninterface SpeechSynthesisEvent extends Event {\n    readonly charIndex: number;\n    readonly elapsedTime: number;\n    readonly name: string;\n    readonly utterance: SpeechSynthesisUtterance | null;\n}\n\ndeclare var SpeechSynthesisEvent: {\n    prototype: SpeechSynthesisEvent;\n    new(type: string, eventInitDict?: SpeechSynthesisEventInit): SpeechSynthesisEvent;\n};\n\ninterface SpeechSynthesisUtteranceEventMap {\n    "boundary": Event;\n    "end": Event;\n    "error": Event;\n    "mark": Event;\n    "pause": Event;\n    "resume": Event;\n    "start": Event;\n}\n\ninterface SpeechSynthesisUtterance extends EventTarget {\n    lang: string;\n    onboundary: (this: SpeechSynthesisUtterance, ev: Event) => any;\n    onend: (this: SpeechSynthesisUtterance, ev: Event) => any;\n    onerror: (this: SpeechSynthesisUtterance, ev: Event) => any;\n    onmark: (this: SpeechSynthesisUtterance, ev: Event) => any;\n    onpause: (this: SpeechSynthesisUtterance, ev: Event) => any;\n    onresume: (this: SpeechSynthesisUtterance, ev: Event) => any;\n    onstart: (this: SpeechSynthesisUtterance, ev: Event) => any;\n    pitch: number;\n    rate: number;\n    text: string;\n    voice: SpeechSynthesisVoice;\n    volume: number;\n    addEventListener<K extends keyof SpeechSynthesisUtteranceEventMap>(type: K, listener: (this: SpeechSynthesisUtterance, ev: SpeechSynthesisUtteranceEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SpeechSynthesisUtterance: {\n    prototype: SpeechSynthesisUtterance;\n    new(text?: string): SpeechSynthesisUtterance;\n};\n\ninterface SpeechSynthesisVoice {\n    readonly default: boolean;\n    readonly lang: string;\n    readonly localService: boolean;\n    readonly name: string;\n    readonly voiceURI: string;\n}\n\ndeclare var SpeechSynthesisVoice: {\n    prototype: SpeechSynthesisVoice;\n    new(): SpeechSynthesisVoice;\n};\n\ninterface StereoPannerNode extends AudioNode {\n    readonly pan: AudioParam;\n}\n\ndeclare var StereoPannerNode: {\n    prototype: StereoPannerNode;\n    new(): StereoPannerNode;\n};\n\ninterface Storage {\n    readonly length: number;\n    clear(): void;\n    getItem(key: string): string | null;\n    key(index: number): string | null;\n    removeItem(key: string): void;\n    setItem(key: string, data: string): void;\n    [key: string]: any;\n    [index: number]: string;\n}\n\ndeclare var Storage: {\n    prototype: Storage;\n    new(): Storage;\n};\n\ninterface StorageEvent extends Event {\n    readonly url: string;\n    key?: string;\n    oldValue?: string;\n    newValue?: string;\n    storageArea?: Storage;\n}\n\ndeclare var StorageEvent: {\n    prototype: StorageEvent;\n    new (type: string, eventInitDict?: StorageEventInit): StorageEvent;\n};\n\ninterface StyleMedia {\n    readonly type: string;\n    matchMedium(mediaquery: string): boolean;\n}\n\ndeclare var StyleMedia: {\n    prototype: StyleMedia;\n    new(): StyleMedia;\n};\n\ninterface StyleSheet {\n    disabled: boolean;\n    readonly href: string;\n    readonly media: MediaList;\n    readonly ownerNode: Node;\n    readonly parentStyleSheet: StyleSheet;\n    readonly title: string;\n    readonly type: string;\n}\n\ndeclare var StyleSheet: {\n    prototype: StyleSheet;\n    new(): StyleSheet;\n};\n\ninterface StyleSheetList {\n    readonly length: number;\n    item(index?: number): StyleSheet;\n    [index: number]: StyleSheet;\n}\n\ndeclare var StyleSheetList: {\n    prototype: StyleSheetList;\n    new(): StyleSheetList;\n};\n\ninterface StyleSheetPageList {\n    readonly length: number;\n    item(index: number): CSSPageRule;\n    [index: number]: CSSPageRule;\n}\n\ndeclare var StyleSheetPageList: {\n    prototype: StyleSheetPageList;\n    new(): StyleSheetPageList;\n};\n\ninterface SubtleCrypto {\n    decrypt(algorithm: string | RsaOaepParams | AesCtrParams | AesCbcParams | AesCmacParams | AesGcmParams | AesCfbParams, key: CryptoKey, data: BufferSource): PromiseLike<ArrayBuffer>;\n    deriveBits(algorithm: string | EcdhKeyDeriveParams | DhKeyDeriveParams | ConcatParams | HkdfCtrParams | Pbkdf2Params, baseKey: CryptoKey, length: number): PromiseLike<ArrayBuffer>;\n    deriveKey(algorithm: string | EcdhKeyDeriveParams | DhKeyDeriveParams | ConcatParams | HkdfCtrParams | Pbkdf2Params, baseKey: CryptoKey, derivedKeyType: string | AesDerivedKeyParams | HmacImportParams | ConcatParams | HkdfCtrParams | Pbkdf2Params, extractable: boolean, keyUsages: string[]): PromiseLike<CryptoKey>;\n    digest(algorithm: AlgorithmIdentifier, data: BufferSource): PromiseLike<ArrayBuffer>;\n    encrypt(algorithm: string | RsaOaepParams | AesCtrParams | AesCbcParams | AesCmacParams | AesGcmParams | AesCfbParams, key: CryptoKey, data: BufferSource): PromiseLike<ArrayBuffer>;\n    exportKey(format: "jwk", key: CryptoKey): PromiseLike<JsonWebKey>;\n    exportKey(format: "raw" | "pkcs8" | "spki", key: CryptoKey): PromiseLike<ArrayBuffer>;\n    exportKey(format: string, key: CryptoKey): PromiseLike<JsonWebKey | ArrayBuffer>;\n    generateKey(algorithm: string, extractable: boolean, keyUsages: string[]): PromiseLike<CryptoKeyPair | CryptoKey>;\n    generateKey(algorithm: RsaHashedKeyGenParams | EcKeyGenParams | DhKeyGenParams, extractable: boolean, keyUsages: string[]): PromiseLike<CryptoKeyPair>;\n    generateKey(algorithm: AesKeyGenParams | HmacKeyGenParams | Pbkdf2Params, extractable: boolean, keyUsages: string[]): PromiseLike<CryptoKey>;\n    importKey(format: "jwk", keyData: JsonWebKey, algorithm: string | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | DhImportKeyParams, extractable: boolean, keyUsages: string[]): PromiseLike<CryptoKey>;\n    importKey(format: "raw" | "pkcs8" | "spki", keyData: BufferSource, algorithm: string | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | DhImportKeyParams, extractable: boolean, keyUsages: string[]): PromiseLike<CryptoKey>;\n    importKey(format: string, keyData: JsonWebKey | BufferSource, algorithm: string | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | DhImportKeyParams, extractable: boolean, keyUsages: string[]): PromiseLike<CryptoKey>;\n    sign(algorithm: string | RsaPssParams | EcdsaParams | AesCmacParams, key: CryptoKey, data: BufferSource): PromiseLike<ArrayBuffer>;\n    unwrapKey(format: string, wrappedKey: BufferSource, unwrappingKey: CryptoKey, unwrapAlgorithm: AlgorithmIdentifier, unwrappedKeyAlgorithm: AlgorithmIdentifier, extractable: boolean, keyUsages: string[]): PromiseLike<CryptoKey>;\n    verify(algorithm: string | RsaPssParams | EcdsaParams | AesCmacParams, key: CryptoKey, signature: BufferSource, data: BufferSource): PromiseLike<boolean>;\n    wrapKey(format: string, key: CryptoKey, wrappingKey: CryptoKey, wrapAlgorithm: AlgorithmIdentifier): PromiseLike<ArrayBuffer>;\n}\n\ndeclare var SubtleCrypto: {\n    prototype: SubtleCrypto;\n    new(): SubtleCrypto;\n};\n\ninterface SVGAElement extends SVGGraphicsElement, SVGURIReference {\n    readonly target: SVGAnimatedString;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGAElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGAElement: {\n    prototype: SVGAElement;\n    new(): SVGAElement;\n};\n\ninterface SVGAngle {\n    readonly unitType: number;\n    value: number;\n    valueAsString: string;\n    valueInSpecifiedUnits: number;\n    convertToSpecifiedUnits(unitType: number): void;\n    newValueSpecifiedUnits(unitType: number, valueInSpecifiedUnits: number): void;\n    readonly SVG_ANGLETYPE_DEG: number;\n    readonly SVG_ANGLETYPE_GRAD: number;\n    readonly SVG_ANGLETYPE_RAD: number;\n    readonly SVG_ANGLETYPE_UNKNOWN: number;\n    readonly SVG_ANGLETYPE_UNSPECIFIED: number;\n}\n\ndeclare var SVGAngle: {\n    prototype: SVGAngle;\n    new(): SVGAngle;\n    readonly SVG_ANGLETYPE_DEG: number;\n    readonly SVG_ANGLETYPE_GRAD: number;\n    readonly SVG_ANGLETYPE_RAD: number;\n    readonly SVG_ANGLETYPE_UNKNOWN: number;\n    readonly SVG_ANGLETYPE_UNSPECIFIED: number;\n};\n\ninterface SVGAnimatedAngle {\n    readonly animVal: SVGAngle;\n    readonly baseVal: SVGAngle;\n}\n\ndeclare var SVGAnimatedAngle: {\n    prototype: SVGAnimatedAngle;\n    new(): SVGAnimatedAngle;\n};\n\ninterface SVGAnimatedBoolean {\n    readonly animVal: boolean;\n    baseVal: boolean;\n}\n\ndeclare var SVGAnimatedBoolean: {\n    prototype: SVGAnimatedBoolean;\n    new(): SVGAnimatedBoolean;\n};\n\ninterface SVGAnimatedEnumeration {\n    readonly animVal: number;\n    baseVal: number;\n}\n\ndeclare var SVGAnimatedEnumeration: {\n    prototype: SVGAnimatedEnumeration;\n    new(): SVGAnimatedEnumeration;\n};\n\ninterface SVGAnimatedInteger {\n    readonly animVal: number;\n    baseVal: number;\n}\n\ndeclare var SVGAnimatedInteger: {\n    prototype: SVGAnimatedInteger;\n    new(): SVGAnimatedInteger;\n};\n\ninterface SVGAnimatedLength {\n    readonly animVal: SVGLength;\n    readonly baseVal: SVGLength;\n}\n\ndeclare var SVGAnimatedLength: {\n    prototype: SVGAnimatedLength;\n    new(): SVGAnimatedLength;\n};\n\ninterface SVGAnimatedLengthList {\n    readonly animVal: SVGLengthList;\n    readonly baseVal: SVGLengthList;\n}\n\ndeclare var SVGAnimatedLengthList: {\n    prototype: SVGAnimatedLengthList;\n    new(): SVGAnimatedLengthList;\n};\n\ninterface SVGAnimatedNumber {\n    readonly animVal: number;\n    baseVal: number;\n}\n\ndeclare var SVGAnimatedNumber: {\n    prototype: SVGAnimatedNumber;\n    new(): SVGAnimatedNumber;\n};\n\ninterface SVGAnimatedNumberList {\n    readonly animVal: SVGNumberList;\n    readonly baseVal: SVGNumberList;\n}\n\ndeclare var SVGAnimatedNumberList: {\n    prototype: SVGAnimatedNumberList;\n    new(): SVGAnimatedNumberList;\n};\n\ninterface SVGAnimatedPreserveAspectRatio {\n    readonly animVal: SVGPreserveAspectRatio;\n    readonly baseVal: SVGPreserveAspectRatio;\n}\n\ndeclare var SVGAnimatedPreserveAspectRatio: {\n    prototype: SVGAnimatedPreserveAspectRatio;\n    new(): SVGAnimatedPreserveAspectRatio;\n};\n\ninterface SVGAnimatedRect {\n    readonly animVal: SVGRect;\n    readonly baseVal: SVGRect;\n}\n\ndeclare var SVGAnimatedRect: {\n    prototype: SVGAnimatedRect;\n    new(): SVGAnimatedRect;\n};\n\ninterface SVGAnimatedString {\n    readonly animVal: string;\n    baseVal: string;\n}\n\ndeclare var SVGAnimatedString: {\n    prototype: SVGAnimatedString;\n    new(): SVGAnimatedString;\n};\n\ninterface SVGAnimatedTransformList {\n    readonly animVal: SVGTransformList;\n    readonly baseVal: SVGTransformList;\n}\n\ndeclare var SVGAnimatedTransformList: {\n    prototype: SVGAnimatedTransformList;\n    new(): SVGAnimatedTransformList;\n};\n\ninterface SVGCircleElement extends SVGGraphicsElement {\n    readonly cx: SVGAnimatedLength;\n    readonly cy: SVGAnimatedLength;\n    readonly r: SVGAnimatedLength;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGCircleElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGCircleElement: {\n    prototype: SVGCircleElement;\n    new(): SVGCircleElement;\n};\n\ninterface SVGClipPathElement extends SVGGraphicsElement, SVGUnitTypes {\n    readonly clipPathUnits: SVGAnimatedEnumeration;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGClipPathElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGClipPathElement: {\n    prototype: SVGClipPathElement;\n    new(): SVGClipPathElement;\n};\n\ninterface SVGComponentTransferFunctionElement extends SVGElement {\n    readonly amplitude: SVGAnimatedNumber;\n    readonly exponent: SVGAnimatedNumber;\n    readonly intercept: SVGAnimatedNumber;\n    readonly offset: SVGAnimatedNumber;\n    readonly slope: SVGAnimatedNumber;\n    readonly tableValues: SVGAnimatedNumberList;\n    readonly type: SVGAnimatedEnumeration;\n    readonly SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE: number;\n    readonly SVG_FECOMPONENTTRANSFER_TYPE_GAMMA: number;\n    readonly SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY: number;\n    readonly SVG_FECOMPONENTTRANSFER_TYPE_LINEAR: number;\n    readonly SVG_FECOMPONENTTRANSFER_TYPE_TABLE: number;\n    readonly SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN: number;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGComponentTransferFunctionElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGComponentTransferFunctionElement: {\n    prototype: SVGComponentTransferFunctionElement;\n    new(): SVGComponentTransferFunctionElement;\n    readonly SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE: number;\n    readonly SVG_FECOMPONENTTRANSFER_TYPE_GAMMA: number;\n    readonly SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY: number;\n    readonly SVG_FECOMPONENTTRANSFER_TYPE_LINEAR: number;\n    readonly SVG_FECOMPONENTTRANSFER_TYPE_TABLE: number;\n    readonly SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN: number;\n};\n\ninterface SVGDefsElement extends SVGGraphicsElement {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGDefsElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGDefsElement: {\n    prototype: SVGDefsElement;\n    new(): SVGDefsElement;\n};\n\ninterface SVGDescElement extends SVGElement {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGDescElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGDescElement: {\n    prototype: SVGDescElement;\n    new(): SVGDescElement;\n};\n\ninterface SVGElementEventMap extends ElementEventMap {\n    "click": MouseEvent;\n    "dblclick": MouseEvent;\n    "focusin": FocusEvent;\n    "focusout": FocusEvent;\n    "load": Event;\n    "mousedown": MouseEvent;\n    "mousemove": MouseEvent;\n    "mouseout": MouseEvent;\n    "mouseover": MouseEvent;\n    "mouseup": MouseEvent;\n}\n\ninterface SVGElement extends Element {\n    className: any;\n    onclick: (this: SVGElement, ev: MouseEvent) => any;\n    ondblclick: (this: SVGElement, ev: MouseEvent) => any;\n    onfocusin: (this: SVGElement, ev: FocusEvent) => any;\n    onfocusout: (this: SVGElement, ev: FocusEvent) => any;\n    onload: (this: SVGElement, ev: Event) => any;\n    onmousedown: (this: SVGElement, ev: MouseEvent) => any;\n    onmousemove: (this: SVGElement, ev: MouseEvent) => any;\n    onmouseout: (this: SVGElement, ev: MouseEvent) => any;\n    onmouseover: (this: SVGElement, ev: MouseEvent) => any;\n    onmouseup: (this: SVGElement, ev: MouseEvent) => any;\n    readonly ownerSVGElement: SVGSVGElement;\n    readonly style: CSSStyleDeclaration;\n    readonly viewportElement: SVGElement;\n    xmlbase: string;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGElement: {\n    prototype: SVGElement;\n    new(): SVGElement;\n};\n\ninterface SVGElementInstance extends EventTarget {\n    readonly childNodes: SVGElementInstanceList;\n    readonly correspondingElement: SVGElement;\n    readonly correspondingUseElement: SVGUseElement;\n    readonly firstChild: SVGElementInstance;\n    readonly lastChild: SVGElementInstance;\n    readonly nextSibling: SVGElementInstance;\n    readonly parentNode: SVGElementInstance;\n    readonly previousSibling: SVGElementInstance;\n}\n\ndeclare var SVGElementInstance: {\n    prototype: SVGElementInstance;\n    new(): SVGElementInstance;\n};\n\ninterface SVGElementInstanceList {\n    readonly length: number;\n    item(index: number): SVGElementInstance;\n}\n\ndeclare var SVGElementInstanceList: {\n    prototype: SVGElementInstanceList;\n    new(): SVGElementInstanceList;\n};\n\ninterface SVGEllipseElement extends SVGGraphicsElement {\n    readonly cx: SVGAnimatedLength;\n    readonly cy: SVGAnimatedLength;\n    readonly rx: SVGAnimatedLength;\n    readonly ry: SVGAnimatedLength;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGEllipseElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGEllipseElement: {\n    prototype: SVGEllipseElement;\n    new(): SVGEllipseElement;\n};\n\ninterface SVGFEBlendElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {\n    readonly in1: SVGAnimatedString;\n    readonly in2: SVGAnimatedString;\n    readonly mode: SVGAnimatedEnumeration;\n    readonly SVG_FEBLEND_MODE_COLOR: number;\n    readonly SVG_FEBLEND_MODE_COLOR_BURN: number;\n    readonly SVG_FEBLEND_MODE_COLOR_DODGE: number;\n    readonly SVG_FEBLEND_MODE_DARKEN: number;\n    readonly SVG_FEBLEND_MODE_DIFFERENCE: number;\n    readonly SVG_FEBLEND_MODE_EXCLUSION: number;\n    readonly SVG_FEBLEND_MODE_HARD_LIGHT: number;\n    readonly SVG_FEBLEND_MODE_HUE: number;\n    readonly SVG_FEBLEND_MODE_LIGHTEN: number;\n    readonly SVG_FEBLEND_MODE_LUMINOSITY: number;\n    readonly SVG_FEBLEND_MODE_MULTIPLY: number;\n    readonly SVG_FEBLEND_MODE_NORMAL: number;\n    readonly SVG_FEBLEND_MODE_OVERLAY: number;\n    readonly SVG_FEBLEND_MODE_SATURATION: number;\n    readonly SVG_FEBLEND_MODE_SCREEN: number;\n    readonly SVG_FEBLEND_MODE_SOFT_LIGHT: number;\n    readonly SVG_FEBLEND_MODE_UNKNOWN: number;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEBlendElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEBlendElement: {\n    prototype: SVGFEBlendElement;\n    new(): SVGFEBlendElement;\n    readonly SVG_FEBLEND_MODE_COLOR: number;\n    readonly SVG_FEBLEND_MODE_COLOR_BURN: number;\n    readonly SVG_FEBLEND_MODE_COLOR_DODGE: number;\n    readonly SVG_FEBLEND_MODE_DARKEN: number;\n    readonly SVG_FEBLEND_MODE_DIFFERENCE: number;\n    readonly SVG_FEBLEND_MODE_EXCLUSION: number;\n    readonly SVG_FEBLEND_MODE_HARD_LIGHT: number;\n    readonly SVG_FEBLEND_MODE_HUE: number;\n    readonly SVG_FEBLEND_MODE_LIGHTEN: number;\n    readonly SVG_FEBLEND_MODE_LUMINOSITY: number;\n    readonly SVG_FEBLEND_MODE_MULTIPLY: number;\n    readonly SVG_FEBLEND_MODE_NORMAL: number;\n    readonly SVG_FEBLEND_MODE_OVERLAY: number;\n    readonly SVG_FEBLEND_MODE_SATURATION: number;\n    readonly SVG_FEBLEND_MODE_SCREEN: number;\n    readonly SVG_FEBLEND_MODE_SOFT_LIGHT: number;\n    readonly SVG_FEBLEND_MODE_UNKNOWN: number;\n};\n\ninterface SVGFEColorMatrixElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {\n    readonly in1: SVGAnimatedString;\n    readonly type: SVGAnimatedEnumeration;\n    readonly values: SVGAnimatedNumberList;\n    readonly SVG_FECOLORMATRIX_TYPE_HUEROTATE: number;\n    readonly SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA: number;\n    readonly SVG_FECOLORMATRIX_TYPE_MATRIX: number;\n    readonly SVG_FECOLORMATRIX_TYPE_SATURATE: number;\n    readonly SVG_FECOLORMATRIX_TYPE_UNKNOWN: number;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEColorMatrixElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEColorMatrixElement: {\n    prototype: SVGFEColorMatrixElement;\n    new(): SVGFEColorMatrixElement;\n    readonly SVG_FECOLORMATRIX_TYPE_HUEROTATE: number;\n    readonly SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA: number;\n    readonly SVG_FECOLORMATRIX_TYPE_MATRIX: number;\n    readonly SVG_FECOLORMATRIX_TYPE_SATURATE: number;\n    readonly SVG_FECOLORMATRIX_TYPE_UNKNOWN: number;\n};\n\ninterface SVGFEComponentTransferElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {\n    readonly in1: SVGAnimatedString;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEComponentTransferElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEComponentTransferElement: {\n    prototype: SVGFEComponentTransferElement;\n    new(): SVGFEComponentTransferElement;\n};\n\ninterface SVGFECompositeElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {\n    readonly in1: SVGAnimatedString;\n    readonly in2: SVGAnimatedString;\n    readonly k1: SVGAnimatedNumber;\n    readonly k2: SVGAnimatedNumber;\n    readonly k3: SVGAnimatedNumber;\n    readonly k4: SVGAnimatedNumber;\n    readonly operator: SVGAnimatedEnumeration;\n    readonly SVG_FECOMPOSITE_OPERATOR_ARITHMETIC: number;\n    readonly SVG_FECOMPOSITE_OPERATOR_ATOP: number;\n    readonly SVG_FECOMPOSITE_OPERATOR_IN: number;\n    readonly SVG_FECOMPOSITE_OPERATOR_OUT: number;\n    readonly SVG_FECOMPOSITE_OPERATOR_OVER: number;\n    readonly SVG_FECOMPOSITE_OPERATOR_UNKNOWN: number;\n    readonly SVG_FECOMPOSITE_OPERATOR_XOR: number;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFECompositeElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFECompositeElement: {\n    prototype: SVGFECompositeElement;\n    new(): SVGFECompositeElement;\n    readonly SVG_FECOMPOSITE_OPERATOR_ARITHMETIC: number;\n    readonly SVG_FECOMPOSITE_OPERATOR_ATOP: number;\n    readonly SVG_FECOMPOSITE_OPERATOR_IN: number;\n    readonly SVG_FECOMPOSITE_OPERATOR_OUT: number;\n    readonly SVG_FECOMPOSITE_OPERATOR_OVER: number;\n    readonly SVG_FECOMPOSITE_OPERATOR_UNKNOWN: number;\n    readonly SVG_FECOMPOSITE_OPERATOR_XOR: number;\n};\n\ninterface SVGFEConvolveMatrixElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {\n    readonly bias: SVGAnimatedNumber;\n    readonly divisor: SVGAnimatedNumber;\n    readonly edgeMode: SVGAnimatedEnumeration;\n    readonly in1: SVGAnimatedString;\n    readonly kernelMatrix: SVGAnimatedNumberList;\n    readonly kernelUnitLengthX: SVGAnimatedNumber;\n    readonly kernelUnitLengthY: SVGAnimatedNumber;\n    readonly orderX: SVGAnimatedInteger;\n    readonly orderY: SVGAnimatedInteger;\n    readonly preserveAlpha: SVGAnimatedBoolean;\n    readonly targetX: SVGAnimatedInteger;\n    readonly targetY: SVGAnimatedInteger;\n    readonly SVG_EDGEMODE_DUPLICATE: number;\n    readonly SVG_EDGEMODE_NONE: number;\n    readonly SVG_EDGEMODE_UNKNOWN: number;\n    readonly SVG_EDGEMODE_WRAP: number;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEConvolveMatrixElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEConvolveMatrixElement: {\n    prototype: SVGFEConvolveMatrixElement;\n    new(): SVGFEConvolveMatrixElement;\n    readonly SVG_EDGEMODE_DUPLICATE: number;\n    readonly SVG_EDGEMODE_NONE: number;\n    readonly SVG_EDGEMODE_UNKNOWN: number;\n    readonly SVG_EDGEMODE_WRAP: number;\n};\n\ninterface SVGFEDiffuseLightingElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {\n    readonly diffuseConstant: SVGAnimatedNumber;\n    readonly in1: SVGAnimatedString;\n    readonly kernelUnitLengthX: SVGAnimatedNumber;\n    readonly kernelUnitLengthY: SVGAnimatedNumber;\n    readonly surfaceScale: SVGAnimatedNumber;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEDiffuseLightingElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEDiffuseLightingElement: {\n    prototype: SVGFEDiffuseLightingElement;\n    new(): SVGFEDiffuseLightingElement;\n};\n\ninterface SVGFEDisplacementMapElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {\n    readonly in1: SVGAnimatedString;\n    readonly in2: SVGAnimatedString;\n    readonly scale: SVGAnimatedNumber;\n    readonly xChannelSelector: SVGAnimatedEnumeration;\n    readonly yChannelSelector: SVGAnimatedEnumeration;\n    readonly SVG_CHANNEL_A: number;\n    readonly SVG_CHANNEL_B: number;\n    readonly SVG_CHANNEL_G: number;\n    readonly SVG_CHANNEL_R: number;\n    readonly SVG_CHANNEL_UNKNOWN: number;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEDisplacementMapElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEDisplacementMapElement: {\n    prototype: SVGFEDisplacementMapElement;\n    new(): SVGFEDisplacementMapElement;\n    readonly SVG_CHANNEL_A: number;\n    readonly SVG_CHANNEL_B: number;\n    readonly SVG_CHANNEL_G: number;\n    readonly SVG_CHANNEL_R: number;\n    readonly SVG_CHANNEL_UNKNOWN: number;\n};\n\ninterface SVGFEDistantLightElement extends SVGElement {\n    readonly azimuth: SVGAnimatedNumber;\n    readonly elevation: SVGAnimatedNumber;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEDistantLightElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEDistantLightElement: {\n    prototype: SVGFEDistantLightElement;\n    new(): SVGFEDistantLightElement;\n};\n\ninterface SVGFEFloodElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEFloodElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEFloodElement: {\n    prototype: SVGFEFloodElement;\n    new(): SVGFEFloodElement;\n};\n\ninterface SVGFEFuncAElement extends SVGComponentTransferFunctionElement {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEFuncAElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEFuncAElement: {\n    prototype: SVGFEFuncAElement;\n    new(): SVGFEFuncAElement;\n};\n\ninterface SVGFEFuncBElement extends SVGComponentTransferFunctionElement {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEFuncBElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEFuncBElement: {\n    prototype: SVGFEFuncBElement;\n    new(): SVGFEFuncBElement;\n};\n\ninterface SVGFEFuncGElement extends SVGComponentTransferFunctionElement {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEFuncGElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEFuncGElement: {\n    prototype: SVGFEFuncGElement;\n    new(): SVGFEFuncGElement;\n};\n\ninterface SVGFEFuncRElement extends SVGComponentTransferFunctionElement {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEFuncRElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEFuncRElement: {\n    prototype: SVGFEFuncRElement;\n    new(): SVGFEFuncRElement;\n};\n\ninterface SVGFEGaussianBlurElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {\n    readonly in1: SVGAnimatedString;\n    readonly stdDeviationX: SVGAnimatedNumber;\n    readonly stdDeviationY: SVGAnimatedNumber;\n    setStdDeviation(stdDeviationX: number, stdDeviationY: number): void;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEGaussianBlurElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEGaussianBlurElement: {\n    prototype: SVGFEGaussianBlurElement;\n    new(): SVGFEGaussianBlurElement;\n};\n\ninterface SVGFEImageElement extends SVGElement, SVGFilterPrimitiveStandardAttributes, SVGURIReference {\n    readonly preserveAspectRatio: SVGAnimatedPreserveAspectRatio;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEImageElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEImageElement: {\n    prototype: SVGFEImageElement;\n    new(): SVGFEImageElement;\n};\n\ninterface SVGFEMergeElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEMergeElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEMergeElement: {\n    prototype: SVGFEMergeElement;\n    new(): SVGFEMergeElement;\n};\n\ninterface SVGFEMergeNodeElement extends SVGElement {\n    readonly in1: SVGAnimatedString;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEMergeNodeElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEMergeNodeElement: {\n    prototype: SVGFEMergeNodeElement;\n    new(): SVGFEMergeNodeElement;\n};\n\ninterface SVGFEMorphologyElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {\n    readonly in1: SVGAnimatedString;\n    readonly operator: SVGAnimatedEnumeration;\n    readonly radiusX: SVGAnimatedNumber;\n    readonly radiusY: SVGAnimatedNumber;\n    readonly SVG_MORPHOLOGY_OPERATOR_DILATE: number;\n    readonly SVG_MORPHOLOGY_OPERATOR_ERODE: number;\n    readonly SVG_MORPHOLOGY_OPERATOR_UNKNOWN: number;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEMorphologyElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEMorphologyElement: {\n    prototype: SVGFEMorphologyElement;\n    new(): SVGFEMorphologyElement;\n    readonly SVG_MORPHOLOGY_OPERATOR_DILATE: number;\n    readonly SVG_MORPHOLOGY_OPERATOR_ERODE: number;\n    readonly SVG_MORPHOLOGY_OPERATOR_UNKNOWN: number;\n};\n\ninterface SVGFEOffsetElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {\n    readonly dx: SVGAnimatedNumber;\n    readonly dy: SVGAnimatedNumber;\n    readonly in1: SVGAnimatedString;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEOffsetElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEOffsetElement: {\n    prototype: SVGFEOffsetElement;\n    new(): SVGFEOffsetElement;\n};\n\ninterface SVGFEPointLightElement extends SVGElement {\n    readonly x: SVGAnimatedNumber;\n    readonly y: SVGAnimatedNumber;\n    readonly z: SVGAnimatedNumber;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEPointLightElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEPointLightElement: {\n    prototype: SVGFEPointLightElement;\n    new(): SVGFEPointLightElement;\n};\n\ninterface SVGFESpecularLightingElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {\n    readonly in1: SVGAnimatedString;\n    readonly kernelUnitLengthX: SVGAnimatedNumber;\n    readonly kernelUnitLengthY: SVGAnimatedNumber;\n    readonly specularConstant: SVGAnimatedNumber;\n    readonly specularExponent: SVGAnimatedNumber;\n    readonly surfaceScale: SVGAnimatedNumber;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFESpecularLightingElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFESpecularLightingElement: {\n    prototype: SVGFESpecularLightingElement;\n    new(): SVGFESpecularLightingElement;\n};\n\ninterface SVGFESpotLightElement extends SVGElement {\n    readonly limitingConeAngle: SVGAnimatedNumber;\n    readonly pointsAtX: SVGAnimatedNumber;\n    readonly pointsAtY: SVGAnimatedNumber;\n    readonly pointsAtZ: SVGAnimatedNumber;\n    readonly specularExponent: SVGAnimatedNumber;\n    readonly x: SVGAnimatedNumber;\n    readonly y: SVGAnimatedNumber;\n    readonly z: SVGAnimatedNumber;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFESpotLightElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFESpotLightElement: {\n    prototype: SVGFESpotLightElement;\n    new(): SVGFESpotLightElement;\n};\n\ninterface SVGFETileElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {\n    readonly in1: SVGAnimatedString;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFETileElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFETileElement: {\n    prototype: SVGFETileElement;\n    new(): SVGFETileElement;\n};\n\ninterface SVGFETurbulenceElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {\n    readonly baseFrequencyX: SVGAnimatedNumber;\n    readonly baseFrequencyY: SVGAnimatedNumber;\n    readonly numOctaves: SVGAnimatedInteger;\n    readonly seed: SVGAnimatedNumber;\n    readonly stitchTiles: SVGAnimatedEnumeration;\n    readonly type: SVGAnimatedEnumeration;\n    readonly SVG_STITCHTYPE_NOSTITCH: number;\n    readonly SVG_STITCHTYPE_STITCH: number;\n    readonly SVG_STITCHTYPE_UNKNOWN: number;\n    readonly SVG_TURBULENCE_TYPE_FRACTALNOISE: number;\n    readonly SVG_TURBULENCE_TYPE_TURBULENCE: number;\n    readonly SVG_TURBULENCE_TYPE_UNKNOWN: number;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFETurbulenceElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFETurbulenceElement: {\n    prototype: SVGFETurbulenceElement;\n    new(): SVGFETurbulenceElement;\n    readonly SVG_STITCHTYPE_NOSTITCH: number;\n    readonly SVG_STITCHTYPE_STITCH: number;\n    readonly SVG_STITCHTYPE_UNKNOWN: number;\n    readonly SVG_TURBULENCE_TYPE_FRACTALNOISE: number;\n    readonly SVG_TURBULENCE_TYPE_TURBULENCE: number;\n    readonly SVG_TURBULENCE_TYPE_UNKNOWN: number;\n};\n\ninterface SVGFilterElement extends SVGElement, SVGUnitTypes, SVGURIReference {\n    readonly filterResX: SVGAnimatedInteger;\n    readonly filterResY: SVGAnimatedInteger;\n    readonly filterUnits: SVGAnimatedEnumeration;\n    readonly height: SVGAnimatedLength;\n    readonly primitiveUnits: SVGAnimatedEnumeration;\n    readonly width: SVGAnimatedLength;\n    readonly x: SVGAnimatedLength;\n    readonly y: SVGAnimatedLength;\n    setFilterRes(filterResX: number, filterResY: number): void;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFilterElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFilterElement: {\n    prototype: SVGFilterElement;\n    new(): SVGFilterElement;\n};\n\ninterface SVGForeignObjectElement extends SVGGraphicsElement {\n    readonly height: SVGAnimatedLength;\n    readonly width: SVGAnimatedLength;\n    readonly x: SVGAnimatedLength;\n    readonly y: SVGAnimatedLength;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGForeignObjectElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGForeignObjectElement: {\n    prototype: SVGForeignObjectElement;\n    new(): SVGForeignObjectElement;\n};\n\ninterface SVGGElement extends SVGGraphicsElement {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGGElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGGElement: {\n    prototype: SVGGElement;\n    new(): SVGGElement;\n};\n\ninterface SVGGradientElement extends SVGElement, SVGUnitTypes, SVGURIReference {\n    readonly gradientTransform: SVGAnimatedTransformList;\n    readonly gradientUnits: SVGAnimatedEnumeration;\n    readonly spreadMethod: SVGAnimatedEnumeration;\n    readonly SVG_SPREADMETHOD_PAD: number;\n    readonly SVG_SPREADMETHOD_REFLECT: number;\n    readonly SVG_SPREADMETHOD_REPEAT: number;\n    readonly SVG_SPREADMETHOD_UNKNOWN: number;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGGradientElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGGradientElement: {\n    prototype: SVGGradientElement;\n    new(): SVGGradientElement;\n    readonly SVG_SPREADMETHOD_PAD: number;\n    readonly SVG_SPREADMETHOD_REFLECT: number;\n    readonly SVG_SPREADMETHOD_REPEAT: number;\n    readonly SVG_SPREADMETHOD_UNKNOWN: number;\n};\n\ninterface SVGGraphicsElement extends SVGElement, SVGTests {\n    readonly farthestViewportElement: SVGElement;\n    readonly nearestViewportElement: SVGElement;\n    readonly transform: SVGAnimatedTransformList;\n    getBBox(): SVGRect;\n    getCTM(): SVGMatrix;\n    getScreenCTM(): SVGMatrix;\n    getTransformToElement(element: SVGElement): SVGMatrix;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGGraphicsElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGGraphicsElement: {\n    prototype: SVGGraphicsElement;\n    new(): SVGGraphicsElement;\n};\n\ninterface SVGImageElement extends SVGGraphicsElement, SVGURIReference {\n    readonly height: SVGAnimatedLength;\n    readonly preserveAspectRatio: SVGAnimatedPreserveAspectRatio;\n    readonly width: SVGAnimatedLength;\n    readonly x: SVGAnimatedLength;\n    readonly y: SVGAnimatedLength;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGImageElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGImageElement: {\n    prototype: SVGImageElement;\n    new(): SVGImageElement;\n};\n\ninterface SVGLength {\n    readonly unitType: number;\n    value: number;\n    valueAsString: string;\n    valueInSpecifiedUnits: number;\n    convertToSpecifiedUnits(unitType: number): void;\n    newValueSpecifiedUnits(unitType: number, valueInSpecifiedUnits: number): void;\n    readonly SVG_LENGTHTYPE_CM: number;\n    readonly SVG_LENGTHTYPE_EMS: number;\n    readonly SVG_LENGTHTYPE_EXS: number;\n    readonly SVG_LENGTHTYPE_IN: number;\n    readonly SVG_LENGTHTYPE_MM: number;\n    readonly SVG_LENGTHTYPE_NUMBER: number;\n    readonly SVG_LENGTHTYPE_PC: number;\n    readonly SVG_LENGTHTYPE_PERCENTAGE: number;\n    readonly SVG_LENGTHTYPE_PT: number;\n    readonly SVG_LENGTHTYPE_PX: number;\n    readonly SVG_LENGTHTYPE_UNKNOWN: number;\n}\n\ndeclare var SVGLength: {\n    prototype: SVGLength;\n    new(): SVGLength;\n    readonly SVG_LENGTHTYPE_CM: number;\n    readonly SVG_LENGTHTYPE_EMS: number;\n    readonly SVG_LENGTHTYPE_EXS: number;\n    readonly SVG_LENGTHTYPE_IN: number;\n    readonly SVG_LENGTHTYPE_MM: number;\n    readonly SVG_LENGTHTYPE_NUMBER: number;\n    readonly SVG_LENGTHTYPE_PC: number;\n    readonly SVG_LENGTHTYPE_PERCENTAGE: number;\n    readonly SVG_LENGTHTYPE_PT: number;\n    readonly SVG_LENGTHTYPE_PX: number;\n    readonly SVG_LENGTHTYPE_UNKNOWN: number;\n};\n\ninterface SVGLengthList {\n    readonly numberOfItems: number;\n    appendItem(newItem: SVGLength): SVGLength;\n    clear(): void;\n    getItem(index: number): SVGLength;\n    initialize(newItem: SVGLength): SVGLength;\n    insertItemBefore(newItem: SVGLength, index: number): SVGLength;\n    removeItem(index: number): SVGLength;\n    replaceItem(newItem: SVGLength, index: number): SVGLength;\n}\n\ndeclare var SVGLengthList: {\n    prototype: SVGLengthList;\n    new(): SVGLengthList;\n};\n\ninterface SVGLinearGradientElement extends SVGGradientElement {\n    readonly x1: SVGAnimatedLength;\n    readonly x2: SVGAnimatedLength;\n    readonly y1: SVGAnimatedLength;\n    readonly y2: SVGAnimatedLength;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGLinearGradientElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGLinearGradientElement: {\n    prototype: SVGLinearGradientElement;\n    new(): SVGLinearGradientElement;\n};\n\ninterface SVGLineElement extends SVGGraphicsElement {\n    readonly x1: SVGAnimatedLength;\n    readonly x2: SVGAnimatedLength;\n    readonly y1: SVGAnimatedLength;\n    readonly y2: SVGAnimatedLength;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGLineElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGLineElement: {\n    prototype: SVGLineElement;\n    new(): SVGLineElement;\n};\n\ninterface SVGMarkerElement extends SVGElement, SVGFitToViewBox {\n    readonly markerHeight: SVGAnimatedLength;\n    readonly markerUnits: SVGAnimatedEnumeration;\n    readonly markerWidth: SVGAnimatedLength;\n    readonly orientAngle: SVGAnimatedAngle;\n    readonly orientType: SVGAnimatedEnumeration;\n    readonly refX: SVGAnimatedLength;\n    readonly refY: SVGAnimatedLength;\n    setOrientToAngle(angle: SVGAngle): void;\n    setOrientToAuto(): void;\n    readonly SVG_MARKER_ORIENT_ANGLE: number;\n    readonly SVG_MARKER_ORIENT_AUTO: number;\n    readonly SVG_MARKER_ORIENT_UNKNOWN: number;\n    readonly SVG_MARKERUNITS_STROKEWIDTH: number;\n    readonly SVG_MARKERUNITS_UNKNOWN: number;\n    readonly SVG_MARKERUNITS_USERSPACEONUSE: number;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGMarkerElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGMarkerElement: {\n    prototype: SVGMarkerElement;\n    new(): SVGMarkerElement;\n    readonly SVG_MARKER_ORIENT_ANGLE: number;\n    readonly SVG_MARKER_ORIENT_AUTO: number;\n    readonly SVG_MARKER_ORIENT_UNKNOWN: number;\n    readonly SVG_MARKERUNITS_STROKEWIDTH: number;\n    readonly SVG_MARKERUNITS_UNKNOWN: number;\n    readonly SVG_MARKERUNITS_USERSPACEONUSE: number;\n};\n\ninterface SVGMaskElement extends SVGElement, SVGTests, SVGUnitTypes {\n    readonly height: SVGAnimatedLength;\n    readonly maskContentUnits: SVGAnimatedEnumeration;\n    readonly maskUnits: SVGAnimatedEnumeration;\n    readonly width: SVGAnimatedLength;\n    readonly x: SVGAnimatedLength;\n    readonly y: SVGAnimatedLength;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGMaskElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGMaskElement: {\n    prototype: SVGMaskElement;\n    new(): SVGMaskElement;\n};\n\ninterface SVGMatrix {\n    a: number;\n    b: number;\n    c: number;\n    d: number;\n    e: number;\n    f: number;\n    flipX(): SVGMatrix;\n    flipY(): SVGMatrix;\n    inverse(): SVGMatrix;\n    multiply(secondMatrix: SVGMatrix): SVGMatrix;\n    rotate(angle: number): SVGMatrix;\n    rotateFromVector(x: number, y: number): SVGMatrix;\n    scale(scaleFactor: number): SVGMatrix;\n    scaleNonUniform(scaleFactorX: number, scaleFactorY: number): SVGMatrix;\n    skewX(angle: number): SVGMatrix;\n    skewY(angle: number): SVGMatrix;\n    translate(x: number, y: number): SVGMatrix;\n}\n\ndeclare var SVGMatrix: {\n    prototype: SVGMatrix;\n    new(): SVGMatrix;\n};\n\ninterface SVGMetadataElement extends SVGElement {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGMetadataElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGMetadataElement: {\n    prototype: SVGMetadataElement;\n    new(): SVGMetadataElement;\n};\n\ninterface SVGNumber {\n    value: number;\n}\n\ndeclare var SVGNumber: {\n    prototype: SVGNumber;\n    new(): SVGNumber;\n};\n\ninterface SVGNumberList {\n    readonly numberOfItems: number;\n    appendItem(newItem: SVGNumber): SVGNumber;\n    clear(): void;\n    getItem(index: number): SVGNumber;\n    initialize(newItem: SVGNumber): SVGNumber;\n    insertItemBefore(newItem: SVGNumber, index: number): SVGNumber;\n    removeItem(index: number): SVGNumber;\n    replaceItem(newItem: SVGNumber, index: number): SVGNumber;\n}\n\ndeclare var SVGNumberList: {\n    prototype: SVGNumberList;\n    new(): SVGNumberList;\n};\n\ninterface SVGPathElement extends SVGGraphicsElement {\n    readonly pathSegList: SVGPathSegList;\n    createSVGPathSegArcAbs(x: number, y: number, r1: number, r2: number, angle: number, largeArcFlag: boolean, sweepFlag: boolean): SVGPathSegArcAbs;\n    createSVGPathSegArcRel(x: number, y: number, r1: number, r2: number, angle: number, largeArcFlag: boolean, sweepFlag: boolean): SVGPathSegArcRel;\n    createSVGPathSegClosePath(): SVGPathSegClosePath;\n    createSVGPathSegCurvetoCubicAbs(x: number, y: number, x1: number, y1: number, x2: number, y2: number): SVGPathSegCurvetoCubicAbs;\n    createSVGPathSegCurvetoCubicRel(x: number, y: number, x1: number, y1: number, x2: number, y2: number): SVGPathSegCurvetoCubicRel;\n    createSVGPathSegCurvetoCubicSmoothAbs(x: number, y: number, x2: number, y2: number): SVGPathSegCurvetoCubicSmoothAbs;\n    createSVGPathSegCurvetoCubicSmoothRel(x: number, y: number, x2: number, y2: number): SVGPathSegCurvetoCubicSmoothRel;\n    createSVGPathSegCurvetoQuadraticAbs(x: number, y: number, x1: number, y1: number): SVGPathSegCurvetoQuadraticAbs;\n    createSVGPathSegCurvetoQuadraticRel(x: number, y: number, x1: number, y1: number): SVGPathSegCurvetoQuadraticRel;\n    createSVGPathSegCurvetoQuadraticSmoothAbs(x: number, y: number): SVGPathSegCurvetoQuadraticSmoothAbs;\n    createSVGPathSegCurvetoQuadraticSmoothRel(x: number, y: number): SVGPathSegCurvetoQuadraticSmoothRel;\n    createSVGPathSegLinetoAbs(x: number, y: number): SVGPathSegLinetoAbs;\n    createSVGPathSegLinetoHorizontalAbs(x: number): SVGPathSegLinetoHorizontalAbs;\n    createSVGPathSegLinetoHorizontalRel(x: number): SVGPathSegLinetoHorizontalRel;\n    createSVGPathSegLinetoRel(x: number, y: number): SVGPathSegLinetoRel;\n    createSVGPathSegLinetoVerticalAbs(y: number): SVGPathSegLinetoVerticalAbs;\n    createSVGPathSegLinetoVerticalRel(y: number): SVGPathSegLinetoVerticalRel;\n    createSVGPathSegMovetoAbs(x: number, y: number): SVGPathSegMovetoAbs;\n    createSVGPathSegMovetoRel(x: number, y: number): SVGPathSegMovetoRel;\n    getPathSegAtLength(distance: number): number;\n    getPointAtLength(distance: number): SVGPoint;\n    getTotalLength(): number;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGPathElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGPathElement: {\n    prototype: SVGPathElement;\n    new(): SVGPathElement;\n};\n\ninterface SVGPathSeg {\n    readonly pathSegType: number;\n    readonly pathSegTypeAsLetter: string;\n    readonly PATHSEG_ARC_ABS: number;\n    readonly PATHSEG_ARC_REL: number;\n    readonly PATHSEG_CLOSEPATH: number;\n    readonly PATHSEG_CURVETO_CUBIC_ABS: number;\n    readonly PATHSEG_CURVETO_CUBIC_REL: number;\n    readonly PATHSEG_CURVETO_CUBIC_SMOOTH_ABS: number;\n    readonly PATHSEG_CURVETO_CUBIC_SMOOTH_REL: number;\n    readonly PATHSEG_CURVETO_QUADRATIC_ABS: number;\n    readonly PATHSEG_CURVETO_QUADRATIC_REL: number;\n    readonly PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS: number;\n    readonly PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL: number;\n    readonly PATHSEG_LINETO_ABS: number;\n    readonly PATHSEG_LINETO_HORIZONTAL_ABS: number;\n    readonly PATHSEG_LINETO_HORIZONTAL_REL: number;\n    readonly PATHSEG_LINETO_REL: number;\n    readonly PATHSEG_LINETO_VERTICAL_ABS: number;\n    readonly PATHSEG_LINETO_VERTICAL_REL: number;\n    readonly PATHSEG_MOVETO_ABS: number;\n    readonly PATHSEG_MOVETO_REL: number;\n    readonly PATHSEG_UNKNOWN: number;\n}\n\ndeclare var SVGPathSeg: {\n    prototype: SVGPathSeg;\n    new(): SVGPathSeg;\n    readonly PATHSEG_ARC_ABS: number;\n    readonly PATHSEG_ARC_REL: number;\n    readonly PATHSEG_CLOSEPATH: number;\n    readonly PATHSEG_CURVETO_CUBIC_ABS: number;\n    readonly PATHSEG_CURVETO_CUBIC_REL: number;\n    readonly PATHSEG_CURVETO_CUBIC_SMOOTH_ABS: number;\n    readonly PATHSEG_CURVETO_CUBIC_SMOOTH_REL: number;\n    readonly PATHSEG_CURVETO_QUADRATIC_ABS: number;\n    readonly PATHSEG_CURVETO_QUADRATIC_REL: number;\n    readonly PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS: number;\n    readonly PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL: number;\n    readonly PATHSEG_LINETO_ABS: number;\n    readonly PATHSEG_LINETO_HORIZONTAL_ABS: number;\n    readonly PATHSEG_LINETO_HORIZONTAL_REL: number;\n    readonly PATHSEG_LINETO_REL: number;\n    readonly PATHSEG_LINETO_VERTICAL_ABS: number;\n    readonly PATHSEG_LINETO_VERTICAL_REL: number;\n    readonly PATHSEG_MOVETO_ABS: number;\n    readonly PATHSEG_MOVETO_REL: number;\n    readonly PATHSEG_UNKNOWN: number;\n};\n\ninterface SVGPathSegArcAbs extends SVGPathSeg {\n    angle: number;\n    largeArcFlag: boolean;\n    r1: number;\n    r2: number;\n    sweepFlag: boolean;\n    x: number;\n    y: number;\n}\n\ndeclare var SVGPathSegArcAbs: {\n    prototype: SVGPathSegArcAbs;\n    new(): SVGPathSegArcAbs;\n};\n\ninterface SVGPathSegArcRel extends SVGPathSeg {\n    angle: number;\n    largeArcFlag: boolean;\n    r1: number;\n    r2: number;\n    sweepFlag: boolean;\n    x: number;\n    y: number;\n}\n\ndeclare var SVGPathSegArcRel: {\n    prototype: SVGPathSegArcRel;\n    new(): SVGPathSegArcRel;\n};\n\ninterface SVGPathSegClosePath extends SVGPathSeg {\n}\n\ndeclare var SVGPathSegClosePath: {\n    prototype: SVGPathSegClosePath;\n    new(): SVGPathSegClosePath;\n};\n\ninterface SVGPathSegCurvetoCubicAbs extends SVGPathSeg {\n    x: number;\n    x1: number;\n    x2: number;\n    y: number;\n    y1: number;\n    y2: number;\n}\n\ndeclare var SVGPathSegCurvetoCubicAbs: {\n    prototype: SVGPathSegCurvetoCubicAbs;\n    new(): SVGPathSegCurvetoCubicAbs;\n};\n\ninterface SVGPathSegCurvetoCubicRel extends SVGPathSeg {\n    x: number;\n    x1: number;\n    x2: number;\n    y: number;\n    y1: number;\n    y2: number;\n}\n\ndeclare var SVGPathSegCurvetoCubicRel: {\n    prototype: SVGPathSegCurvetoCubicRel;\n    new(): SVGPathSegCurvetoCubicRel;\n};\n\ninterface SVGPathSegCurvetoCubicSmoothAbs extends SVGPathSeg {\n    x: number;\n    x2: number;\n    y: number;\n    y2: number;\n}\n\ndeclare var SVGPathSegCurvetoCubicSmoothAbs: {\n    prototype: SVGPathSegCurvetoCubicSmoothAbs;\n    new(): SVGPathSegCurvetoCubicSmoothAbs;\n};\n\ninterface SVGPathSegCurvetoCubicSmoothRel extends SVGPathSeg {\n    x: number;\n    x2: number;\n    y: number;\n    y2: number;\n}\n\ndeclare var SVGPathSegCurvetoCubicSmoothRel: {\n    prototype: SVGPathSegCurvetoCubicSmoothRel;\n    new(): SVGPathSegCurvetoCubicSmoothRel;\n};\n\ninterface SVGPathSegCurvetoQuadraticAbs extends SVGPathSeg {\n    x: number;\n    x1: number;\n    y: number;\n    y1: number;\n}\n\ndeclare var SVGPathSegCurvetoQuadraticAbs: {\n    prototype: SVGPathSegCurvetoQuadraticAbs;\n    new(): SVGPathSegCurvetoQuadraticAbs;\n};\n\ninterface SVGPathSegCurvetoQuadraticRel extends SVGPathSeg {\n    x: number;\n    x1: number;\n    y: number;\n    y1: number;\n}\n\ndeclare var SVGPathSegCurvetoQuadraticRel: {\n    prototype: SVGPathSegCurvetoQuadraticRel;\n    new(): SVGPathSegCurvetoQuadraticRel;\n};\n\ninterface SVGPathSegCurvetoQuadraticSmoothAbs extends SVGPathSeg {\n    x: number;\n    y: number;\n}\n\ndeclare var SVGPathSegCurvetoQuadraticSmoothAbs: {\n    prototype: SVGPathSegCurvetoQuadraticSmoothAbs;\n    new(): SVGPathSegCurvetoQuadraticSmoothAbs;\n};\n\ninterface SVGPathSegCurvetoQuadraticSmoothRel extends SVGPathSeg {\n    x: number;\n    y: number;\n}\n\ndeclare var SVGPathSegCurvetoQuadraticSmoothRel: {\n    prototype: SVGPathSegCurvetoQuadraticSmoothRel;\n    new(): SVGPathSegCurvetoQuadraticSmoothRel;\n};\n\ninterface SVGPathSegLinetoAbs extends SVGPathSeg {\n    x: number;\n    y: number;\n}\n\ndeclare var SVGPathSegLinetoAbs: {\n    prototype: SVGPathSegLinetoAbs;\n    new(): SVGPathSegLinetoAbs;\n};\n\ninterface SVGPathSegLinetoHorizontalAbs extends SVGPathSeg {\n    x: number;\n}\n\ndeclare var SVGPathSegLinetoHorizontalAbs: {\n    prototype: SVGPathSegLinetoHorizontalAbs;\n    new(): SVGPathSegLinetoHorizontalAbs;\n};\n\ninterface SVGPathSegLinetoHorizontalRel extends SVGPathSeg {\n    x: number;\n}\n\ndeclare var SVGPathSegLinetoHorizontalRel: {\n    prototype: SVGPathSegLinetoHorizontalRel;\n    new(): SVGPathSegLinetoHorizontalRel;\n};\n\ninterface SVGPathSegLinetoRel extends SVGPathSeg {\n    x: number;\n    y: number;\n}\n\ndeclare var SVGPathSegLinetoRel: {\n    prototype: SVGPathSegLinetoRel;\n    new(): SVGPathSegLinetoRel;\n};\n\ninterface SVGPathSegLinetoVerticalAbs extends SVGPathSeg {\n    y: number;\n}\n\ndeclare var SVGPathSegLinetoVerticalAbs: {\n    prototype: SVGPathSegLinetoVerticalAbs;\n    new(): SVGPathSegLinetoVerticalAbs;\n};\n\ninterface SVGPathSegLinetoVerticalRel extends SVGPathSeg {\n    y: number;\n}\n\ndeclare var SVGPathSegLinetoVerticalRel: {\n    prototype: SVGPathSegLinetoVerticalRel;\n    new(): SVGPathSegLinetoVerticalRel;\n};\n\ninterface SVGPathSegList {\n    readonly numberOfItems: number;\n    appendItem(newItem: SVGPathSeg): SVGPathSeg;\n    clear(): void;\n    getItem(index: number): SVGPathSeg;\n    initialize(newItem: SVGPathSeg): SVGPathSeg;\n    insertItemBefore(newItem: SVGPathSeg, index: number): SVGPathSeg;\n    removeItem(index: number): SVGPathSeg;\n    replaceItem(newItem: SVGPathSeg, index: number): SVGPathSeg;\n}\n\ndeclare var SVGPathSegList: {\n    prototype: SVGPathSegList;\n    new(): SVGPathSegList;\n};\n\ninterface SVGPathSegMovetoAbs extends SVGPathSeg {\n    x: number;\n    y: number;\n}\n\ndeclare var SVGPathSegMovetoAbs: {\n    prototype: SVGPathSegMovetoAbs;\n    new(): SVGPathSegMovetoAbs;\n};\n\ninterface SVGPathSegMovetoRel extends SVGPathSeg {\n    x: number;\n    y: number;\n}\n\ndeclare var SVGPathSegMovetoRel: {\n    prototype: SVGPathSegMovetoRel;\n    new(): SVGPathSegMovetoRel;\n};\n\ninterface SVGPatternElement extends SVGElement, SVGTests, SVGUnitTypes, SVGFitToViewBox, SVGURIReference {\n    readonly height: SVGAnimatedLength;\n    readonly patternContentUnits: SVGAnimatedEnumeration;\n    readonly patternTransform: SVGAnimatedTransformList;\n    readonly patternUnits: SVGAnimatedEnumeration;\n    readonly width: SVGAnimatedLength;\n    readonly x: SVGAnimatedLength;\n    readonly y: SVGAnimatedLength;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGPatternElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGPatternElement: {\n    prototype: SVGPatternElement;\n    new(): SVGPatternElement;\n};\n\ninterface SVGPoint {\n    x: number;\n    y: number;\n    matrixTransform(matrix: SVGMatrix): SVGPoint;\n}\n\ndeclare var SVGPoint: {\n    prototype: SVGPoint;\n    new(): SVGPoint;\n};\n\ninterface SVGPointList {\n    readonly numberOfItems: number;\n    appendItem(newItem: SVGPoint): SVGPoint;\n    clear(): void;\n    getItem(index: number): SVGPoint;\n    initialize(newItem: SVGPoint): SVGPoint;\n    insertItemBefore(newItem: SVGPoint, index: number): SVGPoint;\n    removeItem(index: number): SVGPoint;\n    replaceItem(newItem: SVGPoint, index: number): SVGPoint;\n}\n\ndeclare var SVGPointList: {\n    prototype: SVGPointList;\n    new(): SVGPointList;\n};\n\ninterface SVGPolygonElement extends SVGGraphicsElement, SVGAnimatedPoints {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGPolygonElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGPolygonElement: {\n    prototype: SVGPolygonElement;\n    new(): SVGPolygonElement;\n};\n\ninterface SVGPolylineElement extends SVGGraphicsElement, SVGAnimatedPoints {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGPolylineElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGPolylineElement: {\n    prototype: SVGPolylineElement;\n    new(): SVGPolylineElement;\n};\n\ninterface SVGPreserveAspectRatio {\n    align: number;\n    meetOrSlice: number;\n    readonly SVG_MEETORSLICE_MEET: number;\n    readonly SVG_MEETORSLICE_SLICE: number;\n    readonly SVG_MEETORSLICE_UNKNOWN: number;\n    readonly SVG_PRESERVEASPECTRATIO_NONE: number;\n    readonly SVG_PRESERVEASPECTRATIO_UNKNOWN: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMAXYMAX: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMAXYMID: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMAXYMIN: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMIDYMAX: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMIDYMID: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMIDYMIN: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMINYMAX: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMINYMID: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMINYMIN: number;\n}\n\ndeclare var SVGPreserveAspectRatio: {\n    prototype: SVGPreserveAspectRatio;\n    new(): SVGPreserveAspectRatio;\n    readonly SVG_MEETORSLICE_MEET: number;\n    readonly SVG_MEETORSLICE_SLICE: number;\n    readonly SVG_MEETORSLICE_UNKNOWN: number;\n    readonly SVG_PRESERVEASPECTRATIO_NONE: number;\n    readonly SVG_PRESERVEASPECTRATIO_UNKNOWN: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMAXYMAX: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMAXYMID: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMAXYMIN: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMIDYMAX: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMIDYMID: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMIDYMIN: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMINYMAX: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMINYMID: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMINYMIN: number;\n};\n\ninterface SVGRadialGradientElement extends SVGGradientElement {\n    readonly cx: SVGAnimatedLength;\n    readonly cy: SVGAnimatedLength;\n    readonly fx: SVGAnimatedLength;\n    readonly fy: SVGAnimatedLength;\n    readonly r: SVGAnimatedLength;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGRadialGradientElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGRadialGradientElement: {\n    prototype: SVGRadialGradientElement;\n    new(): SVGRadialGradientElement;\n};\n\ninterface SVGRect {\n    height: number;\n    width: number;\n    x: number;\n    y: number;\n}\n\ndeclare var SVGRect: {\n    prototype: SVGRect;\n    new(): SVGRect;\n};\n\ninterface SVGRectElement extends SVGGraphicsElement {\n    readonly height: SVGAnimatedLength;\n    readonly rx: SVGAnimatedLength;\n    readonly ry: SVGAnimatedLength;\n    readonly width: SVGAnimatedLength;\n    readonly x: SVGAnimatedLength;\n    readonly y: SVGAnimatedLength;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGRectElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGRectElement: {\n    prototype: SVGRectElement;\n    new(): SVGRectElement;\n};\n\ninterface SVGScriptElement extends SVGElement, SVGURIReference {\n    type: string;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGScriptElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGScriptElement: {\n    prototype: SVGScriptElement;\n    new(): SVGScriptElement;\n};\n\ninterface SVGStopElement extends SVGElement {\n    readonly offset: SVGAnimatedNumber;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGStopElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGStopElement: {\n    prototype: SVGStopElement;\n    new(): SVGStopElement;\n};\n\ninterface SVGStringList {\n    readonly numberOfItems: number;\n    appendItem(newItem: string): string;\n    clear(): void;\n    getItem(index: number): string;\n    initialize(newItem: string): string;\n    insertItemBefore(newItem: string, index: number): string;\n    removeItem(index: number): string;\n    replaceItem(newItem: string, index: number): string;\n}\n\ndeclare var SVGStringList: {\n    prototype: SVGStringList;\n    new(): SVGStringList;\n};\n\ninterface SVGStyleElement extends SVGElement {\n    disabled: boolean;\n    media: string;\n    title: string;\n    type: string;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGStyleElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGStyleElement: {\n    prototype: SVGStyleElement;\n    new(): SVGStyleElement;\n};\n\ninterface SVGSVGElementEventMap extends SVGElementEventMap {\n    "SVGAbort": Event;\n    "SVGError": Event;\n    "resize": UIEvent;\n    "scroll": UIEvent;\n    "SVGUnload": Event;\n    "SVGZoom": SVGZoomEvent;\n}\n\ninterface SVGSVGElement extends SVGGraphicsElement, DocumentEvent, SVGFitToViewBox, SVGZoomAndPan {\n    contentScriptType: string;\n    contentStyleType: string;\n    currentScale: number;\n    readonly currentTranslate: SVGPoint;\n    readonly height: SVGAnimatedLength;\n    onabort: (this: SVGSVGElement, ev: Event) => any;\n    onerror: (this: SVGSVGElement, ev: Event) => any;\n    onresize: (this: SVGSVGElement, ev: UIEvent) => any;\n    onscroll: (this: SVGSVGElement, ev: UIEvent) => any;\n    onunload: (this: SVGSVGElement, ev: Event) => any;\n    onzoom: (this: SVGSVGElement, ev: SVGZoomEvent) => any;\n    readonly pixelUnitToMillimeterX: number;\n    readonly pixelUnitToMillimeterY: number;\n    readonly screenPixelToMillimeterX: number;\n    readonly screenPixelToMillimeterY: number;\n    readonly viewport: SVGRect;\n    readonly width: SVGAnimatedLength;\n    readonly x: SVGAnimatedLength;\n    readonly y: SVGAnimatedLength;\n    checkEnclosure(element: SVGElement, rect: SVGRect): boolean;\n    checkIntersection(element: SVGElement, rect: SVGRect): boolean;\n    createSVGAngle(): SVGAngle;\n    createSVGLength(): SVGLength;\n    createSVGMatrix(): SVGMatrix;\n    createSVGNumber(): SVGNumber;\n    createSVGPoint(): SVGPoint;\n    createSVGRect(): SVGRect;\n    createSVGTransform(): SVGTransform;\n    createSVGTransformFromMatrix(matrix: SVGMatrix): SVGTransform;\n    deselectAll(): void;\n    forceRedraw(): void;\n    getComputedStyle(elt: Element, pseudoElt?: string): CSSStyleDeclaration;\n    getCurrentTime(): number;\n    getElementById(elementId: string): Element;\n    getEnclosureList(rect: SVGRect, referenceElement: SVGElement): NodeListOf<SVGCircleElement | SVGEllipseElement | SVGImageElement | SVGLineElement | SVGPathElement | SVGPolygonElement | SVGPolylineElement | SVGRectElement | SVGTextElement | SVGUseElement>;\n    getIntersectionList(rect: SVGRect, referenceElement: SVGElement): NodeListOf<SVGCircleElement | SVGEllipseElement | SVGImageElement | SVGLineElement | SVGPathElement | SVGPolygonElement | SVGPolylineElement | SVGRectElement | SVGTextElement | SVGUseElement>;\n    pauseAnimations(): void;\n    setCurrentTime(seconds: number): void;\n    suspendRedraw(maxWaitMilliseconds: number): number;\n    unpauseAnimations(): void;\n    unsuspendRedraw(suspendHandleID: number): void;\n    unsuspendRedrawAll(): void;\n    addEventListener<K extends keyof SVGSVGElementEventMap>(type: K, listener: (this: SVGSVGElement, ev: SVGSVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGSVGElement: {\n    prototype: SVGSVGElement;\n    new(): SVGSVGElement;\n};\n\ninterface SVGSwitchElement extends SVGGraphicsElement {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGSwitchElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGSwitchElement: {\n    prototype: SVGSwitchElement;\n    new(): SVGSwitchElement;\n};\n\ninterface SVGSymbolElement extends SVGElement, SVGFitToViewBox {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGSymbolElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGSymbolElement: {\n    prototype: SVGSymbolElement;\n    new(): SVGSymbolElement;\n};\n\ninterface SVGTextContentElement extends SVGGraphicsElement {\n    readonly lengthAdjust: SVGAnimatedEnumeration;\n    readonly textLength: SVGAnimatedLength;\n    getCharNumAtPosition(point: SVGPoint): number;\n    getComputedTextLength(): number;\n    getEndPositionOfChar(charnum: number): SVGPoint;\n    getExtentOfChar(charnum: number): SVGRect;\n    getNumberOfChars(): number;\n    getRotationOfChar(charnum: number): number;\n    getStartPositionOfChar(charnum: number): SVGPoint;\n    getSubStringLength(charnum: number, nchars: number): number;\n    selectSubString(charnum: number, nchars: number): void;\n    readonly LENGTHADJUST_SPACING: number;\n    readonly LENGTHADJUST_SPACINGANDGLYPHS: number;\n    readonly LENGTHADJUST_UNKNOWN: number;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTextContentElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGTextContentElement: {\n    prototype: SVGTextContentElement;\n    new(): SVGTextContentElement;\n    readonly LENGTHADJUST_SPACING: number;\n    readonly LENGTHADJUST_SPACINGANDGLYPHS: number;\n    readonly LENGTHADJUST_UNKNOWN: number;\n};\n\ninterface SVGTextElement extends SVGTextPositioningElement {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTextElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGTextElement: {\n    prototype: SVGTextElement;\n    new(): SVGTextElement;\n};\n\ninterface SVGTextPathElement extends SVGTextContentElement, SVGURIReference {\n    readonly method: SVGAnimatedEnumeration;\n    readonly spacing: SVGAnimatedEnumeration;\n    readonly startOffset: SVGAnimatedLength;\n    readonly TEXTPATH_METHODTYPE_ALIGN: number;\n    readonly TEXTPATH_METHODTYPE_STRETCH: number;\n    readonly TEXTPATH_METHODTYPE_UNKNOWN: number;\n    readonly TEXTPATH_SPACINGTYPE_AUTO: number;\n    readonly TEXTPATH_SPACINGTYPE_EXACT: number;\n    readonly TEXTPATH_SPACINGTYPE_UNKNOWN: number;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTextPathElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGTextPathElement: {\n    prototype: SVGTextPathElement;\n    new(): SVGTextPathElement;\n    readonly TEXTPATH_METHODTYPE_ALIGN: number;\n    readonly TEXTPATH_METHODTYPE_STRETCH: number;\n    readonly TEXTPATH_METHODTYPE_UNKNOWN: number;\n    readonly TEXTPATH_SPACINGTYPE_AUTO: number;\n    readonly TEXTPATH_SPACINGTYPE_EXACT: number;\n    readonly TEXTPATH_SPACINGTYPE_UNKNOWN: number;\n};\n\ninterface SVGTextPositioningElement extends SVGTextContentElement {\n    readonly dx: SVGAnimatedLengthList;\n    readonly dy: SVGAnimatedLengthList;\n    readonly rotate: SVGAnimatedNumberList;\n    readonly x: SVGAnimatedLengthList;\n    readonly y: SVGAnimatedLengthList;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTextPositioningElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGTextPositioningElement: {\n    prototype: SVGTextPositioningElement;\n    new(): SVGTextPositioningElement;\n};\n\ninterface SVGTitleElement extends SVGElement {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTitleElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGTitleElement: {\n    prototype: SVGTitleElement;\n    new(): SVGTitleElement;\n};\n\ninterface SVGTransform {\n    readonly angle: number;\n    readonly matrix: SVGMatrix;\n    readonly type: number;\n    setMatrix(matrix: SVGMatrix): void;\n    setRotate(angle: number, cx: number, cy: number): void;\n    setScale(sx: number, sy: number): void;\n    setSkewX(angle: number): void;\n    setSkewY(angle: number): void;\n    setTranslate(tx: number, ty: number): void;\n    readonly SVG_TRANSFORM_MATRIX: number;\n    readonly SVG_TRANSFORM_ROTATE: number;\n    readonly SVG_TRANSFORM_SCALE: number;\n    readonly SVG_TRANSFORM_SKEWX: number;\n    readonly SVG_TRANSFORM_SKEWY: number;\n    readonly SVG_TRANSFORM_TRANSLATE: number;\n    readonly SVG_TRANSFORM_UNKNOWN: number;\n}\n\ndeclare var SVGTransform: {\n    prototype: SVGTransform;\n    new(): SVGTransform;\n    readonly SVG_TRANSFORM_MATRIX: number;\n    readonly SVG_TRANSFORM_ROTATE: number;\n    readonly SVG_TRANSFORM_SCALE: number;\n    readonly SVG_TRANSFORM_SKEWX: number;\n    readonly SVG_TRANSFORM_SKEWY: number;\n    readonly SVG_TRANSFORM_TRANSLATE: number;\n    readonly SVG_TRANSFORM_UNKNOWN: number;\n};\n\ninterface SVGTransformList {\n    readonly numberOfItems: number;\n    appendItem(newItem: SVGTransform): SVGTransform;\n    clear(): void;\n    consolidate(): SVGTransform;\n    createSVGTransformFromMatrix(matrix: SVGMatrix): SVGTransform;\n    getItem(index: number): SVGTransform;\n    initialize(newItem: SVGTransform): SVGTransform;\n    insertItemBefore(newItem: SVGTransform, index: number): SVGTransform;\n    removeItem(index: number): SVGTransform;\n    replaceItem(newItem: SVGTransform, index: number): SVGTransform;\n}\n\ndeclare var SVGTransformList: {\n    prototype: SVGTransformList;\n    new(): SVGTransformList;\n};\n\ninterface SVGTSpanElement extends SVGTextPositioningElement {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTSpanElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGTSpanElement: {\n    prototype: SVGTSpanElement;\n    new(): SVGTSpanElement;\n};\n\ninterface SVGUnitTypes {\n    readonly SVG_UNIT_TYPE_OBJECTBOUNDINGBOX: number;\n    readonly SVG_UNIT_TYPE_UNKNOWN: number;\n    readonly SVG_UNIT_TYPE_USERSPACEONUSE: number;\n}\ndeclare var SVGUnitTypes: SVGUnitTypes;\n\ninterface SVGUseElement extends SVGGraphicsElement, SVGURIReference {\n    readonly animatedInstanceRoot: SVGElementInstance;\n    readonly height: SVGAnimatedLength;\n    readonly instanceRoot: SVGElementInstance;\n    readonly width: SVGAnimatedLength;\n    readonly x: SVGAnimatedLength;\n    readonly y: SVGAnimatedLength;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGUseElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGUseElement: {\n    prototype: SVGUseElement;\n    new(): SVGUseElement;\n};\n\ninterface SVGViewElement extends SVGElement, SVGZoomAndPan, SVGFitToViewBox {\n    readonly viewTarget: SVGStringList;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGViewElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGViewElement: {\n    prototype: SVGViewElement;\n    new(): SVGViewElement;\n};\n\ninterface SVGZoomAndPan {\n    readonly zoomAndPan: number;\n}\n\ndeclare var SVGZoomAndPan: {\n    readonly SVG_ZOOMANDPAN_DISABLE: number;\n    readonly SVG_ZOOMANDPAN_MAGNIFY: number;\n    readonly SVG_ZOOMANDPAN_UNKNOWN: number;\n};\n\ninterface SVGZoomEvent extends UIEvent {\n    readonly newScale: number;\n    readonly newTranslate: SVGPoint;\n    readonly previousScale: number;\n    readonly previousTranslate: SVGPoint;\n    readonly zoomRectScreen: SVGRect;\n}\n\ndeclare var SVGZoomEvent: {\n    prototype: SVGZoomEvent;\n    new(): SVGZoomEvent;\n};\n\ninterface SyncManager {\n    getTags(): any;\n    register(tag: string): Promise<void>;\n}\n\ndeclare var SyncManager: {\n    prototype: SyncManager;\n    new(): SyncManager;\n};\n\ninterface Text extends CharacterData {\n    readonly wholeText: string;\n    readonly assignedSlot: HTMLSlotElement | null;\n    splitText(offset: number): Text;\n}\n\ndeclare var Text: {\n    prototype: Text;\n    new(data?: string): Text;\n};\n\ninterface TextEvent extends UIEvent {\n    readonly data: string;\n    readonly inputMethod: number;\n    readonly locale: string;\n    initTextEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, dataArg: string, inputMethod: number, locale: string): void;\n    readonly DOM_INPUT_METHOD_DROP: number;\n    readonly DOM_INPUT_METHOD_HANDWRITING: number;\n    readonly DOM_INPUT_METHOD_IME: number;\n    readonly DOM_INPUT_METHOD_KEYBOARD: number;\n    readonly DOM_INPUT_METHOD_MULTIMODAL: number;\n    readonly DOM_INPUT_METHOD_OPTION: number;\n    readonly DOM_INPUT_METHOD_PASTE: number;\n    readonly DOM_INPUT_METHOD_SCRIPT: number;\n    readonly DOM_INPUT_METHOD_UNKNOWN: number;\n    readonly DOM_INPUT_METHOD_VOICE: number;\n}\n\ndeclare var TextEvent: {\n    prototype: TextEvent;\n    new(): TextEvent;\n    readonly DOM_INPUT_METHOD_DROP: number;\n    readonly DOM_INPUT_METHOD_HANDWRITING: number;\n    readonly DOM_INPUT_METHOD_IME: number;\n    readonly DOM_INPUT_METHOD_KEYBOARD: number;\n    readonly DOM_INPUT_METHOD_MULTIMODAL: number;\n    readonly DOM_INPUT_METHOD_OPTION: number;\n    readonly DOM_INPUT_METHOD_PASTE: number;\n    readonly DOM_INPUT_METHOD_SCRIPT: number;\n    readonly DOM_INPUT_METHOD_UNKNOWN: number;\n    readonly DOM_INPUT_METHOD_VOICE: number;\n};\n\ninterface TextMetrics {\n    readonly width: number;\n}\n\ndeclare var TextMetrics: {\n    prototype: TextMetrics;\n    new(): TextMetrics;\n};\n\ninterface TextTrackEventMap {\n    "cuechange": Event;\n    "error": Event;\n    "load": Event;\n}\n\ninterface TextTrack extends EventTarget {\n    readonly activeCues: TextTrackCueList;\n    readonly cues: TextTrackCueList;\n    readonly inBandMetadataTrackDispatchType: string;\n    readonly kind: string;\n    readonly label: string;\n    readonly language: string;\n    mode: any;\n    oncuechange: (this: TextTrack, ev: Event) => any;\n    onerror: (this: TextTrack, ev: Event) => any;\n    onload: (this: TextTrack, ev: Event) => any;\n    readonly readyState: number;\n    addCue(cue: TextTrackCue): void;\n    removeCue(cue: TextTrackCue): void;\n    readonly DISABLED: number;\n    readonly ERROR: number;\n    readonly HIDDEN: number;\n    readonly LOADED: number;\n    readonly LOADING: number;\n    readonly NONE: number;\n    readonly SHOWING: number;\n    addEventListener<K extends keyof TextTrackEventMap>(type: K, listener: (this: TextTrack, ev: TextTrackEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var TextTrack: {\n    prototype: TextTrack;\n    new(): TextTrack;\n    readonly DISABLED: number;\n    readonly ERROR: number;\n    readonly HIDDEN: number;\n    readonly LOADED: number;\n    readonly LOADING: number;\n    readonly NONE: number;\n    readonly SHOWING: number;\n};\n\ninterface TextTrackCueEventMap {\n    "enter": Event;\n    "exit": Event;\n}\n\ninterface TextTrackCue extends EventTarget {\n    endTime: number;\n    id: string;\n    onenter: (this: TextTrackCue, ev: Event) => any;\n    onexit: (this: TextTrackCue, ev: Event) => any;\n    pauseOnExit: boolean;\n    startTime: number;\n    text: string;\n    readonly track: TextTrack;\n    getCueAsHTML(): DocumentFragment;\n    addEventListener<K extends keyof TextTrackCueEventMap>(type: K, listener: (this: TextTrackCue, ev: TextTrackCueEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var TextTrackCue: {\n    prototype: TextTrackCue;\n    new(startTime: number, endTime: number, text: string): TextTrackCue;\n};\n\ninterface TextTrackCueList {\n    readonly length: number;\n    getCueById(id: string): TextTrackCue;\n    item(index: number): TextTrackCue;\n    [index: number]: TextTrackCue;\n}\n\ndeclare var TextTrackCueList: {\n    prototype: TextTrackCueList;\n    new(): TextTrackCueList;\n};\n\ninterface TextTrackListEventMap {\n    "addtrack": TrackEvent;\n}\n\ninterface TextTrackList extends EventTarget {\n    readonly length: number;\n    onaddtrack: ((this: TextTrackList, ev: TrackEvent) => any) | null;\n    item(index: number): TextTrack;\n    addEventListener<K extends keyof TextTrackListEventMap>(type: K, listener: (this: TextTrackList, ev: TextTrackListEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n    [index: number]: TextTrack;\n}\n\ndeclare var TextTrackList: {\n    prototype: TextTrackList;\n    new(): TextTrackList;\n};\n\ninterface TimeRanges {\n    readonly length: number;\n    end(index: number): number;\n    start(index: number): number;\n}\n\ndeclare var TimeRanges: {\n    prototype: TimeRanges;\n    new(): TimeRanges;\n};\n\ninterface Touch {\n    readonly clientX: number;\n    readonly clientY: number;\n    readonly identifier: number;\n    readonly pageX: number;\n    readonly pageY: number;\n    readonly screenX: number;\n    readonly screenY: number;\n    readonly target: EventTarget;\n}\n\ndeclare var Touch: {\n    prototype: Touch;\n    new(): Touch;\n};\n\ninterface TouchEvent extends UIEvent {\n    readonly altKey: boolean;\n    readonly changedTouches: TouchList;\n    readonly charCode: number;\n    readonly ctrlKey: boolean;\n    readonly keyCode: number;\n    readonly metaKey: boolean;\n    readonly shiftKey: boolean;\n    readonly targetTouches: TouchList;\n    readonly touches: TouchList;\n    readonly which: number;\n}\n\ndeclare var TouchEvent: {\n    prototype: TouchEvent;\n    new(type: string, touchEventInit?: TouchEventInit): TouchEvent;\n};\n\ninterface TouchList {\n    readonly length: number;\n    item(index: number): Touch | null;\n    [index: number]: Touch;\n}\n\ndeclare var TouchList: {\n    prototype: TouchList;\n    new(): TouchList;\n};\n\ninterface TrackEvent extends Event {\n    readonly track: VideoTrack | AudioTrack | TextTrack | null;\n}\n\ndeclare var TrackEvent: {\n    prototype: TrackEvent;\n    new(typeArg: string, eventInitDict?: TrackEventInit): TrackEvent;\n};\n\ninterface TransitionEvent extends Event {\n    readonly elapsedTime: number;\n    readonly propertyName: string;\n    initTransitionEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, propertyNameArg: string, elapsedTimeArg: number): void;\n}\n\ndeclare var TransitionEvent: {\n    prototype: TransitionEvent;\n    new(typeArg: string, eventInitDict?: TransitionEventInit): TransitionEvent;\n};\n\ninterface TreeWalker {\n    currentNode: Node;\n    readonly expandEntityReferences: boolean;\n    readonly filter: NodeFilter;\n    readonly root: Node;\n    readonly whatToShow: number;\n    firstChild(): Node;\n    lastChild(): Node;\n    nextNode(): Node;\n    nextSibling(): Node;\n    parentNode(): Node;\n    previousNode(): Node;\n    previousSibling(): Node;\n}\n\ndeclare var TreeWalker: {\n    prototype: TreeWalker;\n    new(): TreeWalker;\n};\n\ninterface UIEvent extends Event {\n    readonly detail: number;\n    readonly view: Window;\n    initUIEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number): void;\n}\n\ndeclare var UIEvent: {\n    prototype: UIEvent;\n    new(typeArg: string, eventInitDict?: UIEventInit): UIEvent;\n};\n\ninterface UnviewableContentIdentifiedEvent extends NavigationEventWithReferrer {\n    readonly mediaType: string;\n}\n\ndeclare var UnviewableContentIdentifiedEvent: {\n    prototype: UnviewableContentIdentifiedEvent;\n    new(): UnviewableContentIdentifiedEvent;\n};\n\ninterface URL {\n    hash: string;\n    host: string;\n    hostname: string;\n    href: string;\n    readonly origin: string;\n    password: string;\n    pathname: string;\n    port: string;\n    protocol: string;\n    search: string;\n    username: string;\n    readonly searchParams: URLSearchParams;\n    toString(): string;\n}\n\ndeclare var URL: {\n    prototype: URL;\n    new(url: string, base?: string): URL;\n    createObjectURL(object: any, options?: ObjectURLOptions): string;\n    revokeObjectURL(url: string): void;\n};\n\ninterface ValidityState {\n    readonly badInput: boolean;\n    readonly customError: boolean;\n    readonly patternMismatch: boolean;\n    readonly rangeOverflow: boolean;\n    readonly rangeUnderflow: boolean;\n    readonly stepMismatch: boolean;\n    readonly tooLong: boolean;\n    readonly typeMismatch: boolean;\n    readonly valid: boolean;\n    readonly valueMissing: boolean;\n}\n\ndeclare var ValidityState: {\n    prototype: ValidityState;\n    new(): ValidityState;\n};\n\ninterface VideoPlaybackQuality {\n    readonly corruptedVideoFrames: number;\n    readonly creationTime: number;\n    readonly droppedVideoFrames: number;\n    readonly totalFrameDelay: number;\n    readonly totalVideoFrames: number;\n}\n\ndeclare var VideoPlaybackQuality: {\n    prototype: VideoPlaybackQuality;\n    new(): VideoPlaybackQuality;\n};\n\ninterface VideoTrack {\n    readonly id: string;\n    kind: string;\n    readonly label: string;\n    language: string;\n    selected: boolean;\n    readonly sourceBuffer: SourceBuffer;\n}\n\ndeclare var VideoTrack: {\n    prototype: VideoTrack;\n    new(): VideoTrack;\n};\n\ninterface VideoTrackListEventMap {\n    "addtrack": TrackEvent;\n    "change": Event;\n    "removetrack": TrackEvent;\n}\n\ninterface VideoTrackList extends EventTarget {\n    readonly length: number;\n    onaddtrack: (this: VideoTrackList, ev: TrackEvent) => any;\n    onchange: (this: VideoTrackList, ev: Event) => any;\n    onremovetrack: (this: VideoTrackList, ev: TrackEvent) => any;\n    readonly selectedIndex: number;\n    getTrackById(id: string): VideoTrack | null;\n    item(index: number): VideoTrack;\n    addEventListener<K extends keyof VideoTrackListEventMap>(type: K, listener: (this: VideoTrackList, ev: VideoTrackListEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n    [index: number]: VideoTrack;\n}\n\ndeclare var VideoTrackList: {\n    prototype: VideoTrackList;\n    new(): VideoTrackList;\n};\n\ninterface WaveShaperNode extends AudioNode {\n    curve: Float32Array | null;\n    oversample: OverSampleType;\n}\n\ndeclare var WaveShaperNode: {\n    prototype: WaveShaperNode;\n    new(): WaveShaperNode;\n};\n\ninterface WebAuthentication {\n    getAssertion(assertionChallenge: any, options?: AssertionOptions): Promise<WebAuthnAssertion>;\n    makeCredential(accountInformation: Account, cryptoParameters: ScopedCredentialParameters[], attestationChallenge: any, options?: ScopedCredentialOptions): Promise<ScopedCredentialInfo>;\n}\n\ndeclare var WebAuthentication: {\n    prototype: WebAuthentication;\n    new(): WebAuthentication;\n};\n\ninterface WebAuthnAssertion {\n    readonly authenticatorData: ArrayBuffer;\n    readonly clientData: ArrayBuffer;\n    readonly credential: ScopedCredential;\n    readonly signature: ArrayBuffer;\n}\n\ndeclare var WebAuthnAssertion: {\n    prototype: WebAuthnAssertion;\n    new(): WebAuthnAssertion;\n};\n\ninterface WEBGL_compressed_texture_s3tc {\n    readonly COMPRESSED_RGB_S3TC_DXT1_EXT: number;\n    readonly COMPRESSED_RGBA_S3TC_DXT1_EXT: number;\n    readonly COMPRESSED_RGBA_S3TC_DXT3_EXT: number;\n    readonly COMPRESSED_RGBA_S3TC_DXT5_EXT: number;\n}\n\ndeclare var WEBGL_compressed_texture_s3tc: {\n    prototype: WEBGL_compressed_texture_s3tc;\n    new(): WEBGL_compressed_texture_s3tc;\n    readonly COMPRESSED_RGB_S3TC_DXT1_EXT: number;\n    readonly COMPRESSED_RGBA_S3TC_DXT1_EXT: number;\n    readonly COMPRESSED_RGBA_S3TC_DXT3_EXT: number;\n    readonly COMPRESSED_RGBA_S3TC_DXT5_EXT: number;\n};\n\ninterface WEBGL_debug_renderer_info {\n    readonly UNMASKED_RENDERER_WEBGL: number;\n    readonly UNMASKED_VENDOR_WEBGL: number;\n}\n\ndeclare var WEBGL_debug_renderer_info: {\n    prototype: WEBGL_debug_renderer_info;\n    new(): WEBGL_debug_renderer_info;\n    readonly UNMASKED_RENDERER_WEBGL: number;\n    readonly UNMASKED_VENDOR_WEBGL: number;\n};\n\ninterface WEBGL_depth_texture {\n    readonly UNSIGNED_INT_24_8_WEBGL: number;\n}\n\ndeclare var WEBGL_depth_texture: {\n    prototype: WEBGL_depth_texture;\n    new(): WEBGL_depth_texture;\n    readonly UNSIGNED_INT_24_8_WEBGL: number;\n};\n\ninterface WebGLActiveInfo {\n    readonly name: string;\n    readonly size: number;\n    readonly type: number;\n}\n\ndeclare var WebGLActiveInfo: {\n    prototype: WebGLActiveInfo;\n    new(): WebGLActiveInfo;\n};\n\ninterface WebGLBuffer extends WebGLObject {\n}\n\ndeclare var WebGLBuffer: {\n    prototype: WebGLBuffer;\n    new(): WebGLBuffer;\n};\n\ninterface WebGLContextEvent extends Event {\n    readonly statusMessage: string;\n}\n\ndeclare var WebGLContextEvent: {\n    prototype: WebGLContextEvent;\n    new(typeArg: string, eventInitDict?: WebGLContextEventInit): WebGLContextEvent;\n};\n\ninterface WebGLFramebuffer extends WebGLObject {\n}\n\ndeclare var WebGLFramebuffer: {\n    prototype: WebGLFramebuffer;\n    new(): WebGLFramebuffer;\n};\n\ninterface WebGLObject {\n}\n\ndeclare var WebGLObject: {\n    prototype: WebGLObject;\n    new(): WebGLObject;\n};\n\ninterface WebGLProgram extends WebGLObject {\n}\n\ndeclare var WebGLProgram: {\n    prototype: WebGLProgram;\n    new(): WebGLProgram;\n};\n\ninterface WebGLRenderbuffer extends WebGLObject {\n}\n\ndeclare var WebGLRenderbuffer: {\n    prototype: WebGLRenderbuffer;\n    new(): WebGLRenderbuffer;\n};\n\ninterface WebGLRenderingContext {\n    readonly canvas: HTMLCanvasElement;\n    readonly drawingBufferHeight: number;\n    readonly drawingBufferWidth: number;\n    activeTexture(texture: number): void;\n    attachShader(program: WebGLProgram | null, shader: WebGLShader | null): void;\n    bindAttribLocation(program: WebGLProgram | null, index: number, name: string): void;\n    bindBuffer(target: number, buffer: WebGLBuffer | null): void;\n    bindFramebuffer(target: number, framebuffer: WebGLFramebuffer | null): void;\n    bindRenderbuffer(target: number, renderbuffer: WebGLRenderbuffer | null): void;\n    bindTexture(target: number, texture: WebGLTexture | null): void;\n    blendColor(red: number, green: number, blue: number, alpha: number): void;\n    blendEquation(mode: number): void;\n    blendEquationSeparate(modeRGB: number, modeAlpha: number): void;\n    blendFunc(sfactor: number, dfactor: number): void;\n    blendFuncSeparate(srcRGB: number, dstRGB: number, srcAlpha: number, dstAlpha: number): void;\n    bufferData(target: number, size: number | ArrayBufferView | ArrayBuffer, usage: number): void;\n    bufferSubData(target: number, offset: number, data: ArrayBufferView | ArrayBuffer): void;\n    checkFramebufferStatus(target: number): number;\n    clear(mask: number): void;\n    clearColor(red: number, green: number, blue: number, alpha: number): void;\n    clearDepth(depth: number): void;\n    clearStencil(s: number): void;\n    colorMask(red: boolean, green: boolean, blue: boolean, alpha: boolean): void;\n    compileShader(shader: WebGLShader | null): void;\n    compressedTexImage2D(target: number, level: number, internalformat: number, width: number, height: number, border: number, data: ArrayBufferView): void;\n    compressedTexSubImage2D(target: number, level: number, xoffset: number, yoffset: number, width: number, height: number, format: number, data: ArrayBufferView): void;\n    copyTexImage2D(target: number, level: number, internalformat: number, x: number, y: number, width: number, height: number, border: number): void;\n    copyTexSubImage2D(target: number, level: number, xoffset: number, yoffset: number, x: number, y: number, width: number, height: number): void;\n    createBuffer(): WebGLBuffer | null;\n    createFramebuffer(): WebGLFramebuffer | null;\n    createProgram(): WebGLProgram | null;\n    createRenderbuffer(): WebGLRenderbuffer | null;\n    createShader(type: number): WebGLShader | null;\n    createTexture(): WebGLTexture | null;\n    cullFace(mode: number): void;\n    deleteBuffer(buffer: WebGLBuffer | null): void;\n    deleteFramebuffer(framebuffer: WebGLFramebuffer | null): void;\n    deleteProgram(program: WebGLProgram | null): void;\n    deleteRenderbuffer(renderbuffer: WebGLRenderbuffer | null): void;\n    deleteShader(shader: WebGLShader | null): void;\n    deleteTexture(texture: WebGLTexture | null): void;\n    depthFunc(func: number): void;\n    depthMask(flag: boolean): void;\n    depthRange(zNear: number, zFar: number): void;\n    detachShader(program: WebGLProgram | null, shader: WebGLShader | null): void;\n    disable(cap: number): void;\n    disableVertexAttribArray(index: number): void;\n    drawArrays(mode: number, first: number, count: number): void;\n    drawElements(mode: number, count: number, type: number, offset: number): void;\n    enable(cap: number): void;\n    enableVertexAttribArray(index: number): void;\n    finish(): void;\n    flush(): void;\n    framebufferRenderbuffer(target: number, attachment: number, renderbuffertarget: number, renderbuffer: WebGLRenderbuffer | null): void;\n    framebufferTexture2D(target: number, attachment: number, textarget: number, texture: WebGLTexture | null, level: number): void;\n    frontFace(mode: number): void;\n    generateMipmap(target: number): void;\n    getActiveAttrib(program: WebGLProgram | null, index: number): WebGLActiveInfo | null;\n    getActiveUniform(program: WebGLProgram | null, index: number): WebGLActiveInfo | null;\n    getAttachedShaders(program: WebGLProgram | null): WebGLShader[] | null;\n    getAttribLocation(program: WebGLProgram | null, name: string): number;\n    getBufferParameter(target: number, pname: number): any;\n    getContextAttributes(): WebGLContextAttributes;\n    getError(): number;\n    getExtension(name: string): any;\n    getFramebufferAttachmentParameter(target: number, attachment: number, pname: number): any;\n    getParameter(pname: number): any;\n    getProgramInfoLog(program: WebGLProgram | null): string | null;\n    getProgramParameter(program: WebGLProgram | null, pname: number): any;\n    getRenderbufferParameter(target: number, pname: number): any;\n    getShaderInfoLog(shader: WebGLShader | null): string | null;\n    getShaderParameter(shader: WebGLShader | null, pname: number): any;\n    getShaderPrecisionFormat(shadertype: number, precisiontype: number): WebGLShaderPrecisionFormat | null;\n    getShaderSource(shader: WebGLShader | null): string | null;\n    getSupportedExtensions(): string[] | null;\n    getTexParameter(target: number, pname: number): any;\n    getUniform(program: WebGLProgram | null, location: WebGLUniformLocation | null): any;\n    getUniformLocation(program: WebGLProgram | null, name: string): WebGLUniformLocation | null;\n    getVertexAttrib(index: number, pname: number): any;\n    getVertexAttribOffset(index: number, pname: number): number;\n    hint(target: number, mode: number): void;\n    isBuffer(buffer: WebGLBuffer | null): boolean;\n    isContextLost(): boolean;\n    isEnabled(cap: number): boolean;\n    isFramebuffer(framebuffer: WebGLFramebuffer | null): boolean;\n    isProgram(program: WebGLProgram | null): boolean;\n    isRenderbuffer(renderbuffer: WebGLRenderbuffer | null): boolean;\n    isShader(shader: WebGLShader | null): boolean;\n    isTexture(texture: WebGLTexture | null): boolean;\n    lineWidth(width: number): void;\n    linkProgram(program: WebGLProgram | null): void;\n    pixelStorei(pname: number, param: number | boolean): void;\n    polygonOffset(factor: number, units: number): void;\n    readPixels(x: number, y: number, width: number, height: number, format: number, type: number, pixels: ArrayBufferView | null): void;\n    renderbufferStorage(target: number, internalformat: number, width: number, height: number): void;\n    sampleCoverage(value: number, invert: boolean): void;\n    scissor(x: number, y: number, width: number, height: number): void;\n    shaderSource(shader: WebGLShader | null, source: string): void;\n    stencilFunc(func: number, ref: number, mask: number): void;\n    stencilFuncSeparate(face: number, func: number, ref: number, mask: number): void;\n    stencilMask(mask: number): void;\n    stencilMaskSeparate(face: number, mask: number): void;\n    stencilOp(fail: number, zfail: number, zpass: number): void;\n    stencilOpSeparate(face: number, fail: number, zfail: number, zpass: number): void;\n    texImage2D(target: number, level: number, internalformat: number, width: number, height: number, border: number, format: number, type: number, pixels: ArrayBufferView | null): void;\n    texImage2D(target: number, level: number, internalformat: number, format: number, type: number, pixels: ImageBitmap | ImageData | HTMLVideoElement | HTMLImageElement | HTMLCanvasElement): void;\n    texParameterf(target: number, pname: number, param: number): void;\n    texParameteri(target: number, pname: number, param: number): void;\n    texSubImage2D(target: number, level: number, xoffset: number, yoffset: number, width: number, height: number, format: number, type: number, pixels: ArrayBufferView | null): void;\n    texSubImage2D(target: number, level: number, xoffset: number, yoffset: number, format: number, type: number, pixels: ImageBitmap | ImageData | HTMLVideoElement | HTMLImageElement | HTMLCanvasElement): void;\n    uniform1f(location: WebGLUniformLocation | null, x: number): void;\n    uniform1fv(location: WebGLUniformLocation, v: Float32Array | number[]): void;\n    uniform1i(location: WebGLUniformLocation | null, x: number): void;\n    uniform1iv(location: WebGLUniformLocation, v: Int32Array | number[]): void;\n    uniform2f(location: WebGLUniformLocation | null, x: number, y: number): void;\n    uniform2fv(location: WebGLUniformLocation, v: Float32Array | number[]): void;\n    uniform2i(location: WebGLUniformLocation | null, x: number, y: number): void;\n    uniform2iv(location: WebGLUniformLocation, v: Int32Array | number[]): void;\n    uniform3f(location: WebGLUniformLocation | null, x: number, y: number, z: number): void;\n    uniform3fv(location: WebGLUniformLocation, v: Float32Array | number[]): void;\n    uniform3i(location: WebGLUniformLocation | null, x: number, y: number, z: number): void;\n    uniform3iv(location: WebGLUniformLocation, v: Int32Array | number[]): void;\n    uniform4f(location: WebGLUniformLocation | null, x: number, y: number, z: number, w: number): void;\n    uniform4fv(location: WebGLUniformLocation, v: Float32Array | number[]): void;\n    uniform4i(location: WebGLUniformLocation | null, x: number, y: number, z: number, w: number): void;\n    uniform4iv(location: WebGLUniformLocation, v: Int32Array | number[]): void;\n    uniformMatrix2fv(location: WebGLUniformLocation, transpose: boolean, value: Float32Array | number[]): void;\n    uniformMatrix3fv(location: WebGLUniformLocation, transpose: boolean, value: Float32Array | number[]): void;\n    uniformMatrix4fv(location: WebGLUniformLocation, transpose: boolean, value: Float32Array | number[]): void;\n    useProgram(program: WebGLProgram | null): void;\n    validateProgram(program: WebGLProgram | null): void;\n    vertexAttrib1f(indx: number, x: number): void;\n    vertexAttrib1fv(indx: number, values: Float32Array | number[]): void;\n    vertexAttrib2f(indx: number, x: number, y: number): void;\n    vertexAttrib2fv(indx: number, values: Float32Array | number[]): void;\n    vertexAttrib3f(indx: number, x: number, y: number, z: number): void;\n    vertexAttrib3fv(indx: number, values: Float32Array | number[]): void;\n    vertexAttrib4f(indx: number, x: number, y: number, z: number, w: number): void;\n    vertexAttrib4fv(indx: number, values: Float32Array | number[]): void;\n    vertexAttribPointer(indx: number, size: number, type: number, normalized: boolean, stride: number, offset: number): void;\n    viewport(x: number, y: number, width: number, height: number): void;\n    readonly ACTIVE_ATTRIBUTES: number;\n    readonly ACTIVE_TEXTURE: number;\n    readonly ACTIVE_UNIFORMS: number;\n    readonly ALIASED_LINE_WIDTH_RANGE: number;\n    readonly ALIASED_POINT_SIZE_RANGE: number;\n    readonly ALPHA: number;\n    readonly ALPHA_BITS: number;\n    readonly ALWAYS: number;\n    readonly ARRAY_BUFFER: number;\n    readonly ARRAY_BUFFER_BINDING: number;\n    readonly ATTACHED_SHADERS: number;\n    readonly BACK: number;\n    readonly BLEND: number;\n    readonly BLEND_COLOR: number;\n    readonly BLEND_DST_ALPHA: number;\n    readonly BLEND_DST_RGB: number;\n    readonly BLEND_EQUATION: number;\n    readonly BLEND_EQUATION_ALPHA: number;\n    readonly BLEND_EQUATION_RGB: number;\n    readonly BLEND_SRC_ALPHA: number;\n    readonly BLEND_SRC_RGB: number;\n    readonly BLUE_BITS: number;\n    readonly BOOL: number;\n    readonly BOOL_VEC2: number;\n    readonly BOOL_VEC3: number;\n    readonly BOOL_VEC4: number;\n    readonly BROWSER_DEFAULT_WEBGL: number;\n    readonly BUFFER_SIZE: number;\n    readonly BUFFER_USAGE: number;\n    readonly BYTE: number;\n    readonly CCW: number;\n    readonly CLAMP_TO_EDGE: number;\n    readonly COLOR_ATTACHMENT0: number;\n    readonly COLOR_BUFFER_BIT: number;\n    readonly COLOR_CLEAR_VALUE: number;\n    readonly COLOR_WRITEMASK: number;\n    readonly COMPILE_STATUS: number;\n    readonly COMPRESSED_TEXTURE_FORMATS: number;\n    readonly CONSTANT_ALPHA: number;\n    readonly CONSTANT_COLOR: number;\n    readonly CONTEXT_LOST_WEBGL: number;\n    readonly CULL_FACE: number;\n    readonly CULL_FACE_MODE: number;\n    readonly CURRENT_PROGRAM: number;\n    readonly CURRENT_VERTEX_ATTRIB: number;\n    readonly CW: number;\n    readonly DECR: number;\n    readonly DECR_WRAP: number;\n    readonly DELETE_STATUS: number;\n    readonly DEPTH_ATTACHMENT: number;\n    readonly DEPTH_BITS: number;\n    readonly DEPTH_BUFFER_BIT: number;\n    readonly DEPTH_CLEAR_VALUE: number;\n    readonly DEPTH_COMPONENT: number;\n    readonly DEPTH_COMPONENT16: number;\n    readonly DEPTH_FUNC: number;\n    readonly DEPTH_RANGE: number;\n    readonly DEPTH_STENCIL: number;\n    readonly DEPTH_STENCIL_ATTACHMENT: number;\n    readonly DEPTH_TEST: number;\n    readonly DEPTH_WRITEMASK: number;\n    readonly DITHER: number;\n    readonly DONT_CARE: number;\n    readonly DST_ALPHA: number;\n    readonly DST_COLOR: number;\n    readonly DYNAMIC_DRAW: number;\n    readonly ELEMENT_ARRAY_BUFFER: number;\n    readonly ELEMENT_ARRAY_BUFFER_BINDING: number;\n    readonly EQUAL: number;\n    readonly FASTEST: number;\n    readonly FLOAT: number;\n    readonly FLOAT_MAT2: number;\n    readonly FLOAT_MAT3: number;\n    readonly FLOAT_MAT4: number;\n    readonly FLOAT_VEC2: number;\n    readonly FLOAT_VEC3: number;\n    readonly FLOAT_VEC4: number;\n    readonly FRAGMENT_SHADER: number;\n    readonly FRAMEBUFFER: number;\n    readonly FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: number;\n    readonly FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: number;\n    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: number;\n    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: number;\n    readonly FRAMEBUFFER_BINDING: number;\n    readonly FRAMEBUFFER_COMPLETE: number;\n    readonly FRAMEBUFFER_INCOMPLETE_ATTACHMENT: number;\n    readonly FRAMEBUFFER_INCOMPLETE_DIMENSIONS: number;\n    readonly FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: number;\n    readonly FRAMEBUFFER_UNSUPPORTED: number;\n    readonly FRONT: number;\n    readonly FRONT_AND_BACK: number;\n    readonly FRONT_FACE: number;\n    readonly FUNC_ADD: number;\n    readonly FUNC_REVERSE_SUBTRACT: number;\n    readonly FUNC_SUBTRACT: number;\n    readonly GENERATE_MIPMAP_HINT: number;\n    readonly GEQUAL: number;\n    readonly GREATER: number;\n    readonly GREEN_BITS: number;\n    readonly HIGH_FLOAT: number;\n    readonly HIGH_INT: number;\n    readonly IMPLEMENTATION_COLOR_READ_FORMAT: number;\n    readonly IMPLEMENTATION_COLOR_READ_TYPE: number;\n    readonly INCR: number;\n    readonly INCR_WRAP: number;\n    readonly INT: number;\n    readonly INT_VEC2: number;\n    readonly INT_VEC3: number;\n    readonly INT_VEC4: number;\n    readonly INVALID_ENUM: number;\n    readonly INVALID_FRAMEBUFFER_OPERATION: number;\n    readonly INVALID_OPERATION: number;\n    readonly INVALID_VALUE: number;\n    readonly INVERT: number;\n    readonly KEEP: number;\n    readonly LEQUAL: number;\n    readonly LESS: number;\n    readonly LINE_LOOP: number;\n    readonly LINE_STRIP: number;\n    readonly LINE_WIDTH: number;\n    readonly LINEAR: number;\n    readonly LINEAR_MIPMAP_LINEAR: number;\n    readonly LINEAR_MIPMAP_NEAREST: number;\n    readonly LINES: number;\n    readonly LINK_STATUS: number;\n    readonly LOW_FLOAT: number;\n    readonly LOW_INT: number;\n    readonly LUMINANCE: number;\n    readonly LUMINANCE_ALPHA: number;\n    readonly MAX_COMBINED_TEXTURE_IMAGE_UNITS: number;\n    readonly MAX_CUBE_MAP_TEXTURE_SIZE: number;\n    readonly MAX_FRAGMENT_UNIFORM_VECTORS: number;\n    readonly MAX_RENDERBUFFER_SIZE: number;\n    readonly MAX_TEXTURE_IMAGE_UNITS: number;\n    readonly MAX_TEXTURE_SIZE: number;\n    readonly MAX_VARYING_VECTORS: number;\n    readonly MAX_VERTEX_ATTRIBS: number;\n    readonly MAX_VERTEX_TEXTURE_IMAGE_UNITS: number;\n    readonly MAX_VERTEX_UNIFORM_VECTORS: number;\n    readonly MAX_VIEWPORT_DIMS: number;\n    readonly MEDIUM_FLOAT: number;\n    readonly MEDIUM_INT: number;\n    readonly MIRRORED_REPEAT: number;\n    readonly NEAREST: number;\n    readonly NEAREST_MIPMAP_LINEAR: number;\n    readonly NEAREST_MIPMAP_NEAREST: number;\n    readonly NEVER: number;\n    readonly NICEST: number;\n    readonly NO_ERROR: number;\n    readonly NONE: number;\n    readonly NOTEQUAL: number;\n    readonly ONE: number;\n    readonly ONE_MINUS_CONSTANT_ALPHA: number;\n    readonly ONE_MINUS_CONSTANT_COLOR: number;\n    readonly ONE_MINUS_DST_ALPHA: number;\n    readonly ONE_MINUS_DST_COLOR: number;\n    readonly ONE_MINUS_SRC_ALPHA: number;\n    readonly ONE_MINUS_SRC_COLOR: number;\n    readonly OUT_OF_MEMORY: number;\n    readonly PACK_ALIGNMENT: number;\n    readonly POINTS: number;\n    readonly POLYGON_OFFSET_FACTOR: number;\n    readonly POLYGON_OFFSET_FILL: number;\n    readonly POLYGON_OFFSET_UNITS: number;\n    readonly RED_BITS: number;\n    readonly RENDERBUFFER: number;\n    readonly RENDERBUFFER_ALPHA_SIZE: number;\n    readonly RENDERBUFFER_BINDING: number;\n    readonly RENDERBUFFER_BLUE_SIZE: number;\n    readonly RENDERBUFFER_DEPTH_SIZE: number;\n    readonly RENDERBUFFER_GREEN_SIZE: number;\n    readonly RENDERBUFFER_HEIGHT: number;\n    readonly RENDERBUFFER_INTERNAL_FORMAT: number;\n    readonly RENDERBUFFER_RED_SIZE: number;\n    readonly RENDERBUFFER_STENCIL_SIZE: number;\n    readonly RENDERBUFFER_WIDTH: number;\n    readonly RENDERER: number;\n    readonly REPEAT: number;\n    readonly REPLACE: number;\n    readonly RGB: number;\n    readonly RGB5_A1: number;\n    readonly RGB565: number;\n    readonly RGBA: number;\n    readonly RGBA4: number;\n    readonly SAMPLE_ALPHA_TO_COVERAGE: number;\n    readonly SAMPLE_BUFFERS: number;\n    readonly SAMPLE_COVERAGE: number;\n    readonly SAMPLE_COVERAGE_INVERT: number;\n    readonly SAMPLE_COVERAGE_VALUE: number;\n    readonly SAMPLER_2D: number;\n    readonly SAMPLER_CUBE: number;\n    readonly SAMPLES: number;\n    readonly SCISSOR_BOX: number;\n    readonly SCISSOR_TEST: number;\n    readonly SHADER_TYPE: number;\n    readonly SHADING_LANGUAGE_VERSION: number;\n    readonly SHORT: number;\n    readonly SRC_ALPHA: number;\n    readonly SRC_ALPHA_SATURATE: number;\n    readonly SRC_COLOR: number;\n    readonly STATIC_DRAW: number;\n    readonly STENCIL_ATTACHMENT: number;\n    readonly STENCIL_BACK_FAIL: number;\n    readonly STENCIL_BACK_FUNC: number;\n    readonly STENCIL_BACK_PASS_DEPTH_FAIL: number;\n    readonly STENCIL_BACK_PASS_DEPTH_PASS: number;\n    readonly STENCIL_BACK_REF: number;\n    readonly STENCIL_BACK_VALUE_MASK: number;\n    readonly STENCIL_BACK_WRITEMASK: number;\n    readonly STENCIL_BITS: number;\n    readonly STENCIL_BUFFER_BIT: number;\n    readonly STENCIL_CLEAR_VALUE: number;\n    readonly STENCIL_FAIL: number;\n    readonly STENCIL_FUNC: number;\n    readonly STENCIL_INDEX: number;\n    readonly STENCIL_INDEX8: number;\n    readonly STENCIL_PASS_DEPTH_FAIL: number;\n    readonly STENCIL_PASS_DEPTH_PASS: number;\n    readonly STENCIL_REF: number;\n    readonly STENCIL_TEST: number;\n    readonly STENCIL_VALUE_MASK: number;\n    readonly STENCIL_WRITEMASK: number;\n    readonly STREAM_DRAW: number;\n    readonly SUBPIXEL_BITS: number;\n    readonly TEXTURE: number;\n    readonly TEXTURE_2D: number;\n    readonly TEXTURE_BINDING_2D: number;\n    readonly TEXTURE_BINDING_CUBE_MAP: number;\n    readonly TEXTURE_CUBE_MAP: number;\n    readonly TEXTURE_CUBE_MAP_NEGATIVE_X: number;\n    readonly TEXTURE_CUBE_MAP_NEGATIVE_Y: number;\n    readonly TEXTURE_CUBE_MAP_NEGATIVE_Z: number;\n    readonly TEXTURE_CUBE_MAP_POSITIVE_X: number;\n    readonly TEXTURE_CUBE_MAP_POSITIVE_Y: number;\n    readonly TEXTURE_CUBE_MAP_POSITIVE_Z: number;\n    readonly TEXTURE_MAG_FILTER: number;\n    readonly TEXTURE_MIN_FILTER: number;\n    readonly TEXTURE_WRAP_S: number;\n    readonly TEXTURE_WRAP_T: number;\n    readonly TEXTURE0: number;\n    readonly TEXTURE1: number;\n    readonly TEXTURE10: number;\n    readonly TEXTURE11: number;\n    readonly TEXTURE12: number;\n    readonly TEXTURE13: number;\n    readonly TEXTURE14: number;\n    readonly TEXTURE15: number;\n    readonly TEXTURE16: number;\n    readonly TEXTURE17: number;\n    readonly TEXTURE18: number;\n    readonly TEXTURE19: number;\n    readonly TEXTURE2: number;\n    readonly TEXTURE20: number;\n    readonly TEXTURE21: number;\n    readonly TEXTURE22: number;\n    readonly TEXTURE23: number;\n    readonly TEXTURE24: number;\n    readonly TEXTURE25: number;\n    readonly TEXTURE26: number;\n    readonly TEXTURE27: number;\n    readonly TEXTURE28: number;\n    readonly TEXTURE29: number;\n    readonly TEXTURE3: number;\n    readonly TEXTURE30: number;\n    readonly TEXTURE31: number;\n    readonly TEXTURE4: number;\n    readonly TEXTURE5: number;\n    readonly TEXTURE6: number;\n    readonly TEXTURE7: number;\n    readonly TEXTURE8: number;\n    readonly TEXTURE9: number;\n    readonly TRIANGLE_FAN: number;\n    readonly TRIANGLE_STRIP: number;\n    readonly TRIANGLES: number;\n    readonly UNPACK_ALIGNMENT: number;\n    readonly UNPACK_COLORSPACE_CONVERSION_WEBGL: number;\n    readonly UNPACK_FLIP_Y_WEBGL: number;\n    readonly UNPACK_PREMULTIPLY_ALPHA_WEBGL: number;\n    readonly UNSIGNED_BYTE: number;\n    readonly UNSIGNED_INT: number;\n    readonly UNSIGNED_SHORT: number;\n    readonly UNSIGNED_SHORT_4_4_4_4: number;\n    readonly UNSIGNED_SHORT_5_5_5_1: number;\n    readonly UNSIGNED_SHORT_5_6_5: number;\n    readonly VALIDATE_STATUS: number;\n    readonly VENDOR: number;\n    readonly VERSION: number;\n    readonly VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: number;\n    readonly VERTEX_ATTRIB_ARRAY_ENABLED: number;\n    readonly VERTEX_ATTRIB_ARRAY_NORMALIZED: number;\n    readonly VERTEX_ATTRIB_ARRAY_POINTER: number;\n    readonly VERTEX_ATTRIB_ARRAY_SIZE: number;\n    readonly VERTEX_ATTRIB_ARRAY_STRIDE: number;\n    readonly VERTEX_ATTRIB_ARRAY_TYPE: number;\n    readonly VERTEX_SHADER: number;\n    readonly VIEWPORT: number;\n    readonly ZERO: number;\n}\n\ndeclare var WebGLRenderingContext: {\n    prototype: WebGLRenderingContext;\n    new(): WebGLRenderingContext;\n    readonly ACTIVE_ATTRIBUTES: number;\n    readonly ACTIVE_TEXTURE: number;\n    readonly ACTIVE_UNIFORMS: number;\n    readonly ALIASED_LINE_WIDTH_RANGE: number;\n    readonly ALIASED_POINT_SIZE_RANGE: number;\n    readonly ALPHA: number;\n    readonly ALPHA_BITS: number;\n    readonly ALWAYS: number;\n    readonly ARRAY_BUFFER: number;\n    readonly ARRAY_BUFFER_BINDING: number;\n    readonly ATTACHED_SHADERS: number;\n    readonly BACK: number;\n    readonly BLEND: number;\n    readonly BLEND_COLOR: number;\n    readonly BLEND_DST_ALPHA: number;\n    readonly BLEND_DST_RGB: number;\n    readonly BLEND_EQUATION: number;\n    readonly BLEND_EQUATION_ALPHA: number;\n    readonly BLEND_EQUATION_RGB: number;\n    readonly BLEND_SRC_ALPHA: number;\n    readonly BLEND_SRC_RGB: number;\n    readonly BLUE_BITS: number;\n    readonly BOOL: number;\n    readonly BOOL_VEC2: number;\n    readonly BOOL_VEC3: number;\n    readonly BOOL_VEC4: number;\n    readonly BROWSER_DEFAULT_WEBGL: number;\n    readonly BUFFER_SIZE: number;\n    readonly BUFFER_USAGE: number;\n    readonly BYTE: number;\n    readonly CCW: number;\n    readonly CLAMP_TO_EDGE: number;\n    readonly COLOR_ATTACHMENT0: number;\n    readonly COLOR_BUFFER_BIT: number;\n    readonly COLOR_CLEAR_VALUE: number;\n    readonly COLOR_WRITEMASK: number;\n    readonly COMPILE_STATUS: number;\n    readonly COMPRESSED_TEXTURE_FORMATS: number;\n    readonly CONSTANT_ALPHA: number;\n    readonly CONSTANT_COLOR: number;\n    readonly CONTEXT_LOST_WEBGL: number;\n    readonly CULL_FACE: number;\n    readonly CULL_FACE_MODE: number;\n    readonly CURRENT_PROGRAM: number;\n    readonly CURRENT_VERTEX_ATTRIB: number;\n    readonly CW: number;\n    readonly DECR: number;\n    readonly DECR_WRAP: number;\n    readonly DELETE_STATUS: number;\n    readonly DEPTH_ATTACHMENT: number;\n    readonly DEPTH_BITS: number;\n    readonly DEPTH_BUFFER_BIT: number;\n    readonly DEPTH_CLEAR_VALUE: number;\n    readonly DEPTH_COMPONENT: number;\n    readonly DEPTH_COMPONENT16: number;\n    readonly DEPTH_FUNC: number;\n    readonly DEPTH_RANGE: number;\n    readonly DEPTH_STENCIL: number;\n    readonly DEPTH_STENCIL_ATTACHMENT: number;\n    readonly DEPTH_TEST: number;\n    readonly DEPTH_WRITEMASK: number;\n    readonly DITHER: number;\n    readonly DONT_CARE: number;\n    readonly DST_ALPHA: number;\n    readonly DST_COLOR: number;\n    readonly DYNAMIC_DRAW: number;\n    readonly ELEMENT_ARRAY_BUFFER: number;\n    readonly ELEMENT_ARRAY_BUFFER_BINDING: number;\n    readonly EQUAL: number;\n    readonly FASTEST: number;\n    readonly FLOAT: number;\n    readonly FLOAT_MAT2: number;\n    readonly FLOAT_MAT3: number;\n    readonly FLOAT_MAT4: number;\n    readonly FLOAT_VEC2: number;\n    readonly FLOAT_VEC3: number;\n    readonly FLOAT_VEC4: number;\n    readonly FRAGMENT_SHADER: number;\n    readonly FRAMEBUFFER: number;\n    readonly FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: number;\n    readonly FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: number;\n    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: number;\n    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: number;\n    readonly FRAMEBUFFER_BINDING: number;\n    readonly FRAMEBUFFER_COMPLETE: number;\n    readonly FRAMEBUFFER_INCOMPLETE_ATTACHMENT: number;\n    readonly FRAMEBUFFER_INCOMPLETE_DIMENSIONS: number;\n    readonly FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: number;\n    readonly FRAMEBUFFER_UNSUPPORTED: number;\n    readonly FRONT: number;\n    readonly FRONT_AND_BACK: number;\n    readonly FRONT_FACE: number;\n    readonly FUNC_ADD: number;\n    readonly FUNC_REVERSE_SUBTRACT: number;\n    readonly FUNC_SUBTRACT: number;\n    readonly GENERATE_MIPMAP_HINT: number;\n    readonly GEQUAL: number;\n    readonly GREATER: number;\n    readonly GREEN_BITS: number;\n    readonly HIGH_FLOAT: number;\n    readonly HIGH_INT: number;\n    readonly IMPLEMENTATION_COLOR_READ_FORMAT: number;\n    readonly IMPLEMENTATION_COLOR_READ_TYPE: number;\n    readonly INCR: number;\n    readonly INCR_WRAP: number;\n    readonly INT: number;\n    readonly INT_VEC2: number;\n    readonly INT_VEC3: number;\n    readonly INT_VEC4: number;\n    readonly INVALID_ENUM: number;\n    readonly INVALID_FRAMEBUFFER_OPERATION: number;\n    readonly INVALID_OPERATION: number;\n    readonly INVALID_VALUE: number;\n    readonly INVERT: number;\n    readonly KEEP: number;\n    readonly LEQUAL: number;\n    readonly LESS: number;\n    readonly LINE_LOOP: number;\n    readonly LINE_STRIP: number;\n    readonly LINE_WIDTH: number;\n    readonly LINEAR: number;\n    readonly LINEAR_MIPMAP_LINEAR: number;\n    readonly LINEAR_MIPMAP_NEAREST: number;\n    readonly LINES: number;\n    readonly LINK_STATUS: number;\n    readonly LOW_FLOAT: number;\n    readonly LOW_INT: number;\n    readonly LUMINANCE: number;\n    readonly LUMINANCE_ALPHA: number;\n    readonly MAX_COMBINED_TEXTURE_IMAGE_UNITS: number;\n    readonly MAX_CUBE_MAP_TEXTURE_SIZE: number;\n    readonly MAX_FRAGMENT_UNIFORM_VECTORS: number;\n    readonly MAX_RENDERBUFFER_SIZE: number;\n    readonly MAX_TEXTURE_IMAGE_UNITS: number;\n    readonly MAX_TEXTURE_SIZE: number;\n    readonly MAX_VARYING_VECTORS: number;\n    readonly MAX_VERTEX_ATTRIBS: number;\n    readonly MAX_VERTEX_TEXTURE_IMAGE_UNITS: number;\n    readonly MAX_VERTEX_UNIFORM_VECTORS: number;\n    readonly MAX_VIEWPORT_DIMS: number;\n    readonly MEDIUM_FLOAT: number;\n    readonly MEDIUM_INT: number;\n    readonly MIRRORED_REPEAT: number;\n    readonly NEAREST: number;\n    readonly NEAREST_MIPMAP_LINEAR: number;\n    readonly NEAREST_MIPMAP_NEAREST: number;\n    readonly NEVER: number;\n    readonly NICEST: number;\n    readonly NO_ERROR: number;\n    readonly NONE: number;\n    readonly NOTEQUAL: number;\n    readonly ONE: number;\n    readonly ONE_MINUS_CONSTANT_ALPHA: number;\n    readonly ONE_MINUS_CONSTANT_COLOR: number;\n    readonly ONE_MINUS_DST_ALPHA: number;\n    readonly ONE_MINUS_DST_COLOR: number;\n    readonly ONE_MINUS_SRC_ALPHA: number;\n    readonly ONE_MINUS_SRC_COLOR: number;\n    readonly OUT_OF_MEMORY: number;\n    readonly PACK_ALIGNMENT: number;\n    readonly POINTS: number;\n    readonly POLYGON_OFFSET_FACTOR: number;\n    readonly POLYGON_OFFSET_FILL: number;\n    readonly POLYGON_OFFSET_UNITS: number;\n    readonly RED_BITS: number;\n    readonly RENDERBUFFER: number;\n    readonly RENDERBUFFER_ALPHA_SIZE: number;\n    readonly RENDERBUFFER_BINDING: number;\n    readonly RENDERBUFFER_BLUE_SIZE: number;\n    readonly RENDERBUFFER_DEPTH_SIZE: number;\n    readonly RENDERBUFFER_GREEN_SIZE: number;\n    readonly RENDERBUFFER_HEIGHT: number;\n    readonly RENDERBUFFER_INTERNAL_FORMAT: number;\n    readonly RENDERBUFFER_RED_SIZE: number;\n    readonly RENDERBUFFER_STENCIL_SIZE: number;\n    readonly RENDERBUFFER_WIDTH: number;\n    readonly RENDERER: number;\n    readonly REPEAT: number;\n    readonly REPLACE: number;\n    readonly RGB: number;\n    readonly RGB5_A1: number;\n    readonly RGB565: number;\n    readonly RGBA: number;\n    readonly RGBA4: number;\n    readonly SAMPLE_ALPHA_TO_COVERAGE: number;\n    readonly SAMPLE_BUFFERS: number;\n    readonly SAMPLE_COVERAGE: number;\n    readonly SAMPLE_COVERAGE_INVERT: number;\n    readonly SAMPLE_COVERAGE_VALUE: number;\n    readonly SAMPLER_2D: number;\n    readonly SAMPLER_CUBE: number;\n    readonly SAMPLES: number;\n    readonly SCISSOR_BOX: number;\n    readonly SCISSOR_TEST: number;\n    readonly SHADER_TYPE: number;\n    readonly SHADING_LANGUAGE_VERSION: number;\n    readonly SHORT: number;\n    readonly SRC_ALPHA: number;\n    readonly SRC_ALPHA_SATURATE: number;\n    readonly SRC_COLOR: number;\n    readonly STATIC_DRAW: number;\n    readonly STENCIL_ATTACHMENT: number;\n    readonly STENCIL_BACK_FAIL: number;\n    readonly STENCIL_BACK_FUNC: number;\n    readonly STENCIL_BACK_PASS_DEPTH_FAIL: number;\n    readonly STENCIL_BACK_PASS_DEPTH_PASS: number;\n    readonly STENCIL_BACK_REF: number;\n    readonly STENCIL_BACK_VALUE_MASK: number;\n    readonly STENCIL_BACK_WRITEMASK: number;\n    readonly STENCIL_BITS: number;\n    readonly STENCIL_BUFFER_BIT: number;\n    readonly STENCIL_CLEAR_VALUE: number;\n    readonly STENCIL_FAIL: number;\n    readonly STENCIL_FUNC: number;\n    readonly STENCIL_INDEX: number;\n    readonly STENCIL_INDEX8: number;\n    readonly STENCIL_PASS_DEPTH_FAIL: number;\n    readonly STENCIL_PASS_DEPTH_PASS: number;\n    readonly STENCIL_REF: number;\n    readonly STENCIL_TEST: number;\n    readonly STENCIL_VALUE_MASK: number;\n    readonly STENCIL_WRITEMASK: number;\n    readonly STREAM_DRAW: number;\n    readonly SUBPIXEL_BITS: number;\n    readonly TEXTURE: number;\n    readonly TEXTURE_2D: number;\n    readonly TEXTURE_BINDING_2D: number;\n    readonly TEXTURE_BINDING_CUBE_MAP: number;\n    readonly TEXTURE_CUBE_MAP: number;\n    readonly TEXTURE_CUBE_MAP_NEGATIVE_X: number;\n    readonly TEXTURE_CUBE_MAP_NEGATIVE_Y: number;\n    readonly TEXTURE_CUBE_MAP_NEGATIVE_Z: number;\n    readonly TEXTURE_CUBE_MAP_POSITIVE_X: number;\n    readonly TEXTURE_CUBE_MAP_POSITIVE_Y: number;\n    readonly TEXTURE_CUBE_MAP_POSITIVE_Z: number;\n    readonly TEXTURE_MAG_FILTER: number;\n    readonly TEXTURE_MIN_FILTER: number;\n    readonly TEXTURE_WRAP_S: number;\n    readonly TEXTURE_WRAP_T: number;\n    readonly TEXTURE0: number;\n    readonly TEXTURE1: number;\n    readonly TEXTURE10: number;\n    readonly TEXTURE11: number;\n    readonly TEXTURE12: number;\n    readonly TEXTURE13: number;\n    readonly TEXTURE14: number;\n    readonly TEXTURE15: number;\n    readonly TEXTURE16: number;\n    readonly TEXTURE17: number;\n    readonly TEXTURE18: number;\n    readonly TEXTURE19: number;\n    readonly TEXTURE2: number;\n    readonly TEXTURE20: number;\n    readonly TEXTURE21: number;\n    readonly TEXTURE22: number;\n    readonly TEXTURE23: number;\n    readonly TEXTURE24: number;\n    readonly TEXTURE25: number;\n    readonly TEXTURE26: number;\n    readonly TEXTURE27: number;\n    readonly TEXTURE28: number;\n    readonly TEXTURE29: number;\n    readonly TEXTURE3: number;\n    readonly TEXTURE30: number;\n    readonly TEXTURE31: number;\n    readonly TEXTURE4: number;\n    readonly TEXTURE5: number;\n    readonly TEXTURE6: number;\n    readonly TEXTURE7: number;\n    readonly TEXTURE8: number;\n    readonly TEXTURE9: number;\n    readonly TRIANGLE_FAN: number;\n    readonly TRIANGLE_STRIP: number;\n    readonly TRIANGLES: number;\n    readonly UNPACK_ALIGNMENT: number;\n    readonly UNPACK_COLORSPACE_CONVERSION_WEBGL: number;\n    readonly UNPACK_FLIP_Y_WEBGL: number;\n    readonly UNPACK_PREMULTIPLY_ALPHA_WEBGL: number;\n    readonly UNSIGNED_BYTE: number;\n    readonly UNSIGNED_INT: number;\n    readonly UNSIGNED_SHORT: number;\n    readonly UNSIGNED_SHORT_4_4_4_4: number;\n    readonly UNSIGNED_SHORT_5_5_5_1: number;\n    readonly UNSIGNED_SHORT_5_6_5: number;\n    readonly VALIDATE_STATUS: number;\n    readonly VENDOR: number;\n    readonly VERSION: number;\n    readonly VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: number;\n    readonly VERTEX_ATTRIB_ARRAY_ENABLED: number;\n    readonly VERTEX_ATTRIB_ARRAY_NORMALIZED: number;\n    readonly VERTEX_ATTRIB_ARRAY_POINTER: number;\n    readonly VERTEX_ATTRIB_ARRAY_SIZE: number;\n    readonly VERTEX_ATTRIB_ARRAY_STRIDE: number;\n    readonly VERTEX_ATTRIB_ARRAY_TYPE: number;\n    readonly VERTEX_SHADER: number;\n    readonly VIEWPORT: number;\n    readonly ZERO: number;\n};\n\ninterface WebGLShader extends WebGLObject {\n}\n\ndeclare var WebGLShader: {\n    prototype: WebGLShader;\n    new(): WebGLShader;\n};\n\ninterface WebGLShaderPrecisionFormat {\n    readonly precision: number;\n    readonly rangeMax: number;\n    readonly rangeMin: number;\n}\n\ndeclare var WebGLShaderPrecisionFormat: {\n    prototype: WebGLShaderPrecisionFormat;\n    new(): WebGLShaderPrecisionFormat;\n};\n\ninterface WebGLTexture extends WebGLObject {\n}\n\ndeclare var WebGLTexture: {\n    prototype: WebGLTexture;\n    new(): WebGLTexture;\n};\n\ninterface WebGLUniformLocation {\n}\n\ndeclare var WebGLUniformLocation: {\n    prototype: WebGLUniformLocation;\n    new(): WebGLUniformLocation;\n};\n\ninterface WebKitCSSMatrix {\n    a: number;\n    b: number;\n    c: number;\n    d: number;\n    e: number;\n    f: number;\n    m11: number;\n    m12: number;\n    m13: number;\n    m14: number;\n    m21: number;\n    m22: number;\n    m23: number;\n    m24: number;\n    m31: number;\n    m32: number;\n    m33: number;\n    m34: number;\n    m41: number;\n    m42: number;\n    m43: number;\n    m44: number;\n    inverse(): WebKitCSSMatrix;\n    multiply(secondMatrix: WebKitCSSMatrix): WebKitCSSMatrix;\n    rotate(angleX: number, angleY?: number, angleZ?: number): WebKitCSSMatrix;\n    rotateAxisAngle(x: number, y: number, z: number, angle: number): WebKitCSSMatrix;\n    scale(scaleX: number, scaleY?: number, scaleZ?: number): WebKitCSSMatrix;\n    setMatrixValue(value: string): void;\n    skewX(angle: number): WebKitCSSMatrix;\n    skewY(angle: number): WebKitCSSMatrix;\n    toString(): string;\n    translate(x: number, y: number, z?: number): WebKitCSSMatrix;\n}\n\ndeclare var WebKitCSSMatrix: {\n    prototype: WebKitCSSMatrix;\n    new(text?: string): WebKitCSSMatrix;\n};\n\ninterface WebKitDirectoryEntry extends WebKitEntry {\n    createReader(): WebKitDirectoryReader;\n}\n\ndeclare var WebKitDirectoryEntry: {\n    prototype: WebKitDirectoryEntry;\n    new(): WebKitDirectoryEntry;\n};\n\ninterface WebKitDirectoryReader {\n    readEntries(successCallback: WebKitEntriesCallback, errorCallback?: WebKitErrorCallback): void;\n}\n\ndeclare var WebKitDirectoryReader: {\n    prototype: WebKitDirectoryReader;\n    new(): WebKitDirectoryReader;\n};\n\ninterface WebKitEntry {\n    readonly filesystem: WebKitFileSystem;\n    readonly fullPath: string;\n    readonly isDirectory: boolean;\n    readonly isFile: boolean;\n    readonly name: string;\n}\n\ndeclare var WebKitEntry: {\n    prototype: WebKitEntry;\n    new(): WebKitEntry;\n};\n\ninterface WebKitFileEntry extends WebKitEntry {\n    file(successCallback: WebKitFileCallback, errorCallback?: WebKitErrorCallback): void;\n}\n\ndeclare var WebKitFileEntry: {\n    prototype: WebKitFileEntry;\n    new(): WebKitFileEntry;\n};\n\ninterface WebKitFileSystem {\n    readonly name: string;\n    readonly root: WebKitDirectoryEntry;\n}\n\ndeclare var WebKitFileSystem: {\n    prototype: WebKitFileSystem;\n    new(): WebKitFileSystem;\n};\n\ninterface WebKitPoint {\n    x: number;\n    y: number;\n}\n\ndeclare var WebKitPoint: {\n    prototype: WebKitPoint;\n    new(x?: number, y?: number): WebKitPoint;\n};\n\ninterface webkitRTCPeerConnection extends RTCPeerConnection {\n    addEventListener<K extends keyof RTCPeerConnectionEventMap>(type: K, listener: (this: webkitRTCPeerConnection, ev: RTCPeerConnectionEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var webkitRTCPeerConnection: {\n    prototype: webkitRTCPeerConnection;\n    new(configuration: RTCConfiguration): webkitRTCPeerConnection;\n};\n\ninterface WebSocketEventMap {\n    "close": CloseEvent;\n    "error": Event;\n    "message": MessageEvent;\n    "open": Event;\n}\n\ninterface WebSocket extends EventTarget {\n    binaryType: string;\n    readonly bufferedAmount: number;\n    readonly extensions: string;\n    onclose: (this: WebSocket, ev: CloseEvent) => any;\n    onerror: (this: WebSocket, ev: Event) => any;\n    onmessage: (this: WebSocket, ev: MessageEvent) => any;\n    onopen: (this: WebSocket, ev: Event) => any;\n    readonly protocol: string;\n    readonly readyState: number;\n    readonly url: string;\n    close(code?: number, reason?: string): void;\n    send(data: any): void;\n    readonly CLOSED: number;\n    readonly CLOSING: number;\n    readonly CONNECTING: number;\n    readonly OPEN: number;\n    addEventListener<K extends keyof WebSocketEventMap>(type: K, listener: (this: WebSocket, ev: WebSocketEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var WebSocket: {\n    prototype: WebSocket;\n    new(url: string, protocols?: string | string[]): WebSocket;\n    readonly CLOSED: number;\n    readonly CLOSING: number;\n    readonly CONNECTING: number;\n    readonly OPEN: number;\n};\n\ninterface WheelEvent extends MouseEvent {\n    readonly deltaMode: number;\n    readonly deltaX: number;\n    readonly deltaY: number;\n    readonly deltaZ: number;\n    readonly wheelDelta: number;\n    readonly wheelDeltaX: number;\n    readonly wheelDeltaY: number;\n    getCurrentPoint(element: Element): void;\n    initWheelEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, buttonArg: number, relatedTargetArg: EventTarget, modifiersListArg: string, deltaXArg: number, deltaYArg: number, deltaZArg: number, deltaMode: number): void;\n    readonly DOM_DELTA_LINE: number;\n    readonly DOM_DELTA_PAGE: number;\n    readonly DOM_DELTA_PIXEL: number;\n}\n\ndeclare var WheelEvent: {\n    prototype: WheelEvent;\n    new(typeArg: string, eventInitDict?: WheelEventInit): WheelEvent;\n    readonly DOM_DELTA_LINE: number;\n    readonly DOM_DELTA_PAGE: number;\n    readonly DOM_DELTA_PIXEL: number;\n};\n\ninterface WindowEventMap extends GlobalEventHandlersEventMap {\n    "abort": UIEvent;\n    "afterprint": Event;\n    "beforeprint": Event;\n    "beforeunload": BeforeUnloadEvent;\n    "blur": FocusEvent;\n    "canplay": Event;\n    "canplaythrough": Event;\n    "change": Event;\n    "click": MouseEvent;\n    "compassneedscalibration": Event;\n    "contextmenu": PointerEvent;\n    "dblclick": MouseEvent;\n    "devicelight": DeviceLightEvent;\n    "devicemotion": DeviceMotionEvent;\n    "deviceorientation": DeviceOrientationEvent;\n    "drag": DragEvent;\n    "dragend": DragEvent;\n    "dragenter": DragEvent;\n    "dragleave": DragEvent;\n    "dragover": DragEvent;\n    "dragstart": DragEvent;\n    "drop": DragEvent;\n    "durationchange": Event;\n    "emptied": Event;\n    "ended": MediaStreamErrorEvent;\n    "error": ErrorEvent;\n    "focus": FocusEvent;\n    "hashchange": HashChangeEvent;\n    "input": Event;\n    "invalid": Event;\n    "keydown": KeyboardEvent;\n    "keypress": KeyboardEvent;\n    "keyup": KeyboardEvent;\n    "load": Event;\n    "loadeddata": Event;\n    "loadedmetadata": Event;\n    "loadstart": Event;\n    "message": MessageEvent;\n    "mousedown": MouseEvent;\n    "mouseenter": MouseEvent;\n    "mouseleave": MouseEvent;\n    "mousemove": MouseEvent;\n    "mouseout": MouseEvent;\n    "mouseover": MouseEvent;\n    "mouseup": MouseEvent;\n    "mousewheel": WheelEvent;\n    "MSGestureChange": MSGestureEvent;\n    "MSGestureDoubleTap": MSGestureEvent;\n    "MSGestureEnd": MSGestureEvent;\n    "MSGestureHold": MSGestureEvent;\n    "MSGestureStart": MSGestureEvent;\n    "MSGestureTap": MSGestureEvent;\n    "MSInertiaStart": MSGestureEvent;\n    "MSPointerCancel": MSPointerEvent;\n    "MSPointerDown": MSPointerEvent;\n    "MSPointerEnter": MSPointerEvent;\n    "MSPointerLeave": MSPointerEvent;\n    "MSPointerMove": MSPointerEvent;\n    "MSPointerOut": MSPointerEvent;\n    "MSPointerOver": MSPointerEvent;\n    "MSPointerUp": MSPointerEvent;\n    "offline": Event;\n    "online": Event;\n    "orientationchange": Event;\n    "pagehide": PageTransitionEvent;\n    "pageshow": PageTransitionEvent;\n    "pause": Event;\n    "play": Event;\n    "playing": Event;\n    "popstate": PopStateEvent;\n    "progress": ProgressEvent;\n    "ratechange": Event;\n    "readystatechange": ProgressEvent;\n    "reset": Event;\n    "resize": UIEvent;\n    "scroll": UIEvent;\n    "seeked": Event;\n    "seeking": Event;\n    "select": UIEvent;\n    "stalled": Event;\n    "storage": StorageEvent;\n    "submit": Event;\n    "suspend": Event;\n    "timeupdate": Event;\n    "touchcancel": TouchEvent;\n    "touchend": TouchEvent;\n    "touchmove": TouchEvent;\n    "touchstart": TouchEvent;\n    "unload": Event;\n    "volumechange": Event;\n    "waiting": Event;\n}\n\ninterface Window extends EventTarget, WindowTimers, WindowSessionStorage, WindowLocalStorage, WindowConsole, GlobalEventHandlers, IDBEnvironment, WindowBase64, GlobalFetch {\n    readonly applicationCache: ApplicationCache;\n    readonly caches: CacheStorage;\n    readonly clientInformation: Navigator;\n    readonly closed: boolean;\n    readonly crypto: Crypto;\n    defaultStatus: string;\n    readonly devicePixelRatio: number;\n    readonly document: Document;\n    readonly doNotTrack: string;\n    event: Event | undefined;\n    readonly external: External;\n    readonly frameElement: Element;\n    readonly frames: Window;\n    readonly history: History;\n    readonly innerHeight: number;\n    readonly innerWidth: number;\n    readonly isSecureContext: boolean;\n    readonly length: number;\n    readonly location: Location;\n    readonly locationbar: BarProp;\n    readonly menubar: BarProp;\n    readonly msContentScript: ExtensionScriptApis;\n    readonly msCredentials: MSCredentials;\n    name: string;\n    readonly navigator: Navigator;\n    offscreenBuffering: string | boolean;\n    onabort: (this: Window, ev: UIEvent) => any;\n    onafterprint: (this: Window, ev: Event) => any;\n    onbeforeprint: (this: Window, ev: Event) => any;\n    onbeforeunload: (this: Window, ev: BeforeUnloadEvent) => any;\n    onblur: (this: Window, ev: FocusEvent) => any;\n    oncanplay: (this: Window, ev: Event) => any;\n    oncanplaythrough: (this: Window, ev: Event) => any;\n    onchange: (this: Window, ev: Event) => any;\n    onclick: (this: Window, ev: MouseEvent) => any;\n    oncompassneedscalibration: (this: Window, ev: Event) => any;\n    oncontextmenu: (this: Window, ev: PointerEvent) => any;\n    ondblclick: (this: Window, ev: MouseEvent) => any;\n    ondevicelight: (this: Window, ev: DeviceLightEvent) => any;\n    ondevicemotion: (this: Window, ev: DeviceMotionEvent) => any;\n    ondeviceorientation: (this: Window, ev: DeviceOrientationEvent) => any;\n    ondrag: (this: Window, ev: DragEvent) => any;\n    ondragend: (this: Window, ev: DragEvent) => any;\n    ondragenter: (this: Window, ev: DragEvent) => any;\n    ondragleave: (this: Window, ev: DragEvent) => any;\n    ondragover: (this: Window, ev: DragEvent) => any;\n    ondragstart: (this: Window, ev: DragEvent) => any;\n    ondrop: (this: Window, ev: DragEvent) => any;\n    ondurationchange: (this: Window, ev: Event) => any;\n    onemptied: (this: Window, ev: Event) => any;\n    onended: (this: Window, ev: MediaStreamErrorEvent) => any;\n    onerror: ErrorEventHandler;\n    onfocus: (this: Window, ev: FocusEvent) => any;\n    onhashchange: (this: Window, ev: HashChangeEvent) => any;\n    oninput: (this: Window, ev: Event) => any;\n    oninvalid: (this: Window, ev: Event) => any;\n    onkeydown: (this: Window, ev: KeyboardEvent) => any;\n    onkeypress: (this: Window, ev: KeyboardEvent) => any;\n    onkeyup: (this: Window, ev: KeyboardEvent) => any;\n    onload: (this: Window, ev: Event) => any;\n    onloadeddata: (this: Window, ev: Event) => any;\n    onloadedmetadata: (this: Window, ev: Event) => any;\n    onloadstart: (this: Window, ev: Event) => any;\n    onmessage: (this: Window, ev: MessageEvent) => any;\n    onmousedown: (this: Window, ev: MouseEvent) => any;\n    onmouseenter: (this: Window, ev: MouseEvent) => any;\n    onmouseleave: (this: Window, ev: MouseEvent) => any;\n    onmousemove: (this: Window, ev: MouseEvent) => any;\n    onmouseout: (this: Window, ev: MouseEvent) => any;\n    onmouseover: (this: Window, ev: MouseEvent) => any;\n    onmouseup: (this: Window, ev: MouseEvent) => any;\n    onmousewheel: (this: Window, ev: WheelEvent) => any;\n    onmsgesturechange: (this: Window, ev: MSGestureEvent) => any;\n    onmsgesturedoubletap: (this: Window, ev: MSGestureEvent) => any;\n    onmsgestureend: (this: Window, ev: MSGestureEvent) => any;\n    onmsgesturehold: (this: Window, ev: MSGestureEvent) => any;\n    onmsgesturestart: (this: Window, ev: MSGestureEvent) => any;\n    onmsgesturetap: (this: Window, ev: MSGestureEvent) => any;\n    onmsinertiastart: (this: Window, ev: MSGestureEvent) => any;\n    onmspointercancel: (this: Window, ev: MSPointerEvent) => any;\n    onmspointerdown: (this: Window, ev: MSPointerEvent) => any;\n    onmspointerenter: (this: Window, ev: MSPointerEvent) => any;\n    onmspointerleave: (this: Window, ev: MSPointerEvent) => any;\n    onmspointermove: (this: Window, ev: MSPointerEvent) => any;\n    onmspointerout: (this: Window, ev: MSPointerEvent) => any;\n    onmspointerover: (this: Window, ev: MSPointerEvent) => any;\n    onmspointerup: (this: Window, ev: MSPointerEvent) => any;\n    onoffline: (this: Window, ev: Event) => any;\n    ononline: (this: Window, ev: Event) => any;\n    onorientationchange: (this: Window, ev: Event) => any;\n    onpagehide: (this: Window, ev: PageTransitionEvent) => any;\n    onpageshow: (this: Window, ev: PageTransitionEvent) => any;\n    onpause: (this: Window, ev: Event) => any;\n    onplay: (this: Window, ev: Event) => any;\n    onplaying: (this: Window, ev: Event) => any;\n    onpopstate: (this: Window, ev: PopStateEvent) => any;\n    onprogress: (this: Window, ev: ProgressEvent) => any;\n    onratechange: (this: Window, ev: Event) => any;\n    onreadystatechange: (this: Window, ev: ProgressEvent) => any;\n    onreset: (this: Window, ev: Event) => any;\n    onresize: (this: Window, ev: UIEvent) => any;\n    onscroll: (this: Window, ev: UIEvent) => any;\n    onseeked: (this: Window, ev: Event) => any;\n    onseeking: (this: Window, ev: Event) => any;\n    onselect: (this: Window, ev: UIEvent) => any;\n    onstalled: (this: Window, ev: Event) => any;\n    onstorage: (this: Window, ev: StorageEvent) => any;\n    onsubmit: (this: Window, ev: Event) => any;\n    onsuspend: (this: Window, ev: Event) => any;\n    ontimeupdate: (this: Window, ev: Event) => any;\n    ontouchcancel: (ev: TouchEvent) => any;\n    ontouchend: (ev: TouchEvent) => any;\n    ontouchmove: (ev: TouchEvent) => any;\n    ontouchstart: (ev: TouchEvent) => any;\n    onunload: (this: Window, ev: Event) => any;\n    onvolumechange: (this: Window, ev: Event) => any;\n    onwaiting: (this: Window, ev: Event) => any;\n    opener: any;\n    orientation: string | number;\n    readonly outerHeight: number;\n    readonly outerWidth: number;\n    readonly pageXOffset: number;\n    readonly pageYOffset: number;\n    readonly parent: Window;\n    readonly performance: Performance;\n    readonly personalbar: BarProp;\n    readonly screen: Screen;\n    readonly screenLeft: number;\n    readonly screenTop: number;\n    readonly screenX: number;\n    readonly screenY: number;\n    readonly scrollbars: BarProp;\n    readonly scrollX: number;\n    readonly scrollY: number;\n    readonly self: Window;\n    readonly speechSynthesis: SpeechSynthesis;\n    status: string;\n    readonly statusbar: BarProp;\n    readonly styleMedia: StyleMedia;\n    readonly toolbar: BarProp;\n    readonly top: Window;\n    readonly window: Window;\n    URL: typeof URL;\n    URLSearchParams: typeof URLSearchParams;\n    Blob: typeof Blob;\n    customElements: CustomElementRegistry;\n    alert(message?: any): void;\n    blur(): void;\n    cancelAnimationFrame(handle: number): void;\n    captureEvents(): void;\n    close(): void;\n    confirm(message?: string): boolean;\n    departFocus(navigationReason: NavigationReason, origin: FocusNavigationOrigin): void;\n    focus(): void;\n    getComputedStyle(elt: Element, pseudoElt?: string): CSSStyleDeclaration;\n    getMatchedCSSRules(elt: Element, pseudoElt?: string): CSSRuleList;\n    getSelection(): Selection;\n    matchMedia(mediaQuery: string): MediaQueryList;\n    moveBy(x?: number, y?: number): void;\n    moveTo(x?: number, y?: number): void;\n    msWriteProfilerMark(profilerMarkName: string): void;\n    open(url?: string, target?: string, features?: string, replace?: boolean): Window;\n    postMessage(message: any, targetOrigin: string, transfer?: any[]): void;\n    print(): void;\n    prompt(message?: string, _default?: string): string | null;\n    releaseEvents(): void;\n    requestAnimationFrame(callback: FrameRequestCallback): number;\n    resizeBy(x?: number, y?: number): void;\n    resizeTo(x?: number, y?: number): void;\n    scroll(x?: number, y?: number): void;\n    scrollBy(x?: number, y?: number): void;\n    scrollTo(x?: number, y?: number): void;\n    stop(): void;\n    webkitCancelAnimationFrame(handle: number): void;\n    webkitConvertPointFromNodeToPage(node: Node, pt: WebKitPoint): WebKitPoint;\n    webkitConvertPointFromPageToNode(node: Node, pt: WebKitPoint): WebKitPoint;\n    webkitRequestAnimationFrame(callback: FrameRequestCallback): number;\n    createImageBitmap(image: HTMLImageElement | SVGImageElement | HTMLVideoElement | HTMLCanvasElement | ImageBitmap | ImageData | Blob, options?: ImageBitmapOptions): Promise<ImageBitmap>;\n    createImageBitmap(image: HTMLImageElement | SVGImageElement | HTMLVideoElement | HTMLCanvasElement | ImageBitmap | ImageData | Blob, sx: number, sy: number, sw: number, sh: number, options?: ImageBitmapOptions): Promise<ImageBitmap>;\n    scroll(options?: ScrollToOptions): void;\n    scrollTo(options?: ScrollToOptions): void;\n    scrollBy(options?: ScrollToOptions): void;\n    addEventListener<K extends keyof WindowEventMap>(type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var Window: {\n    prototype: Window;\n    new(): Window;\n};\n\ninterface WorkerEventMap extends AbstractWorkerEventMap {\n    "message": MessageEvent;\n}\n\ninterface Worker extends EventTarget, AbstractWorker {\n    onmessage: (this: Worker, ev: MessageEvent) => any;\n    postMessage(message: any, transfer?: any[]): void;\n    terminate(): void;\n    addEventListener<K extends keyof WorkerEventMap>(type: K, listener: (this: Worker, ev: WorkerEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var Worker: {\n    prototype: Worker;\n    new(stringUrl: string): Worker;\n};\n\ninterface XMLDocument extends Document {\n    addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: XMLDocument, ev: DocumentEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var XMLDocument: {\n    prototype: XMLDocument;\n    new(): XMLDocument;\n};\n\ninterface XMLHttpRequestEventMap extends XMLHttpRequestEventTargetEventMap {\n    "readystatechange": Event;\n}\n\ninterface XMLHttpRequest extends EventTarget, XMLHttpRequestEventTarget {\n    onreadystatechange: (this: XMLHttpRequest, ev: Event) => any;\n    readonly readyState: number;\n    readonly response: any;\n    readonly responseText: string;\n    responseType: XMLHttpRequestResponseType;\n    readonly responseURL: string;\n    readonly responseXML: Document | null;\n    readonly status: number;\n    readonly statusText: string;\n    timeout: number;\n    readonly upload: XMLHttpRequestUpload;\n    withCredentials: boolean;\n    msCaching?: string;\n    abort(): void;\n    getAllResponseHeaders(): string;\n    getResponseHeader(header: string): string | null;\n    msCachingEnabled(): boolean;\n    open(method: string, url: string, async?: boolean, user?: string, password?: string): void;\n    overrideMimeType(mime: string): void;\n    send(data?: Document): void;\n    send(data?: string): void;\n    send(data?: any): void;\n    setRequestHeader(header: string, value: string): void;\n    readonly DONE: number;\n    readonly HEADERS_RECEIVED: number;\n    readonly LOADING: number;\n    readonly OPENED: number;\n    readonly UNSENT: number;\n    addEventListener<K extends keyof XMLHttpRequestEventMap>(type: K, listener: (this: XMLHttpRequest, ev: XMLHttpRequestEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var XMLHttpRequest: {\n    prototype: XMLHttpRequest;\n    new(): XMLHttpRequest;\n    readonly DONE: number;\n    readonly HEADERS_RECEIVED: number;\n    readonly LOADING: number;\n    readonly OPENED: number;\n    readonly UNSENT: number;\n};\n\ninterface XMLHttpRequestUpload extends EventTarget, XMLHttpRequestEventTarget {\n    addEventListener<K extends keyof XMLHttpRequestEventTargetEventMap>(type: K, listener: (this: XMLHttpRequestUpload, ev: XMLHttpRequestEventTargetEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var XMLHttpRequestUpload: {\n    prototype: XMLHttpRequestUpload;\n    new(): XMLHttpRequestUpload;\n};\n\ninterface XMLSerializer {\n    serializeToString(target: Node): string;\n}\n\ndeclare var XMLSerializer: {\n    prototype: XMLSerializer;\n    new(): XMLSerializer;\n};\n\ninterface XPathEvaluator {\n    createExpression(expression: string, resolver: XPathNSResolver): XPathExpression;\n    createNSResolver(nodeResolver?: Node): XPathNSResolver;\n    evaluate(expression: string, contextNode: Node, resolver: XPathNSResolver | null, type: number, result: XPathResult | null): XPathResult;\n}\n\ndeclare var XPathEvaluator: {\n    prototype: XPathEvaluator;\n    new(): XPathEvaluator;\n};\n\ninterface XPathExpression {\n    evaluate(contextNode: Node, type: number, result: XPathResult | null): XPathResult;\n}\n\ndeclare var XPathExpression: {\n    prototype: XPathExpression;\n    new(): XPathExpression;\n};\n\ninterface XPathNSResolver {\n    lookupNamespaceURI(prefix: string): string;\n}\n\ndeclare var XPathNSResolver: {\n    prototype: XPathNSResolver;\n    new(): XPathNSResolver;\n};\n\ninterface XPathResult {\n    readonly booleanValue: boolean;\n    readonly invalidIteratorState: boolean;\n    readonly numberValue: number;\n    readonly resultType: number;\n    readonly singleNodeValue: Node;\n    readonly snapshotLength: number;\n    readonly stringValue: string;\n    iterateNext(): Node;\n    snapshotItem(index: number): Node;\n    readonly ANY_TYPE: number;\n    readonly ANY_UNORDERED_NODE_TYPE: number;\n    readonly BOOLEAN_TYPE: number;\n    readonly FIRST_ORDERED_NODE_TYPE: number;\n    readonly NUMBER_TYPE: number;\n    readonly ORDERED_NODE_ITERATOR_TYPE: number;\n    readonly ORDERED_NODE_SNAPSHOT_TYPE: number;\n    readonly STRING_TYPE: number;\n    readonly UNORDERED_NODE_ITERATOR_TYPE: number;\n    readonly UNORDERED_NODE_SNAPSHOT_TYPE: number;\n}\n\ndeclare var XPathResult: {\n    prototype: XPathResult;\n    new(): XPathResult;\n    readonly ANY_TYPE: number;\n    readonly ANY_UNORDERED_NODE_TYPE: number;\n    readonly BOOLEAN_TYPE: number;\n    readonly FIRST_ORDERED_NODE_TYPE: number;\n    readonly NUMBER_TYPE: number;\n    readonly ORDERED_NODE_ITERATOR_TYPE: number;\n    readonly ORDERED_NODE_SNAPSHOT_TYPE: number;\n    readonly STRING_TYPE: number;\n    readonly UNORDERED_NODE_ITERATOR_TYPE: number;\n    readonly UNORDERED_NODE_SNAPSHOT_TYPE: number;\n};\n\ninterface XSLTProcessor {\n    clearParameters(): void;\n    getParameter(namespaceURI: string, localName: string): any;\n    importStylesheet(style: Node): void;\n    removeParameter(namespaceURI: string, localName: string): void;\n    reset(): void;\n    setParameter(namespaceURI: string, localName: string, value: any): void;\n    transformToDocument(source: Node): Document;\n    transformToFragment(source: Node, document: Document): DocumentFragment;\n}\n\ndeclare var XSLTProcessor: {\n    prototype: XSLTProcessor;\n    new(): XSLTProcessor;\n};\n\ninterface AbstractWorkerEventMap {\n    "error": ErrorEvent;\n}\n\ninterface AbstractWorker {\n    onerror: (this: AbstractWorker, ev: ErrorEvent) => any;\n    addEventListener<K extends keyof AbstractWorkerEventMap>(type: K, listener: (this: AbstractWorker, ev: AbstractWorkerEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ninterface Body {\n    readonly bodyUsed: boolean;\n    arrayBuffer(): Promise<ArrayBuffer>;\n    blob(): Promise<Blob>;\n    json(): Promise<any>;\n    text(): Promise<string>;\n    formData(): Promise<FormData>;\n}\n\ninterface CanvasPathMethods {\n    arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise?: boolean): void;\n    arcTo(x1: number, y1: number, x2: number, y2: number, radius: number): void;\n    bezierCurveTo(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number): void;\n    closePath(): void;\n    ellipse(x: number, y: number, radiusX: number, radiusY: number, rotation: number, startAngle: number, endAngle: number, anticlockwise?: boolean): void;\n    lineTo(x: number, y: number): void;\n    moveTo(x: number, y: number): void;\n    quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): void;\n    rect(x: number, y: number, w: number, h: number): void;\n}\n\ninterface ChildNode {\n    remove(): void;\n}\n\ninterface DocumentEvent {\n    createEvent(eventInterface: "AnimationEvent"): AnimationEvent;\n    createEvent(eventInterface: "AudioProcessingEvent"): AudioProcessingEvent;\n    createEvent(eventInterface: "BeforeUnloadEvent"): BeforeUnloadEvent;\n    createEvent(eventInterface: "ClipboardEvent"): ClipboardEvent;\n    createEvent(eventInterface: "CloseEvent"): CloseEvent;\n    createEvent(eventInterface: "CompositionEvent"): CompositionEvent;\n    createEvent(eventInterface: "CustomEvent"): CustomEvent;\n    createEvent(eventInterface: "DeviceLightEvent"): DeviceLightEvent;\n    createEvent(eventInterface: "DeviceMotionEvent"): DeviceMotionEvent;\n    createEvent(eventInterface: "DeviceOrientationEvent"): DeviceOrientationEvent;\n    createEvent(eventInterface: "DragEvent"): DragEvent;\n    createEvent(eventInterface: "ErrorEvent"): ErrorEvent;\n    createEvent(eventInterface: "Event"): Event;\n    createEvent(eventInterface: "Events"): Event;\n    createEvent(eventInterface: "FocusEvent"): FocusEvent;\n    createEvent(eventInterface: "FocusNavigationEvent"): FocusNavigationEvent;\n    createEvent(eventInterface: "GamepadEvent"): GamepadEvent;\n    createEvent(eventInterface: "HashChangeEvent"): HashChangeEvent;\n    createEvent(eventInterface: "IDBVersionChangeEvent"): IDBVersionChangeEvent;\n    createEvent(eventInterface: "KeyboardEvent"): KeyboardEvent;\n    createEvent(eventInterface: "ListeningStateChangedEvent"): ListeningStateChangedEvent;\n    createEvent(eventInterface: "LongRunningScriptDetectedEvent"): LongRunningScriptDetectedEvent;\n    createEvent(eventInterface: "MSGestureEvent"): MSGestureEvent;\n    createEvent(eventInterface: "MSManipulationEvent"): MSManipulationEvent;\n    createEvent(eventInterface: "MSMediaKeyMessageEvent"): MSMediaKeyMessageEvent;\n    createEvent(eventInterface: "MSMediaKeyNeededEvent"): MSMediaKeyNeededEvent;\n    createEvent(eventInterface: "MSPointerEvent"): MSPointerEvent;\n    createEvent(eventInterface: "MSSiteModeEvent"): MSSiteModeEvent;\n    createEvent(eventInterface: "MediaEncryptedEvent"): MediaEncryptedEvent;\n    createEvent(eventInterface: "MediaKeyMessageEvent"): MediaKeyMessageEvent;\n    createEvent(eventInterface: "MediaStreamErrorEvent"): MediaStreamErrorEvent;\n    createEvent(eventInterface: "MediaStreamEvent"): MediaStreamEvent;\n    createEvent(eventInterface: "MediaStreamTrackEvent"): MediaStreamTrackEvent;\n    createEvent(eventInterface: "MessageEvent"): MessageEvent;\n    createEvent(eventInterface: "MouseEvent"): MouseEvent;\n    createEvent(eventInterface: "MouseEvents"): MouseEvent;\n    createEvent(eventInterface: "MutationEvent"): MutationEvent;\n    createEvent(eventInterface: "MutationEvents"): MutationEvent;\n    createEvent(eventInterface: "NavigationCompletedEvent"): NavigationCompletedEvent;\n    createEvent(eventInterface: "NavigationEvent"): NavigationEvent;\n    createEvent(eventInterface: "NavigationEventWithReferrer"): NavigationEventWithReferrer;\n    createEvent(eventInterface: "OfflineAudioCompletionEvent"): OfflineAudioCompletionEvent;\n    createEvent(eventInterface: "OverflowEvent"): OverflowEvent;\n    createEvent(eventInterface: "PageTransitionEvent"): PageTransitionEvent;\n    createEvent(eventInterface: "PaymentRequestUpdateEvent"): PaymentRequestUpdateEvent;\n    createEvent(eventInterface: "PermissionRequestedEvent"): PermissionRequestedEvent;\n    createEvent(eventInterface: "PointerEvent"): PointerEvent;\n    createEvent(eventInterface: "PopStateEvent"): PopStateEvent;\n    createEvent(eventInterface: "ProgressEvent"): ProgressEvent;\n    createEvent(eventInterface: "RTCDTMFToneChangeEvent"): RTCDTMFToneChangeEvent;\n    createEvent(eventInterface: "RTCDtlsTransportStateChangedEvent"): RTCDtlsTransportStateChangedEvent;\n    createEvent(eventInterface: "RTCIceCandidatePairChangedEvent"): RTCIceCandidatePairChangedEvent;\n    createEvent(eventInterface: "RTCIceGathererEvent"): RTCIceGathererEvent;\n    createEvent(eventInterface: "RTCIceTransportStateChangedEvent"): RTCIceTransportStateChangedEvent;\n    createEvent(eventInterface: "RTCPeerConnectionIceEvent"): RTCPeerConnectionIceEvent;\n    createEvent(eventInterface: "RTCSsrcConflictEvent"): RTCSsrcConflictEvent;\n    createEvent(eventInterface: "SVGZoomEvent"): SVGZoomEvent;\n    createEvent(eventInterface: "SVGZoomEvents"): SVGZoomEvent;\n    createEvent(eventInterface: "ScriptNotifyEvent"): ScriptNotifyEvent;\n    createEvent(eventInterface: "ServiceWorkerMessageEvent"): ServiceWorkerMessageEvent;\n    createEvent(eventInterface: "SpeechSynthesisEvent"): SpeechSynthesisEvent;\n    createEvent(eventInterface: "StorageEvent"): StorageEvent;\n    createEvent(eventInterface: "TextEvent"): TextEvent;\n    createEvent(eventInterface: "TouchEvent"): TouchEvent;\n    createEvent(eventInterface: "TrackEvent"): TrackEvent;\n    createEvent(eventInterface: "TransitionEvent"): TransitionEvent;\n    createEvent(eventInterface: "UIEvent"): UIEvent;\n    createEvent(eventInterface: "UIEvents"): UIEvent;\n    createEvent(eventInterface: "UnviewableContentIdentifiedEvent"): UnviewableContentIdentifiedEvent;\n    createEvent(eventInterface: "WebGLContextEvent"): WebGLContextEvent;\n    createEvent(eventInterface: "WheelEvent"): WheelEvent;\n    createEvent(eventInterface: string): Event;\n}\n\ninterface DOML2DeprecatedColorProperty {\n    color: string;\n}\n\ninterface DOML2DeprecatedSizeProperty {\n    size: number;\n}\n\ninterface ElementTraversal {\n    readonly childElementCount: number;\n    readonly firstElementChild: Element | null;\n    readonly lastElementChild: Element | null;\n    readonly nextElementSibling: Element | null;\n    readonly previousElementSibling: Element | null;\n}\n\ninterface GetSVGDocument {\n    getSVGDocument(): Document;\n}\n\ninterface GlobalEventHandlersEventMap {\n    "pointercancel": PointerEvent;\n    "pointerdown": PointerEvent;\n    "pointerenter": PointerEvent;\n    "pointerleave": PointerEvent;\n    "pointermove": PointerEvent;\n    "pointerout": PointerEvent;\n    "pointerover": PointerEvent;\n    "pointerup": PointerEvent;\n    "wheel": WheelEvent;\n}\n\ninterface GlobalEventHandlers {\n    onpointercancel: (this: GlobalEventHandlers, ev: PointerEvent) => any;\n    onpointerdown: (this: GlobalEventHandlers, ev: PointerEvent) => any;\n    onpointerenter: (this: GlobalEventHandlers, ev: PointerEvent) => any;\n    onpointerleave: (this: GlobalEventHandlers, ev: PointerEvent) => any;\n    onpointermove: (this: GlobalEventHandlers, ev: PointerEvent) => any;\n    onpointerout: (this: GlobalEventHandlers, ev: PointerEvent) => any;\n    onpointerover: (this: GlobalEventHandlers, ev: PointerEvent) => any;\n    onpointerup: (this: GlobalEventHandlers, ev: PointerEvent) => any;\n    onwheel: (this: GlobalEventHandlers, ev: WheelEvent) => any;\n    addEventListener<K extends keyof GlobalEventHandlersEventMap>(type: K, listener: (this: GlobalEventHandlers, ev: GlobalEventHandlersEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ninterface GlobalFetch {\n    fetch(input: RequestInfo, init?: RequestInit): Promise<Response>;\n}\n\ninterface HTMLTableAlignment {\n    /**\n     * Sets or retrieves a value that you can use to implement your own ch functionality for the object.\n     */\n    ch: string;\n    /**\n     * Sets or retrieves a value that you can use to implement your own chOff functionality for the object.\n     */\n    chOff: string;\n    /**\n     * Sets or retrieves how text and other content are vertically aligned within the object that contains them.\n     */\n    vAlign: string;\n}\n\ninterface IDBEnvironment {\n    readonly indexedDB: IDBFactory;\n}\n\ninterface LinkStyle {\n    readonly sheet: StyleSheet;\n}\n\ninterface MSBaseReaderEventMap {\n    "abort": Event;\n    "error": ErrorEvent;\n    "load": Event;\n    "loadend": ProgressEvent;\n    "loadstart": Event;\n    "progress": ProgressEvent;\n}\n\ninterface MSBaseReader {\n    onabort: (this: MSBaseReader, ev: Event) => any;\n    onerror: (this: MSBaseReader, ev: ErrorEvent) => any;\n    onload: (this: MSBaseReader, ev: Event) => any;\n    onloadend: (this: MSBaseReader, ev: ProgressEvent) => any;\n    onloadstart: (this: MSBaseReader, ev: Event) => any;\n    onprogress: (this: MSBaseReader, ev: ProgressEvent) => any;\n    readonly readyState: number;\n    readonly result: any;\n    abort(): void;\n    readonly DONE: number;\n    readonly EMPTY: number;\n    readonly LOADING: number;\n    addEventListener<K extends keyof MSBaseReaderEventMap>(type: K, listener: (this: MSBaseReader, ev: MSBaseReaderEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ninterface MSFileSaver {\n    msSaveBlob(blob: any, defaultName?: string): boolean;\n    msSaveOrOpenBlob(blob: any, defaultName?: string): boolean;\n}\n\ninterface MSNavigatorDoNotTrack {\n    confirmSiteSpecificTrackingException(args: ConfirmSiteSpecificExceptionsInformation): boolean;\n    confirmWebWideTrackingException(args: ExceptionInformation): boolean;\n    removeSiteSpecificTrackingException(args: ExceptionInformation): void;\n    removeWebWideTrackingException(args: ExceptionInformation): void;\n    storeSiteSpecificTrackingException(args: StoreSiteSpecificExceptionsInformation): void;\n    storeWebWideTrackingException(args: StoreExceptionsInformation): void;\n}\n\ninterface NavigatorBeacon {\n    sendBeacon(url: USVString, data?: BodyInit): boolean;\n}\n\ninterface NavigatorConcurrentHardware {\n    readonly hardwareConcurrency: number;\n}\n\ninterface NavigatorContentUtils {\n}\n\ninterface NavigatorGeolocation {\n    readonly geolocation: Geolocation;\n}\n\ninterface NavigatorID {\n    readonly appCodeName: string;\n    readonly appName: string;\n    readonly appVersion: string;\n    readonly platform: string;\n    readonly product: string;\n    readonly productSub: string;\n    readonly userAgent: string;\n    readonly vendor: string;\n    readonly vendorSub: string;\n}\n\ninterface NavigatorOnLine {\n    readonly onLine: boolean;\n}\n\ninterface NavigatorStorageUtils {\n}\n\ninterface NavigatorUserMedia {\n    readonly mediaDevices: MediaDevices;\n    getUserMedia(constraints: MediaStreamConstraints, successCallback: NavigatorUserMediaSuccessCallback, errorCallback: NavigatorUserMediaErrorCallback): void;\n}\n\ninterface NodeSelector {\n    querySelector<K extends keyof ElementTagNameMap>(selectors: K): ElementTagNameMap[K] | null;\n    querySelector(selectors: string): Element | null;\n    querySelectorAll<K extends keyof ElementListTagNameMap>(selectors: K): ElementListTagNameMap[K];\n    querySelectorAll(selectors: string): NodeListOf<Element>;\n}\n\ninterface RandomSource {\n    getRandomValues(array: ArrayBufferView): ArrayBufferView;\n}\n\ninterface SVGAnimatedPoints {\n    readonly animatedPoints: SVGPointList;\n    readonly points: SVGPointList;\n}\n\ninterface SVGFilterPrimitiveStandardAttributes {\n    readonly height: SVGAnimatedLength;\n    readonly result: SVGAnimatedString;\n    readonly width: SVGAnimatedLength;\n    readonly x: SVGAnimatedLength;\n    readonly y: SVGAnimatedLength;\n}\n\ninterface SVGFitToViewBox {\n    readonly preserveAspectRatio: SVGAnimatedPreserveAspectRatio;\n    readonly viewBox: SVGAnimatedRect;\n}\n\ninterface SVGTests {\n    readonly requiredExtensions: SVGStringList;\n    readonly requiredFeatures: SVGStringList;\n    readonly systemLanguage: SVGStringList;\n    hasExtension(extension: string): boolean;\n}\n\ninterface SVGURIReference {\n    readonly href: SVGAnimatedString;\n}\n\ninterface WindowBase64 {\n    atob(encodedString: string): string;\n    btoa(rawString: string): string;\n}\n\ninterface WindowConsole {\n    readonly console: Console;\n}\n\ninterface WindowLocalStorage {\n    readonly localStorage: Storage;\n}\n\ninterface WindowSessionStorage {\n    readonly sessionStorage: Storage;\n}\n\ninterface WindowTimers extends Object, WindowTimersExtension {\n    clearInterval(handle: number): void;\n    clearTimeout(handle: number): void;\n    setInterval(handler: (...args: any[]) => void, timeout: number): number;\n    setInterval(handler: any, timeout?: any, ...args: any[]): number;\n    setTimeout(handler: (...args: any[]) => void, timeout: number): number;\n    setTimeout(handler: any, timeout?: any, ...args: any[]): number;\n}\n\ninterface WindowTimersExtension {\n    clearImmediate(handle: number): void;\n    setImmediate(handler: (...args: any[]) => void): number;\n    setImmediate(handler: any, ...args: any[]): number;\n}\n\ninterface XMLHttpRequestEventTargetEventMap {\n    "abort": Event;\n    "error": ErrorEvent;\n    "load": Event;\n    "loadend": ProgressEvent;\n    "loadstart": Event;\n    "progress": ProgressEvent;\n    "timeout": ProgressEvent;\n}\n\ninterface XMLHttpRequestEventTarget {\n    onabort: (this: XMLHttpRequestEventTarget, ev: Event) => any;\n    onerror: (this: XMLHttpRequestEventTarget, ev: ErrorEvent) => any;\n    onload: (this: XMLHttpRequestEventTarget, ev: Event) => any;\n    onloadend: (this: XMLHttpRequestEventTarget, ev: ProgressEvent) => any;\n    onloadstart: (this: XMLHttpRequestEventTarget, ev: Event) => any;\n    onprogress: (this: XMLHttpRequestEventTarget, ev: ProgressEvent) => any;\n    ontimeout: (this: XMLHttpRequestEventTarget, ev: ProgressEvent) => any;\n    addEventListener<K extends keyof XMLHttpRequestEventTargetEventMap>(type: K, listener: (this: XMLHttpRequestEventTarget, ev: XMLHttpRequestEventTargetEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ninterface ErrorEventInit {\n    message?: string;\n    filename?: string;\n    lineno?: number;\n    conlno?: number;\n    error?: any;\n}\n\ninterface StorageEventInit extends EventInit {\n    key?: string;\n    oldValue?: string;\n    newValue?: string;\n    url: string;\n    storageArea?: Storage;\n}\n\ninterface Canvas2DContextAttributes {\n    alpha?: boolean;\n    willReadFrequently?: boolean;\n    storage?: boolean;\n    [attribute: string]: boolean | string | undefined;\n}\n\ninterface ImageBitmapOptions {\n    imageOrientation?: "none" | "flipY";\n    premultiplyAlpha?: "none" | "premultiply" | "default";\n    colorSpaceConversion?: "none" | "default";\n    resizeWidth?: number;\n    resizeHeight?: number;\n    resizeQuality?: "pixelated" | "low" | "medium" | "high";\n}\n\ninterface ImageBitmap {\n    readonly width: number;\n    readonly height: number;\n    close(): void;\n}\n\ninterface URLSearchParams {\n    /**\n     * Appends a specified key/value pair as a new search parameter.\n     */\n    append(name: string, value: string): void;\n    /**\n     * Deletes the given search parameter, and its associated value, from the list of all search parameters.\n     */\n    delete(name: string): void;\n    /**\n     * Returns the first value associated to the given search parameter.\n     */\n    get(name: string): string | null;\n    /**\n     * Returns all the values association with a given search parameter.\n     */\n    getAll(name: string): string[];\n    /**\n     * Returns a Boolean indicating if such a search parameter exists.\n     */\n    has(name: string): boolean;\n    /**\n     * Sets the value associated to a given search parameter to the given value. If there were several values, delete the others.\n     */\n    set(name: string, value: string): void;\n}\n\ndeclare var URLSearchParams: {\n    prototype: URLSearchParams;\n    /**\n     * Constructor returning a URLSearchParams object.\n     */\n    new (init?: string | URLSearchParams): URLSearchParams;\n};\n\ninterface NodeListOf<TNode extends Node> extends NodeList {\n    length: number;\n    item(index: number): TNode;\n    [index: number]: TNode;\n}\n\ninterface HTMLCollectionOf<T extends Element> extends HTMLCollection {\n    item(index: number): T;\n    namedItem(name: string): T;\n    [index: number]: T;\n}\n\ninterface BlobPropertyBag {\n    type?: string;\n    endings?: string;\n}\n\ninterface FilePropertyBag {\n    type?: string;\n    lastModified?: number;\n}\n\ninterface EventListenerObject {\n    handleEvent(evt: Event): void;\n}\n\ninterface ProgressEventInit extends EventInit {\n    lengthComputable?: boolean;\n    loaded?: number;\n    total?: number;\n}\n\ninterface ScrollOptions {\n    behavior?: ScrollBehavior;\n}\n\ninterface ScrollToOptions extends ScrollOptions {\n    left?: number;\n    top?: number;\n}\n\ninterface ScrollIntoViewOptions extends ScrollOptions {\n    block?: ScrollLogicalPosition;\n    inline?: ScrollLogicalPosition;\n}\n\ninterface ClipboardEventInit extends EventInit {\n    data?: string;\n    dataType?: string;\n}\n\ninterface IDBArrayKey extends Array<IDBValidKey> {\n}\n\ninterface RsaKeyGenParams extends Algorithm {\n    modulusLength: number;\n    publicExponent: Uint8Array;\n}\n\ninterface RsaHashedKeyGenParams extends RsaKeyGenParams {\n    hash: AlgorithmIdentifier;\n}\n\ninterface RsaKeyAlgorithm extends KeyAlgorithm {\n    modulusLength: number;\n    publicExponent: Uint8Array;\n}\n\ninterface RsaHashedKeyAlgorithm extends RsaKeyAlgorithm {\n    hash: AlgorithmIdentifier;\n}\n\ninterface RsaHashedImportParams {\n    hash: AlgorithmIdentifier;\n}\n\ninterface RsaPssParams {\n    saltLength: number;\n}\n\ninterface RsaOaepParams extends Algorithm {\n    label?: BufferSource;\n}\n\ninterface EcdsaParams extends Algorithm {\n    hash: AlgorithmIdentifier;\n}\n\ninterface EcKeyGenParams extends Algorithm {\n    namedCurve: string;\n}\n\ninterface EcKeyAlgorithm extends KeyAlgorithm {\n    typedCurve: string;\n}\n\ninterface EcKeyImportParams {\n    namedCurve: string;\n}\n\ninterface EcdhKeyDeriveParams extends Algorithm {\n    public: CryptoKey;\n}\n\ninterface AesCtrParams extends Algorithm {\n    counter: BufferSource;\n    length: number;\n}\n\ninterface AesKeyAlgorithm extends KeyAlgorithm {\n    length: number;\n}\n\ninterface AesKeyGenParams extends Algorithm {\n    length: number;\n}\n\ninterface AesDerivedKeyParams extends Algorithm {\n    length: number;\n}\n\ninterface AesCbcParams extends Algorithm {\n    iv: BufferSource;\n}\n\ninterface AesCmacParams extends Algorithm {\n    length: number;\n}\n\ninterface AesGcmParams extends Algorithm {\n    iv: BufferSource;\n    additionalData?: BufferSource;\n    tagLength?: number;\n}\n\ninterface AesCfbParams extends Algorithm {\n    iv: BufferSource;\n}\n\ninterface HmacImportParams extends Algorithm {\n    hash?: AlgorithmIdentifier;\n    length?: number;\n}\n\ninterface HmacKeyAlgorithm extends KeyAlgorithm {\n    hash: AlgorithmIdentifier;\n    length: number;\n}\n\ninterface HmacKeyGenParams extends Algorithm {\n    hash: AlgorithmIdentifier;\n    length?: number;\n}\n\ninterface DhKeyGenParams extends Algorithm {\n    prime: Uint8Array;\n    generator: Uint8Array;\n}\n\ninterface DhKeyAlgorithm extends KeyAlgorithm {\n    prime: Uint8Array;\n    generator: Uint8Array;\n}\n\ninterface DhKeyDeriveParams extends Algorithm {\n    public: CryptoKey;\n}\n\ninterface DhImportKeyParams extends Algorithm {\n    prime: Uint8Array;\n    generator: Uint8Array;\n}\n\ninterface ConcatParams extends Algorithm {\n    hash?: AlgorithmIdentifier;\n    algorithmId: Uint8Array;\n    partyUInfo: Uint8Array;\n    partyVInfo: Uint8Array;\n    publicInfo?: Uint8Array;\n    privateInfo?: Uint8Array;\n}\n\ninterface HkdfCtrParams extends Algorithm {\n    hash: AlgorithmIdentifier;\n    label: BufferSource;\n    context: BufferSource;\n}\n\ninterface Pbkdf2Params extends Algorithm {\n    salt: BufferSource;\n    iterations: number;\n    hash: AlgorithmIdentifier;\n}\n\ninterface RsaOtherPrimesInfo {\n    r: string;\n    d: string;\n    t: string;\n}\n\ninterface JsonWebKey {\n    kty: string;\n    use?: string;\n    key_ops?: string[];\n    alg?: string;\n    kid?: string;\n    x5u?: string;\n    x5c?: string;\n    x5t?: string;\n    ext?: boolean;\n    crv?: string;\n    x?: string;\n    y?: string;\n    d?: string;\n    n?: string;\n    e?: string;\n    p?: string;\n    q?: string;\n    dp?: string;\n    dq?: string;\n    qi?: string;\n    oth?: RsaOtherPrimesInfo[];\n    k?: string;\n}\n\ninterface ParentNode {\n    readonly children: HTMLCollection;\n    readonly firstElementChild: Element | null;\n    readonly lastElementChild: Element | null;\n    readonly childElementCount: number;\n}\n\ninterface DocumentOrShadowRoot {\n    readonly activeElement: Element | null;\n    readonly stylesheets: StyleSheetList;\n    getSelection(): Selection | null;\n    elementFromPoint(x: number, y: number): Element | null;\n    elementsFromPoint(x: number, y: number): Element[];\n}\n\ninterface ShadowRoot extends DocumentOrShadowRoot, DocumentFragment {\n    readonly host: Element;\n    innerHTML: string;\n}\n\ninterface ShadowRootInit {\n    mode: "open" | "closed";\n    delegatesFocus?: boolean;\n}\n\ninterface HTMLSlotElement extends HTMLElement {\n    name: string;\n    assignedNodes(options?: AssignedNodesOptions): Node[];\n}\n\ninterface AssignedNodesOptions {\n    flatten?: boolean;\n}\n\ninterface ElementDefinitionOptions {\n    extends: string;\n}\n\ninterface CustomElementRegistry {\n    define(name: string, constructor: Function, options?: ElementDefinitionOptions): void;\n    get(name: string): any;\n    whenDefined(name: string): PromiseLike<void>;\n}\n\ninterface PromiseRejectionEvent extends Event {\n    readonly promise: PromiseLike<any>;\n    readonly reason: any;\n}\n\ninterface PromiseRejectionEventInit extends EventInit {\n    promise: PromiseLike<any>;\n    reason?: any;\n}\n\ninterface EventListenerOptions {\n    capture?: boolean;\n}\n\ninterface AddEventListenerOptions extends EventListenerOptions {\n    passive?: boolean;\n    once?: boolean;\n}\n\ninterface TouchEventInit extends EventModifierInit {\n    touches?: Touch[];\n    targetTouches?: Touch[];\n    changedTouches?: Touch[];\n}\n\ndeclare type EventListenerOrEventListenerObject = EventListener | EventListenerObject;\n\ninterface DecodeErrorCallback {\n    (error: DOMException): void;\n}\ninterface DecodeSuccessCallback {\n    (decodedData: AudioBuffer): void;\n}\ninterface ErrorEventHandler {\n    (message: string, filename?: string, lineno?: number, colno?: number, error?: Error): void;\n}\ninterface ForEachCallback {\n    (keyId: any, status: MediaKeyStatus): void;\n}\ninterface FrameRequestCallback {\n    (time: number): void;\n}\ninterface FunctionStringCallback {\n    (data: string): void;\n}\ninterface IntersectionObserverCallback {\n    (entries: IntersectionObserverEntry[], observer: IntersectionObserver): void;\n}\ninterface MediaQueryListListener {\n    (mql: MediaQueryList): void;\n}\ninterface MSExecAtPriorityFunctionCallback {\n    (...args: any[]): any;\n}\ninterface MSLaunchUriCallback {\n    (): void;\n}\ninterface MSUnsafeFunctionCallback {\n    (): any;\n}\ninterface MutationCallback {\n    (mutations: MutationRecord[], observer: MutationObserver): void;\n}\ninterface NavigatorUserMediaErrorCallback {\n    (error: MediaStreamError): void;\n}\ninterface NavigatorUserMediaSuccessCallback {\n    (stream: MediaStream): void;\n}\ninterface NotificationPermissionCallback {\n    (permission: NotificationPermission): void;\n}\ninterface PositionCallback {\n    (position: Position): void;\n}\ninterface PositionErrorCallback {\n    (error: PositionError): void;\n}\ninterface RTCPeerConnectionErrorCallback {\n    (error: DOMError): void;\n}\ninterface RTCSessionDescriptionCallback {\n    (sdp: RTCSessionDescription): void;\n}\ninterface RTCStatsCallback {\n    (report: RTCStatsReport): void;\n}\ninterface VoidFunction {\n    (): void;\n}\ninterface HTMLElementTagNameMap {\n    "a": HTMLAnchorElement;\n    "applet": HTMLAppletElement;\n    "area": HTMLAreaElement;\n    "audio": HTMLAudioElement;\n    "base": HTMLBaseElement;\n    "basefont": HTMLBaseFontElement;\n    "blockquote": HTMLQuoteElement;\n    "body": HTMLBodyElement;\n    "br": HTMLBRElement;\n    "button": HTMLButtonElement;\n    "canvas": HTMLCanvasElement;\n    "caption": HTMLTableCaptionElement;\n    "col": HTMLTableColElement;\n    "colgroup": HTMLTableColElement;\n    "data": HTMLDataElement;\n    "datalist": HTMLDataListElement;\n    "del": HTMLModElement;\n    "dir": HTMLDirectoryElement;\n    "div": HTMLDivElement;\n    "dl": HTMLDListElement;\n    "embed": HTMLEmbedElement;\n    "fieldset": HTMLFieldSetElement;\n    "font": HTMLFontElement;\n    "form": HTMLFormElement;\n    "frame": HTMLFrameElement;\n    "frameset": HTMLFrameSetElement;\n    "h1": HTMLHeadingElement;\n    "h2": HTMLHeadingElement;\n    "h3": HTMLHeadingElement;\n    "h4": HTMLHeadingElement;\n    "h5": HTMLHeadingElement;\n    "h6": HTMLHeadingElement;\n    "head": HTMLHeadElement;\n    "hr": HTMLHRElement;\n    "html": HTMLHtmlElement;\n    "iframe": HTMLIFrameElement;\n    "img": HTMLImageElement;\n    "input": HTMLInputElement;\n    "ins": HTMLModElement;\n    "isindex": HTMLUnknownElement;\n    "label": HTMLLabelElement;\n    "legend": HTMLLegendElement;\n    "li": HTMLLIElement;\n    "link": HTMLLinkElement;\n    "listing": HTMLPreElement;\n    "map": HTMLMapElement;\n    "marquee": HTMLMarqueeElement;\n    "menu": HTMLMenuElement;\n    "meta": HTMLMetaElement;\n    "meter": HTMLMeterElement;\n    "nextid": HTMLUnknownElement;\n    "object": HTMLObjectElement;\n    "ol": HTMLOListElement;\n    "optgroup": HTMLOptGroupElement;\n    "option": HTMLOptionElement;\n    "output": HTMLOutputElement;\n    "p": HTMLParagraphElement;\n    "param": HTMLParamElement;\n    "picture": HTMLPictureElement;\n    "pre": HTMLPreElement;\n    "progress": HTMLProgressElement;\n    "q": HTMLQuoteElement;\n    "script": HTMLScriptElement;\n    "select": HTMLSelectElement;\n    "source": HTMLSourceElement;\n    "span": HTMLSpanElement;\n    "style": HTMLStyleElement;\n    "table": HTMLTableElement;\n    "tbody": HTMLTableSectionElement;\n    "td": HTMLTableDataCellElement;\n    "template": HTMLTemplateElement;\n    "textarea": HTMLTextAreaElement;\n    "tfoot": HTMLTableSectionElement;\n    "th": HTMLTableHeaderCellElement;\n    "thead": HTMLTableSectionElement;\n    "time": HTMLTimeElement;\n    "title": HTMLTitleElement;\n    "tr": HTMLTableRowElement;\n    "track": HTMLTrackElement;\n    "ul": HTMLUListElement;\n    "video": HTMLVideoElement;\n    "x-ms-webview": MSHTMLWebViewElement;\n    "xmp": HTMLPreElement;\n}\n\ninterface ElementTagNameMap extends HTMLElementTagNameMap {\n    "abbr": HTMLElement;\n    "acronym": HTMLElement;\n    "address": HTMLElement;\n    "article": HTMLElement;\n    "aside": HTMLElement;\n    "b": HTMLElement;\n    "bdo": HTMLElement;\n    "big": HTMLElement;\n    "center": HTMLElement;\n    "circle": SVGCircleElement;\n    "cite": HTMLElement;\n    "clippath": SVGClipPathElement;\n    "code": HTMLElement;\n    "dd": HTMLElement;\n    "defs": SVGDefsElement;\n    "desc": SVGDescElement;\n    "dfn": HTMLElement;\n    "dt": HTMLElement;\n    "ellipse": SVGEllipseElement;\n    "em": HTMLElement;\n    "feblend": SVGFEBlendElement;\n    "fecolormatrix": SVGFEColorMatrixElement;\n    "fecomponenttransfer": SVGFEComponentTransferElement;\n    "fecomposite": SVGFECompositeElement;\n    "feconvolvematrix": SVGFEConvolveMatrixElement;\n    "fediffuselighting": SVGFEDiffuseLightingElement;\n    "fedisplacementmap": SVGFEDisplacementMapElement;\n    "fedistantlight": SVGFEDistantLightElement;\n    "feflood": SVGFEFloodElement;\n    "fefunca": SVGFEFuncAElement;\n    "fefuncb": SVGFEFuncBElement;\n    "fefuncg": SVGFEFuncGElement;\n    "fefuncr": SVGFEFuncRElement;\n    "fegaussianblur": SVGFEGaussianBlurElement;\n    "feimage": SVGFEImageElement;\n    "femerge": SVGFEMergeElement;\n    "femergenode": SVGFEMergeNodeElement;\n    "femorphology": SVGFEMorphologyElement;\n    "feoffset": SVGFEOffsetElement;\n    "fepointlight": SVGFEPointLightElement;\n    "fespecularlighting": SVGFESpecularLightingElement;\n    "fespotlight": SVGFESpotLightElement;\n    "fetile": SVGFETileElement;\n    "feturbulence": SVGFETurbulenceElement;\n    "figcaption": HTMLElement;\n    "figure": HTMLElement;\n    "filter": SVGFilterElement;\n    "footer": HTMLElement;\n    "foreignobject": SVGForeignObjectElement;\n    "g": SVGGElement;\n    "header": HTMLElement;\n    "hgroup": HTMLElement;\n    "i": HTMLElement;\n    "image": SVGImageElement;\n    "kbd": HTMLElement;\n    "keygen": HTMLElement;\n    "line": SVGLineElement;\n    "lineargradient": SVGLinearGradientElement;\n    "mark": HTMLElement;\n    "marker": SVGMarkerElement;\n    "mask": SVGMaskElement;\n    "metadata": SVGMetadataElement;\n    "nav": HTMLElement;\n    "nobr": HTMLElement;\n    "noframes": HTMLElement;\n    "noscript": HTMLElement;\n    "path": SVGPathElement;\n    "pattern": SVGPatternElement;\n    "plaintext": HTMLElement;\n    "polygon": SVGPolygonElement;\n    "polyline": SVGPolylineElement;\n    "radialgradient": SVGRadialGradientElement;\n    "rect": SVGRectElement;\n    "rt": HTMLElement;\n    "ruby": HTMLElement;\n    "s": HTMLElement;\n    "samp": HTMLElement;\n    "section": HTMLElement;\n    "small": HTMLElement;\n    "stop": SVGStopElement;\n    "strike": HTMLElement;\n    "strong": HTMLElement;\n    "sub": HTMLElement;\n    "sup": HTMLElement;\n    "svg": SVGSVGElement;\n    "switch": SVGSwitchElement;\n    "symbol": SVGSymbolElement;\n    "text": SVGTextElement;\n    "textpath": SVGTextPathElement;\n    "tspan": SVGTSpanElement;\n    "tt": HTMLElement;\n    "u": HTMLElement;\n    "use": SVGUseElement;\n    "var": HTMLElement;\n    "view": SVGViewElement;\n    "wbr": HTMLElement;\n}\n\ntype ElementListTagNameMap = {\n    [key in keyof ElementTagNameMap]: NodeListOf<ElementTagNameMap[key]>\n};\n\ndeclare var Audio: { new(src?: string): HTMLAudioElement; };\ndeclare var Image: { new(width?: number, height?: number): HTMLImageElement; };\ndeclare var Option: { new(text?: string, value?: string, defaultSelected?: boolean, selected?: boolean): HTMLOptionElement; };\ndeclare var applicationCache: ApplicationCache;\ndeclare var caches: CacheStorage;\ndeclare var clientInformation: Navigator;\ndeclare var closed: boolean;\ndeclare var crypto: Crypto;\ndeclare var defaultStatus: string;\ndeclare var devicePixelRatio: number;\ndeclare var document: Document;\ndeclare var doNotTrack: string;\ndeclare var event: Event | undefined;\ndeclare var external: External;\ndeclare var frameElement: Element;\ndeclare var frames: Window;\ndeclare var history: History;\ndeclare var innerHeight: number;\ndeclare var innerWidth: number;\ndeclare var isSecureContext: boolean;\ndeclare var length: number;\ndeclare var location: Location;\ndeclare var locationbar: BarProp;\ndeclare var menubar: BarProp;\ndeclare var msContentScript: ExtensionScriptApis;\ndeclare var msCredentials: MSCredentials;\ndeclare const name: never;\ndeclare var navigator: Navigator;\ndeclare var offscreenBuffering: string | boolean;\ndeclare var onabort: (this: Window, ev: UIEvent) => any;\ndeclare var onafterprint: (this: Window, ev: Event) => any;\ndeclare var onbeforeprint: (this: Window, ev: Event) => any;\ndeclare var onbeforeunload: (this: Window, ev: BeforeUnloadEvent) => any;\ndeclare var onblur: (this: Window, ev: FocusEvent) => any;\ndeclare var oncanplay: (this: Window, ev: Event) => any;\ndeclare var oncanplaythrough: (this: Window, ev: Event) => any;\ndeclare var onchange: (this: Window, ev: Event) => any;\ndeclare var onclick: (this: Window, ev: MouseEvent) => any;\ndeclare var oncompassneedscalibration: (this: Window, ev: Event) => any;\ndeclare var oncontextmenu: (this: Window, ev: PointerEvent) => any;\ndeclare var ondblclick: (this: Window, ev: MouseEvent) => any;\ndeclare var ondevicelight: (this: Window, ev: DeviceLightEvent) => any;\ndeclare var ondevicemotion: (this: Window, ev: DeviceMotionEvent) => any;\ndeclare var ondeviceorientation: (this: Window, ev: DeviceOrientationEvent) => any;\ndeclare var ondrag: (this: Window, ev: DragEvent) => any;\ndeclare var ondragend: (this: Window, ev: DragEvent) => any;\ndeclare var ondragenter: (this: Window, ev: DragEvent) => any;\ndeclare var ondragleave: (this: Window, ev: DragEvent) => any;\ndeclare var ondragover: (this: Window, ev: DragEvent) => any;\ndeclare var ondragstart: (this: Window, ev: DragEvent) => any;\ndeclare var ondrop: (this: Window, ev: DragEvent) => any;\ndeclare var ondurationchange: (this: Window, ev: Event) => any;\ndeclare var onemptied: (this: Window, ev: Event) => any;\ndeclare var onended: (this: Window, ev: MediaStreamErrorEvent) => any;\ndeclare var onerror: ErrorEventHandler;\ndeclare var onfocus: (this: Window, ev: FocusEvent) => any;\ndeclare var onhashchange: (this: Window, ev: HashChangeEvent) => any;\ndeclare var oninput: (this: Window, ev: Event) => any;\ndeclare var oninvalid: (this: Window, ev: Event) => any;\ndeclare var onkeydown: (this: Window, ev: KeyboardEvent) => any;\ndeclare var onkeypress: (this: Window, ev: KeyboardEvent) => any;\ndeclare var onkeyup: (this: Window, ev: KeyboardEvent) => any;\ndeclare var onload: (this: Window, ev: Event) => any;\ndeclare var onloadeddata: (this: Window, ev: Event) => any;\ndeclare var onloadedmetadata: (this: Window, ev: Event) => any;\ndeclare var onloadstart: (this: Window, ev: Event) => any;\ndeclare var onmessage: (this: Window, ev: MessageEvent) => any;\ndeclare var onmousedown: (this: Window, ev: MouseEvent) => any;\ndeclare var onmouseenter: (this: Window, ev: MouseEvent) => any;\ndeclare var onmouseleave: (this: Window, ev: MouseEvent) => any;\ndeclare var onmousemove: (this: Window, ev: MouseEvent) => any;\ndeclare var onmouseout: (this: Window, ev: MouseEvent) => any;\ndeclare var onmouseover: (this: Window, ev: MouseEvent) => any;\ndeclare var onmouseup: (this: Window, ev: MouseEvent) => any;\ndeclare var onmousewheel: (this: Window, ev: WheelEvent) => any;\ndeclare var onmsgesturechange: (this: Window, ev: MSGestureEvent) => any;\ndeclare var onmsgesturedoubletap: (this: Window, ev: MSGestureEvent) => any;\ndeclare var onmsgestureend: (this: Window, ev: MSGestureEvent) => any;\ndeclare var onmsgesturehold: (this: Window, ev: MSGestureEvent) => any;\ndeclare var onmsgesturestart: (this: Window, ev: MSGestureEvent) => any;\ndeclare var onmsgesturetap: (this: Window, ev: MSGestureEvent) => any;\ndeclare var onmsinertiastart: (this: Window, ev: MSGestureEvent) => any;\ndeclare var onmspointercancel: (this: Window, ev: MSPointerEvent) => any;\ndeclare var onmspointerdown: (this: Window, ev: MSPointerEvent) => any;\ndeclare var onmspointerenter: (this: Window, ev: MSPointerEvent) => any;\ndeclare var onmspointerleave: (this: Window, ev: MSPointerEvent) => any;\ndeclare var onmspointermove: (this: Window, ev: MSPointerEvent) => any;\ndeclare var onmspointerout: (this: Window, ev: MSPointerEvent) => any;\ndeclare var onmspointerover: (this: Window, ev: MSPointerEvent) => any;\ndeclare var onmspointerup: (this: Window, ev: MSPointerEvent) => any;\ndeclare var onoffline: (this: Window, ev: Event) => any;\ndeclare var ononline: (this: Window, ev: Event) => any;\ndeclare var onorientationchange: (this: Window, ev: Event) => any;\ndeclare var onpagehide: (this: Window, ev: PageTransitionEvent) => any;\ndeclare var onpageshow: (this: Window, ev: PageTransitionEvent) => any;\ndeclare var onpause: (this: Window, ev: Event) => any;\ndeclare var onplay: (this: Window, ev: Event) => any;\ndeclare var onplaying: (this: Window, ev: Event) => any;\ndeclare var onpopstate: (this: Window, ev: PopStateEvent) => any;\ndeclare var onprogress: (this: Window, ev: ProgressEvent) => any;\ndeclare var onratechange: (this: Window, ev: Event) => any;\ndeclare var onreadystatechange: (this: Window, ev: ProgressEvent) => any;\ndeclare var onreset: (this: Window, ev: Event) => any;\ndeclare var onresize: (this: Window, ev: UIEvent) => any;\ndeclare var onscroll: (this: Window, ev: UIEvent) => any;\ndeclare var onseeked: (this: Window, ev: Event) => any;\ndeclare var onseeking: (this: Window, ev: Event) => any;\ndeclare var onselect: (this: Window, ev: UIEvent) => any;\ndeclare var onstalled: (this: Window, ev: Event) => any;\ndeclare var onstorage: (this: Window, ev: StorageEvent) => any;\ndeclare var onsubmit: (this: Window, ev: Event) => any;\ndeclare var onsuspend: (this: Window, ev: Event) => any;\ndeclare var ontimeupdate: (this: Window, ev: Event) => any;\ndeclare var ontouchcancel: (ev: TouchEvent) => any;\ndeclare var ontouchend: (ev: TouchEvent) => any;\ndeclare var ontouchmove: (ev: TouchEvent) => any;\ndeclare var ontouchstart: (ev: TouchEvent) => any;\ndeclare var onunload: (this: Window, ev: Event) => any;\ndeclare var onvolumechange: (this: Window, ev: Event) => any;\ndeclare var onwaiting: (this: Window, ev: Event) => any;\ndeclare var opener: any;\ndeclare var orientation: string | number;\ndeclare var outerHeight: number;\ndeclare var outerWidth: number;\ndeclare var pageXOffset: number;\ndeclare var pageYOffset: number;\ndeclare var parent: Window;\ndeclare var performance: Performance;\ndeclare var personalbar: BarProp;\ndeclare var screen: Screen;\ndeclare var screenLeft: number;\ndeclare var screenTop: number;\ndeclare var screenX: number;\ndeclare var screenY: number;\ndeclare var scrollbars: BarProp;\ndeclare var scrollX: number;\ndeclare var scrollY: number;\ndeclare var self: Window;\ndeclare var speechSynthesis: SpeechSynthesis;\ndeclare var status: string;\ndeclare var statusbar: BarProp;\ndeclare var styleMedia: StyleMedia;\ndeclare var toolbar: BarProp;\ndeclare var top: Window;\ndeclare var window: Window;\ndeclare var customElements: CustomElementRegistry;\ndeclare function alert(message?: any): void;\ndeclare function blur(): void;\ndeclare function cancelAnimationFrame(handle: number): void;\ndeclare function captureEvents(): void;\ndeclare function close(): void;\ndeclare function confirm(message?: string): boolean;\ndeclare function departFocus(navigationReason: NavigationReason, origin: FocusNavigationOrigin): void;\ndeclare function focus(): void;\ndeclare function getComputedStyle(elt: Element, pseudoElt?: string): CSSStyleDeclaration;\ndeclare function getMatchedCSSRules(elt: Element, pseudoElt?: string): CSSRuleList;\ndeclare function getSelection(): Selection;\ndeclare function matchMedia(mediaQuery: string): MediaQueryList;\ndeclare function moveBy(x?: number, y?: number): void;\ndeclare function moveTo(x?: number, y?: number): void;\ndeclare function msWriteProfilerMark(profilerMarkName: string): void;\ndeclare function open(url?: string, target?: string, features?: string, replace?: boolean): Window;\ndeclare function postMessage(message: any, targetOrigin: string, transfer?: any[]): void;\ndeclare function print(): void;\ndeclare function prompt(message?: string, _default?: string): string | null;\ndeclare function releaseEvents(): void;\ndeclare function requestAnimationFrame(callback: FrameRequestCallback): number;\ndeclare function resizeBy(x?: number, y?: number): void;\ndeclare function resizeTo(x?: number, y?: number): void;\ndeclare function scroll(x?: number, y?: number): void;\ndeclare function scrollBy(x?: number, y?: number): void;\ndeclare function scrollTo(x?: number, y?: number): void;\ndeclare function stop(): void;\ndeclare function webkitCancelAnimationFrame(handle: number): void;\ndeclare function webkitConvertPointFromNodeToPage(node: Node, pt: WebKitPoint): WebKitPoint;\ndeclare function webkitConvertPointFromPageToNode(node: Node, pt: WebKitPoint): WebKitPoint;\ndeclare function webkitRequestAnimationFrame(callback: FrameRequestCallback): number;\ndeclare function createImageBitmap(image: HTMLImageElement | SVGImageElement | HTMLVideoElement | HTMLCanvasElement | ImageBitmap | ImageData | Blob, options?: ImageBitmapOptions): Promise<ImageBitmap>;\ndeclare function createImageBitmap(image: HTMLImageElement | SVGImageElement | HTMLVideoElement | HTMLCanvasElement | ImageBitmap | ImageData | Blob, sx: number, sy: number, sw: number, sh: number, options?: ImageBitmapOptions): Promise<ImageBitmap>;\ndeclare function scroll(options?: ScrollToOptions): void;\ndeclare function scrollTo(options?: ScrollToOptions): void;\ndeclare function scrollBy(options?: ScrollToOptions): void;\ndeclare function toString(): string;\ndeclare function dispatchEvent(evt: Event): boolean;\ndeclare function removeEventListener(type: string, listener?: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;\ndeclare function clearInterval(handle: number): void;\ndeclare function clearTimeout(handle: number): void;\ndeclare function setInterval(handler: (...args: any[]) => void, timeout: number): number;\ndeclare function setInterval(handler: any, timeout?: any, ...args: any[]): number;\ndeclare function setTimeout(handler: (...args: any[]) => void, timeout: number): number;\ndeclare function setTimeout(handler: any, timeout?: any, ...args: any[]): number;\ndeclare function clearImmediate(handle: number): void;\ndeclare function setImmediate(handler: (...args: any[]) => void): number;\ndeclare function setImmediate(handler: any, ...args: any[]): number;\ndeclare var sessionStorage: Storage;\ndeclare var localStorage: Storage;\ndeclare var console: Console;\ndeclare var onpointercancel: (this: Window, ev: PointerEvent) => any;\ndeclare var onpointerdown: (this: Window, ev: PointerEvent) => any;\ndeclare var onpointerenter: (this: Window, ev: PointerEvent) => any;\ndeclare var onpointerleave: (this: Window, ev: PointerEvent) => any;\ndeclare var onpointermove: (this: Window, ev: PointerEvent) => any;\ndeclare var onpointerout: (this: Window, ev: PointerEvent) => any;\ndeclare var onpointerover: (this: Window, ev: PointerEvent) => any;\ndeclare var onpointerup: (this: Window, ev: PointerEvent) => any;\ndeclare var onwheel: (this: Window, ev: WheelEvent) => any;\ndeclare var indexedDB: IDBFactory;\ndeclare function atob(encodedString: string): string;\ndeclare function btoa(rawString: string): string;\ndeclare function fetch(input: RequestInfo, init?: RequestInit): Promise<Response>;\ndeclare function addEventListener<K extends keyof WindowEventMap>(type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, useCapture?: boolean): void;\ndeclare function addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\ntype AAGUID = string;\ntype AlgorithmIdentifier = string | Algorithm;\ntype BodyInit = any;\ntype ByteString = string;\ntype ConstrainBoolean = boolean | ConstrainBooleanParameters;\ntype ConstrainDOMString = string | string[] | ConstrainDOMStringParameters;\ntype ConstrainDouble = number | ConstrainDoubleRange;\ntype ConstrainLong = number | ConstrainLongRange;\ntype CryptoOperationData = ArrayBufferView;\ntype GLbitfield = number;\ntype GLboolean = boolean;\ntype GLbyte = number;\ntype GLclampf = number;\ntype GLenum = number;\ntype GLfloat = number;\ntype GLint = number;\ntype GLintptr = number;\ntype GLshort = number;\ntype GLsizei = number;\ntype GLsizeiptr = number;\ntype GLubyte = number;\ntype GLuint = number;\ntype GLushort = number;\ntype HeadersInit = any;\ntype IDBKeyPath = string;\ntype KeyFormat = string;\ntype KeyType = string;\ntype KeyUsage = string;\ntype MSInboundPayload = MSVideoRecvPayload | MSAudioRecvPayload;\ntype MSLocalClientEvent = MSLocalClientEventBase | MSAudioLocalClientEvent;\ntype MSOutboundPayload = MSVideoSendPayload | MSAudioSendPayload;\ntype RTCIceGatherCandidate = RTCIceCandidateDictionary | RTCIceCandidateComplete;\ntype RTCTransport = RTCDtlsTransport | RTCSrtpSdesTransport;\ntype RequestInfo = Request | string;\ntype USVString = string;\ntype payloadtype = number;\ntype ScrollBehavior = "auto" | "instant" | "smooth";\ntype ScrollLogicalPosition = "start" | "center" | "end" | "nearest";\ntype IDBValidKey = number | string | Date | IDBArrayKey;\ntype BufferSource = ArrayBuffer | ArrayBufferView;\ntype MouseWheelEvent = WheelEvent;\ntype ScrollRestoration = "auto" | "manual";\ntype FormDataEntryValue = string | File;\ntype InsertPosition = "beforebegin" | "afterbegin" | "beforeend" | "afterend";\ntype AppendMode = "segments" | "sequence";\ntype AudioContextState = "suspended" | "running" | "closed";\ntype BiquadFilterType = "lowpass" | "highpass" | "bandpass" | "lowshelf" | "highshelf" | "peaking" | "notch" | "allpass";\ntype CanvasFillRule = "nonzero" | "evenodd";\ntype ChannelCountMode = "max" | "clamped-max" | "explicit";\ntype ChannelInterpretation = "speakers" | "discrete";\ntype DistanceModelType = "linear" | "inverse" | "exponential";\ntype ExpandGranularity = "character" | "word" | "sentence" | "textedit";\ntype GamepadInputEmulationType = "mouse" | "keyboard" | "gamepad";\ntype IDBCursorDirection = "next" | "nextunique" | "prev" | "prevunique";\ntype IDBRequestReadyState = "pending" | "done";\ntype IDBTransactionMode = "readonly" | "readwrite" | "versionchange";\ntype ListeningState = "inactive" | "active" | "disambiguation";\ntype MediaDeviceKind = "audioinput" | "audiooutput" | "videoinput";\ntype MediaKeyMessageType = "license-request" | "license-renewal" | "license-release" | "individualization-request";\ntype MediaKeySessionType = "temporary" | "persistent-license" | "persistent-release-message";\ntype MediaKeysRequirement = "required" | "optional" | "not-allowed";\ntype MediaKeyStatus = "usable" | "expired" | "output-downscaled" | "output-not-allowed" | "status-pending" | "internal-error";\ntype MediaStreamTrackState = "live" | "ended";\ntype MSCredentialType = "FIDO_2_0";\ntype MSIceAddrType = "os" | "stun" | "turn" | "peer-derived";\ntype MSIceType = "failed" | "direct" | "relay";\ntype MSStatsType = "description" | "localclientevent" | "inbound-network" | "outbound-network" | "inbound-payload" | "outbound-payload" | "transportdiagnostics";\ntype MSTransportType = "Embedded" | "USB" | "NFC" | "BT";\ntype MSWebViewPermissionState = "unknown" | "defer" | "allow" | "deny";\ntype MSWebViewPermissionType = "geolocation" | "unlimitedIndexedDBQuota" | "media" | "pointerlock" | "webnotifications";\ntype NavigationReason = "up" | "down" | "left" | "right";\ntype NavigationType = "navigate" | "reload" | "back_forward" | "prerender";\ntype NotificationDirection = "auto" | "ltr" | "rtl";\ntype NotificationPermission = "default" | "denied" | "granted";\ntype OscillatorType = "sine" | "square" | "sawtooth" | "triangle" | "custom";\ntype OverSampleType = "none" | "2x" | "4x";\ntype PanningModelType = "equalpower";\ntype PaymentComplete = "success" | "fail" | "";\ntype PaymentShippingType = "shipping" | "delivery" | "pickup";\ntype PushEncryptionKeyName = "p256dh" | "auth";\ntype PushPermissionState = "granted" | "denied" | "prompt";\ntype ReferrerPolicy = "" | "no-referrer" | "no-referrer-when-downgrade" | "origin-only" | "origin-when-cross-origin" | "unsafe-url";\ntype RequestCache = "default" | "no-store" | "reload" | "no-cache" | "force-cache";\ntype RequestCredentials = "omit" | "same-origin" | "include";\ntype RequestDestination = "" | "document" | "sharedworker" | "subresource" | "unknown" | "worker";\ntype RequestMode = "navigate" | "same-origin" | "no-cors" | "cors";\ntype RequestRedirect = "follow" | "error" | "manual";\ntype RequestType = "" | "audio" | "font" | "image" | "script" | "style" | "track" | "video";\ntype ResponseType = "basic" | "cors" | "default" | "error" | "opaque" | "opaqueredirect";\ntype RTCBundlePolicy = "balanced" | "max-compat" | "max-bundle";\ntype RTCDegradationPreference = "maintain-framerate" | "maintain-resolution" | "balanced";\ntype RTCDtlsRole = "auto" | "client" | "server";\ntype RTCDtlsTransportState = "new" | "connecting" | "connected" | "closed";\ntype RTCIceCandidateType = "host" | "srflx" | "prflx" | "relay";\ntype RTCIceComponent = "RTP" | "RTCP";\ntype RTCIceConnectionState = "new" | "checking" | "connected" | "completed" | "failed" | "disconnected" | "closed";\ntype RTCIceGathererState = "new" | "gathering" | "complete";\ntype RTCIceGatheringState = "new" | "gathering" | "complete";\ntype RTCIceGatherPolicy = "all" | "nohost" | "relay";\ntype RTCIceProtocol = "udp" | "tcp";\ntype RTCIceRole = "controlling" | "controlled";\ntype RTCIceTcpCandidateType = "active" | "passive" | "so";\ntype RTCIceTransportPolicy = "none" | "relay" | "all";\ntype RTCIceTransportState = "new" | "checking" | "connected" | "completed" | "disconnected" | "closed";\ntype RTCSdpType = "offer" | "pranswer" | "answer";\ntype RTCSignalingState = "stable" | "have-local-offer" | "have-remote-offer" | "have-local-pranswer" | "have-remote-pranswer" | "closed";\ntype RTCStatsIceCandidatePairState = "frozen" | "waiting" | "inprogress" | "failed" | "succeeded" | "cancelled";\ntype RTCStatsIceCandidateType = "host" | "serverreflexive" | "peerreflexive" | "relayed";\ntype RTCStatsType = "inboundrtp" | "outboundrtp" | "session" | "datachannel" | "track" | "transport" | "candidatepair" | "localcandidate" | "remotecandidate";\ntype ScopedCredentialType = "ScopedCred";\ntype ServiceWorkerState = "installing" | "installed" | "activating" | "activated" | "redundant";\ntype Transport = "usb" | "nfc" | "ble";\ntype VideoFacingModeEnum = "user" | "environment" | "left" | "right";\ntype VisibilityState = "hidden" | "visible" | "prerender" | "unloaded";\ntype XMLHttpRequestResponseType = "" | "arraybuffer" | "blob" | "document" | "json" | "text";\n\n\n/////////////////////////////\n/// WorkerGlobalScope APIs\n/////////////////////////////\n// These are only available in a Web Worker\ndeclare function importScripts(...urls: string[]): void;\n\n\n\n\n/////////////////////////////\n/// Windows Script Host APIS\n/////////////////////////////\n\n\ninterface ActiveXObject {\n    new (s: string): any;\n}\ndeclare var ActiveXObject: ActiveXObject;\n\ninterface ITextWriter {\n    Write(s: string): void;\n    WriteLine(s: string): void;\n    Close(): void;\n}\n\ninterface TextStreamBase {\n    /**\n     * The column number of the current character position in an input stream.\n     */\n    Column: number;\n\n    /**\n     * The current line number in an input stream.\n     */\n    Line: number;\n\n    /**\n     * Closes a text stream.\n     * It is not necessary to close standard streams; they close automatically when the process ends. If\n     * you close a standard stream, be aware that any other pointers to that standard stream become invalid.\n     */\n    Close(): void;\n}\n\ninterface TextStreamWriter extends TextStreamBase {\n    /**\n     * Sends a string to an output stream.\n     */\n    Write(s: string): void;\n\n    /**\n     * Sends a specified number of blank lines (newline characters) to an output stream.\n     */\n    WriteBlankLines(intLines: number): void;\n\n    /**\n     * Sends a string followed by a newline character to an output stream.\n     */\n    WriteLine(s: string): void;\n}\n\ninterface TextStreamReader extends TextStreamBase {\n    /**\n     * Returns a specified number of characters from an input stream, starting at the current pointer position.\n     * Does not return until the ENTER key is pressed.\n     * Can only be used on a stream in reading mode; causes an error in writing or appending mode.\n     */\n    Read(characters: number): string;\n\n    /**\n     * Returns all characters from an input stream.\n     * Can only be used on a stream in reading mode; causes an error in writing or appending mode.\n     */\n    ReadAll(): string;\n\n    /**\n     * Returns an entire line from an input stream.\n     * Although this method extracts the newline character, it does not add it to the returned string.\n     * Can only be used on a stream in reading mode; causes an error in writing or appending mode.\n     */\n    ReadLine(): string;\n\n    /**\n     * Skips a specified number of characters when reading from an input text stream.\n     * Can only be used on a stream in reading mode; causes an error in writing or appending mode.\n     * @param characters Positive number of characters to skip forward. (Backward skipping is not supported.)\n     */\n    Skip(characters: number): void;\n\n    /**\n     * Skips the next line when reading from an input text stream.\n     * Can only be used on a stream in reading mode, not writing or appending mode.\n     */\n    SkipLine(): void;\n\n    /**\n     * Indicates whether the stream pointer position is at the end of a line.\n     */\n    AtEndOfLine: boolean;\n\n    /**\n     * Indicates whether the stream pointer position is at the end of a stream.\n     */\n    AtEndOfStream: boolean;\n}\n\ndeclare var WScript: {\n    /**\n     * Outputs text to either a message box (under WScript.exe) or the command console window followed by\n     * a newline (under CScript.exe).\n     */\n    Echo(s: any): void;\n\n    /**\n     * Exposes the write-only error output stream for the current script.\n     * Can be accessed only while using CScript.exe.\n     */\n    StdErr: TextStreamWriter;\n\n    /**\n     * Exposes the write-only output stream for the current script.\n     * Can be accessed only while using CScript.exe.\n     */\n    StdOut: TextStreamWriter;\n    Arguments: { length: number; Item(n: number): string; };\n\n    /**\n     *  The full path of the currently running script.\n     */\n    ScriptFullName: string;\n\n    /**\n     * Forces the script to stop immediately, with an optional exit code.\n     */\n    Quit(exitCode?: number): number;\n\n    /**\n     * The Windows Script Host build version number.\n     */\n    BuildVersion: number;\n\n    /**\n     * Fully qualified path of the host executable.\n     */\n    FullName: string;\n\n    /**\n     * Gets/sets the script mode - interactive(true) or batch(false).\n     */\n    Interactive: boolean;\n\n    /**\n     * The name of the host executable (WScript.exe or CScript.exe).\n     */\n    Name: string;\n\n    /**\n     * Path of the directory containing the host executable.\n     */\n    Path: string;\n\n    /**\n     * The filename of the currently running script.\n     */\n    ScriptName: string;\n\n    /**\n     * Exposes the read-only input stream for the current script.\n     * Can be accessed only while using CScript.exe.\n     */\n    StdIn: TextStreamReader;\n\n    /**\n     * Windows Script Host version\n     */\n    Version: string;\n\n    /**\n     * Connects a COM object\'s event sources to functions named with a given prefix, in the form prefix_event.\n     */\n    ConnectObject(objEventSource: any, strPrefix: string): void;\n\n    /**\n     * Creates a COM object.\n     * @param strProgiID\n     * @param strPrefix Function names in the form prefix_event will be bound to this object\'s COM events.\n     */\n    CreateObject(strProgID: string, strPrefix?: string): any;\n\n    /**\n     * Disconnects a COM object from its event sources.\n     */\n    DisconnectObject(obj: any): void;\n\n    /**\n     * Retrieves an existing object with the specified ProgID from memory, or creates a new one from a file.\n     * @param strPathname Fully qualified path to the file containing the object persisted to disk.\n     *                       For objects in memory, pass a zero-length string.\n     * @param strProgID\n     * @param strPrefix Function names in the form prefix_event will be bound to this object\'s COM events.\n     */\n    GetObject(strPathname: string, strProgID?: string, strPrefix?: string): any;\n\n    /**\n     * Suspends script execution for a specified length of time, then continues execution.\n     * @param intTime Interval (in milliseconds) to suspend script execution.\n     */\n    Sleep(intTime: number): void;\n};\n\n/**\n * Allows enumerating over a COM collection, which may not have indexed item access.\n */\ninterface Enumerator<T> {\n    /**\n     * Returns true if the current item is the last one in the collection, or the collection is empty,\n     * or the current item is undefined.\n     */\n    atEnd(): boolean;\n\n    /**\n     * Returns the current item in the collection\n     */\n    item(): T;\n\n    /**\n     * Resets the current item in the collection to the first item. If there are no items in the collection,\n     * the current item is set to undefined.\n     */\n    moveFirst(): void;\n\n    /**\n     * Moves the current item to the next item in the collection. If the enumerator is at the end of\n     * the collection or the collection is empty, the current item is set to undefined.\n     */\n    moveNext(): void;\n}\n\ninterface EnumeratorConstructor {\n    new <T>(collection: any): Enumerator<T>;\n    new (collection: any): Enumerator<any>;\n}\n\ndeclare var Enumerator: EnumeratorConstructor;\n\n/**\n * Enables reading from a COM safe array, which might have an alternate lower bound, or multiple dimensions.\n */\ninterface VBArray<T> {\n    /**\n     * Returns the number of dimensions (1-based).\n     */\n    dimensions(): number;\n\n    /**\n     * Takes an index for each dimension in the array, and returns the item at the corresponding location.\n     */\n    getItem(dimension1Index: number, ...dimensionNIndexes: number[]): T;\n\n    /**\n     * Returns the smallest available index for a given dimension.\n     * @param dimension 1-based dimension (defaults to 1)\n     */\n    lbound(dimension?: number): number;\n\n    /**\n     * Returns the largest available index for a given dimension.\n     * @param dimension 1-based dimension (defaults to 1)\n     */\n    ubound(dimension?: number): number;\n\n    /**\n     * Returns a Javascript array with all the elements in the VBArray. If there are multiple dimensions,\n     * each successive dimension is appended to the end of the array.\n     * Example: [[1,2,3],[4,5,6]] becomes [1,2,3,4,5,6]\n     */\n    toArray(): T[];\n}\n\ninterface VBArrayConstructor {\n    new <T>(safeArray: any): VBArray<T>;\n    new (safeArray: any): VBArray<any>;\n}\n\ndeclare var VBArray: VBArrayConstructor;\n\n/**\n * Automation date (VT_DATE)\n */\ninterface VarDate { }\n\ninterface DateConstructor {\n    new (vd: VarDate): Date;\n}\n\ninterface Date {\n    getVarDate: () => VarDate;\n}\n'
+}}),define("vs/language/typescript/lib/lib-es6-ts",[],function(){return{contents:'/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved. \nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0  \n \nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, \nMERCHANTABLITY OR NON-INFRINGEMENT. \n \nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\n/////////////////////////////\n/// ECMAScript APIs\n/////////////////////////////\n\ndeclare const NaN: number;\ndeclare const Infinity: number;\n\n/**\n  * Evaluates JavaScript code and executes it.\n  * @param x A String value that contains valid JavaScript code.\n  */\ndeclare function eval(x: string): any;\n\n/**\n  * Converts A string to an integer.\n  * @param s A string to convert into a number.\n  * @param radix A value between 2 and 36 that specifies the base of the number in numString.\n  * If this argument is not supplied, strings with a prefix of \'0x\' are considered hexadecimal.\n  * All other strings are considered decimal.\n  */\ndeclare function parseInt(s: string, radix?: number): number;\n\n/**\n  * Converts a string to a floating-point number.\n  * @param string A string that contains a floating-point number.\n  */\ndeclare function parseFloat(string: string): number;\n\n/**\n  * Returns a Boolean value that indicates whether a value is the reserved value NaN (not a number).\n  * @param number A numeric value.\n  */\ndeclare function isNaN(number: number): boolean;\n\n/**\n  * Determines whether a supplied number is finite.\n  * @param number Any numeric value.\n  */\ndeclare function isFinite(number: number): boolean;\n\n/**\n  * Gets the unencoded version of an encoded Uniform Resource Identifier (URI).\n  * @param encodedURI A value representing an encoded URI.\n  */\ndeclare function decodeURI(encodedURI: string): string;\n\n/**\n  * Gets the unencoded version of an encoded component of a Uniform Resource Identifier (URI).\n  * @param encodedURIComponent A value representing an encoded URI component.\n  */\ndeclare function decodeURIComponent(encodedURIComponent: string): string;\n\n/**\n  * Encodes a text string as a valid Uniform Resource Identifier (URI)\n  * @param uri A value representing an encoded URI.\n  */\ndeclare function encodeURI(uri: string): string;\n\n/**\n  * Encodes a text string as a valid component of a Uniform Resource Identifier (URI).\n  * @param uriComponent A value representing an encoded URI component.\n  */\ndeclare function encodeURIComponent(uriComponent: string): string;\n\ninterface PropertyDescriptor {\n    configurable?: boolean;\n    enumerable?: boolean;\n    value?: any;\n    writable?: boolean;\n    get?(): any;\n    set?(v: any): void;\n}\n\ninterface PropertyDescriptorMap {\n    [s: string]: PropertyDescriptor;\n}\n\ninterface Object {\n    /** The initial value of Object.prototype.constructor is the standard built-in Object constructor. */\n    constructor: Function;\n\n    /** Returns a string representation of an object. */\n    toString(): string;\n\n    /** Returns a date converted to a string using the current locale. */\n    toLocaleString(): string;\n\n    /** Returns the primitive value of the specified object. */\n    valueOf(): Object;\n\n    /**\n      * Determines whether an object has a property with the specified name.\n      * @param v A property name.\n      */\n    hasOwnProperty(v: string): boolean;\n\n    /**\n      * Determines whether an object exists in another object\'s prototype chain.\n      * @param v Another object whose prototype chain is to be checked.\n      */\n    isPrototypeOf(v: Object): boolean;\n\n    /**\n      * Determines whether a specified property is enumerable.\n      * @param v A property name.\n      */\n    propertyIsEnumerable(v: string): boolean;\n}\n\ninterface ObjectConstructor {\n    new(value?: any): Object;\n    (): any;\n    (value: any): any;\n\n    /** A reference to the prototype for a class of objects. */\n    readonly prototype: Object;\n\n    /**\n      * Returns the prototype of an object.\n      * @param o The object that references the prototype.\n      */\n    getPrototypeOf(o: any): any;\n\n    /**\n      * Gets the own property descriptor of the specified object.\n      * An own property descriptor is one that is defined directly on the object and is not inherited from the object\'s prototype.\n      * @param o Object that contains the property.\n      * @param p Name of the property.\n    */\n    getOwnPropertyDescriptor(o: any, p: string): PropertyDescriptor;\n\n    /**\n      * Returns the names of the own properties of an object. The own properties of an object are those that are defined directly\n      * on that object, and are not inherited from the object\'s prototype. The properties of an object include both fields (objects) and functions.\n      * @param o Object that contains the own properties.\n      */\n    getOwnPropertyNames(o: any): string[];\n\n    /**\n      * Creates an object that has the specified prototype or that has null prototype.\n      * @param o Object to use as a prototype. May be null.\n      */\n    create(o: object | null): any;\n\n    /**\n      * Creates an object that has the specified prototype, and that optionally contains specified properties.\n      * @param o Object to use as a prototype. May be null\n      * @param properties JavaScript object that contains one or more property descriptors.\n      */\n    create(o: object | null, properties: PropertyDescriptorMap & ThisType<any>): any;\n\n    /**\n      * Adds a property to an object, or modifies attributes of an existing property.\n      * @param o Object on which to add or modify the property. This can be a native JavaScript object (that is, a user-defined object or a built in object) or a DOM object.\n      * @param p The property name.\n      * @param attributes Descriptor for the property. It can be for a data property or an accessor property.\n      */\n    defineProperty(o: any, p: string, attributes: PropertyDescriptor & ThisType<any>): any;\n\n    /**\n      * Adds one or more properties to an object, and/or modifies attributes of existing properties.\n      * @param o Object on which to add or modify the properties. This can be a native JavaScript object or a DOM object.\n      * @param properties JavaScript object that contains one or more descriptor objects. Each descriptor object describes a data property or an accessor property.\n      */\n    defineProperties(o: any, properties: PropertyDescriptorMap & ThisType<any>): any;\n\n    /**\n      * Prevents the modification of attributes of existing properties, and prevents the addition of new properties.\n      * @param o Object on which to lock the attributes.\n      */\n    seal<T>(o: T): T;\n\n    /**\n      * Prevents the modification of existing property attributes and values, and prevents the addition of new properties.\n      * @param o Object on which to lock the attributes.\n      */\n    freeze<T>(a: T[]): ReadonlyArray<T>;\n\n    /**\n      * Prevents the modification of existing property attributes and values, and prevents the addition of new properties.\n      * @param o Object on which to lock the attributes.\n      */\n    freeze<T extends Function>(f: T): T;\n\n    /**\n      * Prevents the modification of existing property attributes and values, and prevents the addition of new properties.\n      * @param o Object on which to lock the attributes.\n      */\n    freeze<T>(o: T): Readonly<T>;\n\n    /**\n      * Prevents the addition of new properties to an object.\n      * @param o Object to make non-extensible.\n      */\n    preventExtensions<T>(o: T): T;\n\n    /**\n      * Returns true if existing property attributes cannot be modified in an object and new properties cannot be added to the object.\n      * @param o Object to test.\n      */\n    isSealed(o: any): boolean;\n\n    /**\n      * Returns true if existing property attributes and values cannot be modified in an object, and new properties cannot be added to the object.\n      * @param o Object to test.\n      */\n    isFrozen(o: any): boolean;\n\n    /**\n      * Returns a value that indicates whether new properties can be added to an object.\n      * @param o Object to test.\n      */\n    isExtensible(o: any): boolean;\n\n    /**\n      * Returns the names of the enumerable properties and methods of an object.\n      * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.\n      */\n    keys(o: any): string[];\n}\n\n/**\n  * Provides functionality common to all JavaScript objects.\n  */\ndeclare const Object: ObjectConstructor;\n\n/**\n  * Creates a new function.\n  */\ninterface Function {\n    /**\n      * Calls the function, substituting the specified object for the this value of the function, and the specified array for the arguments of the function.\n      * @param thisArg The object to be used as the this object.\n      * @param argArray A set of arguments to be passed to the function.\n      */\n    apply(this: Function, thisArg: any, argArray?: any): any;\n\n    /**\n      * Calls a method of an object, substituting another object for the current object.\n      * @param thisArg The object to be used as the current object.\n      * @param argArray A list of arguments to be passed to the method.\n      */\n    call(this: Function, thisArg: any, ...argArray: any[]): any;\n\n    /**\n      * For a given function, creates a bound function that has the same body as the original function.\n      * The this object of the bound function is associated with the specified object, and has the specified initial parameters.\n      * @param thisArg An object to which the this keyword can refer inside the new function.\n      * @param argArray A list of arguments to be passed to the new function.\n      */\n    bind(this: Function, thisArg: any, ...argArray: any[]): any;\n\n    /** Returns a string representation of a function. */\n    toString(): string;\n\n    prototype: any;\n    readonly length: number;\n\n    // Non-standard extensions\n    arguments: any;\n    caller: Function;\n}\n\ninterface FunctionConstructor {\n    /**\n      * Creates a new function.\n      * @param args A list of arguments the function accepts.\n      */\n    new(...args: string[]): Function;\n    (...args: string[]): Function;\n    readonly prototype: Function;\n}\n\ndeclare const Function: FunctionConstructor;\n\ninterface IArguments {\n    [index: number]: any;\n    length: number;\n    callee: Function;\n}\n\ninterface String {\n    /** Returns a string representation of a string. */\n    toString(): string;\n\n    /**\n      * Returns the character at the specified index.\n      * @param pos The zero-based index of the desired character.\n      */\n    charAt(pos: number): string;\n\n    /**\n      * Returns the Unicode value of the character at the specified location.\n      * @param index The zero-based index of the desired character. If there is no character at the specified index, NaN is returned.\n      */\n    charCodeAt(index: number): number;\n\n    /**\n      * Returns a string that contains the concatenation of two or more strings.\n      * @param strings The strings to append to the end of the string.\n      */\n    concat(...strings: string[]): string;\n\n    /**\n      * Returns the position of the first occurrence of a substring.\n      * @param searchString The substring to search for in the string\n      * @param position The index at which to begin searching the String object. If omitted, search starts at the beginning of the string.\n      */\n    indexOf(searchString: string, position?: number): number;\n\n    /**\n      * Returns the last occurrence of a substring in the string.\n      * @param searchString The substring to search for.\n      * @param position The index at which to begin searching. If omitted, the search begins at the end of the string.\n      */\n    lastIndexOf(searchString: string, position?: number): number;\n\n    /**\n      * Determines whether two strings are equivalent in the current locale.\n      * @param that String to compare to target string\n      */\n    localeCompare(that: string): number;\n\n    /**\n      * Matches a string with a regular expression, and returns an array containing the results of that search.\n      * @param regexp A variable name or string literal containing the regular expression pattern and flags.\n      */\n    match(regexp: string | RegExp): RegExpMatchArray | null;\n\n    /**\n      * Replaces text in a string, using a regular expression or search string.\n      * @param searchValue A string to search for.\n      * @param replaceValue A string containing the text to replace for every successful match of searchValue in this string.\n      */\n    replace(searchValue: string | RegExp, replaceValue: string): string;\n\n    /**\n      * Replaces text in a string, using a regular expression or search string.\n      * @param searchValue A string to search for.\n      * @param replacer A function that returns the replacement text.\n      */\n    replace(searchValue: string | RegExp, replacer: (substring: string, ...args: any[]) => string): string;\n\n    /**\n      * Finds the first substring match in a regular expression search.\n      * @param regexp The regular expression pattern and applicable flags.\n      */\n    search(regexp: string | RegExp): number;\n\n    /**\n      * Returns a section of a string.\n      * @param start The index to the beginning of the specified portion of stringObj.\n      * @param end The index to the end of the specified portion of stringObj. The substring includes the characters up to, but not including, the character indicated by end.\n      * If this value is not specified, the substring continues to the end of stringObj.\n      */\n    slice(start?: number, end?: number): string;\n\n    /**\n      * Split a string into substrings using the specified separator and return them as an array.\n      * @param separator A string that identifies character or characters to use in separating the string. If omitted, a single-element array containing the entire string is returned.\n      * @param limit A value used to limit the number of elements returned in the array.\n      */\n    split(separator: string | RegExp, limit?: number): string[];\n\n    /**\n      * Returns the substring at the specified location within a String object.\n      * @param start The zero-based index number indicating the beginning of the substring.\n      * @param end Zero-based index number indicating the end of the substring. The substring includes the characters up to, but not including, the character indicated by end.\n      * If end is omitted, the characters from start through the end of the original string are returned.\n      */\n    substring(start: number, end?: number): string;\n\n    /** Converts all the alphabetic characters in a string to lowercase. */\n    toLowerCase(): string;\n\n    /** Converts all alphabetic characters to lowercase, taking into account the host environment\'s current locale. */\n    toLocaleLowerCase(): string;\n\n    /** Converts all the alphabetic characters in a string to uppercase. */\n    toUpperCase(): string;\n\n    /** Returns a string where all alphabetic characters have been converted to uppercase, taking into account the host environment\'s current locale. */\n    toLocaleUpperCase(): string;\n\n    /** Removes the leading and trailing white space and line terminator characters from a string. */\n    trim(): string;\n\n    /** Returns the length of a String object. */\n    readonly length: number;\n\n    // IE extensions\n    /**\n      * Gets a substring beginning at the specified location and having the specified length.\n      * @param from The starting position of the desired substring. The index of the first character in the string is zero.\n      * @param length The number of characters to include in the returned substring.\n      */\n    substr(from: number, length?: number): string;\n\n    /** Returns the primitive value of the specified object. */\n    valueOf(): string;\n\n    readonly [index: number]: string;\n}\n\ninterface StringConstructor {\n    new(value?: any): String;\n    (value?: any): string;\n    readonly prototype: String;\n    fromCharCode(...codes: number[]): string;\n}\n\n/**\n  * Allows manipulation and formatting of text strings and determination and location of substrings within strings.\n  */\ndeclare const String: StringConstructor;\n\ninterface Boolean {\n    /** Returns the primitive value of the specified object. */\n    valueOf(): boolean;\n}\n\ninterface BooleanConstructor {\n    new(value?: any): Boolean;\n    (value?: any): boolean;\n    readonly prototype: Boolean;\n}\n\ndeclare const Boolean: BooleanConstructor;\n\ninterface Number {\n    /**\n      * Returns a string representation of an object.\n      * @param radix Specifies a radix for converting numeric values to strings. This value is only used for numbers.\n      */\n    toString(radix?: number): string;\n\n    /**\n      * Returns a string representing a number in fixed-point notation.\n      * @param fractionDigits Number of digits after the decimal point. Must be in the range 0 - 20, inclusive.\n      */\n    toFixed(fractionDigits?: number): string;\n\n    /**\n      * Returns a string containing a number represented in exponential notation.\n      * @param fractionDigits Number of digits after the decimal point. Must be in the range 0 - 20, inclusive.\n      */\n    toExponential(fractionDigits?: number): string;\n\n    /**\n      * Returns a string containing a number represented either in exponential or fixed-point notation with a specified number of digits.\n      * @param precision Number of significant digits. Must be in the range 1 - 21, inclusive.\n      */\n    toPrecision(precision?: number): string;\n\n    /** Returns the primitive value of the specified object. */\n    valueOf(): number;\n}\n\ninterface NumberConstructor {\n    new(value?: any): Number;\n    (value?: any): number;\n    readonly prototype: Number;\n\n    /** The largest number that can be represented in JavaScript. Equal to approximately 1.79E+308. */\n    readonly MAX_VALUE: number;\n\n    /** The closest number to zero that can be represented in JavaScript. Equal to approximately 5.00E-324. */\n    readonly MIN_VALUE: number;\n\n    /**\n      * A value that is not a number.\n      * In equality comparisons, NaN does not equal any value, including itself. To test whether a value is equivalent to NaN, use the isNaN function.\n      */\n    readonly NaN: number;\n\n    /**\n      * A value that is less than the largest negative number that can be represented in JavaScript.\n      * JavaScript displays NEGATIVE_INFINITY values as -infinity.\n      */\n    readonly NEGATIVE_INFINITY: number;\n\n    /**\n      * A value greater than the largest number that can be represented in JavaScript.\n      * JavaScript displays POSITIVE_INFINITY values as infinity.\n      */\n    readonly POSITIVE_INFINITY: number;\n}\n\n/** An object that represents a number of any kind. All JavaScript numbers are 64-bit floating-point numbers. */\ndeclare const Number: NumberConstructor;\n\ninterface TemplateStringsArray extends ReadonlyArray<string> {\n    readonly raw: ReadonlyArray<string>;\n}\n\ninterface Math {\n    /** The mathematical constant e. This is Euler\'s number, the base of natural logarithms. */\n    readonly E: number;\n    /** The natural logarithm of 10. */\n    readonly LN10: number;\n    /** The natural logarithm of 2. */\n    readonly LN2: number;\n    /** The base-2 logarithm of e. */\n    readonly LOG2E: number;\n    /** The base-10 logarithm of e. */\n    readonly LOG10E: number;\n    /** Pi. This is the ratio of the circumference of a circle to its diameter. */\n    readonly PI: number;\n    /** The square root of 0.5, or, equivalently, one divided by the square root of 2. */\n    readonly SQRT1_2: number;\n    /** The square root of 2. */\n    readonly SQRT2: number;\n    /**\n      * Returns the absolute value of a number (the value without regard to whether it is positive or negative).\n      * For example, the absolute value of -5 is the same as the absolute value of 5.\n      * @param x A numeric expression for which the absolute value is needed.\n      */\n    abs(x: number): number;\n    /**\n      * Returns the arc cosine (or inverse cosine) of a number.\n      * @param x A numeric expression.\n      */\n    acos(x: number): number;\n    /**\n      * Returns the arcsine of a number.\n      * @param x A numeric expression.\n      */\n    asin(x: number): number;\n    /**\n      * Returns the arctangent of a number.\n      * @param x A numeric expression for which the arctangent is needed.\n      */\n    atan(x: number): number;\n    /**\n      * Returns the angle (in radians) from the X axis to a point.\n      * @param y A numeric expression representing the cartesian y-coordinate.\n      * @param x A numeric expression representing the cartesian x-coordinate.\n      */\n    atan2(y: number, x: number): number;\n    /**\n      * Returns the smallest number greater than or equal to its numeric argument.\n      * @param x A numeric expression.\n      */\n    ceil(x: number): number;\n    /**\n      * Returns the cosine of a number.\n      * @param x A numeric expression that contains an angle measured in radians.\n      */\n    cos(x: number): number;\n    /**\n      * Returns e (the base of natural logarithms) raised to a power.\n      * @param x A numeric expression representing the power of e.\n      */\n    exp(x: number): number;\n    /**\n      * Returns the greatest number less than or equal to its numeric argument.\n      * @param x A numeric expression.\n      */\n    floor(x: number): number;\n    /**\n      * Returns the natural logarithm (base e) of a number.\n      * @param x A numeric expression.\n      */\n    log(x: number): number;\n    /**\n      * Returns the larger of a set of supplied numeric expressions.\n      * @param values Numeric expressions to be evaluated.\n      */\n    max(...values: number[]): number;\n    /**\n      * Returns the smaller of a set of supplied numeric expressions.\n      * @param values Numeric expressions to be evaluated.\n      */\n    min(...values: number[]): number;\n    /**\n      * Returns the value of a base expression taken to a specified power.\n      * @param x The base value of the expression.\n      * @param y The exponent value of the expression.\n      */\n    pow(x: number, y: number): number;\n    /** Returns a pseudorandom number between 0 and 1. */\n    random(): number;\n    /**\n      * Returns a supplied numeric expression rounded to the nearest number.\n      * @param x The value to be rounded to the nearest number.\n      */\n    round(x: number): number;\n    /**\n      * Returns the sine of a number.\n      * @param x A numeric expression that contains an angle measured in radians.\n      */\n    sin(x: number): number;\n    /**\n      * Returns the square root of a number.\n      * @param x A numeric expression.\n      */\n    sqrt(x: number): number;\n    /**\n      * Returns the tangent of a number.\n      * @param x A numeric expression that contains an angle measured in radians.\n      */\n    tan(x: number): number;\n}\n/** An intrinsic object that provides basic mathematics functionality and constants. */\ndeclare const Math: Math;\n\n/** Enables basic storage and retrieval of dates and times. */\ninterface Date {\n    /** Returns a string representation of a date. The format of the string depends on the locale. */\n    toString(): string;\n    /** Returns a date as a string value. */\n    toDateString(): string;\n    /** Returns a time as a string value. */\n    toTimeString(): string;\n    /** Returns a value as a string value appropriate to the host environment\'s current locale. */\n    toLocaleString(): string;\n    /** Returns a date as a string value appropriate to the host environment\'s current locale. */\n    toLocaleDateString(): string;\n    /** Returns a time as a string value appropriate to the host environment\'s current locale. */\n    toLocaleTimeString(): string;\n    /** Returns the stored time value in milliseconds since midnight, January 1, 1970 UTC. */\n    valueOf(): number;\n    /** Gets the time value in milliseconds. */\n    getTime(): number;\n    /** Gets the year, using local time. */\n    getFullYear(): number;\n    /** Gets the year using Universal Coordinated Time (UTC). */\n    getUTCFullYear(): number;\n    /** Gets the month, using local time. */\n    getMonth(): number;\n    /** Gets the month of a Date object using Universal Coordinated Time (UTC). */\n    getUTCMonth(): number;\n    /** Gets the day-of-the-month, using local time. */\n    getDate(): number;\n    /** Gets the day-of-the-month, using Universal Coordinated Time (UTC). */\n    getUTCDate(): number;\n    /** Gets the day of the week, using local time. */\n    getDay(): number;\n    /** Gets the day of the week using Universal Coordinated Time (UTC). */\n    getUTCDay(): number;\n    /** Gets the hours in a date, using local time. */\n    getHours(): number;\n    /** Gets the hours value in a Date object using Universal Coordinated Time (UTC). */\n    getUTCHours(): number;\n    /** Gets the minutes of a Date object, using local time. */\n    getMinutes(): number;\n    /** Gets the minutes of a Date object using Universal Coordinated Time (UTC). */\n    getUTCMinutes(): number;\n    /** Gets the seconds of a Date object, using local time. */\n    getSeconds(): number;\n    /** Gets the seconds of a Date object using Universal Coordinated Time (UTC). */\n    getUTCSeconds(): number;\n    /** Gets the milliseconds of a Date, using local time. */\n    getMilliseconds(): number;\n    /** Gets the milliseconds of a Date object using Universal Coordinated Time (UTC). */\n    getUTCMilliseconds(): number;\n    /** Gets the difference in minutes between the time on the local computer and Universal Coordinated Time (UTC). */\n    getTimezoneOffset(): number;\n    /**\n      * Sets the date and time value in the Date object.\n      * @param time A numeric value representing the number of elapsed milliseconds since midnight, January 1, 1970 GMT.\n      */\n    setTime(time: number): number;\n    /**\n      * Sets the milliseconds value in the Date object using local time.\n      * @param ms A numeric value equal to the millisecond value.\n      */\n    setMilliseconds(ms: number): number;\n    /**\n      * Sets the milliseconds value in the Date object using Universal Coordinated Time (UTC).\n      * @param ms A numeric value equal to the millisecond value.\n      */\n    setUTCMilliseconds(ms: number): number;\n\n    /**\n      * Sets the seconds value in the Date object using local time.\n      * @param sec A numeric value equal to the seconds value.\n      * @param ms A numeric value equal to the milliseconds value.\n      */\n    setSeconds(sec: number, ms?: number): number;\n    /**\n      * Sets the seconds value in the Date object using Universal Coordinated Time (UTC).\n      * @param sec A numeric value equal to the seconds value.\n      * @param ms A numeric value equal to the milliseconds value.\n      */\n    setUTCSeconds(sec: number, ms?: number): number;\n    /**\n      * Sets the minutes value in the Date object using local time.\n      * @param min A numeric value equal to the minutes value.\n      * @param sec A numeric value equal to the seconds value.\n      * @param ms A numeric value equal to the milliseconds value.\n      */\n    setMinutes(min: number, sec?: number, ms?: number): number;\n    /**\n      * Sets the minutes value in the Date object using Universal Coordinated Time (UTC).\n      * @param min A numeric value equal to the minutes value.\n      * @param sec A numeric value equal to the seconds value.\n      * @param ms A numeric value equal to the milliseconds value.\n      */\n    setUTCMinutes(min: number, sec?: number, ms?: number): number;\n    /**\n      * Sets the hour value in the Date object using local time.\n      * @param hours A numeric value equal to the hours value.\n      * @param min A numeric value equal to the minutes value.\n      * @param sec A numeric value equal to the seconds value.\n      * @param ms A numeric value equal to the milliseconds value.\n      */\n    setHours(hours: number, min?: number, sec?: number, ms?: number): number;\n    /**\n      * Sets the hours value in the Date object using Universal Coordinated Time (UTC).\n      * @param hours A numeric value equal to the hours value.\n      * @param min A numeric value equal to the minutes value.\n      * @param sec A numeric value equal to the seconds value.\n      * @param ms A numeric value equal to the milliseconds value.\n      */\n    setUTCHours(hours: number, min?: number, sec?: number, ms?: number): number;\n    /**\n      * Sets the numeric day-of-the-month value of the Date object using local time.\n      * @param date A numeric value equal to the day of the month.\n      */\n    setDate(date: number): number;\n    /**\n      * Sets the numeric day of the month in the Date object using Universal Coordinated Time (UTC).\n      * @param date A numeric value equal to the day of the month.\n      */\n    setUTCDate(date: number): number;\n    /**\n      * Sets the month value in the Date object using local time.\n      * @param month A numeric value equal to the month. The value for January is 0, and other month values follow consecutively.\n      * @param date A numeric value representing the day of the month. If this value is not supplied, the value from a call to the getDate method is used.\n      */\n    setMonth(month: number, date?: number): number;\n    /**\n      * Sets the month value in the Date object using Universal Coordinated Time (UTC).\n      * @param month A numeric value equal to the month. The value for January is 0, and other month values follow consecutively.\n      * @param date A numeric value representing the day of the month. If it is not supplied, the value from a call to the getUTCDate method is used.\n      */\n    setUTCMonth(month: number, date?: number): number;\n    /**\n      * Sets the year of the Date object using local time.\n      * @param year A numeric value for the year.\n      * @param month A zero-based numeric value for the month (0 for January, 11 for December). Must be specified if numDate is specified.\n      * @param date A numeric value equal for the day of the month.\n      */\n    setFullYear(year: number, month?: number, date?: number): number;\n    /**\n      * Sets the year value in the Date object using Universal Coordinated Time (UTC).\n      * @param year A numeric value equal to the year.\n      * @param month A numeric value equal to the month. The value for January is 0, and other month values follow consecutively. Must be supplied if numDate is supplied.\n      * @param date A numeric value equal to the day of the month.\n      */\n    setUTCFullYear(year: number, month?: number, date?: number): number;\n    /** Returns a date converted to a string using Universal Coordinated Time (UTC). */\n    toUTCString(): string;\n    /** Returns a date as a string value in ISO format. */\n    toISOString(): string;\n    /** Used by the JSON.stringify method to enable the transformation of an object\'s data for JavaScript Object Notation (JSON) serialization. */\n    toJSON(key?: any): string;\n}\n\ninterface DateConstructor {\n    new(): Date;\n    new(value: number): Date;\n    new(value: string): Date;\n    new(year: number, month: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): Date;\n    (): string;\n    readonly prototype: Date;\n    /**\n      * Parses a string containing a date, and returns the number of milliseconds between that date and midnight, January 1, 1970.\n      * @param s A date string\n      */\n    parse(s: string): number;\n    /**\n      * Returns the number of milliseconds between midnight, January 1, 1970 Universal Coordinated Time (UTC) (or GMT) and the specified date.\n      * @param year The full year designation is required for cross-century date accuracy. If year is between 0 and 99 is used, then year is assumed to be 1900 + year.\n      * @param month The month as an number between 0 and 11 (January to December).\n      * @param date The date as an number between 1 and 31.\n      * @param hours Must be supplied if minutes is supplied. An number from 0 to 23 (midnight to 11pm) that specifies the hour.\n      * @param minutes Must be supplied if seconds is supplied. An number from 0 to 59 that specifies the minutes.\n      * @param seconds Must be supplied if milliseconds is supplied. An number from 0 to 59 that specifies the seconds.\n      * @param ms An number from 0 to 999 that specifies the milliseconds.\n      */\n    UTC(year: number, month: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): number;\n    now(): number;\n}\n\ndeclare const Date: DateConstructor;\n\ninterface RegExpMatchArray extends Array<string> {\n    index?: number;\n    input?: string;\n}\n\ninterface RegExpExecArray extends Array<string> {\n    index: number;\n    input: string;\n}\n\ninterface RegExp {\n    /**\n      * Executes a search on a string using a regular expression pattern, and returns an array containing the results of that search.\n      * @param string The String object or string literal on which to perform the search.\n      */\n    exec(string: string): RegExpExecArray | null;\n\n    /**\n      * Returns a Boolean value that indicates whether or not a pattern exists in a searched string.\n      * @param string String on which to perform the search.\n      */\n    test(string: string): boolean;\n\n    /** Returns a copy of the text of the regular expression pattern. Read-only. The regExp argument is a Regular expression object. It can be a variable name or a literal. */\n    readonly source: string;\n\n    /** Returns a Boolean value indicating the state of the global flag (g) used with a regular expression. Default is false. Read-only. */\n    readonly global: boolean;\n\n    /** Returns a Boolean value indicating the state of the ignoreCase flag (i) used with a regular expression. Default is false. Read-only. */\n    readonly ignoreCase: boolean;\n\n    /** Returns a Boolean value indicating the state of the multiline flag (m) used with a regular expression. Default is false. Read-only. */\n    readonly multiline: boolean;\n\n    lastIndex: number;\n\n    // Non-standard extensions\n    compile(): this;\n}\n\ninterface RegExpConstructor {\n    new(pattern: RegExp | string): RegExp;\n    new(pattern: string, flags?: string): RegExp;\n    (pattern: RegExp | string): RegExp;\n    (pattern: string, flags?: string): RegExp;\n    readonly prototype: RegExp;\n\n    // Non-standard extensions\n    $1: string;\n    $2: string;\n    $3: string;\n    $4: string;\n    $5: string;\n    $6: string;\n    $7: string;\n    $8: string;\n    $9: string;\n    lastMatch: string;\n}\n\ndeclare const RegExp: RegExpConstructor;\n\ninterface Error {\n    name: string;\n    message: string;\n    stack?: string;\n}\n\ninterface ErrorConstructor {\n    new(message?: string): Error;\n    (message?: string): Error;\n    readonly prototype: Error;\n}\n\ndeclare const Error: ErrorConstructor;\n\ninterface EvalError extends Error {\n}\n\ninterface EvalErrorConstructor {\n    new(message?: string): EvalError;\n    (message?: string): EvalError;\n    readonly prototype: EvalError;\n}\n\ndeclare const EvalError: EvalErrorConstructor;\n\ninterface RangeError extends Error {\n}\n\ninterface RangeErrorConstructor {\n    new(message?: string): RangeError;\n    (message?: string): RangeError;\n    readonly prototype: RangeError;\n}\n\ndeclare const RangeError: RangeErrorConstructor;\n\ninterface ReferenceError extends Error {\n}\n\ninterface ReferenceErrorConstructor {\n    new(message?: string): ReferenceError;\n    (message?: string): ReferenceError;\n    readonly prototype: ReferenceError;\n}\n\ndeclare const ReferenceError: ReferenceErrorConstructor;\n\ninterface SyntaxError extends Error {\n}\n\ninterface SyntaxErrorConstructor {\n    new(message?: string): SyntaxError;\n    (message?: string): SyntaxError;\n    readonly prototype: SyntaxError;\n}\n\ndeclare const SyntaxError: SyntaxErrorConstructor;\n\ninterface TypeError extends Error {\n}\n\ninterface TypeErrorConstructor {\n    new(message?: string): TypeError;\n    (message?: string): TypeError;\n    readonly prototype: TypeError;\n}\n\ndeclare const TypeError: TypeErrorConstructor;\n\ninterface URIError extends Error {\n}\n\ninterface URIErrorConstructor {\n    new(message?: string): URIError;\n    (message?: string): URIError;\n    readonly prototype: URIError;\n}\n\ndeclare const URIError: URIErrorConstructor;\n\ninterface JSON {\n    /**\n      * Converts a JavaScript Object Notation (JSON) string into an object.\n      * @param text A valid JSON string.\n      * @param reviver A function that transforms the results. This function is called for each member of the object.\n      * If a member contains nested objects, the nested objects are transformed before the parent object is.\n      */\n    parse(text: string, reviver?: (key: any, value: any) => any): any;\n    /**\n      * Converts a JavaScript value to a JavaScript Object Notation (JSON) string.\n      * @param value A JavaScript value, usually an object or array, to be converted.\n      * @param replacer A function that transforms the results.\n      * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.\n      */\n    stringify(value: any, replacer?: (key: string, value: any) => any, space?: string | number): string;\n    /**\n      * Converts a JavaScript value to a JavaScript Object Notation (JSON) string.\n      * @param value A JavaScript value, usually an object or array, to be converted.\n      * @param replacer An array of strings and numbers that acts as a approved list for selecting the object properties that will be stringified.\n      * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.\n      */\n    stringify(value: any, replacer?: (number | string)[] | null, space?: string | number): string;\n}\n\n/**\n  * An intrinsic object that provides functions to convert JavaScript values to and from the JavaScript Object Notation (JSON) format.\n  */\ndeclare const JSON: JSON;\n\n\n/////////////////////////////\n/// ECMAScript Array API (specially handled by compiler)\n/////////////////////////////\n\ninterface ReadonlyArray<T> {\n    /**\n      * Gets the length of the array. This is a number one higher than the highest element defined in an array.\n      */\n    readonly length: number;\n    /**\n      * Returns a string representation of an array.\n      */\n    toString(): string;\n    /**\n      * Returns a string representation of an array. The elements are converted to string using thier toLocalString methods.\n      */\n    toLocaleString(): string;\n    /**\n      * Combines two or more arrays.\n      * @param items Additional items to add to the end of array1.\n      */\n    concat(...items: T[][]): T[];\n    /**\n      * Combines two or more arrays.\n      * @param items Additional items to add to the end of array1.\n      */\n    concat(...items: (T | T[])[]): T[];\n    /**\n      * Adds all the elements of an array separated by the specified separator string.\n      * @param separator A string used to separate one element of an array from the next in the resulting String. If omitted, the array elements are separated with a comma.\n      */\n    join(separator?: string): string;\n    /**\n      * Returns a section of an array.\n      * @param start The beginning of the specified portion of the array.\n      * @param end The end of the specified portion of the array.\n      */\n    slice(start?: number, end?: number): T[];\n    /**\n      * Returns the index of the first occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0.\n      */\n    indexOf(searchElement: T, fromIndex?: number): number;\n    /**\n      * Returns the index of the last occurrence of a specified value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at the last index in the array.\n      */\n    lastIndexOf(searchElement: T, fromIndex?: number): number;\n    /**\n      * Determines whether all the members of an array satisfy the specified test.\n      * @param callbackfn A function that accepts up to three arguments. The every method calls the callbackfn function for each element in array1 until the callbackfn returns false, or until the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n      */\n    every(callbackfn: (value: T, index: number, array: ReadonlyArray<T>) => boolean, thisArg?: any): boolean;\n    /**\n      * Determines whether the specified callback function returns true for any element of an array.\n      * @param callbackfn A function that accepts up to three arguments. The some method calls the callbackfn function for each element in array1 until the callbackfn returns true, or until the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n      */\n    some(callbackfn: (value: T, index: number, array: ReadonlyArray<T>) => boolean, thisArg?: any): boolean;\n    /**\n      * Performs the specified action for each element in an array.\n      * @param callbackfn  A function that accepts up to three arguments. forEach calls the callbackfn function one time for each element in the array.\n      * @param thisArg  An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n      */\n    forEach(callbackfn: (value: T, index: number, array: ReadonlyArray<T>) => void, thisArg?: any): void;\n    /**\n      * Calls a defined callback function on each element of an array, and returns an array that contains the results.\n      * @param callbackfn A function that accepts up to three arguments. The map method calls the callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n      */\n    map<U>(callbackfn: (value: T, index: number, array: ReadonlyArray<T>) => U, thisArg?: any): U[];\n    /**\n     * Returns the elements of an array that meet the condition specified in a callback function.\n     * @param callbackfn A function that accepts up to three arguments. The filter method calls the callbackfn function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n     */\n    filter<S extends T>(callbackfn: (value: T, index: number, array: ReadonlyArray<T>) => value is S, thisArg?: any): S[];\n    /**\n      * Returns the elements of an array that meet the condition specified in a callback function.\n      * @param callbackfn A function that accepts up to three arguments. The filter method calls the callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n      */\n    filter(callbackfn: (value: T, index: number, array: ReadonlyArray<T>) => any, thisArg?: any): T[];\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.\n      */\n    reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: ReadonlyArray<T>) => T, initialValue?: T): T;\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.\n      */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: ReadonlyArray<T>) => U, initialValue: U): U;\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.\n      */\n    reduceRight(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: ReadonlyArray<T>) => T, initialValue?: T): T;\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.\n      */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: ReadonlyArray<T>) => U, initialValue: U): U;\n\n    readonly [n: number]: T;\n}\n\ninterface Array<T> {\n    /**\n      * Gets or sets the length of the array. This is a number one higher than the highest element defined in an array.\n      */\n    length: number;\n    /**\n      * Returns a string representation of an array.\n      */\n    toString(): string;\n    /**\n      * Returns a string representation of an array. The elements are converted to string using thier toLocalString methods.\n      */\n    toLocaleString(): string;\n    /**\n      * Appends new elements to an array, and returns the new length of the array.\n      * @param items New elements of the Array.\n      */\n    push(...items: T[]): number;\n    /**\n      * Removes the last element from an array and returns it.\n      */\n    pop(): T | undefined;\n    /**\n      * Combines two or more arrays.\n      * @param items Additional items to add to the end of array1.\n      */\n    concat(...items: T[][]): T[];\n    /**\n      * Combines two or more arrays.\n      * @param items Additional items to add to the end of array1.\n      */\n    concat(...items: (T | T[])[]): T[];\n    /**\n      * Adds all the elements of an array separated by the specified separator string.\n      * @param separator A string used to separate one element of an array from the next in the resulting String. If omitted, the array elements are separated with a comma.\n      */\n    join(separator?: string): string;\n    /**\n      * Reverses the elements in an Array.\n      */\n    reverse(): T[];\n    /**\n      * Removes the first element from an array and returns it.\n      */\n    shift(): T | undefined;\n    /**\n      * Returns a section of an array.\n      * @param start The beginning of the specified portion of the array.\n      * @param end The end of the specified portion of the array.\n      */\n    slice(start?: number, end?: number): T[];\n    /**\n      * Sorts an array.\n      * @param compareFn The name of the function used to determine the order of the elements. If omitted, the elements are sorted in ascending, ASCII character order.\n      */\n    sort(compareFn?: (a: T, b: T) => number): this;\n    /**\n      * Removes elements from an array and, if necessary, inserts new elements in their place, returning the deleted elements.\n      * @param start The zero-based location in the array from which to start removing elements.\n      * @param deleteCount The number of elements to remove.\n      */\n    splice(start: number, deleteCount?: number): T[];\n    /**\n      * Removes elements from an array and, if necessary, inserts new elements in their place, returning the deleted elements.\n      * @param start The zero-based location in the array from which to start removing elements.\n      * @param deleteCount The number of elements to remove.\n      * @param items Elements to insert into the array in place of the deleted elements.\n      */\n    splice(start: number, deleteCount: number, ...items: T[]): T[];\n    /**\n      * Inserts new elements at the start of an array.\n      * @param items  Elements to insert at the start of the Array.\n      */\n    unshift(...items: T[]): number;\n    /**\n      * Returns the index of the first occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0.\n      */\n    indexOf(searchElement: T, fromIndex?: number): number;\n    /**\n      * Returns the index of the last occurrence of a specified value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at the last index in the array.\n      */\n    lastIndexOf(searchElement: T, fromIndex?: number): number;\n    /**\n      * Determines whether all the members of an array satisfy the specified test.\n      * @param callbackfn A function that accepts up to three arguments. The every method calls the callbackfn function for each element in array1 until the callbackfn returns false, or until the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n      */\n    every(callbackfn: (value: T, index: number, array: T[]) => boolean, thisArg?: any): boolean;\n    /**\n      * Determines whether the specified callback function returns true for any element of an array.\n      * @param callbackfn A function that accepts up to three arguments. The some method calls the callbackfn function for each element in array1 until the callbackfn returns true, or until the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n      */\n    some(callbackfn: (value: T, index: number, array: T[]) => boolean, thisArg?: any): boolean;\n    /**\n      * Performs the specified action for each element in an array.\n      * @param callbackfn  A function that accepts up to three arguments. forEach calls the callbackfn function one time for each element in the array.\n      * @param thisArg  An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n      */\n    forEach(callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any): void;\n    /**\n      * Calls a defined callback function on each element of an array, and returns an array that contains the results.\n      * @param callbackfn A function that accepts up to three arguments. The map method calls the callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n      */\n    map<U>(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): U[];\n    /**\n     * Returns the elements of an array that meet the condition specified in a callback function.\n     * @param callbackfn A function that accepts up to three arguments. The filter method calls the callbackfn function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n     */\n    filter<S extends T>(callbackfn: (value: T, index: number, array: T[]) => value is S, thisArg?: any): S[];\n    /**\n      * Returns the elements of an array that meet the condition specified in a callback function.\n      * @param callbackfn A function that accepts up to three arguments. The filter method calls the callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n      */\n    filter(callbackfn: (value: T, index: number, array: T[]) => any, thisArg?: any): T[];\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.\n      */\n    reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue?: T): T;\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.\n      */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U;\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.\n      */\n    reduceRight(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue?: T): T;\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.\n      */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U;\n\n    [n: number]: T;\n}\n\ninterface ArrayConstructor {\n    new(arrayLength?: number): any[];\n    new <T>(arrayLength: number): T[];\n    new <T>(...items: T[]): T[];\n    (arrayLength?: number): any[];\n    <T>(arrayLength: number): T[];\n    <T>(...items: T[]): T[];\n    isArray(arg: any): arg is Array<any>;\n    readonly prototype: Array<any>;\n}\n\ndeclare const Array: ArrayConstructor;\n\ninterface TypedPropertyDescriptor<T> {\n    enumerable?: boolean;\n    configurable?: boolean;\n    writable?: boolean;\n    value?: T;\n    get?: () => T;\n    set?: (value: T) => void;\n}\n\ndeclare type ClassDecorator = <TFunction extends Function>(target: TFunction) => TFunction | void;\ndeclare type PropertyDecorator = (target: Object, propertyKey: string | symbol) => void;\ndeclare type MethodDecorator = <T>(target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<T>) => TypedPropertyDescriptor<T> | void;\ndeclare type ParameterDecorator = (target: Object, propertyKey: string | symbol, parameterIndex: number) => void;\n\ndeclare type PromiseConstructorLike = new <T>(executor: (resolve: (value?: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void) => PromiseLike<T>;\n\ninterface PromiseLike<T> {\n    /**\n     * Attaches callbacks for the resolution and/or rejection of the Promise.\n     * @param onfulfilled The callback to execute when the Promise is resolved.\n     * @param onrejected The callback to execute when the Promise is rejected.\n     * @returns A Promise for the completion of which ever callback is executed.\n     */\n    then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null): PromiseLike<TResult1 | TResult2>;\n}\n\n/**\n * Represents the completion of an asynchronous operation\n */\ninterface Promise<T> {\n    /**\n     * Attaches callbacks for the resolution and/or rejection of the Promise.\n     * @param onfulfilled The callback to execute when the Promise is resolved.\n     * @param onrejected The callback to execute when the Promise is rejected.\n     * @returns A Promise for the completion of which ever callback is executed.\n     */\n    then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null): Promise<TResult1 | TResult2>;\n\n    /**\n     * Attaches a callback for only the rejection of the Promise.\n     * @param onrejected The callback to execute when the Promise is rejected.\n     * @returns A Promise for the completion of the callback.\n     */\n    catch<TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | undefined | null): Promise<T | TResult>;\n}\n\ninterface ArrayLike<T> {\n    readonly length: number;\n    readonly [n: number]: T;\n}\n\n/**\n * Make all properties in T optional\n */\ntype Partial<T> = {\n    [P in keyof T]?: T[P];\n};\n\n/**\n * Make all properties in T readonly\n */\ntype Readonly<T> = {\n    readonly [P in keyof T]: T[P];\n};\n\n/**\n * From T pick a set of properties K\n */\ntype Pick<T, K extends keyof T> = {\n    [P in K]: T[P];\n};\n\n/**\n * Construct a type with a set of properties K of type T\n */\ntype Record<K extends string, T> = {\n    [P in K]: T;\n};\n\n/**\n * Marker for contextual \'this\' type\n */\ninterface ThisType<T> { }\n\n/**\n  * Represents a raw buffer of binary data, which is used to store data for the\n  * different typed arrays. ArrayBuffers cannot be read from or written to directly,\n  * but can be passed to a typed array or DataView Object to interpret the raw\n  * buffer as needed.\n  */\ninterface ArrayBuffer {\n    /**\n      * Read-only. The length of the ArrayBuffer (in bytes).\n      */\n    readonly byteLength: number;\n\n    /**\n      * Returns a section of an ArrayBuffer.\n      */\n    slice(begin: number, end?: number): ArrayBuffer;\n}\n\n/**\n * Allowed ArrayBuffer types for the buffer of an ArrayBufferView and related Typed Arrays.\n */\ninterface ArrayBufferTypes {\n    ArrayBuffer: ArrayBuffer;\n}\ntype ArrayBufferLike = ArrayBufferTypes[keyof ArrayBufferTypes];\n\ninterface ArrayBufferConstructor {\n    readonly prototype: ArrayBuffer;\n    new(byteLength: number): ArrayBuffer;\n    isView(arg: any): arg is ArrayBufferView;\n}\ndeclare const ArrayBuffer: ArrayBufferConstructor;\n\ninterface ArrayBufferView {\n    /**\n      * The ArrayBuffer instance referenced by the array.\n      */\n    buffer: ArrayBufferLike;\n\n    /**\n      * The length in bytes of the array.\n      */\n    byteLength: number;\n\n    /**\n      * The offset in bytes of the array.\n      */\n    byteOffset: number;\n}\n\ninterface DataView {\n    readonly buffer: ArrayBuffer;\n    readonly byteLength: number;\n    readonly byteOffset: number;\n    /**\n      * Gets the Float32 value at the specified byte offset from the start of the view. There is\n      * no alignment constraint; multi-byte values may be fetched from any offset.\n      * @param byteOffset The place in the buffer at which the value should be retrieved.\n      */\n    getFloat32(byteOffset: number, littleEndian?: boolean): number;\n\n    /**\n      * Gets the Float64 value at the specified byte offset from the start of the view. There is\n      * no alignment constraint; multi-byte values may be fetched from any offset.\n      * @param byteOffset The place in the buffer at which the value should be retrieved.\n      */\n    getFloat64(byteOffset: number, littleEndian?: boolean): number;\n\n    /**\n      * Gets the Int8 value at the specified byte offset from the start of the view. There is\n      * no alignment constraint; multi-byte values may be fetched from any offset.\n      * @param byteOffset The place in the buffer at which the value should be retrieved.\n      */\n    getInt8(byteOffset: number): number;\n\n    /**\n      * Gets the Int16 value at the specified byte offset from the start of the view. There is\n      * no alignment constraint; multi-byte values may be fetched from any offset.\n      * @param byteOffset The place in the buffer at which the value should be retrieved.\n      */\n    getInt16(byteOffset: number, littleEndian?: boolean): number;\n    /**\n      * Gets the Int32 value at the specified byte offset from the start of the view. There is\n      * no alignment constraint; multi-byte values may be fetched from any offset.\n      * @param byteOffset The place in the buffer at which the value should be retrieved.\n      */\n    getInt32(byteOffset: number, littleEndian?: boolean): number;\n\n    /**\n      * Gets the Uint8 value at the specified byte offset from the start of the view. There is\n      * no alignment constraint; multi-byte values may be fetched from any offset.\n      * @param byteOffset The place in the buffer at which the value should be retrieved.\n      */\n    getUint8(byteOffset: number): number;\n\n    /**\n      * Gets the Uint16 value at the specified byte offset from the start of the view. There is\n      * no alignment constraint; multi-byte values may be fetched from any offset.\n      * @param byteOffset The place in the buffer at which the value should be retrieved.\n      */\n    getUint16(byteOffset: number, littleEndian?: boolean): number;\n\n    /**\n      * Gets the Uint32 value at the specified byte offset from the start of the view. There is\n      * no alignment constraint; multi-byte values may be fetched from any offset.\n      * @param byteOffset The place in the buffer at which the value should be retrieved.\n      */\n    getUint32(byteOffset: number, littleEndian?: boolean): number;\n\n    /**\n      * Stores an Float32 value at the specified byte offset from the start of the view.\n      * @param byteOffset The place in the buffer at which the value should be set.\n      * @param value The value to set.\n      * @param littleEndian If false or undefined, a big-endian value should be written,\n      * otherwise a little-endian value should be written.\n      */\n    setFloat32(byteOffset: number, value: number, littleEndian?: boolean): void;\n\n    /**\n      * Stores an Float64 value at the specified byte offset from the start of the view.\n      * @param byteOffset The place in the buffer at which the value should be set.\n      * @param value The value to set.\n      * @param littleEndian If false or undefined, a big-endian value should be written,\n      * otherwise a little-endian value should be written.\n      */\n    setFloat64(byteOffset: number, value: number, littleEndian?: boolean): void;\n\n    /**\n      * Stores an Int8 value at the specified byte offset from the start of the view.\n      * @param byteOffset The place in the buffer at which the value should be set.\n      * @param value The value to set.\n      */\n    setInt8(byteOffset: number, value: number): void;\n\n    /**\n      * Stores an Int16 value at the specified byte offset from the start of the view.\n      * @param byteOffset The place in the buffer at which the value should be set.\n      * @param value The value to set.\n      * @param littleEndian If false or undefined, a big-endian value should be written,\n      * otherwise a little-endian value should be written.\n      */\n    setInt16(byteOffset: number, value: number, littleEndian?: boolean): void;\n\n    /**\n      * Stores an Int32 value at the specified byte offset from the start of the view.\n      * @param byteOffset The place in the buffer at which the value should be set.\n      * @param value The value to set.\n      * @param littleEndian If false or undefined, a big-endian value should be written,\n      * otherwise a little-endian value should be written.\n      */\n    setInt32(byteOffset: number, value: number, littleEndian?: boolean): void;\n\n    /**\n      * Stores an Uint8 value at the specified byte offset from the start of the view.\n      * @param byteOffset The place in the buffer at which the value should be set.\n      * @param value The value to set.\n      */\n    setUint8(byteOffset: number, value: number): void;\n\n    /**\n      * Stores an Uint16 value at the specified byte offset from the start of the view.\n      * @param byteOffset The place in the buffer at which the value should be set.\n      * @param value The value to set.\n      * @param littleEndian If false or undefined, a big-endian value should be written,\n      * otherwise a little-endian value should be written.\n      */\n    setUint16(byteOffset: number, value: number, littleEndian?: boolean): void;\n\n    /**\n      * Stores an Uint32 value at the specified byte offset from the start of the view.\n      * @param byteOffset The place in the buffer at which the value should be set.\n      * @param value The value to set.\n      * @param littleEndian If false or undefined, a big-endian value should be written,\n      * otherwise a little-endian value should be written.\n      */\n    setUint32(byteOffset: number, value: number, littleEndian?: boolean): void;\n}\n\ninterface DataViewConstructor {\n    new(buffer: ArrayBufferLike, byteOffset?: number, byteLength?: number): DataView;\n}\ndeclare const DataView: DataViewConstructor;\n\n/**\n  * A typed array of 8-bit integer values. The contents are initialized to 0. If the requested\n  * number of bytes could not be allocated an exception is raised.\n  */\ninterface Int8Array {\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * The ArrayBuffer instance referenced by the array.\n      */\n    readonly buffer: ArrayBufferLike;\n\n    /**\n      * The length in bytes of the array.\n      */\n    readonly byteLength: number;\n\n    /**\n      * The offset in bytes of the array.\n      */\n    readonly byteOffset: number;\n\n    /**\n      * Returns the this object after copying a section of the array identified by start and end\n      * to the same array starting at position target\n      * @param target If target is negative, it is treated as length+target where length is the\n      * length of the array.\n      * @param start If start is negative, it is treated as length+start. If end is negative, it\n      * is treated as length+end.\n      * @param end If not specified, length of the this object is used as its default value.\n      */\n    copyWithin(target: number, start: number, end?: number): this;\n\n    /**\n      * Determines whether all the members of an array satisfy the specified test.\n      * @param callbackfn A function that accepts up to three arguments. The every method calls\n      * the callbackfn function for each element in array1 until the callbackfn returns false,\n      * or until the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    every(callbackfn: (value: number, index: number, array: Int8Array) => boolean, thisArg?: any): boolean;\n\n    /**\n        * Returns the this object after filling the section identified by start and end with value\n        * @param value value to fill array section with\n        * @param start index to start filling the array at. If start is negative, it is treated as\n        * length+start where length is the length of the array.\n        * @param end index to stop filling the array at. If end is negative, it is treated as\n        * length+end.\n        */\n    fill(value: number, start?: number, end?: number): this;\n\n    /**\n      * Returns the elements of an array that meet the condition specified in a callback function.\n      * @param callbackfn A function that accepts up to three arguments. The filter method calls\n      * the callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    filter(callbackfn: (value: number, index: number, array: Int8Array) => any, thisArg?: any): Int8Array;\n\n    /**\n      * Returns the value of the first element in the array where predicate is true, and undefined\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found, find\n      * immediately returns that element value. Otherwise, find returns undefined.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number | undefined;\n\n    /**\n      * Returns the index of the first element in the array where predicate is true, and -1\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found,\n      * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    findIndex(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;\n\n    /**\n      * Performs the specified action for each element in an array.\n      * @param callbackfn  A function that accepts up to three arguments. forEach calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg  An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    forEach(callbackfn: (value: number, index: number, array: Int8Array) => void, thisArg?: any): void;\n\n    /**\n      * Returns the index of the first occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      *  search starts at index 0.\n      */\n    indexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * Adds all the elements of an array separated by the specified separator string.\n      * @param separator A string used to separate one element of an array from the next in the\n      * resulting String. If omitted, the array elements are separated with a comma.\n      */\n    join(separator?: string): string;\n\n    /**\n      * Returns the index of the last occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      * search starts at index 0.\n      */\n    lastIndexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * The length of the array.\n      */\n    readonly length: number;\n\n    /**\n      * Calls a defined callback function on each element of an array, and returns an array that\n      * contains the results.\n      * @param callbackfn A function that accepts up to three arguments. The map method calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    map(callbackfn: (this: void, value: number, index: number, array: Int8Array) => number, thisArg?: any): Int8Array;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int8Array) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int8Array) => U, initialValue: U): U;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an\n      * argument instead of an array value.\n      */\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int8Array) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int8Array) => U, initialValue: U): U;\n\n    /**\n      * Reverses the elements in an Array.\n      */\n    reverse(): Int8Array;\n\n    /**\n      * Sets a value or an array of values.\n      * @param array A typed or untyped array of values to set.\n      * @param offset The index in the current array at which the values are to be written.\n      */\n    set(array: ArrayLike<number>, offset?: number): void;\n\n    /**\n      * Returns a section of an array.\n      * @param start The beginning of the specified portion of the array.\n      * @param end The end of the specified portion of the array.\n      */\n    slice(start?: number, end?: number): Int8Array;\n\n    /**\n      * Determines whether the specified callback function returns true for any element of an array.\n      * @param callbackfn A function that accepts up to three arguments. The some method calls the\n      * callbackfn function for each element in array1 until the callbackfn returns true, or until\n      * the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    some(callbackfn: (value: number, index: number, array: Int8Array) => boolean, thisArg?: any): boolean;\n\n    /**\n      * Sorts an array.\n      * @param compareFn The name of the function used to determine the order of the elements. If\n      * omitted, the elements are sorted in ascending, ASCII character order.\n      */\n    sort(compareFn?: (a: number, b: number) => number): this;\n\n    /**\n      * Gets a new Int8Array view of the ArrayBuffer store for this array, referencing the elements\n      * at begin, inclusive, up to end, exclusive.\n      * @param begin The index of the beginning of the array.\n      * @param end The index of the end of the array.\n      */\n    subarray(begin: number, end?: number): Int8Array;\n\n    /**\n      * Converts a number to a string by using the current locale.\n      */\n    toLocaleString(): string;\n\n    /**\n      * Returns a string representation of an array.\n      */\n    toString(): string;\n\n    [index: number]: number;\n}\ninterface Int8ArrayConstructor {\n    readonly prototype: Int8Array;\n    new(length: number): Int8Array;\n    new(array: ArrayLike<number>): Int8Array;\n    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Int8Array;\n\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * Returns a new array from a set of elements.\n      * @param items A set of elements to include in the new array object.\n      */\n    of(...items: number[]): Int8Array;\n\n    /**\n      * Creates an array from an array-like or iterable object.\n      * @param arrayLike An array-like or iterable object to convert to an array.\n      * @param mapfn A mapping function to call on every element of the array.\n      * @param thisArg Value of \'this\' used to invoke the mapfn.\n      */\n    from(arrayLike: ArrayLike<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Int8Array;\n\n\n}\ndeclare const Int8Array: Int8ArrayConstructor;\n\n/**\n  * A typed array of 8-bit unsigned integer values. The contents are initialized to 0. If the\n  * requested number of bytes could not be allocated an exception is raised.\n  */\ninterface Uint8Array {\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * The ArrayBuffer instance referenced by the array.\n      */\n    readonly buffer: ArrayBufferLike;\n\n    /**\n      * The length in bytes of the array.\n      */\n    readonly byteLength: number;\n\n    /**\n      * The offset in bytes of the array.\n      */\n    readonly byteOffset: number;\n\n    /**\n      * Returns the this object after copying a section of the array identified by start and end\n      * to the same array starting at position target\n      * @param target If target is negative, it is treated as length+target where length is the\n      * length of the array.\n      * @param start If start is negative, it is treated as length+start. If end is negative, it\n      * is treated as length+end.\n      * @param end If not specified, length of the this object is used as its default value.\n      */\n    copyWithin(target: number, start: number, end?: number): this;\n\n    /**\n      * Determines whether all the members of an array satisfy the specified test.\n      * @param callbackfn A function that accepts up to three arguments. The every method calls\n      * the callbackfn function for each element in array1 until the callbackfn returns false,\n      * or until the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    every(callbackfn: (value: number, index: number, array: Uint8Array) => boolean, thisArg?: any): boolean;\n\n    /**\n        * Returns the this object after filling the section identified by start and end with value\n        * @param value value to fill array section with\n        * @param start index to start filling the array at. If start is negative, it is treated as\n        * length+start where length is the length of the array.\n        * @param end index to stop filling the array at. If end is negative, it is treated as\n        * length+end.\n        */\n    fill(value: number, start?: number, end?: number): this;\n\n    /**\n      * Returns the elements of an array that meet the condition specified in a callback function.\n      * @param callbackfn A function that accepts up to three arguments. The filter method calls\n      * the callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    filter(callbackfn: (value: number, index: number, array: Uint8Array) => any, thisArg?: any): Uint8Array;\n\n    /**\n      * Returns the value of the first element in the array where predicate is true, and undefined\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found, find\n      * immediately returns that element value. Otherwise, find returns undefined.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number | undefined;\n\n    /**\n      * Returns the index of the first element in the array where predicate is true, and -1\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found,\n      * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    findIndex(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;\n\n    /**\n      * Performs the specified action for each element in an array.\n      * @param callbackfn  A function that accepts up to three arguments. forEach calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg  An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    forEach(callbackfn: (value: number, index: number, array: Uint8Array) => void, thisArg?: any): void;\n\n    /**\n      * Returns the index of the first occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      *  search starts at index 0.\n      */\n    indexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * Adds all the elements of an array separated by the specified separator string.\n      * @param separator A string used to separate one element of an array from the next in the\n      * resulting String. If omitted, the array elements are separated with a comma.\n      */\n    join(separator?: string): string;\n\n    /**\n      * Returns the index of the last occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      * search starts at index 0.\n      */\n    lastIndexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * The length of the array.\n      */\n    readonly length: number;\n\n    /**\n      * Calls a defined callback function on each element of an array, and returns an array that\n      * contains the results.\n      * @param callbackfn A function that accepts up to three arguments. The map method calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    map(callbackfn: (this: void, value: number, index: number, array: Uint8Array) => number, thisArg?: any): Uint8Array;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8Array) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint8Array) => U, initialValue: U): U;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an\n      * argument instead of an array value.\n      */\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8Array) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint8Array) => U, initialValue: U): U;\n\n    /**\n      * Reverses the elements in an Array.\n      */\n    reverse(): Uint8Array;\n\n    /**\n      * Sets a value or an array of values.\n      * @param array A typed or untyped array of values to set.\n      * @param offset The index in the current array at which the values are to be written.\n      */\n    set(array: ArrayLike<number>, offset?: number): void;\n\n    /**\n      * Returns a section of an array.\n      * @param start The beginning of the specified portion of the array.\n      * @param end The end of the specified portion of the array.\n      */\n    slice(start?: number, end?: number): Uint8Array;\n\n    /**\n      * Determines whether the specified callback function returns true for any element of an array.\n      * @param callbackfn A function that accepts up to three arguments. The some method calls the\n      * callbackfn function for each element in array1 until the callbackfn returns true, or until\n      * the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    some(callbackfn: (value: number, index: number, array: Uint8Array) => boolean, thisArg?: any): boolean;\n\n    /**\n      * Sorts an array.\n      * @param compareFn The name of the function used to determine the order of the elements. If\n      * omitted, the elements are sorted in ascending, ASCII character order.\n      */\n    sort(compareFn?: (a: number, b: number) => number): this;\n\n    /**\n      * Gets a new Uint8Array view of the ArrayBuffer store for this array, referencing the elements\n      * at begin, inclusive, up to end, exclusive.\n      * @param begin The index of the beginning of the array.\n      * @param end The index of the end of the array.\n      */\n    subarray(begin: number, end?: number): Uint8Array;\n\n    /**\n      * Converts a number to a string by using the current locale.\n      */\n    toLocaleString(): string;\n\n    /**\n      * Returns a string representation of an array.\n      */\n    toString(): string;\n\n    [index: number]: number;\n}\n\ninterface Uint8ArrayConstructor {\n    readonly prototype: Uint8Array;\n    new(length: number): Uint8Array;\n    new(array: ArrayLike<number>): Uint8Array;\n    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Uint8Array;\n\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * Returns a new array from a set of elements.\n      * @param items A set of elements to include in the new array object.\n      */\n    of(...items: number[]): Uint8Array;\n\n    /**\n      * Creates an array from an array-like or iterable object.\n      * @param arrayLike An array-like or iterable object to convert to an array.\n      * @param mapfn A mapping function to call on every element of the array.\n      * @param thisArg Value of \'this\' used to invoke the mapfn.\n      */\n    from(arrayLike: ArrayLike<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Uint8Array;\n\n}\ndeclare const Uint8Array: Uint8ArrayConstructor;\n\n/**\n  * A typed array of 8-bit unsigned integer (clamped) values. The contents are initialized to 0.\n  * If the requested number of bytes could not be allocated an exception is raised.\n  */\ninterface Uint8ClampedArray {\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * The ArrayBuffer instance referenced by the array.\n      */\n    readonly buffer: ArrayBufferLike;\n\n    /**\n      * The length in bytes of the array.\n      */\n    readonly byteLength: number;\n\n    /**\n      * The offset in bytes of the array.\n      */\n    readonly byteOffset: number;\n\n    /**\n      * Returns the this object after copying a section of the array identified by start and end\n      * to the same array starting at position target\n      * @param target If target is negative, it is treated as length+target where length is the\n      * length of the array.\n      * @param start If start is negative, it is treated as length+start. If end is negative, it\n      * is treated as length+end.\n      * @param end If not specified, length of the this object is used as its default value.\n      */\n    copyWithin(target: number, start: number, end?: number): this;\n\n    /**\n      * Determines whether all the members of an array satisfy the specified test.\n      * @param callbackfn A function that accepts up to three arguments. The every method calls\n      * the callbackfn function for each element in array1 until the callbackfn returns false,\n      * or until the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    every(callbackfn: (value: number, index: number, array: Uint8ClampedArray) => boolean, thisArg?: any): boolean;\n\n    /**\n        * Returns the this object after filling the section identified by start and end with value\n        * @param value value to fill array section with\n        * @param start index to start filling the array at. If start is negative, it is treated as\n        * length+start where length is the length of the array.\n        * @param end index to stop filling the array at. If end is negative, it is treated as\n        * length+end.\n        */\n    fill(value: number, start?: number, end?: number): this;\n\n    /**\n      * Returns the elements of an array that meet the condition specified in a callback function.\n      * @param callbackfn A function that accepts up to three arguments. The filter method calls\n      * the callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    filter(callbackfn: (value: number, index: number, array: Uint8ClampedArray) => any, thisArg?: any): Uint8ClampedArray;\n\n    /**\n      * Returns the value of the first element in the array where predicate is true, and undefined\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found, find\n      * immediately returns that element value. Otherwise, find returns undefined.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number | undefined;\n\n    /**\n      * Returns the index of the first element in the array where predicate is true, and -1\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found,\n      * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    findIndex(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;\n\n    /**\n      * Performs the specified action for each element in an array.\n      * @param callbackfn  A function that accepts up to three arguments. forEach calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg  An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    forEach(callbackfn: (value: number, index: number, array: Uint8ClampedArray) => void, thisArg?: any): void;\n\n    /**\n      * Returns the index of the first occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      *  search starts at index 0.\n      */\n    indexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * Adds all the elements of an array separated by the specified separator string.\n      * @param separator A string used to separate one element of an array from the next in the\n      * resulting String. If omitted, the array elements are separated with a comma.\n      */\n    join(separator?: string): string;\n\n    /**\n      * Returns the index of the last occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      * search starts at index 0.\n      */\n    lastIndexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * The length of the array.\n      */\n    readonly length: number;\n\n    /**\n      * Calls a defined callback function on each element of an array, and returns an array that\n      * contains the results.\n      * @param callbackfn A function that accepts up to three arguments. The map method calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    map(callbackfn: (this: void, value: number, index: number, array: Uint8ClampedArray) => number, thisArg?: any): Uint8ClampedArray;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => U, initialValue: U): U;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an\n      * argument instead of an array value.\n      */\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => U, initialValue: U): U;\n\n    /**\n      * Reverses the elements in an Array.\n      */\n    reverse(): Uint8ClampedArray;\n\n    /**\n      * Sets a value or an array of values.\n      * @param array A typed or untyped array of values to set.\n      * @param offset The index in the current array at which the values are to be written.\n      */\n    set(array: ArrayLike<number>, offset?: number): void;\n\n    /**\n      * Returns a section of an array.\n      * @param start The beginning of the specified portion of the array.\n      * @param end The end of the specified portion of the array.\n      */\n    slice(start?: number, end?: number): Uint8ClampedArray;\n\n    /**\n      * Determines whether the specified callback function returns true for any element of an array.\n      * @param callbackfn A function that accepts up to three arguments. The some method calls the\n      * callbackfn function for each element in array1 until the callbackfn returns true, or until\n      * the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    some(callbackfn: (value: number, index: number, array: Uint8ClampedArray) => boolean, thisArg?: any): boolean;\n\n    /**\n      * Sorts an array.\n      * @param compareFn The name of the function used to determine the order of the elements. If\n      * omitted, the elements are sorted in ascending, ASCII character order.\n      */\n    sort(compareFn?: (a: number, b: number) => number): this;\n\n    /**\n      * Gets a new Uint8ClampedArray view of the ArrayBuffer store for this array, referencing the elements\n      * at begin, inclusive, up to end, exclusive.\n      * @param begin The index of the beginning of the array.\n      * @param end The index of the end of the array.\n      */\n    subarray(begin: number, end?: number): Uint8ClampedArray;\n\n    /**\n      * Converts a number to a string by using the current locale.\n      */\n    toLocaleString(): string;\n\n    /**\n      * Returns a string representation of an array.\n      */\n    toString(): string;\n\n    [index: number]: number;\n}\n\ninterface Uint8ClampedArrayConstructor {\n    readonly prototype: Uint8ClampedArray;\n    new(length: number): Uint8ClampedArray;\n    new(array: ArrayLike<number>): Uint8ClampedArray;\n    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Uint8ClampedArray;\n\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * Returns a new array from a set of elements.\n      * @param items A set of elements to include in the new array object.\n      */\n    of(...items: number[]): Uint8ClampedArray;\n\n    /**\n      * Creates an array from an array-like or iterable object.\n      * @param arrayLike An array-like or iterable object to convert to an array.\n      * @param mapfn A mapping function to call on every element of the array.\n      * @param thisArg Value of \'this\' used to invoke the mapfn.\n      */\n    from(arrayLike: ArrayLike<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Uint8ClampedArray;\n}\ndeclare const Uint8ClampedArray: Uint8ClampedArrayConstructor;\n\n/**\n  * A typed array of 16-bit signed integer values. The contents are initialized to 0. If the\n  * requested number of bytes could not be allocated an exception is raised.\n  */\ninterface Int16Array {\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * The ArrayBuffer instance referenced by the array.\n      */\n    readonly buffer: ArrayBufferLike;\n\n    /**\n      * The length in bytes of the array.\n      */\n    readonly byteLength: number;\n\n    /**\n      * The offset in bytes of the array.\n      */\n    readonly byteOffset: number;\n\n    /**\n      * Returns the this object after copying a section of the array identified by start and end\n      * to the same array starting at position target\n      * @param target If target is negative, it is treated as length+target where length is the\n      * length of the array.\n      * @param start If start is negative, it is treated as length+start. If end is negative, it\n      * is treated as length+end.\n      * @param end If not specified, length of the this object is used as its default value.\n      */\n    copyWithin(target: number, start: number, end?: number): this;\n\n    /**\n      * Determines whether all the members of an array satisfy the specified test.\n      * @param callbackfn A function that accepts up to three arguments. The every method calls\n      * the callbackfn function for each element in array1 until the callbackfn returns false,\n      * or until the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    every(callbackfn: (value: number, index: number, array: Int16Array) => boolean, thisArg?: any): boolean;\n\n    /**\n        * Returns the this object after filling the section identified by start and end with value\n        * @param value value to fill array section with\n        * @param start index to start filling the array at. If start is negative, it is treated as\n        * length+start where length is the length of the array.\n        * @param end index to stop filling the array at. If end is negative, it is treated as\n        * length+end.\n        */\n    fill(value: number, start?: number, end?: number): this;\n\n    /**\n      * Returns the elements of an array that meet the condition specified in a callback function.\n      * @param callbackfn A function that accepts up to three arguments. The filter method calls\n      * the callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    filter(callbackfn: (this: void, value: number, index: number, array: Int16Array) => any, thisArg?: any): Int16Array;\n\n    /**\n      * Returns the value of the first element in the array where predicate is true, and undefined\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found, find\n      * immediately returns that element value. Otherwise, find returns undefined.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number | undefined;\n\n    /**\n      * Returns the index of the first element in the array where predicate is true, and -1\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found,\n      * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    findIndex(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;\n\n    /**\n      * Performs the specified action for each element in an array.\n      * @param callbackfn  A function that accepts up to three arguments. forEach calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg  An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    forEach(callbackfn: (value: number, index: number, array: Int16Array) => void, thisArg?: any): void;\n    /**\n      * Returns the index of the first occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      *  search starts at index 0.\n      */\n    indexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * Adds all the elements of an array separated by the specified separator string.\n      * @param separator A string used to separate one element of an array from the next in the\n      * resulting String. If omitted, the array elements are separated with a comma.\n      */\n    join(separator?: string): string;\n\n    /**\n      * Returns the index of the last occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      * search starts at index 0.\n      */\n    lastIndexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * The length of the array.\n      */\n    readonly length: number;\n\n    /**\n      * Calls a defined callback function on each element of an array, and returns an array that\n      * contains the results.\n      * @param callbackfn A function that accepts up to three arguments. The map method calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    map(callbackfn: (this: void, value: number, index: number, array: Int16Array) => number, thisArg?: any): Int16Array;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int16Array) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int16Array) => U, initialValue: U): U;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an\n      * argument instead of an array value.\n      */\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int16Array) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int16Array) => U, initialValue: U): U;\n\n    /**\n      * Reverses the elements in an Array.\n      */\n    reverse(): Int16Array;\n\n    /**\n      * Sets a value or an array of values.\n      * @param array A typed or untyped array of values to set.\n      * @param offset The index in the current array at which the values are to be written.\n      */\n    set(array: ArrayLike<number>, offset?: number): void;\n\n    /**\n      * Returns a section of an array.\n      * @param start The beginning of the specified portion of the array.\n      * @param end The end of the specified portion of the array.\n      */\n    slice(start?: number, end?: number): Int16Array;\n\n    /**\n      * Determines whether the specified callback function returns true for any element of an array.\n      * @param callbackfn A function that accepts up to three arguments. The some method calls the\n      * callbackfn function for each element in array1 until the callbackfn returns true, or until\n      * the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    some(callbackfn: (value: number, index: number, array: Int16Array) => boolean, thisArg?: any): boolean;\n\n    /**\n      * Sorts an array.\n      * @param compareFn The name of the function used to determine the order of the elements. If\n      * omitted, the elements are sorted in ascending, ASCII character order.\n      */\n    sort(compareFn?: (a: number, b: number) => number): this;\n\n    /**\n      * Gets a new Int16Array view of the ArrayBuffer store for this array, referencing the elements\n      * at begin, inclusive, up to end, exclusive.\n      * @param begin The index of the beginning of the array.\n      * @param end The index of the end of the array.\n      */\n    subarray(begin: number, end?: number): Int16Array;\n\n    /**\n      * Converts a number to a string by using the current locale.\n      */\n    toLocaleString(): string;\n\n    /**\n      * Returns a string representation of an array.\n      */\n    toString(): string;\n\n    [index: number]: number;\n}\n\ninterface Int16ArrayConstructor {\n    readonly prototype: Int16Array;\n    new(length: number): Int16Array;\n    new(array: ArrayLike<number>): Int16Array;\n    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Int16Array;\n\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * Returns a new array from a set of elements.\n      * @param items A set of elements to include in the new array object.\n      */\n    of(...items: number[]): Int16Array;\n\n    /**\n      * Creates an array from an array-like or iterable object.\n      * @param arrayLike An array-like or iterable object to convert to an array.\n      * @param mapfn A mapping function to call on every element of the array.\n      * @param thisArg Value of \'this\' used to invoke the mapfn.\n      */\n    from(arrayLike: ArrayLike<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Int16Array;\n\n\n}\ndeclare const Int16Array: Int16ArrayConstructor;\n\n/**\n  * A typed array of 16-bit unsigned integer values. The contents are initialized to 0. If the\n  * requested number of bytes could not be allocated an exception is raised.\n  */\ninterface Uint16Array {\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * The ArrayBuffer instance referenced by the array.\n      */\n    readonly buffer: ArrayBufferLike;\n\n    /**\n      * The length in bytes of the array.\n      */\n    readonly byteLength: number;\n\n    /**\n      * The offset in bytes of the array.\n      */\n    readonly byteOffset: number;\n\n    /**\n      * Returns the this object after copying a section of the array identified by start and end\n      * to the same array starting at position target\n      * @param target If target is negative, it is treated as length+target where length is the\n      * length of the array.\n      * @param start If start is negative, it is treated as length+start. If end is negative, it\n      * is treated as length+end.\n      * @param end If not specified, length of the this object is used as its default value.\n      */\n    copyWithin(target: number, start: number, end?: number): this;\n\n    /**\n      * Determines whether all the members of an array satisfy the specified test.\n      * @param callbackfn A function that accepts up to three arguments. The every method calls\n      * the callbackfn function for each element in array1 until the callbackfn returns false,\n      * or until the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    every(callbackfn: (value: number, index: number, array: Uint16Array) => boolean, thisArg?: any): boolean;\n\n    /**\n        * Returns the this object after filling the section identified by start and end with value\n        * @param value value to fill array section with\n        * @param start index to start filling the array at. If start is negative, it is treated as\n        * length+start where length is the length of the array.\n        * @param end index to stop filling the array at. If end is negative, it is treated as\n        * length+end.\n        */\n    fill(value: number, start?: number, end?: number): this;\n\n    /**\n      * Returns the elements of an array that meet the condition specified in a callback function.\n      * @param callbackfn A function that accepts up to three arguments. The filter method calls\n      * the callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    filter(callbackfn: (value: number, index: number, array: Uint16Array) => any, thisArg?: any): Uint16Array;\n\n    /**\n      * Returns the value of the first element in the array where predicate is true, and undefined\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found, find\n      * immediately returns that element value. Otherwise, find returns undefined.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number | undefined;\n\n    /**\n      * Returns the index of the first element in the array where predicate is true, and -1\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found,\n      * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    findIndex(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;\n\n    /**\n      * Performs the specified action for each element in an array.\n      * @param callbackfn  A function that accepts up to three arguments. forEach calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg  An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    forEach(callbackfn: (value: number, index: number, array: Uint16Array) => void, thisArg?: any): void;\n\n    /**\n      * Returns the index of the first occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      *  search starts at index 0.\n      */\n    indexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * Adds all the elements of an array separated by the specified separator string.\n      * @param separator A string used to separate one element of an array from the next in the\n      * resulting String. If omitted, the array elements are separated with a comma.\n      */\n    join(separator?: string): string;\n\n    /**\n      * Returns the index of the last occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      * search starts at index 0.\n      */\n    lastIndexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * The length of the array.\n      */\n    readonly length: number;\n\n    /**\n      * Calls a defined callback function on each element of an array, and returns an array that\n      * contains the results.\n      * @param callbackfn A function that accepts up to three arguments. The map method calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    map(callbackfn: (this: void, value: number, index: number, array: Uint16Array) => number, thisArg?: any): Uint16Array;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint16Array) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint16Array) => U, initialValue: U): U;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an\n      * argument instead of an array value.\n      */\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint16Array) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint16Array) => U, initialValue: U): U;\n\n    /**\n      * Reverses the elements in an Array.\n      */\n    reverse(): Uint16Array;\n\n    /**\n      * Sets a value or an array of values.\n      * @param array A typed or untyped array of values to set.\n      * @param offset The index in the current array at which the values are to be written.\n      */\n    set(array: ArrayLike<number>, offset?: number): void;\n\n    /**\n      * Returns a section of an array.\n      * @param start The beginning of the specified portion of the array.\n      * @param end The end of the specified portion of the array.\n      */\n    slice(start?: number, end?: number): Uint16Array;\n\n    /**\n      * Determines whether the specified callback function returns true for any element of an array.\n      * @param callbackfn A function that accepts up to three arguments. The some method calls the\n      * callbackfn function for each element in array1 until the callbackfn returns true, or until\n      * the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    some(callbackfn: (value: number, index: number, array: Uint16Array) => boolean, thisArg?: any): boolean;\n\n    /**\n      * Sorts an array.\n      * @param compareFn The name of the function used to determine the order of the elements. If\n      * omitted, the elements are sorted in ascending, ASCII character order.\n      */\n    sort(compareFn?: (a: number, b: number) => number): this;\n\n    /**\n      * Gets a new Uint16Array view of the ArrayBuffer store for this array, referencing the elements\n      * at begin, inclusive, up to end, exclusive.\n      * @param begin The index of the beginning of the array.\n      * @param end The index of the end of the array.\n      */\n    subarray(begin: number, end?: number): Uint16Array;\n\n    /**\n      * Converts a number to a string by using the current locale.\n      */\n    toLocaleString(): string;\n\n    /**\n      * Returns a string representation of an array.\n      */\n    toString(): string;\n\n    [index: number]: number;\n}\n\ninterface Uint16ArrayConstructor {\n    readonly prototype: Uint16Array;\n    new(length: number): Uint16Array;\n    new(array: ArrayLike<number>): Uint16Array;\n    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Uint16Array;\n\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * Returns a new array from a set of elements.\n      * @param items A set of elements to include in the new array object.\n      */\n    of(...items: number[]): Uint16Array;\n\n    /**\n      * Creates an array from an array-like or iterable object.\n      * @param arrayLike An array-like or iterable object to convert to an array.\n      * @param mapfn A mapping function to call on every element of the array.\n      * @param thisArg Value of \'this\' used to invoke the mapfn.\n      */\n    from(arrayLike: ArrayLike<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Uint16Array;\n\n\n}\ndeclare const Uint16Array: Uint16ArrayConstructor;\n/**\n  * A typed array of 32-bit signed integer values. The contents are initialized to 0. If the\n  * requested number of bytes could not be allocated an exception is raised.\n  */\ninterface Int32Array {\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * The ArrayBuffer instance referenced by the array.\n      */\n    readonly buffer: ArrayBufferLike;\n\n    /**\n      * The length in bytes of the array.\n      */\n    readonly byteLength: number;\n\n    /**\n      * The offset in bytes of the array.\n      */\n    readonly byteOffset: number;\n\n    /**\n      * Returns the this object after copying a section of the array identified by start and end\n      * to the same array starting at position target\n      * @param target If target is negative, it is treated as length+target where length is the\n      * length of the array.\n      * @param start If start is negative, it is treated as length+start. If end is negative, it\n      * is treated as length+end.\n      * @param end If not specified, length of the this object is used as its default value.\n      */\n    copyWithin(target: number, start: number, end?: number): this;\n\n    /**\n      * Determines whether all the members of an array satisfy the specified test.\n      * @param callbackfn A function that accepts up to three arguments. The every method calls\n      * the callbackfn function for each element in array1 until the callbackfn returns false,\n      * or until the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    every(callbackfn: (value: number, index: number, array: Int32Array) => boolean, thisArg?: any): boolean;\n\n    /**\n        * Returns the this object after filling the section identified by start and end with value\n        * @param value value to fill array section with\n        * @param start index to start filling the array at. If start is negative, it is treated as\n        * length+start where length is the length of the array.\n        * @param end index to stop filling the array at. If end is negative, it is treated as\n        * length+end.\n        */\n    fill(value: number, start?: number, end?: number): this;\n\n    /**\n      * Returns the elements of an array that meet the condition specified in a callback function.\n      * @param callbackfn A function that accepts up to three arguments. The filter method calls\n      * the callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    filter(callbackfn: (value: number, index: number, array: Int32Array) => any, thisArg?: any): Int32Array;\n\n    /**\n      * Returns the value of the first element in the array where predicate is true, and undefined\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found, find\n      * immediately returns that element value. Otherwise, find returns undefined.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number | undefined;\n\n    /**\n      * Returns the index of the first element in the array where predicate is true, and -1\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found,\n      * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    findIndex(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;\n\n    /**\n      * Performs the specified action for each element in an array.\n      * @param callbackfn  A function that accepts up to three arguments. forEach calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg  An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    forEach(callbackfn: (value: number, index: number, array: Int32Array) => void, thisArg?: any): void;\n\n    /**\n      * Returns the index of the first occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      *  search starts at index 0.\n      */\n    indexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * Adds all the elements of an array separated by the specified separator string.\n      * @param separator A string used to separate one element of an array from the next in the\n      * resulting String. If omitted, the array elements are separated with a comma.\n      */\n    join(separator?: string): string;\n\n    /**\n      * Returns the index of the last occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      * search starts at index 0.\n      */\n    lastIndexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * The length of the array.\n      */\n    readonly length: number;\n\n    /**\n      * Calls a defined callback function on each element of an array, and returns an array that\n      * contains the results.\n      * @param callbackfn A function that accepts up to three arguments. The map method calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    map(callbackfn: (value: number, index: number, array: Int32Array) => number, thisArg?: any): Int32Array;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int32Array) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int32Array) => U, initialValue: U): U;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an\n      * argument instead of an array value.\n      */\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int32Array) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int32Array) => U, initialValue: U): U;\n\n    /**\n      * Reverses the elements in an Array.\n      */\n    reverse(): Int32Array;\n\n    /**\n      * Sets a value or an array of values.\n      * @param array A typed or untyped array of values to set.\n      * @param offset The index in the current array at which the values are to be written.\n      */\n    set(array: ArrayLike<number>, offset?: number): void;\n\n    /**\n      * Returns a section of an array.\n      * @param start The beginning of the specified portion of the array.\n      * @param end The end of the specified portion of the array.\n      */\n    slice(start?: number, end?: number): Int32Array;\n\n    /**\n      * Determines whether the specified callback function returns true for any element of an array.\n      * @param callbackfn A function that accepts up to three arguments. The some method calls the\n      * callbackfn function for each element in array1 until the callbackfn returns true, or until\n      * the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    some(callbackfn: (value: number, index: number, array: Int32Array) => boolean, thisArg?: any): boolean;\n\n    /**\n      * Sorts an array.\n      * @param compareFn The name of the function used to determine the order of the elements. If\n      * omitted, the elements are sorted in ascending, ASCII character order.\n      */\n    sort(compareFn?: (a: number, b: number) => number): this;\n\n    /**\n      * Gets a new Int32Array view of the ArrayBuffer store for this array, referencing the elements\n      * at begin, inclusive, up to end, exclusive.\n      * @param begin The index of the beginning of the array.\n      * @param end The index of the end of the array.\n      */\n    subarray(begin: number, end?: number): Int32Array;\n\n    /**\n      * Converts a number to a string by using the current locale.\n      */\n    toLocaleString(): string;\n\n    /**\n      * Returns a string representation of an array.\n      */\n    toString(): string;\n\n    [index: number]: number;\n}\n\ninterface Int32ArrayConstructor {\n    readonly prototype: Int32Array;\n    new(length: number): Int32Array;\n    new(array: ArrayLike<number>): Int32Array;\n    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Int32Array;\n\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * Returns a new array from a set of elements.\n      * @param items A set of elements to include in the new array object.\n      */\n    of(...items: number[]): Int32Array;\n\n    /**\n      * Creates an array from an array-like or iterable object.\n      * @param arrayLike An array-like or iterable object to convert to an array.\n      * @param mapfn A mapping function to call on every element of the array.\n      * @param thisArg Value of \'this\' used to invoke the mapfn.\n      */\n    from(arrayLike: ArrayLike<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Int32Array;\n\n}\ndeclare const Int32Array: Int32ArrayConstructor;\n\n/**\n  * A typed array of 32-bit unsigned integer values. The contents are initialized to 0. If the\n  * requested number of bytes could not be allocated an exception is raised.\n  */\ninterface Uint32Array {\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * The ArrayBuffer instance referenced by the array.\n      */\n    readonly buffer: ArrayBufferLike;\n\n    /**\n      * The length in bytes of the array.\n      */\n    readonly byteLength: number;\n\n    /**\n      * The offset in bytes of the array.\n      */\n    readonly byteOffset: number;\n\n    /**\n      * Returns the this object after copying a section of the array identified by start and end\n      * to the same array starting at position target\n      * @param target If target is negative, it is treated as length+target where length is the\n      * length of the array.\n      * @param start If start is negative, it is treated as length+start. If end is negative, it\n      * is treated as length+end.\n      * @param end If not specified, length of the this object is used as its default value.\n      */\n    copyWithin(target: number, start: number, end?: number): this;\n\n    /**\n      * Determines whether all the members of an array satisfy the specified test.\n      * @param callbackfn A function that accepts up to three arguments. The every method calls\n      * the callbackfn function for each element in array1 until the callbackfn returns false,\n      * or until the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    every(callbackfn: (value: number, index: number, array: Uint32Array) => boolean, thisArg?: any): boolean;\n\n    /**\n        * Returns the this object after filling the section identified by start and end with value\n        * @param value value to fill array section with\n        * @param start index to start filling the array at. If start is negative, it is treated as\n        * length+start where length is the length of the array.\n        * @param end index to stop filling the array at. If end is negative, it is treated as\n        * length+end.\n        */\n    fill(value: number, start?: number, end?: number): this;\n\n    /**\n      * Returns the elements of an array that meet the condition specified in a callback function.\n      * @param callbackfn A function that accepts up to three arguments. The filter method calls\n      * the callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    filter(callbackfn: (value: number, index: number, array: Uint32Array) => any, thisArg?: any): Uint32Array;\n\n    /**\n      * Returns the value of the first element in the array where predicate is true, and undefined\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found, find\n      * immediately returns that element value. Otherwise, find returns undefined.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number | undefined;\n\n    /**\n      * Returns the index of the first element in the array where predicate is true, and -1\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found,\n      * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    findIndex(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;\n\n    /**\n      * Performs the specified action for each element in an array.\n      * @param callbackfn  A function that accepts up to three arguments. forEach calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg  An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    forEach(callbackfn: (value: number, index: number, array: Uint32Array) => void, thisArg?: any): void;\n    /**\n      * Returns the index of the first occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      *  search starts at index 0.\n      */\n    indexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * Adds all the elements of an array separated by the specified separator string.\n      * @param separator A string used to separate one element of an array from the next in the\n      * resulting String. If omitted, the array elements are separated with a comma.\n      */\n    join(separator?: string): string;\n\n    /**\n      * Returns the index of the last occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      * search starts at index 0.\n      */\n    lastIndexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * The length of the array.\n      */\n    readonly length: number;\n\n    /**\n      * Calls a defined callback function on each element of an array, and returns an array that\n      * contains the results.\n      * @param callbackfn A function that accepts up to three arguments. The map method calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    map(callbackfn: (this: void, value: number, index: number, array: Uint32Array) => number, thisArg?: any): Uint32Array;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint32Array) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint32Array) => U, initialValue: U): U;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an\n      * argument instead of an array value.\n      */\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint32Array) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint32Array) => U, initialValue: U): U;\n\n    /**\n      * Reverses the elements in an Array.\n      */\n    reverse(): Uint32Array;\n\n    /**\n      * Sets a value or an array of values.\n      * @param array A typed or untyped array of values to set.\n      * @param offset The index in the current array at which the values are to be written.\n      */\n    set(array: ArrayLike<number>, offset?: number): void;\n\n    /**\n      * Returns a section of an array.\n      * @param start The beginning of the specified portion of the array.\n      * @param end The end of the specified portion of the array.\n      */\n    slice(start?: number, end?: number): Uint32Array;\n\n    /**\n      * Determines whether the specified callback function returns true for any element of an array.\n      * @param callbackfn A function that accepts up to three arguments. The some method calls the\n      * callbackfn function for each element in array1 until the callbackfn returns true, or until\n      * the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    some(callbackfn: (value: number, index: number, array: Uint32Array) => boolean, thisArg?: any): boolean;\n\n    /**\n      * Sorts an array.\n      * @param compareFn The name of the function used to determine the order of the elements. If\n      * omitted, the elements are sorted in ascending, ASCII character order.\n      */\n    sort(compareFn?: (a: number, b: number) => number): this;\n\n    /**\n      * Gets a new Uint32Array view of the ArrayBuffer store for this array, referencing the elements\n      * at begin, inclusive, up to end, exclusive.\n      * @param begin The index of the beginning of the array.\n      * @param end The index of the end of the array.\n      */\n    subarray(begin: number, end?: number): Uint32Array;\n\n    /**\n      * Converts a number to a string by using the current locale.\n      */\n    toLocaleString(): string;\n\n    /**\n      * Returns a string representation of an array.\n      */\n    toString(): string;\n\n    [index: number]: number;\n}\n\ninterface Uint32ArrayConstructor {\n    readonly prototype: Uint32Array;\n    new(length: number): Uint32Array;\n    new(array: ArrayLike<number>): Uint32Array;\n    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Uint32Array;\n\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * Returns a new array from a set of elements.\n      * @param items A set of elements to include in the new array object.\n      */\n    of(...items: number[]): Uint32Array;\n\n    /**\n      * Creates an array from an array-like or iterable object.\n      * @param arrayLike An array-like or iterable object to convert to an array.\n      * @param mapfn A mapping function to call on every element of the array.\n      * @param thisArg Value of \'this\' used to invoke the mapfn.\n      */\n    from(arrayLike: ArrayLike<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Uint32Array;\n\n}\ndeclare const Uint32Array: Uint32ArrayConstructor;\n\n/**\n  * A typed array of 32-bit float values. The contents are initialized to 0. If the requested number\n  * of bytes could not be allocated an exception is raised.\n  */\ninterface Float32Array {\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * The ArrayBuffer instance referenced by the array.\n      */\n    readonly buffer: ArrayBufferLike;\n\n    /**\n      * The length in bytes of the array.\n      */\n    readonly byteLength: number;\n\n    /**\n      * The offset in bytes of the array.\n      */\n    readonly byteOffset: number;\n\n    /**\n      * Returns the this object after copying a section of the array identified by start and end\n      * to the same array starting at position target\n      * @param target If target is negative, it is treated as length+target where length is the\n      * length of the array.\n      * @param start If start is negative, it is treated as length+start. If end is negative, it\n      * is treated as length+end.\n      * @param end If not specified, length of the this object is used as its default value.\n      */\n    copyWithin(target: number, start: number, end?: number): this;\n\n    /**\n      * Determines whether all the members of an array satisfy the specified test.\n      * @param callbackfn A function that accepts up to three arguments. The every method calls\n      * the callbackfn function for each element in array1 until the callbackfn returns false,\n      * or until the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    every(callbackfn: (value: number, index: number, array: Float32Array) => boolean, thisArg?: any): boolean;\n\n    /**\n        * Returns the this object after filling the section identified by start and end with value\n        * @param value value to fill array section with\n        * @param start index to start filling the array at. If start is negative, it is treated as\n        * length+start where length is the length of the array.\n        * @param end index to stop filling the array at. If end is negative, it is treated as\n        * length+end.\n        */\n    fill(value: number, start?: number, end?: number): this;\n\n    /**\n      * Returns the elements of an array that meet the condition specified in a callback function.\n      * @param callbackfn A function that accepts up to three arguments. The filter method calls\n      * the callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    filter(callbackfn: (value: number, index: number, array: Float32Array) => any, thisArg?: any): Float32Array;\n\n    /**\n      * Returns the value of the first element in the array where predicate is true, and undefined\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found, find\n      * immediately returns that element value. Otherwise, find returns undefined.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number | undefined;\n\n    /**\n      * Returns the index of the first element in the array where predicate is true, and -1\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found,\n      * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    findIndex(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;\n\n    /**\n      * Performs the specified action for each element in an array.\n      * @param callbackfn  A function that accepts up to three arguments. forEach calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg  An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    forEach(callbackfn: (value: number, index: number, array: Float32Array) => void, thisArg?: any): void;\n\n    /**\n      * Returns the index of the first occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      *  search starts at index 0.\n      */\n    indexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * Adds all the elements of an array separated by the specified separator string.\n      * @param separator A string used to separate one element of an array from the next in the\n      * resulting String. If omitted, the array elements are separated with a comma.\n      */\n    join(separator?: string): string;\n\n    /**\n      * Returns the index of the last occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      * search starts at index 0.\n      */\n    lastIndexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * The length of the array.\n      */\n    readonly length: number;\n\n    /**\n      * Calls a defined callback function on each element of an array, and returns an array that\n      * contains the results.\n      * @param callbackfn A function that accepts up to three arguments. The map method calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    map(callbackfn: (this: void, value: number, index: number, array: Float32Array) => number, thisArg?: any): Float32Array;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float32Array) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Float32Array) => U, initialValue: U): U;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an\n      * argument instead of an array value.\n      */\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float32Array) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Float32Array) => U, initialValue: U): U;\n\n    /**\n      * Reverses the elements in an Array.\n      */\n    reverse(): Float32Array;\n\n    /**\n      * Sets a value or an array of values.\n      * @param array A typed or untyped array of values to set.\n      * @param offset The index in the current array at which the values are to be written.\n      */\n    set(array: ArrayLike<number>, offset?: number): void;\n\n    /**\n      * Returns a section of an array.\n      * @param start The beginning of the specified portion of the array.\n      * @param end The end of the specified portion of the array.\n      */\n    slice(start?: number, end?: number): Float32Array;\n\n    /**\n      * Determines whether the specified callback function returns true for any element of an array.\n      * @param callbackfn A function that accepts up to three arguments. The some method calls the\n      * callbackfn function for each element in array1 until the callbackfn returns true, or until\n      * the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    some(callbackfn: (value: number, index: number, array: Float32Array) => boolean, thisArg?: any): boolean;\n\n    /**\n      * Sorts an array.\n      * @param compareFn The name of the function used to determine the order of the elements. If\n      * omitted, the elements are sorted in ascending, ASCII character order.\n      */\n    sort(compareFn?: (a: number, b: number) => number): this;\n\n    /**\n      * Gets a new Float32Array view of the ArrayBuffer store for this array, referencing the elements\n      * at begin, inclusive, up to end, exclusive.\n      * @param begin The index of the beginning of the array.\n      * @param end The index of the end of the array.\n      */\n    subarray(begin: number, end?: number): Float32Array;\n\n    /**\n      * Converts a number to a string by using the current locale.\n      */\n    toLocaleString(): string;\n\n    /**\n      * Returns a string representation of an array.\n      */\n    toString(): string;\n\n    [index: number]: number;\n}\n\ninterface Float32ArrayConstructor {\n    readonly prototype: Float32Array;\n    new(length: number): Float32Array;\n    new(array: ArrayLike<number>): Float32Array;\n    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Float32Array;\n\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * Returns a new array from a set of elements.\n      * @param items A set of elements to include in the new array object.\n      */\n    of(...items: number[]): Float32Array;\n\n    /**\n      * Creates an array from an array-like or iterable object.\n      * @param arrayLike An array-like or iterable object to convert to an array.\n      * @param mapfn A mapping function to call on every element of the array.\n      * @param thisArg Value of \'this\' used to invoke the mapfn.\n      */\n    from(arrayLike: ArrayLike<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Float32Array;\n\n\n}\ndeclare const Float32Array: Float32ArrayConstructor;\n\n/**\n  * A typed array of 64-bit float values. The contents are initialized to 0. If the requested\n  * number of bytes could not be allocated an exception is raised.\n  */\ninterface Float64Array {\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * The ArrayBuffer instance referenced by the array.\n      */\n    readonly buffer: ArrayBufferLike;\n\n    /**\n      * The length in bytes of the array.\n      */\n    readonly byteLength: number;\n\n    /**\n      * The offset in bytes of the array.\n      */\n    readonly byteOffset: number;\n\n    /**\n      * Returns the this object after copying a section of the array identified by start and end\n      * to the same array starting at position target\n      * @param target If target is negative, it is treated as length+target where length is the\n      * length of the array.\n      * @param start If start is negative, it is treated as length+start. If end is negative, it\n      * is treated as length+end.\n      * @param end If not specified, length of the this object is used as its default value.\n      */\n    copyWithin(target: number, start: number, end?: number): this;\n\n    /**\n      * Determines whether all the members of an array satisfy the specified test.\n      * @param callbackfn A function that accepts up to three arguments. The every method calls\n      * the callbackfn function for each element in array1 until the callbackfn returns false,\n      * or until the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    every(callbackfn: (value: number, index: number, array: Float64Array) => boolean, thisArg?: any): boolean;\n\n    /**\n        * Returns the this object after filling the section identified by start and end with value\n        * @param value value to fill array section with\n        * @param start index to start filling the array at. If start is negative, it is treated as\n        * length+start where length is the length of the array.\n        * @param end index to stop filling the array at. If end is negative, it is treated as\n        * length+end.\n        */\n    fill(value: number, start?: number, end?: number): this;\n\n    /**\n      * Returns the elements of an array that meet the condition specified in a callback function.\n      * @param callbackfn A function that accepts up to three arguments. The filter method calls\n      * the callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    filter(callbackfn: (value: number, index: number, array: Float64Array) => any, thisArg?: any): Float64Array;\n\n    /**\n      * Returns the value of the first element in the array where predicate is true, and undefined\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found, find\n      * immediately returns that element value. Otherwise, find returns undefined.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number | undefined;\n\n    /**\n      * Returns the index of the first element in the array where predicate is true, and -1\n      * otherwise.\n      * @param predicate find calls predicate once for each element of the array, in ascending\n      * order, until it finds one where predicate returns true. If such an element is found,\n      * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n      * @param thisArg If provided, it will be used as the this value for each invocation of\n      * predicate. If it is not provided, undefined is used instead.\n      */\n    findIndex(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;\n\n    /**\n      * Performs the specified action for each element in an array.\n      * @param callbackfn  A function that accepts up to three arguments. forEach calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg  An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    forEach(callbackfn: (value: number, index: number, array: Float64Array) => void, thisArg?: any): void;\n\n    /**\n      * Returns the index of the first occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      *  search starts at index 0.\n      */\n    indexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * Adds all the elements of an array separated by the specified separator string.\n      * @param separator A string used to separate one element of an array from the next in the\n      * resulting String. If omitted, the array elements are separated with a comma.\n      */\n    join(separator?: string): string;\n\n    /**\n      * Returns the index of the last occurrence of a value in an array.\n      * @param searchElement The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n      * search starts at index 0.\n      */\n    lastIndexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n      * The length of the array.\n      */\n    readonly length: number;\n\n    /**\n      * Calls a defined callback function on each element of an array, and returns an array that\n      * contains the results.\n      * @param callbackfn A function that accepts up to three arguments. The map method calls the\n      * callbackfn function one time for each element in the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    map(callbackfn: (this: void, value: number, index: number, array: Float64Array) => number, thisArg?: any): Float64Array;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float64Array) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of\n      * the callback function is the accumulated result, and is provided as an argument in the next\n      * call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n      * callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Float64Array) => U, initialValue: U): U;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an\n      * argument instead of an array value.\n      */\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float64Array) => number, initialValue?: number): number;\n\n    /**\n      * Calls the specified callback function for all the elements in an array, in descending order.\n      * The return value of the callback function is the accumulated result, and is provided as an\n      * argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n      * the callbackfn function one time for each element in the array.\n      * @param initialValue If initialValue is specified, it is used as the initial value to start\n      * the accumulation. The first call to the callbackfn function provides this value as an argument\n      * instead of an array value.\n      */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Float64Array) => U, initialValue: U): U;\n\n    /**\n      * Reverses the elements in an Array.\n      */\n    reverse(): Float64Array;\n\n    /**\n      * Sets a value or an array of values.\n      * @param array A typed or untyped array of values to set.\n      * @param offset The index in the current array at which the values are to be written.\n      */\n    set(array: ArrayLike<number>, offset?: number): void;\n\n    /**\n      * Returns a section of an array.\n      * @param start The beginning of the specified portion of the array.\n      * @param end The end of the specified portion of the array.\n      */\n    slice(start?: number, end?: number): Float64Array;\n\n    /**\n      * Determines whether the specified callback function returns true for any element of an array.\n      * @param callbackfn A function that accepts up to three arguments. The some method calls the\n      * callbackfn function for each element in array1 until the callbackfn returns true, or until\n      * the end of the array.\n      * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n      * If thisArg is omitted, undefined is used as the this value.\n      */\n    some(callbackfn: (value: number, index: number, array: Float64Array) => boolean, thisArg?: any): boolean;\n\n    /**\n      * Sorts an array.\n      * @param compareFn The name of the function used to determine the order of the elements. If\n      * omitted, the elements are sorted in ascending, ASCII character order.\n      */\n    sort(compareFn?: (a: number, b: number) => number): this;\n\n    /**\n      * Gets a new Float64Array view of the ArrayBuffer store for this array, referencing the elements\n      * at begin, inclusive, up to end, exclusive.\n      * @param begin The index of the beginning of the array.\n      * @param end The index of the end of the array.\n      */\n    subarray(begin: number, end?: number): Float64Array;\n\n    /**\n      * Converts a number to a string by using the current locale.\n      */\n    toLocaleString(): string;\n\n    /**\n      * Returns a string representation of an array.\n      */\n    toString(): string;\n\n    [index: number]: number;\n}\n\ninterface Float64ArrayConstructor {\n    readonly prototype: Float64Array;\n    new(length: number): Float64Array;\n    new(array: ArrayLike<number>): Float64Array;\n    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Float64Array;\n\n    /**\n      * The size in bytes of each element in the array.\n      */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n      * Returns a new array from a set of elements.\n      * @param items A set of elements to include in the new array object.\n      */\n    of(...items: number[]): Float64Array;\n\n    /**\n      * Creates an array from an array-like or iterable object.\n      * @param arrayLike An array-like or iterable object to convert to an array.\n      * @param mapfn A mapping function to call on every element of the array.\n      * @param thisArg Value of \'this\' used to invoke the mapfn.\n      */\n    from(arrayLike: ArrayLike<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Float64Array;\n\n}\ndeclare const Float64Array: Float64ArrayConstructor;\n\n/////////////////////////////\n/// ECMAScript Internationalization API\n/////////////////////////////\n\ndeclare namespace Intl {\n    interface CollatorOptions {\n        usage?: string;\n        localeMatcher?: string;\n        numeric?: boolean;\n        caseFirst?: string;\n        sensitivity?: string;\n        ignorePunctuation?: boolean;\n    }\n\n    interface ResolvedCollatorOptions {\n        locale: string;\n        usage: string;\n        sensitivity: string;\n        ignorePunctuation: boolean;\n        collation: string;\n        caseFirst: string;\n        numeric: boolean;\n    }\n\n    interface Collator {\n        compare(x: string, y: string): number;\n        resolvedOptions(): ResolvedCollatorOptions;\n    }\n    var Collator: {\n        new(locales?: string | string[], options?: CollatorOptions): Collator;\n        (locales?: string | string[], options?: CollatorOptions): Collator;\n        supportedLocalesOf(locales: string | string[], options?: CollatorOptions): string[];\n    };\n\n    interface NumberFormatOptions {\n        localeMatcher?: string;\n        style?: string;\n        currency?: string;\n        currencyDisplay?: string;\n        useGrouping?: boolean;\n        minimumIntegerDigits?: number;\n        minimumFractionDigits?: number;\n        maximumFractionDigits?: number;\n        minimumSignificantDigits?: number;\n        maximumSignificantDigits?: number;\n    }\n\n    interface ResolvedNumberFormatOptions {\n        locale: string;\n        numberingSystem: string;\n        style: string;\n        currency?: string;\n        currencyDisplay?: string;\n        minimumIntegerDigits: number;\n        minimumFractionDigits: number;\n        maximumFractionDigits: number;\n        minimumSignificantDigits?: number;\n        maximumSignificantDigits?: number;\n        useGrouping: boolean;\n    }\n\n    interface NumberFormat {\n        format(value: number): string;\n        resolvedOptions(): ResolvedNumberFormatOptions;\n    }\n    var NumberFormat: {\n        new(locales?: string | string[], options?: NumberFormatOptions): NumberFormat;\n        (locales?: string | string[], options?: NumberFormatOptions): NumberFormat;\n        supportedLocalesOf(locales: string | string[], options?: NumberFormatOptions): string[];\n    };\n\n    interface DateTimeFormatOptions {\n        localeMatcher?: string;\n        weekday?: string;\n        era?: string;\n        year?: string;\n        month?: string;\n        day?: string;\n        hour?: string;\n        minute?: string;\n        second?: string;\n        timeZoneName?: string;\n        formatMatcher?: string;\n        hour12?: boolean;\n        timeZone?: string;\n    }\n\n    interface ResolvedDateTimeFormatOptions {\n        locale: string;\n        calendar: string;\n        numberingSystem: string;\n        timeZone: string;\n        hour12?: boolean;\n        weekday?: string;\n        era?: string;\n        year?: string;\n        month?: string;\n        day?: string;\n        hour?: string;\n        minute?: string;\n        second?: string;\n        timeZoneName?: string;\n    }\n\n    interface DateTimeFormat {\n        format(date?: Date | number): string;\n        resolvedOptions(): ResolvedDateTimeFormatOptions;\n    }\n    var DateTimeFormat: {\n        new(locales?: string | string[], options?: DateTimeFormatOptions): DateTimeFormat;\n        (locales?: string | string[], options?: DateTimeFormatOptions): DateTimeFormat;\n        supportedLocalesOf(locales: string | string[], options?: DateTimeFormatOptions): string[];\n    };\n}\n\ninterface String {\n    /**\n      * Determines whether two strings are equivalent in the current or specified locale.\n      * @param that String to compare to target string\n      * @param locales A locale string or array of locale strings that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used. This parameter must conform to BCP 47 standards; see the Intl.Collator object for details.\n      * @param options An object that contains one or more properties that specify comparison options. see the Intl.Collator object for details.\n      */\n    localeCompare(that: string, locales?: string | string[], options?: Intl.CollatorOptions): number;\n}\n\ninterface Number {\n    /**\n      * Converts a number to a string by using the current or specified locale.\n      * @param locales A locale string or array of locale strings that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used.\n      * @param options An object that contains one or more properties that specify comparison options.\n      */\n    toLocaleString(locales?: string | string[], options?: Intl.NumberFormatOptions): string;\n}\n\ninterface Date {\n    /**\n      * Converts a date and time to a string by using the current or specified locale.\n      * @param locales A locale string or array of locale strings that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used.\n      * @param options An object that contains one or more properties that specify comparison options.\n      */\n    toLocaleString(locales?: string | string[], options?: Intl.DateTimeFormatOptions): string;\n    /**\n      * Converts a date to a string by using the current or specified locale.\n      * @param locales A locale string or array of locale strings that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used.\n      * @param options An object that contains one or more properties that specify comparison options.\n      */\n    toLocaleDateString(locales?: string | string[], options?: Intl.DateTimeFormatOptions): string;\n\n    /**\n      * Converts a time to a string by using the current or specified locale.\n      * @param locales A locale string or array of locale strings that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used.\n      * @param options An object that contains one or more properties that specify comparison options.\n      */\n    toLocaleTimeString(locales?: string | string[], options?: Intl.DateTimeFormatOptions): string;\n}\n\n\ndeclare type PropertyKey = string | number | symbol;\n\ninterface Array<T> {\n    /**\n     * Returns the value of the first element in the array where predicate is true, and undefined\n     * otherwise.\n     * @param predicate find calls predicate once for each element of the array, in ascending\n     * order, until it finds one where predicate returns true. If such an element is found, find\n     * immediately returns that element value. Otherwise, find returns undefined.\n     * @param thisArg If provided, it will be used as the this value for each invocation of\n     * predicate. If it is not provided, undefined is used instead.\n     */\n    find(predicate: (this: void, value: T, index: number, obj: Array<T>) => boolean): T | undefined;\n    find(predicate: (this: void, value: T, index: number, obj: Array<T>) => boolean, thisArg: undefined): T | undefined;\n    find<Z>(predicate: (this: Z, value: T, index: number, obj: Array<T>) => boolean, thisArg: Z): T | undefined;\n\n    /**\n     * Returns the index of the first element in the array where predicate is true, and -1\n     * otherwise.\n     * @param predicate find calls predicate once for each element of the array, in ascending\n     * order, until it finds one where predicate returns true. If such an element is found,\n     * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n     * @param thisArg If provided, it will be used as the this value for each invocation of\n     * predicate. If it is not provided, undefined is used instead.\n     */\n    findIndex(predicate: (this: void, value: T, index: number, obj: Array<T>) => boolean): number;\n    findIndex(predicate: (this: void, value: T, index: number, obj: Array<T>) => boolean, thisArg: undefined): number;\n    findIndex<Z>(predicate: (this: Z, value: T, index: number, obj: Array<T>) => boolean, thisArg: Z): number;\n\n    /**\n     * Returns the this object after filling the section identified by start and end with value\n     * @param value value to fill array section with\n     * @param start index to start filling the array at. If start is negative, it is treated as\n     * length+start where length is the length of the array.\n     * @param end index to stop filling the array at. If end is negative, it is treated as\n     * length+end.\n     */\n    fill(value: T, start?: number, end?: number): this;\n\n    /**\n     * Returns the this object after copying a section of the array identified by start and end\n     * to the same array starting at position target\n     * @param target If target is negative, it is treated as length+target where length is the\n     * length of the array.\n     * @param start If start is negative, it is treated as length+start. If end is negative, it\n     * is treated as length+end.\n     * @param end If not specified, length of the this object is used as its default value.\n     */\n    copyWithin(target: number, start: number, end?: number): this;\n}\n\ninterface ArrayConstructor {\n    /**\n     * Creates an array from an array-like object.\n     * @param arrayLike An array-like object to convert to an array.\n     * @param mapfn A mapping function to call on every element of the array.\n     * @param thisArg Value of \'this\' used to invoke the mapfn.\n     */\n    from<T, U>(arrayLike: ArrayLike<T>, mapfn: (this: void, v: T, k: number) => U): Array<U>;\n    from<T, U>(arrayLike: ArrayLike<T>, mapfn: (this: void, v: T, k: number) => U, thisArg: undefined): Array<U>;\n    from<Z, T, U>(arrayLike: ArrayLike<T>, mapfn: (this: Z, v: T, k: number) => U, thisArg: Z): Array<U>;\n\n\n    /**\n     * Creates an array from an array-like object.\n     * @param arrayLike An array-like object to convert to an array.\n     */\n    from<T>(arrayLike: ArrayLike<T>): Array<T>;\n\n    /**\n     * Returns a new array from a set of elements.\n     * @param items A set of elements to include in the new array object.\n     */\n    of<T>(...items: T[]): Array<T>;\n}\n\ninterface DateConstructor {\n    new (value: Date): Date;\n}\n\ninterface Function {\n    /**\n     * Returns the name of the function. Function names are read-only and can not be changed.\n     */\n    readonly name: string;\n}\n\ninterface Math {\n    /**\n     * Returns the number of leading zero bits in the 32-bit binary representation of a number.\n     * @param x A numeric expression.\n     */\n    clz32(x: number): number;\n\n    /**\n     * Returns the result of 32-bit multiplication of two numbers.\n     * @param x First number\n     * @param y Second number\n     */\n    imul(x: number, y: number): number;\n\n    /**\n     * Returns the sign of the x, indicating whether x is positive, negative or zero.\n     * @param x The numeric expression to test\n     */\n    sign(x: number): number;\n\n    /**\n     * Returns the base 10 logarithm of a number.\n     * @param x A numeric expression.\n     */\n    log10(x: number): number;\n\n    /**\n     * Returns the base 2 logarithm of a number.\n     * @param x A numeric expression.\n     */\n    log2(x: number): number;\n\n    /**\n     * Returns the natural logarithm of 1 + x.\n     * @param x A numeric expression.\n     */\n    log1p(x: number): number;\n\n    /**\n     * Returns the result of (e^x - 1) of x (e raised to the power of x, where e is the base of\n     * the natural logarithms).\n     * @param x A numeric expression.\n     */\n    expm1(x: number): number;\n\n    /**\n     * Returns the hyperbolic cosine of a number.\n     * @param x A numeric expression that contains an angle measured in radians.\n     */\n    cosh(x: number): number;\n\n    /**\n     * Returns the hyperbolic sine of a number.\n     * @param x A numeric expression that contains an angle measured in radians.\n     */\n    sinh(x: number): number;\n\n    /**\n     * Returns the hyperbolic tangent of a number.\n     * @param x A numeric expression that contains an angle measured in radians.\n     */\n    tanh(x: number): number;\n\n    /**\n     * Returns the inverse hyperbolic cosine of a number.\n     * @param x A numeric expression that contains an angle measured in radians.\n     */\n    acosh(x: number): number;\n\n    /**\n     * Returns the inverse hyperbolic sine of a number.\n     * @param x A numeric expression that contains an angle measured in radians.\n     */\n    asinh(x: number): number;\n\n    /**\n     * Returns the inverse hyperbolic tangent of a number.\n     * @param x A numeric expression that contains an angle measured in radians.\n     */\n    atanh(x: number): number;\n\n    /**\n     * Returns the square root of the sum of squares of its arguments.\n     * @param values Values to compute the square root for.\n     *     If no arguments are passed, the result is +0.\n     *     If there is only one argument, the result is the absolute value.\n     *     If any argument is +Infinity or -Infinity, the result is +Infinity.\n     *     If any argument is NaN, the result is NaN.\n     *     If all arguments are either +0 or 鈭�0, the result is +0.\n     */\n    hypot(...values: number[] ): number;\n\n    /**\n     * Returns the integral part of the a numeric expression, x, removing any fractional digits.\n     * If x is already an integer, the result is x.\n     * @param x A numeric expression.\n     */\n    trunc(x: number): number;\n\n    /**\n     * Returns the nearest single precision float representation of a number.\n     * @param x A numeric expression.\n     */\n    fround(x: number): number;\n\n    /**\n     * Returns an implementation-dependent approximation to the cube root of number.\n     * @param x A numeric expression.\n     */\n    cbrt(x: number): number;\n}\n\ninterface NumberConstructor {\n    /**\n     * The value of Number.EPSILON is the difference between 1 and the smallest value greater than 1\n     * that is representable as a Number value, which is approximately:\n     * 2.2204460492503130808472633361816 x 10鈥嶁垝鈥�16.\n     */\n    readonly EPSILON: number;\n\n    /**\n     * Returns true if passed value is finite.\n     * Unlike the global isFinite, Number.isFinite doesn\'t forcibly convert the parameter to a\n     * number. Only finite values of the type number, result in true.\n     * @param number A numeric value.\n     */\n    isFinite(number: number): boolean;\n\n    /**\n     * Returns true if the value passed is an integer, false otherwise.\n     * @param number A numeric value.\n     */\n    isInteger(number: number): boolean;\n\n    /**\n     * Returns a Boolean value that indicates whether a value is the reserved value NaN (not a\n     * number). Unlike the global isNaN(), Number.isNaN() doesn\'t forcefully convert the parameter\n     * to a number. Only values of the type number, that are also NaN, result in true.\n     * @param number A numeric value.\n     */\n    isNaN(number: number): boolean;\n\n    /**\n     * Returns true if the value passed is a safe integer.\n     * @param number A numeric value.\n     */\n    isSafeInteger(number: number): boolean;\n\n    /**\n     * The value of the largest integer n such that n and n + 1 are both exactly representable as\n     * a Number value.\n     * The value of Number.MAX_SAFE_INTEGER is 9007199254740991 2^53 鈭� 1.\n     */\n    readonly MAX_SAFE_INTEGER: number;\n\n    /**\n     * The value of the smallest integer n such that n and n 鈭� 1 are both exactly representable as\n     * a Number value.\n     * The value of Number.MIN_SAFE_INTEGER is 鈭�9007199254740991 (鈭�(2^53 鈭� 1)).\n     */\n    readonly MIN_SAFE_INTEGER: number;\n\n    /**\n     * Converts a string to a floating-point number.\n     * @param string A string that contains a floating-point number.\n     */\n    parseFloat(string: string): number;\n\n    /**\n     * Converts A string to an integer.\n     * @param s A string to convert into a number.\n     * @param radix A value between 2 and 36 that specifies the base of the number in numString.\n     * If this argument is not supplied, strings with a prefix of \'0x\' are considered hexadecimal.\n     * All other strings are considered decimal.\n     */\n    parseInt(string: string, radix?: number): number;\n}\n\ninterface Object {\n    /**\n     * Determines whether an object has a property with the specified name.\n     * @param v A property name.\n     */\n    hasOwnProperty(v: PropertyKey): boolean;\n\n    /**\n     * Determines whether a specified property is enumerable.\n     * @param v A property name.\n     */\n    propertyIsEnumerable(v: PropertyKey): boolean;\n}\n\ninterface ObjectConstructor {\n    /**\n     * Copy the values of all of the enumerable own properties from one or more source objects to a\n     * target object. Returns the target object.\n     * @param target The target object to copy to.\n     * @param source The source object from which to copy properties.\n     */\n    assign<T, U>(target: T, source: U): T & U;\n\n    /**\n     * Copy the values of all of the enumerable own properties from one or more source objects to a\n     * target object. Returns the target object.\n     * @param target The target object to copy to.\n     * @param source1 The first source object from which to copy properties.\n     * @param source2 The second source object from which to copy properties.\n     */\n    assign<T, U, V>(target: T, source1: U, source2: V): T & U & V;\n\n    /**\n     * Copy the values of all of the enumerable own properties from one or more source objects to a\n     * target object. Returns the target object.\n     * @param target The target object to copy to.\n     * @param source1 The first source object from which to copy properties.\n     * @param source2 The second source object from which to copy properties.\n     * @param source3 The third source object from which to copy properties.\n     */\n    assign<T, U, V, W>(target: T, source1: U, source2: V, source3: W): T & U & V & W;\n\n    /**\n     * Copy the values of all of the enumerable own properties from one or more source objects to a\n     * target object. Returns the target object.\n     * @param target The target object to copy to.\n     * @param sources One or more source objects from which to copy properties\n     */\n    assign(target: object, ...sources: any[]): any;\n\n    /**\n     * Returns an array of all symbol properties found directly on object o.\n     * @param o Object to retrieve the symbols from.\n     */\n    getOwnPropertySymbols(o: any): symbol[];\n\n    /**\n     * Returns true if the values are the same value, false otherwise.\n     * @param value1 The first value.\n     * @param value2 The second value.\n     */\n    is(value1: any, value2: any): boolean;\n\n    /**\n     * Sets the prototype of a specified object o to  object proto or null. Returns the object o.\n     * @param o The object to change its prototype.\n     * @param proto The value of the new prototype or null.\n     */\n    setPrototypeOf(o: any, proto: object | null): any;\n\n    /**\n     * Gets the own property descriptor of the specified object.\n     * An own property descriptor is one that is defined directly on the object and is not\n     * inherited from the object\'s prototype.\n     * @param o Object that contains the property.\n     * @param p Name of the property.\n     */\n    getOwnPropertyDescriptor(o: any, propertyKey: PropertyKey): PropertyDescriptor;\n\n    /**\n     * Adds a property to an object, or modifies attributes of an existing property.\n     * @param o Object on which to add or modify the property. This can be a native JavaScript\n     * object (that is, a user-defined object or a built in object) or a DOM object.\n     * @param p The property name.\n     * @param attributes Descriptor for the property. It can be for a data property or an accessor\n     *  property.\n     */\n    defineProperty(o: any, propertyKey: PropertyKey, attributes: PropertyDescriptor): any;\n}\n\ninterface ReadonlyArray<T> {\n    /**\n     * Returns the value of the first element in the array where predicate is true, and undefined\n     * otherwise.\n     * @param predicate find calls predicate once for each element of the array, in ascending\n     * order, until it finds one where predicate returns true. If such an element is found, find\n     * immediately returns that element value. Otherwise, find returns undefined.\n     * @param thisArg If provided, it will be used as the this value for each invocation of\n     * predicate. If it is not provided, undefined is used instead.\n     */\n    find(predicate: (this: void, value: T, index: number, obj: ReadonlyArray<T>) => boolean): T | undefined;\n    find(predicate: (this: void, value: T, index: number, obj: ReadonlyArray<T>) => boolean, thisArg: undefined): T | undefined;\n    find<Z>(predicate: (this: Z, value: T, index: number, obj: ReadonlyArray<T>) => boolean, thisArg: Z): T | undefined;\n\n    /**\n     * Returns the index of the first element in the array where predicate is true, and -1\n     * otherwise.\n     * @param predicate find calls predicate once for each element of the array, in ascending\n     * order, until it finds one where predicate returns true. If such an element is found,\n     * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n     * @param thisArg If provided, it will be used as the this value for each invocation of\n     * predicate. If it is not provided, undefined is used instead.\n     */\n    findIndex(predicate: (this: void, value: T, index: number, obj: Array<T>) => boolean): number;\n    findIndex(predicate: (this: void, value: T, index: number, obj: Array<T>) => boolean, thisArg: undefined): number;\n    findIndex<Z>(predicate: (this: Z, value: T, index: number, obj: Array<T>) => boolean, thisArg: Z): number;\n}\n\ninterface RegExp {\n    /**\n     * Returns a string indicating the flags of the regular expression in question. This field is read-only.\n     * The characters in this string are sequenced and concatenated in the following order:\n     *\n     *    - "g" for global\n     *    - "i" for ignoreCase\n     *    - "m" for multiline\n     *    - "u" for unicode\n     *    - "y" for sticky\n     *\n     * If no flags are set, the value is the empty string.\n     */\n    readonly flags: string;\n\n    /**\n     * Returns a Boolean value indicating the state of the sticky flag (y) used with a regular\n     * expression. Default is false. Read-only.\n     */\n    readonly sticky: boolean;\n\n    /**\n     * Returns a Boolean value indicating the state of the Unicode flag (u) used with a regular\n     * expression. Default is false. Read-only.\n     */\n    readonly unicode: boolean;\n}\n\ninterface RegExpConstructor {\n    new (pattern: RegExp, flags?: string): RegExp;\n    (pattern: RegExp, flags?: string): RegExp;\n}\n\ninterface String {\n    /**\n     * Returns a nonnegative integer Number less than 1114112 (0x110000) that is the code point\n     * value of the UTF-16 encoded code point starting at the string element at position pos in\n     * the String resulting from converting this object to a String.\n     * If there is no element at that position, the result is undefined.\n     * If a valid UTF-16 surrogate pair does not begin at pos, the result is the code unit at pos.\n     */\n    codePointAt(pos: number): number | undefined;\n\n    /**\n     * Returns true if searchString appears as a substring of the result of converting this\n     * object to a String, at one or more positions that are\n     * greater than or equal to position; otherwise, returns false.\n     * @param searchString search string\n     * @param position If position is undefined, 0 is assumed, so as to search all of the String.\n     */\n    includes(searchString: string, position?: number): boolean;\n\n    /**\n     * Returns true if the sequence of elements of searchString converted to a String is the\n     * same as the corresponding elements of this object (converted to a String) starting at\n     * endPosition 鈥� length(this). Otherwise returns false.\n     */\n    endsWith(searchString: string, endPosition?: number): boolean;\n\n    /**\n     * Returns the String value result of normalizing the string into the normalization form\n     * named by form as specified in Unicode Standard Annex #15, Unicode Normalization Forms.\n     * @param form Applicable values: "NFC", "NFD", "NFKC", or "NFKD", If not specified default\n     * is "NFC"\n     */\n    normalize(form: "NFC" | "NFD" | "NFKC" | "NFKD"): string;\n\n    /**\n     * Returns the String value result of normalizing the string into the normalization form\n     * named by form as specified in Unicode Standard Annex #15, Unicode Normalization Forms.\n     * @param form Applicable values: "NFC", "NFD", "NFKC", or "NFKD", If not specified default\n     * is "NFC"\n     */\n    normalize(form?: string): string;\n\n    /**\n     * Returns a String value that is made from count copies appended together. If count is 0,\n     * T is the empty String is returned.\n     * @param count number of copies to append\n     */\n    repeat(count: number): string;\n\n    /**\n     * Returns true if the sequence of elements of searchString converted to a String is the\n     * same as the corresponding elements of this object (converted to a String) starting at\n     * position. Otherwise returns false.\n     */\n    startsWith(searchString: string, position?: number): boolean;\n\n    /**\n     * Returns an <a> HTML anchor element and sets the name attribute to the text value\n     * @param name\n     */\n    anchor(name: string): string;\n\n    /** Returns a <big> HTML element */\n    big(): string;\n\n    /** Returns a <blink> HTML element */\n    blink(): string;\n\n    /** Returns a <b> HTML element */\n    bold(): string;\n\n    /** Returns a <tt> HTML element */\n    fixed(): string;\n\n    /** Returns a <font> HTML element and sets the color attribute value */\n    fontcolor(color: string): string;\n\n    /** Returns a <font> HTML element and sets the size attribute value */\n    fontsize(size: number): string;\n\n    /** Returns a <font> HTML element and sets the size attribute value */\n    fontsize(size: string): string;\n\n    /** Returns an <i> HTML element */\n    italics(): string;\n\n    /** Returns an <a> HTML element and sets the href attribute value */\n    link(url: string): string;\n\n    /** Returns a <small> HTML element */\n    small(): string;\n\n    /** Returns a <strike> HTML element */\n    strike(): string;\n\n    /** Returns a <sub> HTML element */\n    sub(): string;\n\n    /** Returns a <sup> HTML element */\n    sup(): string;\n}\n\ninterface StringConstructor {\n    /**\n     * Return the String value whose elements are, in order, the elements in the List elements.\n     * If length is 0, the empty string is returned.\n     */\n    fromCodePoint(...codePoints: number[]): string;\n\n    /**\n     * String.raw is intended for use as a tag function of a Tagged Template String. When called\n     * as such the first argument will be a well formed template call site object and the rest\n     * parameter will contain the substitution values.\n     * @param template A well-formed template string call site representation.\n     * @param substitutions A set of substitution values.\n     */\n    raw(template: TemplateStringsArray, ...substitutions: any[]): string;\n}\n\n\ninterface Map<K, V> {\n    clear(): void;\n    delete(key: K): boolean;\n    forEach(callbackfn: (value: V, key: K, map: Map<K, V>) => void, thisArg?: any): void;\n    get(key: K): V | undefined;\n    has(key: K): boolean;\n    set(key: K, value: V): this;\n    readonly size: number;\n}\n\ninterface MapConstructor {\n    new (): Map<any, any>;\n    new <K, V>(entries?: [K, V][]): Map<K, V>;\n    readonly prototype: Map<any, any>;\n}\ndeclare var Map: MapConstructor;\n\ninterface ReadonlyMap<K, V> {\n    forEach(callbackfn: (value: V, key: K, map: ReadonlyMap<K, V>) => void, thisArg?: any): void;\n    get(key: K): V | undefined;\n    has(key: K): boolean;\n    readonly size: number;\n}\n\ninterface WeakMap<K extends object, V> {\n    delete(key: K): boolean;\n    get(key: K): V | undefined;\n    has(key: K): boolean;\n    set(key: K, value: V): this;\n}\n\ninterface WeakMapConstructor {\n    new (): WeakMap<object, any>;\n    new <K extends object, V>(entries?: [K, V][]): WeakMap<K, V>;\n    readonly prototype: WeakMap<object, any>;\n}\ndeclare var WeakMap: WeakMapConstructor;\n\ninterface Set<T> {\n    add(value: T): this;\n    clear(): void;\n    delete(value: T): boolean;\n    forEach(callbackfn: (value: T, value2: T, set: Set<T>) => void, thisArg?: any): void;\n    has(value: T): boolean;\n    readonly size: number;\n}\n\ninterface SetConstructor {\n    new (): Set<any>;\n    new <T>(values?: T[]): Set<T>;\n    readonly prototype: Set<any>;\n}\ndeclare var Set: SetConstructor;\n\ninterface ReadonlySet<T> {\n    forEach(callbackfn: (value: T, value2: T, set: ReadonlySet<T>) => void, thisArg?: any): void;\n    has(value: T): boolean;\n    readonly size: number;\n}\n\ninterface WeakSet<T> {\n    add(value: T): this;\n    delete(value: T): boolean;\n    has(value: T): boolean;\n}\n\ninterface WeakSetConstructor {\n    new (): WeakSet<object>;\n    new <T extends object>(values?: T[]): WeakSet<T>;\n    readonly prototype: WeakSet<object>;\n}\ndeclare var WeakSet: WeakSetConstructor;\n\n\ninterface Generator extends Iterator<any> { }\n\ninterface GeneratorFunction {\n    /**\n     * Creates a new Generator object.\n     * @param args A list of arguments the function accepts.\n     */\n    new (...args: any[]): Generator;\n    /**\n     * Creates a new Generator object.\n     * @param args A list of arguments the function accepts.\n     */\n    (...args: any[]): Generator;\n    /**\n     * The length of the arguments.\n     */\n    readonly length: number;\n    /**\n     * Returns the name of the function.\n     */\n    readonly name: string;\n    /**\n     * A reference to the prototype.\n     */\n    readonly prototype: Generator;\n}\n\ninterface GeneratorFunctionConstructor {\n    /**\n     * Creates a new Generator function.\n     * @param args A list of arguments the function accepts.\n     */\n    new (...args: string[]): GeneratorFunction;\n    /**\n     * Creates a new Generator function.\n     * @param args A list of arguments the function accepts.\n     */\n    (...args: string[]): GeneratorFunction;\n    /**\n     * The length of the arguments.\n     */\n    readonly length: number;\n    /**\n     * Returns the name of the function.\n     */\n    readonly name: string;\n    /**\n     * A reference to the prototype.\n     */\n    readonly prototype: GeneratorFunction;\n}\ndeclare var GeneratorFunction: GeneratorFunctionConstructor;\n\n\n/// <reference path="lib.es2015.symbol.d.ts" />\n\ninterface SymbolConstructor {\n    /**\n     * A method that returns the default iterator for an object. Called by the semantics of the\n     * for-of statement.\n     */\n    readonly iterator: symbol;\n}\n\ninterface IteratorResult<T> {\n    done: boolean;\n    value: T;\n}\n\ninterface Iterator<T> {\n    next(value?: any): IteratorResult<T>;\n    return?(value?: any): IteratorResult<T>;\n    throw?(e?: any): IteratorResult<T>;\n}\n\ninterface Iterable<T> {\n    [Symbol.iterator](): Iterator<T>;\n}\n\ninterface IterableIterator<T> extends Iterator<T> {\n    [Symbol.iterator](): IterableIterator<T>;\n}\n\ninterface Array<T> {\n    /** Iterator */\n    [Symbol.iterator](): IterableIterator<T>;\n\n    /**\n     * Returns an iterable of key, value pairs for every entry in the array\n     */\n    entries(): IterableIterator<[number, T]>;\n\n    /**\n     * Returns an iterable of keys in the array\n     */\n    keys(): IterableIterator<number>;\n\n    /**\n     * Returns an iterable of values in the array\n     */\n    values(): IterableIterator<T>;\n}\n\ninterface ArrayConstructor {\n    /**\n     * Creates an array from an iterable object.\n     * @param iterable An iterable object to convert to an array.\n     * @param mapfn A mapping function to call on every element of the array.\n     * @param thisArg Value of \'this\' used to invoke the mapfn.\n     */\n    from<T, U>(iterable: Iterable<T>, mapfn: (this: void, v: T, k: number) => U): Array<U>;\n    from<T, U>(iterable: Iterable<T>, mapfn: (this: void, v: T, k: number) => U, thisArg: undefined): Array<U>;\n    from<Z, T, U>(iterable: Iterable<T>, mapfn: (this: Z, v: T, k: number) => U, thisArg: Z): Array<U>;\n\n    /**\n     * Creates an array from an iterable object.\n     * @param iterable An iterable object to convert to an array.\n     */\n    from<T>(iterable: Iterable<T>): Array<T>;\n}\n\ninterface ReadonlyArray<T> {\n    /** Iterator of values in the array. */\n    [Symbol.iterator](): IterableIterator<T>;\n\n    /**\n     * Returns an iterable of key, value pairs for every entry in the array\n     */\n    entries(): IterableIterator<[number, T]>;\n\n    /**\n     * Returns an iterable of keys in the array\n     */\n    keys(): IterableIterator<number>;\n\n    /**\n     * Returns an iterable of values in the array\n     */\n    values(): IterableIterator<T>;\n}\n\ninterface IArguments {\n    /** Iterator */\n    [Symbol.iterator](): IterableIterator<any>;\n}\n\ninterface Map<K, V> {\n    /** Returns an iterable of entries in the map. */\n    [Symbol.iterator](): IterableIterator<[K, V]>;\n\n    /**\n     * Returns an iterable of key, value pairs for every entry in the map.\n     */\n    entries(): IterableIterator<[K, V]>;\n\n    /**\n     * Returns an iterable of keys in the map\n     */\n    keys(): IterableIterator<K>;\n\n    /**\n     * Returns an iterable of values in the map\n     */\n    values(): IterableIterator<V>;\n}\n\ninterface ReadonlyMap<K, V> {\n    /** Returns an iterable of entries in the map. */\n    [Symbol.iterator](): IterableIterator<[K, V]>;\n\n    /**\n     * Returns an iterable of key, value pairs for every entry in the map.\n     */\n    entries(): IterableIterator<[K, V]>;\n\n    /**\n     * Returns an iterable of keys in the map\n     */\n    keys(): IterableIterator<K>;\n\n    /**\n     * Returns an iterable of values in the map\n     */\n    values(): IterableIterator<V>;\n}\n\ninterface MapConstructor {\n    new <K, V>(iterable: Iterable<[K, V]>): Map<K, V>;\n}\n\ninterface WeakMap<K extends object, V> { }\n\ninterface WeakMapConstructor {\n    new <K extends object, V>(iterable: Iterable<[K, V]>): WeakMap<K, V>;\n}\n\ninterface Set<T> {\n    /** Iterates over values in the set. */\n    [Symbol.iterator](): IterableIterator<T>;\n    /**\n     * Returns an iterable of [v,v] pairs for every value `v` in the set.\n     */\n    entries(): IterableIterator<[T, T]>;\n    /**\n     * Despite its name, returns an iterable of the values in the set,\n     */\n    keys(): IterableIterator<T>;\n\n    /**\n     * Returns an iterable of values in the set.\n     */\n    values(): IterableIterator<T>;\n}\n\ninterface ReadonlySet<T> {\n    /** Iterates over values in the set. */\n    [Symbol.iterator](): IterableIterator<T>;\n\n    /**\n     * Returns an iterable of [v,v] pairs for every value `v` in the set.\n     */\n    entries(): IterableIterator<[T, T]>;\n\n    /**\n     * Despite its name, returns an iterable of the values in the set,\n     */\n    keys(): IterableIterator<T>;\n\n    /**\n     * Returns an iterable of values in the set.\n     */\n    values(): IterableIterator<T>;\n}\n\ninterface SetConstructor {\n    new <T>(iterable: Iterable<T>): Set<T>;\n}\n\ninterface WeakSet<T> { }\n\ninterface WeakSetConstructor {\n    new <T extends object>(iterable: Iterable<T>): WeakSet<T>;\n}\n\ninterface Promise<T> { }\n\ninterface PromiseConstructor {\n    /**\n     * Creates a Promise that is resolved with an array of results when all of the provided Promises\n     * resolve, or rejected when any Promise is rejected.\n     * @param values An array of Promises.\n     * @returns A new Promise.\n     */\n    all<TAll>(values: Iterable<TAll | PromiseLike<TAll>>): Promise<TAll[]>;\n\n    /**\n     * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved\n     * or rejected.\n     * @param values An array of Promises.\n     * @returns A new Promise.\n     */\n    race<T>(values: Iterable<T | PromiseLike<T>>): Promise<T>;\n}\n\ndeclare namespace Reflect {\n    function enumerate(target: object): IterableIterator<any>;\n}\n\ninterface String {\n    /** Iterator */\n    [Symbol.iterator](): IterableIterator<string>;\n}\n\n/**\n * A typed array of 8-bit integer values. The contents are initialized to 0. If the requested\n * number of bytes could not be allocated an exception is raised.\n */\ninterface Int8Array {\n    [Symbol.iterator](): IterableIterator<number>;\n    /**\n     * Returns an array of key, value pairs for every entry in the array\n     */\n    entries(): IterableIterator<[number, number]>;\n    /**\n     * Returns an list of keys in the array\n     */\n    keys(): IterableIterator<number>;\n    /**\n     * Returns an list of values in the array\n     */\n    values(): IterableIterator<number>;\n}\n\ninterface Int8ArrayConstructor {\n    new (elements: Iterable<number>): Int8Array;\n\n    /**\n     * Creates an array from an array-like or iterable object.\n     * @param arrayLike An array-like or iterable object to convert to an array.\n     * @param mapfn A mapping function to call on every element of the array.\n     * @param thisArg Value of \'this\' used to invoke the mapfn.\n     */\n    from(arrayLike: Iterable<number>, mapfn: (this: void, v: number, k: number) => number): Int8Array;\n    from(arrayLike: Iterable<number>, mapfn: (this: void, v: number, k: number) => number, thisArg: undefined): Int8Array;\n    from<Z>(arrayLike: Iterable<number>, mapfn: (this: Z, v: number, k: number) => number, thisArg: Z): Int8Array;\n\n    from(arrayLike: Iterable<number>): Int8Array;\n}\n\n/**\n * A typed array of 8-bit unsigned integer values. The contents are initialized to 0. If the\n * requested number of bytes could not be allocated an exception is raised.\n */\ninterface Uint8Array {\n    [Symbol.iterator](): IterableIterator<number>;\n    /**\n     * Returns an array of key, value pairs for every entry in the array\n     */\n    entries(): IterableIterator<[number, number]>;\n    /**\n     * Returns an list of keys in the array\n     */\n    keys(): IterableIterator<number>;\n    /**\n     * Returns an list of values in the array\n     */\n    values(): IterableIterator<number>;\n}\n\ninterface Uint8ArrayConstructor {\n    new (elements: Iterable<number>): Uint8Array;\n\n    /**\n     * Creates an array from an array-like or iterable object.\n     * @param arrayLike An array-like or iterable object to convert to an array.\n     * @param mapfn A mapping function to call on every element of the array.\n     * @param thisArg Value of \'this\' used to invoke the mapfn.\n     */\n    from(arrayLike: Iterable<number>, mapfn: (this: void, v: number, k: number) => number): Uint8Array;\n    from(arrayLike: Iterable<number>, mapfn: (this: void, v: number, k: number) => number, thisArg: undefined): Uint8Array;\n    from<Z>(arrayLike: Iterable<number>, mapfn: (this: Z, v: number, k: number) => number, thisArg: Z): Uint8Array;\n\n    from(arrayLike: Iterable<number>): Uint8Array;\n}\n\n/**\n * A typed array of 8-bit unsigned integer (clamped) values. The contents are initialized to 0.\n * If the requested number of bytes could not be allocated an exception is raised.\n */\ninterface Uint8ClampedArray {\n    [Symbol.iterator](): IterableIterator<number>;\n    /**\n     * Returns an array of key, value pairs for every entry in the array\n     */\n    entries(): IterableIterator<[number, number]>;\n\n    /**\n     * Returns an list of keys in the array\n     */\n    keys(): IterableIterator<number>;\n\n    /**\n     * Returns an list of values in the array\n     */\n    values(): IterableIterator<number>;\n}\n\ninterface Uint8ClampedArrayConstructor {\n    new (elements: Iterable<number>): Uint8ClampedArray;\n\n\n    /**\n     * Creates an array from an array-like or iterable object.\n     * @param arrayLike An array-like or iterable object to convert to an array.\n     * @param mapfn A mapping function to call on every element of the array.\n     * @param thisArg Value of \'this\' used to invoke the mapfn.\n     */\n    from(arrayLike: Iterable<number>, mapfn: (this: void, v: number, k: number) => number): Uint8ClampedArray;\n    from(arrayLike: Iterable<number>, mapfn: (this: void, v: number, k: number) => number, thisArg: undefined): Uint8ClampedArray;\n    from<Z>(arrayLike: Iterable<number>, mapfn: (this: Z, v: number, k: number) => number, thisArg: Z): Uint8ClampedArray;\n\n    from(arrayLike: Iterable<number>): Uint8ClampedArray;\n}\n\n/**\n * A typed array of 16-bit signed integer values. The contents are initialized to 0. If the\n * requested number of bytes could not be allocated an exception is raised.\n */\ninterface Int16Array {\n    [Symbol.iterator](): IterableIterator<number>;\n    /**\n     * Returns an array of key, value pairs for every entry in the array\n     */\n    entries(): IterableIterator<[number, number]>;\n\n    /**\n     * Returns an list of keys in the array\n     */\n    keys(): IterableIterator<number>;\n\n    /**\n     * Returns an list of values in the array\n     */\n    values(): IterableIterator<number>;\n}\n\ninterface Int16ArrayConstructor {\n    new (elements: Iterable<number>): Int16Array;\n\n    /**\n     * Creates an array from an array-like or iterable object.\n     * @param arrayLike An array-like or iterable object to convert to an array.\n     * @param mapfn A mapping function to call on every element of the array.\n     * @param thisArg Value of \'this\' used to invoke the mapfn.\n     */\n    from(arrayLike: Iterable<number>, mapfn: (this: void, v: number, k: number) => number): Int16Array;\n    from(arrayLike: Iterable<number>, mapfn: (this: void, v: number, k: number) => number, thisArg: undefined): Int16Array;\n    from<Z>(arrayLike: Iterable<number>, mapfn: (this: Z, v: number, k: number) => number, thisArg: Z): Int16Array;\n\n    from(arrayLike: Iterable<number>): Int16Array;\n}\n\n/**\n * A typed array of 16-bit unsigned integer values. The contents are initialized to 0. If the\n * requested number of bytes could not be allocated an exception is raised.\n */\ninterface Uint16Array {\n    [Symbol.iterator](): IterableIterator<number>;\n    /**\n     * Returns an array of key, value pairs for every entry in the array\n     */\n    entries(): IterableIterator<[number, number]>;\n    /**\n     * Returns an list of keys in the array\n     */\n    keys(): IterableIterator<number>;\n    /**\n     * Returns an list of values in the array\n     */\n    values(): IterableIterator<number>;\n}\n\ninterface Uint16ArrayConstructor {\n    new (elements: Iterable<number>): Uint16Array;\n\n    /**\n     * Creates an array from an array-like or iterable object.\n     * @param arrayLike An array-like or iterable object to convert to an array.\n     * @param mapfn A mapping function to call on every element of the array.\n     * @param thisArg Value of \'this\' used to invoke the mapfn.\n     */\n    from(arrayLike: Iterable<number>, mapfn: (this: void, v: number, k: number) => number): Uint16Array;\n    from(arrayLike: Iterable<number>, mapfn: (this: void, v: number, k: number) => number, thisArg: undefined): Uint16Array;\n    from<Z>(arrayLike: Iterable<number>, mapfn: (this: Z, v: number, k: number) => number, thisArg: Z): Uint16Array;\n\n    from(arrayLike: Iterable<number>): Uint16Array;\n}\n\n/**\n * A typed array of 32-bit signed integer values. The contents are initialized to 0. If the\n * requested number of bytes could not be allocated an exception is raised.\n */\ninterface Int32Array {\n    [Symbol.iterator](): IterableIterator<number>;\n    /**\n     * Returns an array of key, value pairs for every entry in the array\n     */\n    entries(): IterableIterator<[number, number]>;\n    /**\n     * Returns an list of keys in the array\n     */\n    keys(): IterableIterator<number>;\n    /**\n     * Returns an list of values in the array\n     */\n    values(): IterableIterator<number>;\n}\n\ninterface Int32ArrayConstructor {\n    new (elements: Iterable<number>): Int32Array;\n\n    /**\n     * Creates an array from an array-like or iterable object.\n     * @param arrayLike An array-like or iterable object to convert to an array.\n     * @param mapfn A mapping function to call on every element of the array.\n     * @param thisArg Value of \'this\' used to invoke the mapfn.\n     */\n    from(arrayLike: Iterable<number>, mapfn: (this: void, v: number, k: number) => number): Int32Array;\n    from(arrayLike: Iterable<number>, mapfn: (this: void, v: number, k: number) => number, thisArg: undefined): Int32Array;\n    from<Z>(arrayLike: Iterable<number>, mapfn: (this: Z, v: number, k: number) => number, thisArg: Z): Int32Array;\n\n    from(arrayLike: Iterable<number>): Int32Array;\n}\n\n/**\n * A typed array of 32-bit unsigned integer values. The contents are initialized to 0. If the\n * requested number of bytes could not be allocated an exception is raised.\n */\ninterface Uint32Array {\n    [Symbol.iterator](): IterableIterator<number>;\n    /**\n     * Returns an array of key, value pairs for every entry in the array\n     */\n    entries(): IterableIterator<[number, number]>;\n    /**\n     * Returns an list of keys in the array\n     */\n    keys(): IterableIterator<number>;\n    /**\n     * Returns an list of values in the array\n     */\n    values(): IterableIterator<number>;\n}\n\ninterface Uint32ArrayConstructor {\n    new (elements: Iterable<number>): Uint32Array;\n\n    /**\n     * Creates an array from an array-like or iterable object.\n     * @param arrayLike An array-like or iterable object to convert to an array.\n     * @param mapfn A mapping function to call on every element of the array.\n     * @param thisArg Value of \'this\' used to invoke the mapfn.\n     */\n    from(arrayLike: Iterable<number>, mapfn: (this: void, v: number, k: number) => number): Uint32Array;\n    from(arrayLike: Iterable<number>, mapfn: (this: void, v: number, k: number) => number, thisArg: undefined): Uint32Array;\n    from<Z>(arrayLike: Iterable<number>, mapfn: (this: Z, v: number, k: number) => number, thisArg: Z): Uint32Array;\n\n    from(arrayLike: Iterable<number>): Uint32Array;\n}\n\n/**\n * A typed array of 32-bit float values. The contents are initialized to 0. If the requested number\n * of bytes could not be allocated an exception is raised.\n */\ninterface Float32Array {\n    [Symbol.iterator](): IterableIterator<number>;\n    /**\n     * Returns an array of key, value pairs for every entry in the array\n     */\n    entries(): IterableIterator<[number, number]>;\n    /**\n     * Returns an list of keys in the array\n     */\n    keys(): IterableIterator<number>;\n    /**\n     * Returns an list of values in the array\n     */\n    values(): IterableIterator<number>;\n}\n\ninterface Float32ArrayConstructor {\n    new (elements: Iterable<number>): Float32Array;\n\n    /**\n     * Creates an array from an array-like or iterable object.\n     * @param arrayLike An array-like or iterable object to convert to an array.\n     * @param mapfn A mapping function to call on every element of the array.\n     * @param thisArg Value of \'this\' used to invoke the mapfn.\n     */\n    from(arrayLike: Iterable<number>, mapfn: (this: void, v: number, k: number) => number): Float32Array;\n    from(arrayLike: Iterable<number>, mapfn: (this: void, v: number, k: number) => number, thisArg: undefined): Float32Array;\n    from<Z>(arrayLike: Iterable<number>, mapfn: (this: Z, v: number, k: number) => number, thisArg: Z): Float32Array;\n\n    from(arrayLike: Iterable<number>): Float32Array;\n}\n\n/**\n * A typed array of 64-bit float values. The contents are initialized to 0. If the requested\n * number of bytes could not be allocated an exception is raised.\n */\ninterface Float64Array {\n    [Symbol.iterator](): IterableIterator<number>;\n    /**\n     * Returns an array of key, value pairs for every entry in the array\n     */\n    entries(): IterableIterator<[number, number]>;\n    /**\n     * Returns an list of keys in the array\n     */\n    keys(): IterableIterator<number>;\n    /**\n     * Returns an list of values in the array\n     */\n    values(): IterableIterator<number>;\n}\n\ninterface Float64ArrayConstructor {\n    new (elements: Iterable<number>): Float64Array;\n\n    /**\n     * Creates an array from an array-like or iterable object.\n     * @param arrayLike An array-like or iterable object to convert to an array.\n     * @param mapfn A mapping function to call on every element of the array.\n     * @param thisArg Value of \'this\' used to invoke the mapfn.\n     */\n    from(arrayLike: Iterable<number>, mapfn: (this: void, v: number, k: number) => number): Float64Array;\n    from(arrayLike: Iterable<number>, mapfn: (this: void, v: number, k: number) => number, thisArg: undefined): Float64Array;\n    from<Z>(arrayLike: Iterable<number>, mapfn: (this: Z, v: number, k: number) => number, thisArg: Z): Float64Array;\n\n    from(arrayLike: Iterable<number>): Float64Array;\n}\n\n\ninterface PromiseConstructor {\n    /**\n     * A reference to the prototype.\n     */\n    readonly prototype: Promise<any>;\n\n    /**\n     * Creates a new Promise.\n     * @param executor A callback used to initialize the promise. This callback is passed two arguments:\n     * a resolve callback used resolve the promise with a value or the result of another promise,\n     * and a reject callback used to reject the promise with a provided reason or error.\n     */\n    new <T>(executor: (resolve: (value?: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void): Promise<T>;\n\n    /**\n     * Creates a Promise that is resolved with an array of results when all of the provided Promises\n     * resolve, or rejected when any Promise is rejected.\n     * @param values An array of Promises.\n     * @returns A new Promise.\n     */\n    all<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike <T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>, T7 | PromiseLike<T7>, T8 | PromiseLike<T8>, T9 | PromiseLike<T9>, T10 | PromiseLike<T10>]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]>;\n\n    /**\n     * Creates a Promise that is resolved with an array of results when all of the provided Promises\n     * resolve, or rejected when any Promise is rejected.\n     * @param values An array of Promises.\n     * @returns A new Promise.\n     */\n    all<T1, T2, T3, T4, T5, T6, T7, T8, T9>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike <T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>, T7 | PromiseLike<T7>, T8 | PromiseLike<T8>, T9 | PromiseLike<T9>]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8, T9]>;\n\n    /**\n     * Creates a Promise that is resolved with an array of results when all of the provided Promises\n     * resolve, or rejected when any Promise is rejected.\n     * @param values An array of Promises.\n     * @returns A new Promise.\n     */\n    all<T1, T2, T3, T4, T5, T6, T7, T8>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike <T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>, T7 | PromiseLike<T7>, T8 | PromiseLike<T8>]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8]>;\n\n    /**\n     * Creates a Promise that is resolved with an array of results when all of the provided Promises\n     * resolve, or rejected when any Promise is rejected.\n     * @param values An array of Promises.\n     * @returns A new Promise.\n     */\n    all<T1, T2, T3, T4, T5, T6, T7>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike <T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>, T7 | PromiseLike<T7>]): Promise<[T1, T2, T3, T4, T5, T6, T7]>;\n\n    /**\n     * Creates a Promise that is resolved with an array of results when all of the provided Promises\n     * resolve, or rejected when any Promise is rejected.\n     * @param values An array of Promises.\n     * @returns A new Promise.\n     */\n    all<T1, T2, T3, T4, T5, T6>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike <T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>]): Promise<[T1, T2, T3, T4, T5, T6]>;\n\n    /**\n     * Creates a Promise that is resolved with an array of results when all of the provided Promises\n     * resolve, or rejected when any Promise is rejected.\n     * @param values An array of Promises.\n     * @returns A new Promise.\n     */\n    all<T1, T2, T3, T4, T5>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike <T4>, T5 | PromiseLike<T5>]): Promise<[T1, T2, T3, T4, T5]>;\n\n    /**\n     * Creates a Promise that is resolved with an array of results when all of the provided Promises\n     * resolve, or rejected when any Promise is rejected.\n     * @param values An array of Promises.\n     * @returns A new Promise.\n     */\n    all<T1, T2, T3, T4>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike <T4>]): Promise<[T1, T2, T3, T4]>;\n\n    /**\n     * Creates a Promise that is resolved with an array of results when all of the provided Promises\n     * resolve, or rejected when any Promise is rejected.\n     * @param values An array of Promises.\n     * @returns A new Promise.\n     */\n    all<T1, T2, T3>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>]): Promise<[T1, T2, T3]>;\n\n    /**\n     * Creates a Promise that is resolved with an array of results when all of the provided Promises\n     * resolve, or rejected when any Promise is rejected.\n     * @param values An array of Promises.\n     * @returns A new Promise.\n     */\n    all<T1, T2>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>]): Promise<[T1, T2]>;\n\n    /**\n     * Creates a Promise that is resolved with an array of results when all of the provided Promises\n     * resolve, or rejected when any Promise is rejected.\n     * @param values An array of Promises.\n     * @returns A new Promise.\n     */\n    all<T>(values: (T | PromiseLike<T>)[]): Promise<T[]>;\n\n    /**\n     * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved\n     * or rejected.\n     * @param values An array of Promises.\n     * @returns A new Promise.\n     */\n    race<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>, T7 | PromiseLike<T7>, T8 | PromiseLike<T8>, T9 | PromiseLike<T9>, T10 | PromiseLike<T10>]): Promise<T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8 | T9 | T10>;\n\n    /**\n     * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved\n     * or rejected.\n     * @param values An array of Promises.\n     * @returns A new Promise.\n     */\n    race<T1, T2, T3, T4, T5, T6, T7, T8, T9>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>, T7 | PromiseLike<T7>, T8 | PromiseLike<T8>, T9 | PromiseLike<T9>]): Promise<T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8 | T9>;\n\n    /**\n     * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved\n     * or rejected.\n     * @param values An array of Promises.\n     * @returns A new Promise.\n     */\n    race<T1, T2, T3, T4, T5, T6, T7, T8>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>, T7 | PromiseLike<T7>, T8 | PromiseLike<T8>]): Promise<T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8>;\n\n    /**\n     * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved\n     * or rejected.\n     * @param values An array of Promises.\n     * @returns A new Promise.\n     */\n    race<T1, T2, T3, T4, T5, T6, T7>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>, T7 | PromiseLike<T7>]): Promise<T1 | T2 | T3 | T4 | T5 | T6 | T7>;\n\n    /**\n     * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved\n     * or rejected.\n     * @param values An array of Promises.\n     * @returns A new Promise.\n     */\n    race<T1, T2, T3, T4, T5, T6>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>]): Promise<T1 | T2 | T3 | T4 | T5 | T6>;\n\n    /**\n     * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved\n     * or rejected.\n     * @param values An array of Promises.\n     * @returns A new Promise.\n     */\n    race<T1, T2, T3, T4, T5>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>, T5 | PromiseLike<T5>]): Promise<T1 | T2 | T3 | T4 | T5>;\n\n    /**\n     * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved\n     * or rejected.\n     * @param values An array of Promises.\n     * @returns A new Promise.\n     */\n    race<T1, T2, T3, T4>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>]): Promise<T1 | T2 | T3 | T4>;\n\n    /**\n     * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved\n     * or rejected.\n     * @param values An array of Promises.\n     * @returns A new Promise.\n     */\n    race<T1, T2, T3>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>]): Promise<T1 | T2 | T3>;\n\n    /**\n     * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved\n     * or rejected.\n     * @param values An array of Promises.\n     * @returns A new Promise.\n     */\n    race<T1, T2>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>]): Promise<T1 | T2>;\n\n    /**\n     * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved\n     * or rejected.\n     * @param values An array of Promises.\n     * @returns A new Promise.\n     */\n    race<T>(values: (T | PromiseLike<T>)[]): Promise<T>;\n\n    /**\n     * Creates a new rejected promise for the provided reason.\n     * @param reason The reason the promise was rejected.\n     * @returns A new rejected Promise.\n     */\n    reject(reason: any): Promise<never>;\n\n    /**\n     * Creates a new rejected promise for the provided reason.\n     * @param reason The reason the promise was rejected.\n     * @returns A new rejected Promise.\n     */\n    reject<T>(reason: any): Promise<T>;\n\n    /**\n     * Creates a new resolved promise for the provided value.\n     * @param value A promise.\n     * @returns A promise whose internal state matches the provided promise.\n     */\n    resolve<T>(value: T | PromiseLike<T>): Promise<T>;\n\n    /**\n     * Creates a new resolved promise .\n     * @returns A resolved promise.\n     */\n    resolve(): Promise<void>;\n}\n\ndeclare var Promise: PromiseConstructor;\n\ninterface ProxyHandler<T extends object> {\n    getPrototypeOf? (target: T): object | null;\n    setPrototypeOf? (target: T, v: any): boolean;\n    isExtensible? (target: T): boolean;\n    preventExtensions? (target: T): boolean;\n    getOwnPropertyDescriptor? (target: T, p: PropertyKey): PropertyDescriptor | undefined;\n    has? (target: T, p: PropertyKey): boolean;\n    get? (target: T, p: PropertyKey, receiver: any): any;\n    set? (target: T, p: PropertyKey, value: any, receiver: any): boolean;\n    deleteProperty? (target: T, p: PropertyKey): boolean;\n    defineProperty? (target: T, p: PropertyKey, attributes: PropertyDescriptor): boolean;\n    enumerate? (target: T): PropertyKey[];\n    ownKeys? (target: T): PropertyKey[];\n    apply? (target: T, thisArg: any, argArray?: any): any;\n    construct? (target: T, argArray: any, newTarget?: any): object;\n}\n\ninterface ProxyConstructor {\n    revocable<T extends object>(target: T, handler: ProxyHandler<T>): { proxy: T; revoke: () => void; };\n    new <T extends object>(target: T, handler: ProxyHandler<T>): T;\n}\ndeclare var Proxy: ProxyConstructor;\n\n\ndeclare namespace Reflect {\n    function apply(target: Function, thisArgument: any, argumentsList: ArrayLike<any>): any;\n    function construct(target: Function, argumentsList: ArrayLike<any>, newTarget?: any): any;\n    function defineProperty(target: object, propertyKey: PropertyKey, attributes: PropertyDescriptor): boolean;\n    function deleteProperty(target: object, propertyKey: PropertyKey): boolean;\n    function get(target: object, propertyKey: PropertyKey, receiver?: any): any;\n    function getOwnPropertyDescriptor(target: object, propertyKey: PropertyKey): PropertyDescriptor;\n    function getPrototypeOf(target: object): object;\n    function has(target: object, propertyKey: PropertyKey): boolean;\n    function isExtensible(target: object): boolean;\n    function ownKeys(target: object): Array<PropertyKey>;\n    function preventExtensions(target: object): boolean;\n    function set(target: object, propertyKey: PropertyKey, value: any, receiver?: any): boolean;\n    function setPrototypeOf(target: object, proto: any): boolean;\n}\n\n\ninterface Symbol {\n    /** Returns a string representation of an object. */\n    toString(): string;\n\n    /** Returns the primitive value of the specified object. */\n    valueOf(): symbol;\n}\n\ninterface SymbolConstructor {\n    /**\n     * A reference to the prototype.\n     */\n    readonly prototype: Symbol;\n\n    /**\n     * Returns a new unique Symbol value.\n     * @param  description Description of the new Symbol object.\n     */\n    (description?: string | number): symbol;\n\n    /**\n     * Returns a Symbol object from the global symbol registry matching the given key if found.\n     * Otherwise, returns a new symbol with this key.\n     * @param key key to search for.\n     */\n    for(key: string): symbol;\n\n    /**\n     * Returns a key from the global symbol registry matching the given Symbol if found.\n     * Otherwise, returns a undefined.\n     * @param sym Symbol to find the key for.\n     */\n    keyFor(sym: symbol): string | undefined;\n}\n\ndeclare var Symbol: SymbolConstructor;\n\n/// <reference path="lib.es2015.symbol.d.ts" />\n\ninterface SymbolConstructor {\n    /**\n     * A method that determines if a constructor object recognizes an object as one of the\n     * constructor鈥檚 instances. Called by the semantics of the instanceof operator.\n     */\n    readonly hasInstance: symbol;\n\n    /**\n     * A Boolean value that if true indicates that an object should flatten to its array elements\n     * by Array.prototype.concat.\n     */\n    readonly isConcatSpreadable: symbol;\n\n    /**\n     * A regular expression method that matches the regular expression against a string. Called\n     * by the String.prototype.match method.\n     */\n    readonly match: symbol;\n\n    /**\n     * A regular expression method that replaces matched substrings of a string. Called by the\n     * String.prototype.replace method.\n     */\n    readonly replace: symbol;\n\n    /**\n     * A regular expression method that returns the index within a string that matches the\n     * regular expression. Called by the String.prototype.search method.\n     */\n    readonly search: symbol;\n\n    /**\n     * A function valued property that is the constructor function that is used to create\n     * derived objects.\n     */\n    readonly species: symbol;\n\n    /**\n     * A regular expression method that splits a string at the indices that match the regular\n     * expression. Called by the String.prototype.split method.\n     */\n    readonly split: symbol;\n\n    /**\n     * A method that converts an object to a corresponding primitive value.\n     * Called by the ToPrimitive abstract operation.\n     */\n    readonly toPrimitive: symbol;\n\n    /**\n     * A String value that is used in the creation of the default string description of an object.\n     * Called by the built-in method Object.prototype.toString.\n     */\n    readonly toStringTag: symbol;\n\n    /**\n     * An Object whose own property names are property names that are excluded from the \'with\'\n     * environment bindings of the associated objects.\n     */\n    readonly unscopables: symbol;\n}\n\ninterface Symbol {\n    readonly [Symbol.toStringTag]: "Symbol";\n}\n\ninterface Array<T> {\n    /**\n     * Returns an object whose properties have the value \'true\'\n     * when they will be absent when used in a \'with\' statement.\n     */\n    [Symbol.unscopables](): {\n        copyWithin: boolean;\n        entries: boolean;\n        fill: boolean;\n        find: boolean;\n        findIndex: boolean;\n        keys: boolean;\n        values: boolean;\n    };\n}\n\ninterface Date {\n    /**\n     * Converts a Date object to a string.\n     */\n    [Symbol.toPrimitive](hint: "default"): string;\n    /**\n     * Converts a Date object to a string.\n     */\n    [Symbol.toPrimitive](hint: "string"): string;\n    /**\n     * Converts a Date object to a number.\n     */\n    [Symbol.toPrimitive](hint: "number"): number;\n    /**\n     * Converts a Date object to a string or number.\n     *\n     * @param hint The strings "number", "string", or "default" to specify what primitive to return.\n     *\n     * @throws {TypeError} If \'hint\' was given something other than "number", "string", or "default".\n     * @returns A number if \'hint\' was "number", a string if \'hint\' was "string" or "default".\n     */\n    [Symbol.toPrimitive](hint: string): string | number;\n}\n\ninterface Map<K, V> {\n    readonly [Symbol.toStringTag]: "Map";\n}\n\ninterface WeakMap<K extends object, V>{\n    readonly [Symbol.toStringTag]: "WeakMap";\n}\n\ninterface Set<T> {\n    readonly [Symbol.toStringTag]: "Set";\n}\n\ninterface WeakSet<T> {\n    readonly [Symbol.toStringTag]: "WeakSet";\n}\n\ninterface JSON {\n    readonly [Symbol.toStringTag]: "JSON";\n}\n\ninterface Function {\n    /**\n     * Determines whether the given value inherits from this function if this function was used\n     * as a constructor function.\n     *\n     * A constructor function can control which objects are recognized as its instances by\n     * \'instanceof\' by overriding this method.\n     */\n    [Symbol.hasInstance](value: any): boolean;\n}\n\ninterface GeneratorFunction {\n    readonly [Symbol.toStringTag]: "GeneratorFunction";\n}\n\ninterface Math {\n    readonly [Symbol.toStringTag]: "Math";\n}\n\ninterface Promise<T> {\n    readonly [Symbol.toStringTag]: "Promise";\n}\n\ninterface PromiseConstructor {\n    readonly [Symbol.species]: Function;\n}\n\ninterface RegExp {\n    /**\n     * Matches a string with this regular expression, and returns an array containing the results of\n     * that search.\n     * @param string A string to search within.\n     */\n    [Symbol.match](string: string): RegExpMatchArray | null;\n\n    /**\n     * Replaces text in a string, using this regular expression.\n     * @param string A String object or string literal whose contents matching against\n     *               this regular expression will be replaced\n     * @param replaceValue A String object or string literal containing the text to replace for every\n     *                     successful match of this regular expression.\n     */\n    [Symbol.replace](string: string, replaceValue: string): string;\n\n    /**\n     * Replaces text in a string, using this regular expression.\n     * @param string A String object or string literal whose contents matching against\n     *               this regular expression will be replaced\n     * @param replacer A function that returns the replacement text.\n     */\n    [Symbol.replace](string: string, replacer: (substring: string, ...args: any[]) => string): string;\n\n    /**\n     * Finds the position beginning first substring match in a regular expression search\n     * using this regular expression.\n     *\n     * @param string The string to search within.\n     */\n    [Symbol.search](string: string): number;\n\n    /**\n     * Returns an array of substrings that were delimited by strings in the original input that\n     * match against this regular expression.\n     *\n     * If the regular expression contains capturing parentheses, then each time this\n     * regular expression matches, the results (including any undefined results) of the\n     * capturing parentheses are spliced.\n     *\n     * @param string string value to split\n     * @param limit if not undefined, the output array is truncated so that it contains no more\n     * than \'limit\' elements.\n     */\n    [Symbol.split](string: string, limit?: number): string[];\n}\n\ninterface RegExpConstructor {\n    [Symbol.species](): RegExpConstructor;\n}\n\ninterface String {\n    /**\n     * Matches a string an object that supports being matched against, and returns an array containing the results of that search.\n     * @param matcher An object that supports being matched against.\n     */\n    match(matcher: { [Symbol.match](string: string): RegExpMatchArray | null; }): RegExpMatchArray | null;\n\n    /**\n     * Replaces text in a string, using an object that supports replacement within a string.\n     * @param searchValue A object can search for and replace matches within a string.\n     * @param replaceValue A string containing the text to replace for every successful match of searchValue in this string.\n     */\n    replace(searchValue: { [Symbol.replace](string: string, replaceValue: string): string; }, replaceValue: string): string;\n\n    /**\n     * Replaces text in a string, using an object that supports replacement within a string.\n     * @param searchValue A object can search for and replace matches within a string.\n     * @param replacer A function that returns the replacement text.\n     */\n    replace(searchValue: { [Symbol.replace](string: string, replacer: (substring: string, ...args: any[]) => string): string; }, replacer: (substring: string, ...args: any[]) => string): string;\n\n    /**\n     * Finds the first substring match in a regular expression search.\n     * @param searcher An object which supports searching within a string.\n     */\n    search(searcher: { [Symbol.search](string: string): number; }): number;\n\n    /**\n     * Split a string into substrings using the specified separator and return them as an array.\n     * @param splitter An object that can split a string.\n     * @param limit A value used to limit the number of elements returned in the array.\n     */\n    split(splitter: { [Symbol.split](string: string, limit?: number): string[]; }, limit?: number): string[];\n}\n\n/**\n * Represents a raw buffer of binary data, which is used to store data for the\n * different typed arrays. ArrayBuffers cannot be read from or written to directly,\n * but can be passed to a typed array or DataView Object to interpret the raw\n * buffer as needed.\n */\ninterface ArrayBuffer {\n    readonly [Symbol.toStringTag]: "ArrayBuffer";\n}\n\ninterface DataView {\n    readonly [Symbol.toStringTag]: "DataView";\n}\n\n/**\n * A typed array of 8-bit integer values. The contents are initialized to 0. If the requested\n * number of bytes could not be allocated an exception is raised.\n */\ninterface Int8Array {\n    readonly [Symbol.toStringTag]: "Int8Array";\n}\n\n/**\n * A typed array of 8-bit unsigned integer values. The contents are initialized to 0. If the\n * requested number of bytes could not be allocated an exception is raised.\n */\ninterface Uint8Array {\n    readonly [Symbol.toStringTag]: "UInt8Array";\n}\n\n/**\n * A typed array of 8-bit unsigned integer (clamped) values. The contents are initialized to 0.\n * If the requested number of bytes could not be allocated an exception is raised.\n */\ninterface Uint8ClampedArray {\n    readonly [Symbol.toStringTag]: "Uint8ClampedArray";\n}\n\n/**\n * A typed array of 16-bit signed integer values. The contents are initialized to 0. If the\n * requested number of bytes could not be allocated an exception is raised.\n */\ninterface Int16Array {\n    readonly [Symbol.toStringTag]: "Int16Array";\n}\n\n/**\n * A typed array of 16-bit unsigned integer values. The contents are initialized to 0. If the\n * requested number of bytes could not be allocated an exception is raised.\n */\ninterface Uint16Array {\n    readonly [Symbol.toStringTag]: "Uint16Array";\n}\n\n/**\n * A typed array of 32-bit signed integer values. The contents are initialized to 0. If the\n * requested number of bytes could not be allocated an exception is raised.\n */\ninterface Int32Array {\n    readonly [Symbol.toStringTag]: "Int32Array";\n}\n\n/**\n * A typed array of 32-bit unsigned integer values. The contents are initialized to 0. If the\n * requested number of bytes could not be allocated an exception is raised.\n */\ninterface Uint32Array {\n    readonly [Symbol.toStringTag]: "Uint32Array";\n}\n\n/**\n * A typed array of 32-bit float values. The contents are initialized to 0. If the requested number\n * of bytes could not be allocated an exception is raised.\n */\ninterface Float32Array {\n    readonly [Symbol.toStringTag]: "Float32Array";\n}\n\n/**\n * A typed array of 64-bit float values. The contents are initialized to 0. If the requested\n * number of bytes could not be allocated an exception is raised.\n */\ninterface Float64Array {\n    readonly [Symbol.toStringTag]: "Float64Array";\n}\n\n\n\n/////////////////////////////\n/// DOM APIs\n/////////////////////////////\n\ninterface Account {\n    displayName?: string;\n    id?: string;\n    imageURL?: string;\n    name?: string;\n    rpDisplayName?: string;\n}\n\ninterface Algorithm {\n    name: string;\n}\n\ninterface AnimationEventInit extends EventInit {\n    animationName?: string;\n    elapsedTime?: number;\n}\n\ninterface AssertionOptions {\n    allowList?: ScopedCredentialDescriptor[];\n    extensions?: WebAuthnExtensions;\n    rpId?: USVString;\n    timeoutSeconds?: number;\n}\n\ninterface CacheQueryOptions {\n    cacheName?: string;\n    ignoreMethod?: boolean;\n    ignoreSearch?: boolean;\n    ignoreVary?: boolean;\n}\n\ninterface ClientData {\n    challenge?: string;\n    extensions?: WebAuthnExtensions;\n    hashAlg?: string | Algorithm;\n    origin?: string;\n    rpId?: string;\n    tokenBinding?: string;\n}\n\ninterface CloseEventInit extends EventInit {\n    code?: number;\n    reason?: string;\n    wasClean?: boolean;\n}\n\ninterface CompositionEventInit extends UIEventInit {\n    data?: string;\n}\n\ninterface ConfirmSiteSpecificExceptionsInformation extends ExceptionInformation {\n    arrayOfDomainStrings?: string[];\n}\n\ninterface ConstrainBooleanParameters {\n    exact?: boolean;\n    ideal?: boolean;\n}\n\ninterface ConstrainDOMStringParameters {\n    exact?: string | string[];\n    ideal?: string | string[];\n}\n\ninterface ConstrainDoubleRange extends DoubleRange {\n    exact?: number;\n    ideal?: number;\n}\n\ninterface ConstrainLongRange extends LongRange {\n    exact?: number;\n    ideal?: number;\n}\n\ninterface ConstrainVideoFacingModeParameters {\n    exact?: VideoFacingModeEnum | VideoFacingModeEnum[];\n    ideal?: VideoFacingModeEnum | VideoFacingModeEnum[];\n}\n\ninterface CustomEventInit extends EventInit {\n    detail?: any;\n}\n\ninterface DeviceAccelerationDict {\n    x?: number;\n    y?: number;\n    z?: number;\n}\n\ninterface DeviceLightEventInit extends EventInit {\n    value?: number;\n}\n\ninterface DeviceMotionEventInit extends EventInit {\n    acceleration?: DeviceAccelerationDict;\n    accelerationIncludingGravity?: DeviceAccelerationDict;\n    interval?: number;\n    rotationRate?: DeviceRotationRateDict;\n}\n\ninterface DeviceOrientationEventInit extends EventInit {\n    absolute?: boolean;\n    alpha?: number;\n    beta?: number;\n    gamma?: number;\n}\n\ninterface DeviceRotationRateDict {\n    alpha?: number;\n    beta?: number;\n    gamma?: number;\n}\n\ninterface DOMRectInit {\n    height?: any;\n    width?: any;\n    x?: any;\n    y?: any;\n}\n\ninterface DoubleRange {\n    max?: number;\n    min?: number;\n}\n\ninterface ErrorEventInit extends EventInit {\n    colno?: number;\n    error?: any;\n    filename?: string;\n    lineno?: number;\n    message?: string;\n}\n\ninterface EventInit {\n    scoped?: boolean;\n    bubbles?: boolean;\n    cancelable?: boolean;\n}\n\ninterface EventModifierInit extends UIEventInit {\n    altKey?: boolean;\n    ctrlKey?: boolean;\n    metaKey?: boolean;\n    modifierAltGraph?: boolean;\n    modifierCapsLock?: boolean;\n    modifierFn?: boolean;\n    modifierFnLock?: boolean;\n    modifierHyper?: boolean;\n    modifierNumLock?: boolean;\n    modifierOS?: boolean;\n    modifierScrollLock?: boolean;\n    modifierSuper?: boolean;\n    modifierSymbol?: boolean;\n    modifierSymbolLock?: boolean;\n    shiftKey?: boolean;\n}\n\ninterface ExceptionInformation {\n    domain?: string;\n}\n\ninterface FocusEventInit extends UIEventInit {\n    relatedTarget?: EventTarget;\n}\n\ninterface FocusNavigationEventInit extends EventInit {\n    navigationReason?: string;\n    originHeight?: number;\n    originLeft?: number;\n    originTop?: number;\n    originWidth?: number;\n}\n\ninterface FocusNavigationOrigin {\n    originHeight?: number;\n    originLeft?: number;\n    originTop?: number;\n    originWidth?: number;\n}\n\ninterface GamepadEventInit extends EventInit {\n    gamepad?: Gamepad;\n}\n\ninterface GetNotificationOptions {\n    tag?: string;\n}\n\ninterface HashChangeEventInit extends EventInit {\n    newURL?: string;\n    oldURL?: string;\n}\n\ninterface IDBIndexParameters {\n    multiEntry?: boolean;\n    unique?: boolean;\n}\n\ninterface IDBObjectStoreParameters {\n    autoIncrement?: boolean;\n    keyPath?: IDBKeyPath;\n}\n\ninterface IntersectionObserverEntryInit {\n    boundingClientRect?: DOMRectInit;\n    intersectionRect?: DOMRectInit;\n    rootBounds?: DOMRectInit;\n    target?: Element;\n    time?: number;\n}\n\ninterface IntersectionObserverInit {\n    root?: Element;\n    rootMargin?: string;\n    threshold?: number | number[];\n}\n\ninterface KeyAlgorithm {\n    name?: string;\n}\n\ninterface KeyboardEventInit extends EventModifierInit {\n    code?: string;\n    key?: string;\n    location?: number;\n    repeat?: boolean;\n}\n\ninterface LongRange {\n    max?: number;\n    min?: number;\n}\n\ninterface MediaEncryptedEventInit extends EventInit {\n    initData?: ArrayBuffer;\n    initDataType?: string;\n}\n\ninterface MediaKeyMessageEventInit extends EventInit {\n    message?: ArrayBuffer;\n    messageType?: MediaKeyMessageType;\n}\n\ninterface MediaKeySystemConfiguration {\n    audioCapabilities?: MediaKeySystemMediaCapability[];\n    distinctiveIdentifier?: MediaKeysRequirement;\n    initDataTypes?: string[];\n    persistentState?: MediaKeysRequirement;\n    videoCapabilities?: MediaKeySystemMediaCapability[];\n}\n\ninterface MediaKeySystemMediaCapability {\n    contentType?: string;\n    robustness?: string;\n}\n\ninterface MediaStreamConstraints {\n    audio?: boolean | MediaTrackConstraints;\n    video?: boolean | MediaTrackConstraints;\n}\n\ninterface MediaStreamErrorEventInit extends EventInit {\n    error?: MediaStreamError;\n}\n\ninterface MediaStreamEventInit extends EventInit {\n    stream?: MediaStream;\n}\n\ninterface MediaStreamTrackEventInit extends EventInit {\n    track?: MediaStreamTrack;\n}\n\ninterface MediaTrackCapabilities {\n    aspectRatio?: number | DoubleRange;\n    deviceId?: string;\n    echoCancellation?: boolean[];\n    facingMode?: string;\n    frameRate?: number | DoubleRange;\n    groupId?: string;\n    height?: number | LongRange;\n    sampleRate?: number | LongRange;\n    sampleSize?: number | LongRange;\n    volume?: number | DoubleRange;\n    width?: number | LongRange;\n}\n\ninterface MediaTrackConstraints extends MediaTrackConstraintSet {\n    advanced?: MediaTrackConstraintSet[];\n}\n\ninterface MediaTrackConstraintSet {\n    aspectRatio?: number | ConstrainDoubleRange;\n    deviceId?: string | string[] | ConstrainDOMStringParameters;\n    echoCancelation?: boolean | ConstrainBooleanParameters;\n    facingMode?: string | string[] | ConstrainDOMStringParameters;\n    frameRate?: number | ConstrainDoubleRange;\n    groupId?: string | string[] | ConstrainDOMStringParameters;\n    height?: number | ConstrainLongRange;\n    sampleRate?: number | ConstrainLongRange;\n    sampleSize?: number | ConstrainLongRange;\n    volume?: number | ConstrainDoubleRange;\n    width?: number | ConstrainLongRange;\n}\n\ninterface MediaTrackSettings {\n    aspectRatio?: number;\n    deviceId?: string;\n    echoCancellation?: boolean;\n    facingMode?: string;\n    frameRate?: number;\n    groupId?: string;\n    height?: number;\n    sampleRate?: number;\n    sampleSize?: number;\n    volume?: number;\n    width?: number;\n}\n\ninterface MediaTrackSupportedConstraints {\n    aspectRatio?: boolean;\n    deviceId?: boolean;\n    echoCancellation?: boolean;\n    facingMode?: boolean;\n    frameRate?: boolean;\n    groupId?: boolean;\n    height?: boolean;\n    sampleRate?: boolean;\n    sampleSize?: boolean;\n    volume?: boolean;\n    width?: boolean;\n}\n\ninterface MessageEventInit extends EventInit {\n    lastEventId?: string;\n    channel?: string;\n    data?: any;\n    origin?: string;\n    ports?: MessagePort[];\n    source?: Window;\n}\n\ninterface MouseEventInit extends EventModifierInit {\n    button?: number;\n    buttons?: number;\n    clientX?: number;\n    clientY?: number;\n    relatedTarget?: EventTarget;\n    screenX?: number;\n    screenY?: number;\n}\n\ninterface MSAccountInfo {\n    accountImageUri?: string;\n    accountName?: string;\n    rpDisplayName?: string;\n    userDisplayName?: string;\n    userId?: string;\n}\n\ninterface MSAudioLocalClientEvent extends MSLocalClientEventBase {\n    cpuInsufficientEventRatio?: number;\n    deviceCaptureNotFunctioningEventRatio?: number;\n    deviceClippingEventRatio?: number;\n    deviceEchoEventRatio?: number;\n    deviceGlitchesEventRatio?: number;\n    deviceHalfDuplexAECEventRatio?: number;\n    deviceHowlingEventCount?: number;\n    deviceLowSNREventRatio?: number;\n    deviceLowSpeechLevelEventRatio?: number;\n    deviceMultipleEndpointsEventCount?: number;\n    deviceNearEndToEchoRatioEventRatio?: number;\n    deviceRenderMuteEventRatio?: number;\n    deviceRenderNotFunctioningEventRatio?: number;\n    deviceRenderZeroVolumeEventRatio?: number;\n    networkDelayEventRatio?: number;\n    networkSendQualityEventRatio?: number;\n}\n\ninterface MSAudioRecvPayload extends MSPayloadBase {\n    burstLossLength1?: number;\n    burstLossLength2?: number;\n    burstLossLength3?: number;\n    burstLossLength4?: number;\n    burstLossLength5?: number;\n    burstLossLength6?: number;\n    burstLossLength7?: number;\n    burstLossLength8OrHigher?: number;\n    fecRecvDistance1?: number;\n    fecRecvDistance2?: number;\n    fecRecvDistance3?: number;\n    packetReorderDepthAvg?: number;\n    packetReorderDepthMax?: number;\n    packetReorderRatio?: number;\n    ratioCompressedSamplesAvg?: number;\n    ratioConcealedSamplesAvg?: number;\n    ratioStretchedSamplesAvg?: number;\n    samplingRate?: number;\n    signal?: MSAudioRecvSignal;\n}\n\ninterface MSAudioRecvSignal {\n    initialSignalLevelRMS?: number;\n    recvNoiseLevelCh1?: number;\n    recvSignalLevelCh1?: number;\n    renderLoopbackSignalLevel?: number;\n    renderNoiseLevel?: number;\n    renderSignalLevel?: number;\n}\n\ninterface MSAudioSendPayload extends MSPayloadBase {\n    audioFECUsed?: boolean;\n    samplingRate?: number;\n    sendMutePercent?: number;\n    signal?: MSAudioSendSignal;\n}\n\ninterface MSAudioSendSignal {\n    noiseLevel?: number;\n    sendNoiseLevelCh1?: number;\n    sendSignalLevelCh1?: number;\n}\n\ninterface MSConnectivity {\n    iceType?: MSIceType;\n    iceWarningFlags?: MSIceWarningFlags;\n    relayAddress?: MSRelayAddress;\n}\n\ninterface MSCredentialFilter {\n    accept?: MSCredentialSpec[];\n}\n\ninterface MSCredentialParameters {\n    type?: MSCredentialType;\n}\n\ninterface MSCredentialSpec {\n    id?: string;\n    type?: MSCredentialType;\n}\n\ninterface MSDelay {\n    roundTrip?: number;\n    roundTripMax?: number;\n}\n\ninterface MSDescription extends RTCStats {\n    connectivity?: MSConnectivity;\n    deviceDevName?: string;\n    localAddr?: MSIPAddressInfo;\n    networkconnectivity?: MSNetworkConnectivityInfo;\n    reflexiveLocalIPAddr?: MSIPAddressInfo;\n    remoteAddr?: MSIPAddressInfo;\n    transport?: RTCIceProtocol;\n}\n\ninterface MSFIDOCredentialParameters extends MSCredentialParameters {\n    algorithm?: string | Algorithm;\n    authenticators?: AAGUID[];\n}\n\ninterface MSIceWarningFlags {\n    allocationMessageIntegrityFailed?: boolean;\n    alternateServerReceived?: boolean;\n    connCheckMessageIntegrityFailed?: boolean;\n    connCheckOtherError?: boolean;\n    fipsAllocationFailure?: boolean;\n    multipleRelayServersAttempted?: boolean;\n    noRelayServersConfigured?: boolean;\n    portRangeExhausted?: boolean;\n    pseudoTLSFailure?: boolean;\n    tcpNatConnectivityFailed?: boolean;\n    tcpRelayConnectivityFailed?: boolean;\n    turnAuthUnknownUsernameError?: boolean;\n    turnTcpAllocateFailed?: boolean;\n    turnTcpSendFailed?: boolean;\n    turnTcpTimedOut?: boolean;\n    turnTurnTcpConnectivityFailed?: boolean;\n    turnUdpAllocateFailed?: boolean;\n    turnUdpSendFailed?: boolean;\n    udpLocalConnectivityFailed?: boolean;\n    udpNatConnectivityFailed?: boolean;\n    udpRelayConnectivityFailed?: boolean;\n    useCandidateChecksFailed?: boolean;\n}\n\ninterface MSIPAddressInfo {\n    ipAddr?: string;\n    manufacturerMacAddrMask?: string;\n    port?: number;\n}\n\ninterface MSJitter {\n    interArrival?: number;\n    interArrivalMax?: number;\n    interArrivalSD?: number;\n}\n\ninterface MSLocalClientEventBase extends RTCStats {\n    networkBandwidthLowEventRatio?: number;\n    networkReceiveQualityEventRatio?: number;\n}\n\ninterface MSNetwork extends RTCStats {\n    delay?: MSDelay;\n    jitter?: MSJitter;\n    packetLoss?: MSPacketLoss;\n    utilization?: MSUtilization;\n}\n\ninterface MSNetworkConnectivityInfo {\n    linkspeed?: number;\n    networkConnectionDetails?: string;\n    vpn?: boolean;\n}\n\ninterface MSNetworkInterfaceType {\n    interfaceTypeEthernet?: boolean;\n    interfaceTypePPP?: boolean;\n    interfaceTypeTunnel?: boolean;\n    interfaceTypeWireless?: boolean;\n    interfaceTypeWWAN?: boolean;\n}\n\ninterface MSOutboundNetwork extends MSNetwork {\n    appliedBandwidthLimit?: number;\n}\n\ninterface MSPacketLoss {\n    lossRate?: number;\n    lossRateMax?: number;\n}\n\ninterface MSPayloadBase extends RTCStats {\n    payloadDescription?: string;\n}\n\ninterface MSPortRange {\n    max?: number;\n    min?: number;\n}\n\ninterface MSRelayAddress {\n    port?: number;\n    relayAddress?: string;\n}\n\ninterface MSSignatureParameters {\n    userPrompt?: string;\n}\n\ninterface MSTransportDiagnosticsStats extends RTCStats {\n    allocationTimeInMs?: number;\n    baseAddress?: string;\n    baseInterface?: MSNetworkInterfaceType;\n    iceRole?: RTCIceRole;\n    iceWarningFlags?: MSIceWarningFlags;\n    interfaces?: MSNetworkInterfaceType;\n    localAddress?: string;\n    localAddrType?: MSIceAddrType;\n    localInterface?: MSNetworkInterfaceType;\n    localMR?: string;\n    localMRTCPPort?: number;\n    localSite?: string;\n    msRtcEngineVersion?: string;\n    networkName?: string;\n    numConsentReqReceived?: number;\n    numConsentReqSent?: number;\n    numConsentRespReceived?: number;\n    numConsentRespSent?: number;\n    portRangeMax?: number;\n    portRangeMin?: number;\n    protocol?: RTCIceProtocol;\n    remoteAddress?: string;\n    remoteAddrType?: MSIceAddrType;\n    remoteMR?: string;\n    remoteMRTCPPort?: number;\n    remoteSite?: string;\n    rtpRtcpMux?: boolean;\n    stunVer?: number;\n}\n\ninterface MSUtilization {\n    bandwidthEstimation?: number;\n    bandwidthEstimationAvg?: number;\n    bandwidthEstimationMax?: number;\n    bandwidthEstimationMin?: number;\n    bandwidthEstimationStdDev?: number;\n    packets?: number;\n}\n\ninterface MSVideoPayload extends MSPayloadBase {\n    durationSeconds?: number;\n    resolution?: string;\n    videoBitRateAvg?: number;\n    videoBitRateMax?: number;\n    videoFrameRateAvg?: number;\n    videoPacketLossRate?: number;\n}\n\ninterface MSVideoRecvPayload extends MSVideoPayload {\n    lowBitRateCallPercent?: number;\n    lowFrameRateCallPercent?: number;\n    recvBitRateAverage?: number;\n    recvBitRateMaximum?: number;\n    recvCodecType?: string;\n    recvFpsHarmonicAverage?: number;\n    recvFrameRateAverage?: number;\n    recvNumResSwitches?: number;\n    recvReorderBufferMaxSuccessfullyOrderedExtent?: number;\n    recvReorderBufferMaxSuccessfullyOrderedLateTime?: number;\n    recvReorderBufferPacketsDroppedDueToBufferExhaustion?: number;\n    recvReorderBufferPacketsDroppedDueToTimeout?: number;\n    recvReorderBufferReorderedPackets?: number;\n    recvResolutionHeight?: number;\n    recvResolutionWidth?: number;\n    recvVideoStreamsMax?: number;\n    recvVideoStreamsMin?: number;\n    recvVideoStreamsMode?: number;\n    reorderBufferTotalPackets?: number;\n    videoFrameLossRate?: number;\n    videoPostFECPLR?: number;\n    videoResolutions?: MSVideoResolutionDistribution;\n}\n\ninterface MSVideoResolutionDistribution {\n    cifQuality?: number;\n    h1080Quality?: number;\n    h1440Quality?: number;\n    h2160Quality?: number;\n    h720Quality?: number;\n    vgaQuality?: number;\n}\n\ninterface MSVideoSendPayload extends MSVideoPayload {\n    sendBitRateAverage?: number;\n    sendBitRateMaximum?: number;\n    sendFrameRateAverage?: number;\n    sendResolutionHeight?: number;\n    sendResolutionWidth?: number;\n    sendVideoStreamsMax?: number;\n}\n\ninterface MsZoomToOptions {\n    animate?: string;\n    contentX?: number;\n    contentY?: number;\n    scaleFactor?: number;\n    viewportX?: string;\n    viewportY?: string;\n}\n\ninterface MutationObserverInit {\n    attributeFilter?: string[];\n    attributeOldValue?: boolean;\n    attributes?: boolean;\n    characterData?: boolean;\n    characterDataOldValue?: boolean;\n    childList?: boolean;\n    subtree?: boolean;\n}\n\ninterface NotificationOptions {\n    body?: string;\n    dir?: NotificationDirection;\n    icon?: string;\n    lang?: string;\n    tag?: string;\n}\n\ninterface ObjectURLOptions {\n    oneTimeOnly?: boolean;\n}\n\ninterface PaymentCurrencyAmount {\n    currency?: string;\n    currencySystem?: string;\n    value?: string;\n}\n\ninterface PaymentDetails {\n    displayItems?: PaymentItem[];\n    error?: string;\n    modifiers?: PaymentDetailsModifier[];\n    shippingOptions?: PaymentShippingOption[];\n    total?: PaymentItem;\n}\n\ninterface PaymentDetailsModifier {\n    additionalDisplayItems?: PaymentItem[];\n    data?: any;\n    supportedMethods?: string[];\n    total?: PaymentItem;\n}\n\ninterface PaymentItem {\n    amount?: PaymentCurrencyAmount;\n    label?: string;\n    pending?: boolean;\n}\n\ninterface PaymentMethodData {\n    data?: any;\n    supportedMethods?: string[];\n}\n\ninterface PaymentOptions {\n    requestPayerEmail?: boolean;\n    requestPayerName?: boolean;\n    requestPayerPhone?: boolean;\n    requestShipping?: boolean;\n    shippingType?: string;\n}\n\ninterface PaymentRequestUpdateEventInit extends EventInit {\n}\n\ninterface PaymentShippingOption {\n    amount?: PaymentCurrencyAmount;\n    id?: string;\n    label?: string;\n    selected?: boolean;\n}\n\ninterface PeriodicWaveConstraints {\n    disableNormalization?: boolean;\n}\n\ninterface PointerEventInit extends MouseEventInit {\n    height?: number;\n    isPrimary?: boolean;\n    pointerId?: number;\n    pointerType?: string;\n    pressure?: number;\n    tiltX?: number;\n    tiltY?: number;\n    width?: number;\n}\n\ninterface PopStateEventInit extends EventInit {\n    state?: any;\n}\n\ninterface PositionOptions {\n    enableHighAccuracy?: boolean;\n    maximumAge?: number;\n    timeout?: number;\n}\n\ninterface ProgressEventInit extends EventInit {\n    lengthComputable?: boolean;\n    loaded?: number;\n    total?: number;\n}\n\ninterface PushSubscriptionOptionsInit {\n    applicationServerKey?: any;\n    userVisibleOnly?: boolean;\n}\n\ninterface RegistrationOptions {\n    scope?: string;\n}\n\ninterface RequestInit {\n    body?: any;\n    cache?: RequestCache;\n    credentials?: RequestCredentials;\n    headers?: any;\n    integrity?: string;\n    keepalive?: boolean;\n    method?: string;\n    mode?: RequestMode;\n    redirect?: RequestRedirect;\n    referrer?: string;\n    referrerPolicy?: ReferrerPolicy;\n    window?: any;\n}\n\ninterface ResponseInit {\n    headers?: any;\n    status?: number;\n    statusText?: string;\n}\n\ninterface RTCConfiguration {\n    bundlePolicy?: RTCBundlePolicy;\n    iceServers?: RTCIceServer[];\n    iceTransportPolicy?: RTCIceTransportPolicy;\n    peerIdentity?: string;\n}\n\ninterface RTCDtlsFingerprint {\n    algorithm?: string;\n    value?: string;\n}\n\ninterface RTCDtlsParameters {\n    fingerprints?: RTCDtlsFingerprint[];\n    role?: RTCDtlsRole;\n}\n\ninterface RTCDTMFToneChangeEventInit extends EventInit {\n    tone?: string;\n}\n\ninterface RTCIceCandidateAttributes extends RTCStats {\n    addressSourceUrl?: string;\n    candidateType?: RTCStatsIceCandidateType;\n    ipAddress?: string;\n    portNumber?: number;\n    priority?: number;\n    transport?: string;\n}\n\ninterface RTCIceCandidateComplete {\n}\n\ninterface RTCIceCandidateDictionary {\n    foundation?: string;\n    ip?: string;\n    msMTurnSessionId?: string;\n    port?: number;\n    priority?: number;\n    protocol?: RTCIceProtocol;\n    relatedAddress?: string;\n    relatedPort?: number;\n    tcpType?: RTCIceTcpCandidateType;\n    type?: RTCIceCandidateType;\n}\n\ninterface RTCIceCandidateInit {\n    candidate?: string;\n    sdpMid?: string;\n    sdpMLineIndex?: number;\n}\n\ninterface RTCIceCandidatePair {\n    local?: RTCIceCandidateDictionary;\n    remote?: RTCIceCandidateDictionary;\n}\n\ninterface RTCIceCandidatePairStats extends RTCStats {\n    availableIncomingBitrate?: number;\n    availableOutgoingBitrate?: number;\n    bytesReceived?: number;\n    bytesSent?: number;\n    localCandidateId?: string;\n    nominated?: boolean;\n    priority?: number;\n    readable?: boolean;\n    remoteCandidateId?: string;\n    roundTripTime?: number;\n    state?: RTCStatsIceCandidatePairState;\n    transportId?: string;\n    writable?: boolean;\n}\n\ninterface RTCIceGatherOptions {\n    gatherPolicy?: RTCIceGatherPolicy;\n    iceservers?: RTCIceServer[];\n    portRange?: MSPortRange;\n}\n\ninterface RTCIceParameters {\n    iceLite?: boolean;\n    password?: string;\n    usernameFragment?: string;\n}\n\ninterface RTCIceServer {\n    credential?: string;\n    urls?: any;\n    username?: string;\n}\n\ninterface RTCInboundRTPStreamStats extends RTCRTPStreamStats {\n    bytesReceived?: number;\n    fractionLost?: number;\n    jitter?: number;\n    packetsLost?: number;\n    packetsReceived?: number;\n}\n\ninterface RTCMediaStreamTrackStats extends RTCStats {\n    audioLevel?: number;\n    echoReturnLoss?: number;\n    echoReturnLossEnhancement?: number;\n    frameHeight?: number;\n    framesCorrupted?: number;\n    framesDecoded?: number;\n    framesDropped?: number;\n    framesPerSecond?: number;\n    framesReceived?: number;\n    framesSent?: number;\n    frameWidth?: number;\n    remoteSource?: boolean;\n    ssrcIds?: string[];\n    trackIdentifier?: string;\n}\n\ninterface RTCOfferOptions {\n    iceRestart?: boolean;\n    offerToReceiveAudio?: number;\n    offerToReceiveVideo?: number;\n    voiceActivityDetection?: boolean;\n}\n\ninterface RTCOutboundRTPStreamStats extends RTCRTPStreamStats {\n    bytesSent?: number;\n    packetsSent?: number;\n    roundTripTime?: number;\n    targetBitrate?: number;\n}\n\ninterface RTCPeerConnectionIceEventInit extends EventInit {\n    candidate?: RTCIceCandidate;\n}\n\ninterface RTCRtcpFeedback {\n    parameter?: string;\n    type?: string;\n}\n\ninterface RTCRtcpParameters {\n    cname?: string;\n    mux?: boolean;\n    reducedSize?: boolean;\n    ssrc?: number;\n}\n\ninterface RTCRtpCapabilities {\n    codecs?: RTCRtpCodecCapability[];\n    fecMechanisms?: string[];\n    headerExtensions?: RTCRtpHeaderExtension[];\n}\n\ninterface RTCRtpCodecCapability {\n    clockRate?: number;\n    kind?: string;\n    maxptime?: number;\n    maxSpatialLayers?: number;\n    maxTemporalLayers?: number;\n    name?: string;\n    numChannels?: number;\n    options?: any;\n    parameters?: any;\n    preferredPayloadType?: number;\n    ptime?: number;\n    rtcpFeedback?: RTCRtcpFeedback[];\n    svcMultiStreamSupport?: boolean;\n}\n\ninterface RTCRtpCodecParameters {\n    clockRate?: number;\n    maxptime?: number;\n    name?: string;\n    numChannels?: number;\n    parameters?: any;\n    payloadType?: any;\n    ptime?: number;\n    rtcpFeedback?: RTCRtcpFeedback[];\n}\n\ninterface RTCRtpContributingSource {\n    audioLevel?: number;\n    csrc?: number;\n    timestamp?: number;\n}\n\ninterface RTCRtpEncodingParameters {\n    active?: boolean;\n    codecPayloadType?: number;\n    dependencyEncodingIds?: string[];\n    encodingId?: string;\n    fec?: RTCRtpFecParameters;\n    framerateScale?: number;\n    maxBitrate?: number;\n    maxFramerate?: number;\n    minQuality?: number;\n    priority?: number;\n    resolutionScale?: number;\n    rtx?: RTCRtpRtxParameters;\n    ssrc?: number;\n    ssrcRange?: RTCSsrcRange;\n}\n\ninterface RTCRtpFecParameters {\n    mechanism?: string;\n    ssrc?: number;\n}\n\ninterface RTCRtpHeaderExtension {\n    kind?: string;\n    preferredEncrypt?: boolean;\n    preferredId?: number;\n    uri?: string;\n}\n\ninterface RTCRtpHeaderExtensionParameters {\n    encrypt?: boolean;\n    id?: number;\n    uri?: string;\n}\n\ninterface RTCRtpParameters {\n    codecs?: RTCRtpCodecParameters[];\n    degradationPreference?: RTCDegradationPreference;\n    encodings?: RTCRtpEncodingParameters[];\n    headerExtensions?: RTCRtpHeaderExtensionParameters[];\n    muxId?: string;\n    rtcp?: RTCRtcpParameters;\n}\n\ninterface RTCRtpRtxParameters {\n    ssrc?: number;\n}\n\ninterface RTCRTPStreamStats extends RTCStats {\n    associateStatsId?: string;\n    codecId?: string;\n    firCount?: number;\n    isRemote?: boolean;\n    mediaTrackId?: string;\n    nackCount?: number;\n    pliCount?: number;\n    sliCount?: number;\n    ssrc?: string;\n    transportId?: string;\n}\n\ninterface RTCRtpUnhandled {\n    muxId?: string;\n    payloadType?: number;\n    ssrc?: number;\n}\n\ninterface RTCSessionDescriptionInit {\n    sdp?: string;\n    type?: RTCSdpType;\n}\n\ninterface RTCSrtpKeyParam {\n    keyMethod?: string;\n    keySalt?: string;\n    lifetime?: string;\n    mkiLength?: number;\n    mkiValue?: number;\n}\n\ninterface RTCSrtpSdesParameters {\n    cryptoSuite?: string;\n    keyParams?: RTCSrtpKeyParam[];\n    sessionParams?: string[];\n    tag?: number;\n}\n\ninterface RTCSsrcRange {\n    max?: number;\n    min?: number;\n}\n\ninterface RTCStats {\n    id?: string;\n    msType?: MSStatsType;\n    timestamp?: number;\n    type?: RTCStatsType;\n}\n\ninterface RTCStatsReport {\n}\n\ninterface RTCTransportStats extends RTCStats {\n    activeConnection?: boolean;\n    bytesReceived?: number;\n    bytesSent?: number;\n    localCertificateId?: string;\n    remoteCertificateId?: string;\n    rtcpTransportStatsId?: string;\n    selectedCandidatePairId?: string;\n}\n\ninterface ScopedCredentialDescriptor {\n    id?: any;\n    transports?: Transport[];\n    type?: ScopedCredentialType;\n}\n\ninterface ScopedCredentialOptions {\n    excludeList?: ScopedCredentialDescriptor[];\n    extensions?: WebAuthnExtensions;\n    rpId?: USVString;\n    timeoutSeconds?: number;\n}\n\ninterface ScopedCredentialParameters {\n    algorithm?: string | Algorithm;\n    type?: ScopedCredentialType;\n}\n\ninterface ServiceWorkerMessageEventInit extends EventInit {\n    data?: any;\n    lastEventId?: string;\n    origin?: string;\n    ports?: MessagePort[];\n    source?: ServiceWorker | MessagePort;\n}\n\ninterface SpeechSynthesisEventInit extends EventInit {\n    charIndex?: number;\n    elapsedTime?: number;\n    name?: string;\n    utterance?: SpeechSynthesisUtterance;\n}\n\ninterface StoreExceptionsInformation extends ExceptionInformation {\n    detailURI?: string;\n    explanationString?: string;\n    siteName?: string;\n}\n\ninterface StoreSiteSpecificExceptionsInformation extends StoreExceptionsInformation {\n    arrayOfDomainStrings?: string[];\n}\n\ninterface TrackEventInit extends EventInit {\n    track?: VideoTrack | AudioTrack | TextTrack;\n}\n\ninterface TransitionEventInit extends EventInit {\n    elapsedTime?: number;\n    propertyName?: string;\n}\n\ninterface UIEventInit extends EventInit {\n    detail?: number;\n    view?: Window;\n}\n\ninterface WebAuthnExtensions {\n}\n\ninterface WebGLContextAttributes {\n    failIfMajorPerformanceCaveat?: boolean;\n    alpha?: boolean;\n    antialias?: boolean;\n    depth?: boolean;\n    premultipliedAlpha?: boolean;\n    preserveDrawingBuffer?: boolean;\n    stencil?: boolean;\n}\n\ninterface WebGLContextEventInit extends EventInit {\n    statusMessage?: string;\n}\n\ninterface WheelEventInit extends MouseEventInit {\n    deltaMode?: number;\n    deltaX?: number;\n    deltaY?: number;\n    deltaZ?: number;\n}\n\ninterface EventListener {\n    (evt: Event): void;\n}\n\ninterface WebKitEntriesCallback {\n    (evt: Event): void;\n}\n\ninterface WebKitErrorCallback {\n    (evt: Event): void;\n}\n\ninterface WebKitFileCallback {\n    (evt: Event): void;\n}\n\ninterface AnalyserNode extends AudioNode {\n    fftSize: number;\n    readonly frequencyBinCount: number;\n    maxDecibels: number;\n    minDecibels: number;\n    smoothingTimeConstant: number;\n    getByteFrequencyData(array: Uint8Array): void;\n    getByteTimeDomainData(array: Uint8Array): void;\n    getFloatFrequencyData(array: Float32Array): void;\n    getFloatTimeDomainData(array: Float32Array): void;\n}\n\ndeclare var AnalyserNode: {\n    prototype: AnalyserNode;\n    new(): AnalyserNode;\n};\n\ninterface ANGLE_instanced_arrays {\n    drawArraysInstancedANGLE(mode: number, first: number, count: number, primcount: number): void;\n    drawElementsInstancedANGLE(mode: number, count: number, type: number, offset: number, primcount: number): void;\n    vertexAttribDivisorANGLE(index: number, divisor: number): void;\n    readonly VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE: number;\n}\n\ndeclare var ANGLE_instanced_arrays: {\n    prototype: ANGLE_instanced_arrays;\n    new(): ANGLE_instanced_arrays;\n    readonly VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE: number;\n};\n\ninterface AnimationEvent extends Event {\n    readonly animationName: string;\n    readonly elapsedTime: number;\n    initAnimationEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, animationNameArg: string, elapsedTimeArg: number): void;\n}\n\ndeclare var AnimationEvent: {\n    prototype: AnimationEvent;\n    new(typeArg: string, eventInitDict?: AnimationEventInit): AnimationEvent;\n};\n\ninterface ApplicationCacheEventMap {\n    "cached": Event;\n    "checking": Event;\n    "downloading": Event;\n    "error": Event;\n    "noupdate": Event;\n    "obsolete": Event;\n    "progress": ProgressEvent;\n    "updateready": Event;\n}\n\ninterface ApplicationCache extends EventTarget {\n    oncached: (this: ApplicationCache, ev: Event) => any;\n    onchecking: (this: ApplicationCache, ev: Event) => any;\n    ondownloading: (this: ApplicationCache, ev: Event) => any;\n    onerror: (this: ApplicationCache, ev: Event) => any;\n    onnoupdate: (this: ApplicationCache, ev: Event) => any;\n    onobsolete: (this: ApplicationCache, ev: Event) => any;\n    onprogress: (this: ApplicationCache, ev: ProgressEvent) => any;\n    onupdateready: (this: ApplicationCache, ev: Event) => any;\n    readonly status: number;\n    abort(): void;\n    swapCache(): void;\n    update(): void;\n    readonly CHECKING: number;\n    readonly DOWNLOADING: number;\n    readonly IDLE: number;\n    readonly OBSOLETE: number;\n    readonly UNCACHED: number;\n    readonly UPDATEREADY: number;\n    addEventListener<K extends keyof ApplicationCacheEventMap>(type: K, listener: (this: ApplicationCache, ev: ApplicationCacheEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var ApplicationCache: {\n    prototype: ApplicationCache;\n    new(): ApplicationCache;\n    readonly CHECKING: number;\n    readonly DOWNLOADING: number;\n    readonly IDLE: number;\n    readonly OBSOLETE: number;\n    readonly UNCACHED: number;\n    readonly UPDATEREADY: number;\n};\n\ninterface Attr extends Node {\n    readonly name: string;\n    readonly ownerElement: Element;\n    readonly prefix: string | null;\n    readonly specified: boolean;\n    value: string;\n}\n\ndeclare var Attr: {\n    prototype: Attr;\n    new(): Attr;\n};\n\ninterface AudioBuffer {\n    readonly duration: number;\n    readonly length: number;\n    readonly numberOfChannels: number;\n    readonly sampleRate: number;\n    copyFromChannel(destination: Float32Array, channelNumber: number, startInChannel?: number): void;\n    copyToChannel(source: Float32Array, channelNumber: number, startInChannel?: number): void;\n    getChannelData(channel: number): Float32Array;\n}\n\ndeclare var AudioBuffer: {\n    prototype: AudioBuffer;\n    new(): AudioBuffer;\n};\n\ninterface AudioBufferSourceNodeEventMap {\n    "ended": MediaStreamErrorEvent;\n}\n\ninterface AudioBufferSourceNode extends AudioNode {\n    buffer: AudioBuffer | null;\n    readonly detune: AudioParam;\n    loop: boolean;\n    loopEnd: number;\n    loopStart: number;\n    onended: (this: AudioBufferSourceNode, ev: MediaStreamErrorEvent) => any;\n    readonly playbackRate: AudioParam;\n    start(when?: number, offset?: number, duration?: number): void;\n    stop(when?: number): void;\n    addEventListener<K extends keyof AudioBufferSourceNodeEventMap>(type: K, listener: (this: AudioBufferSourceNode, ev: AudioBufferSourceNodeEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var AudioBufferSourceNode: {\n    prototype: AudioBufferSourceNode;\n    new(): AudioBufferSourceNode;\n};\n\ninterface AudioContextEventMap {\n    "statechange": Event;\n}\n\ninterface AudioContextBase extends EventTarget {\n    readonly currentTime: number;\n    readonly destination: AudioDestinationNode;\n    readonly listener: AudioListener;\n    onstatechange: (this: AudioContext, ev: Event) => any;\n    readonly sampleRate: number;\n    readonly state: AudioContextState;\n    close(): Promise<void>;\n    createAnalyser(): AnalyserNode;\n    createBiquadFilter(): BiquadFilterNode;\n    createBuffer(numberOfChannels: number, length: number, sampleRate: number): AudioBuffer;\n    createBufferSource(): AudioBufferSourceNode;\n    createChannelMerger(numberOfInputs?: number): ChannelMergerNode;\n    createChannelSplitter(numberOfOutputs?: number): ChannelSplitterNode;\n    createConvolver(): ConvolverNode;\n    createDelay(maxDelayTime?: number): DelayNode;\n    createDynamicsCompressor(): DynamicsCompressorNode;\n    createGain(): GainNode;\n    createIIRFilter(feedforward: number[], feedback: number[]): IIRFilterNode;\n    createMediaElementSource(mediaElement: HTMLMediaElement): MediaElementAudioSourceNode;\n    createMediaStreamSource(mediaStream: MediaStream): MediaStreamAudioSourceNode;\n    createOscillator(): OscillatorNode;\n    createPanner(): PannerNode;\n    createPeriodicWave(real: Float32Array, imag: Float32Array, constraints?: PeriodicWaveConstraints): PeriodicWave;\n    createScriptProcessor(bufferSize?: number, numberOfInputChannels?: number, numberOfOutputChannels?: number): ScriptProcessorNode;\n    createStereoPanner(): StereoPannerNode;\n    createWaveShaper(): WaveShaperNode;\n    decodeAudioData(audioData: ArrayBuffer, successCallback?: DecodeSuccessCallback, errorCallback?: DecodeErrorCallback): Promise<AudioBuffer>;\n    resume(): Promise<void>;\n    addEventListener<K extends keyof AudioContextEventMap>(type: K, listener: (this: AudioContext, ev: AudioContextEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ninterface AudioContext extends AudioContextBase {\n    suspend(): Promise<void>;\n}\n\ndeclare var AudioContext: {\n    prototype: AudioContext;\n    new(): AudioContext;\n};\n\ninterface AudioDestinationNode extends AudioNode {\n    readonly maxChannelCount: number;\n}\n\ndeclare var AudioDestinationNode: {\n    prototype: AudioDestinationNode;\n    new(): AudioDestinationNode;\n};\n\ninterface AudioListener {\n    dopplerFactor: number;\n    speedOfSound: number;\n    setOrientation(x: number, y: number, z: number, xUp: number, yUp: number, zUp: number): void;\n    setPosition(x: number, y: number, z: number): void;\n    setVelocity(x: number, y: number, z: number): void;\n}\n\ndeclare var AudioListener: {\n    prototype: AudioListener;\n    new(): AudioListener;\n};\n\ninterface AudioNode extends EventTarget {\n    channelCount: number;\n    channelCountMode: ChannelCountMode;\n    channelInterpretation: ChannelInterpretation;\n    readonly context: AudioContext;\n    readonly numberOfInputs: number;\n    readonly numberOfOutputs: number;\n    connect(destination: AudioNode, output?: number, input?: number): AudioNode;\n    connect(destination: AudioParam, output?: number): void;\n    disconnect(output?: number): void;\n    disconnect(destination: AudioNode, output?: number, input?: number): void;\n    disconnect(destination: AudioParam, output?: number): void;\n}\n\ndeclare var AudioNode: {\n    prototype: AudioNode;\n    new(): AudioNode;\n};\n\ninterface AudioParam {\n    readonly defaultValue: number;\n    value: number;\n    cancelScheduledValues(startTime: number): AudioParam;\n    exponentialRampToValueAtTime(value: number, endTime: number): AudioParam;\n    linearRampToValueAtTime(value: number, endTime: number): AudioParam;\n    setTargetAtTime(target: number, startTime: number, timeConstant: number): AudioParam;\n    setValueAtTime(value: number, startTime: number): AudioParam;\n    setValueCurveAtTime(values: Float32Array, startTime: number, duration: number): AudioParam;\n}\n\ndeclare var AudioParam: {\n    prototype: AudioParam;\n    new(): AudioParam;\n};\n\ninterface AudioProcessingEvent extends Event {\n    readonly inputBuffer: AudioBuffer;\n    readonly outputBuffer: AudioBuffer;\n    readonly playbackTime: number;\n}\n\ndeclare var AudioProcessingEvent: {\n    prototype: AudioProcessingEvent;\n    new(): AudioProcessingEvent;\n};\n\ninterface AudioTrack {\n    enabled: boolean;\n    readonly id: string;\n    kind: string;\n    readonly label: string;\n    language: string;\n    readonly sourceBuffer: SourceBuffer;\n}\n\ndeclare var AudioTrack: {\n    prototype: AudioTrack;\n    new(): AudioTrack;\n};\n\ninterface AudioTrackListEventMap {\n    "addtrack": TrackEvent;\n    "change": Event;\n    "removetrack": TrackEvent;\n}\n\ninterface AudioTrackList extends EventTarget {\n    readonly length: number;\n    onaddtrack: (this: AudioTrackList, ev: TrackEvent) => any;\n    onchange: (this: AudioTrackList, ev: Event) => any;\n    onremovetrack: (this: AudioTrackList, ev: TrackEvent) => any;\n    getTrackById(id: string): AudioTrack | null;\n    item(index: number): AudioTrack;\n    addEventListener<K extends keyof AudioTrackListEventMap>(type: K, listener: (this: AudioTrackList, ev: AudioTrackListEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n    [index: number]: AudioTrack;\n}\n\ndeclare var AudioTrackList: {\n    prototype: AudioTrackList;\n    new(): AudioTrackList;\n};\n\ninterface BarProp {\n    readonly visible: boolean;\n}\n\ndeclare var BarProp: {\n    prototype: BarProp;\n    new(): BarProp;\n};\n\ninterface BeforeUnloadEvent extends Event {\n    returnValue: any;\n}\n\ndeclare var BeforeUnloadEvent: {\n    prototype: BeforeUnloadEvent;\n    new(): BeforeUnloadEvent;\n};\n\ninterface BiquadFilterNode extends AudioNode {\n    readonly detune: AudioParam;\n    readonly frequency: AudioParam;\n    readonly gain: AudioParam;\n    readonly Q: AudioParam;\n    type: BiquadFilterType;\n    getFrequencyResponse(frequencyHz: Float32Array, magResponse: Float32Array, phaseResponse: Float32Array): void;\n}\n\ndeclare var BiquadFilterNode: {\n    prototype: BiquadFilterNode;\n    new(): BiquadFilterNode;\n};\n\ninterface Blob {\n    readonly size: number;\n    readonly type: string;\n    msClose(): void;\n    msDetachStream(): any;\n    slice(start?: number, end?: number, contentType?: string): Blob;\n}\n\ndeclare var Blob: {\n    prototype: Blob;\n    new (blobParts?: any[], options?: BlobPropertyBag): Blob;\n};\n\ninterface Cache {\n    add(request: RequestInfo): Promise<void>;\n    addAll(requests: RequestInfo[]): Promise<void>;\n    delete(request: RequestInfo, options?: CacheQueryOptions): Promise<boolean>;\n    keys(request?: RequestInfo, options?: CacheQueryOptions): any;\n    match(request: RequestInfo, options?: CacheQueryOptions): Promise<Response>;\n    matchAll(request?: RequestInfo, options?: CacheQueryOptions): any;\n    put(request: RequestInfo, response: Response): Promise<void>;\n}\n\ndeclare var Cache: {\n    prototype: Cache;\n    new(): Cache;\n};\n\ninterface CacheStorage {\n    delete(cacheName: string): Promise<boolean>;\n    has(cacheName: string): Promise<boolean>;\n    keys(): any;\n    match(request: RequestInfo, options?: CacheQueryOptions): Promise<any>;\n    open(cacheName: string): Promise<Cache>;\n}\n\ndeclare var CacheStorage: {\n    prototype: CacheStorage;\n    new(): CacheStorage;\n};\n\ninterface CanvasGradient {\n    addColorStop(offset: number, color: string): void;\n}\n\ndeclare var CanvasGradient: {\n    prototype: CanvasGradient;\n    new(): CanvasGradient;\n};\n\ninterface CanvasPattern {\n    setTransform(matrix: SVGMatrix): void;\n}\n\ndeclare var CanvasPattern: {\n    prototype: CanvasPattern;\n    new(): CanvasPattern;\n};\n\ninterface CanvasRenderingContext2D extends Object, CanvasPathMethods {\n    readonly canvas: HTMLCanvasElement;\n    fillStyle: string | CanvasGradient | CanvasPattern;\n    font: string;\n    globalAlpha: number;\n    globalCompositeOperation: string;\n    imageSmoothingEnabled: boolean;\n    lineCap: string;\n    lineDashOffset: number;\n    lineJoin: string;\n    lineWidth: number;\n    miterLimit: number;\n    msFillRule: CanvasFillRule;\n    shadowBlur: number;\n    shadowColor: string;\n    shadowOffsetX: number;\n    shadowOffsetY: number;\n    strokeStyle: string | CanvasGradient | CanvasPattern;\n    textAlign: string;\n    textBaseline: string;\n    mozImageSmoothingEnabled: boolean;\n    webkitImageSmoothingEnabled: boolean;\n    oImageSmoothingEnabled: boolean;\n    beginPath(): void;\n    clearRect(x: number, y: number, w: number, h: number): void;\n    clip(fillRule?: CanvasFillRule): void;\n    createImageData(imageDataOrSw: number | ImageData, sh?: number): ImageData;\n    createLinearGradient(x0: number, y0: number, x1: number, y1: number): CanvasGradient;\n    createPattern(image: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement, repetition: string): CanvasPattern;\n    createRadialGradient(x0: number, y0: number, r0: number, x1: number, y1: number, r1: number): CanvasGradient;\n    drawFocusIfNeeded(element: Element): void;\n    drawImage(image: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap, dstX: number, dstY: number): void;\n    drawImage(image: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap, dstX: number, dstY: number, dstW: number, dstH: number): void;\n    drawImage(image: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap, srcX: number, srcY: number, srcW: number, srcH: number, dstX: number, dstY: number, dstW: number, dstH: number): void;\n    fill(fillRule?: CanvasFillRule): void;\n    fillRect(x: number, y: number, w: number, h: number): void;\n    fillText(text: string, x: number, y: number, maxWidth?: number): void;\n    getImageData(sx: number, sy: number, sw: number, sh: number): ImageData;\n    getLineDash(): number[];\n    isPointInPath(x: number, y: number, fillRule?: CanvasFillRule): boolean;\n    measureText(text: string): TextMetrics;\n    putImageData(imagedata: ImageData, dx: number, dy: number, dirtyX?: number, dirtyY?: number, dirtyWidth?: number, dirtyHeight?: number): void;\n    restore(): void;\n    rotate(angle: number): void;\n    save(): void;\n    scale(x: number, y: number): void;\n    setLineDash(segments: number[]): void;\n    setTransform(m11: number, m12: number, m21: number, m22: number, dx: number, dy: number): void;\n    stroke(path?: Path2D): void;\n    strokeRect(x: number, y: number, w: number, h: number): void;\n    strokeText(text: string, x: number, y: number, maxWidth?: number): void;\n    transform(m11: number, m12: number, m21: number, m22: number, dx: number, dy: number): void;\n    translate(x: number, y: number): void;\n}\n\ndeclare var CanvasRenderingContext2D: {\n    prototype: CanvasRenderingContext2D;\n    new(): CanvasRenderingContext2D;\n};\n\ninterface CDATASection extends Text {\n}\n\ndeclare var CDATASection: {\n    prototype: CDATASection;\n    new(): CDATASection;\n};\n\ninterface ChannelMergerNode extends AudioNode {\n}\n\ndeclare var ChannelMergerNode: {\n    prototype: ChannelMergerNode;\n    new(): ChannelMergerNode;\n};\n\ninterface ChannelSplitterNode extends AudioNode {\n}\n\ndeclare var ChannelSplitterNode: {\n    prototype: ChannelSplitterNode;\n    new(): ChannelSplitterNode;\n};\n\ninterface CharacterData extends Node, ChildNode {\n    data: string;\n    readonly length: number;\n    appendData(arg: string): void;\n    deleteData(offset: number, count: number): void;\n    insertData(offset: number, arg: string): void;\n    replaceData(offset: number, count: number, arg: string): void;\n    substringData(offset: number, count: number): string;\n}\n\ndeclare var CharacterData: {\n    prototype: CharacterData;\n    new(): CharacterData;\n};\n\ninterface ClientRect {\n    bottom: number;\n    readonly height: number;\n    left: number;\n    right: number;\n    top: number;\n    readonly width: number;\n}\n\ndeclare var ClientRect: {\n    prototype: ClientRect;\n    new(): ClientRect;\n};\n\ninterface ClientRectList {\n    readonly length: number;\n    item(index: number): ClientRect;\n    [index: number]: ClientRect;\n}\n\ndeclare var ClientRectList: {\n    prototype: ClientRectList;\n    new(): ClientRectList;\n};\n\ninterface ClipboardEvent extends Event {\n    readonly clipboardData: DataTransfer;\n}\n\ndeclare var ClipboardEvent: {\n    prototype: ClipboardEvent;\n    new(type: string, eventInitDict?: ClipboardEventInit): ClipboardEvent;\n};\n\ninterface CloseEvent extends Event {\n    readonly code: number;\n    readonly reason: string;\n    readonly wasClean: boolean;\n    initCloseEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, wasCleanArg: boolean, codeArg: number, reasonArg: string): void;\n}\n\ndeclare var CloseEvent: {\n    prototype: CloseEvent;\n    new(typeArg: string, eventInitDict?: CloseEventInit): CloseEvent;\n};\n\ninterface Comment extends CharacterData {\n    text: string;\n}\n\ndeclare var Comment: {\n    prototype: Comment;\n    new(): Comment;\n};\n\ninterface CompositionEvent extends UIEvent {\n    readonly data: string;\n    readonly locale: string;\n    initCompositionEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, dataArg: string, locale: string): void;\n}\n\ndeclare var CompositionEvent: {\n    prototype: CompositionEvent;\n    new(typeArg: string, eventInitDict?: CompositionEventInit): CompositionEvent;\n};\n\ninterface Console {\n    assert(test?: boolean, message?: string, ...optionalParams: any[]): void;\n    clear(): void;\n    count(countTitle?: string): void;\n    debug(message?: any, ...optionalParams: any[]): void;\n    dir(value?: any, ...optionalParams: any[]): void;\n    dirxml(value: any): void;\n    error(message?: any, ...optionalParams: any[]): void;\n    exception(message?: string, ...optionalParams: any[]): void;\n    group(groupTitle?: string, ...optionalParams: any[]): void;\n    groupCollapsed(groupTitle?: string, ...optionalParams: any[]): void;\n    groupEnd(): void;\n    info(message?: any, ...optionalParams: any[]): void;\n    log(message?: any, ...optionalParams: any[]): void;\n    msIsIndependentlyComposed(element: Element): boolean;\n    profile(reportName?: string): void;\n    profileEnd(): void;\n    select(element: Element): void;\n    table(...data: any[]): void;\n    time(timerName?: string): void;\n    timeEnd(timerName?: string): void;\n    trace(message?: any, ...optionalParams: any[]): void;\n    warn(message?: any, ...optionalParams: any[]): void;\n}\n\ndeclare var Console: {\n    prototype: Console;\n    new(): Console;\n};\n\ninterface ConvolverNode extends AudioNode {\n    buffer: AudioBuffer | null;\n    normalize: boolean;\n}\n\ndeclare var ConvolverNode: {\n    prototype: ConvolverNode;\n    new(): ConvolverNode;\n};\n\ninterface Coordinates {\n    readonly accuracy: number;\n    readonly altitude: number | null;\n    readonly altitudeAccuracy: number | null;\n    readonly heading: number | null;\n    readonly latitude: number;\n    readonly longitude: number;\n    readonly speed: number | null;\n}\n\ndeclare var Coordinates: {\n    prototype: Coordinates;\n    new(): Coordinates;\n};\n\ninterface Crypto extends Object, RandomSource {\n    readonly subtle: SubtleCrypto;\n}\n\ndeclare var Crypto: {\n    prototype: Crypto;\n    new(): Crypto;\n};\n\ninterface CryptoKey {\n    readonly algorithm: KeyAlgorithm;\n    readonly extractable: boolean;\n    readonly type: string;\n    readonly usages: string[];\n}\n\ndeclare var CryptoKey: {\n    prototype: CryptoKey;\n    new(): CryptoKey;\n};\n\ninterface CryptoKeyPair {\n    privateKey: CryptoKey;\n    publicKey: CryptoKey;\n}\n\ndeclare var CryptoKeyPair: {\n    prototype: CryptoKeyPair;\n    new(): CryptoKeyPair;\n};\n\ninterface CSS {\n    supports(property: string, value?: string): boolean;\n}\ndeclare var CSS: CSS;\n\ninterface CSSConditionRule extends CSSGroupingRule {\n    conditionText: string;\n}\n\ndeclare var CSSConditionRule: {\n    prototype: CSSConditionRule;\n    new(): CSSConditionRule;\n};\n\ninterface CSSFontFaceRule extends CSSRule {\n    readonly style: CSSStyleDeclaration;\n}\n\ndeclare var CSSFontFaceRule: {\n    prototype: CSSFontFaceRule;\n    new(): CSSFontFaceRule;\n};\n\ninterface CSSGroupingRule extends CSSRule {\n    readonly cssRules: CSSRuleList;\n    deleteRule(index: number): void;\n    insertRule(rule: string, index: number): number;\n}\n\ndeclare var CSSGroupingRule: {\n    prototype: CSSGroupingRule;\n    new(): CSSGroupingRule;\n};\n\ninterface CSSImportRule extends CSSRule {\n    readonly href: string;\n    readonly media: MediaList;\n    readonly styleSheet: CSSStyleSheet;\n}\n\ndeclare var CSSImportRule: {\n    prototype: CSSImportRule;\n    new(): CSSImportRule;\n};\n\ninterface CSSKeyframeRule extends CSSRule {\n    keyText: string;\n    readonly style: CSSStyleDeclaration;\n}\n\ndeclare var CSSKeyframeRule: {\n    prototype: CSSKeyframeRule;\n    new(): CSSKeyframeRule;\n};\n\ninterface CSSKeyframesRule extends CSSRule {\n    readonly cssRules: CSSRuleList;\n    name: string;\n    appendRule(rule: string): void;\n    deleteRule(rule: string): void;\n    findRule(rule: string): CSSKeyframeRule;\n}\n\ndeclare var CSSKeyframesRule: {\n    prototype: CSSKeyframesRule;\n    new(): CSSKeyframesRule;\n};\n\ninterface CSSMediaRule extends CSSConditionRule {\n    readonly media: MediaList;\n}\n\ndeclare var CSSMediaRule: {\n    prototype: CSSMediaRule;\n    new(): CSSMediaRule;\n};\n\ninterface CSSNamespaceRule extends CSSRule {\n    readonly namespaceURI: string;\n    readonly prefix: string;\n}\n\ndeclare var CSSNamespaceRule: {\n    prototype: CSSNamespaceRule;\n    new(): CSSNamespaceRule;\n};\n\ninterface CSSPageRule extends CSSRule {\n    readonly pseudoClass: string;\n    readonly selector: string;\n    selectorText: string;\n    readonly style: CSSStyleDeclaration;\n}\n\ndeclare var CSSPageRule: {\n    prototype: CSSPageRule;\n    new(): CSSPageRule;\n};\n\ninterface CSSRule {\n    cssText: string;\n    readonly parentRule: CSSRule;\n    readonly parentStyleSheet: CSSStyleSheet;\n    readonly type: number;\n    readonly CHARSET_RULE: number;\n    readonly FONT_FACE_RULE: number;\n    readonly IMPORT_RULE: number;\n    readonly KEYFRAME_RULE: number;\n    readonly KEYFRAMES_RULE: number;\n    readonly MEDIA_RULE: number;\n    readonly NAMESPACE_RULE: number;\n    readonly PAGE_RULE: number;\n    readonly STYLE_RULE: number;\n    readonly SUPPORTS_RULE: number;\n    readonly UNKNOWN_RULE: number;\n    readonly VIEWPORT_RULE: number;\n}\n\ndeclare var CSSRule: {\n    prototype: CSSRule;\n    new(): CSSRule;\n    readonly CHARSET_RULE: number;\n    readonly FONT_FACE_RULE: number;\n    readonly IMPORT_RULE: number;\n    readonly KEYFRAME_RULE: number;\n    readonly KEYFRAMES_RULE: number;\n    readonly MEDIA_RULE: number;\n    readonly NAMESPACE_RULE: number;\n    readonly PAGE_RULE: number;\n    readonly STYLE_RULE: number;\n    readonly SUPPORTS_RULE: number;\n    readonly UNKNOWN_RULE: number;\n    readonly VIEWPORT_RULE: number;\n};\n\ninterface CSSRuleList {\n    readonly length: number;\n    item(index: number): CSSRule;\n    [index: number]: CSSRule;\n}\n\ndeclare var CSSRuleList: {\n    prototype: CSSRuleList;\n    new(): CSSRuleList;\n};\n\ninterface CSSStyleDeclaration {\n    alignContent: string | null;\n    alignItems: string | null;\n    alignmentBaseline: string | null;\n    alignSelf: string | null;\n    animation: string | null;\n    animationDelay: string | null;\n    animationDirection: string | null;\n    animationDuration: string | null;\n    animationFillMode: string | null;\n    animationIterationCount: string | null;\n    animationName: string | null;\n    animationPlayState: string | null;\n    animationTimingFunction: string | null;\n    backfaceVisibility: string | null;\n    background: string | null;\n    backgroundAttachment: string | null;\n    backgroundClip: string | null;\n    backgroundColor: string | null;\n    backgroundImage: string | null;\n    backgroundOrigin: string | null;\n    backgroundPosition: string | null;\n    backgroundPositionX: string | null;\n    backgroundPositionY: string | null;\n    backgroundRepeat: string | null;\n    backgroundSize: string | null;\n    baselineShift: string | null;\n    border: string | null;\n    borderBottom: string | null;\n    borderBottomColor: string | null;\n    borderBottomLeftRadius: string | null;\n    borderBottomRightRadius: string | null;\n    borderBottomStyle: string | null;\n    borderBottomWidth: string | null;\n    borderCollapse: string | null;\n    borderColor: string | null;\n    borderImage: string | null;\n    borderImageOutset: string | null;\n    borderImageRepeat: string | null;\n    borderImageSlice: string | null;\n    borderImageSource: string | null;\n    borderImageWidth: string | null;\n    borderLeft: string | null;\n    borderLeftColor: string | null;\n    borderLeftStyle: string | null;\n    borderLeftWidth: string | null;\n    borderRadius: string | null;\n    borderRight: string | null;\n    borderRightColor: string | null;\n    borderRightStyle: string | null;\n    borderRightWidth: string | null;\n    borderSpacing: string | null;\n    borderStyle: string | null;\n    borderTop: string | null;\n    borderTopColor: string | null;\n    borderTopLeftRadius: string | null;\n    borderTopRightRadius: string | null;\n    borderTopStyle: string | null;\n    borderTopWidth: string | null;\n    borderWidth: string | null;\n    bottom: string | null;\n    boxShadow: string | null;\n    boxSizing: string | null;\n    breakAfter: string | null;\n    breakBefore: string | null;\n    breakInside: string | null;\n    captionSide: string | null;\n    clear: string | null;\n    clip: string | null;\n    clipPath: string | null;\n    clipRule: string | null;\n    color: string | null;\n    colorInterpolationFilters: string | null;\n    columnCount: any;\n    columnFill: string | null;\n    columnGap: any;\n    columnRule: string | null;\n    columnRuleColor: any;\n    columnRuleStyle: string | null;\n    columnRuleWidth: any;\n    columns: string | null;\n    columnSpan: string | null;\n    columnWidth: any;\n    content: string | null;\n    counterIncrement: string | null;\n    counterReset: string | null;\n    cssFloat: string | null;\n    cssText: string;\n    cursor: string | null;\n    direction: string | null;\n    display: string | null;\n    dominantBaseline: string | null;\n    emptyCells: string | null;\n    enableBackground: string | null;\n    fill: string | null;\n    fillOpacity: string | null;\n    fillRule: string | null;\n    filter: string | null;\n    flex: string | null;\n    flexBasis: string | null;\n    flexDirection: string | null;\n    flexFlow: string | null;\n    flexGrow: string | null;\n    flexShrink: string | null;\n    flexWrap: string | null;\n    floodColor: string | null;\n    floodOpacity: string | null;\n    font: string | null;\n    fontFamily: string | null;\n    fontFeatureSettings: string | null;\n    fontSize: string | null;\n    fontSizeAdjust: string | null;\n    fontStretch: string | null;\n    fontStyle: string | null;\n    fontVariant: string | null;\n    fontWeight: string | null;\n    glyphOrientationHorizontal: string | null;\n    glyphOrientationVertical: string | null;\n    height: string | null;\n    imeMode: string | null;\n    justifyContent: string | null;\n    kerning: string | null;\n    layoutGrid: string | null;\n    layoutGridChar: string | null;\n    layoutGridLine: string | null;\n    layoutGridMode: string | null;\n    layoutGridType: string | null;\n    left: string | null;\n    readonly length: number;\n    letterSpacing: string | null;\n    lightingColor: string | null;\n    lineBreak: string | null;\n    lineHeight: string | null;\n    listStyle: string | null;\n    listStyleImage: string | null;\n    listStylePosition: string | null;\n    listStyleType: string | null;\n    margin: string | null;\n    marginBottom: string | null;\n    marginLeft: string | null;\n    marginRight: string | null;\n    marginTop: string | null;\n    marker: string | null;\n    markerEnd: string | null;\n    markerMid: string | null;\n    markerStart: string | null;\n    mask: string | null;\n    maxHeight: string | null;\n    maxWidth: string | null;\n    minHeight: string | null;\n    minWidth: string | null;\n    msContentZoomChaining: string | null;\n    msContentZooming: string | null;\n    msContentZoomLimit: string | null;\n    msContentZoomLimitMax: any;\n    msContentZoomLimitMin: any;\n    msContentZoomSnap: string | null;\n    msContentZoomSnapPoints: string | null;\n    msContentZoomSnapType: string | null;\n    msFlowFrom: string | null;\n    msFlowInto: string | null;\n    msFontFeatureSettings: string | null;\n    msGridColumn: any;\n    msGridColumnAlign: string | null;\n    msGridColumns: string | null;\n    msGridColumnSpan: any;\n    msGridRow: any;\n    msGridRowAlign: string | null;\n    msGridRows: string | null;\n    msGridRowSpan: any;\n    msHighContrastAdjust: string | null;\n    msHyphenateLimitChars: string | null;\n    msHyphenateLimitLines: any;\n    msHyphenateLimitZone: any;\n    msHyphens: string | null;\n    msImeAlign: string | null;\n    msOverflowStyle: string | null;\n    msScrollChaining: string | null;\n    msScrollLimit: string | null;\n    msScrollLimitXMax: any;\n    msScrollLimitXMin: any;\n    msScrollLimitYMax: any;\n    msScrollLimitYMin: any;\n    msScrollRails: string | null;\n    msScrollSnapPointsX: string | null;\n    msScrollSnapPointsY: string | null;\n    msScrollSnapType: string | null;\n    msScrollSnapX: string | null;\n    msScrollSnapY: string | null;\n    msScrollTranslation: string | null;\n    msTextCombineHorizontal: string | null;\n    msTextSizeAdjust: any;\n    msTouchAction: string | null;\n    msTouchSelect: string | null;\n    msUserSelect: string | null;\n    msWrapFlow: string;\n    msWrapMargin: any;\n    msWrapThrough: string;\n    opacity: string | null;\n    order: string | null;\n    orphans: string | null;\n    outline: string | null;\n    outlineColor: string | null;\n    outlineOffset: string | null;\n    outlineStyle: string | null;\n    outlineWidth: string | null;\n    overflow: string | null;\n    overflowX: string | null;\n    overflowY: string | null;\n    padding: string | null;\n    paddingBottom: string | null;\n    paddingLeft: string | null;\n    paddingRight: string | null;\n    paddingTop: string | null;\n    pageBreakAfter: string | null;\n    pageBreakBefore: string | null;\n    pageBreakInside: string | null;\n    readonly parentRule: CSSRule;\n    perspective: string | null;\n    perspectiveOrigin: string | null;\n    pointerEvents: string | null;\n    position: string | null;\n    quotes: string | null;\n    right: string | null;\n    rotate: string | null;\n    rubyAlign: string | null;\n    rubyOverhang: string | null;\n    rubyPosition: string | null;\n    scale: string | null;\n    stopColor: string | null;\n    stopOpacity: string | null;\n    stroke: string | null;\n    strokeDasharray: string | null;\n    strokeDashoffset: string | null;\n    strokeLinecap: string | null;\n    strokeLinejoin: string | null;\n    strokeMiterlimit: string | null;\n    strokeOpacity: string | null;\n    strokeWidth: string | null;\n    tableLayout: string | null;\n    textAlign: string | null;\n    textAlignLast: string | null;\n    textAnchor: string | null;\n    textDecoration: string | null;\n    textIndent: string | null;\n    textJustify: string | null;\n    textKashida: string | null;\n    textKashidaSpace: string | null;\n    textOverflow: string | null;\n    textShadow: string | null;\n    textTransform: string | null;\n    textUnderlinePosition: string | null;\n    top: string | null;\n    touchAction: string | null;\n    transform: string | null;\n    transformOrigin: string | null;\n    transformStyle: string | null;\n    transition: string | null;\n    transitionDelay: string | null;\n    transitionDuration: string | null;\n    transitionProperty: string | null;\n    transitionTimingFunction: string | null;\n    translate: string | null;\n    unicodeBidi: string | null;\n    verticalAlign: string | null;\n    visibility: string | null;\n    webkitAlignContent: string | null;\n    webkitAlignItems: string | null;\n    webkitAlignSelf: string | null;\n    webkitAnimation: string | null;\n    webkitAnimationDelay: string | null;\n    webkitAnimationDirection: string | null;\n    webkitAnimationDuration: string | null;\n    webkitAnimationFillMode: string | null;\n    webkitAnimationIterationCount: string | null;\n    webkitAnimationName: string | null;\n    webkitAnimationPlayState: string | null;\n    webkitAnimationTimingFunction: string | null;\n    webkitAppearance: string | null;\n    webkitBackfaceVisibility: string | null;\n    webkitBackgroundClip: string | null;\n    webkitBackgroundOrigin: string | null;\n    webkitBackgroundSize: string | null;\n    webkitBorderBottomLeftRadius: string | null;\n    webkitBorderBottomRightRadius: string | null;\n    webkitBorderImage: string | null;\n    webkitBorderRadius: string | null;\n    webkitBorderTopLeftRadius: string | null;\n    webkitBorderTopRightRadius: string | null;\n    webkitBoxAlign: string | null;\n    webkitBoxDirection: string | null;\n    webkitBoxFlex: string | null;\n    webkitBoxOrdinalGroup: string | null;\n    webkitBoxOrient: string | null;\n    webkitBoxPack: string | null;\n    webkitBoxSizing: string | null;\n    webkitColumnBreakAfter: string | null;\n    webkitColumnBreakBefore: string | null;\n    webkitColumnBreakInside: string | null;\n    webkitColumnCount: any;\n    webkitColumnGap: any;\n    webkitColumnRule: string | null;\n    webkitColumnRuleColor: any;\n    webkitColumnRuleStyle: string | null;\n    webkitColumnRuleWidth: any;\n    webkitColumns: string | null;\n    webkitColumnSpan: string | null;\n    webkitColumnWidth: any;\n    webkitFilter: string | null;\n    webkitFlex: string | null;\n    webkitFlexBasis: string | null;\n    webkitFlexDirection: string | null;\n    webkitFlexFlow: string | null;\n    webkitFlexGrow: string | null;\n    webkitFlexShrink: string | null;\n    webkitFlexWrap: string | null;\n    webkitJustifyContent: string | null;\n    webkitOrder: string | null;\n    webkitPerspective: string | null;\n    webkitPerspectiveOrigin: string | null;\n    webkitTapHighlightColor: string | null;\n    webkitTextFillColor: string | null;\n    webkitTextSizeAdjust: any;\n    webkitTextStroke: string | null;\n    webkitTextStrokeColor: string | null;\n    webkitTextStrokeWidth: string | null;\n    webkitTransform: string | null;\n    webkitTransformOrigin: string | null;\n    webkitTransformStyle: string | null;\n    webkitTransition: string | null;\n    webkitTransitionDelay: string | null;\n    webkitTransitionDuration: string | null;\n    webkitTransitionProperty: string | null;\n    webkitTransitionTimingFunction: string | null;\n    webkitUserModify: string | null;\n    webkitUserSelect: string | null;\n    webkitWritingMode: string | null;\n    whiteSpace: string | null;\n    widows: string | null;\n    width: string | null;\n    wordBreak: string | null;\n    wordSpacing: string | null;\n    wordWrap: string | null;\n    writingMode: string | null;\n    zIndex: string | null;\n    zoom: string | null;\n    resize: string | null;\n    userSelect: string | null;\n    getPropertyPriority(propertyName: string): string;\n    getPropertyValue(propertyName: string): string;\n    item(index: number): string;\n    removeProperty(propertyName: string): string;\n    setProperty(propertyName: string, value: string | null, priority?: string): void;\n    [index: number]: string;\n}\n\ndeclare var CSSStyleDeclaration: {\n    prototype: CSSStyleDeclaration;\n    new(): CSSStyleDeclaration;\n};\n\ninterface CSSStyleRule extends CSSRule {\n    readonly readOnly: boolean;\n    selectorText: string;\n    readonly style: CSSStyleDeclaration;\n}\n\ndeclare var CSSStyleRule: {\n    prototype: CSSStyleRule;\n    new(): CSSStyleRule;\n};\n\ninterface CSSStyleSheet extends StyleSheet {\n    readonly cssRules: CSSRuleList;\n    cssText: string;\n    readonly id: string;\n    readonly imports: StyleSheetList;\n    readonly isAlternate: boolean;\n    readonly isPrefAlternate: boolean;\n    readonly ownerRule: CSSRule;\n    readonly owningElement: Element;\n    readonly pages: StyleSheetPageList;\n    readonly readOnly: boolean;\n    readonly rules: CSSRuleList;\n    addImport(bstrURL: string, lIndex?: number): number;\n    addPageRule(bstrSelector: string, bstrStyle: string, lIndex?: number): number;\n    addRule(bstrSelector: string, bstrStyle?: string, lIndex?: number): number;\n    deleteRule(index?: number): void;\n    insertRule(rule: string, index?: number): number;\n    removeImport(lIndex: number): void;\n    removeRule(lIndex: number): void;\n}\n\ndeclare var CSSStyleSheet: {\n    prototype: CSSStyleSheet;\n    new(): CSSStyleSheet;\n};\n\ninterface CSSSupportsRule extends CSSConditionRule {\n}\n\ndeclare var CSSSupportsRule: {\n    prototype: CSSSupportsRule;\n    new(): CSSSupportsRule;\n};\n\ninterface CustomEvent extends Event {\n    readonly detail: any;\n    initCustomEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, detailArg: any): void;\n}\n\ndeclare var CustomEvent: {\n    prototype: CustomEvent;\n    new(typeArg: string, eventInitDict?: CustomEventInit): CustomEvent;\n};\n\ninterface DataCue extends TextTrackCue {\n    data: ArrayBuffer;\n    addEventListener<K extends keyof TextTrackCueEventMap>(type: K, listener: (this: DataCue, ev: TextTrackCueEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var DataCue: {\n    prototype: DataCue;\n    new(): DataCue;\n};\n\ninterface DataTransfer {\n    dropEffect: string;\n    effectAllowed: string;\n    readonly files: FileList;\n    readonly items: DataTransferItemList;\n    readonly types: string[];\n    clearData(format?: string): boolean;\n    getData(format: string): string;\n    setData(format: string, data: string): boolean;\n    setDragImage(image: Element, x: number, y: number): void;\n}\n\ndeclare var DataTransfer: {\n    prototype: DataTransfer;\n    new(): DataTransfer;\n};\n\ninterface DataTransferItem {\n    readonly kind: string;\n    readonly type: string;\n    getAsFile(): File | null;\n    getAsString(_callback: FunctionStringCallback | null): void;\n    webkitGetAsEntry(): any;\n}\n\ndeclare var DataTransferItem: {\n    prototype: DataTransferItem;\n    new(): DataTransferItem;\n};\n\ninterface DataTransferItemList {\n    readonly length: number;\n    add(data: File): DataTransferItem | null;\n    clear(): void;\n    item(index: number): DataTransferItem;\n    remove(index: number): void;\n    [index: number]: DataTransferItem;\n}\n\ndeclare var DataTransferItemList: {\n    prototype: DataTransferItemList;\n    new(): DataTransferItemList;\n};\n\ninterface DeferredPermissionRequest {\n    readonly id: number;\n    readonly type: MSWebViewPermissionType;\n    readonly uri: string;\n    allow(): void;\n    deny(): void;\n}\n\ndeclare var DeferredPermissionRequest: {\n    prototype: DeferredPermissionRequest;\n    new(): DeferredPermissionRequest;\n};\n\ninterface DelayNode extends AudioNode {\n    readonly delayTime: AudioParam;\n}\n\ndeclare var DelayNode: {\n    prototype: DelayNode;\n    new(): DelayNode;\n};\n\ninterface DeviceAcceleration {\n    readonly x: number | null;\n    readonly y: number | null;\n    readonly z: number | null;\n}\n\ndeclare var DeviceAcceleration: {\n    prototype: DeviceAcceleration;\n    new(): DeviceAcceleration;\n};\n\ninterface DeviceLightEvent extends Event {\n    readonly value: number;\n}\n\ndeclare var DeviceLightEvent: {\n    prototype: DeviceLightEvent;\n    new(typeArg: string, eventInitDict?: DeviceLightEventInit): DeviceLightEvent;\n};\n\ninterface DeviceMotionEvent extends Event {\n    readonly acceleration: DeviceAcceleration | null;\n    readonly accelerationIncludingGravity: DeviceAcceleration | null;\n    readonly interval: number | null;\n    readonly rotationRate: DeviceRotationRate | null;\n    initDeviceMotionEvent(type: string, bubbles: boolean, cancelable: boolean, acceleration: DeviceAccelerationDict | null, accelerationIncludingGravity: DeviceAccelerationDict | null, rotationRate: DeviceRotationRateDict | null, interval: number | null): void;\n}\n\ndeclare var DeviceMotionEvent: {\n    prototype: DeviceMotionEvent;\n    new(typeArg: string, eventInitDict?: DeviceMotionEventInit): DeviceMotionEvent;\n};\n\ninterface DeviceOrientationEvent extends Event {\n    readonly absolute: boolean;\n    readonly alpha: number | null;\n    readonly beta: number | null;\n    readonly gamma: number | null;\n    initDeviceOrientationEvent(type: string, bubbles: boolean, cancelable: boolean, alpha: number | null, beta: number | null, gamma: number | null, absolute: boolean): void;\n}\n\ndeclare var DeviceOrientationEvent: {\n    prototype: DeviceOrientationEvent;\n    new(typeArg: string, eventInitDict?: DeviceOrientationEventInit): DeviceOrientationEvent;\n};\n\ninterface DeviceRotationRate {\n    readonly alpha: number | null;\n    readonly beta: number | null;\n    readonly gamma: number | null;\n}\n\ndeclare var DeviceRotationRate: {\n    prototype: DeviceRotationRate;\n    new(): DeviceRotationRate;\n};\n\ninterface DocumentEventMap extends GlobalEventHandlersEventMap {\n    "abort": UIEvent;\n    "activate": UIEvent;\n    "beforeactivate": UIEvent;\n    "beforedeactivate": UIEvent;\n    "blur": FocusEvent;\n    "canplay": Event;\n    "canplaythrough": Event;\n    "change": Event;\n    "click": MouseEvent;\n    "contextmenu": PointerEvent;\n    "dblclick": MouseEvent;\n    "deactivate": UIEvent;\n    "drag": DragEvent;\n    "dragend": DragEvent;\n    "dragenter": DragEvent;\n    "dragleave": DragEvent;\n    "dragover": DragEvent;\n    "dragstart": DragEvent;\n    "drop": DragEvent;\n    "durationchange": Event;\n    "emptied": Event;\n    "ended": MediaStreamErrorEvent;\n    "error": ErrorEvent;\n    "focus": FocusEvent;\n    "fullscreenchange": Event;\n    "fullscreenerror": Event;\n    "input": Event;\n    "invalid": Event;\n    "keydown": KeyboardEvent;\n    "keypress": KeyboardEvent;\n    "keyup": KeyboardEvent;\n    "load": Event;\n    "loadeddata": Event;\n    "loadedmetadata": Event;\n    "loadstart": Event;\n    "mousedown": MouseEvent;\n    "mousemove": MouseEvent;\n    "mouseout": MouseEvent;\n    "mouseover": MouseEvent;\n    "mouseup": MouseEvent;\n    "mousewheel": WheelEvent;\n    "MSContentZoom": UIEvent;\n    "MSGestureChange": MSGestureEvent;\n    "MSGestureDoubleTap": MSGestureEvent;\n    "MSGestureEnd": MSGestureEvent;\n    "MSGestureHold": MSGestureEvent;\n    "MSGestureStart": MSGestureEvent;\n    "MSGestureTap": MSGestureEvent;\n    "MSInertiaStart": MSGestureEvent;\n    "MSManipulationStateChanged": MSManipulationEvent;\n    "MSPointerCancel": MSPointerEvent;\n    "MSPointerDown": MSPointerEvent;\n    "MSPointerEnter": MSPointerEvent;\n    "MSPointerLeave": MSPointerEvent;\n    "MSPointerMove": MSPointerEvent;\n    "MSPointerOut": MSPointerEvent;\n    "MSPointerOver": MSPointerEvent;\n    "MSPointerUp": MSPointerEvent;\n    "mssitemodejumplistitemremoved": MSSiteModeEvent;\n    "msthumbnailclick": MSSiteModeEvent;\n    "pause": Event;\n    "play": Event;\n    "playing": Event;\n    "pointerlockchange": Event;\n    "pointerlockerror": Event;\n    "progress": ProgressEvent;\n    "ratechange": Event;\n    "readystatechange": Event;\n    "reset": Event;\n    "scroll": UIEvent;\n    "seeked": Event;\n    "seeking": Event;\n    "select": UIEvent;\n    "selectionchange": Event;\n    "selectstart": Event;\n    "stalled": Event;\n    "stop": Event;\n    "submit": Event;\n    "suspend": Event;\n    "timeupdate": Event;\n    "touchcancel": TouchEvent;\n    "touchend": TouchEvent;\n    "touchmove": TouchEvent;\n    "touchstart": TouchEvent;\n    "volumechange": Event;\n    "waiting": Event;\n    "webkitfullscreenchange": Event;\n    "webkitfullscreenerror": Event;\n}\n\ninterface Document extends Node, GlobalEventHandlers, NodeSelector, DocumentEvent, ParentNode, DocumentOrShadowRoot {\n    /**\n     * Gets the object that has the focus when the parent document has focus.\n     */\n    readonly activeElement: Element;\n    /**\n     * Sets or gets the color of all active links in the document.\n     */\n    alinkColor: string;\n    /**\n     * Returns a reference to the collection of elements contained by the object.\n     */\n    readonly all: HTMLAllCollection;\n    /**\n     * Retrieves a collection of all a objects that have a name and/or id property. Objects in this collection are in HTML source order.\n     */\n    anchors: HTMLCollectionOf<HTMLAnchorElement>;\n    /**\n     * Retrieves a collection of all applet objects in the document.\n     */\n    applets: HTMLCollectionOf<HTMLAppletElement>;\n    /**\n     * Deprecated. Sets or retrieves a value that indicates the background color behind the object.\n     */\n    bgColor: string;\n    /**\n     * Specifies the beginning and end of the document body.\n     */\n    body: HTMLElement;\n    readonly characterSet: string;\n    /**\n     * Gets or sets the character set used to encode the object.\n     */\n    charset: string;\n    /**\n     * Gets a value that indicates whether standards-compliant mode is switched on for the object.\n     */\n    readonly compatMode: string;\n    cookie: string;\n    readonly currentScript: HTMLScriptElement | SVGScriptElement;\n    readonly defaultView: Window;\n    /**\n     * Sets or gets a value that indicates whether the document can be edited.\n     */\n    designMode: string;\n    /**\n     * Sets or retrieves a value that indicates the reading order of the object.\n     */\n    dir: string;\n    /**\n     * Gets an object representing the document type declaration associated with the current document.\n     */\n    readonly doctype: DocumentType;\n    /**\n     * Gets a reference to the root node of the document.\n     */\n    documentElement: HTMLElement;\n    /**\n     * Sets or gets the security domain of the document.\n     */\n    domain: string;\n    /**\n     * Retrieves a collection of all embed objects in the document.\n     */\n    embeds: HTMLCollectionOf<HTMLEmbedElement>;\n    /**\n     * Sets or gets the foreground (text) color of the document.\n     */\n    fgColor: string;\n    /**\n     * Retrieves a collection, in source order, of all form objects in the document.\n     */\n    forms: HTMLCollectionOf<HTMLFormElement>;\n    readonly fullscreenElement: Element | null;\n    readonly fullscreenEnabled: boolean;\n    readonly head: HTMLHeadElement;\n    readonly hidden: boolean;\n    /**\n     * Retrieves a collection, in source order, of img objects in the document.\n     */\n    images: HTMLCollectionOf<HTMLImageElement>;\n    /**\n     * Gets the implementation object of the current document.\n     */\n    readonly implementation: DOMImplementation;\n    /**\n     * Returns the character encoding used to create the webpage that is loaded into the document object.\n     */\n    readonly inputEncoding: string | null;\n    /**\n     * Gets the date that the page was last modified, if the page supplies one.\n     */\n    readonly lastModified: string;\n    /**\n     * Sets or gets the color of the document links.\n     */\n    linkColor: string;\n    /**\n     * Retrieves a collection of all a objects that specify the href property and all area objects in the document.\n     */\n    links: HTMLCollectionOf<HTMLAnchorElement | HTMLAreaElement>;\n    /**\n     * Contains information about the current URL.\n     */\n    readonly location: Location;\n    msCapsLockWarningOff: boolean;\n    msCSSOMElementFloatMetrics: boolean;\n    /**\n     * Fires when the user aborts the download.\n     * @param ev The event.\n     */\n    onabort: (this: Document, ev: UIEvent) => any;\n    /**\n     * Fires when the object is set as the active element.\n     * @param ev The event.\n     */\n    onactivate: (this: Document, ev: UIEvent) => any;\n    /**\n     * Fires immediately before the object is set as the active element.\n     * @param ev The event.\n     */\n    onbeforeactivate: (this: Document, ev: UIEvent) => any;\n    /**\n     * Fires immediately before the activeElement is changed from the current object to another object in the parent document.\n     * @param ev The event.\n     */\n    onbeforedeactivate: (this: Document, ev: UIEvent) => any;\n    /**\n     * Fires when the object loses the input focus.\n     * @param ev The focus event.\n     */\n    onblur: (this: Document, ev: FocusEvent) => any;\n    /**\n     * Occurs when playback is possible, but would require further buffering.\n     * @param ev The event.\n     */\n    oncanplay: (this: Document, ev: Event) => any;\n    oncanplaythrough: (this: Document, ev: Event) => any;\n    /**\n     * Fires when the contents of the object or selection have changed.\n     * @param ev The event.\n     */\n    onchange: (this: Document, ev: Event) => any;\n    /**\n     * Fires when the user clicks the left mouse button on the object\n     * @param ev The mouse event.\n     */\n    onclick: (this: Document, ev: MouseEvent) => any;\n    /**\n     * Fires when the user clicks the right mouse button in the client area, opening the context menu.\n     * @param ev The mouse event.\n     */\n    oncontextmenu: (this: Document, ev: PointerEvent) => any;\n    /**\n     * Fires when the user double-clicks the object.\n     * @param ev The mouse event.\n     */\n    ondblclick: (this: Document, ev: MouseEvent) => any;\n    /**\n     * Fires when the activeElement is changed from the current object to another object in the parent document.\n     * @param ev The UI Event\n     */\n    ondeactivate: (this: Document, ev: UIEvent) => any;\n    /**\n     * Fires on the source object continuously during a drag operation.\n     * @param ev The event.\n     */\n    ondrag: (this: Document, ev: DragEvent) => any;\n    /**\n     * Fires on the source object when the user releases the mouse at the close of a drag operation.\n     * @param ev The event.\n     */\n    ondragend: (this: Document, ev: DragEvent) => any;\n    /**\n     * Fires on the target element when the user drags the object to a valid drop target.\n     * @param ev The drag event.\n     */\n    ondragenter: (this: Document, ev: DragEvent) => any;\n    /**\n     * Fires on the target object when the user moves the mouse out of a valid drop target during a drag operation.\n     * @param ev The drag event.\n     */\n    ondragleave: (this: Document, ev: DragEvent) => any;\n    /**\n     * Fires on the target element continuously while the user drags the object over a valid drop target.\n     * @param ev The event.\n     */\n    ondragover: (this: Document, ev: DragEvent) => any;\n    /**\n     * Fires on the source object when the user starts to drag a text selection or selected object.\n     * @param ev The event.\n     */\n    ondragstart: (this: Document, ev: DragEvent) => any;\n    ondrop: (this: Document, ev: DragEvent) => any;\n    /**\n     * Occurs when the duration attribute is updated.\n     * @param ev The event.\n     */\n    ondurationchange: (this: Document, ev: Event) => any;\n    /**\n     * Occurs when the media element is reset to its initial state.\n     * @param ev The event.\n     */\n    onemptied: (this: Document, ev: Event) => any;\n    /**\n     * Occurs when the end of playback is reached.\n     * @param ev The event\n     */\n    onended: (this: Document, ev: MediaStreamErrorEvent) => any;\n    /**\n     * Fires when an error occurs during object loading.\n     * @param ev The event.\n     */\n    onerror: (this: Document, ev: ErrorEvent) => any;\n    /**\n     * Fires when the object receives focus.\n     * @param ev The event.\n     */\n    onfocus: (this: Document, ev: FocusEvent) => any;\n    onfullscreenchange: (this: Document, ev: Event) => any;\n    onfullscreenerror: (this: Document, ev: Event) => any;\n    oninput: (this: Document, ev: Event) => any;\n    oninvalid: (this: Document, ev: Event) => any;\n    /**\n     * Fires when the user presses a key.\n     * @param ev The keyboard event\n     */\n    onkeydown: (this: Document, ev: KeyboardEvent) => any;\n    /**\n     * Fires when the user presses an alphanumeric key.\n     * @param ev The event.\n     */\n    onkeypress: (this: Document, ev: KeyboardEvent) => any;\n    /**\n     * Fires when the user releases a key.\n     * @param ev The keyboard event\n     */\n    onkeyup: (this: Document, ev: KeyboardEvent) => any;\n    /**\n     * Fires immediately after the browser loads the object.\n     * @param ev The event.\n     */\n    onload: (this: Document, ev: Event) => any;\n    /**\n     * Occurs when media data is loaded at the current playback position.\n     * @param ev The event.\n     */\n    onloadeddata: (this: Document, ev: Event) => any;\n    /**\n     * Occurs when the duration and dimensions of the media have been determined.\n     * @param ev The event.\n     */\n    onloadedmetadata: (this: Document, ev: Event) => any;\n    /**\n     * Occurs when Internet Explorer begins looking for media data.\n     * @param ev The event.\n     */\n    onloadstart: (this: Document, ev: Event) => any;\n    /**\n     * Fires when the user clicks the object with either mouse button.\n     * @param ev The mouse event.\n     */\n    onmousedown: (this: Document, ev: MouseEvent) => any;\n    /**\n     * Fires when the user moves the mouse over the object.\n     * @param ev The mouse event.\n     */\n    onmousemove: (this: Document, ev: MouseEvent) => any;\n    /**\n     * Fires when the user moves the mouse pointer outside the boundaries of the object.\n     * @param ev The mouse event.\n     */\n    onmouseout: (this: Document, ev: MouseEvent) => any;\n    /**\n     * Fires when the user moves the mouse pointer into the object.\n     * @param ev The mouse event.\n     */\n    onmouseover: (this: Document, ev: MouseEvent) => any;\n    /**\n     * Fires when the user releases a mouse button while the mouse is over the object.\n     * @param ev The mouse event.\n     */\n    onmouseup: (this: Document, ev: MouseEvent) => any;\n    /**\n     * Fires when the wheel button is rotated.\n     * @param ev The mouse event\n     */\n    onmousewheel: (this: Document, ev: WheelEvent) => any;\n    onmscontentzoom: (this: Document, ev: UIEvent) => any;\n    onmsgesturechange: (this: Document, ev: MSGestureEvent) => any;\n    onmsgesturedoubletap: (this: Document, ev: MSGestureEvent) => any;\n    onmsgestureend: (this: Document, ev: MSGestureEvent) => any;\n    onmsgesturehold: (this: Document, ev: MSGestureEvent) => any;\n    onmsgesturestart: (this: Document, ev: MSGestureEvent) => any;\n    onmsgesturetap: (this: Document, ev: MSGestureEvent) => any;\n    onmsinertiastart: (this: Document, ev: MSGestureEvent) => any;\n    onmsmanipulationstatechanged: (this: Document, ev: MSManipulationEvent) => any;\n    onmspointercancel: (this: Document, ev: MSPointerEvent) => any;\n    onmspointerdown: (this: Document, ev: MSPointerEvent) => any;\n    onmspointerenter: (this: Document, ev: MSPointerEvent) => any;\n    onmspointerleave: (this: Document, ev: MSPointerEvent) => any;\n    onmspointermove: (this: Document, ev: MSPointerEvent) => any;\n    onmspointerout: (this: Document, ev: MSPointerEvent) => any;\n    onmspointerover: (this: Document, ev: MSPointerEvent) => any;\n    onmspointerup: (this: Document, ev: MSPointerEvent) => any;\n    /**\n     * Occurs when an item is removed from a Jump List of a webpage running in Site Mode.\n     * @param ev The event.\n     */\n    onmssitemodejumplistitemremoved: (this: Document, ev: MSSiteModeEvent) => any;\n    /**\n     * Occurs when a user clicks a button in a Thumbnail Toolbar of a webpage running in Site Mode.\n     * @param ev The event.\n     */\n    onmsthumbnailclick: (this: Document, ev: MSSiteModeEvent) => any;\n    /**\n     * Occurs when playback is paused.\n     * @param ev The event.\n     */\n    onpause: (this: Document, ev: Event) => any;\n    /**\n     * Occurs when the play method is requested.\n     * @param ev The event.\n     */\n    onplay: (this: Document, ev: Event) => any;\n    /**\n     * Occurs when the audio or video has started playing.\n     * @param ev The event.\n     */\n    onplaying: (this: Document, ev: Event) => any;\n    onpointerlockchange: (this: Document, ev: Event) => any;\n    onpointerlockerror: (this: Document, ev: Event) => any;\n    /**\n     * Occurs to indicate progress while downloading media data.\n     * @param ev The event.\n     */\n    onprogress: (this: Document, ev: ProgressEvent) => any;\n    /**\n     * Occurs when the playback rate is increased or decreased.\n     * @param ev The event.\n     */\n    onratechange: (this: Document, ev: Event) => any;\n    /**\n     * Fires when the state of the object has changed.\n     * @param ev The event\n     */\n    onreadystatechange: (this: Document, ev: Event) => any;\n    /**\n     * Fires when the user resets a form.\n     * @param ev The event.\n     */\n    onreset: (this: Document, ev: Event) => any;\n    /**\n     * Fires when the user repositions the scroll box in the scroll bar on the object.\n     * @param ev The event.\n     */\n    onscroll: (this: Document, ev: UIEvent) => any;\n    /**\n     * Occurs when the seek operation ends.\n     * @param ev The event.\n     */\n    onseeked: (this: Document, ev: Event) => any;\n    /**\n     * Occurs when the current playback position is moved.\n     * @param ev The event.\n     */\n    onseeking: (this: Document, ev: Event) => any;\n    /**\n     * Fires when the current selection changes.\n     * @param ev The event.\n     */\n    onselect: (this: Document, ev: UIEvent) => any;\n    /**\n     * Fires when the selection state of a document changes.\n     * @param ev The event.\n     */\n    onselectionchange: (this: Document, ev: Event) => any;\n    onselectstart: (this: Document, ev: Event) => any;\n    /**\n     * Occurs when the download has stopped.\n     * @param ev The event.\n     */\n    onstalled: (this: Document, ev: Event) => any;\n    /**\n     * Fires when the user clicks the Stop button or leaves the Web page.\n     * @param ev The event.\n     */\n    onstop: (this: Document, ev: Event) => any;\n    onsubmit: (this: Document, ev: Event) => any;\n    /**\n     * Occurs if the load operation has been intentionally halted.\n     * @param ev The event.\n     */\n    onsuspend: (this: Document, ev: Event) => any;\n    /**\n     * Occurs to indicate the current playback position.\n     * @param ev The event.\n     */\n    ontimeupdate: (this: Document, ev: Event) => any;\n    ontouchcancel: (ev: TouchEvent) => any;\n    ontouchend: (ev: TouchEvent) => any;\n    ontouchmove: (ev: TouchEvent) => any;\n    ontouchstart: (ev: TouchEvent) => any;\n    /**\n     * Occurs when the volume is changed, or playback is muted or unmuted.\n     * @param ev The event.\n     */\n    onvolumechange: (this: Document, ev: Event) => any;\n    /**\n     * Occurs when playback stops because the next frame of a video resource is not available.\n     * @param ev The event.\n     */\n    onwaiting: (this: Document, ev: Event) => any;\n    onwebkitfullscreenchange: (this: Document, ev: Event) => any;\n    onwebkitfullscreenerror: (this: Document, ev: Event) => any;\n    plugins: HTMLCollectionOf<HTMLEmbedElement>;\n    readonly pointerLockElement: Element;\n    /**\n     * Retrieves a value that indicates the current state of the object.\n     */\n    readonly readyState: string;\n    /**\n     * Gets the URL of the location that referred the user to the current page.\n     */\n    readonly referrer: string;\n    /**\n     * Gets the root svg element in the document hierarchy.\n     */\n    readonly rootElement: SVGSVGElement;\n    /**\n     * Retrieves a collection of all script objects in the document.\n     */\n    scripts: HTMLCollectionOf<HTMLScriptElement>;\n    readonly scrollingElement: Element | null;\n    /**\n     * Retrieves a collection of styleSheet objects representing the style sheets that correspond to each instance of a link or style object in the document.\n     */\n    readonly styleSheets: StyleSheetList;\n    /**\n     * Contains the title of the document.\n     */\n    title: string;\n    /**\n     * Sets or gets the URL for the current document.\n     */\n    readonly URL: string;\n    /**\n     * Gets the URL for the document, stripped of any character encoding.\n     */\n    readonly URLUnencoded: string;\n    readonly visibilityState: VisibilityState;\n    /**\n     * Sets or gets the color of the links that the user has visited.\n     */\n    vlinkColor: string;\n    readonly webkitCurrentFullScreenElement: Element | null;\n    readonly webkitFullscreenElement: Element | null;\n    readonly webkitFullscreenEnabled: boolean;\n    readonly webkitIsFullScreen: boolean;\n    readonly xmlEncoding: string | null;\n    xmlStandalone: boolean;\n    /**\n     * Gets or sets the version attribute specified in the declaration of an XML document.\n     */\n    xmlVersion: string | null;\n    adoptNode<T extends Node>(source: T): T;\n    captureEvents(): void;\n    caretRangeFromPoint(x: number, y: number): Range;\n    clear(): void;\n    /**\n     * Closes an output stream and forces the sent data to display.\n     */\n    close(): void;\n    /**\n     * Creates an attribute object with a specified name.\n     * @param name String that sets the attribute object\'s name.\n     */\n    createAttribute(name: string): Attr;\n    createAttributeNS(namespaceURI: string | null, qualifiedName: string): Attr;\n    createCDATASection(data: string): CDATASection;\n    /**\n     * Creates a comment object with the specified data.\n     * @param data Sets the comment object\'s data.\n     */\n    createComment(data: string): Comment;\n    /**\n     * Creates a new document.\n     */\n    createDocumentFragment(): DocumentFragment;\n    /**\n     * Creates an instance of the element for the specified tag.\n     * @param tagName The name of an element.\n     */\n    createElement<K extends keyof HTMLElementTagNameMap>(tagName: K): HTMLElementTagNameMap[K];\n    createElement(tagName: string): HTMLElement;\n    createElementNS(namespaceURI: "http://www.w3.org/1999/xhtml", qualifiedName: string): HTMLElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "a"): SVGAElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "circle"): SVGCircleElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "clipPath"): SVGClipPathElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "componentTransferFunction"): SVGComponentTransferFunctionElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "defs"): SVGDefsElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "desc"): SVGDescElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "ellipse"): SVGEllipseElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feBlend"): SVGFEBlendElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feColorMatrix"): SVGFEColorMatrixElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feComponentTransfer"): SVGFEComponentTransferElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feComposite"): SVGFECompositeElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feConvolveMatrix"): SVGFEConvolveMatrixElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feDiffuseLighting"): SVGFEDiffuseLightingElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feDisplacementMap"): SVGFEDisplacementMapElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feDistantLight"): SVGFEDistantLightElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feFlood"): SVGFEFloodElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feFuncA"): SVGFEFuncAElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feFuncB"): SVGFEFuncBElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feFuncG"): SVGFEFuncGElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feFuncR"): SVGFEFuncRElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feGaussianBlur"): SVGFEGaussianBlurElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feImage"): SVGFEImageElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feMerge"): SVGFEMergeElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feMergeNode"): SVGFEMergeNodeElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feMorphology"): SVGFEMorphologyElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feOffset"): SVGFEOffsetElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "fePointLight"): SVGFEPointLightElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feSpecularLighting"): SVGFESpecularLightingElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feSpotLight"): SVGFESpotLightElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feTile"): SVGFETileElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "feTurbulence"): SVGFETurbulenceElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "filter"): SVGFilterElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "foreignObject"): SVGForeignObjectElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "g"): SVGGElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "image"): SVGImageElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "gradient"): SVGGradientElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "line"): SVGLineElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "linearGradient"): SVGLinearGradientElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "marker"): SVGMarkerElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "mask"): SVGMaskElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "path"): SVGPathElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "metadata"): SVGMetadataElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "pattern"): SVGPatternElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "polygon"): SVGPolygonElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "polyline"): SVGPolylineElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "radialGradient"): SVGRadialGradientElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "rect"): SVGRectElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "svg"): SVGSVGElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "script"): SVGScriptElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "stop"): SVGStopElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "style"): SVGStyleElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "switch"): SVGSwitchElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "symbol"): SVGSymbolElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "tspan"): SVGTSpanElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "textContent"): SVGTextContentElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "text"): SVGTextElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "textPath"): SVGTextPathElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "textPositioning"): SVGTextPositioningElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "title"): SVGTitleElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "use"): SVGUseElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: "view"): SVGViewElement;\n    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: string): SVGElement;\n    createElementNS(namespaceURI: string | null, qualifiedName: string): Element;\n    createExpression(expression: string, resolver: XPathNSResolver): XPathExpression;\n    /**\n     * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.\n     * @param root The root element or node to start traversing on.\n     * @param whatToShow The type of nodes or elements to appear in the node list\n     * @param filter A custom NodeFilter function to use. For more information, see filter. Use null for no filter.\n     * @param entityReferenceExpansion A flag that specifies whether entity reference nodes are expanded.\n     */\n    createNodeIterator(root: Node, whatToShow?: number, filter?: NodeFilter, entityReferenceExpansion?: boolean): NodeIterator;\n    createNSResolver(nodeResolver: Node): XPathNSResolver;\n    createProcessingInstruction(target: string, data: string): ProcessingInstruction;\n    /**\n     *  Returns an empty range object that has both of its boundary points positioned at the beginning of the document.\n     */\n    createRange(): Range;\n    /**\n     * Creates a text string from the specified value.\n     * @param data String that specifies the nodeValue property of the text node.\n     */\n    createTextNode(data: string): Text;\n    createTouch(view: Window, target: EventTarget, identifier: number, pageX: number, pageY: number, screenX: number, screenY: number): Touch;\n    createTouchList(...touches: Touch[]): TouchList;\n    /**\n     * Creates a TreeWalker object that you can use to traverse filtered lists of nodes or elements in a document.\n     * @param root The root element or node to start traversing on.\n     * @param whatToShow The type of nodes or elements to appear in the node list. For more information, see whatToShow.\n     * @param filter A custom NodeFilter function to use.\n     * @param entityReferenceExpansion A flag that specifies whether entity reference nodes are expanded.\n     */\n    createTreeWalker(root: Node, whatToShow?: number, filter?: NodeFilter, entityReferenceExpansion?: boolean): TreeWalker;\n    /**\n     * Returns the element for the specified x coordinate and the specified y coordinate.\n     * @param x The x-offset\n     * @param y The y-offset\n     */\n    elementFromPoint(x: number, y: number): Element;\n    evaluate(expression: string, contextNode: Node, resolver: XPathNSResolver | null, type: number, result: XPathResult | null): XPathResult;\n    /**\n     * Executes a command on the current document, current selection, or the given range.\n     * @param commandId String that specifies the command to execute. This command can be any of the command identifiers that can be executed in script.\n     * @param showUI Display the user interface, defaults to false.\n     * @param value Value to assign.\n     */\n    execCommand(commandId: string, showUI?: boolean, value?: any): boolean;\n    /**\n     * Displays help information for the given command identifier.\n     * @param commandId Displays help information for the given command identifier.\n     */\n    execCommandShowHelp(commandId: string): boolean;\n    exitFullscreen(): void;\n    exitPointerLock(): void;\n    /**\n     * Causes the element to receive the focus and executes the code specified by the onfocus event.\n     */\n    focus(): void;\n    /**\n     * Returns a reference to the first object with the specified value of the ID or NAME attribute.\n     * @param elementId String that specifies the ID value. Case-insensitive.\n     */\n    getElementById(elementId: string): HTMLElement | null;\n    getElementsByClassName(classNames: string): HTMLCollectionOf<Element>;\n    /**\n     * Gets a collection of objects based on the value of the NAME or ID attribute.\n     * @param elementName Gets a collection of objects based on the value of the NAME or ID attribute.\n     */\n    getElementsByName(elementName: string): NodeListOf<HTMLElement>;\n    /**\n     * Retrieves a collection of objects based on the specified element name.\n     * @param name Specifies the name of an element.\n     */\n    getElementsByTagName<K extends keyof ElementListTagNameMap>(tagname: K): ElementListTagNameMap[K];\n    getElementsByTagName(tagname: string): NodeListOf<Element>;\n    getElementsByTagNameNS(namespaceURI: "http://www.w3.org/1999/xhtml", localName: string): HTMLCollectionOf<HTMLElement>;\n    getElementsByTagNameNS(namespaceURI: "http://www.w3.org/2000/svg", localName: string): HTMLCollectionOf<SVGElement>;\n    getElementsByTagNameNS(namespaceURI: string, localName: string): HTMLCollectionOf<Element>;\n    /**\n     * Returns an object representing the current selection of the document that is loaded into the object displaying a webpage.\n     */\n    getSelection(): Selection;\n    /**\n     * Gets a value indicating whether the object currently has focus.\n     */\n    hasFocus(): boolean;\n    importNode<T extends Node>(importedNode: T, deep: boolean): T;\n    msElementsFromPoint(x: number, y: number): NodeListOf<Element>;\n    msElementsFromRect(left: number, top: number, width: number, height: number): NodeListOf<Element>;\n    /**\n     * Opens a new window and loads a document specified by a given URL. Also, opens a new window that uses the url parameter and the name parameter to collect the output of the write method and the writeln method.\n     * @param url Specifies a MIME type for the document.\n     * @param name Specifies the name of the window. This name is used as the value for the TARGET attribute on a form or an anchor element.\n     * @param features Contains a list of items separated by commas. Each item consists of an option and a value, separated by an equals sign (for example, "fullscreen=yes, toolbar=yes"). The following values are supported.\n     * @param replace Specifies whether the existing entry for the document is replaced in the history list.\n     */\n    open(url?: string, name?: string, features?: string, replace?: boolean): Document;\n    /**\n     * Returns a Boolean value that indicates whether a specified command can be successfully executed using execCommand, given the current state of the document.\n     * @param commandId Specifies a command identifier.\n     */\n    queryCommandEnabled(commandId: string): boolean;\n    /**\n     * Returns a Boolean value that indicates whether the specified command is in the indeterminate state.\n     * @param commandId String that specifies a command identifier.\n     */\n    queryCommandIndeterm(commandId: string): boolean;\n    /**\n     * Returns a Boolean value that indicates the current state of the command.\n     * @param commandId String that specifies a command identifier.\n     */\n    queryCommandState(commandId: string): boolean;\n    /**\n     * Returns a Boolean value that indicates whether the current command is supported on the current range.\n     * @param commandId Specifies a command identifier.\n     */\n    queryCommandSupported(commandId: string): boolean;\n    /**\n     * Retrieves the string associated with a command.\n     * @param commandId String that contains the identifier of a command. This can be any command identifier given in the list of Command Identifiers.\n     */\n    queryCommandText(commandId: string): string;\n    /**\n     * Returns the current value of the document, range, or current selection for the given command.\n     * @param commandId String that specifies a command identifier.\n     */\n    queryCommandValue(commandId: string): string;\n    releaseEvents(): void;\n    /**\n     * Allows updating the print settings for the page.\n     */\n    updateSettings(): void;\n    webkitCancelFullScreen(): void;\n    webkitExitFullscreen(): void;\n    /**\n     * Writes one or more HTML expressions to a document in the specified window.\n     * @param content Specifies the text and HTML tags to write.\n     */\n    write(...content: string[]): void;\n    /**\n     * Writes one or more HTML expressions, followed by a carriage return, to a document in the specified window.\n     * @param content The text and HTML tags to write.\n     */\n    writeln(...content: string[]): void;\n    addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var Document: {\n    prototype: Document;\n    new(): Document;\n};\n\ninterface DocumentFragment extends Node, NodeSelector, ParentNode {\n    getElementById(elementId: string): HTMLElement | null;\n}\n\ndeclare var DocumentFragment: {\n    prototype: DocumentFragment;\n    new(): DocumentFragment;\n};\n\ninterface DocumentType extends Node, ChildNode {\n    readonly entities: NamedNodeMap;\n    readonly internalSubset: string | null;\n    readonly name: string;\n    readonly notations: NamedNodeMap;\n    readonly publicId: string;\n    readonly systemId: string;\n}\n\ndeclare var DocumentType: {\n    prototype: DocumentType;\n    new(): DocumentType;\n};\n\ninterface DOMError {\n    readonly name: string;\n    toString(): string;\n}\n\ndeclare var DOMError: {\n    prototype: DOMError;\n    new(): DOMError;\n};\n\ninterface DOMException {\n    readonly code: number;\n    readonly message: string;\n    readonly name: string;\n    toString(): string;\n    readonly ABORT_ERR: number;\n    readonly DATA_CLONE_ERR: number;\n    readonly DOMSTRING_SIZE_ERR: number;\n    readonly HIERARCHY_REQUEST_ERR: number;\n    readonly INDEX_SIZE_ERR: number;\n    readonly INUSE_ATTRIBUTE_ERR: number;\n    readonly INVALID_ACCESS_ERR: number;\n    readonly INVALID_CHARACTER_ERR: number;\n    readonly INVALID_MODIFICATION_ERR: number;\n    readonly INVALID_NODE_TYPE_ERR: number;\n    readonly INVALID_STATE_ERR: number;\n    readonly NAMESPACE_ERR: number;\n    readonly NETWORK_ERR: number;\n    readonly NO_DATA_ALLOWED_ERR: number;\n    readonly NO_MODIFICATION_ALLOWED_ERR: number;\n    readonly NOT_FOUND_ERR: number;\n    readonly NOT_SUPPORTED_ERR: number;\n    readonly PARSE_ERR: number;\n    readonly QUOTA_EXCEEDED_ERR: number;\n    readonly SECURITY_ERR: number;\n    readonly SERIALIZE_ERR: number;\n    readonly SYNTAX_ERR: number;\n    readonly TIMEOUT_ERR: number;\n    readonly TYPE_MISMATCH_ERR: number;\n    readonly URL_MISMATCH_ERR: number;\n    readonly VALIDATION_ERR: number;\n    readonly WRONG_DOCUMENT_ERR: number;\n}\n\ndeclare var DOMException: {\n    prototype: DOMException;\n    new(): DOMException;\n    readonly ABORT_ERR: number;\n    readonly DATA_CLONE_ERR: number;\n    readonly DOMSTRING_SIZE_ERR: number;\n    readonly HIERARCHY_REQUEST_ERR: number;\n    readonly INDEX_SIZE_ERR: number;\n    readonly INUSE_ATTRIBUTE_ERR: number;\n    readonly INVALID_ACCESS_ERR: number;\n    readonly INVALID_CHARACTER_ERR: number;\n    readonly INVALID_MODIFICATION_ERR: number;\n    readonly INVALID_NODE_TYPE_ERR: number;\n    readonly INVALID_STATE_ERR: number;\n    readonly NAMESPACE_ERR: number;\n    readonly NETWORK_ERR: number;\n    readonly NO_DATA_ALLOWED_ERR: number;\n    readonly NO_MODIFICATION_ALLOWED_ERR: number;\n    readonly NOT_FOUND_ERR: number;\n    readonly NOT_SUPPORTED_ERR: number;\n    readonly PARSE_ERR: number;\n    readonly QUOTA_EXCEEDED_ERR: number;\n    readonly SECURITY_ERR: number;\n    readonly SERIALIZE_ERR: number;\n    readonly SYNTAX_ERR: number;\n    readonly TIMEOUT_ERR: number;\n    readonly TYPE_MISMATCH_ERR: number;\n    readonly URL_MISMATCH_ERR: number;\n    readonly VALIDATION_ERR: number;\n    readonly WRONG_DOCUMENT_ERR: number;\n};\n\ninterface DOMImplementation {\n    createDocument(namespaceURI: string | null, qualifiedName: string | null, doctype: DocumentType | null): Document;\n    createDocumentType(qualifiedName: string, publicId: string, systemId: string): DocumentType;\n    createHTMLDocument(title: string): Document;\n    hasFeature(feature: string | null, version: string | null): boolean;\n}\n\ndeclare var DOMImplementation: {\n    prototype: DOMImplementation;\n    new(): DOMImplementation;\n};\n\ninterface DOMParser {\n    parseFromString(source: string, mimeType: string): Document;\n}\n\ndeclare var DOMParser: {\n    prototype: DOMParser;\n    new(): DOMParser;\n};\n\ninterface DOMSettableTokenList extends DOMTokenList {\n    value: string;\n}\n\ndeclare var DOMSettableTokenList: {\n    prototype: DOMSettableTokenList;\n    new(): DOMSettableTokenList;\n};\n\ninterface DOMStringList {\n    readonly length: number;\n    contains(str: string): boolean;\n    item(index: number): string | null;\n    [index: number]: string;\n}\n\ndeclare var DOMStringList: {\n    prototype: DOMStringList;\n    new(): DOMStringList;\n};\n\ninterface DOMStringMap {\n    [name: string]: string | undefined;\n}\n\ndeclare var DOMStringMap: {\n    prototype: DOMStringMap;\n    new(): DOMStringMap;\n};\n\ninterface DOMTokenList {\n    readonly length: number;\n    add(...token: string[]): void;\n    contains(token: string): boolean;\n    item(index: number): string;\n    remove(...token: string[]): void;\n    toggle(token: string, force?: boolean): boolean;\n    toString(): string;\n    [index: number]: string;\n}\n\ndeclare var DOMTokenList: {\n    prototype: DOMTokenList;\n    new(): DOMTokenList;\n};\n\ninterface DragEvent extends MouseEvent {\n    readonly dataTransfer: DataTransfer;\n    initDragEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, ctrlKeyArg: boolean, altKeyArg: boolean, shiftKeyArg: boolean, metaKeyArg: boolean, buttonArg: number, relatedTargetArg: EventTarget, dataTransferArg: DataTransfer): void;\n    msConvertURL(file: File, targetType: string, targetURL?: string): void;\n}\n\ndeclare var DragEvent: {\n    prototype: DragEvent;\n    new(type: "drag" | "dragend" | "dragenter" | "dragexit" | "dragleave" | "dragover" | "dragstart" | "drop", dragEventInit?: { dataTransfer?: DataTransfer }): DragEvent;\n};\n\ninterface DynamicsCompressorNode extends AudioNode {\n    readonly attack: AudioParam;\n    readonly knee: AudioParam;\n    readonly ratio: AudioParam;\n    readonly reduction: number;\n    readonly release: AudioParam;\n    readonly threshold: AudioParam;\n}\n\ndeclare var DynamicsCompressorNode: {\n    prototype: DynamicsCompressorNode;\n    new(): DynamicsCompressorNode;\n};\n\ninterface ElementEventMap extends GlobalEventHandlersEventMap {\n    "ariarequest": Event;\n    "command": Event;\n    "gotpointercapture": PointerEvent;\n    "lostpointercapture": PointerEvent;\n    "MSGestureChange": MSGestureEvent;\n    "MSGestureDoubleTap": MSGestureEvent;\n    "MSGestureEnd": MSGestureEvent;\n    "MSGestureHold": MSGestureEvent;\n    "MSGestureStart": MSGestureEvent;\n    "MSGestureTap": MSGestureEvent;\n    "MSGotPointerCapture": MSPointerEvent;\n    "MSInertiaStart": MSGestureEvent;\n    "MSLostPointerCapture": MSPointerEvent;\n    "MSPointerCancel": MSPointerEvent;\n    "MSPointerDown": MSPointerEvent;\n    "MSPointerEnter": MSPointerEvent;\n    "MSPointerLeave": MSPointerEvent;\n    "MSPointerMove": MSPointerEvent;\n    "MSPointerOut": MSPointerEvent;\n    "MSPointerOver": MSPointerEvent;\n    "MSPointerUp": MSPointerEvent;\n    "touchcancel": TouchEvent;\n    "touchend": TouchEvent;\n    "touchmove": TouchEvent;\n    "touchstart": TouchEvent;\n    "webkitfullscreenchange": Event;\n    "webkitfullscreenerror": Event;\n}\n\ninterface Element extends Node, GlobalEventHandlers, ElementTraversal, NodeSelector, ChildNode, ParentNode {\n    readonly classList: DOMTokenList;\n    className: string;\n    readonly clientHeight: number;\n    readonly clientLeft: number;\n    readonly clientTop: number;\n    readonly clientWidth: number;\n    id: string;\n    innerHTML: string;\n    msContentZoomFactor: number;\n    readonly msRegionOverflow: string;\n    onariarequest: (this: Element, ev: Event) => any;\n    oncommand: (this: Element, ev: Event) => any;\n    ongotpointercapture: (this: Element, ev: PointerEvent) => any;\n    onlostpointercapture: (this: Element, ev: PointerEvent) => any;\n    onmsgesturechange: (this: Element, ev: MSGestureEvent) => any;\n    onmsgesturedoubletap: (this: Element, ev: MSGestureEvent) => any;\n    onmsgestureend: (this: Element, ev: MSGestureEvent) => any;\n    onmsgesturehold: (this: Element, ev: MSGestureEvent) => any;\n    onmsgesturestart: (this: Element, ev: MSGestureEvent) => any;\n    onmsgesturetap: (this: Element, ev: MSGestureEvent) => any;\n    onmsgotpointercapture: (this: Element, ev: MSPointerEvent) => any;\n    onmsinertiastart: (this: Element, ev: MSGestureEvent) => any;\n    onmslostpointercapture: (this: Element, ev: MSPointerEvent) => any;\n    onmspointercancel: (this: Element, ev: MSPointerEvent) => any;\n    onmspointerdown: (this: Element, ev: MSPointerEvent) => any;\n    onmspointerenter: (this: Element, ev: MSPointerEvent) => any;\n    onmspointerleave: (this: Element, ev: MSPointerEvent) => any;\n    onmspointermove: (this: Element, ev: MSPointerEvent) => any;\n    onmspointerout: (this: Element, ev: MSPointerEvent) => any;\n    onmspointerover: (this: Element, ev: MSPointerEvent) => any;\n    onmspointerup: (this: Element, ev: MSPointerEvent) => any;\n    ontouchcancel: (ev: TouchEvent) => any;\n    ontouchend: (ev: TouchEvent) => any;\n    ontouchmove: (ev: TouchEvent) => any;\n    ontouchstart: (ev: TouchEvent) => any;\n    onwebkitfullscreenchange: (this: Element, ev: Event) => any;\n    onwebkitfullscreenerror: (this: Element, ev: Event) => any;\n    outerHTML: string;\n    readonly prefix: string | null;\n    readonly scrollHeight: number;\n    scrollLeft: number;\n    scrollTop: number;\n    readonly scrollWidth: number;\n    readonly tagName: string;\n    readonly assignedSlot: HTMLSlotElement | null;\n    slot: string;\n    readonly shadowRoot: ShadowRoot | null;\n    getAttribute(name: string): string | null;\n    getAttributeNode(name: string): Attr;\n    getAttributeNodeNS(namespaceURI: string, localName: string): Attr;\n    getAttributeNS(namespaceURI: string, localName: string): string;\n    getBoundingClientRect(): ClientRect;\n    getClientRects(): ClientRectList;\n    getElementsByTagName<K extends keyof ElementListTagNameMap>(name: K): ElementListTagNameMap[K];\n    getElementsByTagName(name: string): NodeListOf<Element>;\n    getElementsByTagNameNS(namespaceURI: "http://www.w3.org/1999/xhtml", localName: string): HTMLCollectionOf<HTMLElement>;\n    getElementsByTagNameNS(namespaceURI: "http://www.w3.org/2000/svg", localName: string): HTMLCollectionOf<SVGElement>;\n    getElementsByTagNameNS(namespaceURI: string, localName: string): HTMLCollectionOf<Element>;\n    hasAttribute(name: string): boolean;\n    hasAttributeNS(namespaceURI: string, localName: string): boolean;\n    msGetRegionContent(): MSRangeCollection;\n    msGetUntransformedBounds(): ClientRect;\n    msMatchesSelector(selectors: string): boolean;\n    msReleasePointerCapture(pointerId: number): void;\n    msSetPointerCapture(pointerId: number): void;\n    msZoomTo(args: MsZoomToOptions): void;\n    releasePointerCapture(pointerId: number): void;\n    removeAttribute(qualifiedName: string): void;\n    removeAttributeNode(oldAttr: Attr): Attr;\n    removeAttributeNS(namespaceURI: string, localName: string): void;\n    requestFullscreen(): void;\n    requestPointerLock(): void;\n    setAttribute(name: string, value: string): void;\n    setAttributeNode(newAttr: Attr): Attr;\n    setAttributeNodeNS(newAttr: Attr): Attr;\n    setAttributeNS(namespaceURI: string, qualifiedName: string, value: string): void;\n    setPointerCapture(pointerId: number): void;\n    webkitMatchesSelector(selectors: string): boolean;\n    webkitRequestFullscreen(): void;\n    webkitRequestFullScreen(): void;\n    getElementsByClassName(classNames: string): NodeListOf<Element>;\n    matches(selector: string): boolean;\n    closest(selector: string): Element | null;\n    scrollIntoView(arg?: boolean | ScrollIntoViewOptions): void;\n    scroll(options?: ScrollToOptions): void;\n    scroll(x: number, y: number): void;\n    scrollTo(options?: ScrollToOptions): void;\n    scrollTo(x: number, y: number): void;\n    scrollBy(options?: ScrollToOptions): void;\n    scrollBy(x: number, y: number): void;\n    insertAdjacentElement(position: InsertPosition, insertedElement: Element): Element | null;\n    insertAdjacentHTML(where: InsertPosition, html: string): void;\n    insertAdjacentText(where: InsertPosition, text: string): void;\n    attachShadow(shadowRootInitDict: ShadowRootInit): ShadowRoot;\n    addEventListener<K extends keyof ElementEventMap>(type: K, listener: (this: Element, ev: ElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var Element: {\n    prototype: Element;\n    new(): Element;\n};\n\ninterface ErrorEvent extends Event {\n    readonly colno: number;\n    readonly error: any;\n    readonly filename: string;\n    readonly lineno: number;\n    readonly message: string;\n    initErrorEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, messageArg: string, filenameArg: string, linenoArg: number): void;\n}\n\ndeclare var ErrorEvent: {\n    prototype: ErrorEvent;\n    new(type: string, errorEventInitDict?: ErrorEventInit): ErrorEvent;\n};\n\ninterface Event {\n    readonly bubbles: boolean;\n    readonly cancelable: boolean;\n    cancelBubble: boolean;\n    readonly currentTarget: EventTarget;\n    readonly defaultPrevented: boolean;\n    readonly eventPhase: number;\n    readonly isTrusted: boolean;\n    returnValue: boolean;\n    readonly srcElement: Element | null;\n    readonly target: EventTarget;\n    readonly timeStamp: number;\n    readonly type: string;\n    readonly scoped: boolean;\n    initEvent(eventTypeArg: string, canBubbleArg: boolean, cancelableArg: boolean): void;\n    preventDefault(): void;\n    stopImmediatePropagation(): void;\n    stopPropagation(): void;\n    deepPath(): EventTarget[];\n    readonly AT_TARGET: number;\n    readonly BUBBLING_PHASE: number;\n    readonly CAPTURING_PHASE: number;\n}\n\ndeclare var Event: {\n    prototype: Event;\n    new(typeArg: string, eventInitDict?: EventInit): Event;\n    readonly AT_TARGET: number;\n    readonly BUBBLING_PHASE: number;\n    readonly CAPTURING_PHASE: number;\n};\n\ninterface EventTarget {\n    addEventListener(type: string, listener?: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;\n    dispatchEvent(evt: Event): boolean;\n    removeEventListener(type: string, listener?: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;\n}\n\ndeclare var EventTarget: {\n    prototype: EventTarget;\n    new(): EventTarget;\n};\n\ninterface EXT_frag_depth {\n}\n\ndeclare var EXT_frag_depth: {\n    prototype: EXT_frag_depth;\n    new(): EXT_frag_depth;\n};\n\ninterface EXT_texture_filter_anisotropic {\n    readonly MAX_TEXTURE_MAX_ANISOTROPY_EXT: number;\n    readonly TEXTURE_MAX_ANISOTROPY_EXT: number;\n}\n\ndeclare var EXT_texture_filter_anisotropic: {\n    prototype: EXT_texture_filter_anisotropic;\n    new(): EXT_texture_filter_anisotropic;\n    readonly MAX_TEXTURE_MAX_ANISOTROPY_EXT: number;\n    readonly TEXTURE_MAX_ANISOTROPY_EXT: number;\n};\n\ninterface ExtensionScriptApis {\n    extensionIdToShortId(extensionId: string): number;\n    fireExtensionApiTelemetry(functionName: string, isSucceeded: boolean, isSupported: boolean): void;\n    genericFunction(routerAddress: any, parameters?: string, callbackId?: number): void;\n    genericSynchronousFunction(functionId: number, parameters?: string): string;\n    getExtensionId(): string;\n    registerGenericFunctionCallbackHandler(callbackHandler: any): void;\n    registerGenericPersistentCallbackHandler(callbackHandler: any): void;\n}\n\ndeclare var ExtensionScriptApis: {\n    prototype: ExtensionScriptApis;\n    new(): ExtensionScriptApis;\n};\n\ninterface External {\n}\n\ndeclare var External: {\n    prototype: External;\n    new(): External;\n};\n\ninterface File extends Blob {\n    readonly lastModifiedDate: any;\n    readonly name: string;\n    readonly webkitRelativePath: string;\n}\n\ndeclare var File: {\n    prototype: File;\n    new (parts: (ArrayBuffer | ArrayBufferView | Blob | string)[], filename: string, properties?: FilePropertyBag): File;\n};\n\ninterface FileList {\n    readonly length: number;\n    item(index: number): File;\n    [index: number]: File;\n}\n\ndeclare var FileList: {\n    prototype: FileList;\n    new(): FileList;\n};\n\ninterface FileReader extends EventTarget, MSBaseReader {\n    readonly error: DOMError;\n    readAsArrayBuffer(blob: Blob): void;\n    readAsBinaryString(blob: Blob): void;\n    readAsDataURL(blob: Blob): void;\n    readAsText(blob: Blob, encoding?: string): void;\n    addEventListener<K extends keyof MSBaseReaderEventMap>(type: K, listener: (this: FileReader, ev: MSBaseReaderEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var FileReader: {\n    prototype: FileReader;\n    new(): FileReader;\n};\n\ninterface FocusEvent extends UIEvent {\n    readonly relatedTarget: EventTarget;\n    initFocusEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, relatedTargetArg: EventTarget): void;\n}\n\ndeclare var FocusEvent: {\n    prototype: FocusEvent;\n    new(typeArg: string, eventInitDict?: FocusEventInit): FocusEvent;\n};\n\ninterface FocusNavigationEvent extends Event {\n    readonly navigationReason: NavigationReason;\n    readonly originHeight: number;\n    readonly originLeft: number;\n    readonly originTop: number;\n    readonly originWidth: number;\n    requestFocus(): void;\n}\n\ndeclare var FocusNavigationEvent: {\n    prototype: FocusNavigationEvent;\n    new(type: string, eventInitDict?: FocusNavigationEventInit): FocusNavigationEvent;\n};\n\ninterface FormData {\n    append(name: string, value: string | Blob, fileName?: string): void;\n    delete(name: string): void;\n    get(name: string): FormDataEntryValue | null;\n    getAll(name: string): FormDataEntryValue[];\n    has(name: string): boolean;\n    set(name: string, value: string | Blob, fileName?: string): void;\n}\n\ndeclare var FormData: {\n    prototype: FormData;\n    new (form?: HTMLFormElement): FormData;\n};\n\ninterface GainNode extends AudioNode {\n    readonly gain: AudioParam;\n}\n\ndeclare var GainNode: {\n    prototype: GainNode;\n    new(): GainNode;\n};\n\ninterface Gamepad {\n    readonly axes: number[];\n    readonly buttons: GamepadButton[];\n    readonly connected: boolean;\n    readonly id: string;\n    readonly index: number;\n    readonly mapping: string;\n    readonly timestamp: number;\n}\n\ndeclare var Gamepad: {\n    prototype: Gamepad;\n    new(): Gamepad;\n};\n\ninterface GamepadButton {\n    readonly pressed: boolean;\n    readonly value: number;\n}\n\ndeclare var GamepadButton: {\n    prototype: GamepadButton;\n    new(): GamepadButton;\n};\n\ninterface GamepadEvent extends Event {\n    readonly gamepad: Gamepad;\n}\n\ndeclare var GamepadEvent: {\n    prototype: GamepadEvent;\n    new(typeArg: string, eventInitDict?: GamepadEventInit): GamepadEvent;\n};\n\ninterface Geolocation {\n    clearWatch(watchId: number): void;\n    getCurrentPosition(successCallback: PositionCallback, errorCallback?: PositionErrorCallback, options?: PositionOptions): void;\n    watchPosition(successCallback: PositionCallback, errorCallback?: PositionErrorCallback, options?: PositionOptions): number;\n}\n\ndeclare var Geolocation: {\n    prototype: Geolocation;\n    new(): Geolocation;\n};\n\ninterface HashChangeEvent extends Event {\n    readonly newURL: string | null;\n    readonly oldURL: string | null;\n}\n\ndeclare var HashChangeEvent: {\n    prototype: HashChangeEvent;\n    new(typeArg: string, eventInitDict?: HashChangeEventInit): HashChangeEvent;\n};\n\ninterface Headers {\n    append(name: string, value: string): void;\n    delete(name: string): void;\n    forEach(callback: ForEachCallback): void;\n    get(name: string): string | null;\n    has(name: string): boolean;\n    set(name: string, value: string): void;\n}\n\ndeclare var Headers: {\n    prototype: Headers;\n    new(init?: any): Headers;\n};\n\ninterface History {\n    readonly length: number;\n    readonly state: any;\n    scrollRestoration: ScrollRestoration;\n    back(): void;\n    forward(): void;\n    go(delta?: number): void;\n    pushState(data: any, title: string, url?: string | null): void;\n    replaceState(data: any, title: string, url?: string | null): void;\n}\n\ndeclare var History: {\n    prototype: History;\n    new(): History;\n};\n\ninterface HTMLAllCollection {\n    readonly length: number;\n    item(nameOrIndex?: string): HTMLCollection | Element | null;\n    namedItem(name: string): HTMLCollection | Element | null;\n    [index: number]: Element;\n}\n\ndeclare var HTMLAllCollection: {\n    prototype: HTMLAllCollection;\n    new(): HTMLAllCollection;\n};\n\ninterface HTMLAnchorElement extends HTMLElement {\n    /**\n     * Sets or retrieves the character set used to encode the object.\n     */\n    charset: string;\n    /**\n     * Sets or retrieves the coordinates of the object.\n     */\n    coords: string;\n    download: string;\n    /**\n     * Contains the anchor portion of the URL including the hash sign (#).\n     */\n    hash: string;\n    /**\n     * Contains the hostname and port values of the URL.\n     */\n    host: string;\n    /**\n     * Contains the hostname of a URL.\n     */\n    hostname: string;\n    /**\n     * Sets or retrieves a destination URL or an anchor point.\n     */\n    href: string;\n    /**\n     * Sets or retrieves the language code of the object.\n     */\n    hreflang: string;\n    Methods: string;\n    readonly mimeType: string;\n    /**\n     * Sets or retrieves the shape of the object.\n     */\n    name: string;\n    readonly nameProp: string;\n    /**\n     * Contains the pathname of the URL.\n     */\n    pathname: string;\n    /**\n     * Sets or retrieves the port number associated with a URL.\n     */\n    port: string;\n    /**\n     * Contains the protocol of the URL.\n     */\n    protocol: string;\n    readonly protocolLong: string;\n    /**\n     * Sets or retrieves the relationship between the object and the destination of the link.\n     */\n    rel: string;\n    /**\n     * Sets or retrieves the relationship between the object and the destination of the link.\n     */\n    rev: string;\n    /**\n     * Sets or retrieves the substring of the href property that follows the question mark.\n     */\n    search: string;\n    /**\n     * Sets or retrieves the shape of the object.\n     */\n    shape: string;\n    /**\n     * Sets or retrieves the window or frame at which to target content.\n     */\n    target: string;\n    /**\n     * Retrieves or sets the text of the object as a string.\n     */\n    text: string;\n    type: string;\n    urn: string;\n    /**\n     * Returns a string representation of an object.\n     */\n    toString(): string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLAnchorElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLAnchorElement: {\n    prototype: HTMLAnchorElement;\n    new(): HTMLAnchorElement;\n};\n\ninterface HTMLAppletElement extends HTMLElement {\n    align: string;\n    /**\n     * Sets or retrieves a text alternative to the graphic.\n     */\n    alt: string;\n    /**\n     * Gets or sets the optional alternative HTML script to execute if the object fails to load.\n     */\n    altHtml: string;\n    /**\n     * Sets or retrieves a character string that can be used to implement your own archive functionality for the object.\n     */\n    archive: string;\n    /**\n     * Retrieves a string of the URL where the object tag can be found. This is often the href of the document that the object is in, or the value set by a base element.\n     */\n    readonly BaseHref: string;\n    border: string;\n    code: string;\n    /**\n     * Sets or retrieves the URL of the component.\n     */\n    codeBase: string;\n    /**\n     * Sets or retrieves the Internet media type for the code associated with the object.\n     */\n    codeType: string;\n    /**\n     * Address of a pointer to the document this page or frame contains. If there is no document, then null will be returned.\n     */\n    readonly contentDocument: Document;\n    /**\n     * Sets or retrieves the URL that references the data of the object.\n     */\n    data: string;\n    /**\n     * Sets or retrieves a character string that can be used to implement your own declare functionality for the object.\n     */\n    declare: boolean;\n    readonly form: HTMLFormElement;\n    /**\n     * Sets or retrieves the height of the object.\n     */\n    height: string;\n    hspace: number;\n    /**\n     * Sets or retrieves the shape of the object.\n     */\n    name: string;\n    object: string | null;\n    /**\n     * Sets or retrieves a message to be displayed while an object is loading.\n     */\n    standby: string;\n    /**\n     * Returns the content type of the object.\n     */\n    type: string;\n    /**\n     * Sets or retrieves the URL, often with a bookmark extension (#name), to use as a client-side image map.\n     */\n    useMap: string;\n    vspace: number;\n    width: number;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLAppletElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLAppletElement: {\n    prototype: HTMLAppletElement;\n    new(): HTMLAppletElement;\n};\n\ninterface HTMLAreaElement extends HTMLElement {\n    /**\n     * Sets or retrieves a text alternative to the graphic.\n     */\n    alt: string;\n    /**\n     * Sets or retrieves the coordinates of the object.\n     */\n    coords: string;\n    download: string;\n    /**\n     * Sets or retrieves the subsection of the href property that follows the number sign (#).\n     */\n    hash: string;\n    /**\n     * Sets or retrieves the hostname and port number of the location or URL.\n     */\n    host: string;\n    /**\n     * Sets or retrieves the host name part of the location or URL.\n     */\n    hostname: string;\n    /**\n     * Sets or retrieves a destination URL or an anchor point.\n     */\n    href: string;\n    /**\n     * Sets or gets whether clicks in this region cause action.\n     */\n    noHref: boolean;\n    /**\n     * Sets or retrieves the file name or path specified by the object.\n     */\n    pathname: string;\n    /**\n     * Sets or retrieves the port number associated with a URL.\n     */\n    port: string;\n    /**\n     * Sets or retrieves the protocol portion of a URL.\n     */\n    protocol: string;\n    rel: string;\n    /**\n     * Sets or retrieves the substring of the href property that follows the question mark.\n     */\n    search: string;\n    /**\n     * Sets or retrieves the shape of the object.\n     */\n    shape: string;\n    /**\n     * Sets or retrieves the window or frame at which to target content.\n     */\n    target: string;\n    /**\n     * Returns a string representation of an object.\n     */\n    toString(): string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLAreaElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLAreaElement: {\n    prototype: HTMLAreaElement;\n    new(): HTMLAreaElement;\n};\n\ninterface HTMLAreasCollection extends HTMLCollectionBase {\n}\n\ndeclare var HTMLAreasCollection: {\n    prototype: HTMLAreasCollection;\n    new(): HTMLAreasCollection;\n};\n\ninterface HTMLAudioElement extends HTMLMediaElement {\n    addEventListener<K extends keyof HTMLMediaElementEventMap>(type: K, listener: (this: HTMLAudioElement, ev: HTMLMediaElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLAudioElement: {\n    prototype: HTMLAudioElement;\n    new(): HTMLAudioElement;\n};\n\ninterface HTMLBaseElement extends HTMLElement {\n    /**\n     * Gets or sets the baseline URL on which relative links are based.\n     */\n    href: string;\n    /**\n     * Sets or retrieves the window or frame at which to target content.\n     */\n    target: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLBaseElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLBaseElement: {\n    prototype: HTMLBaseElement;\n    new(): HTMLBaseElement;\n};\n\ninterface HTMLBaseFontElement extends HTMLElement, DOML2DeprecatedColorProperty {\n    /**\n     * Sets or retrieves the current typeface family.\n     */\n    face: string;\n    /**\n     * Sets or retrieves the font size of the object.\n     */\n    size: number;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLBaseFontElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLBaseFontElement: {\n    prototype: HTMLBaseFontElement;\n    new(): HTMLBaseFontElement;\n};\n\ninterface HTMLBodyElementEventMap extends HTMLElementEventMap {\n    "afterprint": Event;\n    "beforeprint": Event;\n    "beforeunload": BeforeUnloadEvent;\n    "blur": FocusEvent;\n    "error": ErrorEvent;\n    "focus": FocusEvent;\n    "hashchange": HashChangeEvent;\n    "load": Event;\n    "message": MessageEvent;\n    "offline": Event;\n    "online": Event;\n    "orientationchange": Event;\n    "pagehide": PageTransitionEvent;\n    "pageshow": PageTransitionEvent;\n    "popstate": PopStateEvent;\n    "resize": UIEvent;\n    "scroll": UIEvent;\n    "storage": StorageEvent;\n    "unload": Event;\n}\n\ninterface HTMLBodyElement extends HTMLElement {\n    aLink: any;\n    background: string;\n    bgColor: any;\n    bgProperties: string;\n    link: any;\n    noWrap: boolean;\n    onafterprint: (this: HTMLBodyElement, ev: Event) => any;\n    onbeforeprint: (this: HTMLBodyElement, ev: Event) => any;\n    onbeforeunload: (this: HTMLBodyElement, ev: BeforeUnloadEvent) => any;\n    onblur: (this: HTMLBodyElement, ev: FocusEvent) => any;\n    onerror: (this: HTMLBodyElement, ev: ErrorEvent) => any;\n    onfocus: (this: HTMLBodyElement, ev: FocusEvent) => any;\n    onhashchange: (this: HTMLBodyElement, ev: HashChangeEvent) => any;\n    onload: (this: HTMLBodyElement, ev: Event) => any;\n    onmessage: (this: HTMLBodyElement, ev: MessageEvent) => any;\n    onoffline: (this: HTMLBodyElement, ev: Event) => any;\n    ononline: (this: HTMLBodyElement, ev: Event) => any;\n    onorientationchange: (this: HTMLBodyElement, ev: Event) => any;\n    onpagehide: (this: HTMLBodyElement, ev: PageTransitionEvent) => any;\n    onpageshow: (this: HTMLBodyElement, ev: PageTransitionEvent) => any;\n    onpopstate: (this: HTMLBodyElement, ev: PopStateEvent) => any;\n    onresize: (this: HTMLBodyElement, ev: UIEvent) => any;\n    onscroll: (this: HTMLBodyElement, ev: UIEvent) => any;\n    onstorage: (this: HTMLBodyElement, ev: StorageEvent) => any;\n    onunload: (this: HTMLBodyElement, ev: Event) => any;\n    text: any;\n    vLink: any;\n    addEventListener<K extends keyof HTMLBodyElementEventMap>(type: K, listener: (this: HTMLBodyElement, ev: HTMLBodyElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLBodyElement: {\n    prototype: HTMLBodyElement;\n    new(): HTMLBodyElement;\n};\n\ninterface HTMLBRElement extends HTMLElement {\n    /**\n     * Sets or retrieves the side on which floating objects are not to be positioned when any IHTMLBlockElement is inserted into the document.\n     */\n    clear: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLBRElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLBRElement: {\n    prototype: HTMLBRElement;\n    new(): HTMLBRElement;\n};\n\ninterface HTMLButtonElement extends HTMLElement {\n    /**\n     * Provides a way to direct a user to a specific field when a document loads. This can provide both direction and convenience for a user, reducing the need to click or tab to a field when a page opens. This attribute is true when present on an element, and false when missing.\n     */\n    autofocus: boolean;\n    disabled: boolean;\n    /**\n     * Retrieves a reference to the form that the object is embedded in.\n     */\n    readonly form: HTMLFormElement;\n    /**\n     * Overrides the action attribute (where the data on a form is sent) on the parent form element.\n     */\n    formAction: string;\n    /**\n     * Used to override the encoding (formEnctype attribute) specified on the form element.\n     */\n    formEnctype: string;\n    /**\n     * Overrides the submit method attribute previously specified on a form element.\n     */\n    formMethod: string;\n    /**\n     * Overrides any validation or required attributes on a form or form elements to allow it to be submitted without validation. This can be used to create a "save draft"-type submit option.\n     */\n    formNoValidate: string;\n    /**\n     * Overrides the target attribute on a form element.\n     */\n    formTarget: string;\n    /**\n     * Sets or retrieves the name of the object.\n     */\n    name: string;\n    status: any;\n    /**\n     * Gets the classification and default behavior of the button.\n     */\n    type: string;\n    /**\n     * Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting.\n     */\n    readonly validationMessage: string;\n    /**\n     * Returns a  ValidityState object that represents the validity states of an element.\n     */\n    readonly validity: ValidityState;\n    /**\n     * Sets or retrieves the default or selected value of the control.\n     */\n    value: string;\n    /**\n     * Returns whether an element will successfully validate based on forms validation rules and constraints.\n     */\n    readonly willValidate: boolean;\n    /**\n     * Returns whether a form will validate when it is submitted, without having to submit it.\n     */\n    checkValidity(): boolean;\n    /**\n     * Sets a custom error message that is displayed when a form is submitted.\n     * @param error Sets a custom error message that is displayed when a form is submitted.\n     */\n    setCustomValidity(error: string): void;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLButtonElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLButtonElement: {\n    prototype: HTMLButtonElement;\n    new(): HTMLButtonElement;\n};\n\ninterface HTMLCanvasElement extends HTMLElement {\n    /**\n     * Gets or sets the height of a canvas element on a document.\n     */\n    height: number;\n    /**\n     * Gets or sets the width of a canvas element on a document.\n     */\n    width: number;\n    /**\n     * Returns an object that provides methods and properties for drawing and manipulating images and graphics on a canvas element in a document. A context object includes information about colors, line widths, fonts, and other graphic parameters that can be drawn on a canvas.\n     * @param contextId The identifier (ID) of the type of canvas to create. Internet Explorer 9 and Internet Explorer 10 support only a 2-D context using canvas.getContext("2d"); IE11 Preview also supports 3-D or WebGL context using canvas.getContext("experimental-webgl");\n     */\n    getContext(contextId: "2d", contextAttributes?: Canvas2DContextAttributes): CanvasRenderingContext2D | null;\n    getContext(contextId: "webgl" | "experimental-webgl", contextAttributes?: WebGLContextAttributes): WebGLRenderingContext | null;\n    getContext(contextId: string, contextAttributes?: {}): CanvasRenderingContext2D | WebGLRenderingContext | null;\n    /**\n     * Returns a blob object encoded as a Portable Network Graphics (PNG) format from a canvas image or drawing.\n     */\n    msToBlob(): Blob;\n    /**\n     * Returns the content of the current canvas as an image that you can use as a source for another canvas or an HTML element.\n     * @param type The standard MIME type for the image format to return. If you do not specify this parameter, the default value is a PNG format image.\n     */\n    toDataURL(type?: string, ...args: any[]): string;\n    toBlob(callback: (result: Blob | null) => void, type?: string, ...arguments: any[]): void;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLCanvasElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLCanvasElement: {\n    prototype: HTMLCanvasElement;\n    new(): HTMLCanvasElement;\n};\n\ninterface HTMLCollectionBase {\n    /**\n     * Sets or retrieves the number of objects in a collection.\n     */\n    readonly length: number;\n    /**\n     * Retrieves an object from various collections.\n     */\n    item(index: number): Element;\n    [index: number]: Element;\n}\n\ninterface HTMLCollection extends HTMLCollectionBase {\n    /**\n     * Retrieves a select object or an object from an options collection.\n     */\n    namedItem(name: string): Element | null;\n}\n\ndeclare var HTMLCollection: {\n    prototype: HTMLCollection;\n    new(): HTMLCollection;\n};\n\ninterface HTMLDataElement extends HTMLElement {\n    value: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDataElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLDataElement: {\n    prototype: HTMLDataElement;\n    new(): HTMLDataElement;\n};\n\ninterface HTMLDataListElement extends HTMLElement {\n    options: HTMLCollectionOf<HTMLOptionElement>;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDataListElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLDataListElement: {\n    prototype: HTMLDataListElement;\n    new(): HTMLDataListElement;\n};\n\ninterface HTMLDirectoryElement extends HTMLElement {\n    compact: boolean;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDirectoryElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLDirectoryElement: {\n    prototype: HTMLDirectoryElement;\n    new(): HTMLDirectoryElement;\n};\n\ninterface HTMLDivElement extends HTMLElement {\n    /**\n     * Sets or retrieves how the object is aligned with adjacent text.\n     */\n    align: string;\n    /**\n     * Sets or retrieves whether the browser automatically performs wordwrap.\n     */\n    noWrap: boolean;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDivElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLDivElement: {\n    prototype: HTMLDivElement;\n    new(): HTMLDivElement;\n};\n\ninterface HTMLDListElement extends HTMLElement {\n    compact: boolean;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDListElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLDListElement: {\n    prototype: HTMLDListElement;\n    new(): HTMLDListElement;\n};\n\ninterface HTMLDocument extends Document {\n    addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: HTMLDocument, ev: DocumentEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLDocument: {\n    prototype: HTMLDocument;\n    new(): HTMLDocument;\n};\n\ninterface HTMLElementEventMap extends ElementEventMap {\n    "abort": UIEvent;\n    "activate": UIEvent;\n    "beforeactivate": UIEvent;\n    "beforecopy": ClipboardEvent;\n    "beforecut": ClipboardEvent;\n    "beforedeactivate": UIEvent;\n    "beforepaste": ClipboardEvent;\n    "blur": FocusEvent;\n    "canplay": Event;\n    "canplaythrough": Event;\n    "change": Event;\n    "click": MouseEvent;\n    "contextmenu": PointerEvent;\n    "copy": ClipboardEvent;\n    "cuechange": Event;\n    "cut": ClipboardEvent;\n    "dblclick": MouseEvent;\n    "deactivate": UIEvent;\n    "drag": DragEvent;\n    "dragend": DragEvent;\n    "dragenter": DragEvent;\n    "dragleave": DragEvent;\n    "dragover": DragEvent;\n    "dragstart": DragEvent;\n    "drop": DragEvent;\n    "durationchange": Event;\n    "emptied": Event;\n    "ended": MediaStreamErrorEvent;\n    "error": ErrorEvent;\n    "focus": FocusEvent;\n    "input": Event;\n    "invalid": Event;\n    "keydown": KeyboardEvent;\n    "keypress": KeyboardEvent;\n    "keyup": KeyboardEvent;\n    "load": Event;\n    "loadeddata": Event;\n    "loadedmetadata": Event;\n    "loadstart": Event;\n    "mousedown": MouseEvent;\n    "mouseenter": MouseEvent;\n    "mouseleave": MouseEvent;\n    "mousemove": MouseEvent;\n    "mouseout": MouseEvent;\n    "mouseover": MouseEvent;\n    "mouseup": MouseEvent;\n    "mousewheel": WheelEvent;\n    "MSContentZoom": UIEvent;\n    "MSManipulationStateChanged": MSManipulationEvent;\n    "paste": ClipboardEvent;\n    "pause": Event;\n    "play": Event;\n    "playing": Event;\n    "progress": ProgressEvent;\n    "ratechange": Event;\n    "reset": Event;\n    "scroll": UIEvent;\n    "seeked": Event;\n    "seeking": Event;\n    "select": UIEvent;\n    "selectstart": Event;\n    "stalled": Event;\n    "submit": Event;\n    "suspend": Event;\n    "timeupdate": Event;\n    "volumechange": Event;\n    "waiting": Event;\n}\n\ninterface HTMLElement extends Element {\n    accessKey: string;\n    readonly children: HTMLCollection;\n    contentEditable: string;\n    readonly dataset: DOMStringMap;\n    dir: string;\n    draggable: boolean;\n    hidden: boolean;\n    hideFocus: boolean;\n    innerText: string;\n    readonly isContentEditable: boolean;\n    lang: string;\n    readonly offsetHeight: number;\n    readonly offsetLeft: number;\n    readonly offsetParent: Element;\n    readonly offsetTop: number;\n    readonly offsetWidth: number;\n    onabort: (this: HTMLElement, ev: UIEvent) => any;\n    onactivate: (this: HTMLElement, ev: UIEvent) => any;\n    onbeforeactivate: (this: HTMLElement, ev: UIEvent) => any;\n    onbeforecopy: (this: HTMLElement, ev: ClipboardEvent) => any;\n    onbeforecut: (this: HTMLElement, ev: ClipboardEvent) => any;\n    onbeforedeactivate: (this: HTMLElement, ev: UIEvent) => any;\n    onbeforepaste: (this: HTMLElement, ev: ClipboardEvent) => any;\n    onblur: (this: HTMLElement, ev: FocusEvent) => any;\n    oncanplay: (this: HTMLElement, ev: Event) => any;\n    oncanplaythrough: (this: HTMLElement, ev: Event) => any;\n    onchange: (this: HTMLElement, ev: Event) => any;\n    onclick: (this: HTMLElement, ev: MouseEvent) => any;\n    oncontextmenu: (this: HTMLElement, ev: PointerEvent) => any;\n    oncopy: (this: HTMLElement, ev: ClipboardEvent) => any;\n    oncuechange: (this: HTMLElement, ev: Event) => any;\n    oncut: (this: HTMLElement, ev: ClipboardEvent) => any;\n    ondblclick: (this: HTMLElement, ev: MouseEvent) => any;\n    ondeactivate: (this: HTMLElement, ev: UIEvent) => any;\n    ondrag: (this: HTMLElement, ev: DragEvent) => any;\n    ondragend: (this: HTMLElement, ev: DragEvent) => any;\n    ondragenter: (this: HTMLElement, ev: DragEvent) => any;\n    ondragleave: (this: HTMLElement, ev: DragEvent) => any;\n    ondragover: (this: HTMLElement, ev: DragEvent) => any;\n    ondragstart: (this: HTMLElement, ev: DragEvent) => any;\n    ondrop: (this: HTMLElement, ev: DragEvent) => any;\n    ondurationchange: (this: HTMLElement, ev: Event) => any;\n    onemptied: (this: HTMLElement, ev: Event) => any;\n    onended: (this: HTMLElement, ev: MediaStreamErrorEvent) => any;\n    onerror: (this: HTMLElement, ev: ErrorEvent) => any;\n    onfocus: (this: HTMLElement, ev: FocusEvent) => any;\n    oninput: (this: HTMLElement, ev: Event) => any;\n    oninvalid: (this: HTMLElement, ev: Event) => any;\n    onkeydown: (this: HTMLElement, ev: KeyboardEvent) => any;\n    onkeypress: (this: HTMLElement, ev: KeyboardEvent) => any;\n    onkeyup: (this: HTMLElement, ev: KeyboardEvent) => any;\n    onload: (this: HTMLElement, ev: Event) => any;\n    onloadeddata: (this: HTMLElement, ev: Event) => any;\n    onloadedmetadata: (this: HTMLElement, ev: Event) => any;\n    onloadstart: (this: HTMLElement, ev: Event) => any;\n    onmousedown: (this: HTMLElement, ev: MouseEvent) => any;\n    onmouseenter: (this: HTMLElement, ev: MouseEvent) => any;\n    onmouseleave: (this: HTMLElement, ev: MouseEvent) => any;\n    onmousemove: (this: HTMLElement, ev: MouseEvent) => any;\n    onmouseout: (this: HTMLElement, ev: MouseEvent) => any;\n    onmouseover: (this: HTMLElement, ev: MouseEvent) => any;\n    onmouseup: (this: HTMLElement, ev: MouseEvent) => any;\n    onmousewheel: (this: HTMLElement, ev: WheelEvent) => any;\n    onmscontentzoom: (this: HTMLElement, ev: UIEvent) => any;\n    onmsmanipulationstatechanged: (this: HTMLElement, ev: MSManipulationEvent) => any;\n    onpaste: (this: HTMLElement, ev: ClipboardEvent) => any;\n    onpause: (this: HTMLElement, ev: Event) => any;\n    onplay: (this: HTMLElement, ev: Event) => any;\n    onplaying: (this: HTMLElement, ev: Event) => any;\n    onprogress: (this: HTMLElement, ev: ProgressEvent) => any;\n    onratechange: (this: HTMLElement, ev: Event) => any;\n    onreset: (this: HTMLElement, ev: Event) => any;\n    onscroll: (this: HTMLElement, ev: UIEvent) => any;\n    onseeked: (this: HTMLElement, ev: Event) => any;\n    onseeking: (this: HTMLElement, ev: Event) => any;\n    onselect: (this: HTMLElement, ev: UIEvent) => any;\n    onselectstart: (this: HTMLElement, ev: Event) => any;\n    onstalled: (this: HTMLElement, ev: Event) => any;\n    onsubmit: (this: HTMLElement, ev: Event) => any;\n    onsuspend: (this: HTMLElement, ev: Event) => any;\n    ontimeupdate: (this: HTMLElement, ev: Event) => any;\n    onvolumechange: (this: HTMLElement, ev: Event) => any;\n    onwaiting: (this: HTMLElement, ev: Event) => any;\n    outerText: string;\n    spellcheck: boolean;\n    readonly style: CSSStyleDeclaration;\n    tabIndex: number;\n    title: string;\n    blur(): void;\n    click(): void;\n    dragDrop(): boolean;\n    focus(): void;\n    msGetInputContext(): MSInputMethodContext;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLElement: {\n    prototype: HTMLElement;\n    new(): HTMLElement;\n};\n\ninterface HTMLEmbedElement extends HTMLElement, GetSVGDocument {\n    /**\n     * Sets or retrieves the height of the object.\n     */\n    height: string;\n    hidden: any;\n    /**\n     * Gets or sets whether the DLNA PlayTo device is available.\n     */\n    msPlayToDisabled: boolean;\n    /**\n     * Gets or sets the path to the preferred media source. This enables the Play To target device to stream the media content, which can be DRM protected, from a different location, such as a cloud media server.\n     */\n    msPlayToPreferredSourceUri: string;\n    /**\n     * Gets or sets the primary DLNA PlayTo device.\n     */\n    msPlayToPrimary: boolean;\n    /**\n     * Gets the source associated with the media element for use by the PlayToManager.\n     */\n    readonly msPlayToSource: any;\n    /**\n     * Sets or retrieves the name of the object.\n     */\n    name: string;\n    /**\n     * Retrieves the palette used for the embedded document.\n     */\n    readonly palette: string;\n    /**\n     * Retrieves the URL of the plug-in used to view an embedded document.\n     */\n    readonly pluginspage: string;\n    readonly readyState: string;\n    /**\n     * Sets or retrieves a URL to be loaded by the object.\n     */\n    src: string;\n    /**\n     * Sets or retrieves the height and width units of the embed object.\n     */\n    units: string;\n    /**\n     * Sets or retrieves the width of the object.\n     */\n    width: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLEmbedElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLEmbedElement: {\n    prototype: HTMLEmbedElement;\n    new(): HTMLEmbedElement;\n};\n\ninterface HTMLFieldSetElement extends HTMLElement {\n    /**\n     * Sets or retrieves how the object is aligned with adjacent text.\n     */\n    align: string;\n    disabled: boolean;\n    /**\n     * Retrieves a reference to the form that the object is embedded in.\n     */\n    readonly form: HTMLFormElement;\n    name: string;\n    /**\n     * Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting.\n     */\n    readonly validationMessage: string;\n    /**\n     * Returns a  ValidityState object that represents the validity states of an element.\n     */\n    readonly validity: ValidityState;\n    /**\n     * Returns whether an element will successfully validate based on forms validation rules and constraints.\n     */\n    readonly willValidate: boolean;\n    /**\n     * Returns whether a form will validate when it is submitted, without having to submit it.\n     */\n    checkValidity(): boolean;\n    /**\n     * Sets a custom error message that is displayed when a form is submitted.\n     * @param error Sets a custom error message that is displayed when a form is submitted.\n     */\n    setCustomValidity(error: string): void;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLFieldSetElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLFieldSetElement: {\n    prototype: HTMLFieldSetElement;\n    new(): HTMLFieldSetElement;\n};\n\ninterface HTMLFontElement extends HTMLElement, DOML2DeprecatedColorProperty, DOML2DeprecatedSizeProperty {\n    /**\n     * Sets or retrieves the current typeface family.\n     */\n    face: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLFontElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLFontElement: {\n    prototype: HTMLFontElement;\n    new(): HTMLFontElement;\n};\n\ninterface HTMLFormControlsCollection extends HTMLCollectionBase {\n    namedItem(name: string): HTMLCollection | Element | null;\n}\n\ndeclare var HTMLFormControlsCollection: {\n    prototype: HTMLFormControlsCollection;\n    new(): HTMLFormControlsCollection;\n};\n\ninterface HTMLFormElement extends HTMLElement {\n    /**\n     * Sets or retrieves a list of character encodings for input data that must be accepted by the server processing the form.\n     */\n    acceptCharset: string;\n    /**\n     * Sets or retrieves the URL to which the form content is sent for processing.\n     */\n    action: string;\n    /**\n     * Specifies whether autocomplete is applied to an editable text field.\n     */\n    autocomplete: string;\n    /**\n     * Retrieves a collection, in source order, of all controls in a given form.\n     */\n    readonly elements: HTMLFormControlsCollection;\n    /**\n     * Sets or retrieves the MIME encoding for the form.\n     */\n    encoding: string;\n    /**\n     * Sets or retrieves the encoding type for the form.\n     */\n    enctype: string;\n    /**\n     * Sets or retrieves the number of objects in a collection.\n     */\n    readonly length: number;\n    /**\n     * Sets or retrieves how to send the form data to the server.\n     */\n    method: string;\n    /**\n     * Sets or retrieves the name of the object.\n     */\n    name: string;\n    /**\n     * Designates a form that is not validated when submitted.\n     */\n    noValidate: boolean;\n    /**\n     * Sets or retrieves the window or frame at which to target content.\n     */\n    target: string;\n    /**\n     * Returns whether a form will validate when it is submitted, without having to submit it.\n     */\n    checkValidity(): boolean;\n    /**\n     * Retrieves a form object or an object from an elements collection.\n     * @param name Variant of type Number or String that specifies the object or collection to retrieve. If this parameter is a Number, it is the zero-based index of the object. If this parameter is a string, all objects with matching name or id properties are retrieved, and a collection is returned if more than one match is made.\n     * @param index Variant of type Number that specifies the zero-based index of the object to retrieve when a collection is returned.\n     */\n    item(name?: any, index?: any): any;\n    /**\n     * Retrieves a form object or an object from an elements collection.\n     */\n    namedItem(name: string): any;\n    /**\n     * Fires when the user resets a form.\n     */\n    reset(): void;\n    /**\n     * Fires when a FORM is about to be submitted.\n     */\n    submit(): void;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLFormElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n    [name: string]: any;\n}\n\ndeclare var HTMLFormElement: {\n    prototype: HTMLFormElement;\n    new(): HTMLFormElement;\n};\n\ninterface HTMLFrameElementEventMap extends HTMLElementEventMap {\n    "load": Event;\n}\n\ninterface HTMLFrameElement extends HTMLElement, GetSVGDocument {\n    /**\n     * Specifies the properties of a border drawn around an object.\n     */\n    border: string;\n    /**\n     * Sets or retrieves the border color of the object.\n     */\n    borderColor: any;\n    /**\n     * Retrieves the document object of the page or frame.\n     */\n    readonly contentDocument: Document;\n    /**\n     * Retrieves the object of the specified.\n     */\n    readonly contentWindow: Window;\n    /**\n     * Sets or retrieves whether to display a border for the frame.\n     */\n    frameBorder: string;\n    /**\n     * Sets or retrieves the amount of additional space between the frames.\n     */\n    frameSpacing: any;\n    /**\n     * Sets or retrieves the height of the object.\n     */\n    height: string | number;\n    /**\n     * Sets or retrieves a URI to a long description of the object.\n     */\n    longDesc: string;\n    /**\n     * Sets or retrieves the top and bottom margin heights before displaying the text in a frame.\n     */\n    marginHeight: string;\n    /**\n     * Sets or retrieves the left and right margin widths before displaying the text in a frame.\n     */\n    marginWidth: string;\n    /**\n     * Sets or retrieves the frame name.\n     */\n    name: string;\n    /**\n     * Sets or retrieves whether the user can resize the frame.\n     */\n    noResize: boolean;\n    /**\n     * Raised when the object has been completely received from the server.\n     */\n    onload: (this: HTMLFrameElement, ev: Event) => any;\n    /**\n     * Sets or retrieves whether the frame can be scrolled.\n     */\n    scrolling: string;\n    /**\n     * Sets or retrieves a URL to be loaded by the object.\n     */\n    src: string;\n    /**\n     * Sets or retrieves the width of the object.\n     */\n    width: string | number;\n    addEventListener<K extends keyof HTMLFrameElementEventMap>(type: K, listener: (this: HTMLFrameElement, ev: HTMLFrameElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLFrameElement: {\n    prototype: HTMLFrameElement;\n    new(): HTMLFrameElement;\n};\n\ninterface HTMLFrameSetElementEventMap extends HTMLElementEventMap {\n    "afterprint": Event;\n    "beforeprint": Event;\n    "beforeunload": BeforeUnloadEvent;\n    "blur": FocusEvent;\n    "error": ErrorEvent;\n    "focus": FocusEvent;\n    "hashchange": HashChangeEvent;\n    "load": Event;\n    "message": MessageEvent;\n    "offline": Event;\n    "online": Event;\n    "orientationchange": Event;\n    "pagehide": PageTransitionEvent;\n    "pageshow": PageTransitionEvent;\n    "popstate": PopStateEvent;\n    "resize": UIEvent;\n    "scroll": UIEvent;\n    "storage": StorageEvent;\n    "unload": Event;\n}\n\ninterface HTMLFrameSetElement extends HTMLElement {\n    border: string;\n    /**\n     * Sets or retrieves the border color of the object.\n     */\n    borderColor: any;\n    /**\n     * Sets or retrieves the frame widths of the object.\n     */\n    cols: string;\n    /**\n     * Sets or retrieves whether to display a border for the frame.\n     */\n    frameBorder: string;\n    /**\n     * Sets or retrieves the amount of additional space between the frames.\n     */\n    frameSpacing: any;\n    name: string;\n    onafterprint: (this: HTMLFrameSetElement, ev: Event) => any;\n    onbeforeprint: (this: HTMLFrameSetElement, ev: Event) => any;\n    onbeforeunload: (this: HTMLFrameSetElement, ev: BeforeUnloadEvent) => any;\n    /**\n     * Fires when the object loses the input focus.\n     */\n    onblur: (this: HTMLFrameSetElement, ev: FocusEvent) => any;\n    onerror: (this: HTMLFrameSetElement, ev: ErrorEvent) => any;\n    /**\n     * Fires when the object receives focus.\n     */\n    onfocus: (this: HTMLFrameSetElement, ev: FocusEvent) => any;\n    onhashchange: (this: HTMLFrameSetElement, ev: HashChangeEvent) => any;\n    onload: (this: HTMLFrameSetElement, ev: Event) => any;\n    onmessage: (this: HTMLFrameSetElement, ev: MessageEvent) => any;\n    onoffline: (this: HTMLFrameSetElement, ev: Event) => any;\n    ononline: (this: HTMLFrameSetElement, ev: Event) => any;\n    onorientationchange: (this: HTMLFrameSetElement, ev: Event) => any;\n    onpagehide: (this: HTMLFrameSetElement, ev: PageTransitionEvent) => any;\n    onpageshow: (this: HTMLFrameSetElement, ev: PageTransitionEvent) => any;\n    onpopstate: (this: HTMLFrameSetElement, ev: PopStateEvent) => any;\n    onresize: (this: HTMLFrameSetElement, ev: UIEvent) => any;\n    onscroll: (this: HTMLFrameSetElement, ev: UIEvent) => any;\n    onstorage: (this: HTMLFrameSetElement, ev: StorageEvent) => any;\n    onunload: (this: HTMLFrameSetElement, ev: Event) => any;\n    /**\n     * Sets or retrieves the frame heights of the object.\n     */\n    rows: string;\n    addEventListener<K extends keyof HTMLFrameSetElementEventMap>(type: K, listener: (this: HTMLFrameSetElement, ev: HTMLFrameSetElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLFrameSetElement: {\n    prototype: HTMLFrameSetElement;\n    new(): HTMLFrameSetElement;\n};\n\ninterface HTMLHeadElement extends HTMLElement {\n    profile: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLHeadElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLHeadElement: {\n    prototype: HTMLHeadElement;\n    new(): HTMLHeadElement;\n};\n\ninterface HTMLHeadingElement extends HTMLElement {\n    /**\n     * Sets or retrieves a value that indicates the table alignment.\n     */\n    align: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLHeadingElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLHeadingElement: {\n    prototype: HTMLHeadingElement;\n    new(): HTMLHeadingElement;\n};\n\ninterface HTMLHRElement extends HTMLElement, DOML2DeprecatedColorProperty, DOML2DeprecatedSizeProperty {\n    /**\n     * Sets or retrieves how the object is aligned with adjacent text.\n     */\n    align: string;\n    /**\n     * Sets or retrieves whether the horizontal rule is drawn with 3-D shading.\n     */\n    noShade: boolean;\n    /**\n     * Sets or retrieves the width of the object.\n     */\n    width: number;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLHRElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLHRElement: {\n    prototype: HTMLHRElement;\n    new(): HTMLHRElement;\n};\n\ninterface HTMLHtmlElement extends HTMLElement {\n    /**\n     * Sets or retrieves the DTD version that governs the current document.\n     */\n    version: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLHtmlElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLHtmlElement: {\n    prototype: HTMLHtmlElement;\n    new(): HTMLHtmlElement;\n};\n\ninterface HTMLIFrameElementEventMap extends HTMLElementEventMap {\n    "load": Event;\n}\n\ninterface HTMLIFrameElement extends HTMLElement, GetSVGDocument {\n    /**\n     * Sets or retrieves how the object is aligned with adjacent text.\n     */\n    align: string;\n    allowFullscreen: boolean;\n    allowPaymentRequest: boolean;\n    /**\n     * Specifies the properties of a border drawn around an object.\n     */\n    border: string;\n    /**\n     * Retrieves the document object of the page or frame.\n     */\n    readonly contentDocument: Document;\n    /**\n     * Retrieves the object of the specified.\n     */\n    readonly contentWindow: Window;\n    /**\n     * Sets or retrieves whether to display a border for the frame.\n     */\n    frameBorder: string;\n    /**\n     * Sets or retrieves the amount of additional space between the frames.\n     */\n    frameSpacing: any;\n    /**\n     * Sets or retrieves the height of the object.\n     */\n    height: string;\n    /**\n     * Sets or retrieves the horizontal margin for the object.\n     */\n    hspace: number;\n    /**\n     * Sets or retrieves a URI to a long description of the object.\n     */\n    longDesc: string;\n    /**\n     * Sets or retrieves the top and bottom margin heights before displaying the text in a frame.\n     */\n    marginHeight: string;\n    /**\n     * Sets or retrieves the left and right margin widths before displaying the text in a frame.\n     */\n    marginWidth: string;\n    /**\n     * Sets or retrieves the frame name.\n     */\n    name: string;\n    /**\n     * Sets or retrieves whether the user can resize the frame.\n     */\n    noResize: boolean;\n    /**\n     * Raised when the object has been completely received from the server.\n     */\n    onload: (this: HTMLIFrameElement, ev: Event) => any;\n    readonly sandbox: DOMSettableTokenList;\n    /**\n     * Sets or retrieves whether the frame can be scrolled.\n     */\n    scrolling: string;\n    /**\n     * Sets or retrieves a URL to be loaded by the object.\n     */\n    src: string;\n    /**\n     * Sets or retrieves the vertical margin for the object.\n     */\n    vspace: number;\n    /**\n     * Sets or retrieves the width of the object.\n     */\n    width: string;\n    addEventListener<K extends keyof HTMLIFrameElementEventMap>(type: K, listener: (this: HTMLIFrameElement, ev: HTMLIFrameElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLIFrameElement: {\n    prototype: HTMLIFrameElement;\n    new(): HTMLIFrameElement;\n};\n\ninterface HTMLImageElement extends HTMLElement {\n    /**\n     * Sets or retrieves how the object is aligned with adjacent text.\n     */\n    align: string;\n    /**\n     * Sets or retrieves a text alternative to the graphic.\n     */\n    alt: string;\n    /**\n     * Specifies the properties of a border drawn around an object.\n     */\n    border: string;\n    /**\n     * Retrieves whether the object is fully loaded.\n     */\n    readonly complete: boolean;\n    crossOrigin: string | null;\n    readonly currentSrc: string;\n    /**\n     * Sets or retrieves the height of the object.\n     */\n    height: number;\n    /**\n     * Sets or retrieves the width of the border to draw around the object.\n     */\n    hspace: number;\n    /**\n     * Sets or retrieves whether the image is a server-side image map.\n     */\n    isMap: boolean;\n    /**\n     * Sets or retrieves a Uniform Resource Identifier (URI) to a long description of the object.\n     */\n    longDesc: string;\n    lowsrc: string;\n    /**\n     * Gets or sets whether the DLNA PlayTo device is available.\n     */\n    msPlayToDisabled: boolean;\n    msPlayToPreferredSourceUri: string;\n    /**\n     * Gets or sets the primary DLNA PlayTo device.\n     */\n    msPlayToPrimary: boolean;\n    /**\n     * Gets the source associated with the media element for use by the PlayToManager.\n     */\n    readonly msPlayToSource: any;\n    /**\n     * Sets or retrieves the name of the object.\n     */\n    name: string;\n    /**\n     * The original height of the image resource before sizing.\n     */\n    readonly naturalHeight: number;\n    /**\n     * The original width of the image resource before sizing.\n     */\n    readonly naturalWidth: number;\n    sizes: string;\n    /**\n     * The address or URL of the a media resource that is to be considered.\n     */\n    src: string;\n    srcset: string;\n    /**\n     * Sets or retrieves the URL, often with a bookmark extension (#name), to use as a client-side image map.\n     */\n    useMap: string;\n    /**\n     * Sets or retrieves the vertical margin for the object.\n     */\n    vspace: number;\n    /**\n     * Sets or retrieves the width of the object.\n     */\n    width: number;\n    readonly x: number;\n    readonly y: number;\n    msGetAsCastingSource(): any;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLImageElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLImageElement: {\n    prototype: HTMLImageElement;\n    new(): HTMLImageElement;\n};\n\ninterface HTMLInputElement extends HTMLElement {\n    /**\n     * Sets or retrieves a comma-separated list of content types.\n     */\n    accept: string;\n    /**\n     * Sets or retrieves how the object is aligned with adjacent text.\n     */\n    align: string;\n    /**\n     * Sets or retrieves a text alternative to the graphic.\n     */\n    alt: string;\n    /**\n     * Specifies whether autocomplete is applied to an editable text field.\n     */\n    autocomplete: string;\n    /**\n     * Provides a way to direct a user to a specific field when a document loads. This can provide both direction and convenience for a user, reducing the need to click or tab to a field when a page opens. This attribute is true when present on an element, and false when missing.\n     */\n    autofocus: boolean;\n    /**\n     * Sets or retrieves the width of the border to draw around the object.\n     */\n    border: string;\n    /**\n     * Sets or retrieves the state of the check box or radio button.\n     */\n    checked: boolean;\n    /**\n     * Retrieves whether the object is fully loaded.\n     */\n    readonly complete: boolean;\n    /**\n     * Sets or retrieves the state of the check box or radio button.\n     */\n    defaultChecked: boolean;\n    /**\n     * Sets or retrieves the initial contents of the object.\n     */\n    defaultValue: string;\n    disabled: boolean;\n    /**\n     * Returns a FileList object on a file type input object.\n     */\n    readonly files: FileList | null;\n    /**\n     * Retrieves a reference to the form that the object is embedded in.\n     */\n    readonly form: HTMLFormElement;\n    /**\n     * Overrides the action attribute (where the data on a form is sent) on the parent form element.\n     */\n    formAction: string;\n    /**\n     * Used to override the encoding (formEnctype attribute) specified on the form element.\n     */\n    formEnctype: string;\n    /**\n     * Overrides the submit method attribute previously specified on a form element.\n     */\n    formMethod: string;\n    /**\n     * Overrides any validation or required attributes on a form or form elements to allow it to be submitted without validation. This can be used to create a "save draft"-type submit option.\n     */\n    formNoValidate: string;\n    /**\n     * Overrides the target attribute on a form element.\n     */\n    formTarget: string;\n    /**\n     * Sets or retrieves the height of the object.\n     */\n    height: string;\n    /**\n     * Sets or retrieves the width of the border to draw around the object.\n     */\n    hspace: number;\n    indeterminate: boolean;\n    /**\n     * Specifies the ID of a pre-defined datalist of options for an input element.\n     */\n    readonly list: HTMLElement;\n    /**\n     * Defines the maximum acceptable value for an input element with type="number".When used with the min and step attributes, lets you control the range and increment (such as only even numbers) that the user can enter into an input field.\n     */\n    max: string;\n    /**\n     * Sets or retrieves the maximum number of characters that the user can enter in a text control.\n     */\n    maxLength: number;\n    /**\n     * Defines the minimum acceptable value for an input element with type="number". When used with the max and step attributes, lets you control the range and increment (such as even numbers only) that the user can enter into an input field.\n     */\n    min: string;\n    /**\n     * Sets or retrieves the Boolean value indicating whether multiple items can be selected from a list.\n     */\n    multiple: boolean;\n    /**\n     * Sets or retrieves the name of the object.\n     */\n    name: string;\n    /**\n     * Gets or sets a string containing a regular expression that the user\'s input must match.\n     */\n    pattern: string;\n    /**\n     * Gets or sets a text string that is displayed in an input field as a hint or prompt to users as the format or type of information they need to enter.The text appears in an input field until the user puts focus on the field.\n     */\n    placeholder: string;\n    readOnly: boolean;\n    /**\n     * When present, marks an element that can\'t be submitted without a value.\n     */\n    required: boolean;\n    selectionDirection: string;\n    /**\n     * Gets or sets the end position or offset of a text selection.\n     */\n    selectionEnd: number;\n    /**\n     * Gets or sets the starting position or offset of a text selection.\n     */\n    selectionStart: number;\n    size: number;\n    /**\n     * The address or URL of the a media resource that is to be considered.\n     */\n    src: string;\n    status: boolean;\n    /**\n     * Defines an increment or jump between values that you want to allow the user to enter. When used with the max and min attributes, lets you control the range and increment (for example, allow only even numbers) that the user can enter into an input field.\n     */\n    step: string;\n    /**\n     * Returns the content type of the object.\n     */\n    type: string;\n    /**\n     * Sets or retrieves the URL, often with a bookmark extension (#name), to use as a client-side image map.\n     */\n    useMap: string;\n    /**\n     * Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting.\n     */\n    readonly validationMessage: string;\n    /**\n     * Returns a  ValidityState object that represents the validity states of an element.\n     */\n    readonly validity: ValidityState;\n    /**\n     * Returns the value of the data at the cursor\'s current position.\n     */\n    value: string;\n    valueAsDate: Date;\n    /**\n     * Returns the input field value as a number.\n     */\n    valueAsNumber: number;\n    /**\n     * Sets or retrieves the vertical margin for the object.\n     */\n    vspace: number;\n    webkitdirectory: boolean;\n    /**\n     * Sets or retrieves the width of the object.\n     */\n    width: string;\n    /**\n     * Returns whether an element will successfully validate based on forms validation rules and constraints.\n     */\n    readonly willValidate: boolean;\n    minLength: number;\n    /**\n     * Returns whether a form will validate when it is submitted, without having to submit it.\n     */\n    checkValidity(): boolean;\n    /**\n     * Makes the selection equal to the current object.\n     */\n    select(): void;\n    /**\n     * Sets a custom error message that is displayed when a form is submitted.\n     * @param error Sets a custom error message that is displayed when a form is submitted.\n     */\n    setCustomValidity(error: string): void;\n    /**\n     * Sets the start and end positions of a selection in a text field.\n     * @param start The offset into the text field for the start of the selection.\n     * @param end The offset into the text field for the end of the selection.\n     */\n    setSelectionRange(start?: number, end?: number, direction?: string): void;\n    /**\n     * Decrements a range input control\'s value by the value given by the Step attribute. If the optional parameter is used, it will decrement the input control\'s step value multiplied by the parameter\'s value.\n     * @param n Value to decrement the value by.\n     */\n    stepDown(n?: number): void;\n    /**\n     * Increments a range input control\'s value by the value given by the Step attribute. If the optional parameter is used, will increment the input control\'s value by that value.\n     * @param n Value to increment the value by.\n     */\n    stepUp(n?: number): void;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLInputElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLInputElement: {\n    prototype: HTMLInputElement;\n    new(): HTMLInputElement;\n};\n\ninterface HTMLLabelElement extends HTMLElement {\n    /**\n     * Retrieves a reference to the form that the object is embedded in.\n     */\n    readonly form: HTMLFormElement;\n    /**\n     * Sets or retrieves the object to which the given label object is assigned.\n     */\n    htmlFor: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLLabelElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLLabelElement: {\n    prototype: HTMLLabelElement;\n    new(): HTMLLabelElement;\n};\n\ninterface HTMLLegendElement extends HTMLElement {\n    /**\n     * Retrieves a reference to the form that the object is embedded in.\n     */\n    align: string;\n    /**\n     * Retrieves a reference to the form that the object is embedded in.\n     */\n    readonly form: HTMLFormElement;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLLegendElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLLegendElement: {\n    prototype: HTMLLegendElement;\n    new(): HTMLLegendElement;\n};\n\ninterface HTMLLIElement extends HTMLElement {\n    type: string;\n    /**\n     * Sets or retrieves the value of a list item.\n     */\n    value: number;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLLIElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLLIElement: {\n    prototype: HTMLLIElement;\n    new(): HTMLLIElement;\n};\n\ninterface HTMLLinkElement extends HTMLElement, LinkStyle {\n    /**\n     * Sets or retrieves the character set used to encode the object.\n     */\n    charset: string;\n    disabled: boolean;\n    /**\n     * Sets or retrieves a destination URL or an anchor point.\n     */\n    href: string;\n    /**\n     * Sets or retrieves the language code of the object.\n     */\n    hreflang: string;\n    /**\n     * Sets or retrieves the media type.\n     */\n    media: string;\n    /**\n     * Sets or retrieves the relationship between the object and the destination of the link.\n     */\n    rel: string;\n    /**\n     * Sets or retrieves the relationship between the object and the destination of the link.\n     */\n    rev: string;\n    /**\n     * Sets or retrieves the window or frame at which to target content.\n     */\n    target: string;\n    /**\n     * Sets or retrieves the MIME type of the object.\n     */\n    type: string;\n    import?: Document;\n    integrity: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLLinkElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLLinkElement: {\n    prototype: HTMLLinkElement;\n    new(): HTMLLinkElement;\n};\n\ninterface HTMLMapElement extends HTMLElement {\n    /**\n     * Retrieves a collection of the area objects defined for the given map object.\n     */\n    readonly areas: HTMLAreasCollection;\n    /**\n     * Sets or retrieves the name of the object.\n     */\n    name: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLMapElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLMapElement: {\n    prototype: HTMLMapElement;\n    new(): HTMLMapElement;\n};\n\ninterface HTMLMarqueeElementEventMap extends HTMLElementEventMap {\n    "bounce": Event;\n    "finish": Event;\n    "start": Event;\n}\n\ninterface HTMLMarqueeElement extends HTMLElement {\n    behavior: string;\n    bgColor: any;\n    direction: string;\n    height: string;\n    hspace: number;\n    loop: number;\n    onbounce: (this: HTMLMarqueeElement, ev: Event) => any;\n    onfinish: (this: HTMLMarqueeElement, ev: Event) => any;\n    onstart: (this: HTMLMarqueeElement, ev: Event) => any;\n    scrollAmount: number;\n    scrollDelay: number;\n    trueSpeed: boolean;\n    vspace: number;\n    width: string;\n    start(): void;\n    stop(): void;\n    addEventListener<K extends keyof HTMLMarqueeElementEventMap>(type: K, listener: (this: HTMLMarqueeElement, ev: HTMLMarqueeElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLMarqueeElement: {\n    prototype: HTMLMarqueeElement;\n    new(): HTMLMarqueeElement;\n};\n\ninterface HTMLMediaElementEventMap extends HTMLElementEventMap {\n    "encrypted": MediaEncryptedEvent;\n    "msneedkey": MSMediaKeyNeededEvent;\n}\n\ninterface HTMLMediaElement extends HTMLElement {\n    /**\n     * Returns an AudioTrackList object with the audio tracks for a given video element.\n     */\n    readonly audioTracks: AudioTrackList;\n    /**\n     * Gets or sets a value that indicates whether to start playing the media automatically.\n     */\n    autoplay: boolean;\n    /**\n     * Gets a collection of buffered time ranges.\n     */\n    readonly buffered: TimeRanges;\n    /**\n     * Gets or sets a flag that indicates whether the client provides a set of controls for the media (in case the developer does not include controls for the player).\n     */\n    controls: boolean;\n    crossOrigin: string | null;\n    /**\n     * Gets the address or URL of the current media resource that is selected by IHTMLMediaElement.\n     */\n    readonly currentSrc: string;\n    /**\n     * Gets or sets the current playback position, in seconds.\n     */\n    currentTime: number;\n    defaultMuted: boolean;\n    /**\n     * Gets or sets the default playback rate when the user is not using fast forward or reverse for a video or audio resource.\n     */\n    defaultPlaybackRate: number;\n    /**\n     * Returns the duration in seconds of the current media resource. A NaN value is returned if duration is not available, or Infinity if the media resource is streaming.\n     */\n    readonly duration: number;\n    /**\n     * Gets information about whether the playback has ended or not.\n     */\n    readonly ended: boolean;\n    /**\n     * Returns an object representing the current error state of the audio or video element.\n     */\n    readonly error: MediaError;\n    /**\n     * Gets or sets a flag to specify whether playback should restart after it completes.\n     */\n    loop: boolean;\n    readonly mediaKeys: MediaKeys | null;\n    /**\n     * Specifies the purpose of the audio or video media, such as background audio or alerts.\n     */\n    msAudioCategory: string;\n    /**\n     * Specifies the output device id that the audio will be sent to.\n     */\n    msAudioDeviceType: string;\n    readonly msGraphicsTrustStatus: MSGraphicsTrust;\n    /**\n     * Gets the MSMediaKeys object, which is used for decrypting media data, that is associated with this media element.\n     */\n    readonly msKeys: MSMediaKeys;\n    /**\n     * Gets or sets whether the DLNA PlayTo device is available.\n     */\n    msPlayToDisabled: boolean;\n    /**\n     * Gets or sets the path to the preferred media source. This enables the Play To target device to stream the media content, which can be DRM protected, from a different location, such as a cloud media server.\n     */\n    msPlayToPreferredSourceUri: string;\n    /**\n     * Gets or sets the primary DLNA PlayTo device.\n     */\n    msPlayToPrimary: boolean;\n    /**\n     * Gets the source associated with the media element for use by the PlayToManager.\n     */\n    readonly msPlayToSource: any;\n    /**\n     * Specifies whether or not to enable low-latency playback on the media element.\n     */\n    msRealTime: boolean;\n    /**\n     * Gets or sets a flag that indicates whether the audio (either audio or the audio track on video media) is muted.\n     */\n    muted: boolean;\n    /**\n     * Gets the current network activity for the element.\n     */\n    readonly networkState: number;\n    onencrypted: (this: HTMLMediaElement, ev: MediaEncryptedEvent) => any;\n    onmsneedkey: (this: HTMLMediaElement, ev: MSMediaKeyNeededEvent) => any;\n    /**\n     * Gets a flag that specifies whether playback is paused.\n     */\n    readonly paused: boolean;\n    /**\n     * Gets or sets the current rate of speed for the media resource to play. This speed is expressed as a multiple of the normal speed of the media resource.\n     */\n    playbackRate: number;\n    /**\n     * Gets TimeRanges for the current media resource that has been played.\n     */\n    readonly played: TimeRanges;\n    /**\n     * Gets or sets the current playback position, in seconds.\n     */\n    preload: string;\n    readyState: number;\n    /**\n     * Returns a TimeRanges object that represents the ranges of the current media resource that can be seeked.\n     */\n    readonly seekable: TimeRanges;\n    /**\n     * Gets a flag that indicates whether the the client is currently moving to a new playback position in the media resource.\n     */\n    readonly seeking: boolean;\n    /**\n     * The address or URL of the a media resource that is to be considered.\n     */\n    src: string;\n    srcObject: MediaStream | null;\n    readonly textTracks: TextTrackList;\n    readonly videoTracks: VideoTrackList;\n    /**\n     * Gets or sets the volume level for audio portions of the media element.\n     */\n    volume: number;\n    addTextTrack(kind: string, label?: string, language?: string): TextTrack;\n    /**\n     * Returns a string that specifies whether the client can play a given media resource type.\n     */\n    canPlayType(type: string): string;\n    /**\n     * Resets the audio or video object and loads a new media resource.\n     */\n    load(): void;\n    /**\n     * Clears all effects from the media pipeline.\n     */\n    msClearEffects(): void;\n    msGetAsCastingSource(): any;\n    /**\n     * Inserts the specified audio effect into media pipeline.\n     */\n    msInsertAudioEffect(activatableClassId: string, effectRequired: boolean, config?: any): void;\n    msSetMediaKeys(mediaKeys: MSMediaKeys): void;\n    /**\n     * Specifies the media protection manager for a given media pipeline.\n     */\n    msSetMediaProtectionManager(mediaProtectionManager?: any): void;\n    /**\n     * Pauses the current playback and sets paused to TRUE. This can be used to test whether the media is playing or paused. You can also use the pause or play events to tell whether the media is playing or not.\n     */\n    pause(): void;\n    /**\n     * Loads and starts playback of a media resource.\n     */\n    play(): Promise<void>;\n    setMediaKeys(mediaKeys: MediaKeys | null): Promise<void>;\n    readonly HAVE_CURRENT_DATA: number;\n    readonly HAVE_ENOUGH_DATA: number;\n    readonly HAVE_FUTURE_DATA: number;\n    readonly HAVE_METADATA: number;\n    readonly HAVE_NOTHING: number;\n    readonly NETWORK_EMPTY: number;\n    readonly NETWORK_IDLE: number;\n    readonly NETWORK_LOADING: number;\n    readonly NETWORK_NO_SOURCE: number;\n    addEventListener<K extends keyof HTMLMediaElementEventMap>(type: K, listener: (this: HTMLMediaElement, ev: HTMLMediaElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLMediaElement: {\n    prototype: HTMLMediaElement;\n    new(): HTMLMediaElement;\n    readonly HAVE_CURRENT_DATA: number;\n    readonly HAVE_ENOUGH_DATA: number;\n    readonly HAVE_FUTURE_DATA: number;\n    readonly HAVE_METADATA: number;\n    readonly HAVE_NOTHING: number;\n    readonly NETWORK_EMPTY: number;\n    readonly NETWORK_IDLE: number;\n    readonly NETWORK_LOADING: number;\n    readonly NETWORK_NO_SOURCE: number;\n};\n\ninterface HTMLMenuElement extends HTMLElement {\n    compact: boolean;\n    type: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLMenuElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLMenuElement: {\n    prototype: HTMLMenuElement;\n    new(): HTMLMenuElement;\n};\n\ninterface HTMLMetaElement extends HTMLElement {\n    /**\n     * Sets or retrieves the character set used to encode the object.\n     */\n    charset: string;\n    /**\n     * Gets or sets meta-information to associate with httpEquiv or name.\n     */\n    content: string;\n    /**\n     * Gets or sets information used to bind the value of a content attribute of a meta element to an HTTP response header.\n     */\n    httpEquiv: string;\n    /**\n     * Sets or retrieves the value specified in the content attribute of the meta object.\n     */\n    name: string;\n    /**\n     * Sets or retrieves a scheme to be used in interpreting the value of a property specified for the object.\n     */\n    scheme: string;\n    /**\n     * Sets or retrieves the URL property that will be loaded after the specified time has elapsed.\n     */\n    url: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLMetaElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLMetaElement: {\n    prototype: HTMLMetaElement;\n    new(): HTMLMetaElement;\n};\n\ninterface HTMLMeterElement extends HTMLElement {\n    high: number;\n    low: number;\n    max: number;\n    min: number;\n    optimum: number;\n    value: number;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLMeterElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLMeterElement: {\n    prototype: HTMLMeterElement;\n    new(): HTMLMeterElement;\n};\n\ninterface HTMLModElement extends HTMLElement {\n    /**\n     * Sets or retrieves reference information about the object.\n     */\n    cite: string;\n    /**\n     * Sets or retrieves the date and time of a modification to the object.\n     */\n    dateTime: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLModElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLModElement: {\n    prototype: HTMLModElement;\n    new(): HTMLModElement;\n};\n\ninterface HTMLObjectElement extends HTMLElement, GetSVGDocument {\n    align: string;\n    /**\n     * Sets or retrieves a text alternative to the graphic.\n     */\n    alt: string;\n    /**\n     * Gets or sets the optional alternative HTML script to execute if the object fails to load.\n     */\n    altHtml: string;\n    /**\n     * Sets or retrieves a character string that can be used to implement your own archive functionality for the object.\n     */\n    archive: string;\n    /**\n     * Retrieves a string of the URL where the object tag can be found. This is often the href of the document that the object is in, or the value set by a base element.\n     */\n    readonly BaseHref: string;\n    border: string;\n    /**\n     * Sets or retrieves the URL of the file containing the compiled Java class.\n     */\n    code: string;\n    /**\n     * Sets or retrieves the URL of the component.\n     */\n    codeBase: string;\n    /**\n     * Sets or retrieves the Internet media type for the code associated with the object.\n     */\n    codeType: string;\n    /**\n     * Retrieves the document object of the page or frame.\n     */\n    readonly contentDocument: Document;\n    /**\n     * Sets or retrieves the URL that references the data of the object.\n     */\n    data: string;\n    declare: boolean;\n    /**\n     * Retrieves a reference to the form that the object is embedded in.\n     */\n    readonly form: HTMLFormElement;\n    /**\n     * Sets or retrieves the height of the object.\n     */\n    height: string;\n    hspace: number;\n    /**\n     * Gets or sets whether the DLNA PlayTo device is available.\n     */\n    msPlayToDisabled: boolean;\n    /**\n     * Gets or sets the path to the preferred media source. This enables the Play To target device to stream the media content, which can be DRM protected, from a different location, such as a cloud media server.\n     */\n    msPlayToPreferredSourceUri: string;\n    /**\n     * Gets or sets the primary DLNA PlayTo device.\n     */\n    msPlayToPrimary: boolean;\n    /**\n     * Gets the source associated with the media element for use by the PlayToManager.\n     */\n    readonly msPlayToSource: any;\n    /**\n     * Sets or retrieves the name of the object.\n     */\n    name: string;\n    readonly readyState: number;\n    /**\n     * Sets or retrieves a message to be displayed while an object is loading.\n     */\n    standby: string;\n    /**\n     * Sets or retrieves the MIME type of the object.\n     */\n    type: string;\n    /**\n     * Sets or retrieves the URL, often with a bookmark extension (#name), to use as a client-side image map.\n     */\n    useMap: string;\n    /**\n     * Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting.\n     */\n    readonly validationMessage: string;\n    /**\n     * Returns a  ValidityState object that represents the validity states of an element.\n     */\n    readonly validity: ValidityState;\n    vspace: number;\n    /**\n     * Sets or retrieves the width of the object.\n     */\n    width: string;\n    /**\n     * Returns whether an element will successfully validate based on forms validation rules and constraints.\n     */\n    readonly willValidate: boolean;\n    /**\n     * Returns whether a form will validate when it is submitted, without having to submit it.\n     */\n    checkValidity(): boolean;\n    /**\n     * Sets a custom error message that is displayed when a form is submitted.\n     * @param error Sets a custom error message that is displayed when a form is submitted.\n     */\n    setCustomValidity(error: string): void;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLObjectElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLObjectElement: {\n    prototype: HTMLObjectElement;\n    new(): HTMLObjectElement;\n};\n\ninterface HTMLOListElement extends HTMLElement {\n    compact: boolean;\n    /**\n     * The starting number.\n     */\n    start: number;\n    type: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLOListElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLOListElement: {\n    prototype: HTMLOListElement;\n    new(): HTMLOListElement;\n};\n\ninterface HTMLOptGroupElement extends HTMLElement {\n    /**\n     * Sets or retrieves the status of an option.\n     */\n    defaultSelected: boolean;\n    disabled: boolean;\n    /**\n     * Retrieves a reference to the form that the object is embedded in.\n     */\n    readonly form: HTMLFormElement;\n    /**\n     * Sets or retrieves the ordinal position of an option in a list box.\n     */\n    readonly index: number;\n    /**\n     * Sets or retrieves a value that you can use to implement your own label functionality for the object.\n     */\n    label: string;\n    /**\n     * Sets or retrieves whether the option in the list box is the default item.\n     */\n    selected: boolean;\n    /**\n     * Sets or retrieves the text string specified by the option tag.\n     */\n    readonly text: string;\n    /**\n     * Sets or retrieves the value which is returned to the server when the form control is submitted.\n     */\n    value: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLOptGroupElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLOptGroupElement: {\n    prototype: HTMLOptGroupElement;\n    new(): HTMLOptGroupElement;\n};\n\ninterface HTMLOptionElement extends HTMLElement {\n    /**\n     * Sets or retrieves the status of an option.\n     */\n    defaultSelected: boolean;\n    disabled: boolean;\n    /**\n     * Retrieves a reference to the form that the object is embedded in.\n     */\n    readonly form: HTMLFormElement;\n    /**\n     * Sets or retrieves the ordinal position of an option in a list box.\n     */\n    readonly index: number;\n    /**\n     * Sets or retrieves a value that you can use to implement your own label functionality for the object.\n     */\n    label: string;\n    /**\n     * Sets or retrieves whether the option in the list box is the default item.\n     */\n    selected: boolean;\n    /**\n     * Sets or retrieves the text string specified by the option tag.\n     */\n    text: string;\n    /**\n     * Sets or retrieves the value which is returned to the server when the form control is submitted.\n     */\n    value: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLOptionElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLOptionElement: {\n    prototype: HTMLOptionElement;\n    new(): HTMLOptionElement;\n};\n\ninterface HTMLOptionsCollection extends HTMLCollectionOf<HTMLOptionElement> {\n    length: number;\n    selectedIndex: number;\n    add(element: HTMLOptionElement | HTMLOptGroupElement, before?: HTMLElement | number): void;\n    remove(index: number): void;\n}\n\ndeclare var HTMLOptionsCollection: {\n    prototype: HTMLOptionsCollection;\n    new(): HTMLOptionsCollection;\n};\n\ninterface HTMLOutputElement extends HTMLElement {\n    defaultValue: string;\n    readonly form: HTMLFormElement;\n    readonly htmlFor: DOMSettableTokenList;\n    name: string;\n    readonly type: string;\n    readonly validationMessage: string;\n    readonly validity: ValidityState;\n    value: string;\n    readonly willValidate: boolean;\n    checkValidity(): boolean;\n    reportValidity(): boolean;\n    setCustomValidity(error: string): void;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLOutputElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLOutputElement: {\n    prototype: HTMLOutputElement;\n    new(): HTMLOutputElement;\n};\n\ninterface HTMLParagraphElement extends HTMLElement {\n    /**\n     * Sets or retrieves how the object is aligned with adjacent text.\n     */\n    align: string;\n    clear: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLParagraphElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLParagraphElement: {\n    prototype: HTMLParagraphElement;\n    new(): HTMLParagraphElement;\n};\n\ninterface HTMLParamElement extends HTMLElement {\n    /**\n     * Sets or retrieves the name of an input parameter for an element.\n     */\n    name: string;\n    /**\n     * Sets or retrieves the content type of the resource designated by the value attribute.\n     */\n    type: string;\n    /**\n     * Sets or retrieves the value of an input parameter for an element.\n     */\n    value: string;\n    /**\n     * Sets or retrieves the data type of the value attribute.\n     */\n    valueType: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLParamElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLParamElement: {\n    prototype: HTMLParamElement;\n    new(): HTMLParamElement;\n};\n\ninterface HTMLPictureElement extends HTMLElement {\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLPictureElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLPictureElement: {\n    prototype: HTMLPictureElement;\n    new(): HTMLPictureElement;\n};\n\ninterface HTMLPreElement extends HTMLElement {\n    /**\n     * Sets or gets a value that you can use to implement your own width functionality for the object.\n     */\n    width: number;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLPreElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLPreElement: {\n    prototype: HTMLPreElement;\n    new(): HTMLPreElement;\n};\n\ninterface HTMLProgressElement extends HTMLElement {\n    /**\n     * Retrieves a reference to the form that the object is embedded in.\n     */\n    readonly form: HTMLFormElement;\n    /**\n     * Defines the maximum, or "done" value for a progress element.\n     */\n    max: number;\n    /**\n     * Returns the quotient of value/max when the value attribute is set (determinate progress bar), or -1 when the value attribute is missing (indeterminate progress bar).\n     */\n    readonly position: number;\n    /**\n     * Sets or gets the current value of a progress element. The value must be a non-negative number between 0 and the max value.\n     */\n    value: number;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLProgressElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLProgressElement: {\n    prototype: HTMLProgressElement;\n    new(): HTMLProgressElement;\n};\n\ninterface HTMLQuoteElement extends HTMLElement {\n    /**\n     * Sets or retrieves reference information about the object.\n     */\n    cite: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLQuoteElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLQuoteElement: {\n    prototype: HTMLQuoteElement;\n    new(): HTMLQuoteElement;\n};\n\ninterface HTMLScriptElement extends HTMLElement {\n    async: boolean;\n    /**\n     * Sets or retrieves the character set used to encode the object.\n     */\n    charset: string;\n    crossOrigin: string | null;\n    /**\n     * Sets or retrieves the status of the script.\n     */\n    defer: boolean;\n    /**\n     * Sets or retrieves the event for which the script is written.\n     */\n    event: string;\n    /**\n     * Sets or retrieves the object that is bound to the event script.\n     */\n    htmlFor: string;\n    /**\n     * Retrieves the URL to an external file that contains the source code or data.\n     */\n    src: string;\n    /**\n     * Retrieves or sets the text of the object as a string.\n     */\n    text: string;\n    /**\n     * Sets or retrieves the MIME type for the associated scripting engine.\n     */\n    type: string;\n    integrity: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLScriptElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLScriptElement: {\n    prototype: HTMLScriptElement;\n    new(): HTMLScriptElement;\n};\n\ninterface HTMLSelectElement extends HTMLElement {\n    /**\n     * Provides a way to direct a user to a specific field when a document loads. This can provide both direction and convenience for a user, reducing the need to click or tab to a field when a page opens. This attribute is true when present on an element, and false when missing.\n     */\n    autofocus: boolean;\n    disabled: boolean;\n    /**\n     * Retrieves a reference to the form that the object is embedded in.\n     */\n    readonly form: HTMLFormElement;\n    /**\n     * Sets or retrieves the number of objects in a collection.\n     */\n    length: number;\n    /**\n     * Sets or retrieves the Boolean value indicating whether multiple items can be selected from a list.\n     */\n    multiple: boolean;\n    /**\n     * Sets or retrieves the name of the object.\n     */\n    name: string;\n    readonly options: HTMLOptionsCollection;\n    /**\n     * When present, marks an element that can\'t be submitted without a value.\n     */\n    required: boolean;\n    /**\n     * Sets or retrieves the index of the selected option in a select object.\n     */\n    selectedIndex: number;\n    selectedOptions: HTMLCollectionOf<HTMLOptionElement>;\n    /**\n     * Sets or retrieves the number of rows in the list box.\n     */\n    size: number;\n    /**\n     * Retrieves the type of select control based on the value of the MULTIPLE attribute.\n     */\n    readonly type: string;\n    /**\n     * Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting.\n     */\n    readonly validationMessage: string;\n    /**\n     * Returns a  ValidityState object that represents the validity states of an element.\n     */\n    readonly validity: ValidityState;\n    /**\n     * Sets or retrieves the value which is returned to the server when the form control is submitted.\n     */\n    value: string;\n    /**\n     * Returns whether an element will successfully validate based on forms validation rules and constraints.\n     */\n    readonly willValidate: boolean;\n    /**\n     * Adds an element to the areas, controlRange, or options collection.\n     * @param element Variant of type Number that specifies the index position in the collection where the element is placed. If no value is given, the method places the element at the end of the collection.\n     * @param before Variant of type Object that specifies an element to insert before, or null to append the object to the collection.\n     */\n    add(element: HTMLElement, before?: HTMLElement | number): void;\n    /**\n     * Returns whether a form will validate when it is submitted, without having to submit it.\n     */\n    checkValidity(): boolean;\n    /**\n     * Retrieves a select object or an object from an options collection.\n     * @param name Variant of type Number or String that specifies the object or collection to retrieve. If this parameter is an integer, it is the zero-based index of the object. If this parameter is a string, all objects with matching name or id properties are retrieved, and a collection is returned if more than one match is made.\n     * @param index Variant of type Number that specifies the zero-based index of the object to retrieve when a collection is returned.\n     */\n    item(name?: any, index?: any): any;\n    /**\n     * Retrieves a select object or an object from an options collection.\n     * @param namedItem A String that specifies the name or id property of the object to retrieve. A collection is returned if more than one match is made.\n     */\n    namedItem(name: string): any;\n    /**\n     * Removes an element from the collection.\n     * @param index Number that specifies the zero-based index of the element to remove from the collection.\n     */\n    remove(index?: number): void;\n    /**\n     * Sets a custom error message that is displayed when a form is submitted.\n     * @param error Sets a custom error message that is displayed when a form is submitted.\n     */\n    setCustomValidity(error: string): void;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLSelectElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n    [name: string]: any;\n}\n\ndeclare var HTMLSelectElement: {\n    prototype: HTMLSelectElement;\n    new(): HTMLSelectElement;\n};\n\ninterface HTMLSourceElement extends HTMLElement {\n    /**\n     * Gets or sets the intended media type of the media source.\n     */\n    media: string;\n    msKeySystem: string;\n    sizes: string;\n    /**\n     * The address or URL of the a media resource that is to be considered.\n     */\n    src: string;\n    srcset: string;\n    /**\n     * Gets or sets the MIME type of a media resource.\n     */\n    type: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLSourceElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLSourceElement: {\n    prototype: HTMLSourceElement;\n    new(): HTMLSourceElement;\n};\n\ninterface HTMLSpanElement extends HTMLElement {\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLSpanElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLSpanElement: {\n    prototype: HTMLSpanElement;\n    new(): HTMLSpanElement;\n};\n\ninterface HTMLStyleElement extends HTMLElement, LinkStyle {\n    disabled: boolean;\n    /**\n     * Sets or retrieves the media type.\n     */\n    media: string;\n    /**\n     * Retrieves the CSS language in which the style sheet is written.\n     */\n    type: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLStyleElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLStyleElement: {\n    prototype: HTMLStyleElement;\n    new(): HTMLStyleElement;\n};\n\ninterface HTMLTableCaptionElement extends HTMLElement {\n    /**\n     * Sets or retrieves the alignment of the caption or legend.\n     */\n    align: string;\n    /**\n     * Sets or retrieves whether the caption appears at the top or bottom of the table.\n     */\n    vAlign: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableCaptionElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLTableCaptionElement: {\n    prototype: HTMLTableCaptionElement;\n    new(): HTMLTableCaptionElement;\n};\n\ninterface HTMLTableCellElement extends HTMLElement, HTMLTableAlignment {\n    /**\n     * Sets or retrieves abbreviated text for the object.\n     */\n    abbr: string;\n    /**\n     * Sets or retrieves how the object is aligned with adjacent text.\n     */\n    align: string;\n    /**\n     * Sets or retrieves a comma-delimited list of conceptual categories associated with the object.\n     */\n    axis: string;\n    bgColor: any;\n    /**\n     * Retrieves the position of the object in the cells collection of a row.\n     */\n    readonly cellIndex: number;\n    /**\n     * Sets or retrieves the number columns in the table that the object should span.\n     */\n    colSpan: number;\n    /**\n     * Sets or retrieves a list of header cells that provide information for the object.\n     */\n    headers: string;\n    /**\n     * Sets or retrieves the height of the object.\n     */\n    height: any;\n    /**\n     * Sets or retrieves whether the browser automatically performs wordwrap.\n     */\n    noWrap: boolean;\n    /**\n     * Sets or retrieves how many rows in a table the cell should span.\n     */\n    rowSpan: number;\n    /**\n     * Sets or retrieves the group of cells in a table to which the object\'s information applies.\n     */\n    scope: string;\n    /**\n     * Sets or retrieves the width of the object.\n     */\n    width: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableCellElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLTableCellElement: {\n    prototype: HTMLTableCellElement;\n    new(): HTMLTableCellElement;\n};\n\ninterface HTMLTableColElement extends HTMLElement, HTMLTableAlignment {\n    /**\n     * Sets or retrieves the alignment of the object relative to the display or table.\n     */\n    align: string;\n    /**\n     * Sets or retrieves the number of columns in the group.\n     */\n    span: number;\n    /**\n     * Sets or retrieves the width of the object.\n     */\n    width: any;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableColElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLTableColElement: {\n    prototype: HTMLTableColElement;\n    new(): HTMLTableColElement;\n};\n\ninterface HTMLTableDataCellElement extends HTMLTableCellElement {\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableDataCellElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLTableDataCellElement: {\n    prototype: HTMLTableDataCellElement;\n    new(): HTMLTableDataCellElement;\n};\n\ninterface HTMLTableElement extends HTMLElement {\n    /**\n     * Sets or retrieves a value that indicates the table alignment.\n     */\n    align: string;\n    bgColor: any;\n    /**\n     * Sets or retrieves the width of the border to draw around the object.\n     */\n    border: string;\n    /**\n     * Sets or retrieves the border color of the object.\n     */\n    borderColor: any;\n    /**\n     * Retrieves the caption object of a table.\n     */\n    caption: HTMLTableCaptionElement;\n    /**\n     * Sets or retrieves the amount of space between the border of the cell and the content of the cell.\n     */\n    cellPadding: string;\n    /**\n     * Sets or retrieves the amount of space between cells in a table.\n     */\n    cellSpacing: string;\n    /**\n     * Sets or retrieves the number of columns in the table.\n     */\n    cols: number;\n    /**\n     * Sets or retrieves the way the border frame around the table is displayed.\n     */\n    frame: string;\n    /**\n     * Sets or retrieves the height of the object.\n     */\n    height: any;\n    /**\n     * Sets or retrieves the number of horizontal rows contained in the object.\n     */\n    rows: HTMLCollectionOf<HTMLTableRowElement>;\n    /**\n     * Sets or retrieves which dividing lines (inner borders) are displayed.\n     */\n    rules: string;\n    /**\n     * Sets or retrieves a description and/or structure of the object.\n     */\n    summary: string;\n    /**\n     * Retrieves a collection of all tBody objects in the table. Objects in this collection are in source order.\n     */\n    tBodies: HTMLCollectionOf<HTMLTableSectionElement>;\n    /**\n     * Retrieves the tFoot object of the table.\n     */\n    tFoot: HTMLTableSectionElement;\n    /**\n     * Retrieves the tHead object of the table.\n     */\n    tHead: HTMLTableSectionElement;\n    /**\n     * Sets or retrieves the width of the object.\n     */\n    width: string;\n    /**\n     * Creates an empty caption element in the table.\n     */\n    createCaption(): HTMLTableCaptionElement;\n    /**\n     * Creates an empty tBody element in the table.\n     */\n    createTBody(): HTMLTableSectionElement;\n    /**\n     * Creates an empty tFoot element in the table.\n     */\n    createTFoot(): HTMLTableSectionElement;\n    /**\n     * Returns the tHead element object if successful, or null otherwise.\n     */\n    createTHead(): HTMLTableSectionElement;\n    /**\n     * Deletes the caption element and its contents from the table.\n     */\n    deleteCaption(): void;\n    /**\n     * Removes the specified row (tr) from the element and from the rows collection.\n     * @param index Number that specifies the zero-based position in the rows collection of the row to remove.\n     */\n    deleteRow(index?: number): void;\n    /**\n     * Deletes the tFoot element and its contents from the table.\n     */\n    deleteTFoot(): void;\n    /**\n     * Deletes the tHead element and its contents from the table.\n     */\n    deleteTHead(): void;\n    /**\n     * Creates a new row (tr) in the table, and adds the row to the rows collection.\n     * @param index Number that specifies where to insert the row in the rows collection. The default value is -1, which appends the new row to the end of the rows collection.\n     */\n    insertRow(index?: number): HTMLTableRowElement;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLTableElement: {\n    prototype: HTMLTableElement;\n    new(): HTMLTableElement;\n};\n\ninterface HTMLTableHeaderCellElement extends HTMLTableCellElement {\n    /**\n     * Sets or retrieves the group of cells in a table to which the object\'s information applies.\n     */\n    scope: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableHeaderCellElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLTableHeaderCellElement: {\n    prototype: HTMLTableHeaderCellElement;\n    new(): HTMLTableHeaderCellElement;\n};\n\ninterface HTMLTableRowElement extends HTMLElement, HTMLTableAlignment {\n    /**\n     * Sets or retrieves how the object is aligned with adjacent text.\n     */\n    align: string;\n    bgColor: any;\n    /**\n     * Retrieves a collection of all cells in the table row.\n     */\n    cells: HTMLCollectionOf<HTMLTableDataCellElement | HTMLTableHeaderCellElement>;\n    /**\n     * Sets or retrieves the height of the object.\n     */\n    height: any;\n    /**\n     * Retrieves the position of the object in the rows collection for the table.\n     */\n    readonly rowIndex: number;\n    /**\n     * Retrieves the position of the object in the collection.\n     */\n    readonly sectionRowIndex: number;\n    /**\n     * Removes the specified cell from the table row, as well as from the cells collection.\n     * @param index Number that specifies the zero-based position of the cell to remove from the table row. If no value is provided, the last cell in the cells collection is deleted.\n     */\n    deleteCell(index?: number): void;\n    /**\n     * Creates a new cell in the table row, and adds the cell to the cells collection.\n     * @param index Number that specifies where to insert the cell in the tr. The default value is -1, which appends the new cell to the end of the cells collection.\n     */\n    insertCell(index?: number): HTMLTableDataCellElement;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableRowElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLTableRowElement: {\n    prototype: HTMLTableRowElement;\n    new(): HTMLTableRowElement;\n};\n\ninterface HTMLTableSectionElement extends HTMLElement, HTMLTableAlignment {\n    /**\n     * Sets or retrieves a value that indicates the table alignment.\n     */\n    align: string;\n    /**\n     * Sets or retrieves the number of horizontal rows contained in the object.\n     */\n    rows: HTMLCollectionOf<HTMLTableRowElement>;\n    /**\n     * Removes the specified row (tr) from the element and from the rows collection.\n     * @param index Number that specifies the zero-based position in the rows collection of the row to remove.\n     */\n    deleteRow(index?: number): void;\n    /**\n     * Creates a new row (tr) in the table, and adds the row to the rows collection.\n     * @param index Number that specifies where to insert the row in the rows collection. The default value is -1, which appends the new row to the end of the rows collection.\n     */\n    insertRow(index?: number): HTMLTableRowElement;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableSectionElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLTableSectionElement: {\n    prototype: HTMLTableSectionElement;\n    new(): HTMLTableSectionElement;\n};\n\ninterface HTMLTemplateElement extends HTMLElement {\n    readonly content: DocumentFragment;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTemplateElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLTemplateElement: {\n    prototype: HTMLTemplateElement;\n    new(): HTMLTemplateElement;\n};\n\ninterface HTMLTextAreaElement extends HTMLElement {\n    /**\n     * Provides a way to direct a user to a specific field when a document loads. This can provide both direction and convenience for a user, reducing the need to click or tab to a field when a page opens. This attribute is true when present on an element, and false when missing.\n     */\n    autofocus: boolean;\n    /**\n     * Sets or retrieves the width of the object.\n     */\n    cols: number;\n    /**\n     * Sets or retrieves the initial contents of the object.\n     */\n    defaultValue: string;\n    disabled: boolean;\n    /**\n     * Retrieves a reference to the form that the object is embedded in.\n     */\n    readonly form: HTMLFormElement;\n    /**\n     * Sets or retrieves the maximum number of characters that the user can enter in a text control.\n     */\n    maxLength: number;\n    /**\n     * Sets or retrieves the name of the object.\n     */\n    name: string;\n    /**\n     * Gets or sets a text string that is displayed in an input field as a hint or prompt to users as the format or type of information they need to enter.The text appears in an input field until the user puts focus on the field.\n     */\n    placeholder: string;\n    /**\n     * Sets or retrieves the value indicated whether the content of the object is read-only.\n     */\n    readOnly: boolean;\n    /**\n     * When present, marks an element that can\'t be submitted without a value.\n     */\n    required: boolean;\n    /**\n     * Sets or retrieves the number of horizontal rows contained in the object.\n     */\n    rows: number;\n    /**\n     * Gets or sets the end position or offset of a text selection.\n     */\n    selectionEnd: number;\n    /**\n     * Gets or sets the starting position or offset of a text selection.\n     */\n    selectionStart: number;\n    /**\n     * Sets or retrieves the value indicating whether the control is selected.\n     */\n    status: any;\n    /**\n     * Retrieves the type of control.\n     */\n    readonly type: string;\n    /**\n     * Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting.\n     */\n    readonly validationMessage: string;\n    /**\n     * Returns a  ValidityState object that represents the validity states of an element.\n     */\n    readonly validity: ValidityState;\n    /**\n     * Retrieves or sets the text in the entry field of the textArea element.\n     */\n    value: string;\n    /**\n     * Returns whether an element will successfully validate based on forms validation rules and constraints.\n     */\n    readonly willValidate: boolean;\n    /**\n     * Sets or retrieves how to handle wordwrapping in the object.\n     */\n    wrap: string;\n    minLength: number;\n    /**\n     * Returns whether a form will validate when it is submitted, without having to submit it.\n     */\n    checkValidity(): boolean;\n    /**\n     * Highlights the input area of a form element.\n     */\n    select(): void;\n    /**\n     * Sets a custom error message that is displayed when a form is submitted.\n     * @param error Sets a custom error message that is displayed when a form is submitted.\n     */\n    setCustomValidity(error: string): void;\n    /**\n     * Sets the start and end positions of a selection in a text field.\n     * @param start The offset into the text field for the start of the selection.\n     * @param end The offset into the text field for the end of the selection.\n     */\n    setSelectionRange(start: number, end: number): void;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTextAreaElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLTextAreaElement: {\n    prototype: HTMLTextAreaElement;\n    new(): HTMLTextAreaElement;\n};\n\ninterface HTMLTimeElement extends HTMLElement {\n    dateTime: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTimeElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLTimeElement: {\n    prototype: HTMLTimeElement;\n    new(): HTMLTimeElement;\n};\n\ninterface HTMLTitleElement extends HTMLElement {\n    /**\n     * Retrieves or sets the text of the object as a string.\n     */\n    text: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTitleElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLTitleElement: {\n    prototype: HTMLTitleElement;\n    new(): HTMLTitleElement;\n};\n\ninterface HTMLTrackElement extends HTMLElement {\n    default: boolean;\n    kind: string;\n    label: string;\n    readonly readyState: number;\n    src: string;\n    srclang: string;\n    readonly track: TextTrack;\n    readonly ERROR: number;\n    readonly LOADED: number;\n    readonly LOADING: number;\n    readonly NONE: number;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTrackElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLTrackElement: {\n    prototype: HTMLTrackElement;\n    new(): HTMLTrackElement;\n    readonly ERROR: number;\n    readonly LOADED: number;\n    readonly LOADING: number;\n    readonly NONE: number;\n};\n\ninterface HTMLUListElement extends HTMLElement {\n    compact: boolean;\n    type: string;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLUListElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLUListElement: {\n    prototype: HTMLUListElement;\n    new(): HTMLUListElement;\n};\n\ninterface HTMLUnknownElement extends HTMLElement {\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLUnknownElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLUnknownElement: {\n    prototype: HTMLUnknownElement;\n    new(): HTMLUnknownElement;\n};\n\ninterface HTMLVideoElementEventMap extends HTMLMediaElementEventMap {\n    "MSVideoFormatChanged": Event;\n    "MSVideoFrameStepCompleted": Event;\n    "MSVideoOptimalLayoutChanged": Event;\n}\n\ninterface HTMLVideoElement extends HTMLMediaElement {\n    /**\n     * Gets or sets the height of the video element.\n     */\n    height: number;\n    msHorizontalMirror: boolean;\n    readonly msIsLayoutOptimalForPlayback: boolean;\n    readonly msIsStereo3D: boolean;\n    msStereo3DPackingMode: string;\n    msStereo3DRenderMode: string;\n    msZoom: boolean;\n    onMSVideoFormatChanged: (this: HTMLVideoElement, ev: Event) => any;\n    onMSVideoFrameStepCompleted: (this: HTMLVideoElement, ev: Event) => any;\n    onMSVideoOptimalLayoutChanged: (this: HTMLVideoElement, ev: Event) => any;\n    /**\n     * Gets or sets a URL of an image to display, for example, like a movie poster. This can be a still frame from the video, or another image if no video data is available.\n     */\n    poster: string;\n    /**\n     * Gets the intrinsic height of a video in CSS pixels, or zero if the dimensions are not known.\n     */\n    readonly videoHeight: number;\n    /**\n     * Gets the intrinsic width of a video in CSS pixels, or zero if the dimensions are not known.\n     */\n    readonly videoWidth: number;\n    readonly webkitDisplayingFullscreen: boolean;\n    readonly webkitSupportsFullscreen: boolean;\n    /**\n     * Gets or sets the width of the video element.\n     */\n    width: number;\n    getVideoPlaybackQuality(): VideoPlaybackQuality;\n    msFrameStep(forward: boolean): void;\n    msInsertVideoEffect(activatableClassId: string, effectRequired: boolean, config?: any): void;\n    msSetVideoRectangle(left: number, top: number, right: number, bottom: number): void;\n    webkitEnterFullscreen(): void;\n    webkitEnterFullScreen(): void;\n    webkitExitFullscreen(): void;\n    webkitExitFullScreen(): void;\n    addEventListener<K extends keyof HTMLVideoElementEventMap>(type: K, listener: (this: HTMLVideoElement, ev: HTMLVideoElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var HTMLVideoElement: {\n    prototype: HTMLVideoElement;\n    new(): HTMLVideoElement;\n};\n\ninterface IDBCursor {\n    readonly direction: IDBCursorDirection;\n    key: IDBKeyRange | IDBValidKey;\n    readonly primaryKey: any;\n    source: IDBObjectStore | IDBIndex;\n    advance(count: number): void;\n    continue(key?: IDBKeyRange | IDBValidKey): void;\n    delete(): IDBRequest;\n    update(value: any): IDBRequest;\n    readonly NEXT: string;\n    readonly NEXT_NO_DUPLICATE: string;\n    readonly PREV: string;\n    readonly PREV_NO_DUPLICATE: string;\n}\n\ndeclare var IDBCursor: {\n    prototype: IDBCursor;\n    new(): IDBCursor;\n    readonly NEXT: string;\n    readonly NEXT_NO_DUPLICATE: string;\n    readonly PREV: string;\n    readonly PREV_NO_DUPLICATE: string;\n};\n\ninterface IDBCursorWithValue extends IDBCursor {\n    readonly value: any;\n}\n\ndeclare var IDBCursorWithValue: {\n    prototype: IDBCursorWithValue;\n    new(): IDBCursorWithValue;\n};\n\ninterface IDBDatabaseEventMap {\n    "abort": Event;\n    "error": Event;\n}\n\ninterface IDBDatabase extends EventTarget {\n    readonly name: string;\n    readonly objectStoreNames: DOMStringList;\n    onabort: (this: IDBDatabase, ev: Event) => any;\n    onerror: (this: IDBDatabase, ev: Event) => any;\n    version: number;\n    onversionchange: (ev: IDBVersionChangeEvent) => any;\n    close(): void;\n    createObjectStore(name: string, optionalParameters?: IDBObjectStoreParameters): IDBObjectStore;\n    deleteObjectStore(name: string): void;\n    transaction(storeNames: string | string[], mode?: IDBTransactionMode): IDBTransaction;\n    addEventListener(type: "versionchange", listener: (ev: IDBVersionChangeEvent) => any, useCapture?: boolean): void;\n    addEventListener<K extends keyof IDBDatabaseEventMap>(type: K, listener: (this: IDBDatabase, ev: IDBDatabaseEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var IDBDatabase: {\n    prototype: IDBDatabase;\n    new(): IDBDatabase;\n};\n\ninterface IDBFactory {\n    cmp(first: any, second: any): number;\n    deleteDatabase(name: string): IDBOpenDBRequest;\n    open(name: string, version?: number): IDBOpenDBRequest;\n}\n\ndeclare var IDBFactory: {\n    prototype: IDBFactory;\n    new(): IDBFactory;\n};\n\ninterface IDBIndex {\n    keyPath: string | string[];\n    readonly name: string;\n    readonly objectStore: IDBObjectStore;\n    readonly unique: boolean;\n    multiEntry: boolean;\n    count(key?: IDBKeyRange | IDBValidKey): IDBRequest;\n    get(key: IDBKeyRange | IDBValidKey): IDBRequest;\n    getKey(key: IDBKeyRange | IDBValidKey): IDBRequest;\n    openCursor(range?: IDBKeyRange | IDBValidKey, direction?: IDBCursorDirection): IDBRequest;\n    openKeyCursor(range?: IDBKeyRange | IDBValidKey, direction?: IDBCursorDirection): IDBRequest;\n}\n\ndeclare var IDBIndex: {\n    prototype: IDBIndex;\n    new(): IDBIndex;\n};\n\ninterface IDBKeyRange {\n    readonly lower: any;\n    readonly lowerOpen: boolean;\n    readonly upper: any;\n    readonly upperOpen: boolean;\n}\n\ndeclare var IDBKeyRange: {\n    prototype: IDBKeyRange;\n    new(): IDBKeyRange;\n    bound(lower: any, upper: any, lowerOpen?: boolean, upperOpen?: boolean): IDBKeyRange;\n    lowerBound(lower: any, open?: boolean): IDBKeyRange;\n    only(value: any): IDBKeyRange;\n    upperBound(upper: any, open?: boolean): IDBKeyRange;\n};\n\ninterface IDBObjectStore {\n    readonly indexNames: DOMStringList;\n    keyPath: string | string[];\n    readonly name: string;\n    readonly transaction: IDBTransaction;\n    autoIncrement: boolean;\n    add(value: any, key?: IDBKeyRange | IDBValidKey): IDBRequest;\n    clear(): IDBRequest;\n    count(key?: IDBKeyRange | IDBValidKey): IDBRequest;\n    createIndex(name: string, keyPath: string | string[], optionalParameters?: IDBIndexParameters): IDBIndex;\n    delete(key: IDBKeyRange | IDBValidKey): IDBRequest;\n    deleteIndex(indexName: string): void;\n    get(key: any): IDBRequest;\n    index(name: string): IDBIndex;\n    openCursor(range?: IDBKeyRange | IDBValidKey, direction?: IDBCursorDirection): IDBRequest;\n    put(value: any, key?: IDBKeyRange | IDBValidKey): IDBRequest;\n}\n\ndeclare var IDBObjectStore: {\n    prototype: IDBObjectStore;\n    new(): IDBObjectStore;\n};\n\ninterface IDBOpenDBRequestEventMap extends IDBRequestEventMap {\n    "blocked": Event;\n    "upgradeneeded": IDBVersionChangeEvent;\n}\n\ninterface IDBOpenDBRequest extends IDBRequest {\n    onblocked: (this: IDBOpenDBRequest, ev: Event) => any;\n    onupgradeneeded: (this: IDBOpenDBRequest, ev: IDBVersionChangeEvent) => any;\n    addEventListener<K extends keyof IDBOpenDBRequestEventMap>(type: K, listener: (this: IDBOpenDBRequest, ev: IDBOpenDBRequestEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var IDBOpenDBRequest: {\n    prototype: IDBOpenDBRequest;\n    new(): IDBOpenDBRequest;\n};\n\ninterface IDBRequestEventMap {\n    "error": Event;\n    "success": Event;\n}\n\ninterface IDBRequest extends EventTarget {\n    readonly error: DOMException;\n    onerror: (this: IDBRequest, ev: Event) => any;\n    onsuccess: (this: IDBRequest, ev: Event) => any;\n    readonly readyState: IDBRequestReadyState;\n    readonly result: any;\n    source: IDBObjectStore | IDBIndex | IDBCursor;\n    readonly transaction: IDBTransaction;\n    addEventListener<K extends keyof IDBRequestEventMap>(type: K, listener: (this: IDBRequest, ev: IDBRequestEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var IDBRequest: {\n    prototype: IDBRequest;\n    new(): IDBRequest;\n};\n\ninterface IDBTransactionEventMap {\n    "abort": Event;\n    "complete": Event;\n    "error": Event;\n}\n\ninterface IDBTransaction extends EventTarget {\n    readonly db: IDBDatabase;\n    readonly error: DOMException;\n    readonly mode: IDBTransactionMode;\n    onabort: (this: IDBTransaction, ev: Event) => any;\n    oncomplete: (this: IDBTransaction, ev: Event) => any;\n    onerror: (this: IDBTransaction, ev: Event) => any;\n    abort(): void;\n    objectStore(name: string): IDBObjectStore;\n    readonly READ_ONLY: string;\n    readonly READ_WRITE: string;\n    readonly VERSION_CHANGE: string;\n    addEventListener<K extends keyof IDBTransactionEventMap>(type: K, listener: (this: IDBTransaction, ev: IDBTransactionEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var IDBTransaction: {\n    prototype: IDBTransaction;\n    new(): IDBTransaction;\n    readonly READ_ONLY: string;\n    readonly READ_WRITE: string;\n    readonly VERSION_CHANGE: string;\n};\n\ninterface IDBVersionChangeEvent extends Event {\n    readonly newVersion: number | null;\n    readonly oldVersion: number;\n}\n\ndeclare var IDBVersionChangeEvent: {\n    prototype: IDBVersionChangeEvent;\n    new(): IDBVersionChangeEvent;\n};\n\ninterface IIRFilterNode extends AudioNode {\n    getFrequencyResponse(frequencyHz: Float32Array, magResponse: Float32Array, phaseResponse: Float32Array): void;\n}\n\ndeclare var IIRFilterNode: {\n    prototype: IIRFilterNode;\n    new(): IIRFilterNode;\n};\n\ninterface ImageData {\n    data: Uint8ClampedArray;\n    readonly height: number;\n    readonly width: number;\n}\n\ndeclare var ImageData: {\n    prototype: ImageData;\n    new(width: number, height: number): ImageData;\n    new(array: Uint8ClampedArray, width: number, height: number): ImageData;\n};\n\ninterface IntersectionObserver {\n    readonly root: Element | null;\n    readonly rootMargin: string;\n    readonly thresholds: number[];\n    disconnect(): void;\n    observe(target: Element): void;\n    takeRecords(): IntersectionObserverEntry[];\n    unobserve(target: Element): void;\n}\n\ndeclare var IntersectionObserver: {\n    prototype: IntersectionObserver;\n    new(callback: IntersectionObserverCallback, options?: IntersectionObserverInit): IntersectionObserver;\n};\n\ninterface IntersectionObserverEntry {\n    readonly boundingClientRect: ClientRect;\n    readonly intersectionRatio: number;\n    readonly intersectionRect: ClientRect;\n    readonly rootBounds: ClientRect;\n    readonly target: Element;\n    readonly time: number;\n}\n\ndeclare var IntersectionObserverEntry: {\n    prototype: IntersectionObserverEntry;\n    new(intersectionObserverEntryInit: IntersectionObserverEntryInit): IntersectionObserverEntry;\n};\n\ninterface KeyboardEvent extends UIEvent {\n    readonly altKey: boolean;\n    readonly char: string | null;\n    readonly charCode: number;\n    readonly ctrlKey: boolean;\n    readonly key: string;\n    readonly keyCode: number;\n    readonly locale: string;\n    readonly location: number;\n    readonly metaKey: boolean;\n    readonly repeat: boolean;\n    readonly shiftKey: boolean;\n    readonly which: number;\n    readonly code: string;\n    getModifierState(keyArg: string): boolean;\n    initKeyboardEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, keyArg: string, locationArg: number, modifiersListArg: string, repeat: boolean, locale: string): void;\n    readonly DOM_KEY_LOCATION_JOYSTICK: number;\n    readonly DOM_KEY_LOCATION_LEFT: number;\n    readonly DOM_KEY_LOCATION_MOBILE: number;\n    readonly DOM_KEY_LOCATION_NUMPAD: number;\n    readonly DOM_KEY_LOCATION_RIGHT: number;\n    readonly DOM_KEY_LOCATION_STANDARD: number;\n}\n\ndeclare var KeyboardEvent: {\n    prototype: KeyboardEvent;\n    new(typeArg: string, eventInitDict?: KeyboardEventInit): KeyboardEvent;\n    readonly DOM_KEY_LOCATION_JOYSTICK: number;\n    readonly DOM_KEY_LOCATION_LEFT: number;\n    readonly DOM_KEY_LOCATION_MOBILE: number;\n    readonly DOM_KEY_LOCATION_NUMPAD: number;\n    readonly DOM_KEY_LOCATION_RIGHT: number;\n    readonly DOM_KEY_LOCATION_STANDARD: number;\n};\n\ninterface ListeningStateChangedEvent extends Event {\n    readonly label: string;\n    readonly state: ListeningState;\n}\n\ndeclare var ListeningStateChangedEvent: {\n    prototype: ListeningStateChangedEvent;\n    new(): ListeningStateChangedEvent;\n};\n\ninterface Location {\n    hash: string;\n    host: string;\n    hostname: string;\n    href: string;\n    readonly origin: string;\n    pathname: string;\n    port: string;\n    protocol: string;\n    search: string;\n    assign(url: string): void;\n    reload(forcedReload?: boolean): void;\n    replace(url: string): void;\n    toString(): string;\n}\n\ndeclare var Location: {\n    prototype: Location;\n    new(): Location;\n};\n\ninterface LongRunningScriptDetectedEvent extends Event {\n    readonly executionTime: number;\n    stopPageScriptExecution: boolean;\n}\n\ndeclare var LongRunningScriptDetectedEvent: {\n    prototype: LongRunningScriptDetectedEvent;\n    new(): LongRunningScriptDetectedEvent;\n};\n\ninterface MediaDeviceInfo {\n    readonly deviceId: string;\n    readonly groupId: string;\n    readonly kind: MediaDeviceKind;\n    readonly label: string;\n}\n\ndeclare var MediaDeviceInfo: {\n    prototype: MediaDeviceInfo;\n    new(): MediaDeviceInfo;\n};\n\ninterface MediaDevicesEventMap {\n    "devicechange": Event;\n}\n\ninterface MediaDevices extends EventTarget {\n    ondevicechange: (this: MediaDevices, ev: Event) => any;\n    enumerateDevices(): any;\n    getSupportedConstraints(): MediaTrackSupportedConstraints;\n    getUserMedia(constraints: MediaStreamConstraints): Promise<MediaStream>;\n    addEventListener<K extends keyof MediaDevicesEventMap>(type: K, listener: (this: MediaDevices, ev: MediaDevicesEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var MediaDevices: {\n    prototype: MediaDevices;\n    new(): MediaDevices;\n};\n\ninterface MediaElementAudioSourceNode extends AudioNode {\n}\n\ndeclare var MediaElementAudioSourceNode: {\n    prototype: MediaElementAudioSourceNode;\n    new(): MediaElementAudioSourceNode;\n};\n\ninterface MediaEncryptedEvent extends Event {\n    readonly initData: ArrayBuffer | null;\n    readonly initDataType: string;\n}\n\ndeclare var MediaEncryptedEvent: {\n    prototype: MediaEncryptedEvent;\n    new(type: string, eventInitDict?: MediaEncryptedEventInit): MediaEncryptedEvent;\n};\n\ninterface MediaError {\n    readonly code: number;\n    readonly msExtendedCode: number;\n    readonly MEDIA_ERR_ABORTED: number;\n    readonly MEDIA_ERR_DECODE: number;\n    readonly MEDIA_ERR_NETWORK: number;\n    readonly MEDIA_ERR_SRC_NOT_SUPPORTED: number;\n    readonly MS_MEDIA_ERR_ENCRYPTED: number;\n}\n\ndeclare var MediaError: {\n    prototype: MediaError;\n    new(): MediaError;\n    readonly MEDIA_ERR_ABORTED: number;\n    readonly MEDIA_ERR_DECODE: number;\n    readonly MEDIA_ERR_NETWORK: number;\n    readonly MEDIA_ERR_SRC_NOT_SUPPORTED: number;\n    readonly MS_MEDIA_ERR_ENCRYPTED: number;\n};\n\ninterface MediaKeyMessageEvent extends Event {\n    readonly message: ArrayBuffer;\n    readonly messageType: MediaKeyMessageType;\n}\n\ndeclare var MediaKeyMessageEvent: {\n    prototype: MediaKeyMessageEvent;\n    new(type: string, eventInitDict?: MediaKeyMessageEventInit): MediaKeyMessageEvent;\n};\n\ninterface MediaKeys {\n    createSession(sessionType?: MediaKeySessionType): MediaKeySession;\n    setServerCertificate(serverCertificate: any): Promise<void>;\n}\n\ndeclare var MediaKeys: {\n    prototype: MediaKeys;\n    new(): MediaKeys;\n};\n\ninterface MediaKeySession extends EventTarget {\n    readonly closed: Promise<void>;\n    readonly expiration: number;\n    readonly keyStatuses: MediaKeyStatusMap;\n    readonly sessionId: string;\n    close(): Promise<void>;\n    generateRequest(initDataType: string, initData: any): Promise<void>;\n    load(sessionId: string): Promise<boolean>;\n    remove(): Promise<void>;\n    update(response: any): Promise<void>;\n}\n\ndeclare var MediaKeySession: {\n    prototype: MediaKeySession;\n    new(): MediaKeySession;\n};\n\ninterface MediaKeyStatusMap {\n    readonly size: number;\n    forEach(callback: ForEachCallback): void;\n    get(keyId: any): MediaKeyStatus;\n    has(keyId: any): boolean;\n}\n\ndeclare var MediaKeyStatusMap: {\n    prototype: MediaKeyStatusMap;\n    new(): MediaKeyStatusMap;\n};\n\ninterface MediaKeySystemAccess {\n    readonly keySystem: string;\n    createMediaKeys(): Promise<MediaKeys>;\n    getConfiguration(): MediaKeySystemConfiguration;\n}\n\ndeclare var MediaKeySystemAccess: {\n    prototype: MediaKeySystemAccess;\n    new(): MediaKeySystemAccess;\n};\n\ninterface MediaList {\n    readonly length: number;\n    mediaText: string;\n    appendMedium(newMedium: string): void;\n    deleteMedium(oldMedium: string): void;\n    item(index: number): string;\n    toString(): string;\n    [index: number]: string;\n}\n\ndeclare var MediaList: {\n    prototype: MediaList;\n    new(): MediaList;\n};\n\ninterface MediaQueryList {\n    readonly matches: boolean;\n    readonly media: string;\n    addListener(listener: MediaQueryListListener): void;\n    removeListener(listener: MediaQueryListListener): void;\n}\n\ndeclare var MediaQueryList: {\n    prototype: MediaQueryList;\n    new(): MediaQueryList;\n};\n\ninterface MediaSource extends EventTarget {\n    readonly activeSourceBuffers: SourceBufferList;\n    duration: number;\n    readonly readyState: string;\n    readonly sourceBuffers: SourceBufferList;\n    addSourceBuffer(type: string): SourceBuffer;\n    endOfStream(error?: number): void;\n    removeSourceBuffer(sourceBuffer: SourceBuffer): void;\n}\n\ndeclare var MediaSource: {\n    prototype: MediaSource;\n    new(): MediaSource;\n    isTypeSupported(type: string): boolean;\n};\n\ninterface MediaStreamEventMap {\n    "active": Event;\n    "addtrack": MediaStreamTrackEvent;\n    "inactive": Event;\n    "removetrack": MediaStreamTrackEvent;\n}\n\ninterface MediaStream extends EventTarget {\n    readonly active: boolean;\n    readonly id: string;\n    onactive: (this: MediaStream, ev: Event) => any;\n    onaddtrack: (this: MediaStream, ev: MediaStreamTrackEvent) => any;\n    oninactive: (this: MediaStream, ev: Event) => any;\n    onremovetrack: (this: MediaStream, ev: MediaStreamTrackEvent) => any;\n    addTrack(track: MediaStreamTrack): void;\n    clone(): MediaStream;\n    getAudioTracks(): MediaStreamTrack[];\n    getTrackById(trackId: string): MediaStreamTrack | null;\n    getTracks(): MediaStreamTrack[];\n    getVideoTracks(): MediaStreamTrack[];\n    removeTrack(track: MediaStreamTrack): void;\n    stop(): void;\n    addEventListener<K extends keyof MediaStreamEventMap>(type: K, listener: (this: MediaStream, ev: MediaStreamEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var MediaStream: {\n    prototype: MediaStream;\n    new(streamOrTracks?: MediaStream | MediaStreamTrack[]): MediaStream;\n};\n\ninterface MediaStreamAudioSourceNode extends AudioNode {\n}\n\ndeclare var MediaStreamAudioSourceNode: {\n    prototype: MediaStreamAudioSourceNode;\n    new(): MediaStreamAudioSourceNode;\n};\n\ninterface MediaStreamError {\n    readonly constraintName: string | null;\n    readonly message: string | null;\n    readonly name: string;\n}\n\ndeclare var MediaStreamError: {\n    prototype: MediaStreamError;\n    new(): MediaStreamError;\n};\n\ninterface MediaStreamErrorEvent extends Event {\n    readonly error: MediaStreamError | null;\n}\n\ndeclare var MediaStreamErrorEvent: {\n    prototype: MediaStreamErrorEvent;\n    new(typeArg: string, eventInitDict?: MediaStreamErrorEventInit): MediaStreamErrorEvent;\n};\n\ninterface MediaStreamEvent extends Event {\n    readonly stream: MediaStream | null;\n}\n\ndeclare var MediaStreamEvent: {\n    prototype: MediaStreamEvent;\n    new(type: string, eventInitDict: MediaStreamEventInit): MediaStreamEvent;\n};\n\ninterface MediaStreamTrackEventMap {\n    "ended": MediaStreamErrorEvent;\n    "mute": Event;\n    "overconstrained": MediaStreamErrorEvent;\n    "unmute": Event;\n}\n\ninterface MediaStreamTrack extends EventTarget {\n    enabled: boolean;\n    readonly id: string;\n    readonly kind: string;\n    readonly label: string;\n    readonly muted: boolean;\n    onended: (this: MediaStreamTrack, ev: MediaStreamErrorEvent) => any;\n    onmute: (this: MediaStreamTrack, ev: Event) => any;\n    onoverconstrained: (this: MediaStreamTrack, ev: MediaStreamErrorEvent) => any;\n    onunmute: (this: MediaStreamTrack, ev: Event) => any;\n    readonly readonly: boolean;\n    readonly readyState: MediaStreamTrackState;\n    readonly remote: boolean;\n    applyConstraints(constraints: MediaTrackConstraints): Promise<void>;\n    clone(): MediaStreamTrack;\n    getCapabilities(): MediaTrackCapabilities;\n    getConstraints(): MediaTrackConstraints;\n    getSettings(): MediaTrackSettings;\n    stop(): void;\n    addEventListener<K extends keyof MediaStreamTrackEventMap>(type: K, listener: (this: MediaStreamTrack, ev: MediaStreamTrackEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var MediaStreamTrack: {\n    prototype: MediaStreamTrack;\n    new(): MediaStreamTrack;\n};\n\ninterface MediaStreamTrackEvent extends Event {\n    readonly track: MediaStreamTrack;\n}\n\ndeclare var MediaStreamTrackEvent: {\n    prototype: MediaStreamTrackEvent;\n    new(typeArg: string, eventInitDict?: MediaStreamTrackEventInit): MediaStreamTrackEvent;\n};\n\ninterface MessageChannel {\n    readonly port1: MessagePort;\n    readonly port2: MessagePort;\n}\n\ndeclare var MessageChannel: {\n    prototype: MessageChannel;\n    new(): MessageChannel;\n};\n\ninterface MessageEvent extends Event {\n    readonly data: any;\n    readonly origin: string;\n    readonly ports: any;\n    readonly source: Window;\n    initMessageEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, dataArg: any, originArg: string, lastEventIdArg: string, sourceArg: Window): void;\n}\n\ndeclare var MessageEvent: {\n    prototype: MessageEvent;\n    new(type: string, eventInitDict?: MessageEventInit): MessageEvent;\n};\n\ninterface MessagePortEventMap {\n    "message": MessageEvent;\n}\n\ninterface MessagePort extends EventTarget {\n    onmessage: (this: MessagePort, ev: MessageEvent) => any;\n    close(): void;\n    postMessage(message?: any, transfer?: any[]): void;\n    start(): void;\n    addEventListener<K extends keyof MessagePortEventMap>(type: K, listener: (this: MessagePort, ev: MessagePortEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var MessagePort: {\n    prototype: MessagePort;\n    new(): MessagePort;\n};\n\ninterface MimeType {\n    readonly description: string;\n    readonly enabledPlugin: Plugin;\n    readonly suffixes: string;\n    readonly type: string;\n}\n\ndeclare var MimeType: {\n    prototype: MimeType;\n    new(): MimeType;\n};\n\ninterface MimeTypeArray {\n    readonly length: number;\n    item(index: number): Plugin;\n    namedItem(type: string): Plugin;\n    [index: number]: Plugin;\n}\n\ndeclare var MimeTypeArray: {\n    prototype: MimeTypeArray;\n    new(): MimeTypeArray;\n};\n\ninterface MouseEvent extends UIEvent {\n    readonly altKey: boolean;\n    readonly button: number;\n    readonly buttons: number;\n    readonly clientX: number;\n    readonly clientY: number;\n    readonly ctrlKey: boolean;\n    readonly fromElement: Element;\n    readonly layerX: number;\n    readonly layerY: number;\n    readonly metaKey: boolean;\n    readonly movementX: number;\n    readonly movementY: number;\n    readonly offsetX: number;\n    readonly offsetY: number;\n    readonly pageX: number;\n    readonly pageY: number;\n    readonly relatedTarget: EventTarget;\n    readonly screenX: number;\n    readonly screenY: number;\n    readonly shiftKey: boolean;\n    readonly toElement: Element;\n    readonly which: number;\n    readonly x: number;\n    readonly y: number;\n    getModifierState(keyArg: string): boolean;\n    initMouseEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, ctrlKeyArg: boolean, altKeyArg: boolean, shiftKeyArg: boolean, metaKeyArg: boolean, buttonArg: number, relatedTargetArg: EventTarget | null): void;\n}\n\ndeclare var MouseEvent: {\n    prototype: MouseEvent;\n    new(typeArg: string, eventInitDict?: MouseEventInit): MouseEvent;\n};\n\ninterface MSApp {\n    clearTemporaryWebDataAsync(): MSAppAsyncOperation;\n    createBlobFromRandomAccessStream(type: string, seeker: any): Blob;\n    createDataPackage(object: any): any;\n    createDataPackageFromSelection(): any;\n    createFileFromStorageFile(storageFile: any): File;\n    createStreamFromInputStream(type: string, inputStream: any): MSStream;\n    execAsyncAtPriority(asynchronousCallback: MSExecAtPriorityFunctionCallback, priority: string, ...args: any[]): void;\n    execAtPriority(synchronousCallback: MSExecAtPriorityFunctionCallback, priority: string, ...args: any[]): any;\n    getCurrentPriority(): string;\n    getHtmlPrintDocumentSourceAsync(htmlDoc: any): Promise<any>;\n    getViewId(view: any): any;\n    isTaskScheduledAtPriorityOrHigher(priority: string): boolean;\n    pageHandlesAllApplicationActivations(enabled: boolean): void;\n    suppressSubdownloadCredentialPrompts(suppress: boolean): void;\n    terminateApp(exceptionObject: any): void;\n    readonly CURRENT: string;\n    readonly HIGH: string;\n    readonly IDLE: string;\n    readonly NORMAL: string;\n}\ndeclare var MSApp: MSApp;\n\ninterface MSAppAsyncOperationEventMap {\n    "complete": Event;\n    "error": Event;\n}\n\ninterface MSAppAsyncOperation extends EventTarget {\n    readonly error: DOMError;\n    oncomplete: (this: MSAppAsyncOperation, ev: Event) => any;\n    onerror: (this: MSAppAsyncOperation, ev: Event) => any;\n    readonly readyState: number;\n    readonly result: any;\n    start(): void;\n    readonly COMPLETED: number;\n    readonly ERROR: number;\n    readonly STARTED: number;\n    addEventListener<K extends keyof MSAppAsyncOperationEventMap>(type: K, listener: (this: MSAppAsyncOperation, ev: MSAppAsyncOperationEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var MSAppAsyncOperation: {\n    prototype: MSAppAsyncOperation;\n    new(): MSAppAsyncOperation;\n    readonly COMPLETED: number;\n    readonly ERROR: number;\n    readonly STARTED: number;\n};\n\ninterface MSAssertion {\n    readonly id: string;\n    readonly type: MSCredentialType;\n}\n\ndeclare var MSAssertion: {\n    prototype: MSAssertion;\n    new(): MSAssertion;\n};\n\ninterface MSBlobBuilder {\n    append(data: any, endings?: string): void;\n    getBlob(contentType?: string): Blob;\n}\n\ndeclare var MSBlobBuilder: {\n    prototype: MSBlobBuilder;\n    new(): MSBlobBuilder;\n};\n\ninterface MSCredentials {\n    getAssertion(challenge: string, filter?: MSCredentialFilter, params?: MSSignatureParameters): Promise<MSAssertion>;\n    makeCredential(accountInfo: MSAccountInfo, params: MSCredentialParameters[], challenge?: string): Promise<MSAssertion>;\n}\n\ndeclare var MSCredentials: {\n    prototype: MSCredentials;\n    new(): MSCredentials;\n};\n\ninterface MSFIDOCredentialAssertion extends MSAssertion {\n    readonly algorithm: string | Algorithm;\n    readonly attestation: any;\n    readonly publicKey: string;\n    readonly transportHints: MSTransportType[];\n}\n\ndeclare var MSFIDOCredentialAssertion: {\n    prototype: MSFIDOCredentialAssertion;\n    new(): MSFIDOCredentialAssertion;\n};\n\ninterface MSFIDOSignature {\n    readonly authnrData: string;\n    readonly clientData: string;\n    readonly signature: string;\n}\n\ndeclare var MSFIDOSignature: {\n    prototype: MSFIDOSignature;\n    new(): MSFIDOSignature;\n};\n\ninterface MSFIDOSignatureAssertion extends MSAssertion {\n    readonly signature: MSFIDOSignature;\n}\n\ndeclare var MSFIDOSignatureAssertion: {\n    prototype: MSFIDOSignatureAssertion;\n    new(): MSFIDOSignatureAssertion;\n};\n\ninterface MSGesture {\n    target: Element;\n    addPointer(pointerId: number): void;\n    stop(): void;\n}\n\ndeclare var MSGesture: {\n    prototype: MSGesture;\n    new(): MSGesture;\n};\n\ninterface MSGestureEvent extends UIEvent {\n    readonly clientX: number;\n    readonly clientY: number;\n    readonly expansion: number;\n    readonly gestureObject: any;\n    readonly hwTimestamp: number;\n    readonly offsetX: number;\n    readonly offsetY: number;\n    readonly rotation: number;\n    readonly scale: number;\n    readonly screenX: number;\n    readonly screenY: number;\n    readonly translationX: number;\n    readonly translationY: number;\n    readonly velocityAngular: number;\n    readonly velocityExpansion: number;\n    readonly velocityX: number;\n    readonly velocityY: number;\n    initGestureEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, offsetXArg: number, offsetYArg: number, translationXArg: number, translationYArg: number, scaleArg: number, expansionArg: number, rotationArg: number, velocityXArg: number, velocityYArg: number, velocityExpansionArg: number, velocityAngularArg: number, hwTimestampArg: number): void;\n    readonly MSGESTURE_FLAG_BEGIN: number;\n    readonly MSGESTURE_FLAG_CANCEL: number;\n    readonly MSGESTURE_FLAG_END: number;\n    readonly MSGESTURE_FLAG_INERTIA: number;\n    readonly MSGESTURE_FLAG_NONE: number;\n}\n\ndeclare var MSGestureEvent: {\n    prototype: MSGestureEvent;\n    new(): MSGestureEvent;\n    readonly MSGESTURE_FLAG_BEGIN: number;\n    readonly MSGESTURE_FLAG_CANCEL: number;\n    readonly MSGESTURE_FLAG_END: number;\n    readonly MSGESTURE_FLAG_INERTIA: number;\n    readonly MSGESTURE_FLAG_NONE: number;\n};\n\ninterface MSGraphicsTrust {\n    readonly constrictionActive: boolean;\n    readonly status: string;\n}\n\ndeclare var MSGraphicsTrust: {\n    prototype: MSGraphicsTrust;\n    new(): MSGraphicsTrust;\n};\n\ninterface MSHTMLWebViewElement extends HTMLElement {\n    readonly canGoBack: boolean;\n    readonly canGoForward: boolean;\n    readonly containsFullScreenElement: boolean;\n    readonly documentTitle: string;\n    height: number;\n    readonly settings: MSWebViewSettings;\n    src: string;\n    width: number;\n    addWebAllowedObject(name: string, applicationObject: any): void;\n    buildLocalStreamUri(contentIdentifier: string, relativePath: string): string;\n    capturePreviewToBlobAsync(): MSWebViewAsyncOperation;\n    captureSelectedContentToDataPackageAsync(): MSWebViewAsyncOperation;\n    getDeferredPermissionRequestById(id: number): DeferredPermissionRequest;\n    getDeferredPermissionRequests(): DeferredPermissionRequest[];\n    goBack(): void;\n    goForward(): void;\n    invokeScriptAsync(scriptName: string, ...args: any[]): MSWebViewAsyncOperation;\n    navigate(uri: string): void;\n    navigateFocus(navigationReason: NavigationReason, origin: FocusNavigationOrigin): void;\n    navigateToLocalStreamUri(source: string, streamResolver: any): void;\n    navigateToString(contents: string): void;\n    navigateWithHttpRequestMessage(requestMessage: any): void;\n    refresh(): void;\n    stop(): void;\n    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: MSHTMLWebViewElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var MSHTMLWebViewElement: {\n    prototype: MSHTMLWebViewElement;\n    new(): MSHTMLWebViewElement;\n};\n\ninterface MSInputMethodContextEventMap {\n    "MSCandidateWindowHide": Event;\n    "MSCandidateWindowShow": Event;\n    "MSCandidateWindowUpdate": Event;\n}\n\ninterface MSInputMethodContext extends EventTarget {\n    readonly compositionEndOffset: number;\n    readonly compositionStartOffset: number;\n    oncandidatewindowhide: (this: MSInputMethodContext, ev: Event) => any;\n    oncandidatewindowshow: (this: MSInputMethodContext, ev: Event) => any;\n    oncandidatewindowupdate: (this: MSInputMethodContext, ev: Event) => any;\n    readonly target: HTMLElement;\n    getCandidateWindowClientRect(): ClientRect;\n    getCompositionAlternatives(): string[];\n    hasComposition(): boolean;\n    isCandidateWindowVisible(): boolean;\n    addEventListener<K extends keyof MSInputMethodContextEventMap>(type: K, listener: (this: MSInputMethodContext, ev: MSInputMethodContextEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var MSInputMethodContext: {\n    prototype: MSInputMethodContext;\n    new(): MSInputMethodContext;\n};\n\ninterface MSManipulationEvent extends UIEvent {\n    readonly currentState: number;\n    readonly inertiaDestinationX: number;\n    readonly inertiaDestinationY: number;\n    readonly lastState: number;\n    initMSManipulationEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, lastState: number, currentState: number): void;\n    readonly MS_MANIPULATION_STATE_ACTIVE: number;\n    readonly MS_MANIPULATION_STATE_CANCELLED: number;\n    readonly MS_MANIPULATION_STATE_COMMITTED: number;\n    readonly MS_MANIPULATION_STATE_DRAGGING: number;\n    readonly MS_MANIPULATION_STATE_INERTIA: number;\n    readonly MS_MANIPULATION_STATE_PRESELECT: number;\n    readonly MS_MANIPULATION_STATE_SELECTING: number;\n    readonly MS_MANIPULATION_STATE_STOPPED: number;\n}\n\ndeclare var MSManipulationEvent: {\n    prototype: MSManipulationEvent;\n    new(): MSManipulationEvent;\n    readonly MS_MANIPULATION_STATE_ACTIVE: number;\n    readonly MS_MANIPULATION_STATE_CANCELLED: number;\n    readonly MS_MANIPULATION_STATE_COMMITTED: number;\n    readonly MS_MANIPULATION_STATE_DRAGGING: number;\n    readonly MS_MANIPULATION_STATE_INERTIA: number;\n    readonly MS_MANIPULATION_STATE_PRESELECT: number;\n    readonly MS_MANIPULATION_STATE_SELECTING: number;\n    readonly MS_MANIPULATION_STATE_STOPPED: number;\n};\n\ninterface MSMediaKeyError {\n    readonly code: number;\n    readonly systemCode: number;\n    readonly MS_MEDIA_KEYERR_CLIENT: number;\n    readonly MS_MEDIA_KEYERR_DOMAIN: number;\n    readonly MS_MEDIA_KEYERR_HARDWARECHANGE: number;\n    readonly MS_MEDIA_KEYERR_OUTPUT: number;\n    readonly MS_MEDIA_KEYERR_SERVICE: number;\n    readonly MS_MEDIA_KEYERR_UNKNOWN: number;\n}\n\ndeclare var MSMediaKeyError: {\n    prototype: MSMediaKeyError;\n    new(): MSMediaKeyError;\n    readonly MS_MEDIA_KEYERR_CLIENT: number;\n    readonly MS_MEDIA_KEYERR_DOMAIN: number;\n    readonly MS_MEDIA_KEYERR_HARDWARECHANGE: number;\n    readonly MS_MEDIA_KEYERR_OUTPUT: number;\n    readonly MS_MEDIA_KEYERR_SERVICE: number;\n    readonly MS_MEDIA_KEYERR_UNKNOWN: number;\n};\n\ninterface MSMediaKeyMessageEvent extends Event {\n    readonly destinationURL: string | null;\n    readonly message: Uint8Array;\n}\n\ndeclare var MSMediaKeyMessageEvent: {\n    prototype: MSMediaKeyMessageEvent;\n    new(): MSMediaKeyMessageEvent;\n};\n\ninterface MSMediaKeyNeededEvent extends Event {\n    readonly initData: Uint8Array | null;\n}\n\ndeclare var MSMediaKeyNeededEvent: {\n    prototype: MSMediaKeyNeededEvent;\n    new(): MSMediaKeyNeededEvent;\n};\n\ninterface MSMediaKeys {\n    readonly keySystem: string;\n    createSession(type: string, initData: Uint8Array, cdmData?: Uint8Array): MSMediaKeySession;\n}\n\ndeclare var MSMediaKeys: {\n    prototype: MSMediaKeys;\n    new(keySystem: string): MSMediaKeys;\n    isTypeSupported(keySystem: string, type?: string): boolean;\n    isTypeSupportedWithFeatures(keySystem: string, type?: string): string;\n};\n\ninterface MSMediaKeySession extends EventTarget {\n    readonly error: MSMediaKeyError | null;\n    readonly keySystem: string;\n    readonly sessionId: string;\n    close(): void;\n    update(key: Uint8Array): void;\n}\n\ndeclare var MSMediaKeySession: {\n    prototype: MSMediaKeySession;\n    new(): MSMediaKeySession;\n};\n\ninterface MSPointerEvent extends MouseEvent {\n    readonly currentPoint: any;\n    readonly height: number;\n    readonly hwTimestamp: number;\n    readonly intermediatePoints: any;\n    readonly isPrimary: boolean;\n    readonly pointerId: number;\n    readonly pointerType: any;\n    readonly pressure: number;\n    readonly rotation: number;\n    readonly tiltX: number;\n    readonly tiltY: number;\n    readonly width: number;\n    getCurrentPoint(element: Element): void;\n    getIntermediatePoints(element: Element): void;\n    initPointerEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, ctrlKeyArg: boolean, altKeyArg: boolean, shiftKeyArg: boolean, metaKeyArg: boolean, buttonArg: number, relatedTargetArg: EventTarget, offsetXArg: number, offsetYArg: number, widthArg: number, heightArg: number, pressure: number, rotation: number, tiltX: number, tiltY: number, pointerIdArg: number, pointerType: any, hwTimestampArg: number, isPrimary: boolean): void;\n}\n\ndeclare var MSPointerEvent: {\n    prototype: MSPointerEvent;\n    new(typeArg: string, eventInitDict?: PointerEventInit): MSPointerEvent;\n};\n\ninterface MSRangeCollection {\n    readonly length: number;\n    item(index: number): Range;\n    [index: number]: Range;\n}\n\ndeclare var MSRangeCollection: {\n    prototype: MSRangeCollection;\n    new(): MSRangeCollection;\n};\n\ninterface MSSiteModeEvent extends Event {\n    readonly actionURL: string;\n    readonly buttonID: number;\n}\n\ndeclare var MSSiteModeEvent: {\n    prototype: MSSiteModeEvent;\n    new(): MSSiteModeEvent;\n};\n\ninterface MSStream {\n    readonly type: string;\n    msClose(): void;\n    msDetachStream(): any;\n}\n\ndeclare var MSStream: {\n    prototype: MSStream;\n    new(): MSStream;\n};\n\ninterface MSStreamReader extends EventTarget, MSBaseReader {\n    readonly error: DOMError;\n    readAsArrayBuffer(stream: MSStream, size?: number): void;\n    readAsBinaryString(stream: MSStream, size?: number): void;\n    readAsBlob(stream: MSStream, size?: number): void;\n    readAsDataURL(stream: MSStream, size?: number): void;\n    readAsText(stream: MSStream, encoding?: string, size?: number): void;\n    addEventListener<K extends keyof MSBaseReaderEventMap>(type: K, listener: (this: MSStreamReader, ev: MSBaseReaderEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var MSStreamReader: {\n    prototype: MSStreamReader;\n    new(): MSStreamReader;\n};\n\ninterface MSWebViewAsyncOperationEventMap {\n    "complete": Event;\n    "error": Event;\n}\n\ninterface MSWebViewAsyncOperation extends EventTarget {\n    readonly error: DOMError;\n    oncomplete: (this: MSWebViewAsyncOperation, ev: Event) => any;\n    onerror: (this: MSWebViewAsyncOperation, ev: Event) => any;\n    readonly readyState: number;\n    readonly result: any;\n    readonly target: MSHTMLWebViewElement;\n    readonly type: number;\n    start(): void;\n    readonly COMPLETED: number;\n    readonly ERROR: number;\n    readonly STARTED: number;\n    readonly TYPE_CAPTURE_PREVIEW_TO_RANDOM_ACCESS_STREAM: number;\n    readonly TYPE_CREATE_DATA_PACKAGE_FROM_SELECTION: number;\n    readonly TYPE_INVOKE_SCRIPT: number;\n    addEventListener<K extends keyof MSWebViewAsyncOperationEventMap>(type: K, listener: (this: MSWebViewAsyncOperation, ev: MSWebViewAsyncOperationEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var MSWebViewAsyncOperation: {\n    prototype: MSWebViewAsyncOperation;\n    new(): MSWebViewAsyncOperation;\n    readonly COMPLETED: number;\n    readonly ERROR: number;\n    readonly STARTED: number;\n    readonly TYPE_CAPTURE_PREVIEW_TO_RANDOM_ACCESS_STREAM: number;\n    readonly TYPE_CREATE_DATA_PACKAGE_FROM_SELECTION: number;\n    readonly TYPE_INVOKE_SCRIPT: number;\n};\n\ninterface MSWebViewSettings {\n    isIndexedDBEnabled: boolean;\n    isJavaScriptEnabled: boolean;\n}\n\ndeclare var MSWebViewSettings: {\n    prototype: MSWebViewSettings;\n    new(): MSWebViewSettings;\n};\n\ninterface MutationEvent extends Event {\n    readonly attrChange: number;\n    readonly attrName: string;\n    readonly newValue: string;\n    readonly prevValue: string;\n    readonly relatedNode: Node;\n    initMutationEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, relatedNodeArg: Node, prevValueArg: string, newValueArg: string, attrNameArg: string, attrChangeArg: number): void;\n    readonly ADDITION: number;\n    readonly MODIFICATION: number;\n    readonly REMOVAL: number;\n}\n\ndeclare var MutationEvent: {\n    prototype: MutationEvent;\n    new(): MutationEvent;\n    readonly ADDITION: number;\n    readonly MODIFICATION: number;\n    readonly REMOVAL: number;\n};\n\ninterface MutationObserver {\n    disconnect(): void;\n    observe(target: Node, options: MutationObserverInit): void;\n    takeRecords(): MutationRecord[];\n}\n\ndeclare var MutationObserver: {\n    prototype: MutationObserver;\n    new(callback: MutationCallback): MutationObserver;\n};\n\ninterface MutationRecord {\n    readonly addedNodes: NodeList;\n    readonly attributeName: string | null;\n    readonly attributeNamespace: string | null;\n    readonly nextSibling: Node | null;\n    readonly oldValue: string | null;\n    readonly previousSibling: Node | null;\n    readonly removedNodes: NodeList;\n    readonly target: Node;\n    readonly type: string;\n}\n\ndeclare var MutationRecord: {\n    prototype: MutationRecord;\n    new(): MutationRecord;\n};\n\ninterface NamedNodeMap {\n    readonly length: number;\n    getNamedItem(name: string): Attr;\n    getNamedItemNS(namespaceURI: string | null, localName: string | null): Attr;\n    item(index: number): Attr;\n    removeNamedItem(name: string): Attr;\n    removeNamedItemNS(namespaceURI: string | null, localName: string | null): Attr;\n    setNamedItem(arg: Attr): Attr;\n    setNamedItemNS(arg: Attr): Attr;\n    [index: number]: Attr;\n}\n\ndeclare var NamedNodeMap: {\n    prototype: NamedNodeMap;\n    new(): NamedNodeMap;\n};\n\ninterface NavigationCompletedEvent extends NavigationEvent {\n    readonly isSuccess: boolean;\n    readonly webErrorStatus: number;\n}\n\ndeclare var NavigationCompletedEvent: {\n    prototype: NavigationCompletedEvent;\n    new(): NavigationCompletedEvent;\n};\n\ninterface NavigationEvent extends Event {\n    readonly uri: string;\n}\n\ndeclare var NavigationEvent: {\n    prototype: NavigationEvent;\n    new(): NavigationEvent;\n};\n\ninterface NavigationEventWithReferrer extends NavigationEvent {\n    readonly referer: string;\n}\n\ndeclare var NavigationEventWithReferrer: {\n    prototype: NavigationEventWithReferrer;\n    new(): NavigationEventWithReferrer;\n};\n\ninterface Navigator extends Object, NavigatorID, NavigatorOnLine, NavigatorContentUtils, NavigatorStorageUtils, NavigatorGeolocation, MSNavigatorDoNotTrack, MSFileSaver, NavigatorBeacon, NavigatorConcurrentHardware, NavigatorUserMedia {\n    readonly authentication: WebAuthentication;\n    readonly cookieEnabled: boolean;\n    gamepadInputEmulation: GamepadInputEmulationType;\n    readonly language: string;\n    readonly maxTouchPoints: number;\n    readonly mimeTypes: MimeTypeArray;\n    readonly msManipulationViewsEnabled: boolean;\n    readonly msMaxTouchPoints: number;\n    readonly msPointerEnabled: boolean;\n    readonly plugins: PluginArray;\n    readonly pointerEnabled: boolean;\n    readonly serviceWorker: ServiceWorkerContainer;\n    readonly webdriver: boolean;\n    readonly hardwareConcurrency: number;\n    readonly languages: string[];\n    getGamepads(): Gamepad[];\n    javaEnabled(): boolean;\n    msLaunchUri(uri: string, successCallback?: MSLaunchUriCallback, noHandlerCallback?: MSLaunchUriCallback): void;\n    requestMediaKeySystemAccess(keySystem: string, supportedConfigurations: MediaKeySystemConfiguration[]): Promise<MediaKeySystemAccess>;\n    vibrate(pattern: number | number[]): boolean;\n}\n\ndeclare var Navigator: {\n    prototype: Navigator;\n    new(): Navigator;\n};\n\ninterface Node extends EventTarget {\n    readonly attributes: NamedNodeMap;\n    readonly baseURI: string | null;\n    readonly childNodes: NodeList;\n    readonly firstChild: Node | null;\n    readonly lastChild: Node | null;\n    readonly localName: string | null;\n    readonly namespaceURI: string | null;\n    readonly nextSibling: Node | null;\n    readonly nodeName: string;\n    readonly nodeType: number;\n    nodeValue: string | null;\n    readonly ownerDocument: Document;\n    readonly parentElement: HTMLElement | null;\n    readonly parentNode: Node | null;\n    readonly previousSibling: Node | null;\n    textContent: string | null;\n    appendChild<T extends Node>(newChild: T): T;\n    cloneNode(deep?: boolean): Node;\n    compareDocumentPosition(other: Node): number;\n    contains(child: Node): boolean;\n    hasAttributes(): boolean;\n    hasChildNodes(): boolean;\n    insertBefore<T extends Node>(newChild: T, refChild: Node | null): T;\n    isDefaultNamespace(namespaceURI: string | null): boolean;\n    isEqualNode(arg: Node): boolean;\n    isSameNode(other: Node): boolean;\n    lookupNamespaceURI(prefix: string | null): string | null;\n    lookupPrefix(namespaceURI: string | null): string | null;\n    normalize(): void;\n    removeChild<T extends Node>(oldChild: T): T;\n    replaceChild<T extends Node>(newChild: Node, oldChild: T): T;\n    readonly ATTRIBUTE_NODE: number;\n    readonly CDATA_SECTION_NODE: number;\n    readonly COMMENT_NODE: number;\n    readonly DOCUMENT_FRAGMENT_NODE: number;\n    readonly DOCUMENT_NODE: number;\n    readonly DOCUMENT_POSITION_CONTAINED_BY: number;\n    readonly DOCUMENT_POSITION_CONTAINS: number;\n    readonly DOCUMENT_POSITION_DISCONNECTED: number;\n    readonly DOCUMENT_POSITION_FOLLOWING: number;\n    readonly DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: number;\n    readonly DOCUMENT_POSITION_PRECEDING: number;\n    readonly DOCUMENT_TYPE_NODE: number;\n    readonly ELEMENT_NODE: number;\n    readonly ENTITY_NODE: number;\n    readonly ENTITY_REFERENCE_NODE: number;\n    readonly NOTATION_NODE: number;\n    readonly PROCESSING_INSTRUCTION_NODE: number;\n    readonly TEXT_NODE: number;\n}\n\ndeclare var Node: {\n    prototype: Node;\n    new(): Node;\n    readonly ATTRIBUTE_NODE: number;\n    readonly CDATA_SECTION_NODE: number;\n    readonly COMMENT_NODE: number;\n    readonly DOCUMENT_FRAGMENT_NODE: number;\n    readonly DOCUMENT_NODE: number;\n    readonly DOCUMENT_POSITION_CONTAINED_BY: number;\n    readonly DOCUMENT_POSITION_CONTAINS: number;\n    readonly DOCUMENT_POSITION_DISCONNECTED: number;\n    readonly DOCUMENT_POSITION_FOLLOWING: number;\n    readonly DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: number;\n    readonly DOCUMENT_POSITION_PRECEDING: number;\n    readonly DOCUMENT_TYPE_NODE: number;\n    readonly ELEMENT_NODE: number;\n    readonly ENTITY_NODE: number;\n    readonly ENTITY_REFERENCE_NODE: number;\n    readonly NOTATION_NODE: number;\n    readonly PROCESSING_INSTRUCTION_NODE: number;\n    readonly TEXT_NODE: number;\n};\n\ninterface NodeFilter {\n    acceptNode(n: Node): number;\n}\n\ndeclare var NodeFilter: {\n    readonly FILTER_ACCEPT: number;\n    readonly FILTER_REJECT: number;\n    readonly FILTER_SKIP: number;\n    readonly SHOW_ALL: number;\n    readonly SHOW_ATTRIBUTE: number;\n    readonly SHOW_CDATA_SECTION: number;\n    readonly SHOW_COMMENT: number;\n    readonly SHOW_DOCUMENT: number;\n    readonly SHOW_DOCUMENT_FRAGMENT: number;\n    readonly SHOW_DOCUMENT_TYPE: number;\n    readonly SHOW_ELEMENT: number;\n    readonly SHOW_ENTITY: number;\n    readonly SHOW_ENTITY_REFERENCE: number;\n    readonly SHOW_NOTATION: number;\n    readonly SHOW_PROCESSING_INSTRUCTION: number;\n    readonly SHOW_TEXT: number;\n};\n\ninterface NodeIterator {\n    readonly expandEntityReferences: boolean;\n    readonly filter: NodeFilter;\n    readonly root: Node;\n    readonly whatToShow: number;\n    detach(): void;\n    nextNode(): Node;\n    previousNode(): Node;\n}\n\ndeclare var NodeIterator: {\n    prototype: NodeIterator;\n    new(): NodeIterator;\n};\n\ninterface NodeList {\n    readonly length: number;\n    item(index: number): Node;\n    [index: number]: Node;\n}\n\ndeclare var NodeList: {\n    prototype: NodeList;\n    new(): NodeList;\n};\n\ninterface NotificationEventMap {\n    "click": Event;\n    "close": Event;\n    "error": Event;\n    "show": Event;\n}\n\ninterface Notification extends EventTarget {\n    readonly body: string;\n    readonly dir: NotificationDirection;\n    readonly icon: string;\n    readonly lang: string;\n    onclick: (this: Notification, ev: Event) => any;\n    onclose: (this: Notification, ev: Event) => any;\n    onerror: (this: Notification, ev: Event) => any;\n    onshow: (this: Notification, ev: Event) => any;\n    readonly permission: NotificationPermission;\n    readonly tag: string;\n    readonly title: string;\n    close(): void;\n    addEventListener<K extends keyof NotificationEventMap>(type: K, listener: (this: Notification, ev: NotificationEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var Notification: {\n    prototype: Notification;\n    new(title: string, options?: NotificationOptions): Notification;\n    requestPermission(callback?: NotificationPermissionCallback): Promise<NotificationPermission>;\n};\n\ninterface OES_element_index_uint {\n}\n\ndeclare var OES_element_index_uint: {\n    prototype: OES_element_index_uint;\n    new(): OES_element_index_uint;\n};\n\ninterface OES_standard_derivatives {\n    readonly FRAGMENT_SHADER_DERIVATIVE_HINT_OES: number;\n}\n\ndeclare var OES_standard_derivatives: {\n    prototype: OES_standard_derivatives;\n    new(): OES_standard_derivatives;\n    readonly FRAGMENT_SHADER_DERIVATIVE_HINT_OES: number;\n};\n\ninterface OES_texture_float {\n}\n\ndeclare var OES_texture_float: {\n    prototype: OES_texture_float;\n    new(): OES_texture_float;\n};\n\ninterface OES_texture_float_linear {\n}\n\ndeclare var OES_texture_float_linear: {\n    prototype: OES_texture_float_linear;\n    new(): OES_texture_float_linear;\n};\n\ninterface OES_texture_half_float {\n    readonly HALF_FLOAT_OES: number;\n}\n\ndeclare var OES_texture_half_float: {\n    prototype: OES_texture_half_float;\n    new(): OES_texture_half_float;\n    readonly HALF_FLOAT_OES: number;\n};\n\ninterface OES_texture_half_float_linear {\n}\n\ndeclare var OES_texture_half_float_linear: {\n    prototype: OES_texture_half_float_linear;\n    new(): OES_texture_half_float_linear;\n};\n\ninterface OfflineAudioCompletionEvent extends Event {\n    readonly renderedBuffer: AudioBuffer;\n}\n\ndeclare var OfflineAudioCompletionEvent: {\n    prototype: OfflineAudioCompletionEvent;\n    new(): OfflineAudioCompletionEvent;\n};\n\ninterface OfflineAudioContextEventMap extends AudioContextEventMap {\n    "complete": OfflineAudioCompletionEvent;\n}\n\ninterface OfflineAudioContext extends AudioContextBase {\n    readonly length: number;\n    oncomplete: (this: OfflineAudioContext, ev: OfflineAudioCompletionEvent) => any;\n    startRendering(): Promise<AudioBuffer>;\n    suspend(suspendTime: number): Promise<void>;\n    addEventListener<K extends keyof OfflineAudioContextEventMap>(type: K, listener: (this: OfflineAudioContext, ev: OfflineAudioContextEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var OfflineAudioContext: {\n    prototype: OfflineAudioContext;\n    new(numberOfChannels: number, length: number, sampleRate: number): OfflineAudioContext;\n};\n\ninterface OscillatorNodeEventMap {\n    "ended": MediaStreamErrorEvent;\n}\n\ninterface OscillatorNode extends AudioNode {\n    readonly detune: AudioParam;\n    readonly frequency: AudioParam;\n    onended: (this: OscillatorNode, ev: MediaStreamErrorEvent) => any;\n    type: OscillatorType;\n    setPeriodicWave(periodicWave: PeriodicWave): void;\n    start(when?: number): void;\n    stop(when?: number): void;\n    addEventListener<K extends keyof OscillatorNodeEventMap>(type: K, listener: (this: OscillatorNode, ev: OscillatorNodeEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var OscillatorNode: {\n    prototype: OscillatorNode;\n    new(): OscillatorNode;\n};\n\ninterface OverflowEvent extends UIEvent {\n    readonly horizontalOverflow: boolean;\n    readonly orient: number;\n    readonly verticalOverflow: boolean;\n    readonly BOTH: number;\n    readonly HORIZONTAL: number;\n    readonly VERTICAL: number;\n}\n\ndeclare var OverflowEvent: {\n    prototype: OverflowEvent;\n    new(): OverflowEvent;\n    readonly BOTH: number;\n    readonly HORIZONTAL: number;\n    readonly VERTICAL: number;\n};\n\ninterface PageTransitionEvent extends Event {\n    readonly persisted: boolean;\n}\n\ndeclare var PageTransitionEvent: {\n    prototype: PageTransitionEvent;\n    new(): PageTransitionEvent;\n};\n\ninterface PannerNode extends AudioNode {\n    coneInnerAngle: number;\n    coneOuterAngle: number;\n    coneOuterGain: number;\n    distanceModel: DistanceModelType;\n    maxDistance: number;\n    panningModel: PanningModelType;\n    refDistance: number;\n    rolloffFactor: number;\n    setOrientation(x: number, y: number, z: number): void;\n    setPosition(x: number, y: number, z: number): void;\n    setVelocity(x: number, y: number, z: number): void;\n}\n\ndeclare var PannerNode: {\n    prototype: PannerNode;\n    new(): PannerNode;\n};\n\ninterface Path2D extends Object, CanvasPathMethods {\n}\n\ndeclare var Path2D: {\n    prototype: Path2D;\n    new(path?: Path2D): Path2D;\n};\n\ninterface PaymentAddress {\n    readonly addressLine: string[];\n    readonly city: string;\n    readonly country: string;\n    readonly dependentLocality: string;\n    readonly languageCode: string;\n    readonly organization: string;\n    readonly phone: string;\n    readonly postalCode: string;\n    readonly recipient: string;\n    readonly region: string;\n    readonly sortingCode: string;\n    toJSON(): any;\n}\n\ndeclare var PaymentAddress: {\n    prototype: PaymentAddress;\n    new(): PaymentAddress;\n};\n\ninterface PaymentRequestEventMap {\n    "shippingaddresschange": Event;\n    "shippingoptionchange": Event;\n}\n\ninterface PaymentRequest extends EventTarget {\n    onshippingaddresschange: (this: PaymentRequest, ev: Event) => any;\n    onshippingoptionchange: (this: PaymentRequest, ev: Event) => any;\n    readonly shippingAddress: PaymentAddress | null;\n    readonly shippingOption: string | null;\n    readonly shippingType: PaymentShippingType | null;\n    abort(): Promise<void>;\n    show(): Promise<PaymentResponse>;\n    addEventListener<K extends keyof PaymentRequestEventMap>(type: K, listener: (this: PaymentRequest, ev: PaymentRequestEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var PaymentRequest: {\n    prototype: PaymentRequest;\n    new(methodData: PaymentMethodData[], details: PaymentDetails, options?: PaymentOptions): PaymentRequest;\n};\n\ninterface PaymentRequestUpdateEvent extends Event {\n    updateWith(d: Promise<PaymentDetails>): void;\n}\n\ndeclare var PaymentRequestUpdateEvent: {\n    prototype: PaymentRequestUpdateEvent;\n    new(type: string, eventInitDict?: PaymentRequestUpdateEventInit): PaymentRequestUpdateEvent;\n};\n\ninterface PaymentResponse {\n    readonly details: any;\n    readonly methodName: string;\n    readonly payerEmail: string | null;\n    readonly payerName: string | null;\n    readonly payerPhone: string | null;\n    readonly shippingAddress: PaymentAddress | null;\n    readonly shippingOption: string | null;\n    complete(result?: PaymentComplete): Promise<void>;\n    toJSON(): any;\n}\n\ndeclare var PaymentResponse: {\n    prototype: PaymentResponse;\n    new(): PaymentResponse;\n};\n\ninterface Performance {\n    readonly navigation: PerformanceNavigation;\n    readonly timing: PerformanceTiming;\n    clearMarks(markName?: string): void;\n    clearMeasures(measureName?: string): void;\n    clearResourceTimings(): void;\n    getEntries(): any;\n    getEntriesByName(name: string, entryType?: string): any;\n    getEntriesByType(entryType: string): any;\n    getMarks(markName?: string): any;\n    getMeasures(measureName?: string): any;\n    mark(markName: string): void;\n    measure(measureName: string, startMarkName?: string, endMarkName?: string): void;\n    now(): number;\n    setResourceTimingBufferSize(maxSize: number): void;\n    toJSON(): any;\n}\n\ndeclare var Performance: {\n    prototype: Performance;\n    new(): Performance;\n};\n\ninterface PerformanceEntry {\n    readonly duration: number;\n    readonly entryType: string;\n    readonly name: string;\n    readonly startTime: number;\n}\n\ndeclare var PerformanceEntry: {\n    prototype: PerformanceEntry;\n    new(): PerformanceEntry;\n};\n\ninterface PerformanceMark extends PerformanceEntry {\n}\n\ndeclare var PerformanceMark: {\n    prototype: PerformanceMark;\n    new(): PerformanceMark;\n};\n\ninterface PerformanceMeasure extends PerformanceEntry {\n}\n\ndeclare var PerformanceMeasure: {\n    prototype: PerformanceMeasure;\n    new(): PerformanceMeasure;\n};\n\ninterface PerformanceNavigation {\n    readonly redirectCount: number;\n    readonly type: number;\n    toJSON(): any;\n    readonly TYPE_BACK_FORWARD: number;\n    readonly TYPE_NAVIGATE: number;\n    readonly TYPE_RELOAD: number;\n    readonly TYPE_RESERVED: number;\n}\n\ndeclare var PerformanceNavigation: {\n    prototype: PerformanceNavigation;\n    new(): PerformanceNavigation;\n    readonly TYPE_BACK_FORWARD: number;\n    readonly TYPE_NAVIGATE: number;\n    readonly TYPE_RELOAD: number;\n    readonly TYPE_RESERVED: number;\n};\n\ninterface PerformanceNavigationTiming extends PerformanceEntry {\n    readonly connectEnd: number;\n    readonly connectStart: number;\n    readonly domainLookupEnd: number;\n    readonly domainLookupStart: number;\n    readonly domComplete: number;\n    readonly domContentLoadedEventEnd: number;\n    readonly domContentLoadedEventStart: number;\n    readonly domInteractive: number;\n    readonly domLoading: number;\n    readonly fetchStart: number;\n    readonly loadEventEnd: number;\n    readonly loadEventStart: number;\n    readonly navigationStart: number;\n    readonly redirectCount: number;\n    readonly redirectEnd: number;\n    readonly redirectStart: number;\n    readonly requestStart: number;\n    readonly responseEnd: number;\n    readonly responseStart: number;\n    readonly type: NavigationType;\n    readonly unloadEventEnd: number;\n    readonly unloadEventStart: number;\n}\n\ndeclare var PerformanceNavigationTiming: {\n    prototype: PerformanceNavigationTiming;\n    new(): PerformanceNavigationTiming;\n};\n\ninterface PerformanceResourceTiming extends PerformanceEntry {\n    readonly connectEnd: number;\n    readonly connectStart: number;\n    readonly domainLookupEnd: number;\n    readonly domainLookupStart: number;\n    readonly fetchStart: number;\n    readonly initiatorType: string;\n    readonly redirectEnd: number;\n    readonly redirectStart: number;\n    readonly requestStart: number;\n    readonly responseEnd: number;\n    readonly responseStart: number;\n}\n\ndeclare var PerformanceResourceTiming: {\n    prototype: PerformanceResourceTiming;\n    new(): PerformanceResourceTiming;\n};\n\ninterface PerformanceTiming {\n    readonly connectEnd: number;\n    readonly connectStart: number;\n    readonly domainLookupEnd: number;\n    readonly domainLookupStart: number;\n    readonly domComplete: number;\n    readonly domContentLoadedEventEnd: number;\n    readonly domContentLoadedEventStart: number;\n    readonly domInteractive: number;\n    readonly domLoading: number;\n    readonly fetchStart: number;\n    readonly loadEventEnd: number;\n    readonly loadEventStart: number;\n    readonly msFirstPaint: number;\n    readonly navigationStart: number;\n    readonly redirectEnd: number;\n    readonly redirectStart: number;\n    readonly requestStart: number;\n    readonly responseEnd: number;\n    readonly responseStart: number;\n    readonly unloadEventEnd: number;\n    readonly unloadEventStart: number;\n    readonly secureConnectionStart: number;\n    toJSON(): any;\n}\n\ndeclare var PerformanceTiming: {\n    prototype: PerformanceTiming;\n    new(): PerformanceTiming;\n};\n\ninterface PerfWidgetExternal {\n    readonly activeNetworkRequestCount: number;\n    readonly averageFrameTime: number;\n    readonly averagePaintTime: number;\n    readonly extraInformationEnabled: boolean;\n    readonly independentRenderingEnabled: boolean;\n    readonly irDisablingContentString: string;\n    readonly irStatusAvailable: boolean;\n    readonly maxCpuSpeed: number;\n    readonly paintRequestsPerSecond: number;\n    readonly performanceCounter: number;\n    readonly performanceCounterFrequency: number;\n    addEventListener(eventType: string, callback: Function): void;\n    getMemoryUsage(): number;\n    getProcessCpuUsage(): number;\n    getRecentCpuUsage(last: number | null): any;\n    getRecentFrames(last: number | null): any;\n    getRecentMemoryUsage(last: number | null): any;\n    getRecentPaintRequests(last: number | null): any;\n    removeEventListener(eventType: string, callback: Function): void;\n    repositionWindow(x: number, y: number): void;\n    resizeWindow(width: number, height: number): void;\n}\n\ndeclare var PerfWidgetExternal: {\n    prototype: PerfWidgetExternal;\n    new(): PerfWidgetExternal;\n};\n\ninterface PeriodicWave {\n}\n\ndeclare var PeriodicWave: {\n    prototype: PeriodicWave;\n    new(): PeriodicWave;\n};\n\ninterface PermissionRequest extends DeferredPermissionRequest {\n    readonly state: MSWebViewPermissionState;\n    defer(): void;\n}\n\ndeclare var PermissionRequest: {\n    prototype: PermissionRequest;\n    new(): PermissionRequest;\n};\n\ninterface PermissionRequestedEvent extends Event {\n    readonly permissionRequest: PermissionRequest;\n}\n\ndeclare var PermissionRequestedEvent: {\n    prototype: PermissionRequestedEvent;\n    new(): PermissionRequestedEvent;\n};\n\ninterface Plugin {\n    readonly description: string;\n    readonly filename: string;\n    readonly length: number;\n    readonly name: string;\n    readonly version: string;\n    item(index: number): MimeType;\n    namedItem(type: string): MimeType;\n    [index: number]: MimeType;\n}\n\ndeclare var Plugin: {\n    prototype: Plugin;\n    new(): Plugin;\n};\n\ninterface PluginArray {\n    readonly length: number;\n    item(index: number): Plugin;\n    namedItem(name: string): Plugin;\n    refresh(reload?: boolean): void;\n    [index: number]: Plugin;\n}\n\ndeclare var PluginArray: {\n    prototype: PluginArray;\n    new(): PluginArray;\n};\n\ninterface PointerEvent extends MouseEvent {\n    readonly currentPoint: any;\n    readonly height: number;\n    readonly hwTimestamp: number;\n    readonly intermediatePoints: any;\n    readonly isPrimary: boolean;\n    readonly pointerId: number;\n    readonly pointerType: any;\n    readonly pressure: number;\n    readonly rotation: number;\n    readonly tiltX: number;\n    readonly tiltY: number;\n    readonly width: number;\n    getCurrentPoint(element: Element): void;\n    getIntermediatePoints(element: Element): void;\n    initPointerEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, ctrlKeyArg: boolean, altKeyArg: boolean, shiftKeyArg: boolean, metaKeyArg: boolean, buttonArg: number, relatedTargetArg: EventTarget, offsetXArg: number, offsetYArg: number, widthArg: number, heightArg: number, pressure: number, rotation: number, tiltX: number, tiltY: number, pointerIdArg: number, pointerType: any, hwTimestampArg: number, isPrimary: boolean): void;\n}\n\ndeclare var PointerEvent: {\n    prototype: PointerEvent;\n    new(typeArg: string, eventInitDict?: PointerEventInit): PointerEvent;\n};\n\ninterface PopStateEvent extends Event {\n    readonly state: any;\n    initPopStateEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, stateArg: any): void;\n}\n\ndeclare var PopStateEvent: {\n    prototype: PopStateEvent;\n    new(typeArg: string, eventInitDict?: PopStateEventInit): PopStateEvent;\n};\n\ninterface Position {\n    readonly coords: Coordinates;\n    readonly timestamp: number;\n}\n\ndeclare var Position: {\n    prototype: Position;\n    new(): Position;\n};\n\ninterface PositionError {\n    readonly code: number;\n    readonly message: string;\n    toString(): string;\n    readonly PERMISSION_DENIED: number;\n    readonly POSITION_UNAVAILABLE: number;\n    readonly TIMEOUT: number;\n}\n\ndeclare var PositionError: {\n    prototype: PositionError;\n    new(): PositionError;\n    readonly PERMISSION_DENIED: number;\n    readonly POSITION_UNAVAILABLE: number;\n    readonly TIMEOUT: number;\n};\n\ninterface ProcessingInstruction extends CharacterData {\n    readonly target: string;\n}\n\ndeclare var ProcessingInstruction: {\n    prototype: ProcessingInstruction;\n    new(): ProcessingInstruction;\n};\n\ninterface ProgressEvent extends Event {\n    readonly lengthComputable: boolean;\n    readonly loaded: number;\n    readonly total: number;\n    initProgressEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, lengthComputableArg: boolean, loadedArg: number, totalArg: number): void;\n}\n\ndeclare var ProgressEvent: {\n    prototype: ProgressEvent;\n    new(type: string, eventInitDict?: ProgressEventInit): ProgressEvent;\n};\n\ninterface PushManager {\n    getSubscription(): Promise<PushSubscription>;\n    permissionState(options?: PushSubscriptionOptionsInit): Promise<PushPermissionState>;\n    subscribe(options?: PushSubscriptionOptionsInit): Promise<PushSubscription>;\n}\n\ndeclare var PushManager: {\n    prototype: PushManager;\n    new(): PushManager;\n};\n\ninterface PushSubscription {\n    readonly endpoint: USVString;\n    readonly options: PushSubscriptionOptions;\n    getKey(name: PushEncryptionKeyName): ArrayBuffer | null;\n    toJSON(): any;\n    unsubscribe(): Promise<boolean>;\n}\n\ndeclare var PushSubscription: {\n    prototype: PushSubscription;\n    new(): PushSubscription;\n};\n\ninterface PushSubscriptionOptions {\n    readonly applicationServerKey: ArrayBuffer | null;\n    readonly userVisibleOnly: boolean;\n}\n\ndeclare var PushSubscriptionOptions: {\n    prototype: PushSubscriptionOptions;\n    new(): PushSubscriptionOptions;\n};\n\ninterface Range {\n    readonly collapsed: boolean;\n    readonly commonAncestorContainer: Node;\n    readonly endContainer: Node;\n    readonly endOffset: number;\n    readonly startContainer: Node;\n    readonly startOffset: number;\n    cloneContents(): DocumentFragment;\n    cloneRange(): Range;\n    collapse(toStart: boolean): void;\n    compareBoundaryPoints(how: number, sourceRange: Range): number;\n    createContextualFragment(fragment: string): DocumentFragment;\n    deleteContents(): void;\n    detach(): void;\n    expand(Unit: ExpandGranularity): boolean;\n    extractContents(): DocumentFragment;\n    getBoundingClientRect(): ClientRect;\n    getClientRects(): ClientRectList;\n    insertNode(newNode: Node): void;\n    selectNode(refNode: Node): void;\n    selectNodeContents(refNode: Node): void;\n    setEnd(refNode: Node, offset: number): void;\n    setEndAfter(refNode: Node): void;\n    setEndBefore(refNode: Node): void;\n    setStart(refNode: Node, offset: number): void;\n    setStartAfter(refNode: Node): void;\n    setStartBefore(refNode: Node): void;\n    surroundContents(newParent: Node): void;\n    toString(): string;\n    readonly END_TO_END: number;\n    readonly END_TO_START: number;\n    readonly START_TO_END: number;\n    readonly START_TO_START: number;\n}\n\ndeclare var Range: {\n    prototype: Range;\n    new(): Range;\n    readonly END_TO_END: number;\n    readonly END_TO_START: number;\n    readonly START_TO_END: number;\n    readonly START_TO_START: number;\n};\n\ninterface ReadableStream {\n    readonly locked: boolean;\n    cancel(): Promise<void>;\n    getReader(): ReadableStreamReader;\n}\n\ndeclare var ReadableStream: {\n    prototype: ReadableStream;\n    new(): ReadableStream;\n};\n\ninterface ReadableStreamReader {\n    cancel(): Promise<void>;\n    read(): Promise<any>;\n    releaseLock(): void;\n}\n\ndeclare var ReadableStreamReader: {\n    prototype: ReadableStreamReader;\n    new(): ReadableStreamReader;\n};\n\ninterface Request extends Object, Body {\n    readonly cache: RequestCache;\n    readonly credentials: RequestCredentials;\n    readonly destination: RequestDestination;\n    readonly headers: Headers;\n    readonly integrity: string;\n    readonly keepalive: boolean;\n    readonly method: string;\n    readonly mode: RequestMode;\n    readonly redirect: RequestRedirect;\n    readonly referrer: string;\n    readonly referrerPolicy: ReferrerPolicy;\n    readonly type: RequestType;\n    readonly url: string;\n    clone(): Request;\n}\n\ndeclare var Request: {\n    prototype: Request;\n    new(input: Request | string, init?: RequestInit): Request;\n};\n\ninterface Response extends Object, Body {\n    readonly body: ReadableStream | null;\n    readonly headers: Headers;\n    readonly ok: boolean;\n    readonly status: number;\n    readonly statusText: string;\n    readonly type: ResponseType;\n    readonly url: string;\n    clone(): Response;\n}\n\ndeclare var Response: {\n    prototype: Response;\n    new(body?: any, init?: ResponseInit): Response;\n    error: () => Response;\n    redirect: (url: string, status?: number) => Response;\n};\n\ninterface RTCDtlsTransportEventMap {\n    "dtlsstatechange": RTCDtlsTransportStateChangedEvent;\n    "error": Event;\n}\n\ninterface RTCDtlsTransport extends RTCStatsProvider {\n    ondtlsstatechange: ((this: RTCDtlsTransport, ev: RTCDtlsTransportStateChangedEvent) => any) | null;\n    onerror: ((this: RTCDtlsTransport, ev: Event) => any) | null;\n    readonly state: RTCDtlsTransportState;\n    readonly transport: RTCIceTransport;\n    getLocalParameters(): RTCDtlsParameters;\n    getRemoteCertificates(): ArrayBuffer[];\n    getRemoteParameters(): RTCDtlsParameters | null;\n    start(remoteParameters: RTCDtlsParameters): void;\n    stop(): void;\n    addEventListener<K extends keyof RTCDtlsTransportEventMap>(type: K, listener: (this: RTCDtlsTransport, ev: RTCDtlsTransportEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var RTCDtlsTransport: {\n    prototype: RTCDtlsTransport;\n    new(transport: RTCIceTransport): RTCDtlsTransport;\n};\n\ninterface RTCDtlsTransportStateChangedEvent extends Event {\n    readonly state: RTCDtlsTransportState;\n}\n\ndeclare var RTCDtlsTransportStateChangedEvent: {\n    prototype: RTCDtlsTransportStateChangedEvent;\n    new(): RTCDtlsTransportStateChangedEvent;\n};\n\ninterface RTCDtmfSenderEventMap {\n    "tonechange": RTCDTMFToneChangeEvent;\n}\n\ninterface RTCDtmfSender extends EventTarget {\n    readonly canInsertDTMF: boolean;\n    readonly duration: number;\n    readonly interToneGap: number;\n    ontonechange: (this: RTCDtmfSender, ev: RTCDTMFToneChangeEvent) => any;\n    readonly sender: RTCRtpSender;\n    readonly toneBuffer: string;\n    insertDTMF(tones: string, duration?: number, interToneGap?: number): void;\n    addEventListener<K extends keyof RTCDtmfSenderEventMap>(type: K, listener: (this: RTCDtmfSender, ev: RTCDtmfSenderEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var RTCDtmfSender: {\n    prototype: RTCDtmfSender;\n    new(sender: RTCRtpSender): RTCDtmfSender;\n};\n\ninterface RTCDTMFToneChangeEvent extends Event {\n    readonly tone: string;\n}\n\ndeclare var RTCDTMFToneChangeEvent: {\n    prototype: RTCDTMFToneChangeEvent;\n    new(typeArg: string, eventInitDict: RTCDTMFToneChangeEventInit): RTCDTMFToneChangeEvent;\n};\n\ninterface RTCIceCandidate {\n    candidate: string | null;\n    sdpMid: string | null;\n    sdpMLineIndex: number | null;\n    toJSON(): any;\n}\n\ndeclare var RTCIceCandidate: {\n    prototype: RTCIceCandidate;\n    new(candidateInitDict?: RTCIceCandidateInit): RTCIceCandidate;\n};\n\ninterface RTCIceCandidatePairChangedEvent extends Event {\n    readonly pair: RTCIceCandidatePair;\n}\n\ndeclare var RTCIceCandidatePairChangedEvent: {\n    prototype: RTCIceCandidatePairChangedEvent;\n    new(): RTCIceCandidatePairChangedEvent;\n};\n\ninterface RTCIceGathererEventMap {\n    "error": Event;\n    "localcandidate": RTCIceGathererEvent;\n}\n\ninterface RTCIceGatherer extends RTCStatsProvider {\n    readonly component: RTCIceComponent;\n    onerror: ((this: RTCIceGatherer, ev: Event) => any) | null;\n    onlocalcandidate: ((this: RTCIceGatherer, ev: RTCIceGathererEvent) => any) | null;\n    createAssociatedGatherer(): RTCIceGatherer;\n    getLocalCandidates(): RTCIceCandidateDictionary[];\n    getLocalParameters(): RTCIceParameters;\n    addEventListener<K extends keyof RTCIceGathererEventMap>(type: K, listener: (this: RTCIceGatherer, ev: RTCIceGathererEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var RTCIceGatherer: {\n    prototype: RTCIceGatherer;\n    new(options: RTCIceGatherOptions): RTCIceGatherer;\n};\n\ninterface RTCIceGathererEvent extends Event {\n    readonly candidate: RTCIceCandidateDictionary | RTCIceCandidateComplete;\n}\n\ndeclare var RTCIceGathererEvent: {\n    prototype: RTCIceGathererEvent;\n    new(): RTCIceGathererEvent;\n};\n\ninterface RTCIceTransportEventMap {\n    "candidatepairchange": RTCIceCandidatePairChangedEvent;\n    "icestatechange": RTCIceTransportStateChangedEvent;\n}\n\ninterface RTCIceTransport extends RTCStatsProvider {\n    readonly component: RTCIceComponent;\n    readonly iceGatherer: RTCIceGatherer | null;\n    oncandidatepairchange: ((this: RTCIceTransport, ev: RTCIceCandidatePairChangedEvent) => any) | null;\n    onicestatechange: ((this: RTCIceTransport, ev: RTCIceTransportStateChangedEvent) => any) | null;\n    readonly role: RTCIceRole;\n    readonly state: RTCIceTransportState;\n    addRemoteCandidate(remoteCandidate: RTCIceCandidateDictionary | RTCIceCandidateComplete): void;\n    createAssociatedTransport(): RTCIceTransport;\n    getNominatedCandidatePair(): RTCIceCandidatePair | null;\n    getRemoteCandidates(): RTCIceCandidateDictionary[];\n    getRemoteParameters(): RTCIceParameters | null;\n    setRemoteCandidates(remoteCandidates: RTCIceCandidateDictionary[]): void;\n    start(gatherer: RTCIceGatherer, remoteParameters: RTCIceParameters, role?: RTCIceRole): void;\n    stop(): void;\n    addEventListener<K extends keyof RTCIceTransportEventMap>(type: K, listener: (this: RTCIceTransport, ev: RTCIceTransportEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var RTCIceTransport: {\n    prototype: RTCIceTransport;\n    new(): RTCIceTransport;\n};\n\ninterface RTCIceTransportStateChangedEvent extends Event {\n    readonly state: RTCIceTransportState;\n}\n\ndeclare var RTCIceTransportStateChangedEvent: {\n    prototype: RTCIceTransportStateChangedEvent;\n    new(): RTCIceTransportStateChangedEvent;\n};\n\ninterface RTCPeerConnectionEventMap {\n    "addstream": MediaStreamEvent;\n    "icecandidate": RTCPeerConnectionIceEvent;\n    "iceconnectionstatechange": Event;\n    "icegatheringstatechange": Event;\n    "negotiationneeded": Event;\n    "removestream": MediaStreamEvent;\n    "signalingstatechange": Event;\n}\n\ninterface RTCPeerConnection extends EventTarget {\n    readonly canTrickleIceCandidates: boolean | null;\n    readonly iceConnectionState: RTCIceConnectionState;\n    readonly iceGatheringState: RTCIceGatheringState;\n    readonly localDescription: RTCSessionDescription | null;\n    onaddstream: (this: RTCPeerConnection, ev: MediaStreamEvent) => any;\n    onicecandidate: (this: RTCPeerConnection, ev: RTCPeerConnectionIceEvent) => any;\n    oniceconnectionstatechange: (this: RTCPeerConnection, ev: Event) => any;\n    onicegatheringstatechange: (this: RTCPeerConnection, ev: Event) => any;\n    onnegotiationneeded: (this: RTCPeerConnection, ev: Event) => any;\n    onremovestream: (this: RTCPeerConnection, ev: MediaStreamEvent) => any;\n    onsignalingstatechange: (this: RTCPeerConnection, ev: Event) => any;\n    readonly remoteDescription: RTCSessionDescription | null;\n    readonly signalingState: RTCSignalingState;\n    addIceCandidate(candidate: RTCIceCandidate, successCallback?: VoidFunction, failureCallback?: RTCPeerConnectionErrorCallback): Promise<void>;\n    addStream(stream: MediaStream): void;\n    close(): void;\n    createAnswer(successCallback?: RTCSessionDescriptionCallback, failureCallback?: RTCPeerConnectionErrorCallback): Promise<RTCSessionDescription>;\n    createOffer(successCallback?: RTCSessionDescriptionCallback, failureCallback?: RTCPeerConnectionErrorCallback, options?: RTCOfferOptions): Promise<RTCSessionDescription>;\n    getConfiguration(): RTCConfiguration;\n    getLocalStreams(): MediaStream[];\n    getRemoteStreams(): MediaStream[];\n    getStats(selector: MediaStreamTrack | null, successCallback?: RTCStatsCallback, failureCallback?: RTCPeerConnectionErrorCallback): Promise<RTCStatsReport>;\n    getStreamById(streamId: string): MediaStream | null;\n    removeStream(stream: MediaStream): void;\n    setLocalDescription(description: RTCSessionDescription, successCallback?: VoidFunction, failureCallback?: RTCPeerConnectionErrorCallback): Promise<void>;\n    setRemoteDescription(description: RTCSessionDescription, successCallback?: VoidFunction, failureCallback?: RTCPeerConnectionErrorCallback): Promise<void>;\n    addEventListener<K extends keyof RTCPeerConnectionEventMap>(type: K, listener: (this: RTCPeerConnection, ev: RTCPeerConnectionEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var RTCPeerConnection: {\n    prototype: RTCPeerConnection;\n    new(configuration: RTCConfiguration): RTCPeerConnection;\n};\n\ninterface RTCPeerConnectionIceEvent extends Event {\n    readonly candidate: RTCIceCandidate;\n}\n\ndeclare var RTCPeerConnectionIceEvent: {\n    prototype: RTCPeerConnectionIceEvent;\n    new(type: string, eventInitDict: RTCPeerConnectionIceEventInit): RTCPeerConnectionIceEvent;\n};\n\ninterface RTCRtpReceiverEventMap {\n    "error": Event;\n}\n\ninterface RTCRtpReceiver extends RTCStatsProvider {\n    onerror: ((this: RTCRtpReceiver, ev: Event) => any) | null;\n    readonly rtcpTransport: RTCDtlsTransport;\n    readonly track: MediaStreamTrack | null;\n    readonly transport: RTCDtlsTransport | RTCSrtpSdesTransport;\n    getContributingSources(): RTCRtpContributingSource[];\n    receive(parameters: RTCRtpParameters): void;\n    requestSendCSRC(csrc: number): void;\n    setTransport(transport: RTCDtlsTransport | RTCSrtpSdesTransport, rtcpTransport?: RTCDtlsTransport): void;\n    stop(): void;\n    addEventListener<K extends keyof RTCRtpReceiverEventMap>(type: K, listener: (this: RTCRtpReceiver, ev: RTCRtpReceiverEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var RTCRtpReceiver: {\n    prototype: RTCRtpReceiver;\n    new(transport: RTCDtlsTransport | RTCSrtpSdesTransport, kind: string, rtcpTransport?: RTCDtlsTransport): RTCRtpReceiver;\n    getCapabilities(kind?: string): RTCRtpCapabilities;\n};\n\ninterface RTCRtpSenderEventMap {\n    "error": Event;\n    "ssrcconflict": RTCSsrcConflictEvent;\n}\n\ninterface RTCRtpSender extends RTCStatsProvider {\n    onerror: ((this: RTCRtpSender, ev: Event) => any) | null;\n    onssrcconflict: ((this: RTCRtpSender, ev: RTCSsrcConflictEvent) => any) | null;\n    readonly rtcpTransport: RTCDtlsTransport;\n    readonly track: MediaStreamTrack;\n    readonly transport: RTCDtlsTransport | RTCSrtpSdesTransport;\n    send(parameters: RTCRtpParameters): void;\n    setTrack(track: MediaStreamTrack): void;\n    setTransport(transport: RTCDtlsTransport | RTCSrtpSdesTransport, rtcpTransport?: RTCDtlsTransport): void;\n    stop(): void;\n    addEventListener<K extends keyof RTCRtpSenderEventMap>(type: K, listener: (this: RTCRtpSender, ev: RTCRtpSenderEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var RTCRtpSender: {\n    prototype: RTCRtpSender;\n    new(track: MediaStreamTrack, transport: RTCDtlsTransport | RTCSrtpSdesTransport, rtcpTransport?: RTCDtlsTransport): RTCRtpSender;\n    getCapabilities(kind?: string): RTCRtpCapabilities;\n};\n\ninterface RTCSessionDescription {\n    sdp: string | null;\n    type: RTCSdpType | null;\n    toJSON(): any;\n}\n\ndeclare var RTCSessionDescription: {\n    prototype: RTCSessionDescription;\n    new(descriptionInitDict?: RTCSessionDescriptionInit): RTCSessionDescription;\n};\n\ninterface RTCSrtpSdesTransportEventMap {\n    "error": Event;\n}\n\ninterface RTCSrtpSdesTransport extends EventTarget {\n    onerror: ((this: RTCSrtpSdesTransport, ev: Event) => any) | null;\n    readonly transport: RTCIceTransport;\n    addEventListener<K extends keyof RTCSrtpSdesTransportEventMap>(type: K, listener: (this: RTCSrtpSdesTransport, ev: RTCSrtpSdesTransportEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var RTCSrtpSdesTransport: {\n    prototype: RTCSrtpSdesTransport;\n    new(transport: RTCIceTransport, encryptParameters: RTCSrtpSdesParameters, decryptParameters: RTCSrtpSdesParameters): RTCSrtpSdesTransport;\n    getLocalParameters(): RTCSrtpSdesParameters[];\n};\n\ninterface RTCSsrcConflictEvent extends Event {\n    readonly ssrc: number;\n}\n\ndeclare var RTCSsrcConflictEvent: {\n    prototype: RTCSsrcConflictEvent;\n    new(): RTCSsrcConflictEvent;\n};\n\ninterface RTCStatsProvider extends EventTarget {\n    getStats(): Promise<RTCStatsReport>;\n    msGetStats(): Promise<RTCStatsReport>;\n}\n\ndeclare var RTCStatsProvider: {\n    prototype: RTCStatsProvider;\n    new(): RTCStatsProvider;\n};\n\ninterface ScopedCredential {\n    readonly id: ArrayBuffer;\n    readonly type: ScopedCredentialType;\n}\n\ndeclare var ScopedCredential: {\n    prototype: ScopedCredential;\n    new(): ScopedCredential;\n};\n\ninterface ScopedCredentialInfo {\n    readonly credential: ScopedCredential;\n    readonly publicKey: CryptoKey;\n}\n\ndeclare var ScopedCredentialInfo: {\n    prototype: ScopedCredentialInfo;\n    new(): ScopedCredentialInfo;\n};\n\ninterface ScreenEventMap {\n    "MSOrientationChange": Event;\n}\n\ninterface Screen extends EventTarget {\n    readonly availHeight: number;\n    readonly availWidth: number;\n    bufferDepth: number;\n    readonly colorDepth: number;\n    readonly deviceXDPI: number;\n    readonly deviceYDPI: number;\n    readonly fontSmoothingEnabled: boolean;\n    readonly height: number;\n    readonly logicalXDPI: number;\n    readonly logicalYDPI: number;\n    readonly msOrientation: string;\n    onmsorientationchange: (this: Screen, ev: Event) => any;\n    readonly pixelDepth: number;\n    readonly systemXDPI: number;\n    readonly systemYDPI: number;\n    readonly width: number;\n    msLockOrientation(orientations: string | string[]): boolean;\n    msUnlockOrientation(): void;\n    addEventListener<K extends keyof ScreenEventMap>(type: K, listener: (this: Screen, ev: ScreenEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var Screen: {\n    prototype: Screen;\n    new(): Screen;\n};\n\ninterface ScriptNotifyEvent extends Event {\n    readonly callingUri: string;\n    readonly value: string;\n}\n\ndeclare var ScriptNotifyEvent: {\n    prototype: ScriptNotifyEvent;\n    new(): ScriptNotifyEvent;\n};\n\ninterface ScriptProcessorNodeEventMap {\n    "audioprocess": AudioProcessingEvent;\n}\n\ninterface ScriptProcessorNode extends AudioNode {\n    readonly bufferSize: number;\n    onaudioprocess: (this: ScriptProcessorNode, ev: AudioProcessingEvent) => any;\n    addEventListener<K extends keyof ScriptProcessorNodeEventMap>(type: K, listener: (this: ScriptProcessorNode, ev: ScriptProcessorNodeEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var ScriptProcessorNode: {\n    prototype: ScriptProcessorNode;\n    new(): ScriptProcessorNode;\n};\n\ninterface Selection {\n    readonly anchorNode: Node;\n    readonly anchorOffset: number;\n    readonly baseNode: Node;\n    readonly baseOffset: number;\n    readonly extentNode: Node;\n    readonly extentOffset: number;\n    readonly focusNode: Node;\n    readonly focusOffset: number;\n    readonly isCollapsed: boolean;\n    readonly rangeCount: number;\n    readonly type: string;\n    addRange(range: Range): void;\n    collapse(parentNode: Node, offset: number): void;\n    collapseToEnd(): void;\n    collapseToStart(): void;\n    containsNode(node: Node, partlyContained: boolean): boolean;\n    deleteFromDocument(): void;\n    empty(): void;\n    extend(newNode: Node, offset: number): void;\n    getRangeAt(index: number): Range;\n    removeAllRanges(): void;\n    removeRange(range: Range): void;\n    selectAllChildren(parentNode: Node): void;\n    setBaseAndExtent(baseNode: Node, baseOffset: number, extentNode: Node, extentOffset: number): void;\n    setPosition(parentNode: Node, offset: number): void;\n    toString(): string;\n}\n\ndeclare var Selection: {\n    prototype: Selection;\n    new(): Selection;\n};\n\ninterface ServiceWorkerEventMap extends AbstractWorkerEventMap {\n    "statechange": Event;\n}\n\ninterface ServiceWorker extends EventTarget, AbstractWorker {\n    onstatechange: (this: ServiceWorker, ev: Event) => any;\n    readonly scriptURL: USVString;\n    readonly state: ServiceWorkerState;\n    postMessage(message: any, transfer?: any[]): void;\n    addEventListener<K extends keyof ServiceWorkerEventMap>(type: K, listener: (this: ServiceWorker, ev: ServiceWorkerEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var ServiceWorker: {\n    prototype: ServiceWorker;\n    new(): ServiceWorker;\n};\n\ninterface ServiceWorkerContainerEventMap {\n    "controllerchange": Event;\n    "message": ServiceWorkerMessageEvent;\n}\n\ninterface ServiceWorkerContainer extends EventTarget {\n    readonly controller: ServiceWorker | null;\n    oncontrollerchange: (this: ServiceWorkerContainer, ev: Event) => any;\n    onmessage: (this: ServiceWorkerContainer, ev: ServiceWorkerMessageEvent) => any;\n    readonly ready: Promise<ServiceWorkerRegistration>;\n    getRegistration(clientURL?: USVString): Promise<any>;\n    getRegistrations(): any;\n    register(scriptURL: USVString, options?: RegistrationOptions): Promise<ServiceWorkerRegistration>;\n    addEventListener<K extends keyof ServiceWorkerContainerEventMap>(type: K, listener: (this: ServiceWorkerContainer, ev: ServiceWorkerContainerEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var ServiceWorkerContainer: {\n    prototype: ServiceWorkerContainer;\n    new(): ServiceWorkerContainer;\n};\n\ninterface ServiceWorkerMessageEvent extends Event {\n    readonly data: any;\n    readonly lastEventId: string;\n    readonly origin: string;\n    readonly ports: MessagePort[] | null;\n    readonly source: ServiceWorker | MessagePort | null;\n}\n\ndeclare var ServiceWorkerMessageEvent: {\n    prototype: ServiceWorkerMessageEvent;\n    new(type: string, eventInitDict?: ServiceWorkerMessageEventInit): ServiceWorkerMessageEvent;\n};\n\ninterface ServiceWorkerRegistrationEventMap {\n    "updatefound": Event;\n}\n\ninterface ServiceWorkerRegistration extends EventTarget {\n    readonly active: ServiceWorker | null;\n    readonly installing: ServiceWorker | null;\n    onupdatefound: (this: ServiceWorkerRegistration, ev: Event) => any;\n    readonly pushManager: PushManager;\n    readonly scope: USVString;\n    readonly sync: SyncManager;\n    readonly waiting: ServiceWorker | null;\n    getNotifications(filter?: GetNotificationOptions): any;\n    showNotification(title: string, options?: NotificationOptions): Promise<void>;\n    unregister(): Promise<boolean>;\n    update(): Promise<void>;\n    addEventListener<K extends keyof ServiceWorkerRegistrationEventMap>(type: K, listener: (this: ServiceWorkerRegistration, ev: ServiceWorkerRegistrationEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var ServiceWorkerRegistration: {\n    prototype: ServiceWorkerRegistration;\n    new(): ServiceWorkerRegistration;\n};\n\ninterface SourceBuffer extends EventTarget {\n    appendWindowEnd: number;\n    appendWindowStart: number;\n    readonly audioTracks: AudioTrackList;\n    readonly buffered: TimeRanges;\n    mode: AppendMode;\n    timestampOffset: number;\n    readonly updating: boolean;\n    readonly videoTracks: VideoTrackList;\n    abort(): void;\n    appendBuffer(data: ArrayBuffer | ArrayBufferView): void;\n    appendStream(stream: MSStream, maxSize?: number): void;\n    remove(start: number, end: number): void;\n}\n\ndeclare var SourceBuffer: {\n    prototype: SourceBuffer;\n    new(): SourceBuffer;\n};\n\ninterface SourceBufferList extends EventTarget {\n    readonly length: number;\n    item(index: number): SourceBuffer;\n    [index: number]: SourceBuffer;\n}\n\ndeclare var SourceBufferList: {\n    prototype: SourceBufferList;\n    new(): SourceBufferList;\n};\n\ninterface SpeechSynthesisEventMap {\n    "voiceschanged": Event;\n}\n\ninterface SpeechSynthesis extends EventTarget {\n    onvoiceschanged: (this: SpeechSynthesis, ev: Event) => any;\n    readonly paused: boolean;\n    readonly pending: boolean;\n    readonly speaking: boolean;\n    cancel(): void;\n    getVoices(): SpeechSynthesisVoice[];\n    pause(): void;\n    resume(): void;\n    speak(utterance: SpeechSynthesisUtterance): void;\n    addEventListener<K extends keyof SpeechSynthesisEventMap>(type: K, listener: (this: SpeechSynthesis, ev: SpeechSynthesisEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SpeechSynthesis: {\n    prototype: SpeechSynthesis;\n    new(): SpeechSynthesis;\n};\n\ninterface SpeechSynthesisEvent extends Event {\n    readonly charIndex: number;\n    readonly elapsedTime: number;\n    readonly name: string;\n    readonly utterance: SpeechSynthesisUtterance | null;\n}\n\ndeclare var SpeechSynthesisEvent: {\n    prototype: SpeechSynthesisEvent;\n    new(type: string, eventInitDict?: SpeechSynthesisEventInit): SpeechSynthesisEvent;\n};\n\ninterface SpeechSynthesisUtteranceEventMap {\n    "boundary": Event;\n    "end": Event;\n    "error": Event;\n    "mark": Event;\n    "pause": Event;\n    "resume": Event;\n    "start": Event;\n}\n\ninterface SpeechSynthesisUtterance extends EventTarget {\n    lang: string;\n    onboundary: (this: SpeechSynthesisUtterance, ev: Event) => any;\n    onend: (this: SpeechSynthesisUtterance, ev: Event) => any;\n    onerror: (this: SpeechSynthesisUtterance, ev: Event) => any;\n    onmark: (this: SpeechSynthesisUtterance, ev: Event) => any;\n    onpause: (this: SpeechSynthesisUtterance, ev: Event) => any;\n    onresume: (this: SpeechSynthesisUtterance, ev: Event) => any;\n    onstart: (this: SpeechSynthesisUtterance, ev: Event) => any;\n    pitch: number;\n    rate: number;\n    text: string;\n    voice: SpeechSynthesisVoice;\n    volume: number;\n    addEventListener<K extends keyof SpeechSynthesisUtteranceEventMap>(type: K, listener: (this: SpeechSynthesisUtterance, ev: SpeechSynthesisUtteranceEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SpeechSynthesisUtterance: {\n    prototype: SpeechSynthesisUtterance;\n    new(text?: string): SpeechSynthesisUtterance;\n};\n\ninterface SpeechSynthesisVoice {\n    readonly default: boolean;\n    readonly lang: string;\n    readonly localService: boolean;\n    readonly name: string;\n    readonly voiceURI: string;\n}\n\ndeclare var SpeechSynthesisVoice: {\n    prototype: SpeechSynthesisVoice;\n    new(): SpeechSynthesisVoice;\n};\n\ninterface StereoPannerNode extends AudioNode {\n    readonly pan: AudioParam;\n}\n\ndeclare var StereoPannerNode: {\n    prototype: StereoPannerNode;\n    new(): StereoPannerNode;\n};\n\ninterface Storage {\n    readonly length: number;\n    clear(): void;\n    getItem(key: string): string | null;\n    key(index: number): string | null;\n    removeItem(key: string): void;\n    setItem(key: string, data: string): void;\n    [key: string]: any;\n    [index: number]: string;\n}\n\ndeclare var Storage: {\n    prototype: Storage;\n    new(): Storage;\n};\n\ninterface StorageEvent extends Event {\n    readonly url: string;\n    key?: string;\n    oldValue?: string;\n    newValue?: string;\n    storageArea?: Storage;\n}\n\ndeclare var StorageEvent: {\n    prototype: StorageEvent;\n    new (type: string, eventInitDict?: StorageEventInit): StorageEvent;\n};\n\ninterface StyleMedia {\n    readonly type: string;\n    matchMedium(mediaquery: string): boolean;\n}\n\ndeclare var StyleMedia: {\n    prototype: StyleMedia;\n    new(): StyleMedia;\n};\n\ninterface StyleSheet {\n    disabled: boolean;\n    readonly href: string;\n    readonly media: MediaList;\n    readonly ownerNode: Node;\n    readonly parentStyleSheet: StyleSheet;\n    readonly title: string;\n    readonly type: string;\n}\n\ndeclare var StyleSheet: {\n    prototype: StyleSheet;\n    new(): StyleSheet;\n};\n\ninterface StyleSheetList {\n    readonly length: number;\n    item(index?: number): StyleSheet;\n    [index: number]: StyleSheet;\n}\n\ndeclare var StyleSheetList: {\n    prototype: StyleSheetList;\n    new(): StyleSheetList;\n};\n\ninterface StyleSheetPageList {\n    readonly length: number;\n    item(index: number): CSSPageRule;\n    [index: number]: CSSPageRule;\n}\n\ndeclare var StyleSheetPageList: {\n    prototype: StyleSheetPageList;\n    new(): StyleSheetPageList;\n};\n\ninterface SubtleCrypto {\n    decrypt(algorithm: string | RsaOaepParams | AesCtrParams | AesCbcParams | AesCmacParams | AesGcmParams | AesCfbParams, key: CryptoKey, data: BufferSource): PromiseLike<ArrayBuffer>;\n    deriveBits(algorithm: string | EcdhKeyDeriveParams | DhKeyDeriveParams | ConcatParams | HkdfCtrParams | Pbkdf2Params, baseKey: CryptoKey, length: number): PromiseLike<ArrayBuffer>;\n    deriveKey(algorithm: string | EcdhKeyDeriveParams | DhKeyDeriveParams | ConcatParams | HkdfCtrParams | Pbkdf2Params, baseKey: CryptoKey, derivedKeyType: string | AesDerivedKeyParams | HmacImportParams | ConcatParams | HkdfCtrParams | Pbkdf2Params, extractable: boolean, keyUsages: string[]): PromiseLike<CryptoKey>;\n    digest(algorithm: AlgorithmIdentifier, data: BufferSource): PromiseLike<ArrayBuffer>;\n    encrypt(algorithm: string | RsaOaepParams | AesCtrParams | AesCbcParams | AesCmacParams | AesGcmParams | AesCfbParams, key: CryptoKey, data: BufferSource): PromiseLike<ArrayBuffer>;\n    exportKey(format: "jwk", key: CryptoKey): PromiseLike<JsonWebKey>;\n    exportKey(format: "raw" | "pkcs8" | "spki", key: CryptoKey): PromiseLike<ArrayBuffer>;\n    exportKey(format: string, key: CryptoKey): PromiseLike<JsonWebKey | ArrayBuffer>;\n    generateKey(algorithm: string, extractable: boolean, keyUsages: string[]): PromiseLike<CryptoKeyPair | CryptoKey>;\n    generateKey(algorithm: RsaHashedKeyGenParams | EcKeyGenParams | DhKeyGenParams, extractable: boolean, keyUsages: string[]): PromiseLike<CryptoKeyPair>;\n    generateKey(algorithm: AesKeyGenParams | HmacKeyGenParams | Pbkdf2Params, extractable: boolean, keyUsages: string[]): PromiseLike<CryptoKey>;\n    importKey(format: "jwk", keyData: JsonWebKey, algorithm: string | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | DhImportKeyParams, extractable: boolean, keyUsages: string[]): PromiseLike<CryptoKey>;\n    importKey(format: "raw" | "pkcs8" | "spki", keyData: BufferSource, algorithm: string | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | DhImportKeyParams, extractable: boolean, keyUsages: string[]): PromiseLike<CryptoKey>;\n    importKey(format: string, keyData: JsonWebKey | BufferSource, algorithm: string | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | DhImportKeyParams, extractable: boolean, keyUsages: string[]): PromiseLike<CryptoKey>;\n    sign(algorithm: string | RsaPssParams | EcdsaParams | AesCmacParams, key: CryptoKey, data: BufferSource): PromiseLike<ArrayBuffer>;\n    unwrapKey(format: string, wrappedKey: BufferSource, unwrappingKey: CryptoKey, unwrapAlgorithm: AlgorithmIdentifier, unwrappedKeyAlgorithm: AlgorithmIdentifier, extractable: boolean, keyUsages: string[]): PromiseLike<CryptoKey>;\n    verify(algorithm: string | RsaPssParams | EcdsaParams | AesCmacParams, key: CryptoKey, signature: BufferSource, data: BufferSource): PromiseLike<boolean>;\n    wrapKey(format: string, key: CryptoKey, wrappingKey: CryptoKey, wrapAlgorithm: AlgorithmIdentifier): PromiseLike<ArrayBuffer>;\n}\n\ndeclare var SubtleCrypto: {\n    prototype: SubtleCrypto;\n    new(): SubtleCrypto;\n};\n\ninterface SVGAElement extends SVGGraphicsElement, SVGURIReference {\n    readonly target: SVGAnimatedString;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGAElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGAElement: {\n    prototype: SVGAElement;\n    new(): SVGAElement;\n};\n\ninterface SVGAngle {\n    readonly unitType: number;\n    value: number;\n    valueAsString: string;\n    valueInSpecifiedUnits: number;\n    convertToSpecifiedUnits(unitType: number): void;\n    newValueSpecifiedUnits(unitType: number, valueInSpecifiedUnits: number): void;\n    readonly SVG_ANGLETYPE_DEG: number;\n    readonly SVG_ANGLETYPE_GRAD: number;\n    readonly SVG_ANGLETYPE_RAD: number;\n    readonly SVG_ANGLETYPE_UNKNOWN: number;\n    readonly SVG_ANGLETYPE_UNSPECIFIED: number;\n}\n\ndeclare var SVGAngle: {\n    prototype: SVGAngle;\n    new(): SVGAngle;\n    readonly SVG_ANGLETYPE_DEG: number;\n    readonly SVG_ANGLETYPE_GRAD: number;\n    readonly SVG_ANGLETYPE_RAD: number;\n    readonly SVG_ANGLETYPE_UNKNOWN: number;\n    readonly SVG_ANGLETYPE_UNSPECIFIED: number;\n};\n\ninterface SVGAnimatedAngle {\n    readonly animVal: SVGAngle;\n    readonly baseVal: SVGAngle;\n}\n\ndeclare var SVGAnimatedAngle: {\n    prototype: SVGAnimatedAngle;\n    new(): SVGAnimatedAngle;\n};\n\ninterface SVGAnimatedBoolean {\n    readonly animVal: boolean;\n    baseVal: boolean;\n}\n\ndeclare var SVGAnimatedBoolean: {\n    prototype: SVGAnimatedBoolean;\n    new(): SVGAnimatedBoolean;\n};\n\ninterface SVGAnimatedEnumeration {\n    readonly animVal: number;\n    baseVal: number;\n}\n\ndeclare var SVGAnimatedEnumeration: {\n    prototype: SVGAnimatedEnumeration;\n    new(): SVGAnimatedEnumeration;\n};\n\ninterface SVGAnimatedInteger {\n    readonly animVal: number;\n    baseVal: number;\n}\n\ndeclare var SVGAnimatedInteger: {\n    prototype: SVGAnimatedInteger;\n    new(): SVGAnimatedInteger;\n};\n\ninterface SVGAnimatedLength {\n    readonly animVal: SVGLength;\n    readonly baseVal: SVGLength;\n}\n\ndeclare var SVGAnimatedLength: {\n    prototype: SVGAnimatedLength;\n    new(): SVGAnimatedLength;\n};\n\ninterface SVGAnimatedLengthList {\n    readonly animVal: SVGLengthList;\n    readonly baseVal: SVGLengthList;\n}\n\ndeclare var SVGAnimatedLengthList: {\n    prototype: SVGAnimatedLengthList;\n    new(): SVGAnimatedLengthList;\n};\n\ninterface SVGAnimatedNumber {\n    readonly animVal: number;\n    baseVal: number;\n}\n\ndeclare var SVGAnimatedNumber: {\n    prototype: SVGAnimatedNumber;\n    new(): SVGAnimatedNumber;\n};\n\ninterface SVGAnimatedNumberList {\n    readonly animVal: SVGNumberList;\n    readonly baseVal: SVGNumberList;\n}\n\ndeclare var SVGAnimatedNumberList: {\n    prototype: SVGAnimatedNumberList;\n    new(): SVGAnimatedNumberList;\n};\n\ninterface SVGAnimatedPreserveAspectRatio {\n    readonly animVal: SVGPreserveAspectRatio;\n    readonly baseVal: SVGPreserveAspectRatio;\n}\n\ndeclare var SVGAnimatedPreserveAspectRatio: {\n    prototype: SVGAnimatedPreserveAspectRatio;\n    new(): SVGAnimatedPreserveAspectRatio;\n};\n\ninterface SVGAnimatedRect {\n    readonly animVal: SVGRect;\n    readonly baseVal: SVGRect;\n}\n\ndeclare var SVGAnimatedRect: {\n    prototype: SVGAnimatedRect;\n    new(): SVGAnimatedRect;\n};\n\ninterface SVGAnimatedString {\n    readonly animVal: string;\n    baseVal: string;\n}\n\ndeclare var SVGAnimatedString: {\n    prototype: SVGAnimatedString;\n    new(): SVGAnimatedString;\n};\n\ninterface SVGAnimatedTransformList {\n    readonly animVal: SVGTransformList;\n    readonly baseVal: SVGTransformList;\n}\n\ndeclare var SVGAnimatedTransformList: {\n    prototype: SVGAnimatedTransformList;\n    new(): SVGAnimatedTransformList;\n};\n\ninterface SVGCircleElement extends SVGGraphicsElement {\n    readonly cx: SVGAnimatedLength;\n    readonly cy: SVGAnimatedLength;\n    readonly r: SVGAnimatedLength;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGCircleElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGCircleElement: {\n    prototype: SVGCircleElement;\n    new(): SVGCircleElement;\n};\n\ninterface SVGClipPathElement extends SVGGraphicsElement, SVGUnitTypes {\n    readonly clipPathUnits: SVGAnimatedEnumeration;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGClipPathElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGClipPathElement: {\n    prototype: SVGClipPathElement;\n    new(): SVGClipPathElement;\n};\n\ninterface SVGComponentTransferFunctionElement extends SVGElement {\n    readonly amplitude: SVGAnimatedNumber;\n    readonly exponent: SVGAnimatedNumber;\n    readonly intercept: SVGAnimatedNumber;\n    readonly offset: SVGAnimatedNumber;\n    readonly slope: SVGAnimatedNumber;\n    readonly tableValues: SVGAnimatedNumberList;\n    readonly type: SVGAnimatedEnumeration;\n    readonly SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE: number;\n    readonly SVG_FECOMPONENTTRANSFER_TYPE_GAMMA: number;\n    readonly SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY: number;\n    readonly SVG_FECOMPONENTTRANSFER_TYPE_LINEAR: number;\n    readonly SVG_FECOMPONENTTRANSFER_TYPE_TABLE: number;\n    readonly SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN: number;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGComponentTransferFunctionElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGComponentTransferFunctionElement: {\n    prototype: SVGComponentTransferFunctionElement;\n    new(): SVGComponentTransferFunctionElement;\n    readonly SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE: number;\n    readonly SVG_FECOMPONENTTRANSFER_TYPE_GAMMA: number;\n    readonly SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY: number;\n    readonly SVG_FECOMPONENTTRANSFER_TYPE_LINEAR: number;\n    readonly SVG_FECOMPONENTTRANSFER_TYPE_TABLE: number;\n    readonly SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN: number;\n};\n\ninterface SVGDefsElement extends SVGGraphicsElement {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGDefsElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGDefsElement: {\n    prototype: SVGDefsElement;\n    new(): SVGDefsElement;\n};\n\ninterface SVGDescElement extends SVGElement {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGDescElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGDescElement: {\n    prototype: SVGDescElement;\n    new(): SVGDescElement;\n};\n\ninterface SVGElementEventMap extends ElementEventMap {\n    "click": MouseEvent;\n    "dblclick": MouseEvent;\n    "focusin": FocusEvent;\n    "focusout": FocusEvent;\n    "load": Event;\n    "mousedown": MouseEvent;\n    "mousemove": MouseEvent;\n    "mouseout": MouseEvent;\n    "mouseover": MouseEvent;\n    "mouseup": MouseEvent;\n}\n\ninterface SVGElement extends Element {\n    className: any;\n    onclick: (this: SVGElement, ev: MouseEvent) => any;\n    ondblclick: (this: SVGElement, ev: MouseEvent) => any;\n    onfocusin: (this: SVGElement, ev: FocusEvent) => any;\n    onfocusout: (this: SVGElement, ev: FocusEvent) => any;\n    onload: (this: SVGElement, ev: Event) => any;\n    onmousedown: (this: SVGElement, ev: MouseEvent) => any;\n    onmousemove: (this: SVGElement, ev: MouseEvent) => any;\n    onmouseout: (this: SVGElement, ev: MouseEvent) => any;\n    onmouseover: (this: SVGElement, ev: MouseEvent) => any;\n    onmouseup: (this: SVGElement, ev: MouseEvent) => any;\n    readonly ownerSVGElement: SVGSVGElement;\n    readonly style: CSSStyleDeclaration;\n    readonly viewportElement: SVGElement;\n    xmlbase: string;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGElement: {\n    prototype: SVGElement;\n    new(): SVGElement;\n};\n\ninterface SVGElementInstance extends EventTarget {\n    readonly childNodes: SVGElementInstanceList;\n    readonly correspondingElement: SVGElement;\n    readonly correspondingUseElement: SVGUseElement;\n    readonly firstChild: SVGElementInstance;\n    readonly lastChild: SVGElementInstance;\n    readonly nextSibling: SVGElementInstance;\n    readonly parentNode: SVGElementInstance;\n    readonly previousSibling: SVGElementInstance;\n}\n\ndeclare var SVGElementInstance: {\n    prototype: SVGElementInstance;\n    new(): SVGElementInstance;\n};\n\ninterface SVGElementInstanceList {\n    readonly length: number;\n    item(index: number): SVGElementInstance;\n}\n\ndeclare var SVGElementInstanceList: {\n    prototype: SVGElementInstanceList;\n    new(): SVGElementInstanceList;\n};\n\ninterface SVGEllipseElement extends SVGGraphicsElement {\n    readonly cx: SVGAnimatedLength;\n    readonly cy: SVGAnimatedLength;\n    readonly rx: SVGAnimatedLength;\n    readonly ry: SVGAnimatedLength;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGEllipseElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGEllipseElement: {\n    prototype: SVGEllipseElement;\n    new(): SVGEllipseElement;\n};\n\ninterface SVGFEBlendElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {\n    readonly in1: SVGAnimatedString;\n    readonly in2: SVGAnimatedString;\n    readonly mode: SVGAnimatedEnumeration;\n    readonly SVG_FEBLEND_MODE_COLOR: number;\n    readonly SVG_FEBLEND_MODE_COLOR_BURN: number;\n    readonly SVG_FEBLEND_MODE_COLOR_DODGE: number;\n    readonly SVG_FEBLEND_MODE_DARKEN: number;\n    readonly SVG_FEBLEND_MODE_DIFFERENCE: number;\n    readonly SVG_FEBLEND_MODE_EXCLUSION: number;\n    readonly SVG_FEBLEND_MODE_HARD_LIGHT: number;\n    readonly SVG_FEBLEND_MODE_HUE: number;\n    readonly SVG_FEBLEND_MODE_LIGHTEN: number;\n    readonly SVG_FEBLEND_MODE_LUMINOSITY: number;\n    readonly SVG_FEBLEND_MODE_MULTIPLY: number;\n    readonly SVG_FEBLEND_MODE_NORMAL: number;\n    readonly SVG_FEBLEND_MODE_OVERLAY: number;\n    readonly SVG_FEBLEND_MODE_SATURATION: number;\n    readonly SVG_FEBLEND_MODE_SCREEN: number;\n    readonly SVG_FEBLEND_MODE_SOFT_LIGHT: number;\n    readonly SVG_FEBLEND_MODE_UNKNOWN: number;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEBlendElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEBlendElement: {\n    prototype: SVGFEBlendElement;\n    new(): SVGFEBlendElement;\n    readonly SVG_FEBLEND_MODE_COLOR: number;\n    readonly SVG_FEBLEND_MODE_COLOR_BURN: number;\n    readonly SVG_FEBLEND_MODE_COLOR_DODGE: number;\n    readonly SVG_FEBLEND_MODE_DARKEN: number;\n    readonly SVG_FEBLEND_MODE_DIFFERENCE: number;\n    readonly SVG_FEBLEND_MODE_EXCLUSION: number;\n    readonly SVG_FEBLEND_MODE_HARD_LIGHT: number;\n    readonly SVG_FEBLEND_MODE_HUE: number;\n    readonly SVG_FEBLEND_MODE_LIGHTEN: number;\n    readonly SVG_FEBLEND_MODE_LUMINOSITY: number;\n    readonly SVG_FEBLEND_MODE_MULTIPLY: number;\n    readonly SVG_FEBLEND_MODE_NORMAL: number;\n    readonly SVG_FEBLEND_MODE_OVERLAY: number;\n    readonly SVG_FEBLEND_MODE_SATURATION: number;\n    readonly SVG_FEBLEND_MODE_SCREEN: number;\n    readonly SVG_FEBLEND_MODE_SOFT_LIGHT: number;\n    readonly SVG_FEBLEND_MODE_UNKNOWN: number;\n};\n\ninterface SVGFEColorMatrixElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {\n    readonly in1: SVGAnimatedString;\n    readonly type: SVGAnimatedEnumeration;\n    readonly values: SVGAnimatedNumberList;\n    readonly SVG_FECOLORMATRIX_TYPE_HUEROTATE: number;\n    readonly SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA: number;\n    readonly SVG_FECOLORMATRIX_TYPE_MATRIX: number;\n    readonly SVG_FECOLORMATRIX_TYPE_SATURATE: number;\n    readonly SVG_FECOLORMATRIX_TYPE_UNKNOWN: number;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEColorMatrixElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEColorMatrixElement: {\n    prototype: SVGFEColorMatrixElement;\n    new(): SVGFEColorMatrixElement;\n    readonly SVG_FECOLORMATRIX_TYPE_HUEROTATE: number;\n    readonly SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA: number;\n    readonly SVG_FECOLORMATRIX_TYPE_MATRIX: number;\n    readonly SVG_FECOLORMATRIX_TYPE_SATURATE: number;\n    readonly SVG_FECOLORMATRIX_TYPE_UNKNOWN: number;\n};\n\ninterface SVGFEComponentTransferElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {\n    readonly in1: SVGAnimatedString;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEComponentTransferElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEComponentTransferElement: {\n    prototype: SVGFEComponentTransferElement;\n    new(): SVGFEComponentTransferElement;\n};\n\ninterface SVGFECompositeElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {\n    readonly in1: SVGAnimatedString;\n    readonly in2: SVGAnimatedString;\n    readonly k1: SVGAnimatedNumber;\n    readonly k2: SVGAnimatedNumber;\n    readonly k3: SVGAnimatedNumber;\n    readonly k4: SVGAnimatedNumber;\n    readonly operator: SVGAnimatedEnumeration;\n    readonly SVG_FECOMPOSITE_OPERATOR_ARITHMETIC: number;\n    readonly SVG_FECOMPOSITE_OPERATOR_ATOP: number;\n    readonly SVG_FECOMPOSITE_OPERATOR_IN: number;\n    readonly SVG_FECOMPOSITE_OPERATOR_OUT: number;\n    readonly SVG_FECOMPOSITE_OPERATOR_OVER: number;\n    readonly SVG_FECOMPOSITE_OPERATOR_UNKNOWN: number;\n    readonly SVG_FECOMPOSITE_OPERATOR_XOR: number;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFECompositeElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFECompositeElement: {\n    prototype: SVGFECompositeElement;\n    new(): SVGFECompositeElement;\n    readonly SVG_FECOMPOSITE_OPERATOR_ARITHMETIC: number;\n    readonly SVG_FECOMPOSITE_OPERATOR_ATOP: number;\n    readonly SVG_FECOMPOSITE_OPERATOR_IN: number;\n    readonly SVG_FECOMPOSITE_OPERATOR_OUT: number;\n    readonly SVG_FECOMPOSITE_OPERATOR_OVER: number;\n    readonly SVG_FECOMPOSITE_OPERATOR_UNKNOWN: number;\n    readonly SVG_FECOMPOSITE_OPERATOR_XOR: number;\n};\n\ninterface SVGFEConvolveMatrixElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {\n    readonly bias: SVGAnimatedNumber;\n    readonly divisor: SVGAnimatedNumber;\n    readonly edgeMode: SVGAnimatedEnumeration;\n    readonly in1: SVGAnimatedString;\n    readonly kernelMatrix: SVGAnimatedNumberList;\n    readonly kernelUnitLengthX: SVGAnimatedNumber;\n    readonly kernelUnitLengthY: SVGAnimatedNumber;\n    readonly orderX: SVGAnimatedInteger;\n    readonly orderY: SVGAnimatedInteger;\n    readonly preserveAlpha: SVGAnimatedBoolean;\n    readonly targetX: SVGAnimatedInteger;\n    readonly targetY: SVGAnimatedInteger;\n    readonly SVG_EDGEMODE_DUPLICATE: number;\n    readonly SVG_EDGEMODE_NONE: number;\n    readonly SVG_EDGEMODE_UNKNOWN: number;\n    readonly SVG_EDGEMODE_WRAP: number;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEConvolveMatrixElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEConvolveMatrixElement: {\n    prototype: SVGFEConvolveMatrixElement;\n    new(): SVGFEConvolveMatrixElement;\n    readonly SVG_EDGEMODE_DUPLICATE: number;\n    readonly SVG_EDGEMODE_NONE: number;\n    readonly SVG_EDGEMODE_UNKNOWN: number;\n    readonly SVG_EDGEMODE_WRAP: number;\n};\n\ninterface SVGFEDiffuseLightingElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {\n    readonly diffuseConstant: SVGAnimatedNumber;\n    readonly in1: SVGAnimatedString;\n    readonly kernelUnitLengthX: SVGAnimatedNumber;\n    readonly kernelUnitLengthY: SVGAnimatedNumber;\n    readonly surfaceScale: SVGAnimatedNumber;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEDiffuseLightingElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEDiffuseLightingElement: {\n    prototype: SVGFEDiffuseLightingElement;\n    new(): SVGFEDiffuseLightingElement;\n};\n\ninterface SVGFEDisplacementMapElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {\n    readonly in1: SVGAnimatedString;\n    readonly in2: SVGAnimatedString;\n    readonly scale: SVGAnimatedNumber;\n    readonly xChannelSelector: SVGAnimatedEnumeration;\n    readonly yChannelSelector: SVGAnimatedEnumeration;\n    readonly SVG_CHANNEL_A: number;\n    readonly SVG_CHANNEL_B: number;\n    readonly SVG_CHANNEL_G: number;\n    readonly SVG_CHANNEL_R: number;\n    readonly SVG_CHANNEL_UNKNOWN: number;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEDisplacementMapElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEDisplacementMapElement: {\n    prototype: SVGFEDisplacementMapElement;\n    new(): SVGFEDisplacementMapElement;\n    readonly SVG_CHANNEL_A: number;\n    readonly SVG_CHANNEL_B: number;\n    readonly SVG_CHANNEL_G: number;\n    readonly SVG_CHANNEL_R: number;\n    readonly SVG_CHANNEL_UNKNOWN: number;\n};\n\ninterface SVGFEDistantLightElement extends SVGElement {\n    readonly azimuth: SVGAnimatedNumber;\n    readonly elevation: SVGAnimatedNumber;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEDistantLightElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEDistantLightElement: {\n    prototype: SVGFEDistantLightElement;\n    new(): SVGFEDistantLightElement;\n};\n\ninterface SVGFEFloodElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEFloodElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEFloodElement: {\n    prototype: SVGFEFloodElement;\n    new(): SVGFEFloodElement;\n};\n\ninterface SVGFEFuncAElement extends SVGComponentTransferFunctionElement {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEFuncAElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEFuncAElement: {\n    prototype: SVGFEFuncAElement;\n    new(): SVGFEFuncAElement;\n};\n\ninterface SVGFEFuncBElement extends SVGComponentTransferFunctionElement {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEFuncBElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEFuncBElement: {\n    prototype: SVGFEFuncBElement;\n    new(): SVGFEFuncBElement;\n};\n\ninterface SVGFEFuncGElement extends SVGComponentTransferFunctionElement {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEFuncGElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEFuncGElement: {\n    prototype: SVGFEFuncGElement;\n    new(): SVGFEFuncGElement;\n};\n\ninterface SVGFEFuncRElement extends SVGComponentTransferFunctionElement {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEFuncRElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEFuncRElement: {\n    prototype: SVGFEFuncRElement;\n    new(): SVGFEFuncRElement;\n};\n\ninterface SVGFEGaussianBlurElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {\n    readonly in1: SVGAnimatedString;\n    readonly stdDeviationX: SVGAnimatedNumber;\n    readonly stdDeviationY: SVGAnimatedNumber;\n    setStdDeviation(stdDeviationX: number, stdDeviationY: number): void;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEGaussianBlurElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEGaussianBlurElement: {\n    prototype: SVGFEGaussianBlurElement;\n    new(): SVGFEGaussianBlurElement;\n};\n\ninterface SVGFEImageElement extends SVGElement, SVGFilterPrimitiveStandardAttributes, SVGURIReference {\n    readonly preserveAspectRatio: SVGAnimatedPreserveAspectRatio;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEImageElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEImageElement: {\n    prototype: SVGFEImageElement;\n    new(): SVGFEImageElement;\n};\n\ninterface SVGFEMergeElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEMergeElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEMergeElement: {\n    prototype: SVGFEMergeElement;\n    new(): SVGFEMergeElement;\n};\n\ninterface SVGFEMergeNodeElement extends SVGElement {\n    readonly in1: SVGAnimatedString;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEMergeNodeElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEMergeNodeElement: {\n    prototype: SVGFEMergeNodeElement;\n    new(): SVGFEMergeNodeElement;\n};\n\ninterface SVGFEMorphologyElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {\n    readonly in1: SVGAnimatedString;\n    readonly operator: SVGAnimatedEnumeration;\n    readonly radiusX: SVGAnimatedNumber;\n    readonly radiusY: SVGAnimatedNumber;\n    readonly SVG_MORPHOLOGY_OPERATOR_DILATE: number;\n    readonly SVG_MORPHOLOGY_OPERATOR_ERODE: number;\n    readonly SVG_MORPHOLOGY_OPERATOR_UNKNOWN: number;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEMorphologyElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEMorphologyElement: {\n    prototype: SVGFEMorphologyElement;\n    new(): SVGFEMorphologyElement;\n    readonly SVG_MORPHOLOGY_OPERATOR_DILATE: number;\n    readonly SVG_MORPHOLOGY_OPERATOR_ERODE: number;\n    readonly SVG_MORPHOLOGY_OPERATOR_UNKNOWN: number;\n};\n\ninterface SVGFEOffsetElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {\n    readonly dx: SVGAnimatedNumber;\n    readonly dy: SVGAnimatedNumber;\n    readonly in1: SVGAnimatedString;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEOffsetElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEOffsetElement: {\n    prototype: SVGFEOffsetElement;\n    new(): SVGFEOffsetElement;\n};\n\ninterface SVGFEPointLightElement extends SVGElement {\n    readonly x: SVGAnimatedNumber;\n    readonly y: SVGAnimatedNumber;\n    readonly z: SVGAnimatedNumber;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEPointLightElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFEPointLightElement: {\n    prototype: SVGFEPointLightElement;\n    new(): SVGFEPointLightElement;\n};\n\ninterface SVGFESpecularLightingElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {\n    readonly in1: SVGAnimatedString;\n    readonly kernelUnitLengthX: SVGAnimatedNumber;\n    readonly kernelUnitLengthY: SVGAnimatedNumber;\n    readonly specularConstant: SVGAnimatedNumber;\n    readonly specularExponent: SVGAnimatedNumber;\n    readonly surfaceScale: SVGAnimatedNumber;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFESpecularLightingElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFESpecularLightingElement: {\n    prototype: SVGFESpecularLightingElement;\n    new(): SVGFESpecularLightingElement;\n};\n\ninterface SVGFESpotLightElement extends SVGElement {\n    readonly limitingConeAngle: SVGAnimatedNumber;\n    readonly pointsAtX: SVGAnimatedNumber;\n    readonly pointsAtY: SVGAnimatedNumber;\n    readonly pointsAtZ: SVGAnimatedNumber;\n    readonly specularExponent: SVGAnimatedNumber;\n    readonly x: SVGAnimatedNumber;\n    readonly y: SVGAnimatedNumber;\n    readonly z: SVGAnimatedNumber;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFESpotLightElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFESpotLightElement: {\n    prototype: SVGFESpotLightElement;\n    new(): SVGFESpotLightElement;\n};\n\ninterface SVGFETileElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {\n    readonly in1: SVGAnimatedString;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFETileElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFETileElement: {\n    prototype: SVGFETileElement;\n    new(): SVGFETileElement;\n};\n\ninterface SVGFETurbulenceElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {\n    readonly baseFrequencyX: SVGAnimatedNumber;\n    readonly baseFrequencyY: SVGAnimatedNumber;\n    readonly numOctaves: SVGAnimatedInteger;\n    readonly seed: SVGAnimatedNumber;\n    readonly stitchTiles: SVGAnimatedEnumeration;\n    readonly type: SVGAnimatedEnumeration;\n    readonly SVG_STITCHTYPE_NOSTITCH: number;\n    readonly SVG_STITCHTYPE_STITCH: number;\n    readonly SVG_STITCHTYPE_UNKNOWN: number;\n    readonly SVG_TURBULENCE_TYPE_FRACTALNOISE: number;\n    readonly SVG_TURBULENCE_TYPE_TURBULENCE: number;\n    readonly SVG_TURBULENCE_TYPE_UNKNOWN: number;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFETurbulenceElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFETurbulenceElement: {\n    prototype: SVGFETurbulenceElement;\n    new(): SVGFETurbulenceElement;\n    readonly SVG_STITCHTYPE_NOSTITCH: number;\n    readonly SVG_STITCHTYPE_STITCH: number;\n    readonly SVG_STITCHTYPE_UNKNOWN: number;\n    readonly SVG_TURBULENCE_TYPE_FRACTALNOISE: number;\n    readonly SVG_TURBULENCE_TYPE_TURBULENCE: number;\n    readonly SVG_TURBULENCE_TYPE_UNKNOWN: number;\n};\n\ninterface SVGFilterElement extends SVGElement, SVGUnitTypes, SVGURIReference {\n    readonly filterResX: SVGAnimatedInteger;\n    readonly filterResY: SVGAnimatedInteger;\n    readonly filterUnits: SVGAnimatedEnumeration;\n    readonly height: SVGAnimatedLength;\n    readonly primitiveUnits: SVGAnimatedEnumeration;\n    readonly width: SVGAnimatedLength;\n    readonly x: SVGAnimatedLength;\n    readonly y: SVGAnimatedLength;\n    setFilterRes(filterResX: number, filterResY: number): void;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFilterElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGFilterElement: {\n    prototype: SVGFilterElement;\n    new(): SVGFilterElement;\n};\n\ninterface SVGForeignObjectElement extends SVGGraphicsElement {\n    readonly height: SVGAnimatedLength;\n    readonly width: SVGAnimatedLength;\n    readonly x: SVGAnimatedLength;\n    readonly y: SVGAnimatedLength;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGForeignObjectElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGForeignObjectElement: {\n    prototype: SVGForeignObjectElement;\n    new(): SVGForeignObjectElement;\n};\n\ninterface SVGGElement extends SVGGraphicsElement {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGGElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGGElement: {\n    prototype: SVGGElement;\n    new(): SVGGElement;\n};\n\ninterface SVGGradientElement extends SVGElement, SVGUnitTypes, SVGURIReference {\n    readonly gradientTransform: SVGAnimatedTransformList;\n    readonly gradientUnits: SVGAnimatedEnumeration;\n    readonly spreadMethod: SVGAnimatedEnumeration;\n    readonly SVG_SPREADMETHOD_PAD: number;\n    readonly SVG_SPREADMETHOD_REFLECT: number;\n    readonly SVG_SPREADMETHOD_REPEAT: number;\n    readonly SVG_SPREADMETHOD_UNKNOWN: number;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGGradientElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGGradientElement: {\n    prototype: SVGGradientElement;\n    new(): SVGGradientElement;\n    readonly SVG_SPREADMETHOD_PAD: number;\n    readonly SVG_SPREADMETHOD_REFLECT: number;\n    readonly SVG_SPREADMETHOD_REPEAT: number;\n    readonly SVG_SPREADMETHOD_UNKNOWN: number;\n};\n\ninterface SVGGraphicsElement extends SVGElement, SVGTests {\n    readonly farthestViewportElement: SVGElement;\n    readonly nearestViewportElement: SVGElement;\n    readonly transform: SVGAnimatedTransformList;\n    getBBox(): SVGRect;\n    getCTM(): SVGMatrix;\n    getScreenCTM(): SVGMatrix;\n    getTransformToElement(element: SVGElement): SVGMatrix;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGGraphicsElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGGraphicsElement: {\n    prototype: SVGGraphicsElement;\n    new(): SVGGraphicsElement;\n};\n\ninterface SVGImageElement extends SVGGraphicsElement, SVGURIReference {\n    readonly height: SVGAnimatedLength;\n    readonly preserveAspectRatio: SVGAnimatedPreserveAspectRatio;\n    readonly width: SVGAnimatedLength;\n    readonly x: SVGAnimatedLength;\n    readonly y: SVGAnimatedLength;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGImageElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGImageElement: {\n    prototype: SVGImageElement;\n    new(): SVGImageElement;\n};\n\ninterface SVGLength {\n    readonly unitType: number;\n    value: number;\n    valueAsString: string;\n    valueInSpecifiedUnits: number;\n    convertToSpecifiedUnits(unitType: number): void;\n    newValueSpecifiedUnits(unitType: number, valueInSpecifiedUnits: number): void;\n    readonly SVG_LENGTHTYPE_CM: number;\n    readonly SVG_LENGTHTYPE_EMS: number;\n    readonly SVG_LENGTHTYPE_EXS: number;\n    readonly SVG_LENGTHTYPE_IN: number;\n    readonly SVG_LENGTHTYPE_MM: number;\n    readonly SVG_LENGTHTYPE_NUMBER: number;\n    readonly SVG_LENGTHTYPE_PC: number;\n    readonly SVG_LENGTHTYPE_PERCENTAGE: number;\n    readonly SVG_LENGTHTYPE_PT: number;\n    readonly SVG_LENGTHTYPE_PX: number;\n    readonly SVG_LENGTHTYPE_UNKNOWN: number;\n}\n\ndeclare var SVGLength: {\n    prototype: SVGLength;\n    new(): SVGLength;\n    readonly SVG_LENGTHTYPE_CM: number;\n    readonly SVG_LENGTHTYPE_EMS: number;\n    readonly SVG_LENGTHTYPE_EXS: number;\n    readonly SVG_LENGTHTYPE_IN: number;\n    readonly SVG_LENGTHTYPE_MM: number;\n    readonly SVG_LENGTHTYPE_NUMBER: number;\n    readonly SVG_LENGTHTYPE_PC: number;\n    readonly SVG_LENGTHTYPE_PERCENTAGE: number;\n    readonly SVG_LENGTHTYPE_PT: number;\n    readonly SVG_LENGTHTYPE_PX: number;\n    readonly SVG_LENGTHTYPE_UNKNOWN: number;\n};\n\ninterface SVGLengthList {\n    readonly numberOfItems: number;\n    appendItem(newItem: SVGLength): SVGLength;\n    clear(): void;\n    getItem(index: number): SVGLength;\n    initialize(newItem: SVGLength): SVGLength;\n    insertItemBefore(newItem: SVGLength, index: number): SVGLength;\n    removeItem(index: number): SVGLength;\n    replaceItem(newItem: SVGLength, index: number): SVGLength;\n}\n\ndeclare var SVGLengthList: {\n    prototype: SVGLengthList;\n    new(): SVGLengthList;\n};\n\ninterface SVGLinearGradientElement extends SVGGradientElement {\n    readonly x1: SVGAnimatedLength;\n    readonly x2: SVGAnimatedLength;\n    readonly y1: SVGAnimatedLength;\n    readonly y2: SVGAnimatedLength;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGLinearGradientElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGLinearGradientElement: {\n    prototype: SVGLinearGradientElement;\n    new(): SVGLinearGradientElement;\n};\n\ninterface SVGLineElement extends SVGGraphicsElement {\n    readonly x1: SVGAnimatedLength;\n    readonly x2: SVGAnimatedLength;\n    readonly y1: SVGAnimatedLength;\n    readonly y2: SVGAnimatedLength;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGLineElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGLineElement: {\n    prototype: SVGLineElement;\n    new(): SVGLineElement;\n};\n\ninterface SVGMarkerElement extends SVGElement, SVGFitToViewBox {\n    readonly markerHeight: SVGAnimatedLength;\n    readonly markerUnits: SVGAnimatedEnumeration;\n    readonly markerWidth: SVGAnimatedLength;\n    readonly orientAngle: SVGAnimatedAngle;\n    readonly orientType: SVGAnimatedEnumeration;\n    readonly refX: SVGAnimatedLength;\n    readonly refY: SVGAnimatedLength;\n    setOrientToAngle(angle: SVGAngle): void;\n    setOrientToAuto(): void;\n    readonly SVG_MARKER_ORIENT_ANGLE: number;\n    readonly SVG_MARKER_ORIENT_AUTO: number;\n    readonly SVG_MARKER_ORIENT_UNKNOWN: number;\n    readonly SVG_MARKERUNITS_STROKEWIDTH: number;\n    readonly SVG_MARKERUNITS_UNKNOWN: number;\n    readonly SVG_MARKERUNITS_USERSPACEONUSE: number;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGMarkerElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGMarkerElement: {\n    prototype: SVGMarkerElement;\n    new(): SVGMarkerElement;\n    readonly SVG_MARKER_ORIENT_ANGLE: number;\n    readonly SVG_MARKER_ORIENT_AUTO: number;\n    readonly SVG_MARKER_ORIENT_UNKNOWN: number;\n    readonly SVG_MARKERUNITS_STROKEWIDTH: number;\n    readonly SVG_MARKERUNITS_UNKNOWN: number;\n    readonly SVG_MARKERUNITS_USERSPACEONUSE: number;\n};\n\ninterface SVGMaskElement extends SVGElement, SVGTests, SVGUnitTypes {\n    readonly height: SVGAnimatedLength;\n    readonly maskContentUnits: SVGAnimatedEnumeration;\n    readonly maskUnits: SVGAnimatedEnumeration;\n    readonly width: SVGAnimatedLength;\n    readonly x: SVGAnimatedLength;\n    readonly y: SVGAnimatedLength;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGMaskElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGMaskElement: {\n    prototype: SVGMaskElement;\n    new(): SVGMaskElement;\n};\n\ninterface SVGMatrix {\n    a: number;\n    b: number;\n    c: number;\n    d: number;\n    e: number;\n    f: number;\n    flipX(): SVGMatrix;\n    flipY(): SVGMatrix;\n    inverse(): SVGMatrix;\n    multiply(secondMatrix: SVGMatrix): SVGMatrix;\n    rotate(angle: number): SVGMatrix;\n    rotateFromVector(x: number, y: number): SVGMatrix;\n    scale(scaleFactor: number): SVGMatrix;\n    scaleNonUniform(scaleFactorX: number, scaleFactorY: number): SVGMatrix;\n    skewX(angle: number): SVGMatrix;\n    skewY(angle: number): SVGMatrix;\n    translate(x: number, y: number): SVGMatrix;\n}\n\ndeclare var SVGMatrix: {\n    prototype: SVGMatrix;\n    new(): SVGMatrix;\n};\n\ninterface SVGMetadataElement extends SVGElement {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGMetadataElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGMetadataElement: {\n    prototype: SVGMetadataElement;\n    new(): SVGMetadataElement;\n};\n\ninterface SVGNumber {\n    value: number;\n}\n\ndeclare var SVGNumber: {\n    prototype: SVGNumber;\n    new(): SVGNumber;\n};\n\ninterface SVGNumberList {\n    readonly numberOfItems: number;\n    appendItem(newItem: SVGNumber): SVGNumber;\n    clear(): void;\n    getItem(index: number): SVGNumber;\n    initialize(newItem: SVGNumber): SVGNumber;\n    insertItemBefore(newItem: SVGNumber, index: number): SVGNumber;\n    removeItem(index: number): SVGNumber;\n    replaceItem(newItem: SVGNumber, index: number): SVGNumber;\n}\n\ndeclare var SVGNumberList: {\n    prototype: SVGNumberList;\n    new(): SVGNumberList;\n};\n\ninterface SVGPathElement extends SVGGraphicsElement {\n    readonly pathSegList: SVGPathSegList;\n    createSVGPathSegArcAbs(x: number, y: number, r1: number, r2: number, angle: number, largeArcFlag: boolean, sweepFlag: boolean): SVGPathSegArcAbs;\n    createSVGPathSegArcRel(x: number, y: number, r1: number, r2: number, angle: number, largeArcFlag: boolean, sweepFlag: boolean): SVGPathSegArcRel;\n    createSVGPathSegClosePath(): SVGPathSegClosePath;\n    createSVGPathSegCurvetoCubicAbs(x: number, y: number, x1: number, y1: number, x2: number, y2: number): SVGPathSegCurvetoCubicAbs;\n    createSVGPathSegCurvetoCubicRel(x: number, y: number, x1: number, y1: number, x2: number, y2: number): SVGPathSegCurvetoCubicRel;\n    createSVGPathSegCurvetoCubicSmoothAbs(x: number, y: number, x2: number, y2: number): SVGPathSegCurvetoCubicSmoothAbs;\n    createSVGPathSegCurvetoCubicSmoothRel(x: number, y: number, x2: number, y2: number): SVGPathSegCurvetoCubicSmoothRel;\n    createSVGPathSegCurvetoQuadraticAbs(x: number, y: number, x1: number, y1: number): SVGPathSegCurvetoQuadraticAbs;\n    createSVGPathSegCurvetoQuadraticRel(x: number, y: number, x1: number, y1: number): SVGPathSegCurvetoQuadraticRel;\n    createSVGPathSegCurvetoQuadraticSmoothAbs(x: number, y: number): SVGPathSegCurvetoQuadraticSmoothAbs;\n    createSVGPathSegCurvetoQuadraticSmoothRel(x: number, y: number): SVGPathSegCurvetoQuadraticSmoothRel;\n    createSVGPathSegLinetoAbs(x: number, y: number): SVGPathSegLinetoAbs;\n    createSVGPathSegLinetoHorizontalAbs(x: number): SVGPathSegLinetoHorizontalAbs;\n    createSVGPathSegLinetoHorizontalRel(x: number): SVGPathSegLinetoHorizontalRel;\n    createSVGPathSegLinetoRel(x: number, y: number): SVGPathSegLinetoRel;\n    createSVGPathSegLinetoVerticalAbs(y: number): SVGPathSegLinetoVerticalAbs;\n    createSVGPathSegLinetoVerticalRel(y: number): SVGPathSegLinetoVerticalRel;\n    createSVGPathSegMovetoAbs(x: number, y: number): SVGPathSegMovetoAbs;\n    createSVGPathSegMovetoRel(x: number, y: number): SVGPathSegMovetoRel;\n    getPathSegAtLength(distance: number): number;\n    getPointAtLength(distance: number): SVGPoint;\n    getTotalLength(): number;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGPathElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGPathElement: {\n    prototype: SVGPathElement;\n    new(): SVGPathElement;\n};\n\ninterface SVGPathSeg {\n    readonly pathSegType: number;\n    readonly pathSegTypeAsLetter: string;\n    readonly PATHSEG_ARC_ABS: number;\n    readonly PATHSEG_ARC_REL: number;\n    readonly PATHSEG_CLOSEPATH: number;\n    readonly PATHSEG_CURVETO_CUBIC_ABS: number;\n    readonly PATHSEG_CURVETO_CUBIC_REL: number;\n    readonly PATHSEG_CURVETO_CUBIC_SMOOTH_ABS: number;\n    readonly PATHSEG_CURVETO_CUBIC_SMOOTH_REL: number;\n    readonly PATHSEG_CURVETO_QUADRATIC_ABS: number;\n    readonly PATHSEG_CURVETO_QUADRATIC_REL: number;\n    readonly PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS: number;\n    readonly PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL: number;\n    readonly PATHSEG_LINETO_ABS: number;\n    readonly PATHSEG_LINETO_HORIZONTAL_ABS: number;\n    readonly PATHSEG_LINETO_HORIZONTAL_REL: number;\n    readonly PATHSEG_LINETO_REL: number;\n    readonly PATHSEG_LINETO_VERTICAL_ABS: number;\n    readonly PATHSEG_LINETO_VERTICAL_REL: number;\n    readonly PATHSEG_MOVETO_ABS: number;\n    readonly PATHSEG_MOVETO_REL: number;\n    readonly PATHSEG_UNKNOWN: number;\n}\n\ndeclare var SVGPathSeg: {\n    prototype: SVGPathSeg;\n    new(): SVGPathSeg;\n    readonly PATHSEG_ARC_ABS: number;\n    readonly PATHSEG_ARC_REL: number;\n    readonly PATHSEG_CLOSEPATH: number;\n    readonly PATHSEG_CURVETO_CUBIC_ABS: number;\n    readonly PATHSEG_CURVETO_CUBIC_REL: number;\n    readonly PATHSEG_CURVETO_CUBIC_SMOOTH_ABS: number;\n    readonly PATHSEG_CURVETO_CUBIC_SMOOTH_REL: number;\n    readonly PATHSEG_CURVETO_QUADRATIC_ABS: number;\n    readonly PATHSEG_CURVETO_QUADRATIC_REL: number;\n    readonly PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS: number;\n    readonly PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL: number;\n    readonly PATHSEG_LINETO_ABS: number;\n    readonly PATHSEG_LINETO_HORIZONTAL_ABS: number;\n    readonly PATHSEG_LINETO_HORIZONTAL_REL: number;\n    readonly PATHSEG_LINETO_REL: number;\n    readonly PATHSEG_LINETO_VERTICAL_ABS: number;\n    readonly PATHSEG_LINETO_VERTICAL_REL: number;\n    readonly PATHSEG_MOVETO_ABS: number;\n    readonly PATHSEG_MOVETO_REL: number;\n    readonly PATHSEG_UNKNOWN: number;\n};\n\ninterface SVGPathSegArcAbs extends SVGPathSeg {\n    angle: number;\n    largeArcFlag: boolean;\n    r1: number;\n    r2: number;\n    sweepFlag: boolean;\n    x: number;\n    y: number;\n}\n\ndeclare var SVGPathSegArcAbs: {\n    prototype: SVGPathSegArcAbs;\n    new(): SVGPathSegArcAbs;\n};\n\ninterface SVGPathSegArcRel extends SVGPathSeg {\n    angle: number;\n    largeArcFlag: boolean;\n    r1: number;\n    r2: number;\n    sweepFlag: boolean;\n    x: number;\n    y: number;\n}\n\ndeclare var SVGPathSegArcRel: {\n    prototype: SVGPathSegArcRel;\n    new(): SVGPathSegArcRel;\n};\n\ninterface SVGPathSegClosePath extends SVGPathSeg {\n}\n\ndeclare var SVGPathSegClosePath: {\n    prototype: SVGPathSegClosePath;\n    new(): SVGPathSegClosePath;\n};\n\ninterface SVGPathSegCurvetoCubicAbs extends SVGPathSeg {\n    x: number;\n    x1: number;\n    x2: number;\n    y: number;\n    y1: number;\n    y2: number;\n}\n\ndeclare var SVGPathSegCurvetoCubicAbs: {\n    prototype: SVGPathSegCurvetoCubicAbs;\n    new(): SVGPathSegCurvetoCubicAbs;\n};\n\ninterface SVGPathSegCurvetoCubicRel extends SVGPathSeg {\n    x: number;\n    x1: number;\n    x2: number;\n    y: number;\n    y1: number;\n    y2: number;\n}\n\ndeclare var SVGPathSegCurvetoCubicRel: {\n    prototype: SVGPathSegCurvetoCubicRel;\n    new(): SVGPathSegCurvetoCubicRel;\n};\n\ninterface SVGPathSegCurvetoCubicSmoothAbs extends SVGPathSeg {\n    x: number;\n    x2: number;\n    y: number;\n    y2: number;\n}\n\ndeclare var SVGPathSegCurvetoCubicSmoothAbs: {\n    prototype: SVGPathSegCurvetoCubicSmoothAbs;\n    new(): SVGPathSegCurvetoCubicSmoothAbs;\n};\n\ninterface SVGPathSegCurvetoCubicSmoothRel extends SVGPathSeg {\n    x: number;\n    x2: number;\n    y: number;\n    y2: number;\n}\n\ndeclare var SVGPathSegCurvetoCubicSmoothRel: {\n    prototype: SVGPathSegCurvetoCubicSmoothRel;\n    new(): SVGPathSegCurvetoCubicSmoothRel;\n};\n\ninterface SVGPathSegCurvetoQuadraticAbs extends SVGPathSeg {\n    x: number;\n    x1: number;\n    y: number;\n    y1: number;\n}\n\ndeclare var SVGPathSegCurvetoQuadraticAbs: {\n    prototype: SVGPathSegCurvetoQuadraticAbs;\n    new(): SVGPathSegCurvetoQuadraticAbs;\n};\n\ninterface SVGPathSegCurvetoQuadraticRel extends SVGPathSeg {\n    x: number;\n    x1: number;\n    y: number;\n    y1: number;\n}\n\ndeclare var SVGPathSegCurvetoQuadraticRel: {\n    prototype: SVGPathSegCurvetoQuadraticRel;\n    new(): SVGPathSegCurvetoQuadraticRel;\n};\n\ninterface SVGPathSegCurvetoQuadraticSmoothAbs extends SVGPathSeg {\n    x: number;\n    y: number;\n}\n\ndeclare var SVGPathSegCurvetoQuadraticSmoothAbs: {\n    prototype: SVGPathSegCurvetoQuadraticSmoothAbs;\n    new(): SVGPathSegCurvetoQuadraticSmoothAbs;\n};\n\ninterface SVGPathSegCurvetoQuadraticSmoothRel extends SVGPathSeg {\n    x: number;\n    y: number;\n}\n\ndeclare var SVGPathSegCurvetoQuadraticSmoothRel: {\n    prototype: SVGPathSegCurvetoQuadraticSmoothRel;\n    new(): SVGPathSegCurvetoQuadraticSmoothRel;\n};\n\ninterface SVGPathSegLinetoAbs extends SVGPathSeg {\n    x: number;\n    y: number;\n}\n\ndeclare var SVGPathSegLinetoAbs: {\n    prototype: SVGPathSegLinetoAbs;\n    new(): SVGPathSegLinetoAbs;\n};\n\ninterface SVGPathSegLinetoHorizontalAbs extends SVGPathSeg {\n    x: number;\n}\n\ndeclare var SVGPathSegLinetoHorizontalAbs: {\n    prototype: SVGPathSegLinetoHorizontalAbs;\n    new(): SVGPathSegLinetoHorizontalAbs;\n};\n\ninterface SVGPathSegLinetoHorizontalRel extends SVGPathSeg {\n    x: number;\n}\n\ndeclare var SVGPathSegLinetoHorizontalRel: {\n    prototype: SVGPathSegLinetoHorizontalRel;\n    new(): SVGPathSegLinetoHorizontalRel;\n};\n\ninterface SVGPathSegLinetoRel extends SVGPathSeg {\n    x: number;\n    y: number;\n}\n\ndeclare var SVGPathSegLinetoRel: {\n    prototype: SVGPathSegLinetoRel;\n    new(): SVGPathSegLinetoRel;\n};\n\ninterface SVGPathSegLinetoVerticalAbs extends SVGPathSeg {\n    y: number;\n}\n\ndeclare var SVGPathSegLinetoVerticalAbs: {\n    prototype: SVGPathSegLinetoVerticalAbs;\n    new(): SVGPathSegLinetoVerticalAbs;\n};\n\ninterface SVGPathSegLinetoVerticalRel extends SVGPathSeg {\n    y: number;\n}\n\ndeclare var SVGPathSegLinetoVerticalRel: {\n    prototype: SVGPathSegLinetoVerticalRel;\n    new(): SVGPathSegLinetoVerticalRel;\n};\n\ninterface SVGPathSegList {\n    readonly numberOfItems: number;\n    appendItem(newItem: SVGPathSeg): SVGPathSeg;\n    clear(): void;\n    getItem(index: number): SVGPathSeg;\n    initialize(newItem: SVGPathSeg): SVGPathSeg;\n    insertItemBefore(newItem: SVGPathSeg, index: number): SVGPathSeg;\n    removeItem(index: number): SVGPathSeg;\n    replaceItem(newItem: SVGPathSeg, index: number): SVGPathSeg;\n}\n\ndeclare var SVGPathSegList: {\n    prototype: SVGPathSegList;\n    new(): SVGPathSegList;\n};\n\ninterface SVGPathSegMovetoAbs extends SVGPathSeg {\n    x: number;\n    y: number;\n}\n\ndeclare var SVGPathSegMovetoAbs: {\n    prototype: SVGPathSegMovetoAbs;\n    new(): SVGPathSegMovetoAbs;\n};\n\ninterface SVGPathSegMovetoRel extends SVGPathSeg {\n    x: number;\n    y: number;\n}\n\ndeclare var SVGPathSegMovetoRel: {\n    prototype: SVGPathSegMovetoRel;\n    new(): SVGPathSegMovetoRel;\n};\n\ninterface SVGPatternElement extends SVGElement, SVGTests, SVGUnitTypes, SVGFitToViewBox, SVGURIReference {\n    readonly height: SVGAnimatedLength;\n    readonly patternContentUnits: SVGAnimatedEnumeration;\n    readonly patternTransform: SVGAnimatedTransformList;\n    readonly patternUnits: SVGAnimatedEnumeration;\n    readonly width: SVGAnimatedLength;\n    readonly x: SVGAnimatedLength;\n    readonly y: SVGAnimatedLength;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGPatternElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGPatternElement: {\n    prototype: SVGPatternElement;\n    new(): SVGPatternElement;\n};\n\ninterface SVGPoint {\n    x: number;\n    y: number;\n    matrixTransform(matrix: SVGMatrix): SVGPoint;\n}\n\ndeclare var SVGPoint: {\n    prototype: SVGPoint;\n    new(): SVGPoint;\n};\n\ninterface SVGPointList {\n    readonly numberOfItems: number;\n    appendItem(newItem: SVGPoint): SVGPoint;\n    clear(): void;\n    getItem(index: number): SVGPoint;\n    initialize(newItem: SVGPoint): SVGPoint;\n    insertItemBefore(newItem: SVGPoint, index: number): SVGPoint;\n    removeItem(index: number): SVGPoint;\n    replaceItem(newItem: SVGPoint, index: number): SVGPoint;\n}\n\ndeclare var SVGPointList: {\n    prototype: SVGPointList;\n    new(): SVGPointList;\n};\n\ninterface SVGPolygonElement extends SVGGraphicsElement, SVGAnimatedPoints {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGPolygonElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGPolygonElement: {\n    prototype: SVGPolygonElement;\n    new(): SVGPolygonElement;\n};\n\ninterface SVGPolylineElement extends SVGGraphicsElement, SVGAnimatedPoints {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGPolylineElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGPolylineElement: {\n    prototype: SVGPolylineElement;\n    new(): SVGPolylineElement;\n};\n\ninterface SVGPreserveAspectRatio {\n    align: number;\n    meetOrSlice: number;\n    readonly SVG_MEETORSLICE_MEET: number;\n    readonly SVG_MEETORSLICE_SLICE: number;\n    readonly SVG_MEETORSLICE_UNKNOWN: number;\n    readonly SVG_PRESERVEASPECTRATIO_NONE: number;\n    readonly SVG_PRESERVEASPECTRATIO_UNKNOWN: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMAXYMAX: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMAXYMID: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMAXYMIN: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMIDYMAX: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMIDYMID: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMIDYMIN: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMINYMAX: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMINYMID: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMINYMIN: number;\n}\n\ndeclare var SVGPreserveAspectRatio: {\n    prototype: SVGPreserveAspectRatio;\n    new(): SVGPreserveAspectRatio;\n    readonly SVG_MEETORSLICE_MEET: number;\n    readonly SVG_MEETORSLICE_SLICE: number;\n    readonly SVG_MEETORSLICE_UNKNOWN: number;\n    readonly SVG_PRESERVEASPECTRATIO_NONE: number;\n    readonly SVG_PRESERVEASPECTRATIO_UNKNOWN: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMAXYMAX: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMAXYMID: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMAXYMIN: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMIDYMAX: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMIDYMID: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMIDYMIN: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMINYMAX: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMINYMID: number;\n    readonly SVG_PRESERVEASPECTRATIO_XMINYMIN: number;\n};\n\ninterface SVGRadialGradientElement extends SVGGradientElement {\n    readonly cx: SVGAnimatedLength;\n    readonly cy: SVGAnimatedLength;\n    readonly fx: SVGAnimatedLength;\n    readonly fy: SVGAnimatedLength;\n    readonly r: SVGAnimatedLength;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGRadialGradientElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGRadialGradientElement: {\n    prototype: SVGRadialGradientElement;\n    new(): SVGRadialGradientElement;\n};\n\ninterface SVGRect {\n    height: number;\n    width: number;\n    x: number;\n    y: number;\n}\n\ndeclare var SVGRect: {\n    prototype: SVGRect;\n    new(): SVGRect;\n};\n\ninterface SVGRectElement extends SVGGraphicsElement {\n    readonly height: SVGAnimatedLength;\n    readonly rx: SVGAnimatedLength;\n    readonly ry: SVGAnimatedLength;\n    readonly width: SVGAnimatedLength;\n    readonly x: SVGAnimatedLength;\n    readonly y: SVGAnimatedLength;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGRectElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGRectElement: {\n    prototype: SVGRectElement;\n    new(): SVGRectElement;\n};\n\ninterface SVGScriptElement extends SVGElement, SVGURIReference {\n    type: string;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGScriptElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGScriptElement: {\n    prototype: SVGScriptElement;\n    new(): SVGScriptElement;\n};\n\ninterface SVGStopElement extends SVGElement {\n    readonly offset: SVGAnimatedNumber;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGStopElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGStopElement: {\n    prototype: SVGStopElement;\n    new(): SVGStopElement;\n};\n\ninterface SVGStringList {\n    readonly numberOfItems: number;\n    appendItem(newItem: string): string;\n    clear(): void;\n    getItem(index: number): string;\n    initialize(newItem: string): string;\n    insertItemBefore(newItem: string, index: number): string;\n    removeItem(index: number): string;\n    replaceItem(newItem: string, index: number): string;\n}\n\ndeclare var SVGStringList: {\n    prototype: SVGStringList;\n    new(): SVGStringList;\n};\n\ninterface SVGStyleElement extends SVGElement {\n    disabled: boolean;\n    media: string;\n    title: string;\n    type: string;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGStyleElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGStyleElement: {\n    prototype: SVGStyleElement;\n    new(): SVGStyleElement;\n};\n\ninterface SVGSVGElementEventMap extends SVGElementEventMap {\n    "SVGAbort": Event;\n    "SVGError": Event;\n    "resize": UIEvent;\n    "scroll": UIEvent;\n    "SVGUnload": Event;\n    "SVGZoom": SVGZoomEvent;\n}\n\ninterface SVGSVGElement extends SVGGraphicsElement, DocumentEvent, SVGFitToViewBox, SVGZoomAndPan {\n    contentScriptType: string;\n    contentStyleType: string;\n    currentScale: number;\n    readonly currentTranslate: SVGPoint;\n    readonly height: SVGAnimatedLength;\n    onabort: (this: SVGSVGElement, ev: Event) => any;\n    onerror: (this: SVGSVGElement, ev: Event) => any;\n    onresize: (this: SVGSVGElement, ev: UIEvent) => any;\n    onscroll: (this: SVGSVGElement, ev: UIEvent) => any;\n    onunload: (this: SVGSVGElement, ev: Event) => any;\n    onzoom: (this: SVGSVGElement, ev: SVGZoomEvent) => any;\n    readonly pixelUnitToMillimeterX: number;\n    readonly pixelUnitToMillimeterY: number;\n    readonly screenPixelToMillimeterX: number;\n    readonly screenPixelToMillimeterY: number;\n    readonly viewport: SVGRect;\n    readonly width: SVGAnimatedLength;\n    readonly x: SVGAnimatedLength;\n    readonly y: SVGAnimatedLength;\n    checkEnclosure(element: SVGElement, rect: SVGRect): boolean;\n    checkIntersection(element: SVGElement, rect: SVGRect): boolean;\n    createSVGAngle(): SVGAngle;\n    createSVGLength(): SVGLength;\n    createSVGMatrix(): SVGMatrix;\n    createSVGNumber(): SVGNumber;\n    createSVGPoint(): SVGPoint;\n    createSVGRect(): SVGRect;\n    createSVGTransform(): SVGTransform;\n    createSVGTransformFromMatrix(matrix: SVGMatrix): SVGTransform;\n    deselectAll(): void;\n    forceRedraw(): void;\n    getComputedStyle(elt: Element, pseudoElt?: string): CSSStyleDeclaration;\n    getCurrentTime(): number;\n    getElementById(elementId: string): Element;\n    getEnclosureList(rect: SVGRect, referenceElement: SVGElement): NodeListOf<SVGCircleElement | SVGEllipseElement | SVGImageElement | SVGLineElement | SVGPathElement | SVGPolygonElement | SVGPolylineElement | SVGRectElement | SVGTextElement | SVGUseElement>;\n    getIntersectionList(rect: SVGRect, referenceElement: SVGElement): NodeListOf<SVGCircleElement | SVGEllipseElement | SVGImageElement | SVGLineElement | SVGPathElement | SVGPolygonElement | SVGPolylineElement | SVGRectElement | SVGTextElement | SVGUseElement>;\n    pauseAnimations(): void;\n    setCurrentTime(seconds: number): void;\n    suspendRedraw(maxWaitMilliseconds: number): number;\n    unpauseAnimations(): void;\n    unsuspendRedraw(suspendHandleID: number): void;\n    unsuspendRedrawAll(): void;\n    addEventListener<K extends keyof SVGSVGElementEventMap>(type: K, listener: (this: SVGSVGElement, ev: SVGSVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGSVGElement: {\n    prototype: SVGSVGElement;\n    new(): SVGSVGElement;\n};\n\ninterface SVGSwitchElement extends SVGGraphicsElement {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGSwitchElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGSwitchElement: {\n    prototype: SVGSwitchElement;\n    new(): SVGSwitchElement;\n};\n\ninterface SVGSymbolElement extends SVGElement, SVGFitToViewBox {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGSymbolElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGSymbolElement: {\n    prototype: SVGSymbolElement;\n    new(): SVGSymbolElement;\n};\n\ninterface SVGTextContentElement extends SVGGraphicsElement {\n    readonly lengthAdjust: SVGAnimatedEnumeration;\n    readonly textLength: SVGAnimatedLength;\n    getCharNumAtPosition(point: SVGPoint): number;\n    getComputedTextLength(): number;\n    getEndPositionOfChar(charnum: number): SVGPoint;\n    getExtentOfChar(charnum: number): SVGRect;\n    getNumberOfChars(): number;\n    getRotationOfChar(charnum: number): number;\n    getStartPositionOfChar(charnum: number): SVGPoint;\n    getSubStringLength(charnum: number, nchars: number): number;\n    selectSubString(charnum: number, nchars: number): void;\n    readonly LENGTHADJUST_SPACING: number;\n    readonly LENGTHADJUST_SPACINGANDGLYPHS: number;\n    readonly LENGTHADJUST_UNKNOWN: number;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTextContentElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGTextContentElement: {\n    prototype: SVGTextContentElement;\n    new(): SVGTextContentElement;\n    readonly LENGTHADJUST_SPACING: number;\n    readonly LENGTHADJUST_SPACINGANDGLYPHS: number;\n    readonly LENGTHADJUST_UNKNOWN: number;\n};\n\ninterface SVGTextElement extends SVGTextPositioningElement {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTextElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGTextElement: {\n    prototype: SVGTextElement;\n    new(): SVGTextElement;\n};\n\ninterface SVGTextPathElement extends SVGTextContentElement, SVGURIReference {\n    readonly method: SVGAnimatedEnumeration;\n    readonly spacing: SVGAnimatedEnumeration;\n    readonly startOffset: SVGAnimatedLength;\n    readonly TEXTPATH_METHODTYPE_ALIGN: number;\n    readonly TEXTPATH_METHODTYPE_STRETCH: number;\n    readonly TEXTPATH_METHODTYPE_UNKNOWN: number;\n    readonly TEXTPATH_SPACINGTYPE_AUTO: number;\n    readonly TEXTPATH_SPACINGTYPE_EXACT: number;\n    readonly TEXTPATH_SPACINGTYPE_UNKNOWN: number;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTextPathElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGTextPathElement: {\n    prototype: SVGTextPathElement;\n    new(): SVGTextPathElement;\n    readonly TEXTPATH_METHODTYPE_ALIGN: number;\n    readonly TEXTPATH_METHODTYPE_STRETCH: number;\n    readonly TEXTPATH_METHODTYPE_UNKNOWN: number;\n    readonly TEXTPATH_SPACINGTYPE_AUTO: number;\n    readonly TEXTPATH_SPACINGTYPE_EXACT: number;\n    readonly TEXTPATH_SPACINGTYPE_UNKNOWN: number;\n};\n\ninterface SVGTextPositioningElement extends SVGTextContentElement {\n    readonly dx: SVGAnimatedLengthList;\n    readonly dy: SVGAnimatedLengthList;\n    readonly rotate: SVGAnimatedNumberList;\n    readonly x: SVGAnimatedLengthList;\n    readonly y: SVGAnimatedLengthList;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTextPositioningElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGTextPositioningElement: {\n    prototype: SVGTextPositioningElement;\n    new(): SVGTextPositioningElement;\n};\n\ninterface SVGTitleElement extends SVGElement {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTitleElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGTitleElement: {\n    prototype: SVGTitleElement;\n    new(): SVGTitleElement;\n};\n\ninterface SVGTransform {\n    readonly angle: number;\n    readonly matrix: SVGMatrix;\n    readonly type: number;\n    setMatrix(matrix: SVGMatrix): void;\n    setRotate(angle: number, cx: number, cy: number): void;\n    setScale(sx: number, sy: number): void;\n    setSkewX(angle: number): void;\n    setSkewY(angle: number): void;\n    setTranslate(tx: number, ty: number): void;\n    readonly SVG_TRANSFORM_MATRIX: number;\n    readonly SVG_TRANSFORM_ROTATE: number;\n    readonly SVG_TRANSFORM_SCALE: number;\n    readonly SVG_TRANSFORM_SKEWX: number;\n    readonly SVG_TRANSFORM_SKEWY: number;\n    readonly SVG_TRANSFORM_TRANSLATE: number;\n    readonly SVG_TRANSFORM_UNKNOWN: number;\n}\n\ndeclare var SVGTransform: {\n    prototype: SVGTransform;\n    new(): SVGTransform;\n    readonly SVG_TRANSFORM_MATRIX: number;\n    readonly SVG_TRANSFORM_ROTATE: number;\n    readonly SVG_TRANSFORM_SCALE: number;\n    readonly SVG_TRANSFORM_SKEWX: number;\n    readonly SVG_TRANSFORM_SKEWY: number;\n    readonly SVG_TRANSFORM_TRANSLATE: number;\n    readonly SVG_TRANSFORM_UNKNOWN: number;\n};\n\ninterface SVGTransformList {\n    readonly numberOfItems: number;\n    appendItem(newItem: SVGTransform): SVGTransform;\n    clear(): void;\n    consolidate(): SVGTransform;\n    createSVGTransformFromMatrix(matrix: SVGMatrix): SVGTransform;\n    getItem(index: number): SVGTransform;\n    initialize(newItem: SVGTransform): SVGTransform;\n    insertItemBefore(newItem: SVGTransform, index: number): SVGTransform;\n    removeItem(index: number): SVGTransform;\n    replaceItem(newItem: SVGTransform, index: number): SVGTransform;\n}\n\ndeclare var SVGTransformList: {\n    prototype: SVGTransformList;\n    new(): SVGTransformList;\n};\n\ninterface SVGTSpanElement extends SVGTextPositioningElement {\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTSpanElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGTSpanElement: {\n    prototype: SVGTSpanElement;\n    new(): SVGTSpanElement;\n};\n\ninterface SVGUnitTypes {\n    readonly SVG_UNIT_TYPE_OBJECTBOUNDINGBOX: number;\n    readonly SVG_UNIT_TYPE_UNKNOWN: number;\n    readonly SVG_UNIT_TYPE_USERSPACEONUSE: number;\n}\ndeclare var SVGUnitTypes: SVGUnitTypes;\n\ninterface SVGUseElement extends SVGGraphicsElement, SVGURIReference {\n    readonly animatedInstanceRoot: SVGElementInstance;\n    readonly height: SVGAnimatedLength;\n    readonly instanceRoot: SVGElementInstance;\n    readonly width: SVGAnimatedLength;\n    readonly x: SVGAnimatedLength;\n    readonly y: SVGAnimatedLength;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGUseElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGUseElement: {\n    prototype: SVGUseElement;\n    new(): SVGUseElement;\n};\n\ninterface SVGViewElement extends SVGElement, SVGZoomAndPan, SVGFitToViewBox {\n    readonly viewTarget: SVGStringList;\n    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGViewElement, ev: SVGElementEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var SVGViewElement: {\n    prototype: SVGViewElement;\n    new(): SVGViewElement;\n};\n\ninterface SVGZoomAndPan {\n    readonly zoomAndPan: number;\n}\n\ndeclare var SVGZoomAndPan: {\n    readonly SVG_ZOOMANDPAN_DISABLE: number;\n    readonly SVG_ZOOMANDPAN_MAGNIFY: number;\n    readonly SVG_ZOOMANDPAN_UNKNOWN: number;\n};\n\ninterface SVGZoomEvent extends UIEvent {\n    readonly newScale: number;\n    readonly newTranslate: SVGPoint;\n    readonly previousScale: number;\n    readonly previousTranslate: SVGPoint;\n    readonly zoomRectScreen: SVGRect;\n}\n\ndeclare var SVGZoomEvent: {\n    prototype: SVGZoomEvent;\n    new(): SVGZoomEvent;\n};\n\ninterface SyncManager {\n    getTags(): any;\n    register(tag: string): Promise<void>;\n}\n\ndeclare var SyncManager: {\n    prototype: SyncManager;\n    new(): SyncManager;\n};\n\ninterface Text extends CharacterData {\n    readonly wholeText: string;\n    readonly assignedSlot: HTMLSlotElement | null;\n    splitText(offset: number): Text;\n}\n\ndeclare var Text: {\n    prototype: Text;\n    new(data?: string): Text;\n};\n\ninterface TextEvent extends UIEvent {\n    readonly data: string;\n    readonly inputMethod: number;\n    readonly locale: string;\n    initTextEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, dataArg: string, inputMethod: number, locale: string): void;\n    readonly DOM_INPUT_METHOD_DROP: number;\n    readonly DOM_INPUT_METHOD_HANDWRITING: number;\n    readonly DOM_INPUT_METHOD_IME: number;\n    readonly DOM_INPUT_METHOD_KEYBOARD: number;\n    readonly DOM_INPUT_METHOD_MULTIMODAL: number;\n    readonly DOM_INPUT_METHOD_OPTION: number;\n    readonly DOM_INPUT_METHOD_PASTE: number;\n    readonly DOM_INPUT_METHOD_SCRIPT: number;\n    readonly DOM_INPUT_METHOD_UNKNOWN: number;\n    readonly DOM_INPUT_METHOD_VOICE: number;\n}\n\ndeclare var TextEvent: {\n    prototype: TextEvent;\n    new(): TextEvent;\n    readonly DOM_INPUT_METHOD_DROP: number;\n    readonly DOM_INPUT_METHOD_HANDWRITING: number;\n    readonly DOM_INPUT_METHOD_IME: number;\n    readonly DOM_INPUT_METHOD_KEYBOARD: number;\n    readonly DOM_INPUT_METHOD_MULTIMODAL: number;\n    readonly DOM_INPUT_METHOD_OPTION: number;\n    readonly DOM_INPUT_METHOD_PASTE: number;\n    readonly DOM_INPUT_METHOD_SCRIPT: number;\n    readonly DOM_INPUT_METHOD_UNKNOWN: number;\n    readonly DOM_INPUT_METHOD_VOICE: number;\n};\n\ninterface TextMetrics {\n    readonly width: number;\n}\n\ndeclare var TextMetrics: {\n    prototype: TextMetrics;\n    new(): TextMetrics;\n};\n\ninterface TextTrackEventMap {\n    "cuechange": Event;\n    "error": Event;\n    "load": Event;\n}\n\ninterface TextTrack extends EventTarget {\n    readonly activeCues: TextTrackCueList;\n    readonly cues: TextTrackCueList;\n    readonly inBandMetadataTrackDispatchType: string;\n    readonly kind: string;\n    readonly label: string;\n    readonly language: string;\n    mode: any;\n    oncuechange: (this: TextTrack, ev: Event) => any;\n    onerror: (this: TextTrack, ev: Event) => any;\n    onload: (this: TextTrack, ev: Event) => any;\n    readonly readyState: number;\n    addCue(cue: TextTrackCue): void;\n    removeCue(cue: TextTrackCue): void;\n    readonly DISABLED: number;\n    readonly ERROR: number;\n    readonly HIDDEN: number;\n    readonly LOADED: number;\n    readonly LOADING: number;\n    readonly NONE: number;\n    readonly SHOWING: number;\n    addEventListener<K extends keyof TextTrackEventMap>(type: K, listener: (this: TextTrack, ev: TextTrackEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var TextTrack: {\n    prototype: TextTrack;\n    new(): TextTrack;\n    readonly DISABLED: number;\n    readonly ERROR: number;\n    readonly HIDDEN: number;\n    readonly LOADED: number;\n    readonly LOADING: number;\n    readonly NONE: number;\n    readonly SHOWING: number;\n};\n\ninterface TextTrackCueEventMap {\n    "enter": Event;\n    "exit": Event;\n}\n\ninterface TextTrackCue extends EventTarget {\n    endTime: number;\n    id: string;\n    onenter: (this: TextTrackCue, ev: Event) => any;\n    onexit: (this: TextTrackCue, ev: Event) => any;\n    pauseOnExit: boolean;\n    startTime: number;\n    text: string;\n    readonly track: TextTrack;\n    getCueAsHTML(): DocumentFragment;\n    addEventListener<K extends keyof TextTrackCueEventMap>(type: K, listener: (this: TextTrackCue, ev: TextTrackCueEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var TextTrackCue: {\n    prototype: TextTrackCue;\n    new(startTime: number, endTime: number, text: string): TextTrackCue;\n};\n\ninterface TextTrackCueList {\n    readonly length: number;\n    getCueById(id: string): TextTrackCue;\n    item(index: number): TextTrackCue;\n    [index: number]: TextTrackCue;\n}\n\ndeclare var TextTrackCueList: {\n    prototype: TextTrackCueList;\n    new(): TextTrackCueList;\n};\n\ninterface TextTrackListEventMap {\n    "addtrack": TrackEvent;\n}\n\ninterface TextTrackList extends EventTarget {\n    readonly length: number;\n    onaddtrack: ((this: TextTrackList, ev: TrackEvent) => any) | null;\n    item(index: number): TextTrack;\n    addEventListener<K extends keyof TextTrackListEventMap>(type: K, listener: (this: TextTrackList, ev: TextTrackListEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n    [index: number]: TextTrack;\n}\n\ndeclare var TextTrackList: {\n    prototype: TextTrackList;\n    new(): TextTrackList;\n};\n\ninterface TimeRanges {\n    readonly length: number;\n    end(index: number): number;\n    start(index: number): number;\n}\n\ndeclare var TimeRanges: {\n    prototype: TimeRanges;\n    new(): TimeRanges;\n};\n\ninterface Touch {\n    readonly clientX: number;\n    readonly clientY: number;\n    readonly identifier: number;\n    readonly pageX: number;\n    readonly pageY: number;\n    readonly screenX: number;\n    readonly screenY: number;\n    readonly target: EventTarget;\n}\n\ndeclare var Touch: {\n    prototype: Touch;\n    new(): Touch;\n};\n\ninterface TouchEvent extends UIEvent {\n    readonly altKey: boolean;\n    readonly changedTouches: TouchList;\n    readonly charCode: number;\n    readonly ctrlKey: boolean;\n    readonly keyCode: number;\n    readonly metaKey: boolean;\n    readonly shiftKey: boolean;\n    readonly targetTouches: TouchList;\n    readonly touches: TouchList;\n    readonly which: number;\n}\n\ndeclare var TouchEvent: {\n    prototype: TouchEvent;\n    new(type: string, touchEventInit?: TouchEventInit): TouchEvent;\n};\n\ninterface TouchList {\n    readonly length: number;\n    item(index: number): Touch | null;\n    [index: number]: Touch;\n}\n\ndeclare var TouchList: {\n    prototype: TouchList;\n    new(): TouchList;\n};\n\ninterface TrackEvent extends Event {\n    readonly track: VideoTrack | AudioTrack | TextTrack | null;\n}\n\ndeclare var TrackEvent: {\n    prototype: TrackEvent;\n    new(typeArg: string, eventInitDict?: TrackEventInit): TrackEvent;\n};\n\ninterface TransitionEvent extends Event {\n    readonly elapsedTime: number;\n    readonly propertyName: string;\n    initTransitionEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, propertyNameArg: string, elapsedTimeArg: number): void;\n}\n\ndeclare var TransitionEvent: {\n    prototype: TransitionEvent;\n    new(typeArg: string, eventInitDict?: TransitionEventInit): TransitionEvent;\n};\n\ninterface TreeWalker {\n    currentNode: Node;\n    readonly expandEntityReferences: boolean;\n    readonly filter: NodeFilter;\n    readonly root: Node;\n    readonly whatToShow: number;\n    firstChild(): Node;\n    lastChild(): Node;\n    nextNode(): Node;\n    nextSibling(): Node;\n    parentNode(): Node;\n    previousNode(): Node;\n    previousSibling(): Node;\n}\n\ndeclare var TreeWalker: {\n    prototype: TreeWalker;\n    new(): TreeWalker;\n};\n\ninterface UIEvent extends Event {\n    readonly detail: number;\n    readonly view: Window;\n    initUIEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number): void;\n}\n\ndeclare var UIEvent: {\n    prototype: UIEvent;\n    new(typeArg: string, eventInitDict?: UIEventInit): UIEvent;\n};\n\ninterface UnviewableContentIdentifiedEvent extends NavigationEventWithReferrer {\n    readonly mediaType: string;\n}\n\ndeclare var UnviewableContentIdentifiedEvent: {\n    prototype: UnviewableContentIdentifiedEvent;\n    new(): UnviewableContentIdentifiedEvent;\n};\n\ninterface URL {\n    hash: string;\n    host: string;\n    hostname: string;\n    href: string;\n    readonly origin: string;\n    password: string;\n    pathname: string;\n    port: string;\n    protocol: string;\n    search: string;\n    username: string;\n    readonly searchParams: URLSearchParams;\n    toString(): string;\n}\n\ndeclare var URL: {\n    prototype: URL;\n    new(url: string, base?: string): URL;\n    createObjectURL(object: any, options?: ObjectURLOptions): string;\n    revokeObjectURL(url: string): void;\n};\n\ninterface ValidityState {\n    readonly badInput: boolean;\n    readonly customError: boolean;\n    readonly patternMismatch: boolean;\n    readonly rangeOverflow: boolean;\n    readonly rangeUnderflow: boolean;\n    readonly stepMismatch: boolean;\n    readonly tooLong: boolean;\n    readonly typeMismatch: boolean;\n    readonly valid: boolean;\n    readonly valueMissing: boolean;\n}\n\ndeclare var ValidityState: {\n    prototype: ValidityState;\n    new(): ValidityState;\n};\n\ninterface VideoPlaybackQuality {\n    readonly corruptedVideoFrames: number;\n    readonly creationTime: number;\n    readonly droppedVideoFrames: number;\n    readonly totalFrameDelay: number;\n    readonly totalVideoFrames: number;\n}\n\ndeclare var VideoPlaybackQuality: {\n    prototype: VideoPlaybackQuality;\n    new(): VideoPlaybackQuality;\n};\n\ninterface VideoTrack {\n    readonly id: string;\n    kind: string;\n    readonly label: string;\n    language: string;\n    selected: boolean;\n    readonly sourceBuffer: SourceBuffer;\n}\n\ndeclare var VideoTrack: {\n    prototype: VideoTrack;\n    new(): VideoTrack;\n};\n\ninterface VideoTrackListEventMap {\n    "addtrack": TrackEvent;\n    "change": Event;\n    "removetrack": TrackEvent;\n}\n\ninterface VideoTrackList extends EventTarget {\n    readonly length: number;\n    onaddtrack: (this: VideoTrackList, ev: TrackEvent) => any;\n    onchange: (this: VideoTrackList, ev: Event) => any;\n    onremovetrack: (this: VideoTrackList, ev: TrackEvent) => any;\n    readonly selectedIndex: number;\n    getTrackById(id: string): VideoTrack | null;\n    item(index: number): VideoTrack;\n    addEventListener<K extends keyof VideoTrackListEventMap>(type: K, listener: (this: VideoTrackList, ev: VideoTrackListEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n    [index: number]: VideoTrack;\n}\n\ndeclare var VideoTrackList: {\n    prototype: VideoTrackList;\n    new(): VideoTrackList;\n};\n\ninterface WaveShaperNode extends AudioNode {\n    curve: Float32Array | null;\n    oversample: OverSampleType;\n}\n\ndeclare var WaveShaperNode: {\n    prototype: WaveShaperNode;\n    new(): WaveShaperNode;\n};\n\ninterface WebAuthentication {\n    getAssertion(assertionChallenge: any, options?: AssertionOptions): Promise<WebAuthnAssertion>;\n    makeCredential(accountInformation: Account, cryptoParameters: ScopedCredentialParameters[], attestationChallenge: any, options?: ScopedCredentialOptions): Promise<ScopedCredentialInfo>;\n}\n\ndeclare var WebAuthentication: {\n    prototype: WebAuthentication;\n    new(): WebAuthentication;\n};\n\ninterface WebAuthnAssertion {\n    readonly authenticatorData: ArrayBuffer;\n    readonly clientData: ArrayBuffer;\n    readonly credential: ScopedCredential;\n    readonly signature: ArrayBuffer;\n}\n\ndeclare var WebAuthnAssertion: {\n    prototype: WebAuthnAssertion;\n    new(): WebAuthnAssertion;\n};\n\ninterface WEBGL_compressed_texture_s3tc {\n    readonly COMPRESSED_RGB_S3TC_DXT1_EXT: number;\n    readonly COMPRESSED_RGBA_S3TC_DXT1_EXT: number;\n    readonly COMPRESSED_RGBA_S3TC_DXT3_EXT: number;\n    readonly COMPRESSED_RGBA_S3TC_DXT5_EXT: number;\n}\n\ndeclare var WEBGL_compressed_texture_s3tc: {\n    prototype: WEBGL_compressed_texture_s3tc;\n    new(): WEBGL_compressed_texture_s3tc;\n    readonly COMPRESSED_RGB_S3TC_DXT1_EXT: number;\n    readonly COMPRESSED_RGBA_S3TC_DXT1_EXT: number;\n    readonly COMPRESSED_RGBA_S3TC_DXT3_EXT: number;\n    readonly COMPRESSED_RGBA_S3TC_DXT5_EXT: number;\n};\n\ninterface WEBGL_debug_renderer_info {\n    readonly UNMASKED_RENDERER_WEBGL: number;\n    readonly UNMASKED_VENDOR_WEBGL: number;\n}\n\ndeclare var WEBGL_debug_renderer_info: {\n    prototype: WEBGL_debug_renderer_info;\n    new(): WEBGL_debug_renderer_info;\n    readonly UNMASKED_RENDERER_WEBGL: number;\n    readonly UNMASKED_VENDOR_WEBGL: number;\n};\n\ninterface WEBGL_depth_texture {\n    readonly UNSIGNED_INT_24_8_WEBGL: number;\n}\n\ndeclare var WEBGL_depth_texture: {\n    prototype: WEBGL_depth_texture;\n    new(): WEBGL_depth_texture;\n    readonly UNSIGNED_INT_24_8_WEBGL: number;\n};\n\ninterface WebGLActiveInfo {\n    readonly name: string;\n    readonly size: number;\n    readonly type: number;\n}\n\ndeclare var WebGLActiveInfo: {\n    prototype: WebGLActiveInfo;\n    new(): WebGLActiveInfo;\n};\n\ninterface WebGLBuffer extends WebGLObject {\n}\n\ndeclare var WebGLBuffer: {\n    prototype: WebGLBuffer;\n    new(): WebGLBuffer;\n};\n\ninterface WebGLContextEvent extends Event {\n    readonly statusMessage: string;\n}\n\ndeclare var WebGLContextEvent: {\n    prototype: WebGLContextEvent;\n    new(typeArg: string, eventInitDict?: WebGLContextEventInit): WebGLContextEvent;\n};\n\ninterface WebGLFramebuffer extends WebGLObject {\n}\n\ndeclare var WebGLFramebuffer: {\n    prototype: WebGLFramebuffer;\n    new(): WebGLFramebuffer;\n};\n\ninterface WebGLObject {\n}\n\ndeclare var WebGLObject: {\n    prototype: WebGLObject;\n    new(): WebGLObject;\n};\n\ninterface WebGLProgram extends WebGLObject {\n}\n\ndeclare var WebGLProgram: {\n    prototype: WebGLProgram;\n    new(): WebGLProgram;\n};\n\ninterface WebGLRenderbuffer extends WebGLObject {\n}\n\ndeclare var WebGLRenderbuffer: {\n    prototype: WebGLRenderbuffer;\n    new(): WebGLRenderbuffer;\n};\n\ninterface WebGLRenderingContext {\n    readonly canvas: HTMLCanvasElement;\n    readonly drawingBufferHeight: number;\n    readonly drawingBufferWidth: number;\n    activeTexture(texture: number): void;\n    attachShader(program: WebGLProgram | null, shader: WebGLShader | null): void;\n    bindAttribLocation(program: WebGLProgram | null, index: number, name: string): void;\n    bindBuffer(target: number, buffer: WebGLBuffer | null): void;\n    bindFramebuffer(target: number, framebuffer: WebGLFramebuffer | null): void;\n    bindRenderbuffer(target: number, renderbuffer: WebGLRenderbuffer | null): void;\n    bindTexture(target: number, texture: WebGLTexture | null): void;\n    blendColor(red: number, green: number, blue: number, alpha: number): void;\n    blendEquation(mode: number): void;\n    blendEquationSeparate(modeRGB: number, modeAlpha: number): void;\n    blendFunc(sfactor: number, dfactor: number): void;\n    blendFuncSeparate(srcRGB: number, dstRGB: number, srcAlpha: number, dstAlpha: number): void;\n    bufferData(target: number, size: number | ArrayBufferView | ArrayBuffer, usage: number): void;\n    bufferSubData(target: number, offset: number, data: ArrayBufferView | ArrayBuffer): void;\n    checkFramebufferStatus(target: number): number;\n    clear(mask: number): void;\n    clearColor(red: number, green: number, blue: number, alpha: number): void;\n    clearDepth(depth: number): void;\n    clearStencil(s: number): void;\n    colorMask(red: boolean, green: boolean, blue: boolean, alpha: boolean): void;\n    compileShader(shader: WebGLShader | null): void;\n    compressedTexImage2D(target: number, level: number, internalformat: number, width: number, height: number, border: number, data: ArrayBufferView): void;\n    compressedTexSubImage2D(target: number, level: number, xoffset: number, yoffset: number, width: number, height: number, format: number, data: ArrayBufferView): void;\n    copyTexImage2D(target: number, level: number, internalformat: number, x: number, y: number, width: number, height: number, border: number): void;\n    copyTexSubImage2D(target: number, level: number, xoffset: number, yoffset: number, x: number, y: number, width: number, height: number): void;\n    createBuffer(): WebGLBuffer | null;\n    createFramebuffer(): WebGLFramebuffer | null;\n    createProgram(): WebGLProgram | null;\n    createRenderbuffer(): WebGLRenderbuffer | null;\n    createShader(type: number): WebGLShader | null;\n    createTexture(): WebGLTexture | null;\n    cullFace(mode: number): void;\n    deleteBuffer(buffer: WebGLBuffer | null): void;\n    deleteFramebuffer(framebuffer: WebGLFramebuffer | null): void;\n    deleteProgram(program: WebGLProgram | null): void;\n    deleteRenderbuffer(renderbuffer: WebGLRenderbuffer | null): void;\n    deleteShader(shader: WebGLShader | null): void;\n    deleteTexture(texture: WebGLTexture | null): void;\n    depthFunc(func: number): void;\n    depthMask(flag: boolean): void;\n    depthRange(zNear: number, zFar: number): void;\n    detachShader(program: WebGLProgram | null, shader: WebGLShader | null): void;\n    disable(cap: number): void;\n    disableVertexAttribArray(index: number): void;\n    drawArrays(mode: number, first: number, count: number): void;\n    drawElements(mode: number, count: number, type: number, offset: number): void;\n    enable(cap: number): void;\n    enableVertexAttribArray(index: number): void;\n    finish(): void;\n    flush(): void;\n    framebufferRenderbuffer(target: number, attachment: number, renderbuffertarget: number, renderbuffer: WebGLRenderbuffer | null): void;\n    framebufferTexture2D(target: number, attachment: number, textarget: number, texture: WebGLTexture | null, level: number): void;\n    frontFace(mode: number): void;\n    generateMipmap(target: number): void;\n    getActiveAttrib(program: WebGLProgram | null, index: number): WebGLActiveInfo | null;\n    getActiveUniform(program: WebGLProgram | null, index: number): WebGLActiveInfo | null;\n    getAttachedShaders(program: WebGLProgram | null): WebGLShader[] | null;\n    getAttribLocation(program: WebGLProgram | null, name: string): number;\n    getBufferParameter(target: number, pname: number): any;\n    getContextAttributes(): WebGLContextAttributes;\n    getError(): number;\n    getExtension(name: string): any;\n    getFramebufferAttachmentParameter(target: number, attachment: number, pname: number): any;\n    getParameter(pname: number): any;\n    getProgramInfoLog(program: WebGLProgram | null): string | null;\n    getProgramParameter(program: WebGLProgram | null, pname: number): any;\n    getRenderbufferParameter(target: number, pname: number): any;\n    getShaderInfoLog(shader: WebGLShader | null): string | null;\n    getShaderParameter(shader: WebGLShader | null, pname: number): any;\n    getShaderPrecisionFormat(shadertype: number, precisiontype: number): WebGLShaderPrecisionFormat | null;\n    getShaderSource(shader: WebGLShader | null): string | null;\n    getSupportedExtensions(): string[] | null;\n    getTexParameter(target: number, pname: number): any;\n    getUniform(program: WebGLProgram | null, location: WebGLUniformLocation | null): any;\n    getUniformLocation(program: WebGLProgram | null, name: string): WebGLUniformLocation | null;\n    getVertexAttrib(index: number, pname: number): any;\n    getVertexAttribOffset(index: number, pname: number): number;\n    hint(target: number, mode: number): void;\n    isBuffer(buffer: WebGLBuffer | null): boolean;\n    isContextLost(): boolean;\n    isEnabled(cap: number): boolean;\n    isFramebuffer(framebuffer: WebGLFramebuffer | null): boolean;\n    isProgram(program: WebGLProgram | null): boolean;\n    isRenderbuffer(renderbuffer: WebGLRenderbuffer | null): boolean;\n    isShader(shader: WebGLShader | null): boolean;\n    isTexture(texture: WebGLTexture | null): boolean;\n    lineWidth(width: number): void;\n    linkProgram(program: WebGLProgram | null): void;\n    pixelStorei(pname: number, param: number | boolean): void;\n    polygonOffset(factor: number, units: number): void;\n    readPixels(x: number, y: number, width: number, height: number, format: number, type: number, pixels: ArrayBufferView | null): void;\n    renderbufferStorage(target: number, internalformat: number, width: number, height: number): void;\n    sampleCoverage(value: number, invert: boolean): void;\n    scissor(x: number, y: number, width: number, height: number): void;\n    shaderSource(shader: WebGLShader | null, source: string): void;\n    stencilFunc(func: number, ref: number, mask: number): void;\n    stencilFuncSeparate(face: number, func: number, ref: number, mask: number): void;\n    stencilMask(mask: number): void;\n    stencilMaskSeparate(face: number, mask: number): void;\n    stencilOp(fail: number, zfail: number, zpass: number): void;\n    stencilOpSeparate(face: number, fail: number, zfail: number, zpass: number): void;\n    texImage2D(target: number, level: number, internalformat: number, width: number, height: number, border: number, format: number, type: number, pixels: ArrayBufferView | null): void;\n    texImage2D(target: number, level: number, internalformat: number, format: number, type: number, pixels: ImageBitmap | ImageData | HTMLVideoElement | HTMLImageElement | HTMLCanvasElement): void;\n    texParameterf(target: number, pname: number, param: number): void;\n    texParameteri(target: number, pname: number, param: number): void;\n    texSubImage2D(target: number, level: number, xoffset: number, yoffset: number, width: number, height: number, format: number, type: number, pixels: ArrayBufferView | null): void;\n    texSubImage2D(target: number, level: number, xoffset: number, yoffset: number, format: number, type: number, pixels: ImageBitmap | ImageData | HTMLVideoElement | HTMLImageElement | HTMLCanvasElement): void;\n    uniform1f(location: WebGLUniformLocation | null, x: number): void;\n    uniform1fv(location: WebGLUniformLocation, v: Float32Array | number[]): void;\n    uniform1i(location: WebGLUniformLocation | null, x: number): void;\n    uniform1iv(location: WebGLUniformLocation, v: Int32Array | number[]): void;\n    uniform2f(location: WebGLUniformLocation | null, x: number, y: number): void;\n    uniform2fv(location: WebGLUniformLocation, v: Float32Array | number[]): void;\n    uniform2i(location: WebGLUniformLocation | null, x: number, y: number): void;\n    uniform2iv(location: WebGLUniformLocation, v: Int32Array | number[]): void;\n    uniform3f(location: WebGLUniformLocation | null, x: number, y: number, z: number): void;\n    uniform3fv(location: WebGLUniformLocation, v: Float32Array | number[]): void;\n    uniform3i(location: WebGLUniformLocation | null, x: number, y: number, z: number): void;\n    uniform3iv(location: WebGLUniformLocation, v: Int32Array | number[]): void;\n    uniform4f(location: WebGLUniformLocation | null, x: number, y: number, z: number, w: number): void;\n    uniform4fv(location: WebGLUniformLocation, v: Float32Array | number[]): void;\n    uniform4i(location: WebGLUniformLocation | null, x: number, y: number, z: number, w: number): void;\n    uniform4iv(location: WebGLUniformLocation, v: Int32Array | number[]): void;\n    uniformMatrix2fv(location: WebGLUniformLocation, transpose: boolean, value: Float32Array | number[]): void;\n    uniformMatrix3fv(location: WebGLUniformLocation, transpose: boolean, value: Float32Array | number[]): void;\n    uniformMatrix4fv(location: WebGLUniformLocation, transpose: boolean, value: Float32Array | number[]): void;\n    useProgram(program: WebGLProgram | null): void;\n    validateProgram(program: WebGLProgram | null): void;\n    vertexAttrib1f(indx: number, x: number): void;\n    vertexAttrib1fv(indx: number, values: Float32Array | number[]): void;\n    vertexAttrib2f(indx: number, x: number, y: number): void;\n    vertexAttrib2fv(indx: number, values: Float32Array | number[]): void;\n    vertexAttrib3f(indx: number, x: number, y: number, z: number): void;\n    vertexAttrib3fv(indx: number, values: Float32Array | number[]): void;\n    vertexAttrib4f(indx: number, x: number, y: number, z: number, w: number): void;\n    vertexAttrib4fv(indx: number, values: Float32Array | number[]): void;\n    vertexAttribPointer(indx: number, size: number, type: number, normalized: boolean, stride: number, offset: number): void;\n    viewport(x: number, y: number, width: number, height: number): void;\n    readonly ACTIVE_ATTRIBUTES: number;\n    readonly ACTIVE_TEXTURE: number;\n    readonly ACTIVE_UNIFORMS: number;\n    readonly ALIASED_LINE_WIDTH_RANGE: number;\n    readonly ALIASED_POINT_SIZE_RANGE: number;\n    readonly ALPHA: number;\n    readonly ALPHA_BITS: number;\n    readonly ALWAYS: number;\n    readonly ARRAY_BUFFER: number;\n    readonly ARRAY_BUFFER_BINDING: number;\n    readonly ATTACHED_SHADERS: number;\n    readonly BACK: number;\n    readonly BLEND: number;\n    readonly BLEND_COLOR: number;\n    readonly BLEND_DST_ALPHA: number;\n    readonly BLEND_DST_RGB: number;\n    readonly BLEND_EQUATION: number;\n    readonly BLEND_EQUATION_ALPHA: number;\n    readonly BLEND_EQUATION_RGB: number;\n    readonly BLEND_SRC_ALPHA: number;\n    readonly BLEND_SRC_RGB: number;\n    readonly BLUE_BITS: number;\n    readonly BOOL: number;\n    readonly BOOL_VEC2: number;\n    readonly BOOL_VEC3: number;\n    readonly BOOL_VEC4: number;\n    readonly BROWSER_DEFAULT_WEBGL: number;\n    readonly BUFFER_SIZE: number;\n    readonly BUFFER_USAGE: number;\n    readonly BYTE: number;\n    readonly CCW: number;\n    readonly CLAMP_TO_EDGE: number;\n    readonly COLOR_ATTACHMENT0: number;\n    readonly COLOR_BUFFER_BIT: number;\n    readonly COLOR_CLEAR_VALUE: number;\n    readonly COLOR_WRITEMASK: number;\n    readonly COMPILE_STATUS: number;\n    readonly COMPRESSED_TEXTURE_FORMATS: number;\n    readonly CONSTANT_ALPHA: number;\n    readonly CONSTANT_COLOR: number;\n    readonly CONTEXT_LOST_WEBGL: number;\n    readonly CULL_FACE: number;\n    readonly CULL_FACE_MODE: number;\n    readonly CURRENT_PROGRAM: number;\n    readonly CURRENT_VERTEX_ATTRIB: number;\n    readonly CW: number;\n    readonly DECR: number;\n    readonly DECR_WRAP: number;\n    readonly DELETE_STATUS: number;\n    readonly DEPTH_ATTACHMENT: number;\n    readonly DEPTH_BITS: number;\n    readonly DEPTH_BUFFER_BIT: number;\n    readonly DEPTH_CLEAR_VALUE: number;\n    readonly DEPTH_COMPONENT: number;\n    readonly DEPTH_COMPONENT16: number;\n    readonly DEPTH_FUNC: number;\n    readonly DEPTH_RANGE: number;\n    readonly DEPTH_STENCIL: number;\n    readonly DEPTH_STENCIL_ATTACHMENT: number;\n    readonly DEPTH_TEST: number;\n    readonly DEPTH_WRITEMASK: number;\n    readonly DITHER: number;\n    readonly DONT_CARE: number;\n    readonly DST_ALPHA: number;\n    readonly DST_COLOR: number;\n    readonly DYNAMIC_DRAW: number;\n    readonly ELEMENT_ARRAY_BUFFER: number;\n    readonly ELEMENT_ARRAY_BUFFER_BINDING: number;\n    readonly EQUAL: number;\n    readonly FASTEST: number;\n    readonly FLOAT: number;\n    readonly FLOAT_MAT2: number;\n    readonly FLOAT_MAT3: number;\n    readonly FLOAT_MAT4: number;\n    readonly FLOAT_VEC2: number;\n    readonly FLOAT_VEC3: number;\n    readonly FLOAT_VEC4: number;\n    readonly FRAGMENT_SHADER: number;\n    readonly FRAMEBUFFER: number;\n    readonly FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: number;\n    readonly FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: number;\n    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: number;\n    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: number;\n    readonly FRAMEBUFFER_BINDING: number;\n    readonly FRAMEBUFFER_COMPLETE: number;\n    readonly FRAMEBUFFER_INCOMPLETE_ATTACHMENT: number;\n    readonly FRAMEBUFFER_INCOMPLETE_DIMENSIONS: number;\n    readonly FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: number;\n    readonly FRAMEBUFFER_UNSUPPORTED: number;\n    readonly FRONT: number;\n    readonly FRONT_AND_BACK: number;\n    readonly FRONT_FACE: number;\n    readonly FUNC_ADD: number;\n    readonly FUNC_REVERSE_SUBTRACT: number;\n    readonly FUNC_SUBTRACT: number;\n    readonly GENERATE_MIPMAP_HINT: number;\n    readonly GEQUAL: number;\n    readonly GREATER: number;\n    readonly GREEN_BITS: number;\n    readonly HIGH_FLOAT: number;\n    readonly HIGH_INT: number;\n    readonly IMPLEMENTATION_COLOR_READ_FORMAT: number;\n    readonly IMPLEMENTATION_COLOR_READ_TYPE: number;\n    readonly INCR: number;\n    readonly INCR_WRAP: number;\n    readonly INT: number;\n    readonly INT_VEC2: number;\n    readonly INT_VEC3: number;\n    readonly INT_VEC4: number;\n    readonly INVALID_ENUM: number;\n    readonly INVALID_FRAMEBUFFER_OPERATION: number;\n    readonly INVALID_OPERATION: number;\n    readonly INVALID_VALUE: number;\n    readonly INVERT: number;\n    readonly KEEP: number;\n    readonly LEQUAL: number;\n    readonly LESS: number;\n    readonly LINE_LOOP: number;\n    readonly LINE_STRIP: number;\n    readonly LINE_WIDTH: number;\n    readonly LINEAR: number;\n    readonly LINEAR_MIPMAP_LINEAR: number;\n    readonly LINEAR_MIPMAP_NEAREST: number;\n    readonly LINES: number;\n    readonly LINK_STATUS: number;\n    readonly LOW_FLOAT: number;\n    readonly LOW_INT: number;\n    readonly LUMINANCE: number;\n    readonly LUMINANCE_ALPHA: number;\n    readonly MAX_COMBINED_TEXTURE_IMAGE_UNITS: number;\n    readonly MAX_CUBE_MAP_TEXTURE_SIZE: number;\n    readonly MAX_FRAGMENT_UNIFORM_VECTORS: number;\n    readonly MAX_RENDERBUFFER_SIZE: number;\n    readonly MAX_TEXTURE_IMAGE_UNITS: number;\n    readonly MAX_TEXTURE_SIZE: number;\n    readonly MAX_VARYING_VECTORS: number;\n    readonly MAX_VERTEX_ATTRIBS: number;\n    readonly MAX_VERTEX_TEXTURE_IMAGE_UNITS: number;\n    readonly MAX_VERTEX_UNIFORM_VECTORS: number;\n    readonly MAX_VIEWPORT_DIMS: number;\n    readonly MEDIUM_FLOAT: number;\n    readonly MEDIUM_INT: number;\n    readonly MIRRORED_REPEAT: number;\n    readonly NEAREST: number;\n    readonly NEAREST_MIPMAP_LINEAR: number;\n    readonly NEAREST_MIPMAP_NEAREST: number;\n    readonly NEVER: number;\n    readonly NICEST: number;\n    readonly NO_ERROR: number;\n    readonly NONE: number;\n    readonly NOTEQUAL: number;\n    readonly ONE: number;\n    readonly ONE_MINUS_CONSTANT_ALPHA: number;\n    readonly ONE_MINUS_CONSTANT_COLOR: number;\n    readonly ONE_MINUS_DST_ALPHA: number;\n    readonly ONE_MINUS_DST_COLOR: number;\n    readonly ONE_MINUS_SRC_ALPHA: number;\n    readonly ONE_MINUS_SRC_COLOR: number;\n    readonly OUT_OF_MEMORY: number;\n    readonly PACK_ALIGNMENT: number;\n    readonly POINTS: number;\n    readonly POLYGON_OFFSET_FACTOR: number;\n    readonly POLYGON_OFFSET_FILL: number;\n    readonly POLYGON_OFFSET_UNITS: number;\n    readonly RED_BITS: number;\n    readonly RENDERBUFFER: number;\n    readonly RENDERBUFFER_ALPHA_SIZE: number;\n    readonly RENDERBUFFER_BINDING: number;\n    readonly RENDERBUFFER_BLUE_SIZE: number;\n    readonly RENDERBUFFER_DEPTH_SIZE: number;\n    readonly RENDERBUFFER_GREEN_SIZE: number;\n    readonly RENDERBUFFER_HEIGHT: number;\n    readonly RENDERBUFFER_INTERNAL_FORMAT: number;\n    readonly RENDERBUFFER_RED_SIZE: number;\n    readonly RENDERBUFFER_STENCIL_SIZE: number;\n    readonly RENDERBUFFER_WIDTH: number;\n    readonly RENDERER: number;\n    readonly REPEAT: number;\n    readonly REPLACE: number;\n    readonly RGB: number;\n    readonly RGB5_A1: number;\n    readonly RGB565: number;\n    readonly RGBA: number;\n    readonly RGBA4: number;\n    readonly SAMPLE_ALPHA_TO_COVERAGE: number;\n    readonly SAMPLE_BUFFERS: number;\n    readonly SAMPLE_COVERAGE: number;\n    readonly SAMPLE_COVERAGE_INVERT: number;\n    readonly SAMPLE_COVERAGE_VALUE: number;\n    readonly SAMPLER_2D: number;\n    readonly SAMPLER_CUBE: number;\n    readonly SAMPLES: number;\n    readonly SCISSOR_BOX: number;\n    readonly SCISSOR_TEST: number;\n    readonly SHADER_TYPE: number;\n    readonly SHADING_LANGUAGE_VERSION: number;\n    readonly SHORT: number;\n    readonly SRC_ALPHA: number;\n    readonly SRC_ALPHA_SATURATE: number;\n    readonly SRC_COLOR: number;\n    readonly STATIC_DRAW: number;\n    readonly STENCIL_ATTACHMENT: number;\n    readonly STENCIL_BACK_FAIL: number;\n    readonly STENCIL_BACK_FUNC: number;\n    readonly STENCIL_BACK_PASS_DEPTH_FAIL: number;\n    readonly STENCIL_BACK_PASS_DEPTH_PASS: number;\n    readonly STENCIL_BACK_REF: number;\n    readonly STENCIL_BACK_VALUE_MASK: number;\n    readonly STENCIL_BACK_WRITEMASK: number;\n    readonly STENCIL_BITS: number;\n    readonly STENCIL_BUFFER_BIT: number;\n    readonly STENCIL_CLEAR_VALUE: number;\n    readonly STENCIL_FAIL: number;\n    readonly STENCIL_FUNC: number;\n    readonly STENCIL_INDEX: number;\n    readonly STENCIL_INDEX8: number;\n    readonly STENCIL_PASS_DEPTH_FAIL: number;\n    readonly STENCIL_PASS_DEPTH_PASS: number;\n    readonly STENCIL_REF: number;\n    readonly STENCIL_TEST: number;\n    readonly STENCIL_VALUE_MASK: number;\n    readonly STENCIL_WRITEMASK: number;\n    readonly STREAM_DRAW: number;\n    readonly SUBPIXEL_BITS: number;\n    readonly TEXTURE: number;\n    readonly TEXTURE_2D: number;\n    readonly TEXTURE_BINDING_2D: number;\n    readonly TEXTURE_BINDING_CUBE_MAP: number;\n    readonly TEXTURE_CUBE_MAP: number;\n    readonly TEXTURE_CUBE_MAP_NEGATIVE_X: number;\n    readonly TEXTURE_CUBE_MAP_NEGATIVE_Y: number;\n    readonly TEXTURE_CUBE_MAP_NEGATIVE_Z: number;\n    readonly TEXTURE_CUBE_MAP_POSITIVE_X: number;\n    readonly TEXTURE_CUBE_MAP_POSITIVE_Y: number;\n    readonly TEXTURE_CUBE_MAP_POSITIVE_Z: number;\n    readonly TEXTURE_MAG_FILTER: number;\n    readonly TEXTURE_MIN_FILTER: number;\n    readonly TEXTURE_WRAP_S: number;\n    readonly TEXTURE_WRAP_T: number;\n    readonly TEXTURE0: number;\n    readonly TEXTURE1: number;\n    readonly TEXTURE10: number;\n    readonly TEXTURE11: number;\n    readonly TEXTURE12: number;\n    readonly TEXTURE13: number;\n    readonly TEXTURE14: number;\n    readonly TEXTURE15: number;\n    readonly TEXTURE16: number;\n    readonly TEXTURE17: number;\n    readonly TEXTURE18: number;\n    readonly TEXTURE19: number;\n    readonly TEXTURE2: number;\n    readonly TEXTURE20: number;\n    readonly TEXTURE21: number;\n    readonly TEXTURE22: number;\n    readonly TEXTURE23: number;\n    readonly TEXTURE24: number;\n    readonly TEXTURE25: number;\n    readonly TEXTURE26: number;\n    readonly TEXTURE27: number;\n    readonly TEXTURE28: number;\n    readonly TEXTURE29: number;\n    readonly TEXTURE3: number;\n    readonly TEXTURE30: number;\n    readonly TEXTURE31: number;\n    readonly TEXTURE4: number;\n    readonly TEXTURE5: number;\n    readonly TEXTURE6: number;\n    readonly TEXTURE7: number;\n    readonly TEXTURE8: number;\n    readonly TEXTURE9: number;\n    readonly TRIANGLE_FAN: number;\n    readonly TRIANGLE_STRIP: number;\n    readonly TRIANGLES: number;\n    readonly UNPACK_ALIGNMENT: number;\n    readonly UNPACK_COLORSPACE_CONVERSION_WEBGL: number;\n    readonly UNPACK_FLIP_Y_WEBGL: number;\n    readonly UNPACK_PREMULTIPLY_ALPHA_WEBGL: number;\n    readonly UNSIGNED_BYTE: number;\n    readonly UNSIGNED_INT: number;\n    readonly UNSIGNED_SHORT: number;\n    readonly UNSIGNED_SHORT_4_4_4_4: number;\n    readonly UNSIGNED_SHORT_5_5_5_1: number;\n    readonly UNSIGNED_SHORT_5_6_5: number;\n    readonly VALIDATE_STATUS: number;\n    readonly VENDOR: number;\n    readonly VERSION: number;\n    readonly VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: number;\n    readonly VERTEX_ATTRIB_ARRAY_ENABLED: number;\n    readonly VERTEX_ATTRIB_ARRAY_NORMALIZED: number;\n    readonly VERTEX_ATTRIB_ARRAY_POINTER: number;\n    readonly VERTEX_ATTRIB_ARRAY_SIZE: number;\n    readonly VERTEX_ATTRIB_ARRAY_STRIDE: number;\n    readonly VERTEX_ATTRIB_ARRAY_TYPE: number;\n    readonly VERTEX_SHADER: number;\n    readonly VIEWPORT: number;\n    readonly ZERO: number;\n}\n\ndeclare var WebGLRenderingContext: {\n    prototype: WebGLRenderingContext;\n    new(): WebGLRenderingContext;\n    readonly ACTIVE_ATTRIBUTES: number;\n    readonly ACTIVE_TEXTURE: number;\n    readonly ACTIVE_UNIFORMS: number;\n    readonly ALIASED_LINE_WIDTH_RANGE: number;\n    readonly ALIASED_POINT_SIZE_RANGE: number;\n    readonly ALPHA: number;\n    readonly ALPHA_BITS: number;\n    readonly ALWAYS: number;\n    readonly ARRAY_BUFFER: number;\n    readonly ARRAY_BUFFER_BINDING: number;\n    readonly ATTACHED_SHADERS: number;\n    readonly BACK: number;\n    readonly BLEND: number;\n    readonly BLEND_COLOR: number;\n    readonly BLEND_DST_ALPHA: number;\n    readonly BLEND_DST_RGB: number;\n    readonly BLEND_EQUATION: number;\n    readonly BLEND_EQUATION_ALPHA: number;\n    readonly BLEND_EQUATION_RGB: number;\n    readonly BLEND_SRC_ALPHA: number;\n    readonly BLEND_SRC_RGB: number;\n    readonly BLUE_BITS: number;\n    readonly BOOL: number;\n    readonly BOOL_VEC2: number;\n    readonly BOOL_VEC3: number;\n    readonly BOOL_VEC4: number;\n    readonly BROWSER_DEFAULT_WEBGL: number;\n    readonly BUFFER_SIZE: number;\n    readonly BUFFER_USAGE: number;\n    readonly BYTE: number;\n    readonly CCW: number;\n    readonly CLAMP_TO_EDGE: number;\n    readonly COLOR_ATTACHMENT0: number;\n    readonly COLOR_BUFFER_BIT: number;\n    readonly COLOR_CLEAR_VALUE: number;\n    readonly COLOR_WRITEMASK: number;\n    readonly COMPILE_STATUS: number;\n    readonly COMPRESSED_TEXTURE_FORMATS: number;\n    readonly CONSTANT_ALPHA: number;\n    readonly CONSTANT_COLOR: number;\n    readonly CONTEXT_LOST_WEBGL: number;\n    readonly CULL_FACE: number;\n    readonly CULL_FACE_MODE: number;\n    readonly CURRENT_PROGRAM: number;\n    readonly CURRENT_VERTEX_ATTRIB: number;\n    readonly CW: number;\n    readonly DECR: number;\n    readonly DECR_WRAP: number;\n    readonly DELETE_STATUS: number;\n    readonly DEPTH_ATTACHMENT: number;\n    readonly DEPTH_BITS: number;\n    readonly DEPTH_BUFFER_BIT: number;\n    readonly DEPTH_CLEAR_VALUE: number;\n    readonly DEPTH_COMPONENT: number;\n    readonly DEPTH_COMPONENT16: number;\n    readonly DEPTH_FUNC: number;\n    readonly DEPTH_RANGE: number;\n    readonly DEPTH_STENCIL: number;\n    readonly DEPTH_STENCIL_ATTACHMENT: number;\n    readonly DEPTH_TEST: number;\n    readonly DEPTH_WRITEMASK: number;\n    readonly DITHER: number;\n    readonly DONT_CARE: number;\n    readonly DST_ALPHA: number;\n    readonly DST_COLOR: number;\n    readonly DYNAMIC_DRAW: number;\n    readonly ELEMENT_ARRAY_BUFFER: number;\n    readonly ELEMENT_ARRAY_BUFFER_BINDING: number;\n    readonly EQUAL: number;\n    readonly FASTEST: number;\n    readonly FLOAT: number;\n    readonly FLOAT_MAT2: number;\n    readonly FLOAT_MAT3: number;\n    readonly FLOAT_MAT4: number;\n    readonly FLOAT_VEC2: number;\n    readonly FLOAT_VEC3: number;\n    readonly FLOAT_VEC4: number;\n    readonly FRAGMENT_SHADER: number;\n    readonly FRAMEBUFFER: number;\n    readonly FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: number;\n    readonly FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: number;\n    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: number;\n    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: number;\n    readonly FRAMEBUFFER_BINDING: number;\n    readonly FRAMEBUFFER_COMPLETE: number;\n    readonly FRAMEBUFFER_INCOMPLETE_ATTACHMENT: number;\n    readonly FRAMEBUFFER_INCOMPLETE_DIMENSIONS: number;\n    readonly FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: number;\n    readonly FRAMEBUFFER_UNSUPPORTED: number;\n    readonly FRONT: number;\n    readonly FRONT_AND_BACK: number;\n    readonly FRONT_FACE: number;\n    readonly FUNC_ADD: number;\n    readonly FUNC_REVERSE_SUBTRACT: number;\n    readonly FUNC_SUBTRACT: number;\n    readonly GENERATE_MIPMAP_HINT: number;\n    readonly GEQUAL: number;\n    readonly GREATER: number;\n    readonly GREEN_BITS: number;\n    readonly HIGH_FLOAT: number;\n    readonly HIGH_INT: number;\n    readonly IMPLEMENTATION_COLOR_READ_FORMAT: number;\n    readonly IMPLEMENTATION_COLOR_READ_TYPE: number;\n    readonly INCR: number;\n    readonly INCR_WRAP: number;\n    readonly INT: number;\n    readonly INT_VEC2: number;\n    readonly INT_VEC3: number;\n    readonly INT_VEC4: number;\n    readonly INVALID_ENUM: number;\n    readonly INVALID_FRAMEBUFFER_OPERATION: number;\n    readonly INVALID_OPERATION: number;\n    readonly INVALID_VALUE: number;\n    readonly INVERT: number;\n    readonly KEEP: number;\n    readonly LEQUAL: number;\n    readonly LESS: number;\n    readonly LINE_LOOP: number;\n    readonly LINE_STRIP: number;\n    readonly LINE_WIDTH: number;\n    readonly LINEAR: number;\n    readonly LINEAR_MIPMAP_LINEAR: number;\n    readonly LINEAR_MIPMAP_NEAREST: number;\n    readonly LINES: number;\n    readonly LINK_STATUS: number;\n    readonly LOW_FLOAT: number;\n    readonly LOW_INT: number;\n    readonly LUMINANCE: number;\n    readonly LUMINANCE_ALPHA: number;\n    readonly MAX_COMBINED_TEXTURE_IMAGE_UNITS: number;\n    readonly MAX_CUBE_MAP_TEXTURE_SIZE: number;\n    readonly MAX_FRAGMENT_UNIFORM_VECTORS: number;\n    readonly MAX_RENDERBUFFER_SIZE: number;\n    readonly MAX_TEXTURE_IMAGE_UNITS: number;\n    readonly MAX_TEXTURE_SIZE: number;\n    readonly MAX_VARYING_VECTORS: number;\n    readonly MAX_VERTEX_ATTRIBS: number;\n    readonly MAX_VERTEX_TEXTURE_IMAGE_UNITS: number;\n    readonly MAX_VERTEX_UNIFORM_VECTORS: number;\n    readonly MAX_VIEWPORT_DIMS: number;\n    readonly MEDIUM_FLOAT: number;\n    readonly MEDIUM_INT: number;\n    readonly MIRRORED_REPEAT: number;\n    readonly NEAREST: number;\n    readonly NEAREST_MIPMAP_LINEAR: number;\n    readonly NEAREST_MIPMAP_NEAREST: number;\n    readonly NEVER: number;\n    readonly NICEST: number;\n    readonly NO_ERROR: number;\n    readonly NONE: number;\n    readonly NOTEQUAL: number;\n    readonly ONE: number;\n    readonly ONE_MINUS_CONSTANT_ALPHA: number;\n    readonly ONE_MINUS_CONSTANT_COLOR: number;\n    readonly ONE_MINUS_DST_ALPHA: number;\n    readonly ONE_MINUS_DST_COLOR: number;\n    readonly ONE_MINUS_SRC_ALPHA: number;\n    readonly ONE_MINUS_SRC_COLOR: number;\n    readonly OUT_OF_MEMORY: number;\n    readonly PACK_ALIGNMENT: number;\n    readonly POINTS: number;\n    readonly POLYGON_OFFSET_FACTOR: number;\n    readonly POLYGON_OFFSET_FILL: number;\n    readonly POLYGON_OFFSET_UNITS: number;\n    readonly RED_BITS: number;\n    readonly RENDERBUFFER: number;\n    readonly RENDERBUFFER_ALPHA_SIZE: number;\n    readonly RENDERBUFFER_BINDING: number;\n    readonly RENDERBUFFER_BLUE_SIZE: number;\n    readonly RENDERBUFFER_DEPTH_SIZE: number;\n    readonly RENDERBUFFER_GREEN_SIZE: number;\n    readonly RENDERBUFFER_HEIGHT: number;\n    readonly RENDERBUFFER_INTERNAL_FORMAT: number;\n    readonly RENDERBUFFER_RED_SIZE: number;\n    readonly RENDERBUFFER_STENCIL_SIZE: number;\n    readonly RENDERBUFFER_WIDTH: number;\n    readonly RENDERER: number;\n    readonly REPEAT: number;\n    readonly REPLACE: number;\n    readonly RGB: number;\n    readonly RGB5_A1: number;\n    readonly RGB565: number;\n    readonly RGBA: number;\n    readonly RGBA4: number;\n    readonly SAMPLE_ALPHA_TO_COVERAGE: number;\n    readonly SAMPLE_BUFFERS: number;\n    readonly SAMPLE_COVERAGE: number;\n    readonly SAMPLE_COVERAGE_INVERT: number;\n    readonly SAMPLE_COVERAGE_VALUE: number;\n    readonly SAMPLER_2D: number;\n    readonly SAMPLER_CUBE: number;\n    readonly SAMPLES: number;\n    readonly SCISSOR_BOX: number;\n    readonly SCISSOR_TEST: number;\n    readonly SHADER_TYPE: number;\n    readonly SHADING_LANGUAGE_VERSION: number;\n    readonly SHORT: number;\n    readonly SRC_ALPHA: number;\n    readonly SRC_ALPHA_SATURATE: number;\n    readonly SRC_COLOR: number;\n    readonly STATIC_DRAW: number;\n    readonly STENCIL_ATTACHMENT: number;\n    readonly STENCIL_BACK_FAIL: number;\n    readonly STENCIL_BACK_FUNC: number;\n    readonly STENCIL_BACK_PASS_DEPTH_FAIL: number;\n    readonly STENCIL_BACK_PASS_DEPTH_PASS: number;\n    readonly STENCIL_BACK_REF: number;\n    readonly STENCIL_BACK_VALUE_MASK: number;\n    readonly STENCIL_BACK_WRITEMASK: number;\n    readonly STENCIL_BITS: number;\n    readonly STENCIL_BUFFER_BIT: number;\n    readonly STENCIL_CLEAR_VALUE: number;\n    readonly STENCIL_FAIL: number;\n    readonly STENCIL_FUNC: number;\n    readonly STENCIL_INDEX: number;\n    readonly STENCIL_INDEX8: number;\n    readonly STENCIL_PASS_DEPTH_FAIL: number;\n    readonly STENCIL_PASS_DEPTH_PASS: number;\n    readonly STENCIL_REF: number;\n    readonly STENCIL_TEST: number;\n    readonly STENCIL_VALUE_MASK: number;\n    readonly STENCIL_WRITEMASK: number;\n    readonly STREAM_DRAW: number;\n    readonly SUBPIXEL_BITS: number;\n    readonly TEXTURE: number;\n    readonly TEXTURE_2D: number;\n    readonly TEXTURE_BINDING_2D: number;\n    readonly TEXTURE_BINDING_CUBE_MAP: number;\n    readonly TEXTURE_CUBE_MAP: number;\n    readonly TEXTURE_CUBE_MAP_NEGATIVE_X: number;\n    readonly TEXTURE_CUBE_MAP_NEGATIVE_Y: number;\n    readonly TEXTURE_CUBE_MAP_NEGATIVE_Z: number;\n    readonly TEXTURE_CUBE_MAP_POSITIVE_X: number;\n    readonly TEXTURE_CUBE_MAP_POSITIVE_Y: number;\n    readonly TEXTURE_CUBE_MAP_POSITIVE_Z: number;\n    readonly TEXTURE_MAG_FILTER: number;\n    readonly TEXTURE_MIN_FILTER: number;\n    readonly TEXTURE_WRAP_S: number;\n    readonly TEXTURE_WRAP_T: number;\n    readonly TEXTURE0: number;\n    readonly TEXTURE1: number;\n    readonly TEXTURE10: number;\n    readonly TEXTURE11: number;\n    readonly TEXTURE12: number;\n    readonly TEXTURE13: number;\n    readonly TEXTURE14: number;\n    readonly TEXTURE15: number;\n    readonly TEXTURE16: number;\n    readonly TEXTURE17: number;\n    readonly TEXTURE18: number;\n    readonly TEXTURE19: number;\n    readonly TEXTURE2: number;\n    readonly TEXTURE20: number;\n    readonly TEXTURE21: number;\n    readonly TEXTURE22: number;\n    readonly TEXTURE23: number;\n    readonly TEXTURE24: number;\n    readonly TEXTURE25: number;\n    readonly TEXTURE26: number;\n    readonly TEXTURE27: number;\n    readonly TEXTURE28: number;\n    readonly TEXTURE29: number;\n    readonly TEXTURE3: number;\n    readonly TEXTURE30: number;\n    readonly TEXTURE31: number;\n    readonly TEXTURE4: number;\n    readonly TEXTURE5: number;\n    readonly TEXTURE6: number;\n    readonly TEXTURE7: number;\n    readonly TEXTURE8: number;\n    readonly TEXTURE9: number;\n    readonly TRIANGLE_FAN: number;\n    readonly TRIANGLE_STRIP: number;\n    readonly TRIANGLES: number;\n    readonly UNPACK_ALIGNMENT: number;\n    readonly UNPACK_COLORSPACE_CONVERSION_WEBGL: number;\n    readonly UNPACK_FLIP_Y_WEBGL: number;\n    readonly UNPACK_PREMULTIPLY_ALPHA_WEBGL: number;\n    readonly UNSIGNED_BYTE: number;\n    readonly UNSIGNED_INT: number;\n    readonly UNSIGNED_SHORT: number;\n    readonly UNSIGNED_SHORT_4_4_4_4: number;\n    readonly UNSIGNED_SHORT_5_5_5_1: number;\n    readonly UNSIGNED_SHORT_5_6_5: number;\n    readonly VALIDATE_STATUS: number;\n    readonly VENDOR: number;\n    readonly VERSION: number;\n    readonly VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: number;\n    readonly VERTEX_ATTRIB_ARRAY_ENABLED: number;\n    readonly VERTEX_ATTRIB_ARRAY_NORMALIZED: number;\n    readonly VERTEX_ATTRIB_ARRAY_POINTER: number;\n    readonly VERTEX_ATTRIB_ARRAY_SIZE: number;\n    readonly VERTEX_ATTRIB_ARRAY_STRIDE: number;\n    readonly VERTEX_ATTRIB_ARRAY_TYPE: number;\n    readonly VERTEX_SHADER: number;\n    readonly VIEWPORT: number;\n    readonly ZERO: number;\n};\n\ninterface WebGLShader extends WebGLObject {\n}\n\ndeclare var WebGLShader: {\n    prototype: WebGLShader;\n    new(): WebGLShader;\n};\n\ninterface WebGLShaderPrecisionFormat {\n    readonly precision: number;\n    readonly rangeMax: number;\n    readonly rangeMin: number;\n}\n\ndeclare var WebGLShaderPrecisionFormat: {\n    prototype: WebGLShaderPrecisionFormat;\n    new(): WebGLShaderPrecisionFormat;\n};\n\ninterface WebGLTexture extends WebGLObject {\n}\n\ndeclare var WebGLTexture: {\n    prototype: WebGLTexture;\n    new(): WebGLTexture;\n};\n\ninterface WebGLUniformLocation {\n}\n\ndeclare var WebGLUniformLocation: {\n    prototype: WebGLUniformLocation;\n    new(): WebGLUniformLocation;\n};\n\ninterface WebKitCSSMatrix {\n    a: number;\n    b: number;\n    c: number;\n    d: number;\n    e: number;\n    f: number;\n    m11: number;\n    m12: number;\n    m13: number;\n    m14: number;\n    m21: number;\n    m22: number;\n    m23: number;\n    m24: number;\n    m31: number;\n    m32: number;\n    m33: number;\n    m34: number;\n    m41: number;\n    m42: number;\n    m43: number;\n    m44: number;\n    inverse(): WebKitCSSMatrix;\n    multiply(secondMatrix: WebKitCSSMatrix): WebKitCSSMatrix;\n    rotate(angleX: number, angleY?: number, angleZ?: number): WebKitCSSMatrix;\n    rotateAxisAngle(x: number, y: number, z: number, angle: number): WebKitCSSMatrix;\n    scale(scaleX: number, scaleY?: number, scaleZ?: number): WebKitCSSMatrix;\n    setMatrixValue(value: string): void;\n    skewX(angle: number): WebKitCSSMatrix;\n    skewY(angle: number): WebKitCSSMatrix;\n    toString(): string;\n    translate(x: number, y: number, z?: number): WebKitCSSMatrix;\n}\n\ndeclare var WebKitCSSMatrix: {\n    prototype: WebKitCSSMatrix;\n    new(text?: string): WebKitCSSMatrix;\n};\n\ninterface WebKitDirectoryEntry extends WebKitEntry {\n    createReader(): WebKitDirectoryReader;\n}\n\ndeclare var WebKitDirectoryEntry: {\n    prototype: WebKitDirectoryEntry;\n    new(): WebKitDirectoryEntry;\n};\n\ninterface WebKitDirectoryReader {\n    readEntries(successCallback: WebKitEntriesCallback, errorCallback?: WebKitErrorCallback): void;\n}\n\ndeclare var WebKitDirectoryReader: {\n    prototype: WebKitDirectoryReader;\n    new(): WebKitDirectoryReader;\n};\n\ninterface WebKitEntry {\n    readonly filesystem: WebKitFileSystem;\n    readonly fullPath: string;\n    readonly isDirectory: boolean;\n    readonly isFile: boolean;\n    readonly name: string;\n}\n\ndeclare var WebKitEntry: {\n    prototype: WebKitEntry;\n    new(): WebKitEntry;\n};\n\ninterface WebKitFileEntry extends WebKitEntry {\n    file(successCallback: WebKitFileCallback, errorCallback?: WebKitErrorCallback): void;\n}\n\ndeclare var WebKitFileEntry: {\n    prototype: WebKitFileEntry;\n    new(): WebKitFileEntry;\n};\n\ninterface WebKitFileSystem {\n    readonly name: string;\n    readonly root: WebKitDirectoryEntry;\n}\n\ndeclare var WebKitFileSystem: {\n    prototype: WebKitFileSystem;\n    new(): WebKitFileSystem;\n};\n\ninterface WebKitPoint {\n    x: number;\n    y: number;\n}\n\ndeclare var WebKitPoint: {\n    prototype: WebKitPoint;\n    new(x?: number, y?: number): WebKitPoint;\n};\n\ninterface webkitRTCPeerConnection extends RTCPeerConnection {\n    addEventListener<K extends keyof RTCPeerConnectionEventMap>(type: K, listener: (this: webkitRTCPeerConnection, ev: RTCPeerConnectionEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var webkitRTCPeerConnection: {\n    prototype: webkitRTCPeerConnection;\n    new(configuration: RTCConfiguration): webkitRTCPeerConnection;\n};\n\ninterface WebSocketEventMap {\n    "close": CloseEvent;\n    "error": Event;\n    "message": MessageEvent;\n    "open": Event;\n}\n\ninterface WebSocket extends EventTarget {\n    binaryType: string;\n    readonly bufferedAmount: number;\n    readonly extensions: string;\n    onclose: (this: WebSocket, ev: CloseEvent) => any;\n    onerror: (this: WebSocket, ev: Event) => any;\n    onmessage: (this: WebSocket, ev: MessageEvent) => any;\n    onopen: (this: WebSocket, ev: Event) => any;\n    readonly protocol: string;\n    readonly readyState: number;\n    readonly url: string;\n    close(code?: number, reason?: string): void;\n    send(data: any): void;\n    readonly CLOSED: number;\n    readonly CLOSING: number;\n    readonly CONNECTING: number;\n    readonly OPEN: number;\n    addEventListener<K extends keyof WebSocketEventMap>(type: K, listener: (this: WebSocket, ev: WebSocketEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var WebSocket: {\n    prototype: WebSocket;\n    new(url: string, protocols?: string | string[]): WebSocket;\n    readonly CLOSED: number;\n    readonly CLOSING: number;\n    readonly CONNECTING: number;\n    readonly OPEN: number;\n};\n\ninterface WheelEvent extends MouseEvent {\n    readonly deltaMode: number;\n    readonly deltaX: number;\n    readonly deltaY: number;\n    readonly deltaZ: number;\n    readonly wheelDelta: number;\n    readonly wheelDeltaX: number;\n    readonly wheelDeltaY: number;\n    getCurrentPoint(element: Element): void;\n    initWheelEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, buttonArg: number, relatedTargetArg: EventTarget, modifiersListArg: string, deltaXArg: number, deltaYArg: number, deltaZArg: number, deltaMode: number): void;\n    readonly DOM_DELTA_LINE: number;\n    readonly DOM_DELTA_PAGE: number;\n    readonly DOM_DELTA_PIXEL: number;\n}\n\ndeclare var WheelEvent: {\n    prototype: WheelEvent;\n    new(typeArg: string, eventInitDict?: WheelEventInit): WheelEvent;\n    readonly DOM_DELTA_LINE: number;\n    readonly DOM_DELTA_PAGE: number;\n    readonly DOM_DELTA_PIXEL: number;\n};\n\ninterface WindowEventMap extends GlobalEventHandlersEventMap {\n    "abort": UIEvent;\n    "afterprint": Event;\n    "beforeprint": Event;\n    "beforeunload": BeforeUnloadEvent;\n    "blur": FocusEvent;\n    "canplay": Event;\n    "canplaythrough": Event;\n    "change": Event;\n    "click": MouseEvent;\n    "compassneedscalibration": Event;\n    "contextmenu": PointerEvent;\n    "dblclick": MouseEvent;\n    "devicelight": DeviceLightEvent;\n    "devicemotion": DeviceMotionEvent;\n    "deviceorientation": DeviceOrientationEvent;\n    "drag": DragEvent;\n    "dragend": DragEvent;\n    "dragenter": DragEvent;\n    "dragleave": DragEvent;\n    "dragover": DragEvent;\n    "dragstart": DragEvent;\n    "drop": DragEvent;\n    "durationchange": Event;\n    "emptied": Event;\n    "ended": MediaStreamErrorEvent;\n    "error": ErrorEvent;\n    "focus": FocusEvent;\n    "hashchange": HashChangeEvent;\n    "input": Event;\n    "invalid": Event;\n    "keydown": KeyboardEvent;\n    "keypress": KeyboardEvent;\n    "keyup": KeyboardEvent;\n    "load": Event;\n    "loadeddata": Event;\n    "loadedmetadata": Event;\n    "loadstart": Event;\n    "message": MessageEvent;\n    "mousedown": MouseEvent;\n    "mouseenter": MouseEvent;\n    "mouseleave": MouseEvent;\n    "mousemove": MouseEvent;\n    "mouseout": MouseEvent;\n    "mouseover": MouseEvent;\n    "mouseup": MouseEvent;\n    "mousewheel": WheelEvent;\n    "MSGestureChange": MSGestureEvent;\n    "MSGestureDoubleTap": MSGestureEvent;\n    "MSGestureEnd": MSGestureEvent;\n    "MSGestureHold": MSGestureEvent;\n    "MSGestureStart": MSGestureEvent;\n    "MSGestureTap": MSGestureEvent;\n    "MSInertiaStart": MSGestureEvent;\n    "MSPointerCancel": MSPointerEvent;\n    "MSPointerDown": MSPointerEvent;\n    "MSPointerEnter": MSPointerEvent;\n    "MSPointerLeave": MSPointerEvent;\n    "MSPointerMove": MSPointerEvent;\n    "MSPointerOut": MSPointerEvent;\n    "MSPointerOver": MSPointerEvent;\n    "MSPointerUp": MSPointerEvent;\n    "offline": Event;\n    "online": Event;\n    "orientationchange": Event;\n    "pagehide": PageTransitionEvent;\n    "pageshow": PageTransitionEvent;\n    "pause": Event;\n    "play": Event;\n    "playing": Event;\n    "popstate": PopStateEvent;\n    "progress": ProgressEvent;\n    "ratechange": Event;\n    "readystatechange": ProgressEvent;\n    "reset": Event;\n    "resize": UIEvent;\n    "scroll": UIEvent;\n    "seeked": Event;\n    "seeking": Event;\n    "select": UIEvent;\n    "stalled": Event;\n    "storage": StorageEvent;\n    "submit": Event;\n    "suspend": Event;\n    "timeupdate": Event;\n    "touchcancel": TouchEvent;\n    "touchend": TouchEvent;\n    "touchmove": TouchEvent;\n    "touchstart": TouchEvent;\n    "unload": Event;\n    "volumechange": Event;\n    "waiting": Event;\n}\n\ninterface Window extends EventTarget, WindowTimers, WindowSessionStorage, WindowLocalStorage, WindowConsole, GlobalEventHandlers, IDBEnvironment, WindowBase64, GlobalFetch {\n    readonly applicationCache: ApplicationCache;\n    readonly caches: CacheStorage;\n    readonly clientInformation: Navigator;\n    readonly closed: boolean;\n    readonly crypto: Crypto;\n    defaultStatus: string;\n    readonly devicePixelRatio: number;\n    readonly document: Document;\n    readonly doNotTrack: string;\n    event: Event | undefined;\n    readonly external: External;\n    readonly frameElement: Element;\n    readonly frames: Window;\n    readonly history: History;\n    readonly innerHeight: number;\n    readonly innerWidth: number;\n    readonly isSecureContext: boolean;\n    readonly length: number;\n    readonly location: Location;\n    readonly locationbar: BarProp;\n    readonly menubar: BarProp;\n    readonly msContentScript: ExtensionScriptApis;\n    readonly msCredentials: MSCredentials;\n    name: string;\n    readonly navigator: Navigator;\n    offscreenBuffering: string | boolean;\n    onabort: (this: Window, ev: UIEvent) => any;\n    onafterprint: (this: Window, ev: Event) => any;\n    onbeforeprint: (this: Window, ev: Event) => any;\n    onbeforeunload: (this: Window, ev: BeforeUnloadEvent) => any;\n    onblur: (this: Window, ev: FocusEvent) => any;\n    oncanplay: (this: Window, ev: Event) => any;\n    oncanplaythrough: (this: Window, ev: Event) => any;\n    onchange: (this: Window, ev: Event) => any;\n    onclick: (this: Window, ev: MouseEvent) => any;\n    oncompassneedscalibration: (this: Window, ev: Event) => any;\n    oncontextmenu: (this: Window, ev: PointerEvent) => any;\n    ondblclick: (this: Window, ev: MouseEvent) => any;\n    ondevicelight: (this: Window, ev: DeviceLightEvent) => any;\n    ondevicemotion: (this: Window, ev: DeviceMotionEvent) => any;\n    ondeviceorientation: (this: Window, ev: DeviceOrientationEvent) => any;\n    ondrag: (this: Window, ev: DragEvent) => any;\n    ondragend: (this: Window, ev: DragEvent) => any;\n    ondragenter: (this: Window, ev: DragEvent) => any;\n    ondragleave: (this: Window, ev: DragEvent) => any;\n    ondragover: (this: Window, ev: DragEvent) => any;\n    ondragstart: (this: Window, ev: DragEvent) => any;\n    ondrop: (this: Window, ev: DragEvent) => any;\n    ondurationchange: (this: Window, ev: Event) => any;\n    onemptied: (this: Window, ev: Event) => any;\n    onended: (this: Window, ev: MediaStreamErrorEvent) => any;\n    onerror: ErrorEventHandler;\n    onfocus: (this: Window, ev: FocusEvent) => any;\n    onhashchange: (this: Window, ev: HashChangeEvent) => any;\n    oninput: (this: Window, ev: Event) => any;\n    oninvalid: (this: Window, ev: Event) => any;\n    onkeydown: (this: Window, ev: KeyboardEvent) => any;\n    onkeypress: (this: Window, ev: KeyboardEvent) => any;\n    onkeyup: (this: Window, ev: KeyboardEvent) => any;\n    onload: (this: Window, ev: Event) => any;\n    onloadeddata: (this: Window, ev: Event) => any;\n    onloadedmetadata: (this: Window, ev: Event) => any;\n    onloadstart: (this: Window, ev: Event) => any;\n    onmessage: (this: Window, ev: MessageEvent) => any;\n    onmousedown: (this: Window, ev: MouseEvent) => any;\n    onmouseenter: (this: Window, ev: MouseEvent) => any;\n    onmouseleave: (this: Window, ev: MouseEvent) => any;\n    onmousemove: (this: Window, ev: MouseEvent) => any;\n    onmouseout: (this: Window, ev: MouseEvent) => any;\n    onmouseover: (this: Window, ev: MouseEvent) => any;\n    onmouseup: (this: Window, ev: MouseEvent) => any;\n    onmousewheel: (this: Window, ev: WheelEvent) => any;\n    onmsgesturechange: (this: Window, ev: MSGestureEvent) => any;\n    onmsgesturedoubletap: (this: Window, ev: MSGestureEvent) => any;\n    onmsgestureend: (this: Window, ev: MSGestureEvent) => any;\n    onmsgesturehold: (this: Window, ev: MSGestureEvent) => any;\n    onmsgesturestart: (this: Window, ev: MSGestureEvent) => any;\n    onmsgesturetap: (this: Window, ev: MSGestureEvent) => any;\n    onmsinertiastart: (this: Window, ev: MSGestureEvent) => any;\n    onmspointercancel: (this: Window, ev: MSPointerEvent) => any;\n    onmspointerdown: (this: Window, ev: MSPointerEvent) => any;\n    onmspointerenter: (this: Window, ev: MSPointerEvent) => any;\n    onmspointerleave: (this: Window, ev: MSPointerEvent) => any;\n    onmspointermove: (this: Window, ev: MSPointerEvent) => any;\n    onmspointerout: (this: Window, ev: MSPointerEvent) => any;\n    onmspointerover: (this: Window, ev: MSPointerEvent) => any;\n    onmspointerup: (this: Window, ev: MSPointerEvent) => any;\n    onoffline: (this: Window, ev: Event) => any;\n    ononline: (this: Window, ev: Event) => any;\n    onorientationchange: (this: Window, ev: Event) => any;\n    onpagehide: (this: Window, ev: PageTransitionEvent) => any;\n    onpageshow: (this: Window, ev: PageTransitionEvent) => any;\n    onpause: (this: Window, ev: Event) => any;\n    onplay: (this: Window, ev: Event) => any;\n    onplaying: (this: Window, ev: Event) => any;\n    onpopstate: (this: Window, ev: PopStateEvent) => any;\n    onprogress: (this: Window, ev: ProgressEvent) => any;\n    onratechange: (this: Window, ev: Event) => any;\n    onreadystatechange: (this: Window, ev: ProgressEvent) => any;\n    onreset: (this: Window, ev: Event) => any;\n    onresize: (this: Window, ev: UIEvent) => any;\n    onscroll: (this: Window, ev: UIEvent) => any;\n    onseeked: (this: Window, ev: Event) => any;\n    onseeking: (this: Window, ev: Event) => any;\n    onselect: (this: Window, ev: UIEvent) => any;\n    onstalled: (this: Window, ev: Event) => any;\n    onstorage: (this: Window, ev: StorageEvent) => any;\n    onsubmit: (this: Window, ev: Event) => any;\n    onsuspend: (this: Window, ev: Event) => any;\n    ontimeupdate: (this: Window, ev: Event) => any;\n    ontouchcancel: (ev: TouchEvent) => any;\n    ontouchend: (ev: TouchEvent) => any;\n    ontouchmove: (ev: TouchEvent) => any;\n    ontouchstart: (ev: TouchEvent) => any;\n    onunload: (this: Window, ev: Event) => any;\n    onvolumechange: (this: Window, ev: Event) => any;\n    onwaiting: (this: Window, ev: Event) => any;\n    opener: any;\n    orientation: string | number;\n    readonly outerHeight: number;\n    readonly outerWidth: number;\n    readonly pageXOffset: number;\n    readonly pageYOffset: number;\n    readonly parent: Window;\n    readonly performance: Performance;\n    readonly personalbar: BarProp;\n    readonly screen: Screen;\n    readonly screenLeft: number;\n    readonly screenTop: number;\n    readonly screenX: number;\n    readonly screenY: number;\n    readonly scrollbars: BarProp;\n    readonly scrollX: number;\n    readonly scrollY: number;\n    readonly self: Window;\n    readonly speechSynthesis: SpeechSynthesis;\n    status: string;\n    readonly statusbar: BarProp;\n    readonly styleMedia: StyleMedia;\n    readonly toolbar: BarProp;\n    readonly top: Window;\n    readonly window: Window;\n    URL: typeof URL;\n    URLSearchParams: typeof URLSearchParams;\n    Blob: typeof Blob;\n    customElements: CustomElementRegistry;\n    alert(message?: any): void;\n    blur(): void;\n    cancelAnimationFrame(handle: number): void;\n    captureEvents(): void;\n    close(): void;\n    confirm(message?: string): boolean;\n    departFocus(navigationReason: NavigationReason, origin: FocusNavigationOrigin): void;\n    focus(): void;\n    getComputedStyle(elt: Element, pseudoElt?: string): CSSStyleDeclaration;\n    getMatchedCSSRules(elt: Element, pseudoElt?: string): CSSRuleList;\n    getSelection(): Selection;\n    matchMedia(mediaQuery: string): MediaQueryList;\n    moveBy(x?: number, y?: number): void;\n    moveTo(x?: number, y?: number): void;\n    msWriteProfilerMark(profilerMarkName: string): void;\n    open(url?: string, target?: string, features?: string, replace?: boolean): Window;\n    postMessage(message: any, targetOrigin: string, transfer?: any[]): void;\n    print(): void;\n    prompt(message?: string, _default?: string): string | null;\n    releaseEvents(): void;\n    requestAnimationFrame(callback: FrameRequestCallback): number;\n    resizeBy(x?: number, y?: number): void;\n    resizeTo(x?: number, y?: number): void;\n    scroll(x?: number, y?: number): void;\n    scrollBy(x?: number, y?: number): void;\n    scrollTo(x?: number, y?: number): void;\n    stop(): void;\n    webkitCancelAnimationFrame(handle: number): void;\n    webkitConvertPointFromNodeToPage(node: Node, pt: WebKitPoint): WebKitPoint;\n    webkitConvertPointFromPageToNode(node: Node, pt: WebKitPoint): WebKitPoint;\n    webkitRequestAnimationFrame(callback: FrameRequestCallback): number;\n    createImageBitmap(image: HTMLImageElement | SVGImageElement | HTMLVideoElement | HTMLCanvasElement | ImageBitmap | ImageData | Blob, options?: ImageBitmapOptions): Promise<ImageBitmap>;\n    createImageBitmap(image: HTMLImageElement | SVGImageElement | HTMLVideoElement | HTMLCanvasElement | ImageBitmap | ImageData | Blob, sx: number, sy: number, sw: number, sh: number, options?: ImageBitmapOptions): Promise<ImageBitmap>;\n    scroll(options?: ScrollToOptions): void;\n    scrollTo(options?: ScrollToOptions): void;\n    scrollBy(options?: ScrollToOptions): void;\n    addEventListener<K extends keyof WindowEventMap>(type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var Window: {\n    prototype: Window;\n    new(): Window;\n};\n\ninterface WorkerEventMap extends AbstractWorkerEventMap {\n    "message": MessageEvent;\n}\n\ninterface Worker extends EventTarget, AbstractWorker {\n    onmessage: (this: Worker, ev: MessageEvent) => any;\n    postMessage(message: any, transfer?: any[]): void;\n    terminate(): void;\n    addEventListener<K extends keyof WorkerEventMap>(type: K, listener: (this: Worker, ev: WorkerEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var Worker: {\n    prototype: Worker;\n    new(stringUrl: string): Worker;\n};\n\ninterface XMLDocument extends Document {\n    addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: XMLDocument, ev: DocumentEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var XMLDocument: {\n    prototype: XMLDocument;\n    new(): XMLDocument;\n};\n\ninterface XMLHttpRequestEventMap extends XMLHttpRequestEventTargetEventMap {\n    "readystatechange": Event;\n}\n\ninterface XMLHttpRequest extends EventTarget, XMLHttpRequestEventTarget {\n    onreadystatechange: (this: XMLHttpRequest, ev: Event) => any;\n    readonly readyState: number;\n    readonly response: any;\n    readonly responseText: string;\n    responseType: XMLHttpRequestResponseType;\n    readonly responseURL: string;\n    readonly responseXML: Document | null;\n    readonly status: number;\n    readonly statusText: string;\n    timeout: number;\n    readonly upload: XMLHttpRequestUpload;\n    withCredentials: boolean;\n    msCaching?: string;\n    abort(): void;\n    getAllResponseHeaders(): string;\n    getResponseHeader(header: string): string | null;\n    msCachingEnabled(): boolean;\n    open(method: string, url: string, async?: boolean, user?: string, password?: string): void;\n    overrideMimeType(mime: string): void;\n    send(data?: Document): void;\n    send(data?: string): void;\n    send(data?: any): void;\n    setRequestHeader(header: string, value: string): void;\n    readonly DONE: number;\n    readonly HEADERS_RECEIVED: number;\n    readonly LOADING: number;\n    readonly OPENED: number;\n    readonly UNSENT: number;\n    addEventListener<K extends keyof XMLHttpRequestEventMap>(type: K, listener: (this: XMLHttpRequest, ev: XMLHttpRequestEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var XMLHttpRequest: {\n    prototype: XMLHttpRequest;\n    new(): XMLHttpRequest;\n    readonly DONE: number;\n    readonly HEADERS_RECEIVED: number;\n    readonly LOADING: number;\n    readonly OPENED: number;\n    readonly UNSENT: number;\n};\n\ninterface XMLHttpRequestUpload extends EventTarget, XMLHttpRequestEventTarget {\n    addEventListener<K extends keyof XMLHttpRequestEventTargetEventMap>(type: K, listener: (this: XMLHttpRequestUpload, ev: XMLHttpRequestEventTargetEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ndeclare var XMLHttpRequestUpload: {\n    prototype: XMLHttpRequestUpload;\n    new(): XMLHttpRequestUpload;\n};\n\ninterface XMLSerializer {\n    serializeToString(target: Node): string;\n}\n\ndeclare var XMLSerializer: {\n    prototype: XMLSerializer;\n    new(): XMLSerializer;\n};\n\ninterface XPathEvaluator {\n    createExpression(expression: string, resolver: XPathNSResolver): XPathExpression;\n    createNSResolver(nodeResolver?: Node): XPathNSResolver;\n    evaluate(expression: string, contextNode: Node, resolver: XPathNSResolver | null, type: number, result: XPathResult | null): XPathResult;\n}\n\ndeclare var XPathEvaluator: {\n    prototype: XPathEvaluator;\n    new(): XPathEvaluator;\n};\n\ninterface XPathExpression {\n    evaluate(contextNode: Node, type: number, result: XPathResult | null): XPathResult;\n}\n\ndeclare var XPathExpression: {\n    prototype: XPathExpression;\n    new(): XPathExpression;\n};\n\ninterface XPathNSResolver {\n    lookupNamespaceURI(prefix: string): string;\n}\n\ndeclare var XPathNSResolver: {\n    prototype: XPathNSResolver;\n    new(): XPathNSResolver;\n};\n\ninterface XPathResult {\n    readonly booleanValue: boolean;\n    readonly invalidIteratorState: boolean;\n    readonly numberValue: number;\n    readonly resultType: number;\n    readonly singleNodeValue: Node;\n    readonly snapshotLength: number;\n    readonly stringValue: string;\n    iterateNext(): Node;\n    snapshotItem(index: number): Node;\n    readonly ANY_TYPE: number;\n    readonly ANY_UNORDERED_NODE_TYPE: number;\n    readonly BOOLEAN_TYPE: number;\n    readonly FIRST_ORDERED_NODE_TYPE: number;\n    readonly NUMBER_TYPE: number;\n    readonly ORDERED_NODE_ITERATOR_TYPE: number;\n    readonly ORDERED_NODE_SNAPSHOT_TYPE: number;\n    readonly STRING_TYPE: number;\n    readonly UNORDERED_NODE_ITERATOR_TYPE: number;\n    readonly UNORDERED_NODE_SNAPSHOT_TYPE: number;\n}\n\ndeclare var XPathResult: {\n    prototype: XPathResult;\n    new(): XPathResult;\n    readonly ANY_TYPE: number;\n    readonly ANY_UNORDERED_NODE_TYPE: number;\n    readonly BOOLEAN_TYPE: number;\n    readonly FIRST_ORDERED_NODE_TYPE: number;\n    readonly NUMBER_TYPE: number;\n    readonly ORDERED_NODE_ITERATOR_TYPE: number;\n    readonly ORDERED_NODE_SNAPSHOT_TYPE: number;\n    readonly STRING_TYPE: number;\n    readonly UNORDERED_NODE_ITERATOR_TYPE: number;\n    readonly UNORDERED_NODE_SNAPSHOT_TYPE: number;\n};\n\ninterface XSLTProcessor {\n    clearParameters(): void;\n    getParameter(namespaceURI: string, localName: string): any;\n    importStylesheet(style: Node): void;\n    removeParameter(namespaceURI: string, localName: string): void;\n    reset(): void;\n    setParameter(namespaceURI: string, localName: string, value: any): void;\n    transformToDocument(source: Node): Document;\n    transformToFragment(source: Node, document: Document): DocumentFragment;\n}\n\ndeclare var XSLTProcessor: {\n    prototype: XSLTProcessor;\n    new(): XSLTProcessor;\n};\n\ninterface AbstractWorkerEventMap {\n    "error": ErrorEvent;\n}\n\ninterface AbstractWorker {\n    onerror: (this: AbstractWorker, ev: ErrorEvent) => any;\n    addEventListener<K extends keyof AbstractWorkerEventMap>(type: K, listener: (this: AbstractWorker, ev: AbstractWorkerEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ninterface Body {\n    readonly bodyUsed: boolean;\n    arrayBuffer(): Promise<ArrayBuffer>;\n    blob(): Promise<Blob>;\n    json(): Promise<any>;\n    text(): Promise<string>;\n    formData(): Promise<FormData>;\n}\n\ninterface CanvasPathMethods {\n    arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise?: boolean): void;\n    arcTo(x1: number, y1: number, x2: number, y2: number, radius: number): void;\n    bezierCurveTo(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number): void;\n    closePath(): void;\n    ellipse(x: number, y: number, radiusX: number, radiusY: number, rotation: number, startAngle: number, endAngle: number, anticlockwise?: boolean): void;\n    lineTo(x: number, y: number): void;\n    moveTo(x: number, y: number): void;\n    quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): void;\n    rect(x: number, y: number, w: number, h: number): void;\n}\n\ninterface ChildNode {\n    remove(): void;\n}\n\ninterface DocumentEvent {\n    createEvent(eventInterface: "AnimationEvent"): AnimationEvent;\n    createEvent(eventInterface: "AudioProcessingEvent"): AudioProcessingEvent;\n    createEvent(eventInterface: "BeforeUnloadEvent"): BeforeUnloadEvent;\n    createEvent(eventInterface: "ClipboardEvent"): ClipboardEvent;\n    createEvent(eventInterface: "CloseEvent"): CloseEvent;\n    createEvent(eventInterface: "CompositionEvent"): CompositionEvent;\n    createEvent(eventInterface: "CustomEvent"): CustomEvent;\n    createEvent(eventInterface: "DeviceLightEvent"): DeviceLightEvent;\n    createEvent(eventInterface: "DeviceMotionEvent"): DeviceMotionEvent;\n    createEvent(eventInterface: "DeviceOrientationEvent"): DeviceOrientationEvent;\n    createEvent(eventInterface: "DragEvent"): DragEvent;\n    createEvent(eventInterface: "ErrorEvent"): ErrorEvent;\n    createEvent(eventInterface: "Event"): Event;\n    createEvent(eventInterface: "Events"): Event;\n    createEvent(eventInterface: "FocusEvent"): FocusEvent;\n    createEvent(eventInterface: "FocusNavigationEvent"): FocusNavigationEvent;\n    createEvent(eventInterface: "GamepadEvent"): GamepadEvent;\n    createEvent(eventInterface: "HashChangeEvent"): HashChangeEvent;\n    createEvent(eventInterface: "IDBVersionChangeEvent"): IDBVersionChangeEvent;\n    createEvent(eventInterface: "KeyboardEvent"): KeyboardEvent;\n    createEvent(eventInterface: "ListeningStateChangedEvent"): ListeningStateChangedEvent;\n    createEvent(eventInterface: "LongRunningScriptDetectedEvent"): LongRunningScriptDetectedEvent;\n    createEvent(eventInterface: "MSGestureEvent"): MSGestureEvent;\n    createEvent(eventInterface: "MSManipulationEvent"): MSManipulationEvent;\n    createEvent(eventInterface: "MSMediaKeyMessageEvent"): MSMediaKeyMessageEvent;\n    createEvent(eventInterface: "MSMediaKeyNeededEvent"): MSMediaKeyNeededEvent;\n    createEvent(eventInterface: "MSPointerEvent"): MSPointerEvent;\n    createEvent(eventInterface: "MSSiteModeEvent"): MSSiteModeEvent;\n    createEvent(eventInterface: "MediaEncryptedEvent"): MediaEncryptedEvent;\n    createEvent(eventInterface: "MediaKeyMessageEvent"): MediaKeyMessageEvent;\n    createEvent(eventInterface: "MediaStreamErrorEvent"): MediaStreamErrorEvent;\n    createEvent(eventInterface: "MediaStreamEvent"): MediaStreamEvent;\n    createEvent(eventInterface: "MediaStreamTrackEvent"): MediaStreamTrackEvent;\n    createEvent(eventInterface: "MessageEvent"): MessageEvent;\n    createEvent(eventInterface: "MouseEvent"): MouseEvent;\n    createEvent(eventInterface: "MouseEvents"): MouseEvent;\n    createEvent(eventInterface: "MutationEvent"): MutationEvent;\n    createEvent(eventInterface: "MutationEvents"): MutationEvent;\n    createEvent(eventInterface: "NavigationCompletedEvent"): NavigationCompletedEvent;\n    createEvent(eventInterface: "NavigationEvent"): NavigationEvent;\n    createEvent(eventInterface: "NavigationEventWithReferrer"): NavigationEventWithReferrer;\n    createEvent(eventInterface: "OfflineAudioCompletionEvent"): OfflineAudioCompletionEvent;\n    createEvent(eventInterface: "OverflowEvent"): OverflowEvent;\n    createEvent(eventInterface: "PageTransitionEvent"): PageTransitionEvent;\n    createEvent(eventInterface: "PaymentRequestUpdateEvent"): PaymentRequestUpdateEvent;\n    createEvent(eventInterface: "PermissionRequestedEvent"): PermissionRequestedEvent;\n    createEvent(eventInterface: "PointerEvent"): PointerEvent;\n    createEvent(eventInterface: "PopStateEvent"): PopStateEvent;\n    createEvent(eventInterface: "ProgressEvent"): ProgressEvent;\n    createEvent(eventInterface: "RTCDTMFToneChangeEvent"): RTCDTMFToneChangeEvent;\n    createEvent(eventInterface: "RTCDtlsTransportStateChangedEvent"): RTCDtlsTransportStateChangedEvent;\n    createEvent(eventInterface: "RTCIceCandidatePairChangedEvent"): RTCIceCandidatePairChangedEvent;\n    createEvent(eventInterface: "RTCIceGathererEvent"): RTCIceGathererEvent;\n    createEvent(eventInterface: "RTCIceTransportStateChangedEvent"): RTCIceTransportStateChangedEvent;\n    createEvent(eventInterface: "RTCPeerConnectionIceEvent"): RTCPeerConnectionIceEvent;\n    createEvent(eventInterface: "RTCSsrcConflictEvent"): RTCSsrcConflictEvent;\n    createEvent(eventInterface: "SVGZoomEvent"): SVGZoomEvent;\n    createEvent(eventInterface: "SVGZoomEvents"): SVGZoomEvent;\n    createEvent(eventInterface: "ScriptNotifyEvent"): ScriptNotifyEvent;\n    createEvent(eventInterface: "ServiceWorkerMessageEvent"): ServiceWorkerMessageEvent;\n    createEvent(eventInterface: "SpeechSynthesisEvent"): SpeechSynthesisEvent;\n    createEvent(eventInterface: "StorageEvent"): StorageEvent;\n    createEvent(eventInterface: "TextEvent"): TextEvent;\n    createEvent(eventInterface: "TouchEvent"): TouchEvent;\n    createEvent(eventInterface: "TrackEvent"): TrackEvent;\n    createEvent(eventInterface: "TransitionEvent"): TransitionEvent;\n    createEvent(eventInterface: "UIEvent"): UIEvent;\n    createEvent(eventInterface: "UIEvents"): UIEvent;\n    createEvent(eventInterface: "UnviewableContentIdentifiedEvent"): UnviewableContentIdentifiedEvent;\n    createEvent(eventInterface: "WebGLContextEvent"): WebGLContextEvent;\n    createEvent(eventInterface: "WheelEvent"): WheelEvent;\n    createEvent(eventInterface: string): Event;\n}\n\ninterface DOML2DeprecatedColorProperty {\n    color: string;\n}\n\ninterface DOML2DeprecatedSizeProperty {\n    size: number;\n}\n\ninterface ElementTraversal {\n    readonly childElementCount: number;\n    readonly firstElementChild: Element | null;\n    readonly lastElementChild: Element | null;\n    readonly nextElementSibling: Element | null;\n    readonly previousElementSibling: Element | null;\n}\n\ninterface GetSVGDocument {\n    getSVGDocument(): Document;\n}\n\ninterface GlobalEventHandlersEventMap {\n    "pointercancel": PointerEvent;\n    "pointerdown": PointerEvent;\n    "pointerenter": PointerEvent;\n    "pointerleave": PointerEvent;\n    "pointermove": PointerEvent;\n    "pointerout": PointerEvent;\n    "pointerover": PointerEvent;\n    "pointerup": PointerEvent;\n    "wheel": WheelEvent;\n}\n\ninterface GlobalEventHandlers {\n    onpointercancel: (this: GlobalEventHandlers, ev: PointerEvent) => any;\n    onpointerdown: (this: GlobalEventHandlers, ev: PointerEvent) => any;\n    onpointerenter: (this: GlobalEventHandlers, ev: PointerEvent) => any;\n    onpointerleave: (this: GlobalEventHandlers, ev: PointerEvent) => any;\n    onpointermove: (this: GlobalEventHandlers, ev: PointerEvent) => any;\n    onpointerout: (this: GlobalEventHandlers, ev: PointerEvent) => any;\n    onpointerover: (this: GlobalEventHandlers, ev: PointerEvent) => any;\n    onpointerup: (this: GlobalEventHandlers, ev: PointerEvent) => any;\n    onwheel: (this: GlobalEventHandlers, ev: WheelEvent) => any;\n    addEventListener<K extends keyof GlobalEventHandlersEventMap>(type: K, listener: (this: GlobalEventHandlers, ev: GlobalEventHandlersEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ninterface GlobalFetch {\n    fetch(input: RequestInfo, init?: RequestInit): Promise<Response>;\n}\n\ninterface HTMLTableAlignment {\n    /**\n     * Sets or retrieves a value that you can use to implement your own ch functionality for the object.\n     */\n    ch: string;\n    /**\n     * Sets or retrieves a value that you can use to implement your own chOff functionality for the object.\n     */\n    chOff: string;\n    /**\n     * Sets or retrieves how text and other content are vertically aligned within the object that contains them.\n     */\n    vAlign: string;\n}\n\ninterface IDBEnvironment {\n    readonly indexedDB: IDBFactory;\n}\n\ninterface LinkStyle {\n    readonly sheet: StyleSheet;\n}\n\ninterface MSBaseReaderEventMap {\n    "abort": Event;\n    "error": ErrorEvent;\n    "load": Event;\n    "loadend": ProgressEvent;\n    "loadstart": Event;\n    "progress": ProgressEvent;\n}\n\ninterface MSBaseReader {\n    onabort: (this: MSBaseReader, ev: Event) => any;\n    onerror: (this: MSBaseReader, ev: ErrorEvent) => any;\n    onload: (this: MSBaseReader, ev: Event) => any;\n    onloadend: (this: MSBaseReader, ev: ProgressEvent) => any;\n    onloadstart: (this: MSBaseReader, ev: Event) => any;\n    onprogress: (this: MSBaseReader, ev: ProgressEvent) => any;\n    readonly readyState: number;\n    readonly result: any;\n    abort(): void;\n    readonly DONE: number;\n    readonly EMPTY: number;\n    readonly LOADING: number;\n    addEventListener<K extends keyof MSBaseReaderEventMap>(type: K, listener: (this: MSBaseReader, ev: MSBaseReaderEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ninterface MSFileSaver {\n    msSaveBlob(blob: any, defaultName?: string): boolean;\n    msSaveOrOpenBlob(blob: any, defaultName?: string): boolean;\n}\n\ninterface MSNavigatorDoNotTrack {\n    confirmSiteSpecificTrackingException(args: ConfirmSiteSpecificExceptionsInformation): boolean;\n    confirmWebWideTrackingException(args: ExceptionInformation): boolean;\n    removeSiteSpecificTrackingException(args: ExceptionInformation): void;\n    removeWebWideTrackingException(args: ExceptionInformation): void;\n    storeSiteSpecificTrackingException(args: StoreSiteSpecificExceptionsInformation): void;\n    storeWebWideTrackingException(args: StoreExceptionsInformation): void;\n}\n\ninterface NavigatorBeacon {\n    sendBeacon(url: USVString, data?: BodyInit): boolean;\n}\n\ninterface NavigatorConcurrentHardware {\n    readonly hardwareConcurrency: number;\n}\n\ninterface NavigatorContentUtils {\n}\n\ninterface NavigatorGeolocation {\n    readonly geolocation: Geolocation;\n}\n\ninterface NavigatorID {\n    readonly appCodeName: string;\n    readonly appName: string;\n    readonly appVersion: string;\n    readonly platform: string;\n    readonly product: string;\n    readonly productSub: string;\n    readonly userAgent: string;\n    readonly vendor: string;\n    readonly vendorSub: string;\n}\n\ninterface NavigatorOnLine {\n    readonly onLine: boolean;\n}\n\ninterface NavigatorStorageUtils {\n}\n\ninterface NavigatorUserMedia {\n    readonly mediaDevices: MediaDevices;\n    getUserMedia(constraints: MediaStreamConstraints, successCallback: NavigatorUserMediaSuccessCallback, errorCallback: NavigatorUserMediaErrorCallback): void;\n}\n\ninterface NodeSelector {\n    querySelector<K extends keyof ElementTagNameMap>(selectors: K): ElementTagNameMap[K] | null;\n    querySelector(selectors: string): Element | null;\n    querySelectorAll<K extends keyof ElementListTagNameMap>(selectors: K): ElementListTagNameMap[K];\n    querySelectorAll(selectors: string): NodeListOf<Element>;\n}\n\ninterface RandomSource {\n    getRandomValues(array: ArrayBufferView): ArrayBufferView;\n}\n\ninterface SVGAnimatedPoints {\n    readonly animatedPoints: SVGPointList;\n    readonly points: SVGPointList;\n}\n\ninterface SVGFilterPrimitiveStandardAttributes {\n    readonly height: SVGAnimatedLength;\n    readonly result: SVGAnimatedString;\n    readonly width: SVGAnimatedLength;\n    readonly x: SVGAnimatedLength;\n    readonly y: SVGAnimatedLength;\n}\n\ninterface SVGFitToViewBox {\n    readonly preserveAspectRatio: SVGAnimatedPreserveAspectRatio;\n    readonly viewBox: SVGAnimatedRect;\n}\n\ninterface SVGTests {\n    readonly requiredExtensions: SVGStringList;\n    readonly requiredFeatures: SVGStringList;\n    readonly systemLanguage: SVGStringList;\n    hasExtension(extension: string): boolean;\n}\n\ninterface SVGURIReference {\n    readonly href: SVGAnimatedString;\n}\n\ninterface WindowBase64 {\n    atob(encodedString: string): string;\n    btoa(rawString: string): string;\n}\n\ninterface WindowConsole {\n    readonly console: Console;\n}\n\ninterface WindowLocalStorage {\n    readonly localStorage: Storage;\n}\n\ninterface WindowSessionStorage {\n    readonly sessionStorage: Storage;\n}\n\ninterface WindowTimers extends Object, WindowTimersExtension {\n    clearInterval(handle: number): void;\n    clearTimeout(handle: number): void;\n    setInterval(handler: (...args: any[]) => void, timeout: number): number;\n    setInterval(handler: any, timeout?: any, ...args: any[]): number;\n    setTimeout(handler: (...args: any[]) => void, timeout: number): number;\n    setTimeout(handler: any, timeout?: any, ...args: any[]): number;\n}\n\ninterface WindowTimersExtension {\n    clearImmediate(handle: number): void;\n    setImmediate(handler: (...args: any[]) => void): number;\n    setImmediate(handler: any, ...args: any[]): number;\n}\n\ninterface XMLHttpRequestEventTargetEventMap {\n    "abort": Event;\n    "error": ErrorEvent;\n    "load": Event;\n    "loadend": ProgressEvent;\n    "loadstart": Event;\n    "progress": ProgressEvent;\n    "timeout": ProgressEvent;\n}\n\ninterface XMLHttpRequestEventTarget {\n    onabort: (this: XMLHttpRequestEventTarget, ev: Event) => any;\n    onerror: (this: XMLHttpRequestEventTarget, ev: ErrorEvent) => any;\n    onload: (this: XMLHttpRequestEventTarget, ev: Event) => any;\n    onloadend: (this: XMLHttpRequestEventTarget, ev: ProgressEvent) => any;\n    onloadstart: (this: XMLHttpRequestEventTarget, ev: Event) => any;\n    onprogress: (this: XMLHttpRequestEventTarget, ev: ProgressEvent) => any;\n    ontimeout: (this: XMLHttpRequestEventTarget, ev: ProgressEvent) => any;\n    addEventListener<K extends keyof XMLHttpRequestEventTargetEventMap>(type: K, listener: (this: XMLHttpRequestEventTarget, ev: XMLHttpRequestEventTargetEventMap[K]) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\n}\n\ninterface ErrorEventInit {\n    message?: string;\n    filename?: string;\n    lineno?: number;\n    conlno?: number;\n    error?: any;\n}\n\ninterface StorageEventInit extends EventInit {\n    key?: string;\n    oldValue?: string;\n    newValue?: string;\n    url: string;\n    storageArea?: Storage;\n}\n\ninterface Canvas2DContextAttributes {\n    alpha?: boolean;\n    willReadFrequently?: boolean;\n    storage?: boolean;\n    [attribute: string]: boolean | string | undefined;\n}\n\ninterface ImageBitmapOptions {\n    imageOrientation?: "none" | "flipY";\n    premultiplyAlpha?: "none" | "premultiply" | "default";\n    colorSpaceConversion?: "none" | "default";\n    resizeWidth?: number;\n    resizeHeight?: number;\n    resizeQuality?: "pixelated" | "low" | "medium" | "high";\n}\n\ninterface ImageBitmap {\n    readonly width: number;\n    readonly height: number;\n    close(): void;\n}\n\ninterface URLSearchParams {\n    /**\n     * Appends a specified key/value pair as a new search parameter.\n     */\n    append(name: string, value: string): void;\n    /**\n     * Deletes the given search parameter, and its associated value, from the list of all search parameters.\n     */\n    delete(name: string): void;\n    /**\n     * Returns the first value associated to the given search parameter.\n     */\n    get(name: string): string | null;\n    /**\n     * Returns all the values association with a given search parameter.\n     */\n    getAll(name: string): string[];\n    /**\n     * Returns a Boolean indicating if such a search parameter exists.\n     */\n    has(name: string): boolean;\n    /**\n     * Sets the value associated to a given search parameter to the given value. If there were several values, delete the others.\n     */\n    set(name: string, value: string): void;\n}\n\ndeclare var URLSearchParams: {\n    prototype: URLSearchParams;\n    /**\n     * Constructor returning a URLSearchParams object.\n     */\n    new (init?: string | URLSearchParams): URLSearchParams;\n};\n\ninterface NodeListOf<TNode extends Node> extends NodeList {\n    length: number;\n    item(index: number): TNode;\n    [index: number]: TNode;\n}\n\ninterface HTMLCollectionOf<T extends Element> extends HTMLCollection {\n    item(index: number): T;\n    namedItem(name: string): T;\n    [index: number]: T;\n}\n\ninterface BlobPropertyBag {\n    type?: string;\n    endings?: string;\n}\n\ninterface FilePropertyBag {\n    type?: string;\n    lastModified?: number;\n}\n\ninterface EventListenerObject {\n    handleEvent(evt: Event): void;\n}\n\ninterface ProgressEventInit extends EventInit {\n    lengthComputable?: boolean;\n    loaded?: number;\n    total?: number;\n}\n\ninterface ScrollOptions {\n    behavior?: ScrollBehavior;\n}\n\ninterface ScrollToOptions extends ScrollOptions {\n    left?: number;\n    top?: number;\n}\n\ninterface ScrollIntoViewOptions extends ScrollOptions {\n    block?: ScrollLogicalPosition;\n    inline?: ScrollLogicalPosition;\n}\n\ninterface ClipboardEventInit extends EventInit {\n    data?: string;\n    dataType?: string;\n}\n\ninterface IDBArrayKey extends Array<IDBValidKey> {\n}\n\ninterface RsaKeyGenParams extends Algorithm {\n    modulusLength: number;\n    publicExponent: Uint8Array;\n}\n\ninterface RsaHashedKeyGenParams extends RsaKeyGenParams {\n    hash: AlgorithmIdentifier;\n}\n\ninterface RsaKeyAlgorithm extends KeyAlgorithm {\n    modulusLength: number;\n    publicExponent: Uint8Array;\n}\n\ninterface RsaHashedKeyAlgorithm extends RsaKeyAlgorithm {\n    hash: AlgorithmIdentifier;\n}\n\ninterface RsaHashedImportParams {\n    hash: AlgorithmIdentifier;\n}\n\ninterface RsaPssParams {\n    saltLength: number;\n}\n\ninterface RsaOaepParams extends Algorithm {\n    label?: BufferSource;\n}\n\ninterface EcdsaParams extends Algorithm {\n    hash: AlgorithmIdentifier;\n}\n\ninterface EcKeyGenParams extends Algorithm {\n    namedCurve: string;\n}\n\ninterface EcKeyAlgorithm extends KeyAlgorithm {\n    typedCurve: string;\n}\n\ninterface EcKeyImportParams {\n    namedCurve: string;\n}\n\ninterface EcdhKeyDeriveParams extends Algorithm {\n    public: CryptoKey;\n}\n\ninterface AesCtrParams extends Algorithm {\n    counter: BufferSource;\n    length: number;\n}\n\ninterface AesKeyAlgorithm extends KeyAlgorithm {\n    length: number;\n}\n\ninterface AesKeyGenParams extends Algorithm {\n    length: number;\n}\n\ninterface AesDerivedKeyParams extends Algorithm {\n    length: number;\n}\n\ninterface AesCbcParams extends Algorithm {\n    iv: BufferSource;\n}\n\ninterface AesCmacParams extends Algorithm {\n    length: number;\n}\n\ninterface AesGcmParams extends Algorithm {\n    iv: BufferSource;\n    additionalData?: BufferSource;\n    tagLength?: number;\n}\n\ninterface AesCfbParams extends Algorithm {\n    iv: BufferSource;\n}\n\ninterface HmacImportParams extends Algorithm {\n    hash?: AlgorithmIdentifier;\n    length?: number;\n}\n\ninterface HmacKeyAlgorithm extends KeyAlgorithm {\n    hash: AlgorithmIdentifier;\n    length: number;\n}\n\ninterface HmacKeyGenParams extends Algorithm {\n    hash: AlgorithmIdentifier;\n    length?: number;\n}\n\ninterface DhKeyGenParams extends Algorithm {\n    prime: Uint8Array;\n    generator: Uint8Array;\n}\n\ninterface DhKeyAlgorithm extends KeyAlgorithm {\n    prime: Uint8Array;\n    generator: Uint8Array;\n}\n\ninterface DhKeyDeriveParams extends Algorithm {\n    public: CryptoKey;\n}\n\ninterface DhImportKeyParams extends Algorithm {\n    prime: Uint8Array;\n    generator: Uint8Array;\n}\n\ninterface ConcatParams extends Algorithm {\n    hash?: AlgorithmIdentifier;\n    algorithmId: Uint8Array;\n    partyUInfo: Uint8Array;\n    partyVInfo: Uint8Array;\n    publicInfo?: Uint8Array;\n    privateInfo?: Uint8Array;\n}\n\ninterface HkdfCtrParams extends Algorithm {\n    hash: AlgorithmIdentifier;\n    label: BufferSource;\n    context: BufferSource;\n}\n\ninterface Pbkdf2Params extends Algorithm {\n    salt: BufferSource;\n    iterations: number;\n    hash: AlgorithmIdentifier;\n}\n\ninterface RsaOtherPrimesInfo {\n    r: string;\n    d: string;\n    t: string;\n}\n\ninterface JsonWebKey {\n    kty: string;\n    use?: string;\n    key_ops?: string[];\n    alg?: string;\n    kid?: string;\n    x5u?: string;\n    x5c?: string;\n    x5t?: string;\n    ext?: boolean;\n    crv?: string;\n    x?: string;\n    y?: string;\n    d?: string;\n    n?: string;\n    e?: string;\n    p?: string;\n    q?: string;\n    dp?: string;\n    dq?: string;\n    qi?: string;\n    oth?: RsaOtherPrimesInfo[];\n    k?: string;\n}\n\ninterface ParentNode {\n    readonly children: HTMLCollection;\n    readonly firstElementChild: Element | null;\n    readonly lastElementChild: Element | null;\n    readonly childElementCount: number;\n}\n\ninterface DocumentOrShadowRoot {\n    readonly activeElement: Element | null;\n    readonly stylesheets: StyleSheetList;\n    getSelection(): Selection | null;\n    elementFromPoint(x: number, y: number): Element | null;\n    elementsFromPoint(x: number, y: number): Element[];\n}\n\ninterface ShadowRoot extends DocumentOrShadowRoot, DocumentFragment {\n    readonly host: Element;\n    innerHTML: string;\n}\n\ninterface ShadowRootInit {\n    mode: "open" | "closed";\n    delegatesFocus?: boolean;\n}\n\ninterface HTMLSlotElement extends HTMLElement {\n    name: string;\n    assignedNodes(options?: AssignedNodesOptions): Node[];\n}\n\ninterface AssignedNodesOptions {\n    flatten?: boolean;\n}\n\ninterface ElementDefinitionOptions {\n    extends: string;\n}\n\ninterface CustomElementRegistry {\n    define(name: string, constructor: Function, options?: ElementDefinitionOptions): void;\n    get(name: string): any;\n    whenDefined(name: string): PromiseLike<void>;\n}\n\ninterface PromiseRejectionEvent extends Event {\n    readonly promise: PromiseLike<any>;\n    readonly reason: any;\n}\n\ninterface PromiseRejectionEventInit extends EventInit {\n    promise: PromiseLike<any>;\n    reason?: any;\n}\n\ninterface EventListenerOptions {\n    capture?: boolean;\n}\n\ninterface AddEventListenerOptions extends EventListenerOptions {\n    passive?: boolean;\n    once?: boolean;\n}\n\ninterface TouchEventInit extends EventModifierInit {\n    touches?: Touch[];\n    targetTouches?: Touch[];\n    changedTouches?: Touch[];\n}\n\ndeclare type EventListenerOrEventListenerObject = EventListener | EventListenerObject;\n\ninterface DecodeErrorCallback {\n    (error: DOMException): void;\n}\ninterface DecodeSuccessCallback {\n    (decodedData: AudioBuffer): void;\n}\ninterface ErrorEventHandler {\n    (message: string, filename?: string, lineno?: number, colno?: number, error?: Error): void;\n}\ninterface ForEachCallback {\n    (keyId: any, status: MediaKeyStatus): void;\n}\ninterface FrameRequestCallback {\n    (time: number): void;\n}\ninterface FunctionStringCallback {\n    (data: string): void;\n}\ninterface IntersectionObserverCallback {\n    (entries: IntersectionObserverEntry[], observer: IntersectionObserver): void;\n}\ninterface MediaQueryListListener {\n    (mql: MediaQueryList): void;\n}\ninterface MSExecAtPriorityFunctionCallback {\n    (...args: any[]): any;\n}\ninterface MSLaunchUriCallback {\n    (): void;\n}\ninterface MSUnsafeFunctionCallback {\n    (): any;\n}\ninterface MutationCallback {\n    (mutations: MutationRecord[], observer: MutationObserver): void;\n}\ninterface NavigatorUserMediaErrorCallback {\n    (error: MediaStreamError): void;\n}\ninterface NavigatorUserMediaSuccessCallback {\n    (stream: MediaStream): void;\n}\ninterface NotificationPermissionCallback {\n    (permission: NotificationPermission): void;\n}\ninterface PositionCallback {\n    (position: Position): void;\n}\ninterface PositionErrorCallback {\n    (error: PositionError): void;\n}\ninterface RTCPeerConnectionErrorCallback {\n    (error: DOMError): void;\n}\ninterface RTCSessionDescriptionCallback {\n    (sdp: RTCSessionDescription): void;\n}\ninterface RTCStatsCallback {\n    (report: RTCStatsReport): void;\n}\ninterface VoidFunction {\n    (): void;\n}\ninterface HTMLElementTagNameMap {\n    "a": HTMLAnchorElement;\n    "applet": HTMLAppletElement;\n    "area": HTMLAreaElement;\n    "audio": HTMLAudioElement;\n    "base": HTMLBaseElement;\n    "basefont": HTMLBaseFontElement;\n    "blockquote": HTMLQuoteElement;\n    "body": HTMLBodyElement;\n    "br": HTMLBRElement;\n    "button": HTMLButtonElement;\n    "canvas": HTMLCanvasElement;\n    "caption": HTMLTableCaptionElement;\n    "col": HTMLTableColElement;\n    "colgroup": HTMLTableColElement;\n    "data": HTMLDataElement;\n    "datalist": HTMLDataListElement;\n    "del": HTMLModElement;\n    "dir": HTMLDirectoryElement;\n    "div": HTMLDivElement;\n    "dl": HTMLDListElement;\n    "embed": HTMLEmbedElement;\n    "fieldset": HTMLFieldSetElement;\n    "font": HTMLFontElement;\n    "form": HTMLFormElement;\n    "frame": HTMLFrameElement;\n    "frameset": HTMLFrameSetElement;\n    "h1": HTMLHeadingElement;\n    "h2": HTMLHeadingElement;\n    "h3": HTMLHeadingElement;\n    "h4": HTMLHeadingElement;\n    "h5": HTMLHeadingElement;\n    "h6": HTMLHeadingElement;\n    "head": HTMLHeadElement;\n    "hr": HTMLHRElement;\n    "html": HTMLHtmlElement;\n    "iframe": HTMLIFrameElement;\n    "img": HTMLImageElement;\n    "input": HTMLInputElement;\n    "ins": HTMLModElement;\n    "isindex": HTMLUnknownElement;\n    "label": HTMLLabelElement;\n    "legend": HTMLLegendElement;\n    "li": HTMLLIElement;\n    "link": HTMLLinkElement;\n    "listing": HTMLPreElement;\n    "map": HTMLMapElement;\n    "marquee": HTMLMarqueeElement;\n    "menu": HTMLMenuElement;\n    "meta": HTMLMetaElement;\n    "meter": HTMLMeterElement;\n    "nextid": HTMLUnknownElement;\n    "object": HTMLObjectElement;\n    "ol": HTMLOListElement;\n    "optgroup": HTMLOptGroupElement;\n    "option": HTMLOptionElement;\n    "output": HTMLOutputElement;\n    "p": HTMLParagraphElement;\n    "param": HTMLParamElement;\n    "picture": HTMLPictureElement;\n    "pre": HTMLPreElement;\n    "progress": HTMLProgressElement;\n    "q": HTMLQuoteElement;\n    "script": HTMLScriptElement;\n    "select": HTMLSelectElement;\n    "source": HTMLSourceElement;\n    "span": HTMLSpanElement;\n    "style": HTMLStyleElement;\n    "table": HTMLTableElement;\n    "tbody": HTMLTableSectionElement;\n    "td": HTMLTableDataCellElement;\n    "template": HTMLTemplateElement;\n    "textarea": HTMLTextAreaElement;\n    "tfoot": HTMLTableSectionElement;\n    "th": HTMLTableHeaderCellElement;\n    "thead": HTMLTableSectionElement;\n    "time": HTMLTimeElement;\n    "title": HTMLTitleElement;\n    "tr": HTMLTableRowElement;\n    "track": HTMLTrackElement;\n    "ul": HTMLUListElement;\n    "video": HTMLVideoElement;\n    "x-ms-webview": MSHTMLWebViewElement;\n    "xmp": HTMLPreElement;\n}\n\ninterface ElementTagNameMap extends HTMLElementTagNameMap {\n    "abbr": HTMLElement;\n    "acronym": HTMLElement;\n    "address": HTMLElement;\n    "article": HTMLElement;\n    "aside": HTMLElement;\n    "b": HTMLElement;\n    "bdo": HTMLElement;\n    "big": HTMLElement;\n    "center": HTMLElement;\n    "circle": SVGCircleElement;\n    "cite": HTMLElement;\n    "clippath": SVGClipPathElement;\n    "code": HTMLElement;\n    "dd": HTMLElement;\n    "defs": SVGDefsElement;\n    "desc": SVGDescElement;\n    "dfn": HTMLElement;\n    "dt": HTMLElement;\n    "ellipse": SVGEllipseElement;\n    "em": HTMLElement;\n    "feblend": SVGFEBlendElement;\n    "fecolormatrix": SVGFEColorMatrixElement;\n    "fecomponenttransfer": SVGFEComponentTransferElement;\n    "fecomposite": SVGFECompositeElement;\n    "feconvolvematrix": SVGFEConvolveMatrixElement;\n    "fediffuselighting": SVGFEDiffuseLightingElement;\n    "fedisplacementmap": SVGFEDisplacementMapElement;\n    "fedistantlight": SVGFEDistantLightElement;\n    "feflood": SVGFEFloodElement;\n    "fefunca": SVGFEFuncAElement;\n    "fefuncb": SVGFEFuncBElement;\n    "fefuncg": SVGFEFuncGElement;\n    "fefuncr": SVGFEFuncRElement;\n    "fegaussianblur": SVGFEGaussianBlurElement;\n    "feimage": SVGFEImageElement;\n    "femerge": SVGFEMergeElement;\n    "femergenode": SVGFEMergeNodeElement;\n    "femorphology": SVGFEMorphologyElement;\n    "feoffset": SVGFEOffsetElement;\n    "fepointlight": SVGFEPointLightElement;\n    "fespecularlighting": SVGFESpecularLightingElement;\n    "fespotlight": SVGFESpotLightElement;\n    "fetile": SVGFETileElement;\n    "feturbulence": SVGFETurbulenceElement;\n    "figcaption": HTMLElement;\n    "figure": HTMLElement;\n    "filter": SVGFilterElement;\n    "footer": HTMLElement;\n    "foreignobject": SVGForeignObjectElement;\n    "g": SVGGElement;\n    "header": HTMLElement;\n    "hgroup": HTMLElement;\n    "i": HTMLElement;\n    "image": SVGImageElement;\n    "kbd": HTMLElement;\n    "keygen": HTMLElement;\n    "line": SVGLineElement;\n    "lineargradient": SVGLinearGradientElement;\n    "mark": HTMLElement;\n    "marker": SVGMarkerElement;\n    "mask": SVGMaskElement;\n    "metadata": SVGMetadataElement;\n    "nav": HTMLElement;\n    "nobr": HTMLElement;\n    "noframes": HTMLElement;\n    "noscript": HTMLElement;\n    "path": SVGPathElement;\n    "pattern": SVGPatternElement;\n    "plaintext": HTMLElement;\n    "polygon": SVGPolygonElement;\n    "polyline": SVGPolylineElement;\n    "radialgradient": SVGRadialGradientElement;\n    "rect": SVGRectElement;\n    "rt": HTMLElement;\n    "ruby": HTMLElement;\n    "s": HTMLElement;\n    "samp": HTMLElement;\n    "section": HTMLElement;\n    "small": HTMLElement;\n    "stop": SVGStopElement;\n    "strike": HTMLElement;\n    "strong": HTMLElement;\n    "sub": HTMLElement;\n    "sup": HTMLElement;\n    "svg": SVGSVGElement;\n    "switch": SVGSwitchElement;\n    "symbol": SVGSymbolElement;\n    "text": SVGTextElement;\n    "textpath": SVGTextPathElement;\n    "tspan": SVGTSpanElement;\n    "tt": HTMLElement;\n    "u": HTMLElement;\n    "use": SVGUseElement;\n    "var": HTMLElement;\n    "view": SVGViewElement;\n    "wbr": HTMLElement;\n}\n\ntype ElementListTagNameMap = {\n    [key in keyof ElementTagNameMap]: NodeListOf<ElementTagNameMap[key]>\n};\n\ndeclare var Audio: { new(src?: string): HTMLAudioElement; };\ndeclare var Image: { new(width?: number, height?: number): HTMLImageElement; };\ndeclare var Option: { new(text?: string, value?: string, defaultSelected?: boolean, selected?: boolean): HTMLOptionElement; };\ndeclare var applicationCache: ApplicationCache;\ndeclare var caches: CacheStorage;\ndeclare var clientInformation: Navigator;\ndeclare var closed: boolean;\ndeclare var crypto: Crypto;\ndeclare var defaultStatus: string;\ndeclare var devicePixelRatio: number;\ndeclare var document: Document;\ndeclare var doNotTrack: string;\ndeclare var event: Event | undefined;\ndeclare var external: External;\ndeclare var frameElement: Element;\ndeclare var frames: Window;\ndeclare var history: History;\ndeclare var innerHeight: number;\ndeclare var innerWidth: number;\ndeclare var isSecureContext: boolean;\ndeclare var length: number;\ndeclare var location: Location;\ndeclare var locationbar: BarProp;\ndeclare var menubar: BarProp;\ndeclare var msContentScript: ExtensionScriptApis;\ndeclare var msCredentials: MSCredentials;\ndeclare const name: never;\ndeclare var navigator: Navigator;\ndeclare var offscreenBuffering: string | boolean;\ndeclare var onabort: (this: Window, ev: UIEvent) => any;\ndeclare var onafterprint: (this: Window, ev: Event) => any;\ndeclare var onbeforeprint: (this: Window, ev: Event) => any;\ndeclare var onbeforeunload: (this: Window, ev: BeforeUnloadEvent) => any;\ndeclare var onblur: (this: Window, ev: FocusEvent) => any;\ndeclare var oncanplay: (this: Window, ev: Event) => any;\ndeclare var oncanplaythrough: (this: Window, ev: Event) => any;\ndeclare var onchange: (this: Window, ev: Event) => any;\ndeclare var onclick: (this: Window, ev: MouseEvent) => any;\ndeclare var oncompassneedscalibration: (this: Window, ev: Event) => any;\ndeclare var oncontextmenu: (this: Window, ev: PointerEvent) => any;\ndeclare var ondblclick: (this: Window, ev: MouseEvent) => any;\ndeclare var ondevicelight: (this: Window, ev: DeviceLightEvent) => any;\ndeclare var ondevicemotion: (this: Window, ev: DeviceMotionEvent) => any;\ndeclare var ondeviceorientation: (this: Window, ev: DeviceOrientationEvent) => any;\ndeclare var ondrag: (this: Window, ev: DragEvent) => any;\ndeclare var ondragend: (this: Window, ev: DragEvent) => any;\ndeclare var ondragenter: (this: Window, ev: DragEvent) => any;\ndeclare var ondragleave: (this: Window, ev: DragEvent) => any;\ndeclare var ondragover: (this: Window, ev: DragEvent) => any;\ndeclare var ondragstart: (this: Window, ev: DragEvent) => any;\ndeclare var ondrop: (this: Window, ev: DragEvent) => any;\ndeclare var ondurationchange: (this: Window, ev: Event) => any;\ndeclare var onemptied: (this: Window, ev: Event) => any;\ndeclare var onended: (this: Window, ev: MediaStreamErrorEvent) => any;\ndeclare var onerror: ErrorEventHandler;\ndeclare var onfocus: (this: Window, ev: FocusEvent) => any;\ndeclare var onhashchange: (this: Window, ev: HashChangeEvent) => any;\ndeclare var oninput: (this: Window, ev: Event) => any;\ndeclare var oninvalid: (this: Window, ev: Event) => any;\ndeclare var onkeydown: (this: Window, ev: KeyboardEvent) => any;\ndeclare var onkeypress: (this: Window, ev: KeyboardEvent) => any;\ndeclare var onkeyup: (this: Window, ev: KeyboardEvent) => any;\ndeclare var onload: (this: Window, ev: Event) => any;\ndeclare var onloadeddata: (this: Window, ev: Event) => any;\ndeclare var onloadedmetadata: (this: Window, ev: Event) => any;\ndeclare var onloadstart: (this: Window, ev: Event) => any;\ndeclare var onmessage: (this: Window, ev: MessageEvent) => any;\ndeclare var onmousedown: (this: Window, ev: MouseEvent) => any;\ndeclare var onmouseenter: (this: Window, ev: MouseEvent) => any;\ndeclare var onmouseleave: (this: Window, ev: MouseEvent) => any;\ndeclare var onmousemove: (this: Window, ev: MouseEvent) => any;\ndeclare var onmouseout: (this: Window, ev: MouseEvent) => any;\ndeclare var onmouseover: (this: Window, ev: MouseEvent) => any;\ndeclare var onmouseup: (this: Window, ev: MouseEvent) => any;\ndeclare var onmousewheel: (this: Window, ev: WheelEvent) => any;\ndeclare var onmsgesturechange: (this: Window, ev: MSGestureEvent) => any;\ndeclare var onmsgesturedoubletap: (this: Window, ev: MSGestureEvent) => any;\ndeclare var onmsgestureend: (this: Window, ev: MSGestureEvent) => any;\ndeclare var onmsgesturehold: (this: Window, ev: MSGestureEvent) => any;\ndeclare var onmsgesturestart: (this: Window, ev: MSGestureEvent) => any;\ndeclare var onmsgesturetap: (this: Window, ev: MSGestureEvent) => any;\ndeclare var onmsinertiastart: (this: Window, ev: MSGestureEvent) => any;\ndeclare var onmspointercancel: (this: Window, ev: MSPointerEvent) => any;\ndeclare var onmspointerdown: (this: Window, ev: MSPointerEvent) => any;\ndeclare var onmspointerenter: (this: Window, ev: MSPointerEvent) => any;\ndeclare var onmspointerleave: (this: Window, ev: MSPointerEvent) => any;\ndeclare var onmspointermove: (this: Window, ev: MSPointerEvent) => any;\ndeclare var onmspointerout: (this: Window, ev: MSPointerEvent) => any;\ndeclare var onmspointerover: (this: Window, ev: MSPointerEvent) => any;\ndeclare var onmspointerup: (this: Window, ev: MSPointerEvent) => any;\ndeclare var onoffline: (this: Window, ev: Event) => any;\ndeclare var ononline: (this: Window, ev: Event) => any;\ndeclare var onorientationchange: (this: Window, ev: Event) => any;\ndeclare var onpagehide: (this: Window, ev: PageTransitionEvent) => any;\ndeclare var onpageshow: (this: Window, ev: PageTransitionEvent) => any;\ndeclare var onpause: (this: Window, ev: Event) => any;\ndeclare var onplay: (this: Window, ev: Event) => any;\ndeclare var onplaying: (this: Window, ev: Event) => any;\ndeclare var onpopstate: (this: Window, ev: PopStateEvent) => any;\ndeclare var onprogress: (this: Window, ev: ProgressEvent) => any;\ndeclare var onratechange: (this: Window, ev: Event) => any;\ndeclare var onreadystatechange: (this: Window, ev: ProgressEvent) => any;\ndeclare var onreset: (this: Window, ev: Event) => any;\ndeclare var onresize: (this: Window, ev: UIEvent) => any;\ndeclare var onscroll: (this: Window, ev: UIEvent) => any;\ndeclare var onseeked: (this: Window, ev: Event) => any;\ndeclare var onseeking: (this: Window, ev: Event) => any;\ndeclare var onselect: (this: Window, ev: UIEvent) => any;\ndeclare var onstalled: (this: Window, ev: Event) => any;\ndeclare var onstorage: (this: Window, ev: StorageEvent) => any;\ndeclare var onsubmit: (this: Window, ev: Event) => any;\ndeclare var onsuspend: (this: Window, ev: Event) => any;\ndeclare var ontimeupdate: (this: Window, ev: Event) => any;\ndeclare var ontouchcancel: (ev: TouchEvent) => any;\ndeclare var ontouchend: (ev: TouchEvent) => any;\ndeclare var ontouchmove: (ev: TouchEvent) => any;\ndeclare var ontouchstart: (ev: TouchEvent) => any;\ndeclare var onunload: (this: Window, ev: Event) => any;\ndeclare var onvolumechange: (this: Window, ev: Event) => any;\ndeclare var onwaiting: (this: Window, ev: Event) => any;\ndeclare var opener: any;\ndeclare var orientation: string | number;\ndeclare var outerHeight: number;\ndeclare var outerWidth: number;\ndeclare var pageXOffset: number;\ndeclare var pageYOffset: number;\ndeclare var parent: Window;\ndeclare var performance: Performance;\ndeclare var personalbar: BarProp;\ndeclare var screen: Screen;\ndeclare var screenLeft: number;\ndeclare var screenTop: number;\ndeclare var screenX: number;\ndeclare var screenY: number;\ndeclare var scrollbars: BarProp;\ndeclare var scrollX: number;\ndeclare var scrollY: number;\ndeclare var self: Window;\ndeclare var speechSynthesis: SpeechSynthesis;\ndeclare var status: string;\ndeclare var statusbar: BarProp;\ndeclare var styleMedia: StyleMedia;\ndeclare var toolbar: BarProp;\ndeclare var top: Window;\ndeclare var window: Window;\ndeclare var customElements: CustomElementRegistry;\ndeclare function alert(message?: any): void;\ndeclare function blur(): void;\ndeclare function cancelAnimationFrame(handle: number): void;\ndeclare function captureEvents(): void;\ndeclare function close(): void;\ndeclare function confirm(message?: string): boolean;\ndeclare function departFocus(navigationReason: NavigationReason, origin: FocusNavigationOrigin): void;\ndeclare function focus(): void;\ndeclare function getComputedStyle(elt: Element, pseudoElt?: string): CSSStyleDeclaration;\ndeclare function getMatchedCSSRules(elt: Element, pseudoElt?: string): CSSRuleList;\ndeclare function getSelection(): Selection;\ndeclare function matchMedia(mediaQuery: string): MediaQueryList;\ndeclare function moveBy(x?: number, y?: number): void;\ndeclare function moveTo(x?: number, y?: number): void;\ndeclare function msWriteProfilerMark(profilerMarkName: string): void;\ndeclare function open(url?: string, target?: string, features?: string, replace?: boolean): Window;\ndeclare function postMessage(message: any, targetOrigin: string, transfer?: any[]): void;\ndeclare function print(): void;\ndeclare function prompt(message?: string, _default?: string): string | null;\ndeclare function releaseEvents(): void;\ndeclare function requestAnimationFrame(callback: FrameRequestCallback): number;\ndeclare function resizeBy(x?: number, y?: number): void;\ndeclare function resizeTo(x?: number, y?: number): void;\ndeclare function scroll(x?: number, y?: number): void;\ndeclare function scrollBy(x?: number, y?: number): void;\ndeclare function scrollTo(x?: number, y?: number): void;\ndeclare function stop(): void;\ndeclare function webkitCancelAnimationFrame(handle: number): void;\ndeclare function webkitConvertPointFromNodeToPage(node: Node, pt: WebKitPoint): WebKitPoint;\ndeclare function webkitConvertPointFromPageToNode(node: Node, pt: WebKitPoint): WebKitPoint;\ndeclare function webkitRequestAnimationFrame(callback: FrameRequestCallback): number;\ndeclare function createImageBitmap(image: HTMLImageElement | SVGImageElement | HTMLVideoElement | HTMLCanvasElement | ImageBitmap | ImageData | Blob, options?: ImageBitmapOptions): Promise<ImageBitmap>;\ndeclare function createImageBitmap(image: HTMLImageElement | SVGImageElement | HTMLVideoElement | HTMLCanvasElement | ImageBitmap | ImageData | Blob, sx: number, sy: number, sw: number, sh: number, options?: ImageBitmapOptions): Promise<ImageBitmap>;\ndeclare function scroll(options?: ScrollToOptions): void;\ndeclare function scrollTo(options?: ScrollToOptions): void;\ndeclare function scrollBy(options?: ScrollToOptions): void;\ndeclare function toString(): string;\ndeclare function dispatchEvent(evt: Event): boolean;\ndeclare function removeEventListener(type: string, listener?: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;\ndeclare function clearInterval(handle: number): void;\ndeclare function clearTimeout(handle: number): void;\ndeclare function setInterval(handler: (...args: any[]) => void, timeout: number): number;\ndeclare function setInterval(handler: any, timeout?: any, ...args: any[]): number;\ndeclare function setTimeout(handler: (...args: any[]) => void, timeout: number): number;\ndeclare function setTimeout(handler: any, timeout?: any, ...args: any[]): number;\ndeclare function clearImmediate(handle: number): void;\ndeclare function setImmediate(handler: (...args: any[]) => void): number;\ndeclare function setImmediate(handler: any, ...args: any[]): number;\ndeclare var sessionStorage: Storage;\ndeclare var localStorage: Storage;\ndeclare var console: Console;\ndeclare var onpointercancel: (this: Window, ev: PointerEvent) => any;\ndeclare var onpointerdown: (this: Window, ev: PointerEvent) => any;\ndeclare var onpointerenter: (this: Window, ev: PointerEvent) => any;\ndeclare var onpointerleave: (this: Window, ev: PointerEvent) => any;\ndeclare var onpointermove: (this: Window, ev: PointerEvent) => any;\ndeclare var onpointerout: (this: Window, ev: PointerEvent) => any;\ndeclare var onpointerover: (this: Window, ev: PointerEvent) => any;\ndeclare var onpointerup: (this: Window, ev: PointerEvent) => any;\ndeclare var onwheel: (this: Window, ev: WheelEvent) => any;\ndeclare var indexedDB: IDBFactory;\ndeclare function atob(encodedString: string): string;\ndeclare function btoa(rawString: string): string;\ndeclare function fetch(input: RequestInfo, init?: RequestInit): Promise<Response>;\ndeclare function addEventListener<K extends keyof WindowEventMap>(type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, useCapture?: boolean): void;\ndeclare function addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;\ntype AAGUID = string;\ntype AlgorithmIdentifier = string | Algorithm;\ntype BodyInit = any;\ntype ByteString = string;\ntype ConstrainBoolean = boolean | ConstrainBooleanParameters;\ntype ConstrainDOMString = string | string[] | ConstrainDOMStringParameters;\ntype ConstrainDouble = number | ConstrainDoubleRange;\ntype ConstrainLong = number | ConstrainLongRange;\ntype CryptoOperationData = ArrayBufferView;\ntype GLbitfield = number;\ntype GLboolean = boolean;\ntype GLbyte = number;\ntype GLclampf = number;\ntype GLenum = number;\ntype GLfloat = number;\ntype GLint = number;\ntype GLintptr = number;\ntype GLshort = number;\ntype GLsizei = number;\ntype GLsizeiptr = number;\ntype GLubyte = number;\ntype GLuint = number;\ntype GLushort = number;\ntype HeadersInit = any;\ntype IDBKeyPath = string;\ntype KeyFormat = string;\ntype KeyType = string;\ntype KeyUsage = string;\ntype MSInboundPayload = MSVideoRecvPayload | MSAudioRecvPayload;\ntype MSLocalClientEvent = MSLocalClientEventBase | MSAudioLocalClientEvent;\ntype MSOutboundPayload = MSVideoSendPayload | MSAudioSendPayload;\ntype RTCIceGatherCandidate = RTCIceCandidateDictionary | RTCIceCandidateComplete;\ntype RTCTransport = RTCDtlsTransport | RTCSrtpSdesTransport;\ntype RequestInfo = Request | string;\ntype USVString = string;\ntype payloadtype = number;\ntype ScrollBehavior = "auto" | "instant" | "smooth";\ntype ScrollLogicalPosition = "start" | "center" | "end" | "nearest";\ntype IDBValidKey = number | string | Date | IDBArrayKey;\ntype BufferSource = ArrayBuffer | ArrayBufferView;\ntype MouseWheelEvent = WheelEvent;\ntype ScrollRestoration = "auto" | "manual";\ntype FormDataEntryValue = string | File;\ntype InsertPosition = "beforebegin" | "afterbegin" | "beforeend" | "afterend";\ntype AppendMode = "segments" | "sequence";\ntype AudioContextState = "suspended" | "running" | "closed";\ntype BiquadFilterType = "lowpass" | "highpass" | "bandpass" | "lowshelf" | "highshelf" | "peaking" | "notch" | "allpass";\ntype CanvasFillRule = "nonzero" | "evenodd";\ntype ChannelCountMode = "max" | "clamped-max" | "explicit";\ntype ChannelInterpretation = "speakers" | "discrete";\ntype DistanceModelType = "linear" | "inverse" | "exponential";\ntype ExpandGranularity = "character" | "word" | "sentence" | "textedit";\ntype GamepadInputEmulationType = "mouse" | "keyboard" | "gamepad";\ntype IDBCursorDirection = "next" | "nextunique" | "prev" | "prevunique";\ntype IDBRequestReadyState = "pending" | "done";\ntype IDBTransactionMode = "readonly" | "readwrite" | "versionchange";\ntype ListeningState = "inactive" | "active" | "disambiguation";\ntype MediaDeviceKind = "audioinput" | "audiooutput" | "videoinput";\ntype MediaKeyMessageType = "license-request" | "license-renewal" | "license-release" | "individualization-request";\ntype MediaKeySessionType = "temporary" | "persistent-license" | "persistent-release-message";\ntype MediaKeysRequirement = "required" | "optional" | "not-allowed";\ntype MediaKeyStatus = "usable" | "expired" | "output-downscaled" | "output-not-allowed" | "status-pending" | "internal-error";\ntype MediaStreamTrackState = "live" | "ended";\ntype MSCredentialType = "FIDO_2_0";\ntype MSIceAddrType = "os" | "stun" | "turn" | "peer-derived";\ntype MSIceType = "failed" | "direct" | "relay";\ntype MSStatsType = "description" | "localclientevent" | "inbound-network" | "outbound-network" | "inbound-payload" | "outbound-payload" | "transportdiagnostics";\ntype MSTransportType = "Embedded" | "USB" | "NFC" | "BT";\ntype MSWebViewPermissionState = "unknown" | "defer" | "allow" | "deny";\ntype MSWebViewPermissionType = "geolocation" | "unlimitedIndexedDBQuota" | "media" | "pointerlock" | "webnotifications";\ntype NavigationReason = "up" | "down" | "left" | "right";\ntype NavigationType = "navigate" | "reload" | "back_forward" | "prerender";\ntype NotificationDirection = "auto" | "ltr" | "rtl";\ntype NotificationPermission = "default" | "denied" | "granted";\ntype OscillatorType = "sine" | "square" | "sawtooth" | "triangle" | "custom";\ntype OverSampleType = "none" | "2x" | "4x";\ntype PanningModelType = "equalpower";\ntype PaymentComplete = "success" | "fail" | "";\ntype PaymentShippingType = "shipping" | "delivery" | "pickup";\ntype PushEncryptionKeyName = "p256dh" | "auth";\ntype PushPermissionState = "granted" | "denied" | "prompt";\ntype ReferrerPolicy = "" | "no-referrer" | "no-referrer-when-downgrade" | "origin-only" | "origin-when-cross-origin" | "unsafe-url";\ntype RequestCache = "default" | "no-store" | "reload" | "no-cache" | "force-cache";\ntype RequestCredentials = "omit" | "same-origin" | "include";\ntype RequestDestination = "" | "document" | "sharedworker" | "subresource" | "unknown" | "worker";\ntype RequestMode = "navigate" | "same-origin" | "no-cors" | "cors";\ntype RequestRedirect = "follow" | "error" | "manual";\ntype RequestType = "" | "audio" | "font" | "image" | "script" | "style" | "track" | "video";\ntype ResponseType = "basic" | "cors" | "default" | "error" | "opaque" | "opaqueredirect";\ntype RTCBundlePolicy = "balanced" | "max-compat" | "max-bundle";\ntype RTCDegradationPreference = "maintain-framerate" | "maintain-resolution" | "balanced";\ntype RTCDtlsRole = "auto" | "client" | "server";\ntype RTCDtlsTransportState = "new" | "connecting" | "connected" | "closed";\ntype RTCIceCandidateType = "host" | "srflx" | "prflx" | "relay";\ntype RTCIceComponent = "RTP" | "RTCP";\ntype RTCIceConnectionState = "new" | "checking" | "connected" | "completed" | "failed" | "disconnected" | "closed";\ntype RTCIceGathererState = "new" | "gathering" | "complete";\ntype RTCIceGatheringState = "new" | "gathering" | "complete";\ntype RTCIceGatherPolicy = "all" | "nohost" | "relay";\ntype RTCIceProtocol = "udp" | "tcp";\ntype RTCIceRole = "controlling" | "controlled";\ntype RTCIceTcpCandidateType = "active" | "passive" | "so";\ntype RTCIceTransportPolicy = "none" | "relay" | "all";\ntype RTCIceTransportState = "new" | "checking" | "connected" | "completed" | "disconnected" | "closed";\ntype RTCSdpType = "offer" | "pranswer" | "answer";\ntype RTCSignalingState = "stable" | "have-local-offer" | "have-remote-offer" | "have-local-pranswer" | "have-remote-pranswer" | "closed";\ntype RTCStatsIceCandidatePairState = "frozen" | "waiting" | "inprogress" | "failed" | "succeeded" | "cancelled";\ntype RTCStatsIceCandidateType = "host" | "serverreflexive" | "peerreflexive" | "relayed";\ntype RTCStatsType = "inboundrtp" | "outboundrtp" | "session" | "datachannel" | "track" | "transport" | "candidatepair" | "localcandidate" | "remotecandidate";\ntype ScopedCredentialType = "ScopedCred";\ntype ServiceWorkerState = "installing" | "installed" | "activating" | "activated" | "redundant";\ntype Transport = "usb" | "nfc" | "ble";\ntype VideoFacingModeEnum = "user" | "environment" | "left" | "right";\ntype VisibilityState = "hidden" | "visible" | "prerender" | "unloaded";\ntype XMLHttpRequestResponseType = "" | "arraybuffer" | "blob" | "document" | "json" | "text";\n\n\n/////////////////////////////\n/// WorkerGlobalScope APIs\n/////////////////////////////\n// These are only available in a Web Worker\ndeclare function importScripts(...urls: string[]): void;\n\n\n\n\n/////////////////////////////\n/// Windows Script Host APIS\n/////////////////////////////\n\n\ninterface ActiveXObject {\n    new (s: string): any;\n}\ndeclare var ActiveXObject: ActiveXObject;\n\ninterface ITextWriter {\n    Write(s: string): void;\n    WriteLine(s: string): void;\n    Close(): void;\n}\n\ninterface TextStreamBase {\n    /**\n     * The column number of the current character position in an input stream.\n     */\n    Column: number;\n\n    /**\n     * The current line number in an input stream.\n     */\n    Line: number;\n\n    /**\n     * Closes a text stream.\n     * It is not necessary to close standard streams; they close automatically when the process ends. If\n     * you close a standard stream, be aware that any other pointers to that standard stream become invalid.\n     */\n    Close(): void;\n}\n\ninterface TextStreamWriter extends TextStreamBase {\n    /**\n     * Sends a string to an output stream.\n     */\n    Write(s: string): void;\n\n    /**\n     * Sends a specified number of blank lines (newline characters) to an output stream.\n     */\n    WriteBlankLines(intLines: number): void;\n\n    /**\n     * Sends a string followed by a newline character to an output stream.\n     */\n    WriteLine(s: string): void;\n}\n\ninterface TextStreamReader extends TextStreamBase {\n    /**\n     * Returns a specified number of characters from an input stream, starting at the current pointer position.\n     * Does not return until the ENTER key is pressed.\n     * Can only be used on a stream in reading mode; causes an error in writing or appending mode.\n     */\n    Read(characters: number): string;\n\n    /**\n     * Returns all characters from an input stream.\n     * Can only be used on a stream in reading mode; causes an error in writing or appending mode.\n     */\n    ReadAll(): string;\n\n    /**\n     * Returns an entire line from an input stream.\n     * Although this method extracts the newline character, it does not add it to the returned string.\n     * Can only be used on a stream in reading mode; causes an error in writing or appending mode.\n     */\n    ReadLine(): string;\n\n    /**\n     * Skips a specified number of characters when reading from an input text stream.\n     * Can only be used on a stream in reading mode; causes an error in writing or appending mode.\n     * @param characters Positive number of characters to skip forward. (Backward skipping is not supported.)\n     */\n    Skip(characters: number): void;\n\n    /**\n     * Skips the next line when reading from an input text stream.\n     * Can only be used on a stream in reading mode, not writing or appending mode.\n     */\n    SkipLine(): void;\n\n    /**\n     * Indicates whether the stream pointer position is at the end of a line.\n     */\n    AtEndOfLine: boolean;\n\n    /**\n     * Indicates whether the stream pointer position is at the end of a stream.\n     */\n    AtEndOfStream: boolean;\n}\n\ndeclare var WScript: {\n    /**\n     * Outputs text to either a message box (under WScript.exe) or the command console window followed by\n     * a newline (under CScript.exe).\n     */\n    Echo(s: any): void;\n\n    /**\n     * Exposes the write-only error output stream for the current script.\n     * Can be accessed only while using CScript.exe.\n     */\n    StdErr: TextStreamWriter;\n\n    /**\n     * Exposes the write-only output stream for the current script.\n     * Can be accessed only while using CScript.exe.\n     */\n    StdOut: TextStreamWriter;\n    Arguments: { length: number; Item(n: number): string; };\n\n    /**\n     *  The full path of the currently running script.\n     */\n    ScriptFullName: string;\n\n    /**\n     * Forces the script to stop immediately, with an optional exit code.\n     */\n    Quit(exitCode?: number): number;\n\n    /**\n     * The Windows Script Host build version number.\n     */\n    BuildVersion: number;\n\n    /**\n     * Fully qualified path of the host executable.\n     */\n    FullName: string;\n\n    /**\n     * Gets/sets the script mode - interactive(true) or batch(false).\n     */\n    Interactive: boolean;\n\n    /**\n     * The name of the host executable (WScript.exe or CScript.exe).\n     */\n    Name: string;\n\n    /**\n     * Path of the directory containing the host executable.\n     */\n    Path: string;\n\n    /**\n     * The filename of the currently running script.\n     */\n    ScriptName: string;\n\n    /**\n     * Exposes the read-only input stream for the current script.\n     * Can be accessed only while using CScript.exe.\n     */\n    StdIn: TextStreamReader;\n\n    /**\n     * Windows Script Host version\n     */\n    Version: string;\n\n    /**\n     * Connects a COM object\'s event sources to functions named with a given prefix, in the form prefix_event.\n     */\n    ConnectObject(objEventSource: any, strPrefix: string): void;\n\n    /**\n     * Creates a COM object.\n     * @param strProgiID\n     * @param strPrefix Function names in the form prefix_event will be bound to this object\'s COM events.\n     */\n    CreateObject(strProgID: string, strPrefix?: string): any;\n\n    /**\n     * Disconnects a COM object from its event sources.\n     */\n    DisconnectObject(obj: any): void;\n\n    /**\n     * Retrieves an existing object with the specified ProgID from memory, or creates a new one from a file.\n     * @param strPathname Fully qualified path to the file containing the object persisted to disk.\n     *                       For objects in memory, pass a zero-length string.\n     * @param strProgID\n     * @param strPrefix Function names in the form prefix_event will be bound to this object\'s COM events.\n     */\n    GetObject(strPathname: string, strProgID?: string, strPrefix?: string): any;\n\n    /**\n     * Suspends script execution for a specified length of time, then continues execution.\n     * @param intTime Interval (in milliseconds) to suspend script execution.\n     */\n    Sleep(intTime: number): void;\n};\n\n/**\n * Allows enumerating over a COM collection, which may not have indexed item access.\n */\ninterface Enumerator<T> {\n    /**\n     * Returns true if the current item is the last one in the collection, or the collection is empty,\n     * or the current item is undefined.\n     */\n    atEnd(): boolean;\n\n    /**\n     * Returns the current item in the collection\n     */\n    item(): T;\n\n    /**\n     * Resets the current item in the collection to the first item. If there are no items in the collection,\n     * the current item is set to undefined.\n     */\n    moveFirst(): void;\n\n    /**\n     * Moves the current item to the next item in the collection. If the enumerator is at the end of\n     * the collection or the collection is empty, the current item is set to undefined.\n     */\n    moveNext(): void;\n}\n\ninterface EnumeratorConstructor {\n    new <T>(collection: any): Enumerator<T>;\n    new (collection: any): Enumerator<any>;\n}\n\ndeclare var Enumerator: EnumeratorConstructor;\n\n/**\n * Enables reading from a COM safe array, which might have an alternate lower bound, or multiple dimensions.\n */\ninterface VBArray<T> {\n    /**\n     * Returns the number of dimensions (1-based).\n     */\n    dimensions(): number;\n\n    /**\n     * Takes an index for each dimension in the array, and returns the item at the corresponding location.\n     */\n    getItem(dimension1Index: number, ...dimensionNIndexes: number[]): T;\n\n    /**\n     * Returns the smallest available index for a given dimension.\n     * @param dimension 1-based dimension (defaults to 1)\n     */\n    lbound(dimension?: number): number;\n\n    /**\n     * Returns the largest available index for a given dimension.\n     * @param dimension 1-based dimension (defaults to 1)\n     */\n    ubound(dimension?: number): number;\n\n    /**\n     * Returns a Javascript array with all the elements in the VBArray. If there are multiple dimensions,\n     * each successive dimension is appended to the end of the array.\n     * Example: [[1,2,3],[4,5,6]] becomes [1,2,3,4,5,6]\n     */\n    toArray(): T[];\n}\n\ninterface VBArrayConstructor {\n    new <T>(safeArray: any): VBArray<T>;\n    new (safeArray: any): VBArray<any>;\n}\n\ndeclare var VBArray: VBArrayConstructor;\n\n/**\n * Automation date (VT_DATE)\n */\ninterface VarDate { }\n\ninterface DateConstructor {\n    new (vd: VarDate): Date;\n}\n\ninterface Date {\n    getVarDate: () => VarDate;\n}\n\n\n/// <reference path="lib.dom.d.ts" />\n\ninterface DOMTokenList {\n    [Symbol.iterator](): IterableIterator<string>;\n}\n\ninterface FormData {\n    /**\n     * Returns an array of key, value pairs for every entry in the list\n     */\n    entries(): IterableIterator<[string, string | File]>;\n    /**\n     * Returns a list of keys in the list\n     */\n    keys(): IterableIterator<string>;\n    /**\n     * Returns a list of values in the list\n     */\n    values(): IterableIterator<string | File>;\n\n    [Symbol.iterator](): IterableIterator<string | File>;\n}\n\ninterface Headers {\n    [Symbol.iterator](): IterableIterator<[string, string]>;\n    /**\n     * Returns an iterator allowing to go through all key/value pairs contained in this object.\n     */\n    entries(): IterableIterator<[string, string]>;\n    /**\n     * Returns an iterator allowing to go through all keys f the key/value pairs contained in this object.\n     */\n    keys(): IterableIterator<string>;\n    /**\n     * Returns an iterator allowing to go through all values of the key/value pairs contained in this object.\n     */\n    values(): IterableIterator<string>;\n}\n\ninterface NodeList {\n    /**\n     * Returns an array of key, value pairs for every entry in the list\n     */\n    entries(): IterableIterator<[number, Node]>;\n    /**\n     * Performs the specified action for each node in an list.\n     * @param callbackfn  A function that accepts up to three arguments. forEach calls the callbackfn function one time for each element in the list.\n     * @param thisArg  An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n     */\n    forEach(callbackfn: (value: Node, index: number, listObj: NodeList) => void, thisArg?: any): void;\n    /**\n     * Returns an list of keys in the list\n     */\n    keys(): IterableIterator<number>;\n\n    /**\n     * Returns an list of values in the list\n     */\n    values(): IterableIterator<Node>;\n\n\n    [Symbol.iterator](): IterableIterator<Node>;\n}\n\ninterface NodeListOf<TNode extends Node> {\n\n    /**\n     * Returns an array of key, value pairs for every entry in the list\n     */\n    entries(): IterableIterator<[number, TNode]>;\n\n    /**\n     * Performs the specified action for each node in an list.\n     * @param callbackfn  A function that accepts up to three arguments. forEach calls the callbackfn function one time for each element in the list.\n     * @param thisArg  An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n     */\n    forEach(callbackfn: (value: TNode, index: number, listObj: NodeListOf<TNode>) => void, thisArg?: any): void;\n    /**\n     * Returns an list of keys in the list\n     */\n    keys(): IterableIterator<number>;\n    /**\n     * Returns an list of values in the list\n     */\n    values(): IterableIterator<TNode>;\n\n    [Symbol.iterator](): IterableIterator<TNode>;\n}\n\ninterface URLSearchParams {\n    /**\n     * Returns an array of key, value pairs for every entry in the search params\n     */\n    entries(): IterableIterator<[string, string]>;\n    /**\n     * Returns a list of keys in the search params\n     */\n    keys(): IterableIterator<string>;\n    /**\n     * Returns a list of values in the search params\n     */\n    values(): IterableIterator<string>;\n    /**\n     * iterate over key/value pairs\n     */\n    [Symbol.iterator](): IterableIterator<[string, string]>;\n}\n'
+}}),define("vs/language/typescript/src/worker",["require","exports","../lib/typescriptServices","../lib/lib-ts","../lib/lib-es6-ts"],function(e,n,t,r,a){"use strict";function i(e,n){return new d(e,n)}Object.defineProperty(n,"__esModule",{value:!0});var o=monaco.Promise,s={NAME:"defaultLib:lib.d.ts",CONTENTS:r.contents},l={NAME:"defaultLib:lib.es6.d.ts",CONTENTS:a.contents},d=function(){function e(e,n){this._extraLibs=Object.create(null),this._languageService=t.createLanguageService(this),this._ctx=e,this._compilerOptions=n.compilerOptions,this._extraLibs=n.extraLibs}return e.prototype.getCompilationSettings=function(){return this._compilerOptions},e.prototype.getScriptFileNames=function(){var e=this._ctx.getMirrorModels().map(function(e){return e.uri.toString()});return e.concat(Object.keys(this._extraLibs))},e.prototype._getModel=function(e){for(var n=this._ctx.getMirrorModels(),t=0;t<n.length;t++)if(n[t].uri.toString()===e)return n[t];return null},e.prototype.getScriptVersion=function(e){var n=this._getModel(e);return n?n.version.toString():this.isDefaultLibFileName(e)||e in this._extraLibs?"1":void 0},e.prototype.getScriptSnapshot=function(e){var n,t=this._getModel(e);if(t)n=t.getValue();else if(e in this._extraLibs)n=this._extraLibs[e];else if(e===s.NAME)n=s.CONTENTS;else{if(e!==l.NAME)return;n=l.CONTENTS}return{getText:function(e,t){return n.substring(e,t)},getLength:function(){return n.length},getChangeRange:function(){}}},e.prototype.getScriptKind=function(e){var n=e.substr(e.lastIndexOf(".")+1);switch(n){case"ts":return t.ScriptKind.TS;case"tsx":return t.ScriptKind.TSX;case"js":return t.ScriptKind.JS;case"jsx":return t.ScriptKind.JSX;default:return this.getCompilationSettings().allowJs?t.ScriptKind.JS:t.ScriptKind.TS}},e.prototype.getCurrentDirectory=function(){return""},e.prototype.getDefaultLibFileName=function(e){return e.target<=t.ScriptTarget.ES5?s.NAME:l.NAME},e.prototype.isDefaultLibFileName=function(e){return e===this.getDefaultLibFileName(this._compilerOptions)},e.prototype.getSyntacticDiagnostics=function(e){var n=this._languageService.getSyntacticDiagnostics(e);return n.forEach(function(e){return e.file=void 0}),o.as(n)},e.prototype.getSemanticDiagnostics=function(e){var n=this._languageService.getSemanticDiagnostics(e);return n.forEach(function(e){return e.file=void 0}),o.as(n)},e.prototype.getCompilerOptionsDiagnostics=function(e){var n=this._languageService.getCompilerOptionsDiagnostics();return n.forEach(function(e){return e.file=void 0}),o.as(n)},e.prototype.getCompletionsAtPosition=function(e,n){return o.as(this._languageService.getCompletionsAtPosition(e,n))},e.prototype.getCompletionEntryDetails=function(e,n,t){return o.as(this._languageService.getCompletionEntryDetails(e,n,t))},e.prototype.getSignatureHelpItems=function(e,n){return o.as(this._languageService.getSignatureHelpItems(e,n))},e.prototype.getQuickInfoAtPosition=function(e,n){return o.as(this._languageService.getQuickInfoAtPosition(e,n))},e.prototype.getOccurrencesAtPosition=function(e,n){return o.as(this._languageService.getOccurrencesAtPosition(e,n))},e.prototype.getDefinitionAtPosition=function(e,n){return o.as(this._languageService.getDefinitionAtPosition(e,n))},e.prototype.getReferencesAtPosition=function(e,n){return o.as(this._languageService.getReferencesAtPosition(e,n))},e.prototype.getNavigationBarItems=function(e){return o.as(this._languageService.getNavigationBarItems(e))},e.prototype.getFormattingEditsForDocument=function(e,n){return o.as(this._languageService.getFormattingEditsForDocument(e,n))},e.prototype.getFormattingEditsForRange=function(e,n,t,r){return o.as(this._languageService.getFormattingEditsForRange(e,n,t,r))},e.prototype.getFormattingEditsAfterKeystroke=function(e,n,t,r){return o.as(this._languageService.getFormattingEditsAfterKeystroke(e,n,t,r))},e.prototype.getEmitOutput=function(e){return o.as(this._languageService.getEmitOutput(e))},e}();n.TypeScriptWorker=d,n.create=i});
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/vs/loader.js b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/vs/loader.js
new file mode 100644
index 0000000..3fb2043
--- /dev/null
+++ b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/vs/loader.js
@@ -0,0 +1,8 @@
+/*!-----------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.10.1(ebbf400719be21761361804bf63fb3916e64a845)
+ * Released under the MIT license
+ * https://github.com/Microsoft/vscode/blob/master/LICENSE.txt
+ *-----------------------------------------------------------*/
+"use strict";var _amdLoaderGlobal=this,AMDLoader;!function(e){e.global=_amdLoaderGlobal;var t=function(){function t(e){this.isWindows=e.isWindows,this.isNode=e.isNode,this.isElectronRenderer=e.isElectronRenderer,this.isWebWorker=e.isWebWorker}return t.detect=function(){return new t({isWindows:this._isWindows(),isNode:"undefined"!=typeof module&&!!module.exports,isElectronRenderer:"undefined"!=typeof process&&void 0!==process.versions&&void 0!==process.versions.electron&&"renderer"===process.type,isWebWorker:"function"==typeof e.global.importScripts})},t._isWindows=function(){return!!("undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.indexOf("Windows")>=0)||"undefined"!=typeof process&&"win32"===process.platform},t}();e.Environment=t}(AMDLoader||(AMDLoader={}));var AMDLoader;!function(e){var t;!function(e){e[e.LoaderAvailable=1]="LoaderAvailable",e[e.BeginLoadingScript=10]="BeginLoadingScript",e[e.EndLoadingScriptOK=11]="EndLoadingScriptOK",e[e.EndLoadingScriptError=12]="EndLoadingScriptError",e[e.BeginInvokeFactory=21]="BeginInvokeFactory",e[e.EndInvokeFactory=22]="EndInvokeFactory",e[e.NodeBeginEvaluatingScript=31]="NodeBeginEvaluatingScript",e[e.NodeEndEvaluatingScript=32]="NodeEndEvaluatingScript",e[e.NodeBeginNativeRequire=33]="NodeBeginNativeRequire",e[e.NodeEndNativeRequire=34]="NodeEndNativeRequire"}(t=e.LoaderEventType||(e.LoaderEventType={}));var r=function(){return function(e,t,r){this.type=e,this.detail=t,this.timestamp=r}}();e.LoaderEvent=r;var n=function(){function n(e){this._events=[new r(t.LoaderAvailable,"",e)]}return n.prototype.record=function(t,n){this._events.push(new r(t,n,e.Utilities.getHighPerformanceTimestamp()))},n.prototype.getEvents=function(){return this._events},n}();e.LoaderEventRecorder=n;var o=function(){function e(){}return e.prototype.record=function(e,t){},e.prototype.getEvents=function(){return[]},e}();o.INSTANCE=new o,e.NullLoaderEventRecorder=o}(AMDLoader||(AMDLoader={}));var AMDLoader;!function(e){var t=function(){function t(){}return t.fileUriToFilePath=function(e,t){if(t=decodeURI(t),e){if(/^file:\/\/\//.test(t))return t.substr(8);if(/^file:\/\//.test(t))return t.substr(5)}else if(/^file:\/\//.test(t))return t.substr(7);return t},t.startsWith=function(e,t){return e.length>=t.length&&e.substr(0,t.length)===t},t.endsWith=function(e,t){return e.length>=t.length&&e.substr(e.length-t.length)===t},t.containsQueryString=function(e){return/^[^\#]*\?/gi.test(e)},t.isAbsolutePath=function(e){return/^((http:\/\/)|(https:\/\/)|(file:\/\/)|(\/))/.test(e)},t.forEachProperty=function(e,t){if(e){var r=void 0;for(r in e)e.hasOwnProperty(r)&&t(r,e[r])}},t.isEmpty=function(e){var r=!0;return t.forEachProperty(e,function(){r=!1}),r},t.recursiveClone=function(e){if(!e||"object"!=typeof e)return e;var r=Array.isArray(e)?[]:{};return t.forEachProperty(e,function(e,n){r[e]=n&&"object"==typeof n?t.recursiveClone(n):n}),r},t.generateAnonymousModule=function(){return"===anonymous"+t.NEXT_ANONYMOUS_ID+++"==="},t.isAnonymousModule=function(e){return/^===anonymous/.test(e)},t.getHighPerformanceTimestamp=function(){return this.PERFORMANCE_NOW_PROBED||(this.PERFORMANCE_NOW_PROBED=!0,this.HAS_PERFORMANCE_NOW=e.global.performance&&"function"==typeof e.global.performance.now),this.HAS_PERFORMANCE_NOW?e.global.performance.now():Date.now()},t}();t.NEXT_ANONYMOUS_ID=1,t.PERFORMANCE_NOW_PROBED=!1,t.HAS_PERFORMANCE_NOW=!1,e.Utilities=t}(AMDLoader||(AMDLoader={}));var AMDLoader;!function(e){var t=function(){function t(){}return t.validateConfigurationOptions=function(t,r){return"string"!=typeof(r=r||{}).baseUrl&&(r.baseUrl=""),"boolean"!=typeof r.isBuild&&(r.isBuild=!1),"object"!=typeof r.paths&&(r.paths={}),"object"!=typeof r.config&&(r.config={}),void 0===r.catchError&&(r.catchError=t),"string"!=typeof r.urlArgs&&(r.urlArgs=""),"function"!=typeof r.onError&&(r.onError=function(e){return"load"===e.errorCode?(console.error('Loading "'+e.moduleId+'" failed'),console.error("Detail: ",e.detail),e.detail&&e.detail.stack&&console.error(e.detail.stack),console.error("Here are the modules that depend on it:"),void console.error(e.neededBy)):"factory"===e.errorCode?(console.error('The factory method of "'+e.moduleId+'" has thrown an exception'),console.error(e.detail),void(e.detail&&e.detail.stack&&console.error(e.detail.stack))):void 0}),"object"==typeof r.ignoreDuplicateModules&&Array.isArray(r.ignoreDuplicateModules)||(r.ignoreDuplicateModules=[]),r.baseUrl.length>0&&(e.Utilities.endsWith(r.baseUrl,"/")||(r.baseUrl+="/")),Array.isArray(r.nodeModules)||(r.nodeModules=[]),("number"!=typeof r.nodeCachedDataWriteDelay||r.nodeCachedDataWriteDelay<0)&&(r.nodeCachedDataWriteDelay=7e3),"function"!=typeof r.onNodeCachedData&&(r.onNodeCachedData=function(e,t){e&&("cachedDataRejected"===e.errorCode?console.warn("Rejected cached data from file: "+e.path):"unlink"===e.errorCode||"writeFile"===e.errorCode?(console.error("Problems writing cached data file: "+e.path),console.error(e.detail)):console.error(e))}),r},t.mergeConfigurationOptions=function(r,n,o){void 0===n&&(n=null),void 0===o&&(o=null);var i=e.Utilities.recursiveClone(o||{});return e.Utilities.forEachProperty(n,function(t,r){"ignoreDuplicateModules"===t&&void 0!==i.ignoreDuplicateModules?i.ignoreDuplicateModules=i.ignoreDuplicateModules.concat(r):"paths"===t&&void 0!==i.paths?e.Utilities.forEachProperty(r,function(e,t){return i.paths[e]=t}):"config"===t&&void 0!==i.config?e.Utilities.forEachProperty(r,function(e,t){return i.config[e]=t}):i[t]=e.Utilities.recursiveClone(r)}),t.validateConfigurationOptions(r,i)},t}();e.ConfigurationOptionsUtil=t;var r=function(){function r(e,r){if(this._env=e,this.options=t.mergeConfigurationOptions(this._env.isWebWorker,r),this._createIgnoreDuplicateModulesMap(),this._createNodeModulesMap(),this._createSortedPathsRules(),""===this.options.baseUrl){if(this._env.isNode&&this.options.nodeRequire&&this.options.nodeRequire.main&&this.options.nodeRequire.main.filename){var n=this.options.nodeRequire.main.filename,o=Math.max(n.lastIndexOf("/"),n.lastIndexOf("\\"));this.options.baseUrl=n.substring(0,o+1)}if(this._env.isNode&&this.options.nodeMain){var n=this.options.nodeMain,o=Math.max(n.lastIndexOf("/"),n.lastIndexOf("\\"));this.options.baseUrl=n.substring(0,o+1)}}}return r.prototype._createIgnoreDuplicateModulesMap=function(){this.ignoreDuplicateModulesMap={};for(var e=0;e<this.options.ignoreDuplicateModules.length;e++)this.ignoreDuplicateModulesMap[this.options.ignoreDuplicateModules[e]]=!0},r.prototype._createNodeModulesMap=function(){this.nodeModulesMap=Object.create(null);for(var e=0,t=this.options.nodeModules;e<t.length;e++){var r=t[e];this.nodeModulesMap[r]=!0}},r.prototype._createSortedPathsRules=function(){var t=this;this.sortedPathsRules=[],e.Utilities.forEachProperty(this.options.paths,function(e,r){Array.isArray(r)?t.sortedPathsRules.push({from:e,to:r}):t.sortedPathsRules.push({from:e,to:[r]})}),this.sortedPathsRules.sort(function(e,t){return t.from.length-e.from.length})},r.prototype.cloneAndMerge=function(e){return new r(this._env,t.mergeConfigurationOptions(this._env.isWebWorker,e,this.options))},r.prototype.getOptionsLiteral=function(){return this.options},r.prototype._applyPaths=function(t){for(var r,n=0,o=this.sortedPathsRules.length;n<o;n++)if(r=this.sortedPathsRules[n],e.Utilities.startsWith(t,r.from)){for(var i=[],s=0,a=r.to.length;s<a;s++)i.push(r.to[s]+t.substr(r.from.length));return i}return[t]},r.prototype._addUrlArgsToUrl=function(t){return e.Utilities.containsQueryString(t)?t+"&"+this.options.urlArgs:t+"?"+this.options.urlArgs},r.prototype._addUrlArgsIfNecessaryToUrl=function(e){return this.options.urlArgs?this._addUrlArgsToUrl(e):e},r.prototype._addUrlArgsIfNecessaryToUrls=function(e){if(this.options.urlArgs)for(var t=0,r=e.length;t<r;t++)e[t]=this._addUrlArgsToUrl(e[t]);return e},r.prototype.moduleIdToPaths=function(t){if(!0===this.nodeModulesMap[t])return this.isBuild()?["empty:"]:["node|"+t];var r,n=t;if(e.Utilities.endsWith(n,".js")||e.Utilities.isAbsolutePath(n))e.Utilities.endsWith(n,".js")||e.Utilities.containsQueryString(n)||(n+=".js"),r=[n];else for(var o=0,i=(r=this._applyPaths(n)).length;o<i;o++)this.isBuild()&&"empty:"===r[o]||(e.Utilities.isAbsolutePath(r[o])||(r[o]=this.options.baseUrl+r[o]),e.Utilities.endsWith(r[o],".js")||e.Utilities.containsQueryString(r[o])||(r[o]=r[o]+".js"));return this._addUrlArgsIfNecessaryToUrls(r)},r.prototype.requireToUrl=function(t){var r=t;return e.Utilities.isAbsolutePath(r)||(r=this._applyPaths(r)[0],e.Utilities.isAbsolutePath(r)||(r=this.options.baseUrl+r)),this._addUrlArgsIfNecessaryToUrl(r)},r.prototype.isBuild=function(){return this.options.isBuild},r.prototype.isDuplicateMessageIgnoredFor=function(e){return this.ignoreDuplicateModulesMap.hasOwnProperty(e)},r.prototype.getConfigForModule=function(e){if(this.options.config)return this.options.config[e]},r.prototype.shouldCatchError=function(){return this.options.catchError},r.prototype.shouldRecordStats=function(){return this.options.recordStats},r.prototype.onError=function(e){this.options.onError(e)},r}();e.Configuration=r}(AMDLoader||(AMDLoader={}));var AMDLoader;!function(e){var t=function(){function e(e){this.actualScriptLoader=e,this.callbackMap={}}return e.prototype.load=function(e,t,r,n){var o=this,i={callback:r,errorback:n};this.callbackMap.hasOwnProperty(t)?this.callbackMap[t].push(i):(this.callbackMap[t]=[i],this.actualScriptLoader.load(e,t,function(){return o.triggerCallback(t)},function(e){return o.triggerErrorback(t,e)}))},e.prototype.triggerCallback=function(e){var t=this.callbackMap[e];delete this.callbackMap[e];for(var r=0;r<t.length;r++)t[r].callback()},e.prototype.triggerErrorback=function(e,t){var r=this.callbackMap[e];delete this.callbackMap[e];for(var n=0;n<r.length;n++)r[n].errorback(t)},e}(),r=function(){function e(){}return e.prototype.attachListeners=function(e,t,r){var n=function(){e.removeEventListener("load",o),e.removeEventListener("error",i)},o=function(e){n(),t()},i=function(e){n(),r(e)};e.addEventListener("load",o),e.addEventListener("error",i)},e.prototype.load=function(e,t,r,n){var o=document.createElement("script");o.setAttribute("async","async"),o.setAttribute("type","text/javascript"),this.attachListeners(o,r,n),o.setAttribute("src",t),document.getElementsByTagName("head")[0].appendChild(o)},e}(),n=function(){function e(){}return e.prototype.load=function(e,t,r,n){try{importScripts(t),r()}catch(e){n(e)}},e}(),o=function(){function t(e){this._env=e,this._didInitialize=!1,this._didPatchNodeRequire=!1}return t.prototype._init=function(e){if(!this._didInitialize){this._didInitialize=!0,this._fs=e("fs"),this._vm=e("vm"),this._path=e("path"),this._crypto=e("crypto"),this._jsflags="";for(var t=0,r=process.argv;t<r.length;t++){var n=r[t];if(0===n.indexOf("--js-flags=")){this._jsflags=n;break}}}},t.prototype._initNodeRequire=function(t,r){function n(e){var t=e.constructor,r=function(t){try{return e.require(t)}finally{}};return r.resolve=function(r){return t._resolveFilename(r,e)},r.main=process.mainModule,r.extensions=t._extensions,r.cache=t._cache,r}var o=r.getConfig().getOptionsLiteral().nodeCachedDataDir;if(o&&!this._didPatchNodeRequire){this._didPatchNodeRequire=!0;var i=this,s=t("module");s.prototype._compile=function(t,a){t=t.replace(/^#!.*/,"");var d=s.wrap(t),l=i._getCachedDataPath(o,a),u={filename:a};try{u.cachedData=i._fs.readFileSync(l)}catch(e){u.produceCachedData=!0}var c=new i._vm.Script(d,u),h=c.runInThisContext(u),f=i._path.dirname(a),p=n(this),g=[this.exports,p,this,a,f,process,e.global,Buffer],v=h.apply(this.exports,g);return i._processCachedData(r,c,l),v}}},t.prototype.load=function(r,n,o,i){var s=this,a=r.getConfig().getOptionsLiteral(),d=a.nodeRequire||e.global.nodeRequire,l=a.nodeInstrumenter||function(e){return e};this._init(d),this._initNodeRequire(d,r);var u=r.getRecorder();if(/^node\|/.test(n)){var c=n.split("|"),h=null;try{h=d(c[1])}catch(e){return void i(e)}r.enqueueDefineAnonymousModule([],function(){return h}),o()}else n=e.Utilities.fileUriToFilePath(this._env.isWindows,n),this._fs.readFile(n,{encoding:"utf8"},function(e,d){if(e)i(e);else{var c=s._path.normalize(n),h=c;if(s._env.isElectronRenderer){var f=h.match(/^([a-z])\:(.*)/i);h=f?"file:///"+(f[1].toUpperCase()+":"+f[2]).replace(/\\/g,"/"):"file://"+h}var p,g="(function (require, define, __filename, __dirname) { ";if(p=d.charCodeAt(0)===t._BOM?g+d.substring(1)+"\n});":g+d+"\n});",p=l(p,c),a.nodeCachedDataDir){var v=s._getCachedDataPath(a.nodeCachedDataDir,n);s._fs.readFile(v,function(e,t){var i={filename:h,produceCachedData:void 0===t,cachedData:t},a=s._loadAndEvalScript(r,n,h,p,i,u);o(),s._processCachedData(r,a,v)})}else s._loadAndEvalScript(r,n,h,p,{filename:h},u),o()}})},t.prototype._loadAndEvalScript=function(t,r,n,o,i,s){s.record(e.LoaderEventType.NodeBeginEvaluatingScript,r);var a=new this._vm.Script(o,i);return a.runInThisContext(i).call(e.global,t.getGlobalAMDRequireFunc(),t.getGlobalAMDDefineFunc(),n,this._path.dirname(r)),s.record(e.LoaderEventType.NodeEndEvaluatingScript,r),a},t.prototype._getCachedDataPath=function(e,t){var r=this._crypto.createHash("md5").update(t,"utf8").update(this._jsflags,"utf8").digest("hex"),n=this._path.basename(t).replace(/\.js$/,"");return this._path.join(e,n+"-"+r+".code")},t.prototype._processCachedData=function(e,r,n){var o=this;r.cachedDataRejected?(e.getConfig().getOptionsLiteral().onNodeCachedData({errorCode:"cachedDataRejected",path:n}),t._runSoon(function(){return o._fs.unlink(n,function(t){t&&e.getConfig().getOptionsLiteral().onNodeCachedData({errorCode:"unlink",path:n,detail:t})})},e.getConfig().getOptionsLiteral().nodeCachedDataWriteDelay)):r.cachedDataProduced&&(e.getConfig().getOptionsLiteral().onNodeCachedData(void 0,{path:n,length:r.cachedData.length}),t._runSoon(function(){return o._fs.writeFile(n,r.cachedData,function(t){t&&e.getConfig().getOptionsLiteral().onNodeCachedData({errorCode:"writeFile",path:n,detail:t})})},e.getConfig().getOptionsLiteral().nodeCachedDataWriteDelay))},t._runSoon=function(e,t){var r=t+Math.ceil(Math.random()*t);setTimeout(e,r)},t}();o._BOM=65279,e.createScriptLoader=function(e){return new t(e.isWebWorker?new n:e.isNode?new o(e):new r)}}(AMDLoader||(AMDLoader={}));var AMDLoader;!function(e){var t=function(){function t(e){var t=e.lastIndexOf("/");this.fromModulePath=-1!==t?e.substr(0,t+1):""}return t._normalizeModuleId=function(e){var t,r=e;for(t=/\/\.\//;t.test(r);)r=r.replace(t,"/");for(r=r.replace(/^\.\//g,""),t=/\/(([^\/])|([^\/][^\/\.])|([^\/\.][^\/])|([^\/][^\/][^\/]+))\/\.\.\//;t.test(r);)r=r.replace(t,"/");return r=r.replace(/^(([^\/])|([^\/][^\/\.])|([^\/\.][^\/])|([^\/][^\/][^\/]+))\/\.\.\//,"")},t.prototype.resolveModule=function(r){var n=r;return e.Utilities.isAbsolutePath(n)||(e.Utilities.startsWith(n,"./")||e.Utilities.startsWith(n,"../"))&&(n=t._normalizeModuleId(this.fromModulePath+n)),n},t}();t.ROOT=new t(""),e.ModuleIdResolver=t;var r=function(){function t(e,t,r,n,o,i){this.id=e,this.strId=t,this.dependencies=r,this._callback=n,this._errorback=o,this.moduleIdResolver=i,this.exports={},this.exportsPassedIn=!1,this.unresolvedDependenciesCount=this.dependencies.length,this._isComplete=!1}return t._safeInvokeFunction=function(t,r){try{return{returnedValue:t.apply(e.global,r),producedError:null}}catch(e){return{returnedValue:null,producedError:e}}},t._invokeFactory=function(t,r,n,o){return t.isBuild()&&!e.Utilities.isAnonymousModule(r)?{returnedValue:null,producedError:null}:t.shouldCatchError()?this._safeInvokeFunction(n,o):{returnedValue:n.apply(e.global,o),producedError:null}},t.prototype.complete=function(r,n,o){this._isComplete=!0;var i=null;if(this._callback)if("function"==typeof this._callback){r.record(e.LoaderEventType.BeginInvokeFactory,this.strId);var s=t._invokeFactory(n,this.strId,this._callback,o);i=s.producedError,r.record(e.LoaderEventType.EndInvokeFactory,this.strId),i||void 0===s.returnedValue||this.exportsPassedIn&&!e.Utilities.isEmpty(this.exports)||(this.exports=s.returnedValue)}else this.exports=this._callback;i&&n.onError({errorCode:"factory",moduleId:this.strId,detail:i}),this.dependencies=null,this._callback=null,this._errorback=null,this.moduleIdResolver=null},t.prototype.onDependencyError=function(e){return!!this._errorback&&(this._errorback(e),!0)},t.prototype.isComplete=function(){return this._isComplete},t}();e.Module=r;var n=function(){function e(){this._nextId=0,this._strModuleIdToIntModuleId=new Map,this._intModuleIdToStrModuleId=[],this.getModuleId("exports"),this.getModuleId("module"),this.getModuleId("require")}return e.prototype.getMaxModuleId=function(){return this._nextId},e.prototype.getModuleId=function(e){var t=this._strModuleIdToIntModuleId.get(e);return void 0===t&&(t=this._nextId++,this._strModuleIdToIntModuleId.set(e,t),this._intModuleIdToStrModuleId[t]=e),t},e.prototype.getStrModuleId=function(e){return this._intModuleIdToStrModuleId[e]},e}(),o=function(){return function(e){this.id=e}}();o.EXPORTS=new o(0),o.MODULE=new o(1),o.REQUIRE=new o(2),e.RegularDependency=o;var i=function(){return function(e,t,r){this.id=e,this.pluginId=t,this.pluginParam=r}}();e.PluginDependency=i;var s=function(){function s(t,r,o,i,s){void 0===s&&(s=0),this._env=t,this._scriptLoader=r,this._loaderAvailableTimestamp=s,this._defineFunc=o,this._requireFunc=i,this._moduleIdProvider=new n,this._config=new e.Configuration(this._env),this._modules2=[],this._knownModules2=[],this._inverseDependencies2=[],this._inversePluginDependencies2=new Map,this._currentAnnonymousDefineCall=null,this._recorder=null,this._buildInfoPath=[],this._buildInfoDefineStack=[],this._buildInfoDependencies=[]}return s.prototype.reset=function(){return new s(this._env,this._scriptLoader,this._defineFunc,this._requireFunc,this._loaderAvailableTimestamp)},s.prototype.getGlobalAMDDefineFunc=function(){return this._defineFunc},s.prototype.getGlobalAMDRequireFunc=function(){return this._requireFunc},s._findRelevantLocationInStack=function(e,t){for(var r=function(e){return e.replace(/\\/g,"/")},n=r(e),o=t.split(/\n/),i=0;i<o.length;i++){var s=o[i].match(/(.*):(\d+):(\d+)\)?$/);if(s){var a=s[1],d=s[2],l=s[3],u=Math.max(a.lastIndexOf(" ")+1,a.lastIndexOf("(")+1);if(a=a.substr(u),(a=r(a))===n){var c={line:parseInt(d,10),col:parseInt(l,10)};return 1===c.line&&(c.col-="(function (require, define, __filename, __dirname) { ".length),c}}}throw new Error("Could not correlate define call site for needle "+e)},s.prototype.getBuildInfo=function(){if(!this._config.isBuild())return null;for(var e=[],t=0,r=0,n=this._modules2.length;r<n;r++){var o=this._modules2[r];if(o){var i=this._buildInfoPath[o.id]||null,a=this._buildInfoDefineStack[o.id]||null,d=this._buildInfoDependencies[o.id];e[t++]={id:o.strId,path:i,defineLocation:i&&a?s._findRelevantLocationInStack(i,a):null,dependencies:d,shim:null,exports:o.exports}}}return e},s.prototype.getRecorder=function(){return this._recorder||(this._config.shouldRecordStats()?this._recorder=new e.LoaderEventRecorder(this._loaderAvailableTimestamp):this._recorder=e.NullLoaderEventRecorder.INSTANCE),this._recorder},s.prototype.getLoaderEvents=function(){return this.getRecorder().getEvents()},s.prototype.enqueueDefineAnonymousModule=function(e,t){if(null!==this._currentAnnonymousDefineCall)throw new Error("Can only have one anonymous define call per script file");var r=null;this._config.isBuild()&&(r=new Error("StackLocation").stack),this._currentAnnonymousDefineCall={stack:r,dependencies:e,callback:t}},s.prototype.defineModule=function(e,n,o,i,s,a){var d=this;void 0===a&&(a=new t(e));var l=this._moduleIdProvider.getModuleId(e);if(this._modules2[l])this._config.isDuplicateMessageIgnoredFor(e)||console.warn("Duplicate definition of module '"+e+"'");else{var u=new r(l,e,this._normalizeDependencies(n,a),o,i,a);this._modules2[l]=u,this._config.isBuild()&&(this._buildInfoDefineStack[l]=s,this._buildInfoDependencies[l]=u.dependencies.map(function(e){return d._moduleIdProvider.getStrModuleId(e.id)})),this._resolve(u)}},s.prototype._normalizeDependency=function(e,t){if("exports"===e)return o.EXPORTS;if("module"===e)return o.MODULE;if("require"===e)return o.REQUIRE;var r=e.indexOf("!");if(r>=0){var n=t.resolveModule(e.substr(0,r)),s=t.resolveModule(e.substr(r+1)),a=this._moduleIdProvider.getModuleId(n+"!"+s),d=this._moduleIdProvider.getModuleId(n);return new i(a,d,s)}return new o(this._moduleIdProvider.getModuleId(t.resolveModule(e)))},s.prototype._normalizeDependencies=function(e,t){for(var r=[],n=0,o=0,i=e.length;o<i;o++)r[n++]=this._normalizeDependency(e[o],t);return r},s.prototype._relativeRequire=function(t,r,n,o){if("string"==typeof r)return this.synchronousRequire(r,t);this.defineModule(e.Utilities.generateAnonymousModule(),r,n,o,null,t)},s.prototype.synchronousRequire=function(e,r){void 0===r&&(r=new t(e));var n=this._normalizeDependency(e,r),o=this._modules2[n.id];if(!o)throw new Error("Check dependency list! Synchronous require cannot resolve module '"+e+"'. This is the first mention of this module!");if(!o.isComplete())throw new Error("Check dependency list! Synchronous require cannot resolve module '"+e+"'. This module has not been resolved completely yet.");return o.exports},s.prototype.configure=function(t,r){var n=this._config.shouldRecordStats();this._config=r?new e.Configuration(this._env,t):this._config.cloneAndMerge(t),this._config.shouldRecordStats()&&!n&&(this._recorder=null)},s.prototype.getConfig=function(){return this._config},s.prototype._onLoad=function(e){if(null!==this._currentAnnonymousDefineCall){var t=this._currentAnnonymousDefineCall;this._currentAnnonymousDefineCall=null,this.defineModule(this._moduleIdProvider.getStrModuleId(e),t.dependencies,t.callback,null,t.stack)}},s.prototype._createLoadError=function(e,t){var r=this;return{errorCode:"load",moduleId:this._moduleIdProvider.getStrModuleId(e),neededBy:(this._inverseDependencies2[e]||[]).map(function(e){return r._moduleIdProvider.getStrModuleId(e)}),detail:t}},s.prototype._onLoadError=function(e,t){for(var r=this._createLoadError(e,t),n=[],o=0,i=this._moduleIdProvider.getMaxModuleId();o<i;o++)n[o]=!1;var s=!1,a=[];for(a.push(e),n[e]=!0;a.length>0;){var d=a.shift(),l=this._modules2[d];l&&(s=l.onDependencyError(r)||s);var u=this._inverseDependencies2[d];if(u)for(var o=0,i=u.length;o<i;o++){var c=u[o];n[c]||(a.push(c),n[c]=!0)}}s||this._config.onError(r)},s.prototype._hasDependencyPath=function(e,t){var r=this._modules2[e];if(!r)return!1;for(var n=[],o=0,i=this._moduleIdProvider.getMaxModuleId();o<i;o++)n[o]=!1;var s=[];for(s.push(r),n[e]=!0;s.length>0;){var a=s.shift().dependencies;if(a)for(var o=0,i=a.length;o<i;o++){var d=a[o];if(d.id===t)return!0;var l=this._modules2[d.id];l&&!n[d.id]&&(n[d.id]=!0,s.push(l))}}return!1},s.prototype._findCyclePath=function(e,t,r){if(e===t||50===r)return[e];var n=this._modules2[e];if(!n)return null;for(var o=n.dependencies,i=0,s=o.length;i<s;i++){var a=this._findCyclePath(o[i].id,t,r+1);if(null!==a)return a.push(e),a}return null},s.prototype._createRequire=function(t){var r=this,n=function(e,n,o){return r._relativeRequire(t,e,n,o)};return n.toUrl=function(e){return r._config.requireToUrl(t.resolveModule(e))},n.getStats=function(){return r.getLoaderEvents()},n.__$__nodeRequire=e.global.nodeRequire,n},s.prototype._loadModule=function(t){var r=this;if(!this._modules2[t]&&!this._knownModules2[t]){this._knownModules2[t]=!0;var n=this._moduleIdProvider.getStrModuleId(t),o=this._config.moduleIdToPaths(n);this._env.isNode&&-1===n.indexOf("/")&&o.push("node|"+n);var i=-1,s=function(n){if(++i>=o.length)r._onLoadError(t,n);else{var a=o[i],d=r.getRecorder();if(r._config.isBuild()&&"empty:"===a)return r._buildInfoPath[t]=a,r.defineModule(r._moduleIdProvider.getStrModuleId(t),[],null,null,null),void r._onLoad(t);d.record(e.LoaderEventType.BeginLoadingScript,a),r._scriptLoader.load(r,a,function(){r._config.isBuild()&&(r._buildInfoPath[t]=a),d.record(e.LoaderEventType.EndLoadingScriptOK,a),r._onLoad(t)},function(t){d.record(e.LoaderEventType.EndLoadingScriptError,a),s(t)})}};s(null)}},s.prototype._loadPluginDependency=function(e,r){var n=this;if(!this._modules2[r.id]&&!this._knownModules2[r.id]){this._knownModules2[r.id]=!0;var o=function(e){n.defineModule(n._moduleIdProvider.getStrModuleId(r.id),[],e,null,null)};o.error=function(e){n._config.onError(n._createLoadError(r.id,e))},e.load(r.pluginParam,this._createRequire(t.ROOT),o,this._config.getOptionsLiteral())}},s.prototype._resolve=function(e){for(var t=this,r=e.dependencies,n=0,s=r.length;n<s;n++){var a=r[n];if(a!==o.EXPORTS)if(a!==o.MODULE)if(a!==o.REQUIRE){var d=this._modules2[a.id];if(d&&d.isComplete())e.unresolvedDependenciesCount--;else if(this._hasDependencyPath(a.id,e.id)){console.warn("There is a dependency cycle between '"+this._moduleIdProvider.getStrModuleId(a.id)+"' and '"+this._moduleIdProvider.getStrModuleId(e.id)+"'. The cyclic path follows:");var l=this._findCyclePath(a.id,e.id,0);l.reverse(),l.push(a.id),console.warn(l.map(function(e){return t._moduleIdProvider.getStrModuleId(e)}).join(" => \n")),e.unresolvedDependenciesCount--}else if(this._inverseDependencies2[a.id]=this._inverseDependencies2[a.id]||[],this._inverseDependencies2[a.id].push(e.id),a instanceof i){var u=this._modules2[a.pluginId];if(u&&u.isComplete()){this._loadPluginDependency(u.exports,a);continue}var c=this._inversePluginDependencies2.get(a.pluginId);c||(c=[],this._inversePluginDependencies2.set(a.pluginId,c)),c.push(a),this._loadModule(a.pluginId)}else this._loadModule(a.id)}else e.unresolvedDependenciesCount--;else e.unresolvedDependenciesCount--;else e.exportsPassedIn=!0,e.unresolvedDependenciesCount--}0===e.unresolvedDependenciesCount&&this._onModuleComplete(e)},s.prototype._onModuleComplete=function(e){var t=this,r=this.getRecorder();if(!e.isComplete()){for(var n=e.dependencies,i=[],s=0,a=n.length;s<a;s++){var d=n[s];if(d!==o.EXPORTS)if(d!==o.MODULE)if(d!==o.REQUIRE){var l=this._modules2[d.id];i[s]=l?l.exports:null}else i[s]=this._createRequire(e.moduleIdResolver);else i[s]={id:e.strId,config:function(){return t._config.getConfigForModule(e.strId)}};else i[s]=e.exports}e.complete(r,this._config,i);var u=this._inverseDependencies2[e.id];if(this._inverseDependencies2[e.id]=null,u)for(var s=0,a=u.length;s<a;s++){var c=u[s],h=this._modules2[c];h.unresolvedDependenciesCount--,0===h.unresolvedDependenciesCount&&this._onModuleComplete(h)}var f=this._inversePluginDependencies2.get(e.id);if(f){this._inversePluginDependencies2.delete(e.id);for(var s=0,a=f.length;s<a;s++)this._loadPluginDependency(e.exports,f[s])}}},s}();e.ModuleManager=s}(AMDLoader||(AMDLoader={}));var define,AMDLoader;!function(e){function t(){(o=function(e,t,r){"string"!=typeof e&&(r=t,t=e,e=null),"object"==typeof t&&Array.isArray(t)||(r=t,t=null),t||(t=["require","exports","module"]),e?n.defineModule(e,t,r,null,null):n.enqueueDefineAnonymousModule(t,r)}).amd={jQuery:!0};var t=function(e,t){void 0===t&&(t=!1),n.configure(e,t)};(i=function(){if(1===arguments.length){if(arguments[0]instanceof Object&&!Array.isArray(arguments[0]))return void t(arguments[0]);if("string"==typeof arguments[0])return n.synchronousRequire(arguments[0])}if(2!==arguments.length&&3!==arguments.length||!Array.isArray(arguments[0]))throw new Error("Unrecognized require call");n.defineModule(e.Utilities.generateAnonymousModule(),arguments[0],arguments[1],arguments[2],null)}).config=t,i.getConfig=function(){return n.getConfig().getOptionsLiteral()},i.reset=function(){n=n.reset()},i.getBuildInfo=function(){return n.getBuildInfo()},i.getStats=function(){return n.getLoaderEvents()}}function r(){t();var r=e.Environment.detect(),s=e.createScriptLoader(r);if(n=new e.ModuleManager(r,s,o,i,e.Utilities.getHighPerformanceTimestamp()),r.isNode){var a=e.global.require||require,d=function(t){n.getRecorder().record(e.LoaderEventType.NodeBeginNativeRequire,t);try{return a(t)}finally{n.getRecorder().record(e.LoaderEventType.NodeEndNativeRequire,t)}};e.global.nodeRequire=d,i.nodeRequire=d}r.isNode&&!r.isElectronRenderer?(module.exports=i,define=function(){o.apply(null,arguments)},require=i):(void 0!==e.global.require&&"function"!=typeof e.global.require&&i.config(e.global.require),r.isElectronRenderer?define=function(){o.apply(null,arguments)}:e.global.define=define=o,e.global.require=i,e.global.require.__$__nodeRequire=d)}var n=null,o=null,i=null;e.init=r,"undefined"!=typeof doNotInitLoader||"function"==typeof e.global.define&&e.global.define.amd||r()}(AMDLoader||(AMDLoader={}));
+//# sourceMappingURL=../../min-maps/vs/loader.js.map
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/xml.js b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/xml.js
new file mode 100644
index 0000000..8724fef
--- /dev/null
+++ b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/console-ui/public/js/xml.js
@@ -0,0 +1,407 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+(function(mod) {
+  if (typeof exports == "object" && typeof module == "object") // CommonJS
+    mod(require("../../lib/codemirror"));
+  else if (typeof define == "function" && define.amd) // AMD
+    define(["../../lib/codemirror"], mod);
+  else // Plain browser env
+    mod(CodeMirror);
+})(function(CodeMirror) {
+"use strict";
+
+var htmlConfig = {
+  autoSelfClosers: {'area': true, 'base': true, 'br': true, 'col': true, 'command': true,
+                    'embed': true, 'frame': true, 'hr': true, 'img': true, 'input': true,
+                    'keygen': true, 'link': true, 'meta': true, 'param': true, 'source': true,
+                    'track': true, 'wbr': true, 'menuitem': true},
+  implicitlyClosed: {'dd': true, 'li': true, 'optgroup': true, 'option': true, 'p': true,
+                     'rp': true, 'rt': true, 'tbody': true, 'td': true, 'tfoot': true,
+                     'th': true, 'tr': true},
+  contextGrabbers: {
+    'dd': {'dd': true, 'dt': true},
+    'dt': {'dd': true, 'dt': true},
+    'li': {'li': true},
+    'option': {'option': true, 'optgroup': true},
+    'optgroup': {'optgroup': true},
+    'p': {'address': true, 'article': true, 'aside': true, 'blockquote': true, 'dir': true,
+          'div': true, 'dl': true, 'fieldset': true, 'footer': true, 'form': true,
+          'h1': true, 'h2': true, 'h3': true, 'h4': true, 'h5': true, 'h6': true,
+          'header': true, 'hgroup': true, 'hr': true, 'menu': true, 'nav': true, 'ol': true,
+          'p': true, 'pre': true, 'section': true, 'table': true, 'ul': true},
+    'rp': {'rp': true, 'rt': true},
+    'rt': {'rp': true, 'rt': true},
+    'tbody': {'tbody': true, 'tfoot': true},
+    'td': {'td': true, 'th': true},
+    'tfoot': {'tbody': true},
+    'th': {'td': true, 'th': true},
+    'thead': {'tbody': true, 'tfoot': true},
+    'tr': {'tr': true}
+  },
+  doNotIndent: {"pre": true},
+  allowUnquoted: true,
+  allowMissing: true,
+  caseFold: true
+}
+
+var xmlConfig = {
+  autoSelfClosers: {},
+  implicitlyClosed: {},
+  contextGrabbers: {},
+  doNotIndent: {},
+  allowUnquoted: false,
+  allowMissing: false,
+  caseFold: false
+}
+
+CodeMirror.defineMode("xml", function(editorConf, config_) {
+  var indentUnit = editorConf.indentUnit
+  var config = {}
+  var defaults = config_.htmlMode ? htmlConfig : xmlConfig
+  for (var prop in defaults) config[prop] = defaults[prop]
+  for (var prop in config_) config[prop] = config_[prop]
+
+  // Return variables for tokenizers
+  var type, setStyle;
+
+  function inText(stream, state) {
+    function chain(parser) {
+      state.tokenize = parser;
+      return parser(stream, state);
+    }
+
+    var ch = stream.next();
+    if (ch == "<") {
+      if (stream.eat("!")) {
+        if (stream.eat("[")) {
+          if (stream.match("CDATA[")) return chain(inBlock("atom", "]]>"));
+          else return null;
+        } else if (stream.match("--")) {
+          return chain(inBlock("comment", "-->"));
+        } else if (stream.match("DOCTYPE", true, true)) {
+          stream.eatWhile(/[\w\._\-]/);
+          return chain(doctype(1));
+        } else {
+          return null;
+        }
+      } else if (stream.eat("?")) {
+        stream.eatWhile(/[\w\._\-]/);
+        state.tokenize = inBlock("meta", "?>");
+        return "meta";
+      } else {
+        type = stream.eat("/") ? "closeTag" : "openTag";
+        state.tokenize = inTag;
+        return "tag bracket";
+      }
+    } else if (ch == "&") {
+      var ok;
+      if (stream.eat("#")) {
+        if (stream.eat("x")) {
+          ok = stream.eatWhile(/[a-fA-F\d]/) && stream.eat(";");
+        } else {
+          ok = stream.eatWhile(/[\d]/) && stream.eat(";");
+        }
+      } else {
+        ok = stream.eatWhile(/[\w\.\-:]/) && stream.eat(";");
+      }
+      return ok ? "atom" : "error";
+    } else {
+      stream.eatWhile(/[^&<]/);
+      return null;
+    }
+  }
+  inText.isInText = true;
+
+  function inTag(stream, state) {
+    var ch = stream.next();
+    if (ch == ">" || (ch == "/" && stream.eat(">"))) {
+      state.tokenize = inText;
+      type = ch == ">" ? "endTag" : "selfcloseTag";
+      return "tag bracket";
+    } else if (ch == "=") {
+      type = "equals";
+      return null;
+    } else if (ch == "<") {
+      state.tokenize = inText;
+      state.state = baseState;
+      state.tagName = state.tagStart = null;
+      var next = state.tokenize(stream, state);
+      return next ? next + " tag error" : "tag error";
+    } else if (/[\'\"]/.test(ch)) {
+      state.tokenize = inAttribute(ch);
+      state.stringStartCol = stream.column();
+      return state.tokenize(stream, state);
+    } else {
+      stream.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/);
+      return "word";
+    }
+  }
+
+  function inAttribute(quote) {
+    var closure = function(stream, state) {
+      while (!stream.eol()) {
+        if (stream.next() == quote) {
+          state.tokenize = inTag;
+          break;
+        }
+      }
+      return "string";
+    };
+    closure.isInAttribute = true;
+    return closure;
+  }
+
+  function inBlock(style, terminator) {
+    return function(stream, state) {
+      while (!stream.eol()) {
+        if (stream.match(terminator)) {
+          state.tokenize = inText;
+          break;
+        }
+        stream.next();
+      }
+      return style;
+    };
+  }
+  function doctype(depth) {
+    return function(stream, state) {
+      var ch;
+      while ((ch = stream.next()) != null) {
+        if (ch == "<") {
+          state.tokenize = doctype(depth + 1);
+          return state.tokenize(stream, state);
+        } else if (ch == ">") {
+          if (depth == 1) {
+            state.tokenize = inText;
+            break;
+          } else {
+            state.tokenize = doctype(depth - 1);
+            return state.tokenize(stream, state);
+          }
+        }
+      }
+      return "meta";
+    };
+  }
+
+  function Context(state, tagName, startOfLine) {
+    this.prev = state.context;
+    this.tagName = tagName;
+    this.indent = state.indented;
+    this.startOfLine = startOfLine;
+    if (config.doNotIndent.hasOwnProperty(tagName) || (state.context && state.context.noIndent))
+      this.noIndent = true;
+  }
+  function popContext(state) {
+    if (state.context) state.context = state.context.prev;
+  }
+  function maybePopContext(state, nextTagName) {
+    var parentTagName;
+    while (true) {
+      if (!state.context) {
+        return;
+      }
+      parentTagName = state.context.tagName;
+      if (!config.contextGrabbers.hasOwnProperty(parentTagName) ||
+          !config.contextGrabbers[parentTagName].hasOwnProperty(nextTagName)) {
+        return;
+      }
+      popContext(state);
+    }
+  }
+
+  function baseState(type, stream, state) {
+    if (type == "openTag") {
+      state.tagStart = stream.column();
+      return tagNameState;
+    } else if (type == "closeTag") {
+      return closeTagNameState;
+    } else {
+      return baseState;
+    }
+  }
+  function tagNameState(type, stream, state) {
+    if (type == "word") {
+      state.tagName = stream.current();
+      setStyle = "tag";
+      return attrState;
+    } else {
+      setStyle = "error";
+      return tagNameState;
+    }
+  }
+  function closeTagNameState(type, stream, state) {
+    if (type == "word") {
+      var tagName = stream.current();
+      if (state.context && state.context.tagName != tagName &&
+          config.implicitlyClosed.hasOwnProperty(state.context.tagName))
+        popContext(state);
+      if ((state.context && state.context.tagName == tagName) || config.matchClosing === false) {
+        setStyle = "tag";
+        return closeState;
+      } else {
+        setStyle = "tag error";
+        return closeStateErr;
+      }
+    } else {
+      setStyle = "error";
+      return closeStateErr;
+    }
+  }
+
+  function closeState(type, _stream, state) {
+    if (type != "endTag") {
+      setStyle = "error";
+      return closeState;
+    }
+    popContext(state);
+    return baseState;
+  }
+  function closeStateErr(type, stream, state) {
+    setStyle = "error";
+    return closeState(type, stream, state);
+  }
+
+  function attrState(type, _stream, state) {
+    if (type == "word") {
+      setStyle = "attribute";
+      return attrEqState;
+    } else if (type == "endTag" || type == "selfcloseTag") {
+      var tagName = state.tagName, tagStart = state.tagStart;
+      state.tagName = state.tagStart = null;
+      if (type == "selfcloseTag" ||
+          config.autoSelfClosers.hasOwnProperty(tagName)) {
+        maybePopContext(state, tagName);
+      } else {
+        maybePopContext(state, tagName);
+        state.context = new Context(state, tagName, tagStart == state.indented);
+      }
+      return baseState;
+    }
+    setStyle = "error";
+    return attrState;
+  }
+  function attrEqState(type, stream, state) {
+    if (type == "equals") return attrValueState;
+    if (!config.allowMissing) setStyle = "error";
+    return attrState(type, stream, state);
+  }
+  function attrValueState(type, stream, state) {
+    if (type == "string") return attrContinuedState;
+    if (type == "word" && config.allowUnquoted) {setStyle = "string"; return attrState;}
+    setStyle = "error";
+    return attrState(type, stream, state);
+  }
+  function attrContinuedState(type, stream, state) {
+    if (type == "string") return attrContinuedState;
+    return attrState(type, stream, state);
+  }
+
+  return {
+    startState: function(baseIndent) {
+      var state = {tokenize: inText,
+                   state: baseState,
+                   indented: baseIndent || 0,
+                   tagName: null, tagStart: null,
+                   context: null}
+      if (baseIndent != null) state.baseIndent = baseIndent
+      return state
+    },
+
+    token: function(stream, state) {
+      if (!state.tagName && stream.sol())
+        state.indented = stream.indentation();
+
+      if (stream.eatSpace()) return null;
+      type = null;
+      var style = state.tokenize(stream, state);
+      if ((style || type) && style != "comment") {
+        setStyle = null;
+        state.state = state.state(type || style, stream, state);
+        if (setStyle)
+          style = setStyle == "error" ? style + " error" : setStyle;
+      }
+      return style;
+    },
+
+    indent: function(state, textAfter, fullLine) {
+      var context = state.context;
+      // Indent multi-line strings (e.g. css).
+      if (state.tokenize.isInAttribute) {
+        if (state.tagStart == state.indented)
+          return state.stringStartCol + 1;
+        else
+          return state.indented + indentUnit;
+      }
+      if (context && context.noIndent) return CodeMirror.Pass;
+      if (state.tokenize != inTag && state.tokenize != inText)
+        return fullLine ? fullLine.match(/^(\s*)/)[0].length : 0;
+      // Indent the starts of attribute names.
+      if (state.tagName) {
+        if (config.multilineTagIndentPastTag !== false)
+          return state.tagStart + state.tagName.length + 2;
+        else
+          return state.tagStart + indentUnit * (config.multilineTagIndentFactor || 1);
+      }
+      if (config.alignCDATA && /<!\[CDATA\[/.test(textAfter)) return 0;
+      var tagAfter = textAfter && /^<(\/)?([\w_:\.-]*)/.exec(textAfter);
+      if (tagAfter && tagAfter[1]) { // Closing tag spotted
+        while (context) {
+          if (context.tagName == tagAfter[2]) {
+            context = context.prev;
+            break;
+          } else if (config.implicitlyClosed.hasOwnProperty(context.tagName)) {
+            context = context.prev;
+          } else {
+            break;
+          }
+        }
+      } else if (tagAfter) { // Opening tag spotted
+        while (context) {
+          var grabbers = config.contextGrabbers[context.tagName];
+          if (grabbers && grabbers.hasOwnProperty(tagAfter[2]))
+            context = context.prev;
+          else
+            break;
+        }
+      }
+      while (context && context.prev && !context.startOfLine)
+        context = context.prev;
+      if (context) return context.indent + indentUnit;
+      else return state.baseIndent || 0;
+    },
+
+    electricInput: /<\/[\s\w:]+>$/,
+    blockCommentStart: "<!--",
+    blockCommentEnd: "-->",
+
+    configuration: config.htmlMode ? "html" : "xml",
+    helperType: config.htmlMode ? "html" : "xml",
+
+    skipAttribute: function(state) {
+      if (state.state == attrValueState)
+        state.state = attrState
+    }
+  };
+});
+
+CodeMirror.defineMIME("text/xml", "xml");
+CodeMirror.defineMIME("application/xml", "xml");
+if (!CodeMirror.mimeModes.hasOwnProperty("text/html"))
+  CodeMirror.defineMIME("text/html", {name: "xml", htmlMode: true});
+
+});
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/resources/static/css/main.css b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/css/main.css
new file mode 100644
index 0000000..80edcc9
--- /dev/null
+++ b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/css/main.css
@@ -0,0 +1,480 @@
+@font-face{font-family:NextIcon;src:url(../console-ui/public/icons/icon-font.eot);src:url(../console-ui/public/icons/icon-font.eot?#iefix) format("embedded-opentype"),url(../console-ui/public/icons/icon-font.woff2) format("woff2"),url(../console-ui/public/icons/icon-font.woff) format("woff"),url(../console-ui/public/icons/icon-font.ttf) format("truetype"),url(../console-ui/public/icons/icon-font.svg#NextIcon) format("svg");font-display:swap}.next-overlay-wrapper .next-overlay-backdrop{background-color:rgba(0,0,0,.2)}.next-loading-fusion-reactor{width:48px;height:48px}.next-loading-fusion-reactor .next-loading-dot{background:#5584ff}.next-loading-medium-fusion-reactor{width:32px;height:32px}.next-message.next-message-success.next-inline{background-color:#e4fdda;border-color:#e4fdda}.next-message.next-message-success.next-addon .next-message-symbol,.next-message.next-message-success.next-inline .next-message-symbol{color:#46bc15}.next-message.next-message-success.next-toast{box-shadow:0 2px 4px 0 rgba(0,0,0,.12)}.next-message.next-message-success.next-toast .next-message-symbol{color:#46bc15}.next-message.next-message-warning.next-inline{background-color:#fff3e0;border-color:#fff3e0}.next-message.next-message-warning.next-addon .next-message-symbol,.next-message.next-message-warning.next-inline .next-message-symbol{color:#ff9300}.next-message.next-message-warning.next-toast{box-shadow:0 2px 4px 0 rgba(0,0,0,.12)}.next-message.next-message-warning.next-toast .next-message-symbol{color:#ff9300}.next-message.next-message-error.next-addon .next-message-symbol,.next-message.next-message-error.next-inline .next-message-symbol{color:#ff3000}.next-message.next-message-error.next-toast{box-shadow:0 2px 4px 0 rgba(0,0,0,.12)}.next-message.next-message-error.next-toast .next-message-symbol{color:#ff3000}.next-message.next-message-notice.next-inline{background-color:#e3f2fd;border-color:#e3f2fd}.next-message.next-message-notice.next-addon .next-message-symbol,.next-message.next-message-notice.next-inline .next-message-symbol{color:#4494f9}.next-message.next-message-notice.next-toast{box-shadow:0 2px 4px 0 rgba(0,0,0,.12)}.next-message.next-message-notice.next-toast .next-message-symbol{color:#4494f9}.next-message.next-message-help.next-inline{background-color:#e3fff8;border-color:#e3fff8}.next-message.next-message-help.next-addon .next-message-symbol,.next-message.next-message-help.next-inline .next-message-symbol{color:#01c1b2}.next-message.next-message-help.next-toast{box-shadow:0 2px 4px 0 rgba(0,0,0,.12)}.next-message.next-message-help.next-toast .next-message-symbol{color:#01c1b2}.next-message.next-message-loading.next-addon .next-message-symbol,.next-message.next-message-loading.next-inline .next-message-symbol{color:#5584ff}.next-message.next-message-loading.next-toast{box-shadow:0 2px 4px 0 rgba(0,0,0,.12)}.next-message.next-message-loading.next-toast .next-message-symbol{color:#5584ff}.next-message.next-large .next-message-content,.next-message.next-medium .next-message-content{font-size:12px}.next-radio-wrapper .next-radio-inner{border:1px solid #c4c6cf}.next-radio-wrapper.checked .next-radio-inner{border-color:#5584ff;background:#5584ff}.next-radio-wrapper.disabled .next-radio-inner{border-color:#e6e7eb;background:#f7f8fa}.next-radio-wrapper.disabled .next-radio-inner.hovered,.next-radio-wrapper.disabled .next-radio-inner:hover{border-color:#e6e7eb}.next-radio-wrapper.disabled.checked .next-radio-inner{border-color:#e6e7eb;background:#f7f8fa}.next-radio-wrapper:not(.disabled).hovered .next-radio-inner,.next-radio-wrapper:not(.disabled):hover .next-radio-inner{border-color:#5584ff;background-color:#dee8ff}.next-radio-wrapper.checked:not(.disabled).hovered .next-radio-inner,.next-radio-wrapper.checked:not(.disabled):hover .next-radio-inner{background:#3e71f7}.next-radio-button>label{border:1px solid #c4c6cf}.next-radio-button>label.hovered,.next-radio-button>label:hover{border-color:#a0a2ad;background-color:#f2f3f7}.next-radio-button>label.checked{border-color:#5584ff}.next-radio-button>label.checked .next-radio-label{color:#5584ff}.next-radio-button>label.disabled{border-color:#e6e7eb;background-color:#f7f8fa}.next-radio-button>label.checked.disabled{border-color:#e6e7eb;background-color:#f2f3f7}.next-radio-button-medium>label{height:28px;line-height:28px}.next-radio-button-medium .next-radio-label{height:26px;line-height:26px;font-size:12px}.next-radio-label{font-size:12px}.next-checkbox-wrapper .next-checkbox-inner{border:1px solid #c4c6cf}.next-checkbox-wrapper .next-checkbox-inner>.next-icon{left:4px}.next-checkbox-wrapper .next-checkbox-inner>.next-icon .next-icon-remote,.next-checkbox-wrapper .next-checkbox-inner>.next-icon:before{width:8px;font-size:8px}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-checkbox-wrapper .next-checkbox-inner>.next-icon{transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-checkbox-wrapper .next-checkbox-inner>.next-icon:before{width:16px;font-size:16px}}.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner{background-color:#5584ff}.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner>.next-icon .next-icon-remote,.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner>.next-icon:before,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner>.next-icon .next-icon-remote,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner>.next-icon:before{width:8px;font-size:8px}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner>.next-icon,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner>.next-icon{transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner>.next-icon:before,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner>.next-icon:before{width:16px;font-size:16px}}.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner{background-color:#5584ff}.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner>.next-icon .next-icon-remote,.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner>.next-icon:before,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner>.next-icon .next-icon-remote,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner>.next-icon:before{width:8px;font-size:8px}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner>.next-icon,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner>.next-icon{transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner>.next-icon:before,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner>.next-icon:before{width:16px;font-size:16px}}.next-checkbox-wrapper.focused>.next-checkbox>.next-checkbox-inner,.next-checkbox-wrapper.hovered>.next-checkbox>.next-checkbox-inner,.next-checkbox-wrapper:not(.disabled):hover>.next-checkbox>.next-checkbox-inner{border-color:#5584ff;background-color:#dee8ff}.next-checkbox-wrapper.checked:not(.disabled).hovered>.next-checkbox .next-checkbox-inner,.next-checkbox-wrapper.checked:not(.disabled):hover>.next-checkbox .next-checkbox-inner,.next-checkbox-wrapper.indeterminate:not(.disabled).hovered>.next-checkbox .next-checkbox-inner,.next-checkbox-wrapper.indeterminate:not(.disabled):hover>.next-checkbox .next-checkbox-inner{background-color:#3e71f7}.next-checkbox-wrapper.disabled.checked .next-checkbox-inner,.next-checkbox-wrapper.disabled.indeterminate .next-checkbox-inner,.next-checkbox-wrapper.disabled .next-checkbox-inner{border-color:#e6e7eb;background:#f7f8fa}.next-checkbox-wrapper.disabled.checked .next-checkbox-inner.hovered,.next-checkbox-wrapper.disabled.checked .next-checkbox-inner:hover,.next-checkbox-wrapper.disabled.indeterminate .next-checkbox-inner.hovered,.next-checkbox-wrapper.disabled.indeterminate .next-checkbox-inner:hover{border-color:#e6e7eb}.next-checkbox-wrapper.disabled.checked.focused .next-checkbox-inner{border-color:#e6e7eb;background:#f7f8fa}.next-checkbox-label{font-size:12px}.next-menu[dir=rtl] .next-menu-icon-selected.next-icon{margin-right:-16px}.next-menu[dir=rtl] .next-menu-icon-selected.next-icon .next-icon-remote,.next-menu[dir=rtl] .next-menu-icon-selected.next-icon:before{width:12px;font-size:12px}.next-menu{border:1px solid #dcdee3}.next-menu,.next-menu-item-helper{font-size:12px}.next-menu-item.next-selected .next-menu-icon-selected{color:#5584ff}.next-menu-item:not(.next-disabled).next-focused,.next-menu-item:not(.next-disabled).next-selected.next-focused,.next-menu-item:not(.next-disabled).next-selected.next-focused:hover,.next-menu-item:not(.next-disabled).next-selected:focus,.next-menu-item:not(.next-disabled).next-selected:focus:hover,.next-menu-item:not(.next-disabled).next-selected:hover,.next-menu-item:not(.next-disabled):hover{background-color:#f2f3f7}.next-menu-item:not(.next-disabled).next-focused .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected.next-focused .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected.next-focused:hover .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected:focus .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected:focus:hover .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected:hover .next-menu-icon-selected,.next-menu-item:not(.next-disabled):hover .next-menu-icon-selected{color:#5584ff}.next-menu-item-inner{font-size:12px}.next-menu-divider{border-bottom:1px solid #e6e7eb}.next-menu .next-menu-icon-selected.next-icon .next-icon-remote,.next-menu .next-menu-icon-selected.next-icon:before{width:12px;font-size:12px}.next-menu .next-menu-icon-arrow.next-icon .next-icon-remote,.next-menu .next-menu-icon-arrow.next-icon:before{width:8px;font-size:8px}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-menu .next-menu-icon-arrow.next-icon{transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-menu .next-menu-icon-arrow.next-icon:before{width:16px;font-size:16px}}.next-menu .next-menu-icon-arrow-down.next-open .next-icon-remote,.next-menu .next-menu-icon-arrow-down.next-open:before{width:8px;font-size:8px}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-menu .next-menu-icon-arrow-down.next-open{transform:scale(.5) rotate(180deg);margin-left:-4px;margin-right:-4px}.next-menu .next-menu-icon-arrow-down.next-open:before{width:16px;font-size:16px}}.next-menu .next-menu-icon-arrow-right.next-open .next-icon-remote,.next-menu .next-menu-icon-arrow-right.next-open:before{width:8px;font-size:8px}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-menu .next-menu-icon-arrow-right.next-open{transform:scale(.5) rotate(-90deg);margin-left:-4px;margin-right:-4px}.next-menu .next-menu-icon-arrow-right.next-open:before{width:16px;font-size:16px}}.next-btn.next-small{padding:0 8px;height:20px}.next-btn.next-small.next-btn-loading:before{left:8px}.next-btn.next-medium{padding:0 12px;height:28px;font-size:12px}.next-btn.next-medium>.next-btn-icon.next-icon-alone .next-icon-remote,.next-btn.next-medium>.next-btn-icon.next-icon-alone:before,.next-btn.next-medium>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn.next-medium>.next-btn-icon.next-icon-first:before,.next-btn.next-medium>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn.next-medium>.next-btn-icon.next-icon-last:before{width:12px;font-size:12px}.next-btn.next-medium.next-btn-loading:before{width:12px;height:12px;font-size:12px;line-height:12px;left:12px}.next-btn.next-medium>.next-btn-custom-loading-icon.show{width:12px}.next-btn.next-large{padding:0 16px}.next-btn.next-large>.next-btn-icon.next-icon-alone .next-icon-remote,.next-btn.next-large>.next-btn-icon.next-icon-alone:before,.next-btn.next-large>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn.next-large>.next-btn-icon.next-icon-first:before,.next-btn.next-large>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn.next-large>.next-btn-icon.next-icon-last:before{width:16px;font-size:16px}.next-btn.next-large.next-btn-loading:before{width:16px;height:16px;font-size:16px;line-height:16px;left:16px}.next-btn.next-large>.next-btn-custom-loading-icon.show{width:16px}.next-btn.next-btn-normal{border-color:#c4c6cf}.next-btn.next-btn-normal.active,.next-btn.next-btn-normal.hover,.next-btn.next-btn-normal:active,.next-btn.next-btn-normal:focus,.next-btn.next-btn-normal:hover{background:#f2f3f7;border-color:#a0a2ad}.next-btn.next-btn-primary{background:#5584ff}.next-btn.next-btn-primary.active,.next-btn.next-btn-primary.hover,.next-btn.next-btn-primary:active,.next-btn.next-btn-primary:focus,.next-btn.next-btn-primary:hover{background:#3e71f7}.next-btn.next-btn-secondary{border-color:#5584ff}.next-btn.next-btn-secondary,.next-btn.next-btn-secondary.visited,.next-btn.next-btn-secondary:link,.next-btn.next-btn-secondary:visited{color:#5584ff}.next-btn.next-btn-secondary.active,.next-btn.next-btn-secondary.hover,.next-btn.next-btn-secondary:active,.next-btn.next-btn-secondary:focus,.next-btn.next-btn-secondary:hover{background:#3e71f7;border-color:#3e71f7}.next-btn.disabled.next-btn-normal,.next-btn.disabled.next-btn-normal.active,.next-btn.disabled.next-btn-normal.hover,.next-btn.disabled.next-btn-normal:active,.next-btn.disabled.next-btn-normal:focus,.next-btn.disabled.next-btn-normal:hover,.next-btn.disabled.next-btn-primary,.next-btn.disabled.next-btn-primary.active,.next-btn.disabled.next-btn-primary.hover,.next-btn.disabled.next-btn-primary:active,.next-btn.disabled.next-btn-primary:focus,.next-btn.disabled.next-btn-primary:hover,.next-btn.disabled.next-btn-secondary,.next-btn.disabled.next-btn-secondary.active,.next-btn.disabled.next-btn-secondary.hover,.next-btn.disabled.next-btn-secondary:active,.next-btn.disabled.next-btn-secondary:focus,.next-btn.disabled.next-btn-secondary:hover,.next-btn[disabled].next-btn-normal,.next-btn[disabled].next-btn-normal.active,.next-btn[disabled].next-btn-normal.hover,.next-btn[disabled].next-btn-normal:active,.next-btn[disabled].next-btn-normal:focus,.next-btn[disabled].next-btn-normal:hover,.next-btn[disabled].next-btn-primary,.next-btn[disabled].next-btn-primary.active,.next-btn[disabled].next-btn-primary.hover,.next-btn[disabled].next-btn-primary:active,.next-btn[disabled].next-btn-primary:focus,.next-btn[disabled].next-btn-primary:hover,.next-btn[disabled].next-btn-secondary,.next-btn[disabled].next-btn-secondary.active,.next-btn[disabled].next-btn-secondary.hover,.next-btn[disabled].next-btn-secondary:active,.next-btn[disabled].next-btn-secondary:focus,.next-btn[disabled].next-btn-secondary:hover{background:#f7f8fa;border-color:#e6e7eb}.next-btn-warning.next-btn-primary{background:#ff3000;border-color:#ff3000}.next-btn-warning.next-btn-primary.active,.next-btn-warning.next-btn-primary.hover,.next-btn-warning.next-btn-primary:active,.next-btn-warning.next-btn-primary:focus,.next-btn-warning.next-btn-primary:hover{background:#e72b00;border-color:#e72b00}.next-btn-warning.next-btn-primary.disabled,.next-btn-warning.next-btn-primary.disabled.active,.next-btn-warning.next-btn-primary.disabled.hover,.next-btn-warning.next-btn-primary.disabled:active,.next-btn-warning.next-btn-primary.disabled:focus,.next-btn-warning.next-btn-primary.disabled:hover,.next-btn-warning.next-btn-primary[disabled],.next-btn-warning.next-btn-primary[disabled].active,.next-btn-warning.next-btn-primary[disabled].hover,.next-btn-warning.next-btn-primary[disabled]:active,.next-btn-warning.next-btn-primary[disabled]:focus,.next-btn-warning.next-btn-primary[disabled]:hover{background:#f7f8fa;border-color:#dcdee3}.next-btn-warning.next-btn-normal{border-color:#ff3000}.next-btn-warning.next-btn-normal,.next-btn-warning.next-btn-normal.visited,.next-btn-warning.next-btn-normal:link,.next-btn-warning.next-btn-normal:visited{color:#ff3000}.next-btn-warning.next-btn-normal.active,.next-btn-warning.next-btn-normal.hover,.next-btn-warning.next-btn-normal:active,.next-btn-warning.next-btn-normal:focus,.next-btn-warning.next-btn-normal:hover{background:#e72b00;border-color:#e72b00}.next-btn-warning.next-btn-normal.disabled,.next-btn-warning.next-btn-normal.disabled.active,.next-btn-warning.next-btn-normal.disabled.hover,.next-btn-warning.next-btn-normal.disabled:active,.next-btn-warning.next-btn-normal.disabled:focus,.next-btn-warning.next-btn-normal.disabled:hover,.next-btn-warning.next-btn-normal[disabled],.next-btn-warning.next-btn-normal[disabled].active,.next-btn-warning.next-btn-normal[disabled].hover,.next-btn-warning.next-btn-normal[disabled]:active,.next-btn-warning.next-btn-normal[disabled]:focus,.next-btn-warning.next-btn-normal[disabled]:hover{background:#f7f8fa;border-color:#e6e7eb}.next-btn-text.next-btn-primary,.next-btn-text.next-btn-primary.visited,.next-btn-text.next-btn-primary:link,.next-btn-text.next-btn-primary:visited{color:#5584ff}.next-btn-text.next-btn-primary.active,.next-btn-text.next-btn-primary.hover,.next-btn-text.next-btn-primary:active,.next-btn-text.next-btn-primary:focus,.next-btn-text.next-btn-primary:hover{color:#3e71f7}.next-btn-text.next-btn-normal.active,.next-btn-text.next-btn-normal.hover,.next-btn-text.next-btn-normal:active,.next-btn-text.next-btn-normal:focus,.next-btn-text.next-btn-normal:hover,.next-btn-text.next-btn-secondary.active,.next-btn-text.next-btn-secondary.hover,.next-btn-text.next-btn-secondary:active,.next-btn-text.next-btn-secondary:focus,.next-btn-text.next-btn-secondary:hover{color:#5584ff}.next-btn-text.next-large>.next-btn-icon.next-icon-alone .next-icon-remote,.next-btn-text.next-large>.next-btn-icon.next-icon-alone:before,.next-btn-text.next-large>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn-text.next-large>.next-btn-icon.next-icon-first:before,.next-btn-text.next-large>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn-text.next-large>.next-btn-icon.next-icon-last:before{width:16px;font-size:16px}.next-btn-text.next-large.next-btn-loading:before{width:16px;height:16px;font-size:16px;line-height:16px}.next-btn-text.next-large>.next-btn-custom-loading-icon.show{width:16px}.next-btn-text.next-medium{font-size:12px}.next-btn-text.next-medium>.next-btn-icon.next-icon-alone .next-icon-remote,.next-btn-text.next-medium>.next-btn-icon.next-icon-alone:before,.next-btn-text.next-medium>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn-text.next-medium>.next-btn-icon.next-icon-first:before,.next-btn-text.next-medium>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn-text.next-medium>.next-btn-icon.next-icon-last:before{width:12px;font-size:12px}.next-btn-text.next-medium.next-btn-loading:before{width:12px;height:12px;font-size:12px;line-height:12px}.next-btn-text.next-medium>.next-btn-custom-loading-icon.show{width:12px}.next-btn-group>.next-btn-primary:not(:first-child).disabled,.next-btn-group>.next-btn-primary:not(:first-child)[disabled]{border-left-color:#e6e7eb}.next-btn-group[dir=rtl]>.next-btn-primary:not(:first-child).disabled,.next-btn-group[dir=rtl]>.next-btn-primary:not(:first-child)[disabled]{border-right-color:#e6e7eb}.next-btn.next-small[dir=rtl].next-btn-loading{padding-left:8px;padding-right:24px}.next-btn.next-small[dir=rtl].next-btn-loading:after{right:8px}.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-first:before,.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-last:before{width:12px;font-size:12px}.next-btn.next-medium[dir=rtl].next-btn-loading{padding-left:12px;padding-right:28px}.next-btn.next-medium[dir=rtl].next-btn-loading:after{right:12px}.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-first:before,.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-last:before{width:16px;font-size:16px}.next-btn.next-large[dir=rtl].next-btn-loading{padding-left:16px;padding-right:36px}.next-btn.next-large[dir=rtl].next-btn-loading:after{right:16px}.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-first:before,.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-last:before{width:16px;font-size:16px}.next-btn-text[dir=rtl].next-large.next-btn-loading{padding-right:20px}.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-first:before,.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-last:before{width:12px;font-size:12px}.next-btn-text[dir=rtl].next-medium.next-btn-loading{padding-right:16px}.next-dialog{border:1px solid #dcdee3;border-radius:3px;box-shadow:0 2px 4px 0 rgba(0,0,0,.12)}.next-dialog-body{font-size:12px}.next-dialog-close .next-dialog-close-icon.next-icon{margin-top:-6px;margin-left:-6px;width:12px;height:12px}.next-dialog-close .next-dialog-close-icon.next-icon:before{width:12px;height:12px;font-size:12px}.next-input{border:1px solid #c4c6cf}.next-input.next-small{height:20px}.next-input.next-small input{height:18px;line-height:18px \0 }.next-input.next-small .next-input-text-field{height:18px;line-height:18px}.next-input.next-small .next-icon .next-icon-remote,.next-input.next-small .next-icon:before{width:12px;font-size:12px}.next-input.next-medium{height:28px}.next-input.next-medium .next-input-inner,.next-input.next-medium .next-input-label{font-size:12px}.next-input.next-medium input{height:26px;line-height:26px \0 ;font-size:12px}.next-input.next-medium input::placeholder{font-size:12px}.next-input.next-medium .next-input-text-field{font-size:12px;height:26px;line-height:26px}.next-input.next-medium .next-icon .next-icon-remote,.next-input.next-medium .next-icon:before{width:12px;font-size:12px}.next-input.next-large .next-icon .next-icon-remote,.next-input.next-large .next-icon:before{width:16px;font-size:16px}.next-input.next-input-textarea.next-small textarea,.next-input.next-input-textarea textarea{font-size:12px}.next-input.next-focus,.next-input:hover{border-color:#a0a2ad}.next-input.next-focus{border-color:#5584ff;box-shadow:0 0 0 2px rgba(85,132,255,.2)}.next-input.next-warning,.next-input.next-warning.next-focus,.next-input.next-warning:hover{border-color:#ff9300}.next-input.next-warning.next-focus{box-shadow:0 0 0 2px rgba(255,147,0,.2)}.next-input.next-error,.next-input.next-error.next-focus,.next-input.next-error:hover{border-color:#ff3000}.next-input.next-error.next-focus{box-shadow:0 0 0 2px rgba(255,48,0,.2)}.next-input-control .next-input-len.next-error{color:#ff3000}.next-input-control .next-input-len.next-warning,.next-input-control .next-input-warning-icon{color:#ff9300}.next-input-control .next-input-success-icon{color:#46bc15}.next-input-control .next-input-loading-icon{color:#4494f9}.next-input input::-moz-placeholder,.next-input textarea::-moz-placeholder{color:#999}.next-input input:-ms-input-placeholder,.next-input textarea:-ms-input-placeholder{color:#999}.next-input input::-webkit-input-placeholder,.next-input textarea::-webkit-input-placeholder{color:#999}.next-input.next-disabled,.next-input.next-disabled:hover{border-color:#e6e7eb;background-color:#f7f8fa}.next-input-group-text{background-color:#f2f3f7;border:1px solid #c4c6cf}.next-input-group-text.next-disabled,.next-input-group-text.next-disabled:hover{border-color:#e6e7eb;background-color:#f7f8fa}.next-form-preview.next-form-item.next-medium .next-form-item-label,.next-input-group-text.next-medium{font-size:12px}.next-form-responsive-grid.next-small .next-form-item.next-left .next-form-item-label{margin-top:4px;margin-bottom:4px}.next-form-responsive-grid.next-medium .next-form-item.next-left .next-form-item-label{margin-top:8px;margin-bottom:8px}.next-form-item.has-error>.next-form-item-control>.next-form-item-help{color:#ff3000}.next-form-item.has-warning>.next-form-item-control>.next-form-item-help{color:#ff9300}.next-form-item .next-form-item-label,.next-form-item .next-form-text-align,.next-form-item p{line-height:28px}.next-form-item .next-checkbox-group,.next-form-item .next-checkbox-wrapper,.next-form-item .next-radio-group,.next-form-item .next-radio-wrapper,.next-form-item .next-rating{line-height:24px}.next-form-item .next-form-preview{font-size:12px}.next-form-item .next-form-preview.next-input-textarea>p{font-size:12px;min-height:16.8px;margin-top:5.6px}.next-form-item .next-form-item-label{font-size:12px}.next-form-item.next-small .next-checkbox-group,.next-form-item.next-small .next-checkbox-wrapper,.next-form-item.next-small .next-form-item-label,.next-form-item.next-small .next-form-text-align,.next-form-item.next-small .next-radio-group,.next-form-item.next-small .next-radio-wrapper,.next-form-item.next-small .next-rating,.next-form-item.next-small p{line-height:20px}.next-form-item-label.next-left>label[required]:after,.next-form-item-label label[required]:before{color:#ff3000}
+/*!
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *//*!
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */.filter-panel{text-align:right;padding:10px 0}.users-pagination{float:right;margin-top:20px}
+/*!
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */.header-container-primary{background:#252a2f}.header-container-normal{background-color:#fff;box-shadow:0 2px 10px 0 rgba(0,0,0,.08)}.header-container .header-body{width:100%;margin:0 auto;height:66px;line-height:66px}.header-container .header-body .logo{margin-left:40px;width:96px;vertical-align:sub}.header-container .header-body .header-menu{float:right}.header-container .header-body .header-menu .header-menu-toggle{display:none;width:19px;margin-right:40px;margin-top:18px;cursor:pointer}.header-container .header-body ul{padding:0;margin:0}.header-container .header-body li{display:inline-block;margin-right:40px}.header-container .header-body .menu-item{font-family:Avenir-Heavy;font-size:14px}.header-container .header-body .menu-item-primary a{color:#fff;opacity:.6;font-family:Avenir-Medium}.header-container .header-body .menu-item-primary-active a,.header-container .header-body .menu-item-primary:hover a{opacity:1}.header-container .header-body .menu-item-normal a{color:#333;opacity:.6;font-family:Avenir-Medium}.header-container .header-body .menu-item-normal-active a,.header-container .header-body .menu-item-normal:hover a{opacity:1}.header-container .header-body .language-switch{float:right;display:inline-block;box-sizing:border-box;width:24px;height:24px;line-height:20px;margin-top:21px;margin-right:40px;text-align:center;border-radius:2px;cursor:pointer;font-family:PingFangSC-Medium;font-size:14px;opacity:.6}.header-container .header-body .logout{float:right;color:#fff;opacity:.6;font-family:Avenir-Medium;margin-right:40px}.header-container .header-body .language-switch:hover{opacity:1}.header-container .header-body .language-switch-primary{border:1px solid #fff;color:#fff}.header-container .header-body .language-switch-normal{border:1px solid #333;color:#333}@media screen and (max-width:640px){.header-container .header-body .logo{margin-left:20px}.header-container .header-body .language-switch{margin-right:20px}.header-container .header-body .header-menu ul{display:none}.header-container .header-body .header-menu .header-menu-toggle{display:inline-block;margin-right:20px}.header-container .header-body .header-menu-open ul{background-color:#f8f8f8;display:inline-block;position:absolute;right:0;top:66px;z-index:100}.header-container .header-body .header-menu-open li{width:200px;display:list-item;padding-left:30px;list-style:none;line-height:40px;margin-right:0}.header-container .header-body .header-menu-open li a{color:#333;display:inline-block;width:100%}.header-container .header-body .header-menu-open li:hover{background:#2e3034}.header-container .header-body .header-menu-open li:hover a{color:#fff;opactiy:1}.header-container .header-body .header-menu-open .menu-item-normal-active,.header-container .header-body .header-menu-open .menu-item-primary-active{background:#2e3034}.header-container .header-body .header-menu-open .menu-item-normal-active a,.header-container .header-body .header-menu-open .menu-item-primary-active a{color:#fff;opactiy:1}}.bone{width:24px;height:2px;position:relative}.bone:before{left:0}.bone:after,.bone:before{position:absolute;content:"";width:6px;height:6px;border-radius:50%;top:-2px}.bone:after{right:0}.bone-dark,.bone-dark:after,.bone-dark:before{background-color:#1161f6}.bone-light,.bone-light:after,.bone-light:before{background-color:#fff;opacity:.8}.footer-container{background:#f8f8f8}.footer-container .footer-body{max-width:1280px;margin:0 auto;padding:40px 40px 0}@media screen and (max-width:640px){.footer-container .footer-body{padding-left:20px;padding-right:20px}}.footer-container .footer-body img{display:block;width:125px;height:26px;margin-bottom:40px}.footer-container .footer-body .cols-container .col{display:inline-block;box-sizing:border-box;vertical-align:top}.footer-container .footer-body .cols-container .col-12{width:50%;padding-right:125px}.footer-container .footer-body .cols-container .col-6{width:25%}.footer-container .footer-body .cols-container h3{font-family:Avenir-Heavy;font-size:18px;color:#333;line-height:18px;margin-bottom:20px}.footer-container .footer-body .cols-container p{font-family:Avenir-Medium;font-size:12px;color:#999;line-height:18px}.footer-container .footer-body .cols-container dl{font-family:Avenir-Heavy;line-height:18px}.footer-container .footer-body .cols-container dt{font-weight:700;font-size:18px;color:#333;margin-bottom:20px}.footer-container .footer-body .cols-container dd{padding:0;margin:0}.footer-container .footer-body .cols-container dd a{text-decoration:none;display:block;font-size:14px;color:#999;margin:10px 0}.footer-container .footer-body .cols-container dd a:hover{color:#2e3034}.footer-container .footer-body .copyright{margin-top:44px;border-top:1px solid #ccc;min-height:60px;line-height:20px;text-align:center;font-family:Avenir-Medium;font-size:12px;color:#999;display:flex;align-items:center}.footer-container .footer-body .copyright span{display:inline-block;margin:0 auto}@media screen and (max-width:640px){.footer-container .footer-body .cols-container .col{width:100%;text-align:center;padding:0}}.button{box-sizing:border-box;display:inline-block;height:48px;line-height:48px;min-width:140px;font-family:Avenir-Heavy;font-size:16px;color:#fff;text-align:center;border-radius:4px;text-decoration:none}.button-primary{background:#4190ff}.button-normal{background:transparent;border:1px solid #fff}@font-face{font-family:octicons-link;src:url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAZwABAAAAAACFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEU0lHAAAGaAAAAAgAAAAIAAAAAUdTVUIAAAZcAAAACgAAAAoAAQAAT1MvMgAAAyQAAABJAAAAYFYEU3RjbWFwAAADcAAAAEUAAACAAJThvmN2dCAAAATkAAAABAAAAAQAAAAAZnBnbQAAA7gAAACyAAABCUM+8IhnYXNwAAAGTAAAABAAAAAQABoAI2dseWYAAAFsAAABPAAAAZwcEq9taGVhZAAAAsgAAAA0AAAANgh4a91oaGVhAAADCAAAABoAAAAkCA8DRGhtdHgAAAL8AAAADAAAAAwGAACfbG9jYQAAAsAAAAAIAAAACABiATBtYXhwAAACqAAAABgAAAAgAA8ASm5hbWUAAAToAAABQgAAAlXu73sOcG9zdAAABiwAAAAeAAAAME3QpOBwcmVwAAAEbAAAAHYAAAB/aFGpk3jaTY6xa8JAGMW/O62BDi0tJLYQincXEypYIiGJjSgHniQ6umTsUEyLm5BV6NDBP8Tpts6F0v+k/0an2i+itHDw3v2+9+DBKTzsJNnWJNTgHEy4BgG3EMI9DCEDOGEXzDADU5hBKMIgNPZqoD3SilVaXZCER3/I7AtxEJLtzzuZfI+VVkprxTlXShWKb3TBecG11rwoNlmmn1P2WYcJczl32etSpKnziC7lQyWe1smVPy/Lt7Kc+0vWY/gAgIIEqAN9we0pwKXreiMasxvabDQMM4riO+qxM2ogwDGOZTXxwxDiycQIcoYFBLj5K3EIaSctAq2kTYiw+ymhce7vwM9jSqO8JyVd5RH9gyTt2+J/yUmYlIR0s04n6+7Vm1ozezUeLEaUjhaDSuXHwVRgvLJn1tQ7xiuVv/ocTRF42mNgZGBgYGbwZOBiAAFGJBIMAAizAFoAAABiAGIAznjaY2BkYGAA4in8zwXi+W2+MjCzMIDApSwvXzC97Z4Ig8N/BxYGZgcgl52BCSQKAA3jCV8CAABfAAAAAAQAAEB42mNgZGBg4f3vACQZQABIMjKgAmYAKEgBXgAAeNpjYGY6wTiBgZWBg2kmUxoDA4MPhGZMYzBi1AHygVLYQUCaawqDA4PChxhmh/8ODDEsvAwHgMKMIDnGL0x7gJQCAwMAJd4MFwAAAHjaY2BgYGaA4DAGRgYQkAHyGMF8NgYrIM3JIAGVYYDT+AEjAwuDFpBmA9KMDEwMCh9i/v8H8sH0/4dQc1iAmAkALaUKLgAAAHjaTY9LDsIgEIbtgqHUPpDi3gPoBVyRTmTddOmqTXThEXqrob2gQ1FjwpDvfwCBdmdXC5AVKFu3e5MfNFJ29KTQT48Ob9/lqYwOGZxeUelN2U2R6+cArgtCJpauW7UQBqnFkUsjAY/kOU1cP+DAgvxwn1chZDwUbd6CFimGXwzwF6tPbFIcjEl+vvmM/byA48e6tWrKArm4ZJlCbdsrxksL1AwWn/yBSJKpYbq8AXaaTb8AAHja28jAwOC00ZrBeQNDQOWO//sdBBgYGRiYWYAEELEwMTE4uzo5Zzo5b2BxdnFOcALxNjA6b2ByTswC8jYwg0VlNuoCTWAMqNzMzsoK1rEhNqByEyerg5PMJlYuVueETKcd/89uBpnpvIEVomeHLoMsAAe1Id4AAAAAAAB42oWQT07CQBTGv0JBhagk7HQzKxca2sJCE1hDt4QF+9JOS0nbaaYDCQfwCJ7Au3AHj+LO13FMmm6cl7785vven0kBjHCBhfpYuNa5Ph1c0e2Xu3jEvWG7UdPDLZ4N92nOm+EBXuAbHmIMSRMs+4aUEd4Nd3CHD8NdvOLTsA2GL8M9PODbcL+hD7C1xoaHeLJSEao0FEW14ckxC+TU8TxvsY6X0eLPmRhry2WVioLpkrbp84LLQPGI7c6sOiUzpWIWS5GzlSgUzzLBSikOPFTOXqly7rqx0Z1Q5BAIoZBSFihQYQOOBEdkCOgXTOHA07HAGjGWiIjaPZNW13/+lm6S9FT7rLHFJ6fQbkATOG1j2OFMucKJJsxIVfQORl+9Jyda6Sl1dUYhSCm1dyClfoeDve4qMYdLEbfqHf3O/AdDumsjAAB42mNgYoAAZQYjBmyAGYQZmdhL8zLdDEydARfoAqIAAAABAAMABwAKABMAB///AA8AAQAAAAAAAAAAAAAAAAABAAAAAA==) format("woff")}.markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;color:#24292e;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:16px;line-height:1.5;word-wrap:break-word}.markdown-body .pl-c{color:#6a737d}.markdown-body .pl-c1,.markdown-body .pl-s .pl-v{color:#005cc5}.markdown-body .pl-e,.markdown-body .pl-en{color:#6f42c1}.markdown-body .pl-s .pl-s1,.markdown-body .pl-smi{color:#24292e}.markdown-body .pl-ent{color:#22863a}.markdown-body .pl-k{color:#d73a49}.markdown-body .pl-pds,.markdown-body .pl-s,.markdown-body .pl-s .pl-pse .pl-s1,.markdown-body .pl-sr,.markdown-body .pl-sr .pl-cce,.markdown-body .pl-sr .pl-sra,.markdown-body .pl-sr .pl-sre{color:#032f62}.markdown-body .pl-smw,.markdown-body .pl-v{color:#e36209}.markdown-body .pl-bu{color:#b31d28}.markdown-body .pl-ii{color:#fafbfc;background-color:#b31d28}.markdown-body .pl-c2{color:#fafbfc;background-color:#d73a49}.markdown-body .pl-c2:before{content:"^M"}.markdown-body .pl-sr .pl-cce{font-weight:700;color:#22863a}.markdown-body .pl-ml{color:#735c0f}.markdown-body .pl-mh,.markdown-body .pl-mh .pl-en,.markdown-body .pl-ms{font-weight:700;color:#005cc5}.markdown-body .pl-mi{font-style:italic;color:#24292e}.markdown-body .pl-mb{font-weight:700;color:#24292e}.markdown-body .pl-md{color:#b31d28;background-color:#ffeef0}.markdown-body .pl-mi1{color:#22863a;background-color:#f0fff4}.markdown-body .pl-mc{color:#e36209;background-color:#ffebda}.markdown-body .pl-mi2{color:#f6f8fa;background-color:#005cc5}.markdown-body .pl-mdr{font-weight:700;color:#6f42c1}.markdown-body .pl-ba{color:#586069}.markdown-body .pl-sg{color:#959da5}.markdown-body .pl-corl{text-decoration:underline;color:#032f62}.markdown-body .octicon{display:inline-block;vertical-align:text-top;fill:currentColor}.markdown-body a{background-color:transparent}.markdown-body a:active,.markdown-body a:hover{outline-width:0}.markdown-body strong{font-weight:inherit;font-weight:bolder}.markdown-body h1{margin:.67em 0}.markdown-body img{border-style:none}.markdown-body code,.markdown-body kbd,.markdown-body pre{font-family:monospace,monospace;font-size:1em}.markdown-body hr{box-sizing:content-box;overflow:visible}.markdown-body input{font:inherit;margin:0;overflow:visible}.markdown-body [type=checkbox]{box-sizing:border-box;padding:0}.markdown-body *{box-sizing:border-box}.markdown-body input{font-family:inherit;font-size:inherit;line-height:inherit}.markdown-body a{color:#0366d6;text-decoration:none}.markdown-body a:hover{color:#0366d6;text-decoration:underline}.markdown-body strong{font-weight:600}.markdown-body hr{height:0;margin:15px 0;overflow:hidden;background:transparent;border-bottom:1px solid #dfe2e5}.markdown-body hr:after,.markdown-body hr:before{display:table;content:""}.markdown-body hr:after{clear:both}.markdown-body table{border-spacing:0;border-collapse:collapse}.markdown-body td,.markdown-body th{padding:0}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-top:0;margin-bottom:0}.markdown-body h1{font-size:32px;font-weight:600}.markdown-body h2{font-size:24px;font-weight:600}.markdown-body h3{font-size:20px;font-weight:600}.markdown-body h4{font-size:16px;font-weight:600}.markdown-body h5{font-size:14px;font-weight:600}.markdown-body h6{font-size:12px;font-weight:600}.markdown-body p{margin-top:0;margin-bottom:10px}.markdown-body blockquote{margin:0}.markdown-body ol,.markdown-body ul{padding-left:0;margin-top:0;margin-bottom:0}.markdown-body ol ol,.markdown-body ul ol{list-style-type:lower-roman}.markdown-body ol ol ol,.markdown-body ol ul ol,.markdown-body ul ol ol,.markdown-body ul ul ol{list-style-type:lower-alpha}.markdown-body dd{margin-left:0}.markdown-body code,.markdown-body pre{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:12px}.markdown-body pre{margin-top:0;margin-bottom:0}.markdown-body .octicon{vertical-align:text-bottom}.markdown-body .pl-0{padding-left:0!important}.markdown-body .pl-1{padding-left:4px!important}.markdown-body .pl-2{padding-left:8px!important}.markdown-body .pl-3{padding-left:16px!important}.markdown-body .pl-4{padding-left:24px!important}.markdown-body .pl-5{padding-left:32px!important}.markdown-body .pl-6{padding-left:40px!important}.markdown-body:after,.markdown-body:before{display:table;content:""}.markdown-body:after{clear:both}.markdown-body>:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body .anchor{float:left;padding-right:4px;margin-left:-20px;line-height:1}.markdown-body .anchor:focus{outline:none}.markdown-body blockquote,.markdown-body dl,.markdown-body ol,.markdown-body p,.markdown-body pre,.markdown-body table,.markdown-body ul{margin-top:0;margin-bottom:16px}.markdown-body hr{height:.25em;padding:0;margin:24px 0;background-color:#e1e4e8;border:0}.markdown-body blockquote{padding:0 1em;color:#6a737d;border-left:.25em solid #dfe2e5}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body kbd{font-size:11px;border:1px solid #c6cbd1;border-bottom-color:#959da5;box-shadow:inset 0 -1px 0 #959da5}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-top:24px;margin-bottom:16px;font-weight:600;line-height:1.25}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:#1b1f23;vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body h1{font-size:2em}.markdown-body h1,.markdown-body h2{padding-bottom:.3em;border-bottom:1px solid #eaecef}.markdown-body h2{font-size:1.5em}.markdown-body h3{font-size:1.25em}.markdown-body h4{font-size:1em}.markdown-body h5{font-size:.875em}.markdown-body h6{font-size:.85em;color:#6a737d}.markdown-body ol,.markdown-body ul{padding-left:2em}.markdown-body ol ol,.markdown-body ol ul,.markdown-body ul ol,.markdown-body ul ul{margin-top:0;margin-bottom:0}.markdown-body li{word-wrap:break-all}.markdown-body li>p{margin-top:16px}.markdown-body li+li{margin-top:.25em}.markdown-body dl{padding:0}.markdown-body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:600}.markdown-body dl dd{padding:0 16px;margin-bottom:16px}.markdown-body table{display:block;width:100%;overflow:auto}.markdown-body table th{font-weight:600}.markdown-body table td,.markdown-body table th{padding:6px 13px;border:1px solid #dfe2e5}.markdown-body table tr{background-color:#fff;border-top:1px solid #c6cbd1}.markdown-body table tr:nth-child(2n){background-color:#f6f8fa}.markdown-body img{max-width:100%;box-sizing:content-box;background-color:#fff}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body code{padding:.2em .4em;margin:0;font-size:85%;background-color:rgba(27,31,35,.05);border-radius:3px}.markdown-body pre{word-wrap:normal}.markdown-body pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:transparent;border:0}.markdown-body .highlight{margin-bottom:16px}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body .highlight pre,.markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f6f8fa;border-radius:3px}.markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown-body .full-commit .btn-outline:not(:disabled):hover{color:#005cc5;border-color:#005cc5}.markdown-body kbd{display:inline-block;padding:3px 5px;font:11px SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;line-height:10px;color:#444d56;vertical-align:middle;background-color:#fafbfc;border:1px solid #d1d5da;border-bottom-color:#c6cbd1;border-radius:3px;box-shadow:inset 0 -1px 0 #c6cbd1}.markdown-body :checked+.radio-label{position:relative;z-index:1;border-color:#0366d6}.markdown-body .task-list-item{list-style-type:none}.markdown-body .task-list-item+.task-list-item{margin-top:3px}.markdown-body .task-list-item input{margin:0 .2em .25em -1.6em;vertical-align:middle}.markdown-body hr{border-bottom-color:#eee}.markdown-body pre code{display:block;overflow-x:auto;padding:.5em;background:#1e1e1e;color:#dcdcdc}.hljs-keyword,.hljs-link,.hljs-literal,.hljs-name,.hljs-symbol{color:#569cd6}.hljs-link{text-decoration:underline}.hljs-built_in,.hljs-type{color:#4ec9b0}.hljs-class,.hljs-number{color:#b8d7a3}.hljs-meta-string,.hljs-string{color:#d69d85}.hljs-regexp,.hljs-template-tag{color:#9a5334}.hljs-formula,.hljs-function,.hljs-params,.hljs-subst,.hljs-title{color:#dcdcdc}.hljs-comment,.hljs-quote{color:#57a64a;font-style:italic}.hljs-doctag{color:#608b4e}.hljs-meta,.hljs-meta-keyword,.hljs-tag{color:#9b9b9b}.hljs-template-variable,.hljs-variable{color:#bd63c5}.hljs-attr,.hljs-attribute,.hljs-builtin-name{color:#9cdcfe}.hljs-section{color:gold}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-bullet,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-selector-pseudo,.hljs-selector-tag{color:#d7ba7d}.hljs-addition{background-color:#144212}.hljs-addition,.hljs-deletion{display:inline-block;width:100%}.hljs-deletion{background-color:#600}*{padding:0;margin:0}h1,h2,h3,h4,h5,h6{font-weight:400}.home-page .top-section{height:720px}.home-page .top-section .vertical-middle{width:100%}.home-page .top-section .product-logo{margin:0 auto}.home-page .top-section .button-area,.home-page .top-section .product-desc{text-align:center}.home-page .top-section .button-area .button:first-child{margin-right:20px}.home-page .top-section .version-note{text-align:center;margin:22px 0 10px}.home-page .top-section .version-note a{text-decoration:none;display:inline-block;font-family:Avenir-Heavy;font-size:14px;color:#fff;text-align:center;background:#46484b;border-radius:2px;line-height:24px;padding:0 6px;margin-right:10px}.home-page .top-section .release-date{font-family:Avenir-Medium;font-size:12px;color:#999;text-align:center}.home-page .function-section{max-width:832px;margin:0 auto;box-sizing:border-box;padding:82px 0}.home-page .function-section h3{font-family:Avenir-Heavy;font-size:36px;text-align:center;font-weight:400}.home-page .function-section .bone{margin:0 auto 45px}.home-page .function-section .func-item{margin-bottom:30px;position:relative}.home-page .function-section .func-item .col{display:inline-flex;align-items:center;vertical-align:middle;margin:0 auto;width:50%;max-width:750px;min-height:325px}.home-page .function-section .func-item .col img{width:325px}.home-page .function-section .func-item .col h4{font-weight:400;font-family:Avenir-Heavy;font-size:24px;color:#333;margin-bottom:20px}.home-page .function-section .func-item .col p{opacity:.8;font-family:Avenir-Medium;font-size:18px;color:#999;margin:0}.home-page .function-section .func-item .img{display:inline-block;text-align:center}@media screen and (max-width:830px){.home-page .function-section .func-item{text-align:center}.home-page .function-section .func-item .col{width:100%}.home-page .function-section .func-item .img{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);opacity:.1}}.home-page .feature-section{background:#2e3034}.home-page .feature-section .feature-section-body{max-width:1280px;margin:0 auto;position:relative;padding:80px 40px;color:#fff}.home-page .feature-section .feature-section-body h3{font-family:Avenir-Heavy;font-size:36px;text-align:center;margin:0;font-weight:400}.home-page .feature-section .feature-section-body .bone{margin:0 auto 45px}.home-page .feature-section .feature-section-body .feature-list{list-style:none;padding:0;margin:0}.home-page .feature-section .feature-section-body .feature-list .feature-list-item{vertical-align:top;display:inline-block;margin-bottom:48px;width:50%}.home-page .feature-section .feature-section-body .feature-list .feature-list-item ul{list-style:disc;padding-left:14px}.home-page .feature-section .feature-section-body .feature-list .feature-list-item ul li{font-family:Avenir-Medium;font-size:14px;color:#999}.home-page .feature-section .feature-section-body .feature-list .feature-list-item img{vertical-align:top;width:34px;margin-right:20px}.home-page .feature-section .feature-section-body .feature-list .feature-list-item div{display:inline-block;width:80%}.home-page .feature-section .feature-section-body .feature-list .feature-list-item div h4{font-family:Avenir-Heavy;font-size:20px;margin:5px 0 20px}.home-page .feature-section .feature-section-body .feature-list .feature-list-item div p{font-family:Avenir-Medium;font-size:14px;line-height:20px;color:#999}@media screen and (max-width:768px){.home-page .feature-section .feature-section-body .feature-list .feature-list-item{width:100%}}@media screen and (max-width:640px){.home-page .feature-section-body{padding-left:20px;padding-right:20px}}.product-nav-list li.selected a{background-color:#f4f6f8}.main-container{height:calc(100vh - 66px);background-color:#fff!important}.main-container .right-panel{background-color:#fff;width:calc(100% - 180px);padding:12px 32px;overflow:scroll}.main-container .nav-title{margin:0;text-align:center;font-size:14px;font-weight:700;height:72px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;border-bottom:var(--shell-brand-navigation-ver-divider-size,1px) var(--shell-brand-navigation-ver-divider-style,solid) var(--shell-brand-navigation-ver-divider-color,#eee);display:flex;justify-content:center;align-items:center}.main-container .nav-title span{margin-left:5px}.main-container .nav-menu{padding:0;background:transparent;border:0;line-height:40px}.main-container .nav-menu .first-menu>.next-menu-item-inner,.main-container .nav-menu div.next-menu-item{color:#333}.main-container .nav-menu .next-menu-item-inner{height:40px;color:#666}.main-container .nav-menu .current-path{background-color:#f2f3f7}.main-container .go-back{text-align:center;color:#546478;font-size:20px;font-weight:700;padding:10px 0;margin-top:14px;cursor:pointer}.next-card{border:1px solid #dcdee3}.next-card-head{padding-left:16px;padding-right:16px}.next-card-head-show-bullet .next-card-title:before{background:#5584ff}.next-card-head-main{margin-top:8px;height:40px;line-height:40px}.next-card-extra{font-size:12px;color:#5584ff}.next-card-body{padding-bottom:12px;padding-left:16px;padding-right:16px}.next-card-show-divider .next-card-head-main{border-bottom:1px solid #e6e7eb}.next-card-show-divider .next-card-body{padding-top:12px}.next-card-header{padding:0 16px;margin-bottom:12px;margin-top:12px}.next-card-actions{padding:12px 16px}.next-card-divider:before{border-bottom:1px solid #e6e7eb}.next-card-divider--inset{padding:0 16px}.next-card-content-container{margin-top:12px;padding-bottom:12px;padding-left:16px;padding-right:16px;font-size:12px}
+/*!
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */@keyframes slashStar{0%{opacity:1}to{opacity:0}}.home-page .top-section{position:relative;height:100vh}.home-page .top-section .login-panel{position:absolute;right:40px;width:480px;height:540px;top:90px;border:0}.home-page .top-section .login-panel input,.home-page .top-section .login-panel input::-webkit-input-placeholder{font-size:16px}.home-page .top-section .login-panel .login-header{width:100%;line-height:45px;font-size:32px;margin-top:58px;text-align:center}.home-page .top-section .login-panel .internal-sys-tip{width:100%;line-height:25px;font-size:20px;margin-top:25px;text-align:center;font-weight:800;color:rgba(255,0,0,.8)}.home-page .top-section .login-panel .login-form{width:360px;margin:40px auto auto}.home-page .top-section .login-panel .login-form input{height:60px}.home-page .top-section .login-panel .login-form button{width:100%;height:60px;font-size:16px;background:#4190ff 100%;color:#fff;border:0}.home-page .top-section .animation{position:absolute;width:6px;height:6px;border-radius:50%;background-color:#1be1f6}.home-page .top-section .animation1{left:15%;top:70%;animation:slashStar 2s ease-in-out .3s infinite}.home-page .top-section .animation2{left:34%;top:35%;animation:slashStar 2s ease-in-out 1.2s infinite}.home-page .top-section .animation3{left:53%;top:20%;animation:slashStar 2s ease-in-out .5s infinite}.home-page .top-section .animation4{left:72%;top:64%;animation:slashStar 2s ease-in-out .8s infinite}.home-page .top-section .animation5{left:87%;top:30%;animation:slashStar 2s ease-in-out 1.5s infinite}.home-page .top-section .vertical-middle{position:absolute;left:0;top:50%;margin-top:-47px;transform:translateY(-50%)}.home-page .top-section .product-area{width:600px;margin-left:40px}.home-page .top-section .product-logo{display:block;width:257px;height:50px;margin:0}.home-page .top-section .product-desc{opacity:.8;font-family:Avenir-Medium;font-size:24px;color:#fff;max-width:780px;margin:12px auto 30px;text-align:left;line-height:30px}.next-table{border-top:1px solid #dcdee3;border-left:1px solid #dcdee3}.next-table th{background:#ebecf0;border-right:1px solid #dcdee3;border-bottom:1px solid #dcdee3}.next-table-header-resizable .next-table-resize-handler:hover:after{background:#5584ff}.next-table td{border-right:1px solid #dcdee3;border-bottom:1px solid #dcdee3}.next-table.zebra tr:nth-child(2n) td{background:#f7f8fa}.next-table.zebra .next-table-cell.hovered,.next-table.zebra .next-table-row.hovered td,.next-table.zebra .next-table-row.selected td{background:#f2f3f7}.next-table-empty{color:#a0a2ad}.next-table-expanded-row .next-table td,.next-table-expanded-row .next-table th{border-right:1px solid #dcdee3}.next-table-cell.hovered,.next-table-row.hovered,.next-table-row.selected{background:#f2f3f7}.next-table-body,.next-table-header{font-size:12px}.next-table-column-resize-proxy{border-left:2px solid #5584ff}.next-table-body{font-size:12px}.next-table-fixed{border-right:1px solid #dcdee3;border-bottom:1px solid #dcdee3}.next-table-fixed .next-table-header{background:#ebecf0}.next-table-group .next-table-body table,.next-table-group .next-table-header table{border-top:1px solid #dcdee3;border-left:1px solid #dcdee3}.next-table-group .next-table-group-footer td,.next-table-group .next-table-group-header td{background:#ebecf0}.next-table-filter .next-table-filter-active,.next-table-sort .current .next-icon{color:#5584ff}
+/*!
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*!
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*!
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*!
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*!
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */.next-balloon{font-size:12px}.next-balloon-title.next-balloon-closable .next-balloon-close{transform:translateY(18px)}.next-balloon-primary{border-color:#4494f9;background-color:#e3f2fd}.next-balloon-primary .next-balloon-close{transform:translateY(16px);font-size:12px}.next-balloon-primary .next-balloon-close .next-icon{width:12px;height:12px}.next-balloon-primary .next-balloon-close .next-icon:before{width:12px;height:12px;font-size:12px}.next-balloon-primary:after{border:1px solid #4494f9;background-color:#e3f2fd}.next-balloon-normal{border-color:#dcdee3;box-shadow:0 2px 4px 0 rgba(0,0,0,.12)}.next-balloon-normal .next-balloon-close{transform:translateY(16px);font-size:12px}.next-balloon-normal .next-balloon-close .next-icon{width:12px;height:12px}.next-balloon-normal .next-balloon-close .next-icon:before{width:12px;height:12px;font-size:12px}.next-balloon-normal:after{border:1px solid #dcdee3}.next-balloon-tooltip{font-size:12px;color:#333}.next-balloon-tooltip,.next-balloon-tooltip .next-balloon-arrow .next-balloon-arrow-content{background-color:#f2f3f7;border:1px solid #dcdee3}.next-tag-checkable.next-tag-level-secondary:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-secondary:not(.disabled):not([disabled]):hover{color:#5584ff}.next-tag-default.next-tag-level-primary{border-color:#ebecf0;background-color:#ebecf0}.next-tag-default.next-tag-level-primary:not(.disabled):not([disabled]).hover,.next-tag-default.next-tag-level-primary:not(.disabled):not([disabled]):hover{border-color:#e2e4e8;background-color:#e2e4e8}.disabled.next-tag-default.next-tag-level-primary,[disabled].next-tag-default.next-tag-level-primary{border-color:#f7f8fa;background-color:#f7f8fa}.next-tag-closable.next-tag-level-primary{border-color:#ebecf0;background-color:#ebecf0}.next-tag-closable.next-tag-level-primary:not(.disabled):not([disabled]).hover,.next-tag-closable.next-tag-level-primary:not(.disabled):not([disabled]):hover{border-color:#e2e4e8;background-color:#e2e4e8}.disabled.next-tag-closable.next-tag-level-primary,[disabled].next-tag-closable.next-tag-level-primary{border-color:#f7f8fa;background-color:#f7f8fa}.next-tag-checkable.next-tag-level-primary{border-color:#ebecf0;background-color:#ebecf0}.next-tag-checkable.next-tag-level-primary:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-primary:not(.disabled):not([disabled]):hover{border-color:#e2e4e8;background-color:#e2e4e8}.disabled.next-tag-checkable.next-tag-level-primary,[disabled].next-tag-checkable.next-tag-level-primary{border-color:#f7f8fa;background-color:#f7f8fa}.next-tag-checkable.next-tag-level-primary.checked{border-color:#5584ff;background-color:#5584ff}.next-tag-checkable.next-tag-level-primary.checked:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-primary.checked:not(.disabled):not([disabled]):hover{border-color:#3e71f7;background-color:#3e71f7}.disabled.next-tag-checkable.next-tag-level-primary.checked,[disabled].next-tag-checkable.next-tag-level-primary.checked{border-color:#f7f8fa;background-color:#f7f8fa}.next-tag-default.next-tag-level-normal{border-color:#c4c6cf}.next-tag-default.next-tag-level-normal:not(.disabled):not([disabled]).hover,.next-tag-default.next-tag-level-normal:not(.disabled):not([disabled]):hover{border-color:#a0a2ad}.disabled.next-tag-default.next-tag-level-normal,[disabled].next-tag-default.next-tag-level-normal{border-color:#e6e7eb;background-color:#f7f8fa}.next-tag-closable.next-tag-level-normal{border-color:#c4c6cf}.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]).hover,.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]):hover{border-color:#a0a2ad}.disabled.next-tag-closable.next-tag-level-normal,[disabled].next-tag-closable.next-tag-level-normal{border-color:#e6e7eb}.next-tag-checkable.next-tag-level-normal.checked{color:#5584ff;border-color:#5584ff}.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]):hover{color:#3e71f7;border-color:#3e71f7}.next-tag-checkable.next-tag-level-secondary.checked{color:#5584ff;border-color:#5584ff}.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]):hover{color:#3e71f7;border-color:#3e71f7}.next-tag-checkable.next-tag-level-secondary.checked:before{background-color:#5584ff}.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]).hover:before,.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]):hover:before{background-color:#3e71f7}.next-tag-checkable.next-tag-level-secondary.checked:disabled:before,[disabled].next-tag-checkable.next-tag-level-secondary.checked:before{background-color:#e6e7eb}.next-tag-checkable.next-tag-level-normal,.next-tag-checkable.next-tag-level-normal:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-normal:not(.disabled):not([disabled]):hover{border-color:#c4c6cf}.disabled.next-tag-checkable.next-tag-level-normal,[disabled].next-tag-checkable.next-tag-level-normal{border-color:#e6e7eb;background-color:#f7f8fa}.next-tag-checkable.next-tag-level-normal.checked:before{background-color:#5584ff}.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]).hover:before,.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]):hover:before{background-color:#3e71f7}.next-tag-checkable.next-tag-level-normal.checked:disabled:before,[disabled].next-tag-checkable.next-tag-level-normal.checked:before{background-color:#e6e7eb}.next-tag-closable.next-tag-level-normal:before{background-color:#c4c6cf}.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]).hover:before,.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]):hover:before{background-color:#a0a2ad}.next-tag-closable.next-tag-level-normal:disabled:before,[disabled].next-tag-closable.next-tag-level-normal:before{background-color:#e6e7eb}.next-tag-large.next-tag-closable>.next-tag-body{max-width:calc(100% - 44px)}.next-tag-large.next-tag-closable>.next-tag-close-btn .next-icon .next-icon-remote,.next-tag-large.next-tag-closable>.next-tag-close-btn .next-icon:before{width:12px;font-size:12px}.next-tag-medium{height:28px;line-height:26px}.next-tag-medium.next-tag-closable>.next-tag-body{max-width:calc(100% - 32px)}.next-tag-medium.next-tag-closable>.next-tag-close-btn .next-icon .next-icon-remote,.next-tag-medium.next-tag-closable>.next-tag-close-btn .next-icon:before{width:8px;font-size:8px}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-tag-medium.next-tag-closable>.next-tag-close-btn .next-icon{transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-tag-medium.next-tag-closable>.next-tag-close-btn .next-icon:before{width:16px;font-size:16px}}.next-tag-small{height:20px;line-height:18px}.next-tag-checkable.next-tag-level-secondary.disabled,.next-tag-checkable.next-tag-level-secondary[disabled]{border-color:#e6e7eb;background-color:#f7f8fa}.next-select-multiple .next-disabled .next-select-tag-compact{background:linear-gradient(90deg,transparent,#f7f8fa 10px)}.next-select-multiple.next-small .next-select-values,.next-select-tag.next-small .next-select-values{min-height:18px;padding-top:2px;padding-bottom:2px}.next-select-multiple.next-small .next-select-values-compact,.next-select-tag.next-small .next-select-values-compact{height:20px!important}.next-select-multiple.next-small .next-input-control,.next-select-multiple.next-small .next-input-inner,.next-select-multiple.next-small .next-input-label,.next-select-multiple.next-small .next-select-tag-compact,.next-select-tag.next-small .next-input-control,.next-select-tag.next-small .next-input-inner,.next-select-tag.next-small .next-input-label,.next-select-tag.next-small .next-select-tag-compact{line-height:18px}.next-select-multiple.next-medium .next-select-values,.next-select-tag.next-medium .next-select-values{min-height:26px;padding-top:3px;padding-bottom:3px}.next-select-multiple.next-medium .next-select-values-compact,.next-select-tag.next-medium .next-select-values-compact{height:28px!important}.next-select-multiple.next-medium .next-input-control,.next-select-multiple.next-medium .next-input-inner,.next-select-multiple.next-medium .next-input-label,.next-select-multiple.next-medium .next-select-tag-compact,.next-select-tag.next-medium .next-input-control,.next-select-tag.next-medium .next-input-inner,.next-select-tag.next-medium .next-input-label,.next-select-tag.next-medium .next-select-tag-compact{line-height:26px}.next-select-menu-wrapper{border:1px solid #dcdee3}.next-select-all{border-bottom:1px solid #dcdee3}.next-select-all:hover{color:#3e71f7}.next-select-all .next-menu-icon-selected.next-icon{color:#5584ff}.next-select-highlight{color:#5584ff;font-size:12px}.next-select-in-ie.next-select-trigger.next-select-single .next-input.next-small .next-select-values{line-height:20px}.next-select-in-ie.next-select-trigger.next-select-single .next-input.next-medium .next-select-values{line-height:28px}@media screen and (-webkit-min-device-pixel-ratio:0){.next-select-multiple .next-select-compact .next-select-tag-compact{background:linear-gradient(90deg,hsla(0,0%,100%,0),#fff 10px)}.next-select-multiple .next-disabled .next-select-tag-compact{background:linear-gradient(90deg,hsla(0,0%,100%,0),#f7f8fa 10px)}}
+/*!
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*!
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */.new-config-form{margin-top:36px}
+/*!
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */.next-tabs-tab.active .next-tabs-tab-close{color:#5584ff}.next-tabs-btn-down.disabled,.next-tabs-btn-next.disabled,.next-tabs-btn-prev.disabled,.next-tabs-tab.disabled .next-tabs-tab-close{color:#dcdee3}.next-tabs.next-medium .next-tabs-tab-inner{font-size:12px;padding:12px 16px}.next-tabs-pure>.next-tabs-bar{border-bottom:1px solid #dcdee3}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-container .next-tabs-tab.active{color:#5584ff}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-container .next-tabs-tab.disabled{color:#dcdee3}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-container .next-tabs-tab:before{border-bottom:2px solid #5584ff}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab{background-color:#f2f3f7}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab:hover{background-color:#ebecf0}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab.active{color:#5584ff}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab.disabled{background:#f7f8fa}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab.active .next-tabs-tab-close{color:#5584ff}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab.disabled .next-tabs-tab-close{color:#dcdee3}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-tab{border:1px solid #dcdee3}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-tab:hover{border-color:#c4c6cf}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-tab.active{border-color:#dcdee3 #dcdee3 #fff}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-tab:before{border-top:2px solid #5584ff}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar:before{border-bottom:1px solid #dcdee3}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-tab{border:1px solid #dcdee3}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-tab:hover{border-color:#c4c6cf}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-tab.active{border-color:#fff #dcdee3 #dcdee3}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-tab:before{border-bottom:2px solid #5584ff}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-content{border-bottom:1px solid #dcdee3}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar .next-tabs-tab{border:1px solid #dcdee3}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar .next-tabs-tab:hover{border-color:#c4c6cf}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar .next-tabs-tab.active{border-color:#dcdee3 #fff #dcdee3 #dcdee3}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar .next-tabs-tab:before{border-left:2px solid #5584ff}.next-tabs-wrapped.next-tabs-left>.next-tabs-content{border-left:1px solid #dcdee3}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar .next-tabs-tab{border:1px solid #dcdee3}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar .next-tabs-tab:hover{border-color:#c4c6cf}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar .next-tabs-tab.active{border-color:#dcdee3 #dcdee3 #dcdee3 #fff}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar .next-tabs-tab:before{border-right:2px solid #5584ff}.next-tabs-wrapped.next-tabs-right>.next-tabs-content{border-right:1px solid #dcdee3}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab{border:1px solid #c4c6cf;background-color:#f2f3f7}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab:last-child{border-right:1px solid #c4c6cf}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab.active{border-color:#5584ff}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab.disabled{border-color:#e6e7eb}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab:hover{border-color:#c4c6cf;background-color:#ebecf0}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab.active{background-color:#5584ff}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab.disabled{background:#f7f8fa}.next-tabs-text>.next-tabs-bar .next-tabs-tab.active{color:#5584ff}.next-tabs-text>.next-tabs-bar .next-tabs-tab:not(:last-child):after{background-color:#dcdee3}.next-tabs[dir=rtl].next-tabs-capsule>.next-tabs-bar .next-tabs-tab{border:1px solid #c4c6cf}.next-tabs[dir=rtl].next-tabs-capsule>.next-tabs-bar .next-tabs-tab:last-child{border-left:1px solid #c4c6cf}.next-tabs[dir=rtl].next-tabs-capsule>.next-tabs-bar .next-tabs-tab.active{border-color:#5584ff}
+/*!
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*!
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */.button-list{text-align:right}.button-list button{margin-left:1em;font-size:14px}.editor-full-screen{width:100%;height:100%;position:fixed;top:0;left:0;z-index:100}.editor-normal{clear:both}.more-item.hide{display:none}
+/*!
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */.config-editor{padding:10px}.config-editor .func-title{overflow:hidden;height:50px;width:100%;font-weight:500;margin-bottom:9px;font-size:18px;line-height:36px;color:#73777a}.config-editor .form{display:table}.config-editor .form .next-form-item{display:table-row}.config-editor .form .next-form-item .next-form-item-label{white-space:nowrap;word-break:keep-all}.config-editor .form .next-form-item .next-form-item-control,.config-editor .form .next-form-item .next-select{width:100%}.config-editor .form .next-form-item .next-form-item-control,.config-editor .form .next-form-item .next-form-item-label{display:table-cell}.config-editor .form .next-form-item-control{padding-bottom:12px}.config-editor .form .next-checkbox-label{color:#73777a;font-weight:400}.config-editor .form .next-radio-label{color:#73777a}.config-editor .form .switch{color:#33cde5;cursor:pointer;user-select:none}.config-editor .form .help-label>*{display:inline-block}.config-editor .form .help-label>i{color:#1dc11d;margin:0 .25em}.config-editor .button-list{text-align:right}.config-editor .button-list button{margin-left:1em;font-size:14px}.config-editor .editor-full-screen{width:100%;height:100%;position:fixed;top:0;left:0;z-index:100}.config-editor .editor-normal{clear:both}
+/*!
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*!
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */.next-pagination[dir=rtl] .next-pagination-size-selector-btn.next-btn-text+.next-pagination-size-selector-btn{border-right:1px solid #dcdee3}.next-pagination[dir=rtl].next-small .next-pagination-total{line-height:20px}.next-pagination[dir=rtl].next-small .next-pagination-ellipsis,.next-pagination[dir=rtl].next-small .next-pagination-size-selector-title{height:20px;line-height:20px}.next-pagination[dir=rtl].next-medium .next-pagination-total{line-height:28px}.next-pagination[dir=rtl].next-medium .next-pagination-ellipsis{height:28px;line-height:28px}.next-pagination[dir=rtl].next-medium .next-pagination-display,.next-pagination[dir=rtl].next-medium .next-pagination-display em,.next-pagination[dir=rtl].next-medium .next-pagination-jump-text{font-size:12px}.next-pagination[dir=rtl].next-medium .next-pagination-size-selector-title{height:28px;line-height:28px;font-size:12px}.next-pagination .next-pagination-item:not([disabled]){border-color:#c4c6cf}.next-pagination .next-pagination-item.next-current{border-color:#5584ff;background:#5584ff}.next-pagination .next-pagination-item.next-current:focus,.next-pagination .next-pagination-item.next-current:hover{border-color:transparent;background:#3e71f7;color:#fff}.next-pagination-display em,.next-pagination-size-selector-btn.next-btn-text.next-current{color:#5584ff}.next-pagination-size-selector-btn.next-btn-text+.next-pagination-size-selector-btn{border-left:1px solid #dcdee3}.next-pagination.next-small .next-pagination-total{line-height:20px}.next-pagination.next-small .next-pagination-ellipsis,.next-pagination.next-small .next-pagination-size-selector-title{height:20px;line-height:20px}.next-pagination.next-small.next-no-border .next-pagination-item.next-next:not([disabled]):hover i,.next-pagination.next-small.next-no-border .next-pagination-item.next-prev:not([disabled]):hover i{color:#5584ff}.next-pagination.next-medium .next-pagination-total{line-height:28px}.next-pagination.next-medium .next-pagination-ellipsis{height:28px;line-height:28px}.next-pagination.next-medium .next-pagination-display,.next-pagination.next-medium .next-pagination-display em,.next-pagination.next-medium .next-pagination-jump-text{font-size:12px}.next-pagination.next-medium .next-pagination-size-selector-title{height:28px;line-height:28px;font-size:12px}.next-pagination.next-large.next-no-border .next-pagination-item.next-next:not([disabled]):hover i,.next-pagination.next-large.next-no-border .next-pagination-item.next-prev:not([disabled]):hover i,.next-pagination.next-medium.next-no-border .next-pagination-item.next-next:not([disabled]):hover i,.next-pagination.next-medium.next-no-border .next-pagination-item.next-prev:not([disabled]):hover i{color:#5584ff}
+/*!
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*!
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */.query_result_wrapper{font-size:16px;margin-bottom:16px;font-family:Helvetica Neue,Luxi Sans,DejaVu Sans,Tahoma,Hiragino Sans GB,STHeiti,Microsoft YaHei}
+/*!
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */.next-switch-loading .next-icon-loading{color:#5584ff}.next-switch-medium{width:56px;border-radius:20px}.next-switch-medium.next-switch-auto-width{min-width:56px}.next-switch-medium>.next-switch-btn{border-radius:20px}.next-switch-medium>.next-switch-children{font-size:12px}.next-switch-small,.next-switch-small>.next-switch-btn{border-radius:20px}.next-switch-on{background-color:#5584ff}.next-switch-on.hover,.next-switch-on:focus,.next-switch-on:hover{background-color:#3e71f7}.next-switch-on[disabled]{background-color:#ebecf0}.next-switch-on[disabled] .next-switch-btn{background-color:#f7f8fa}.next-switch-off,.next-switch-off.hover,.next-switch-off:focus,.next-switch-off:hover{background-color:#ebecf0;border-color:#ebecf0}.next-switch-off[disabled]{background-color:#ebecf0}.next-switch-off[disabled] .next-switch-btn{background-color:#f7f8fa}.next-switch-off[disabled]>.next-switch-children{color:#c4c6cf}.next-progress-line-underlay{background:#ebecf0}.next-progress-line-overlay-normal{background:#5584ff}.next-progress-line-overlay-success{background:#46bc15}.next-progress-line-overlay-error,.next-progress-line-overlay-started{background:#ff3000}.next-progress-line-overlay-middle{background:#ff9300}.next-progress-line-overlay-finishing{background:#46bc15}.next-progress-line.next-large .next-progress-line-overlay,.next-progress-line.next-large .next-progress-line-underlay,.next-progress-line.next-medium .next-progress-line-overlay,.next-progress-line.next-medium .next-progress-line-underlay,.next-progress-line.next-small .next-progress-line-overlay,.next-progress-line.next-small .next-progress-line-underlay{border-radius:20px}.next-progress-line.next-large .next-progress-line-text{font-size:12px}.next-progress-line-show-border .next-progress-line-underlay{border:1px solid #dcdee3}.next-progress-line-show-border.next-large .next-progress-line-overlay,.next-progress-line-show-border.next-large .next-progress-line-underlay,.next-progress-line-show-border.next-medium .next-progress-line-overlay,.next-progress-line-show-border.next-medium .next-progress-line-underlay,.next-progress-line-show-border.next-small .next-progress-line-overlay,.next-progress-line-show-border.next-small .next-progress-line-underlay{border-radius:20px}.next-progress-line-show-border.next-large .next-progress-line-text{font-size:12px}.next-progress-circle-underlay{stroke:#ebecf0}.next-progress-circle-overlay-normal{stroke:#5584ff}.next-progress-circle-overlay-success{stroke:#46bc15}.next-progress-circle-overlay-error,.next-progress-circle-overlay-started{stroke:#ff3000}.next-progress-circle-overlay-middle{stroke:#ff9300}.next-progress-circle-overlay-finishing{stroke:#46bc15}.next-upload-list[dir=rtl].next-upload-list-text .next-upload-list-item{padding:4px 8px 4px 36px}.next-upload-list[dir=rtl].next-upload-list-image .next-upload-list-item-progress{margin-left:20px}.next-upload.next-disabled,.next-upload.next-disabled .next-upload-inner *{border-color:#e6e7eb!important}.next-upload-list-text .next-upload-list-item{background-color:#f2f3f7;padding:4px 36px 4px 8px;font-size:12px}.next-upload-list-text .next-upload-list-item .next-icon-close .next-icon-remote,.next-upload-list-text .next-upload-list-item .next-icon-close:before{width:12px;font-size:12px}.next-upload-list-text .next-upload-list-item:hover{background-color:#f2f3f7}.next-upload-list-text .next-upload-list-item-done:hover .next-upload-list-item-name,.next-upload-list-text .next-upload-list-item-done:hover .next-upload-list-item-size{color:#5584ff}.next-upload-list-text .next-upload-list-item-error-msg{color:#ff3000}.next-upload-list-image .next-upload-list-item{border:1px solid #dcdee3;font-size:12px}.next-upload-list-image .next-upload-list-item .next-icon-close .next-icon-remote,.next-upload-list-image .next-upload-list-item .next-icon-close:before{width:12px;font-size:12px}.next-upload-list-image .next-upload-list-item:hover{border-color:#5584ff}.next-upload-list-image .next-upload-list-item-name{margin-right:20px}.next-upload-list-image .next-upload-list-item-done:hover .next-upload-list-item-name,.next-upload-list-image .next-upload-list-item-done:hover .next-upload-list-item-size{color:#5584ff}.next-upload-list-image .next-upload-list-item-thumbnail{border:1px solid #dcdee3;background-color:#f2f3f7}.next-upload-list-image .next-upload-list-item-error{border-color:#ff3000!important}.next-upload-list-image .next-upload-list-item-uploading .next-upload-list-item-progress{margin-right:20px}.next-upload-list-image .next-upload-list-item-error-with-msg .next-upload-list-item-error-msg{margin-right:20px;color:#ff3000}.next-upload-list-card .next-upload-list-item-wrapper{border:1px solid #c4c6cf}.next-upload-list-card .next-upload-list-item-uploading .next-upload-list-item-wrapper{background-color:#f7f8fa}.next-upload-list-card .next-upload-list-item-error .next-upload-list-item-wrapper{border-color:#ff3000}.next-upload-card{border:1px dashed #c4c6cf}.next-upload-card .next-icon{color:#c4c6cf}.next-upload-card .next-upload-text{font-size:12px}.next-upload-card:hover{border-color:#5584ff}.next-upload-card:hover .next-icon,.next-upload-card:hover .next-upload-text{color:#5584ff}.next-upload-dragable .next-upload-drag{border:1px dashed #c4c6cf}.next-upload-dragable .next-upload-drag-over{border-color:#5584ff}.next-collapse[dir=rtl] .next-collapse-panel-title{padding:8px 28px 8px 0}.next-collapse[dir=rtl] .next-collapse-panel-icon .next-icon-remote,.next-collapse[dir=rtl] .next-collapse-panel-icon:before{width:8px;font-size:8px}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-collapse[dir=rtl] .next-collapse-panel-icon{transform:scale(.5) rotate(180deg);margin-left:-4px;margin-right:-4px}.next-collapse[dir=rtl] .next-collapse-panel-icon:before{width:16px;font-size:16px}}.next-collapse{border:1px solid #dcdee3}.next-collapse-panel:not(:first-child){border-top:1px solid #dcdee3}.next-collapse .next-collapse-panel-icon .next-icon-remote,.next-collapse .next-collapse-panel-icon:before{width:8px;font-size:8px}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-collapse .next-collapse-panel-icon{transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-collapse .next-collapse-panel-icon:before{width:16px;font-size:16px}}.next-collapse-panel-title{background:#f2f3f7;padding:8px 0 8px 28px}.next-collapse-panel-title:hover{background:#ebecf0}.next-collapse-panel-content{font-size:12px}.next-collapse .next-collapse-panel-icon.next-collapse-panel-icon-expanded .next-icon-remote,.next-collapse .next-collapse-panel-icon.next-collapse-panel-icon-expanded:before{width:8px;font-size:8px}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-collapse .next-collapse-panel-icon.next-collapse-panel-icon-expanded{transform:scale(.5) rotate(90deg);margin-left:-4px;margin-right:-4px}.next-collapse .next-collapse-panel-icon.next-collapse-panel-icon-expanded:before{width:16px;font-size:16px}}.next-collapse-disabled,.next-collapse-panel-disabled:not(:first-child){border-color:#e6e7eb}.next-collapse-panel-disabled:hover,.next-collapse-panel-disabled>.next-collapse-panel-title{background:#f2f3f7}.next-menu-btn.next-btn-secondary.next-btn-text:hover .next-menu-btn-arrow,.next-menu-btn.next-btn-secondary .next-menu-btn-arrow,.next-menu-btn.next-btn-text.next-btn-normal:hover .next-menu-btn-arrow,.next-menu-btn.next-btn-text.next-btn-primary .next-menu-btn-arrow{color:#5584ff}.next-menu-btn.next-btn-text.next-btn-primary:hover .next-menu-btn-arrow{color:#3e71f7}.next-search-simple[dir=rtl].next-normal .next-search-left .next-search-left-addon{border-left:1px solid #c4c6cf}.next-search-simple[dir=rtl].next-dark .next-search-left{border-color:#c4c6cf}.next-search-simple[dir=rtl].next-dark .next-search-left .next-search-left-addon{border-right:1px solid #c4c6cf}.next-search-simple[dir=rtl].next-dark:hover .next-search-left{border-color:#c4c6cf}.next-search-simple[dir=rtl].next-dark .next-search-icon{color:#999}.next-search-simple[dir=rtl].next-dark .next-search-icon:hover{color:#666}.next-search-normal[dir=rtl].next-primary .next-input{border-top-right-radius:1px;border-bottom-right-radius:1px}.next-search-normal[dir=rtl].next-primary .next-search-left .next-search-left-addon{border-left:1px solid #e6e7eb}.next-search-normal[dir=rtl].next-secondary .next-input{border-top-right-radius:1px;border-bottom-right-radius:1px}.next-search-normal[dir=rtl].next-secondary .next-search-left .next-search-left-addon{border-left:1px solid #e6e7eb}.next-search-normal[dir=rtl].next-normal .next-input{border-top-right-radius:1px;border-bottom-right-radius:1px}.next-search-normal[dir=rtl].next-normal .next-search-left .next-search-left-addon{border-left:1px solid #e6e7eb}.next-search-normal[dir=rtl].next-dark .next-search-left .next-search-left-addon{border-left:1px solid #5584ff}.next-search-normal.next-primary .next-search-left{border-color:#5584ff}.next-search-normal.next-primary .next-search-left .next-search-left-addon{border-right:1px solid #e6e7eb}.next-search-normal.next-primary:hover .next-btn,.next-search-normal.next-primary:hover .next-search-left{border-color:#5584ff}.next-search-normal.next-primary .next-search-btn{background:#5584ff;border-color:#5584ff}.next-search-normal.next-primary .next-search-btn:hover{background:#3e71f7;border-color:#5584ff}.next-search-normal.next-primary.next-large .next-search-btn,.next-search-normal.next-primary.next-large .next-search-left{border-width:2px;height:60px}.next-search-normal.next-primary.next-large .next-search-input{height:56px}.next-search-normal.next-primary.next-large .next-search-input input{height:56px;line-height:56px \0 }.next-search-normal.next-primary.next-large .next-select{height:56px}.next-search-normal.next-primary.next-medium .next-search-btn,.next-search-normal.next-primary.next-medium .next-search-left{border-width:2px;height:40px}.next-search-normal.next-primary.next-medium .next-search-input{height:36px}.next-search-normal.next-primary.next-medium .next-search-input input{height:36px;line-height:36px \0 }.next-search-normal.next-primary.next-medium .next-select{height:36px}.next-search-normal.next-primary.next-medium .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-primary.next-medium .next-search-btn .next-icon:before{width:16px;font-size:16px}.next-search-normal.next-primary .next-input{border-top-left-radius:1px;border-bottom-left-radius:1px}.next-search-normal.next-secondary .next-search-left{border-color:#c4c6cf}.next-search-normal.next-secondary .next-search-left .next-search-left-addon{border-right:1px solid #e6e7eb}.next-search-normal.next-secondary:hover .next-btn,.next-search-normal.next-secondary:hover .next-search-left{border-color:#5584ff}.next-search-normal.next-secondary .next-search-btn{background:#5584ff;border-color:#5584ff}.next-search-normal.next-secondary .next-search-btn:hover{background:#3e71f7;border-color:#5584ff}.next-search-normal.next-secondary.next-large .next-search-btn,.next-search-normal.next-secondary.next-large .next-search-left{height:60px}.next-search-normal.next-secondary.next-large .next-search-input{height:58px}.next-search-normal.next-secondary.next-large .next-search-input input{height:58px;line-height:58px \0 }.next-search-normal.next-secondary.next-large .next-select{height:58px}.next-search-normal.next-secondary.next-medium .next-search-btn,.next-search-normal.next-secondary.next-medium .next-search-left{height:40px}.next-search-normal.next-secondary.next-medium .next-search-input{height:38px}.next-search-normal.next-secondary.next-medium .next-search-input input{height:38px;line-height:38px \0 }.next-search-normal.next-secondary.next-medium .next-select{height:38px}.next-search-normal.next-secondary.next-medium .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-secondary.next-medium .next-search-btn .next-icon:before{width:16px;font-size:16px}.next-search-normal.next-normal .next-search-left{border-color:#c4c6cf}.next-search-normal.next-normal .next-search-left .next-search-left-addon{border-right:1px solid #e6e7eb}.next-search-normal.next-normal:hover .next-btn,.next-search-normal.next-normal:hover .next-search-left{border-color:#a0a2ad}.next-search-normal.next-normal .next-search-btn{background:#f7f8fa;border-color:#c4c6cf}.next-search-normal.next-normal .next-search-btn:hover{background:#ebecf0;border-color:#a0a2ad}.next-search-normal.next-normal.next-large .next-search-btn,.next-search-normal.next-normal.next-large .next-search-left{height:60px}.next-search-normal.next-normal.next-large .next-search-input{height:58px}.next-search-normal.next-normal.next-large .next-search-input input{height:58px;line-height:58px \0 }.next-search-normal.next-normal.next-large .next-select{height:58px}.next-search-normal.next-normal.next-medium .next-search-btn,.next-search-normal.next-normal.next-medium .next-search-left{height:40px}.next-search-normal.next-normal.next-medium .next-search-input{height:38px}.next-search-normal.next-normal.next-medium .next-search-input input{height:38px;line-height:38px \0 }.next-search-normal.next-normal.next-medium .next-select{height:38px}.next-search-normal.next-normal.next-medium .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-normal.next-medium .next-search-btn .next-icon:before{width:16px;font-size:16px}.next-search-normal.next-dark .next-search-left{border-color:#5584ff}.next-search-normal.next-dark .next-search-left .next-search-left-addon{border-right:1px solid #5584ff}.next-search-normal.next-dark:hover .next-btn,.next-search-normal.next-dark:hover .next-search-left{border-color:#5584ff}.next-search-normal.next-dark .next-search-btn{background:#5584ff;border-color:#5584ff}.next-search-normal.next-dark .next-search-btn:hover{background:#3e71f7;border-color:#5584ff}.next-search-normal.next-dark.next-large .next-search-btn,.next-search-normal.next-dark.next-large .next-search-left{height:60px}.next-search-normal.next-dark.next-large .next-search-input{height:58px}.next-search-normal.next-dark.next-large .next-search-input input{height:58px;line-height:58px \0 }.next-search-normal.next-dark.next-large .next-select{height:58px}.next-search-normal.next-dark.next-medium .next-search-btn,.next-search-normal.next-dark.next-medium .next-search-left{height:40px}.next-search-normal.next-dark.next-medium .next-search-input{height:38px}.next-search-normal.next-dark.next-medium .next-search-input input{height:38px;line-height:38px \0 }.next-search-normal.next-dark.next-medium .next-select{height:38px}.next-search-normal.next-dark.next-medium .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-dark.next-medium .next-search-btn .next-icon:before{width:16px;font-size:16px}.next-search-simple.next-normal .next-search-left{border-color:#c4c6cf}.next-search-simple.next-normal .next-search-left .next-search-left-addon{border-right:1px solid #c4c6cf}.next-search-simple.next-normal:hover .next-search-left{border-color:#a0a2ad}.next-search-simple.next-dark .next-search-left{border-color:#c4c6cf}.next-search-simple.next-dark .next-search-left .next-search-left-addon{border-right:1px solid #c4c6cf}.next-search-simple.next-dark:hover .next-search-left{border-color:#c4c6cf}.next-search-simple.next-dark .next-search-icon{color:#999}.next-search-simple.next-dark .next-search-icon:hover{color:#666}.next-search-simple.next-dark.next-medium .next-search-icon .next-icon-remote,.next-search-simple.next-dark.next-medium .next-search-icon:before{width:12px;font-size:12px}.next-search-simple .next-select.next-medium{height:26px}.next-transfer-panel{border:1px solid #dcdee3}.next-transfer-panel-header{border-bottom:1px solid #dcdee3;background-color:#f7f8fa;font-size:12px}.next-transfer-panel-item:not(.next-disabled).next-simple:hover{color:#5584ff}.next-transfer-panel-item.next-insert-before:before{border-top:1px solid #5584ff}.next-transfer-panel-item.next-insert-after:after{border-bottom:1px solid #5584ff}.next-transfer-panel-footer{border-top:1px solid #dcdee3}.next-transfer-panel-count{font-size:12px}.next-transfer-panel-move-all{font-size:12px;color:#5584ff}.next-transfer-move.next-icon{color:#c4c6cf}
+/*!
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*!
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*!
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */.next-slick-arrow.inner.disabled{background:#f7f8fa}.next-slick-dots-item button:focus,.next-slick-dots-item button:hover{background-color:hsla(0,0%,100%,.5)}.next-slick-dots-item.active button{background:#5584ff}
+/*!
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */.next-pagination-size-selector{position:static!important}.configuration-table{margin-bottom:20px}
+/*!
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*!
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */.service-management .page-title{height:30px;width:100%;line-height:30px;margin:0 0 20px;padding:0 0 0 10px;border-left:3px solid #09c;color:#ccc}.service-management .title-item{font-size:14px;color:#000;margin-right:8px}.service-management .next-switch-off{background-color:#f2f3f7;border-color:#c4c6cf}
+/*!
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */.service-detail .header-btn{float:right;margin-left:20px}.service-detail .edit-btn{margin-right:10px}.service-detail .next-form-item{margin-bottom:10px}.service-detail .loading{position:relative;width:100%}.service-detail .pagination{float:right;margin-top:15px}.service-detail .cluster-card{margin-bottom:30px}.cluster-edit-dialog .next-form-item,.instance-edit-dialog .next-form-item,.service-detail-edit-dialog .next-form-item,.service-detail .inner-card{margin-bottom:10px}.cluster-edit-dialog .next-col-fixed-12,.instance-edit-dialog .next-col-fixed-12,.service-detail-edit-dialog .next-col-fixed-12{flex:1}.cluster-edit-dialog .next-switch-off,.instance-edit-dialog .next-switch-off,.service-detail-edit-dialog .next-switch-off{background-color:#f2f3f7;border-color:#c4c6cf}.cluster-edit-dialog .in-select,.cluster-edit-dialog .in-text,.instance-edit-dialog .in-select,.instance-edit-dialog .in-text,.service-detail-edit-dialog .in-select,.service-detail-edit-dialog .in-text{width:120px}.service-detail-edit-dialog{width:600px}.full-width{width:100%}
+/*!
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */.subscriber-list .page-title{height:30px;width:100%;line-height:30px;margin:0 0 20px;padding:0 0 0 10px;border-left:3px solid #09c;color:#ccc}.subscriber-list .title-item{font-size:14px;color:#000;margin-right:8px}
+/*!
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */.cluster-management .page-title{height:30px;width:100%;line-height:30px;margin:0 0 20px;padding:0 0 0 10px;border-left:3px solid #09c;color:#ccc}.cluster-management .title-item{font-size:14px;color:#000;margin-right:8px}
+/*!
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*!
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*!
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */:global(#root),body,html{height:100%}:global(.mainwrapper){position:absolute!important;top:0;bottom:0;left:0;right:0}:global(.sideleft){float:left;background-color:#eaedf1;position:absolute;top:0;bottom:0;z-index:2;overflow:hidden;width:180px}:global(.sideleft .toptitle){width:100%;height:70px;line-height:70px;background:#d9dee4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:700;text-indent:20px}:global(.maincontainer){position:absolute;width:auto;top:0;bottom:0;left:180px;right:0;overflow:hidden;overflow-y:auto;-o-transition:all .2s ease;-ms-transition:all .2s ease;-moz-transition:all .2s ease;-webkit-transition:all .2s ease}:global(.viewFramework-product-navbar .product-nav-list li .active){background-color:#fff!important}.next-menu .next-menu-icon-arrow-down{transform:rotate(0deg)!important}li.next-menu-item:not(.next-disabled).next-selected:focus:hover,li.next-menu-item:not(.next-disabled).next-selected:hover,li.next-menu-item:not(.next-disabled):hover{background:#e4f3fe;background:var(--nav-normal-sub-nav-hover-bg-color,#e4f3fe);color:#209bfa;color:var(--nav-normal-sub-nav-hover-text-color,#209bfa)}.next-menu.next-normal .next-menu-item.next-selected{background:#e4f3fe!important;background:var(--nav-normal-sub-nav-selected-bg-color,#e4f3fe)!important;color:#209bfa!important;color:var(--nav-normal-sub-nav-selected-text-color,#209bfa)!important}.clearfix:after{content:".";clear:both;display:block;height:0;overflow:hidden;visibility:hidden}.clearfix{zoom:1}.copy-icon{cursor:pointer;margin-left:4px;color:var(--color-link-1,#298dff)}.layouttitle{height:40px;width:200px;background-color:#09c;color:#fff;line-height:40px;text-align:center;margin:0;padding:0;font-weight:700}.linknav{height:30px;line-height:30px;text-align:center}.righttitle{height:40px;background-color:#000;width:100%;font-weight:700}.product-nav-icon{padding:15px 0 0;height:70px;margin:0}.envcontainer{padding-left:15px;margin-right:auto;margin-left:auto;max-height:450px;overflow:scroll;margin-bottom:100px;display:none;top:50px;left:230px;position:fixed;z-index:99999;width:435px;height:auto;background-color:#fff;border:1px solid #ddd;border-radius:0;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,.1);box-shadow:0 1px 3px rgba(0,0,0,.1)}.envtop{height:50px;line-height:50px;position:fixed;top:0;left:320px;z-index:999;background-color:transparent;-webkit-font-smoothing:antialiased}.envcontainer-top{padding-left:15px;margin-right:auto;margin-left:auto;max-height:450px;overflow:auto;margin-bottom:100px;display:none;top:50px;left:0;position:absolute;z-index:99999;width:435px;height:auto;background-color:#fff;border:1px solid #ddd;border-radius:0;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,.1);box-shadow:0 1px 3px rgba(0,0,0,.1)}.envcontainer-top .row{margin:0!important}.envcontainer-top .active{background-color:#546478}.envcontainer dl dd.active{background-color:#546478;color:#fff}.current-env{display:block;padding:0;font-size:14px;margin:0 0 5px;text-align:center}.current-env a{color:#666;text-decoration:none}.product-nav-title{height:70px;line-height:70px;margin:0;text-align:center;padding:0;font-size:14px;background:#d9dee4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333}.console-title{padding:16px 0}.topbar-nav-item-title{margin:0 0 10px 31px;color:#666;font-weight:700}.dl{height:100%;width:125px;overflow:auto;margin:0 15px 15px 0}.dd{height:24px;line-height:24px;overflow-x:hidden;padding-left:12px;margin-left:20px}.active{color:#fff}.dd:hover{cursor:pointer;opacity:.7;filter:70}.cm-s-xq-light span.cm-keyword{line-height:1em;font-weight:700;color:#5a5cad}.cm-s-xq-light span.cm-atom{color:#6c8cd5}.cm-s-xq-light span.cm-number{color:#164}.cm-s-xq-light span.cm-def{text-decoration:underline}.cm-s-xq-light span.cm-type,.cm-s-xq-light span.cm-variable,.cm-s-xq-light span.cm-variable-2,.cm-s-xq-light span.cm-variable-3{color:#000}.cm-s-xq-light span.cm-comment{color:#0080ff;font-style:italic}.cm-s-xq-light span.cm-string{color:red}.cm-s-xq-light span.cm-meta{color:#ff0}.cm-s-xq-light span.cm-qualifier{color:grey}.cm-s-xq-light span.cm-builtin{color:#7ea656}.cm-s-xq-light span.cm-bracket{color:#cc7}.cm-s-xq-light span.cm-tag{color:#3f7f7f}.cm-s-xq-light span.cm-attribute{color:#7f007f}.cm-s-xq-light span.cm-error{color:red}.cm-s-xq-light .CodeMirror-activeline-background{background:#e8f2ff}.cm-s-xq-light .CodeMirror-matchingbracket{outline:1px solid grey;color:#000!important;background:#ff0}.CodeMirror{border:1px solid #eee}.CodeMirror-fullscreen{position:fixed;top:0;left:0;right:0;bottom:0;height:auto;z-index:9999}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:infobackground;border:1px solid #000;border-radius:4px 4px 4px 4px;color:infotext;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:0 100%;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==")}.CodeMirror-lint-mark-warning{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=")}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:50%;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:0 0;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=")}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=")}.CodeMirror-lint-marker-multiple{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC");background-repeat:no-repeat;background-position:100% 100%;width:100%;height:100%}@media(min-width:992px){.modal-lg{width:980px}}@media(min-width:768px)and (max-width:992px){.modal-lg{width:750px}}.modal-body table.narrow-table td{padding:8px 0}.add-on.form-control{margin-left:-4px;box-shadow:none;font-size:28px;line-height:32px;padding:0;vertical-align:top}.text-break{word-wrap:break-word;word-break:break-all;white-space:normal}.form-inline{margin-bottom:20px}.console-title{min-height:70px}.form-horizontal .form-group .checkbox{margin-left:0;margin-right:10px}.combox_border,.combox_select{border:1px solid #c2c2c2;width:245px}.combox_border{height:auto;display:inline-block;position:relative}.combox_input{border:0;padding-left:5px;width:85%;vertical-align:middle}.form-inline .combox_input.form-control{width:85%}.combox_button{width:12%;color:#666;text-align:center;vertical-align:middle;cursor:pointer;border-left:1px solid #c2c2c2}ul.combox_select{border-top:0;padding:0;position:absolute;left:-1px;top:20px;display:none;background:#fff;max-height:300px;overflow-y:auto}ul.combox_select li{overflow:hidden;height:30px;line-height:30px;cursor:pointer}ul.combox_select li a{display:block;line-height:28px;padding:0 8px;text-decoration:none;color:#666}ul.combox_select li a:hover{text-decoration:none;background:#f5f5f5}#combox-appanme.combox_border,#combox-appanme .combox_select{width:158px}#combox-appanme .form-control{height:30px}input.error,textarea.error{border:1px solid red}.form-inline .form-group{position:relative}label.error{margin:4px 0;color:red;font-weight:400;position:absolute;right:15px;bottom:-26px}ins{background-color:#c6ffc6;text-decoration:none}del{background-color:#ffc6c6}form.vertical-margin-lg .form-group{margin-bottom:22px}.namespacewrapper{padding:5px 15px;overflow:hidden;background-color:#efefef}.xrange-container{position:relative;border:1px solid #ccc;margin:0;padding:0}.xrange-container .cocofont,.xrange-container .iconfont{cursor:pointer}.xrange-container .label{display:flex;align-items:center;text-align:center;justify-content:space-between;cursor:pointer}.xrange-container .label.is-button{display:flex;border:1px solid #e6ebef;height:32px;padding:6px 12px;background-color:#f5f5f6}.xrange-container .label.is-button>i{font-size:13px}.xrange-container .label.is-empty{padding:0}.xrange-container .label.is-empty.is-button{padding:6px 12px}.xrange-container .label.is-empty>i{font-size:15px;margin-right:0}.xrange-container .label.is-empty>span,.xrange-container .label.is-empty b{display:none}.xrange-container .label>i{font-size:13px;text-align:center}.xrange-container .label>b{padding-top:3px}.xrange-container .label>span{min-width:100px;display:inline-flex;margin-bottom:8px}.xrange-layer{position:fixed;left:0;top:0;width:100%;height:100%;z-index:990;background-color:rgba(0,0,0,.05)}.xrange-panel{display:none;position:relative;right:1px;top:-8px;z-index:1000;border:1px solid #e6e7eb;border-radius:0;box-shadow:1px 1px 3px 0 transparent;width:111px;min-height:302px;background-color:#fff}.xrange-panel.visible{display:block}.xrange-panel .quick-list{display:flex;flex-direction:column;justify-content:space-around;box-sizing:content-box!important;align-items:center}.xrange-panel .quick-list>span{flex:0 0 auto;width:100%;line-height:20px;padding:6px 0 6px 27px;font-size:12px;-webkit-user-select:none;cursor:pointer}.xrange-panel .quick-list>span+span{margin-left:0}.xrange-panel .quick-list>span.active{background-color:#f2f3f7;color:#333;cursor:default}.xrange-panel .xrange-panel-footer{display:flex;align-items:center;justify-content:space-between;height:60px;background-color:#fff;position:absolute;top:300px;left:-539px;min-width:648px;padding:12px 108px 12px 12px}.xrange-panel .xrange-panel-footer .fn-left,.xrange-panel .xrange-panel-footer .fn-right{flex:0 0 auto}.xrange-panel .xrange-panel-footer button+button{margin-left:8px}.xrange-panel .picker-container{display:none;position:relative;margin-top:16px}.xrange-panel .picker-container .next-range-picker-panel{top:-273px!important;left:-540px!important;position:absolute!important;animation:none!important;z-index:999999;border-color:#e6ebef}.next-calendar-card .next-calendar-range-body{background:#fff!important;min-height:227px!important}.xrange-panel .picker-container+.next-range-picker{display:none}.xrange-panel .picker-container .next-date-picker-quick-tool{display:none!important}.xrange-panel.show-picker .picker-container{display:block;min-height:5px}.dingding{background:url(https://g.alicdn.com/cm-design/arms/1.1.27/styles/arms/images/dingding.png) no-repeat 0}.dingding,.wangwang{display:inline-block;padding:5px 0 5px 30px;height:24px;vertical-align:middle}.wangwang{background:url(https://g.alicdn.com/cm-design/arms/1.1.27/styles/arms/images/wangwang.png) no-repeat 0;background-size:24px}@media screen and (min-width:768px){.region-group-list{max-width:784px}}@media screen and (min-width:992px){.region-group-list{max-width:862px}}@media screen and (min-width:1200px){.region-group-list{max-width:600px}}@media screen and (min-width:1330px){.region-group-list{max-width:700px}}@media screen and (min-width:1500px){.region-group-list{max-width:1000px}}.next-switch-medium{border:1px solid transparent;width:48px!important;height:26px!important;border-radius:15px!important}.next-switch-medium>.next-switch-trigger{border:1px solid transparent;position:absolute;left:33px!important;width:24px!important;height:24px!important;border-radius:15px!important}.aliyun-advice{bottom:98px!important}.next-switch-medium>.next-switch-children{font-size:12px!important;position:absolute;height:24px!important;line-height:24px!important}.next-switch-on>.next-switch-trigger{box-shadow:1px 1px 3px 0 rgba(0,0,0,.32)!important;background-color:#fff;border-color:transparent;position:absolute;right:0!important}.next-switch-on>.next-switch-children{left:2px!important;font-size:12px!important}.next-switch-on[disabled]>.next-switch-trigger{position:absolute;right:0!important;box-shadow:1px 1px 3px 0 rgba(0,0,0,.32)!important;background-color:#e6e7eb;border-color:transparent}.next-switch-off>.next-switch-children{right:-6px;color:#979a9c!important}.next-switch-off[disabled]>.next-switch-trigger{left:0!important;box-shadow:1px 1px 3px 0 rgba(0,0,0,.32)!important;background-color:#e6e7eb;border-color:transparent}.next-switch-off>.next-switch-trigger{left:0!important;box-shadow:1px 1px 3px 0 rgba(0,0,0,.32);background-color:#fff;border-color:transparent}.next-switch-off,.next-switch-on{width:58px!important}.next-switch-on{position:relative}.next-menu .next-menu-icon-select{position:absolute;left:4px;top:0;color:#73777a!important}.next-table-cell-wrapper{hyphens:auto!important;word-break:break-word!important}.dash-page-container{height:100%;min-width:980px}.dash-page-container:after{content:"";display:table;clear:both}.dash-left-container{position:relative;float:left;width:77.52%;height:100%}.dash-title-show{width:100%;height:106px;background-color:#fff;box-shadow:0 0 0 0 hsla(0,0%,85.1%,.5),0 0 2px 0 rgba(0,0,0,.12);margin-bottom:19px;padding-top:20px;padding-bottom:20px;overflow:hidden}.dash-title-item{float:left;height:49px;width:33%;border-right:1px solid #ebecec;line-height:49px;padding-left:30px;padding-right:30px}.dash-title-word{height:19px;line-height:19px;font-size:14px;color:#73777a}.dash-title-num{height:45px;font-size:32px}.dash-title-item:last-child{border:none!important}.dash-menu-list{width:100%;height:104px;background-color:#fff;box-shadow:0 0 0 0 hsla(0,0%,85.1%,.5),0 0 2px 0 rgba(0,0,0,.12);margin-bottom:19px}.dash-menu-item{position:relative;float:left;width:33.33%;border-right:1px solid #eee;height:100%;padding-top:20px;padding-bottom:20px;cursor:pointer}.dash-menu-item.disabled{cursor:not-allowed;opacity:.7}.dash-menu-item:last-child{border:none}.dash-menu-item:hover{box-shadow:0 3px 6px 0 rgba(0,0,0,.12)}.dash-menu-conent-wrapper{padding-left:60px;padding-right:40px}.dash-menu-pic{position:absolute;width:32px;left:20px}.dash-menu-content-title{height:19px;line-height:19px;color:#373d41;margin-bottom:5px}.dash-menu-content-word{font-size:12px;color:#73777a}.dash-scene-wrapper{width:100%;background-color:#fff;box-shadow:0 0 0 0 hsla(0,0%,85.1%,.5),0 0 2px 0 rgba(0,0,0,.12);margin-bottom:20px}.dash-scene-title{position:relative;padding-left:20px;height:50px;line-height:50px;border-bottom:1px solid #f0f0f0}.dash-sceneitem{width:100%;height:80px;padding-top:24px}.dash-scenitem-out{border-bottom:1px solid #eee;height:100%}.dash-sceneitem:hover{box-shadow:0 0 0 0 hsla(0,0%,85.1%,.5),0 0 4px 0 rgba(0,0,0,.12);border-bottom:1px solid #f0f0f0}.dash-sceneitem-progresswrapper{position:relative;width:256px;height:6px}.dash-sceneitem-progresswrapper.green{background-color:#e2f5cf}.dash-sceneitem-progresswrapper.red{background-color:#ffe6e5}.dash-sceneitem-progresswrapper.green .dash-sceneitem-progressinner{height:100%;background-color:#a6e22e}.dash-sceneitem-progresswrapper.red .dash-sceneitem-progressinner{height:100%;background-color:#eb4c4d}.dash-sceneitem-iconshow{position:absolute;right:0;top:5px}.dash-sceneitem:hover.dash-sceneitem-out{border:none}.dash-sceneitem:after{display:table;content:"";clear:both}.dash-sceneitem-title{float:left;height:32.8px;padding-top:5px;width:14.47%;border-right:1px solid #f0f0f0;overflow:hidden;text-overflow:ellipsis}.scene-nomore-data{position:absolute;text-align:center;left:0;right:0;color:#eee;font-size:12px}.dash-sceneitem-content{position:relative;float:left;padding-top:5px;padding-left:30px;width:85.53%}.scene-title-link{position:absolute;right:20px;top:0;font-size:10px}.dash-bottom-show{width:100%;height:42px;line-height:42px;margin-top:18px;text-align:center;background-color:#fff;box-shadow:0 0 0 0 hsla(0,0%,85.1%,.5),0 0 2px 0 rgba(0,0,0,.12)}.dash-right-container{float:right;height:100%;width:22.44%;padding:10px;background-color:#fff}.dash-bottom-item,.dash-vl{color:#979a9c;margin-right:10px}.dash-doc{background-color:#fff;height:178px;width:100%;margin-bottom:14px}.dash-doc-title{width:100%;height:68px;line-height:68px;padding-left:20px;padding-right:20px;border-bottom:1px solid #eee}.dash-doc-content{width:100%;padding:15px}.dash-card-contentwrappers{width:100%;height:230px;margin-bottom:14px;background-color:#fff;border:1px solid #eee;box-shadow:0 0 0 0 hsla(0,0%,85.1%,.5),0 0 2px 0 rgba(0,0,0,.12)}.dash-card-title{width:100%;height:39px;line-height:39px;margin:0;padding-left:24px;padding-right:24px;color:#4a4a4a;border-bottom:1px solid #eee}.dash-card-contentlist{padding:20px}.dash-card-contentitem{position:relative;text-align:left;font-size:12px;margin-bottom:10px}.next-slick-dots-item button{height:4px!important;width:35px!important;border-radius:10px!important}.next-table-row.hovered{background-color:#f5f7f9!important}.alert-success-text{color:#4a4a4a;font-size:14px;margin:10px 0}.alert-success{border-color:#e0e0e0!important}.row-bg-green{background-color:#e4fdda}.row-bg-light-green{background-color:#e3fff8}.row-bg-orange{background-color:#fff3e0}.row-bg-red{background-color:#ffece4}/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}[hidden],template{display:none}*,:after,:before{box-sizing:border-box}ol,ul{list-style:none;margin:0;padding:0}li{margin-left:0}hr{border:solid #e6e6e6;border-width:1px 0 0}a{text-decoration:none}a:link{color:#298dff}a:visited{color:#4a83c5}a:active,a:hover{color:#2580e7}a:active{text-decoration:underline}@font-face{font-family:Roboto;src:url(../console-ui/public/fonts/roboto-thin.eot);src:url(../console-ui/public/fonts/roboto-thin.eot?#iefix) format("embedded-opentype"),url(../console-ui/public/fonts/roboto-thin.woff2) format("woff2"),url(../console-ui/public/fonts/roboto-thin.woff) format("woff"),url(../console-ui/public/fonts/roboto-thin.ttf) format("truetype");font-weight:200;font-display:swap}@font-face{font-family:Roboto;src:url(../console-ui/public/fonts/roboto-light.eot);src:url(../console-ui/public/fonts/roboto-light.eot?#iefix) format("embedded-opentype"),url(../console-ui/public/fonts/roboto-light.woff2) format("woff2"),url(../console-ui/public/fonts/roboto-light.woff) format("woff"),url(../console-ui/public/fonts/roboto-light.ttf) format("truetype");font-weight:300;font-display:swap}@font-face{font-family:Roboto;src:url(../console-ui/public/fonts/roboto-regular.eot);src:url(../console-ui/public/fonts/roboto-regular.eot?#iefix) format("embedded-opentype"),url(../console-ui/public/fonts/roboto-regular.woff2) format("woff2"),url(../console-ui/public/fonts/roboto-regular.woff) format("woff"),url(../console-ui/public/fonts/roboto-regular.ttf) format("truetype");font-weight:400;font-display:swap}@font-face{font-family:Roboto;src:url(../console-ui/public/fonts/roboto-medium.eot);src:url(../console-ui/public/fonts/roboto-medium.eot?#iefix) format("embedded-opentype"),url(../console-ui/public/fonts/roboto-medium.woff2) format("woff2"),url(../console-ui/public/fonts/roboto-medium.woff) format("woff"),url(../console-ui/public/fonts/roboto-medium.ttf) format("truetype");font-weight:500;font-display:swap}@font-face{font-family:Roboto;src:url(../console-ui/public/fonts/roboto-bold.eot);src:url(../console-ui/public/fonts/roboto-bold.eot?#iefix) format("embedded-opentype"),url(../console-ui/public/fonts/roboto-bold.woff2) format("woff2"),url(../console-ui/public/fonts/roboto-bold.woff) format("woff"),url(../console-ui/public/fonts/roboto-bold.ttf) format("truetype");font-weight:700;font-display:swap}html{font-size:100%}body{font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142;color:#333}button,input,optgroup,select,textarea{font-family:inherit}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}h1{margin-bottom:12px;font-size:24px;line-height:36px}h1,h2{font-weight:500}h2{margin-bottom:10px;font-size:20px;line-height:30px}h3,h4{margin-bottom:8px;font-size:16px}h3,h4,h5{font-weight:400;line-height:24px}h5{margin-bottom:7px;font-size:14px}h6{font-weight:500}h6,p{margin-bottom:7px;font-size:14px;line-height:20px}p{font-weight:400}strong{font-weight:500}small{font-size:75%}@-webkit-keyframes fadeIn{0%{opacity:0}to{opacity:1}}@-moz-keyframes fadeIn{0%{opacity:0}to{opacity:1}}@-ms-keyframes fadeIn{0%{opacity:0}to{opacity:1}}@-o-keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-100px);-moz-transform:translateY(-100px);-ms-transform:translateY(-100px);-o-transform:translateY(-100px);transform:translateY(-100px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-100px);-moz-transform:translateY(-100px);-ms-transform:translateY(-100px);-o-transform:translateY(-100px);transform:translateY(-100px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-ms-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-100px);-moz-transform:translateY(-100px);-ms-transform:translateY(-100px);-o-transform:translateY(-100px);transform:translateY(-100px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-o-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-100px);-moz-transform:translateY(-100px);-ms-transform:translateY(-100px);-o-transform:translateY(-100px);transform:translateY(-100px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-100px);-moz-transform:translateY(-100px);-ms-transform:translateY(-100px);-o-transform:translateY(-100px);transform:translateY(-100px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes fadeInDownSmall{0%{opacity:0;-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);-ms-transform:translateY(-8px);-o-transform:translateY(-8px);transform:translateY(-8px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes fadeInDownSmall{0%{opacity:0;-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);-ms-transform:translateY(-8px);-o-transform:translateY(-8px);transform:translateY(-8px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-ms-keyframes fadeInDownSmall{0%{opacity:0;-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);-ms-transform:translateY(-8px);-o-transform:translateY(-8px);transform:translateY(-8px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-o-keyframes fadeInDownSmall{0%{opacity:0;-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);-ms-transform:translateY(-8px);-o-transform:translateY(-8px);transform:translateY(-8px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInDownSmall{0%{opacity:0;-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);-ms-transform:translateY(-8px);-o-transform:translateY(-8px);transform:translateY(-8px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(-20px);-moz-transform:translateX(-20px);-ms-transform:translateX(-20px);-o-transform:translateX(-20px);transform:translateX(-20px)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-moz-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(-20px);-moz-transform:translateX(-20px);-ms-transform:translateX(-20px);-o-transform:translateX(-20px);transform:translateX(-20px)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-ms-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(-20px);-moz-transform:translateX(-20px);-ms-transform:translateX(-20px);-o-transform:translateX(-20px);transform:translateX(-20px)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-o-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(-20px);-moz-transform:translateX(-20px);-ms-transform:translateX(-20px);-o-transform:translateX(-20px);transform:translateX(-20px)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(-20px);-moz-transform:translateX(-20px);-ms-transform:translateX(-20px);-o-transform:translateX(-20px);transform:translateX(-20px)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);-o-transform:translateX(20px);transform:translateX(20px)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-moz-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);-o-transform:translateX(20px);transform:translateX(20px)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-ms-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);-o-transform:translateX(20px);transform:translateX(20px)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-o-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);-o-transform:translateX(20px);transform:translateX(20px)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);-o-transform:translateX(20px);transform:translateX(20px)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(24px);-moz-transform:translateY(24px);-ms-transform:translateY(24px);-o-transform:translateY(24px);transform:translateY(24px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(24px);-moz-transform:translateY(24px);-ms-transform:translateY(24px);-o-transform:translateY(24px);transform:translateY(24px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-ms-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(24px);-moz-transform:translateY(24px);-ms-transform:translateY(24px);-o-transform:translateY(24px);transform:translateY(24px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-o-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(24px);-moz-transform:translateY(24px);-ms-transform:translateY(24px);-o-transform:translateY(24px);transform:translateY(24px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(24px);-moz-transform:translateY(24px);-ms-transform:translateY(24px);-o-transform:translateY(24px);transform:translateY(24px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes fadeOut{0%{opacity:1}to{opacity:0}}@-moz-keyframes fadeOut{0%{opacity:1}to{opacity:0}}@-ms-keyframes fadeOut{0%{opacity:1}to{opacity:0}}@-o-keyframes fadeOut{0%{opacity:1}to{opacity:0}}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(20px);-moz-transform:translateY(20px);-ms-transform:translateY(20px);-o-transform:translateY(20px);transform:translateY(20px)}}@-moz-keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(20px);-moz-transform:translateY(20px);-ms-transform:translateY(20px);-o-transform:translateY(20px);transform:translateY(20px)}}@-ms-keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(20px);-moz-transform:translateY(20px);-ms-transform:translateY(20px);-o-transform:translateY(20px);transform:translateY(20px)}}@-o-keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(20px);-moz-transform:translateY(20px);-ms-transform:translateY(20px);-o-transform:translateY(20px);transform:translateY(20px)}}@keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(20px);-moz-transform:translateY(20px);-ms-transform:translateY(20px);-o-transform:translateY(20px);transform:translateY(20px)}}@-webkit-keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(-20px);-moz-transform:translateX(-20px);-ms-transform:translateX(-20px);-o-transform:translateX(-20px);transform:translateX(-20px)}}@-moz-keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(-20px);-moz-transform:translateX(-20px);-ms-transform:translateX(-20px);-o-transform:translateX(-20px);transform:translateX(-20px)}}@-ms-keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(-20px);-moz-transform:translateX(-20px);-ms-transform:translateX(-20px);-o-transform:translateX(-20px);transform:translateX(-20px)}}@-o-keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(-20px);-moz-transform:translateX(-20px);-ms-transform:translateX(-20px);-o-transform:translateX(-20px);transform:translateX(-20px)}}@keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(-20px);-moz-transform:translateX(-20px);-ms-transform:translateX(-20px);-o-transform:translateX(-20px);transform:translateX(-20px)}}@-webkit-keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);-o-transform:translateX(20px);transform:translateX(20px)}}@-moz-keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);-o-transform:translateX(20px);transform:translateX(20px)}}@-ms-keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);-o-transform:translateX(20px);transform:translateX(20px)}}@-o-keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);-o-transform:translateX(20px);transform:translateX(20px)}}@keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);-o-transform:translateX(20px);transform:translateX(20px)}}@-webkit-keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-24px);-moz-transform:translateY(-24px);-ms-transform:translateY(-24px);-o-transform:translateY(-24px);transform:translateY(-24px)}}@-moz-keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-24px);-moz-transform:translateY(-24px);-ms-transform:translateY(-24px);-o-transform:translateY(-24px);transform:translateY(-24px)}}@-ms-keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-24px);-moz-transform:translateY(-24px);-ms-transform:translateY(-24px);-o-transform:translateY(-24px);transform:translateY(-24px)}}@-o-keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-24px);-moz-transform:translateY(-24px);-ms-transform:translateY(-24px);-o-transform:translateY(-24px);transform:translateY(-24px)}}@keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-24px);-moz-transform:translateY(-24px);-ms-transform:translateY(-24px);-o-transform:translateY(-24px);transform:translateY(-24px)}}@-webkit-keyframes fadeOutUpSmall{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);-ms-transform:translateY(-8px);-o-transform:translateY(-8px);transform:translateY(-8px)}}@-moz-keyframes fadeOutUpSmall{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);-ms-transform:translateY(-8px);-o-transform:translateY(-8px);transform:translateY(-8px)}}@-ms-keyframes fadeOutUpSmall{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);-ms-transform:translateY(-8px);-o-transform:translateY(-8px);transform:translateY(-8px)}}@-o-keyframes fadeOutUpSmall{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);-ms-transform:translateY(-8px);-o-transform:translateY(-8px);transform:translateY(-8px)}}@keyframes fadeOutUpSmall{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);-ms-transform:translateY(-8px);-o-transform:translateY(-8px);transform:translateY(-8px)}}@-webkit-keyframes slideOutDown{0%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(2000px);-moz-transform:translateY(2000px);-ms-transform:translateY(2000px);-o-transform:translateY(2000px);transform:translateY(2000px)}}@-moz-keyframes slideOutDown{0%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(2000px);-moz-transform:translateY(2000px);-ms-transform:translateY(2000px);-o-transform:translateY(2000px);transform:translateY(2000px)}}@-ms-keyframes slideOutDown{0%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(2000px);-moz-transform:translateY(2000px);-ms-transform:translateY(2000px);-o-transform:translateY(2000px);transform:translateY(2000px)}}@-o-keyframes slideOutDown{0%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(2000px);-moz-transform:translateY(2000px);-ms-transform:translateY(2000px);-o-transform:translateY(2000px);transform:translateY(2000px)}}@keyframes slideOutDown{0%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(2000px);-moz-transform:translateY(2000px);-ms-transform:translateY(2000px);-o-transform:translateY(2000px);transform:translateY(2000px)}}@-webkit-keyframes slideOutLeft{0%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(-2000px);-moz-transform:translateX(-2000px);-ms-transform:translateX(-2000px);-o-transform:translateX(-2000px);transform:translateX(-2000px)}}@-moz-keyframes slideOutLeft{0%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(-2000px);-moz-transform:translateX(-2000px);-ms-transform:translateX(-2000px);-o-transform:translateX(-2000px);transform:translateX(-2000px)}}@-ms-keyframes slideOutLeft{0%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(-2000px);-moz-transform:translateX(-2000px);-ms-transform:translateX(-2000px);-o-transform:translateX(-2000px);transform:translateX(-2000px)}}@-o-keyframes slideOutLeft{0%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(-2000px);-moz-transform:translateX(-2000px);-ms-transform:translateX(-2000px);-o-transform:translateX(-2000px);transform:translateX(-2000px)}}@keyframes slideOutLeft{0%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(-2000px);-moz-transform:translateX(-2000px);-ms-transform:translateX(-2000px);-o-transform:translateX(-2000px);transform:translateX(-2000px)}}@-webkit-keyframes slideOutRight{0%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(2000px);-moz-transform:translateX(2000px);-ms-transform:translateX(2000px);-o-transform:translateX(2000px);transform:translateX(2000px)}}@-moz-keyframes slideOutRight{0%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(2000px);-moz-transform:translateX(2000px);-ms-transform:translateX(2000px);-o-transform:translateX(2000px);transform:translateX(2000px)}}@-ms-keyframes slideOutRight{0%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(2000px);-moz-transform:translateX(2000px);-ms-transform:translateX(2000px);-o-transform:translateX(2000px);transform:translateX(2000px)}}@-o-keyframes slideOutRight{0%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(2000px);-moz-transform:translateX(2000px);-ms-transform:translateX(2000px);-o-transform:translateX(2000px);transform:translateX(2000px)}}@keyframes slideOutRight{0%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(2000px);-moz-transform:translateX(2000px);-ms-transform:translateX(2000px);-o-transform:translateX(2000px);transform:translateX(2000px)}}@-webkit-keyframes slideOutUp{0%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-2000px);-moz-transform:translateY(-2000px);-ms-transform:translateY(-2000px);-o-transform:translateY(-2000px);transform:translateY(-2000px)}}@-moz-keyframes slideOutUp{0%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-2000px);-moz-transform:translateY(-2000px);-ms-transform:translateY(-2000px);-o-transform:translateY(-2000px);transform:translateY(-2000px)}}@-ms-keyframes slideOutUp{0%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-2000px);-moz-transform:translateY(-2000px);-ms-transform:translateY(-2000px);-o-transform:translateY(-2000px);transform:translateY(-2000px)}}@-o-keyframes slideOutUp{0%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-2000px);-moz-transform:translateY(-2000px);-ms-transform:translateY(-2000px);-o-transform:translateY(-2000px);transform:translateY(-2000px)}}@keyframes slideOutUp{0%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-2000px);-moz-transform:translateY(-2000px);-ms-transform:translateY(-2000px);-o-transform:translateY(-2000px);transform:translateY(-2000px)}}@-webkit-keyframes slideInDown{0%{opacity:0;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes slideInDown{0%{opacity:0;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-ms-keyframes slideInDown{0%{opacity:0;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-o-keyframes slideInDown{0%{opacity:0;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@keyframes slideInDown{0%{opacity:0;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes slideInLeft{0%{opacity:0;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-moz-keyframes slideInLeft{0%{opacity:0;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-ms-keyframes slideInLeft{0%{opacity:0;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-o-keyframes slideInLeft{0%{opacity:0;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@keyframes slideInLeft{0%{opacity:0;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideInRight{0%{opacity:0;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-moz-keyframes slideInRight{0%{opacity:0;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-ms-keyframes slideInRight{0%{opacity:0;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-o-keyframes slideInRight{0%{opacity:0;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@keyframes slideInRight{0%{opacity:0;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideInUp{0%{opacity:0;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes slideInUp{0%{opacity:0;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-ms-keyframes slideInUp{0%{opacity:0;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-o-keyframes slideInUp{0%{opacity:0;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@keyframes slideInUp{0%{opacity:0;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-moz-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);-o-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@-moz-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-moz-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);-o-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@-ms-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-moz-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);-o-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@-o-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-moz-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);-o-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-moz-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);-o-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@-webkit-keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-moz-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);-o-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}@-moz-keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-moz-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);-o-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}@-ms-keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-moz-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);-o-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}@-o-keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-moz-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);-o-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}@keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-moz-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);-o-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}@-webkit-keyframes zoomInBig{0%{opacity:0;-webkit-transform:scale(.9);-moz-transform:scale(.9);-ms-transform:scale(.9);-o-transform:scale(.9);transform:scale(.9)}to{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-moz-keyframes zoomInBig{0%{opacity:0;-webkit-transform:scale(.9);-moz-transform:scale(.9);-ms-transform:scale(.9);-o-transform:scale(.9);transform:scale(.9)}to{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-ms-keyframes zoomInBig{0%{opacity:0;-webkit-transform:scale(.9);-moz-transform:scale(.9);-ms-transform:scale(.9);-o-transform:scale(.9);transform:scale(.9)}to{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-o-keyframes zoomInBig{0%{opacity:0;-webkit-transform:scale(.9);-moz-transform:scale(.9);-ms-transform:scale(.9);-o-transform:scale(.9);transform:scale(.9)}to{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@keyframes zoomInBig{0%{opacity:0;-webkit-transform:scale(.9);-moz-transform:scale(.9);-ms-transform:scale(.9);-o-transform:scale(.9);transform:scale(.9)}to{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-webkit-keyframes zoomOutBig{0%{opacity:1}to{opacity:0;-webkit-transform:scale(.8);-moz-transform:scale(.8);-ms-transform:scale(.8);-o-transform:scale(.8);transform:scale(.8)}}@-moz-keyframes zoomOutBig{0%{opacity:1}to{opacity:0;-webkit-transform:scale(.8);-moz-transform:scale(.8);-ms-transform:scale(.8);-o-transform:scale(.8);transform:scale(.8)}}@-ms-keyframes zoomOutBig{0%{opacity:1}to{opacity:0;-webkit-transform:scale(.8);-moz-transform:scale(.8);-ms-transform:scale(.8);-o-transform:scale(.8);transform:scale(.8)}}@-o-keyframes zoomOutBig{0%{opacity:1}to{opacity:0;-webkit-transform:scale(.8);-moz-transform:scale(.8);-ms-transform:scale(.8);-o-transform:scale(.8);transform:scale(.8)}}@keyframes zoomOutBig{0%{opacity:1}to{opacity:0;-webkit-transform:scale(.8);-moz-transform:scale(.8);-ms-transform:scale(.8);-o-transform:scale(.8);transform:scale(.8)}}@-webkit-keyframes expandInDown{0%{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}to{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}}@-moz-keyframes expandInDown{0%{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}to{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}}@-ms-keyframes expandInDown{0%{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}to{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}}@-o-keyframes expandInDown{0%{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}to{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}}@keyframes expandInDown{0%{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}to{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}}@-webkit-keyframes expandInUp{0%{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}}@-moz-keyframes expandInUp{0%{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}}@-ms-keyframes expandInUp{0%{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}}@-o-keyframes expandInUp{0%{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}}@keyframes expandInUp{0%{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}}@-webkit-keyframes expandInWithFade{0%{opacity:0}40%{opacity:.1}50%{opacity:.9}to{opacity:1}}@-moz-keyframes expandInWithFade{0%{opacity:0}40%{opacity:.1}50%{opacity:.9}to{opacity:1}}@-ms-keyframes expandInWithFade{0%{opacity:0}40%{opacity:.1}50%{opacity:.9}to{opacity:1}}@-o-keyframes expandInWithFade{0%{opacity:0}40%{opacity:.1}50%{opacity:.9}to{opacity:1}}@keyframes expandInWithFade{0%{opacity:0}40%{opacity:.1}50%{opacity:.9}to{opacity:1}}@-webkit-keyframes expandOutUp{0%{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}to{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}}@-moz-keyframes expandOutUp{0%{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}to{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}}@-ms-keyframes expandOutUp{0%{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}to{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}}@-o-keyframes expandOutUp{0%{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}to{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}}@keyframes expandOutUp{0%{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}to{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}}@-webkit-keyframes expandOutDown{0%{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}}@-moz-keyframes expandOutDown{0%{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}}@-ms-keyframes expandOutDown{0%{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}}@-o-keyframes expandOutDown{0%{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}}@keyframes expandOutDown{0%{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}}@-webkit-keyframes expandOutWithFade{0%{opacity:1}70%{opacity:0}to{opacity:0}}@-moz-keyframes expandOutWithFade{0%{opacity:1}70%{opacity:0}to{opacity:0}}@-ms-keyframes expandOutWithFade{0%{opacity:1}70%{opacity:0}to{opacity:0}}@-o-keyframes expandOutWithFade{0%{opacity:1}70%{opacity:0}to{opacity:0}}@keyframes expandOutWithFade{0%{opacity:1}70%{opacity:0}to{opacity:0}}@-webkit-keyframes pulse{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}20%{-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}to{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-moz-keyframes pulse{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}20%{-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}to{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-ms-keyframes pulse{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}20%{-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}to{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-o-keyframes pulse{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}20%{-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}to{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@keyframes pulse{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}20%{-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}to{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}.fadeIn{-webkit-animation-name:fadeIn;-moz-animation-name:fadeIn;-ms-animation-name:fadeIn;-o-animation-name:fadeIn;animation-name:fadeIn;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.fadeInDown{-webkit-animation-name:fadeInDown;-moz-animation-name:fadeInDown;-ms-animation-name:fadeInDown;-o-animation-name:fadeInDown;animation-name:fadeInDown;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.fadeInDown,.fadeInLeft{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.fadeInLeft{-webkit-animation-name:fadeInLeft;-moz-animation-name:fadeInLeft;-ms-animation-name:fadeInLeft;-o-animation-name:fadeInLeft;animation-name:fadeInLeft;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.fadeInRight{-webkit-animation-name:fadeInRight;-moz-animation-name:fadeInRight;-ms-animation-name:fadeInRight;-o-animation-name:fadeInRight;animation-name:fadeInRight;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.fadeInRight,.fadeInUp{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.fadeInUp{-webkit-animation-name:fadeInUp;-moz-animation-name:fadeInUp;-ms-animation-name:fadeInUp;-o-animation-name:fadeInUp;animation-name:fadeInUp;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.fadeOut{-webkit-animation-name:fadeOut;-moz-animation-name:fadeOut;-ms-animation-name:fadeOut;-o-animation-name:fadeOut;animation-name:fadeOut;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.35s;-moz-animation-duration:.35s;-ms-animation-duration:.35s;-o-animation-duration:.35s;animation-duration:.35s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.fadeOut,.fadeOutDown{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.fadeOutDown{-webkit-animation-name:fadeOutDown;-moz-animation-name:fadeOutDown;-ms-animation-name:fadeOutDown;-o-animation-name:fadeOutDown;animation-name:fadeOutDown;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.25s;-moz-animation-duration:.25s;-ms-animation-duration:.25s;-o-animation-duration:.25s;animation-duration:.25s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.fadeOutLeft{-webkit-animation-name:fadeOutLeft;-moz-animation-name:fadeOutLeft;-ms-animation-name:fadeOutLeft;-o-animation-name:fadeOutLeft;animation-name:fadeOutLeft;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.25s;-moz-animation-duration:.25s;-ms-animation-duration:.25s;-o-animation-duration:.25s;animation-duration:.25s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.fadeOutLeft,.fadeOutRight{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.fadeOutRight{-webkit-animation-name:fadeOutRight;-moz-animation-name:fadeOutRight;-ms-animation-name:fadeOutRight;-o-animation-name:fadeOutRight;animation-name:fadeOutRight;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.25s;-moz-animation-duration:.25s;-ms-animation-duration:.25s;-o-animation-duration:.25s;animation-duration:.25s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.fadeOutUp{-webkit-animation-name:fadeOutUp;-moz-animation-name:fadeOutUp;-ms-animation-name:fadeOutUp;-o-animation-name:fadeOutUp;animation-name:fadeOutUp;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.25s;-moz-animation-duration:.25s;-ms-animation-duration:.25s;-o-animation-duration:.25s;animation-duration:.25s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.slideInUp{-webkit-animation-name:slideInUp;-moz-animation-name:slideInUp;-ms-animation-name:slideInUp;-o-animation-name:slideInUp;animation-name:slideInUp;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.35s;-moz-animation-duration:.35s;-ms-animation-duration:.35s;-o-animation-duration:.35s;animation-duration:.35s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.slideInDown,.slideInUp{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.slideInDown{-webkit-animation-name:slideInDown;-moz-animation-name:slideInDown;-ms-animation-name:slideInDown;-o-animation-name:slideInDown;animation-name:slideInDown;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.35s;-moz-animation-duration:.35s;-ms-animation-duration:.35s;-o-animation-duration:.35s;animation-duration:.35s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.slideInLeft{-webkit-animation-name:slideInLeft;-moz-animation-name:slideInLeft;-ms-animation-name:slideInLeft;-o-animation-name:slideInLeft;animation-name:slideInLeft;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.35s;-moz-animation-duration:.35s;-ms-animation-duration:.35s;-o-animation-duration:.35s;animation-duration:.35s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.slideInLeft,.slideInRight{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.slideInRight{-webkit-animation-name:slideInRight;-moz-animation-name:slideInRight;-ms-animation-name:slideInRight;-o-animation-name:slideInRight;animation-name:slideInRight;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.35s;-moz-animation-duration:.35s;-ms-animation-duration:.35s;-o-animation-duration:.35s;animation-duration:.35s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.slideOutUp{-webkit-animation-name:slideOutUp;-moz-animation-name:slideOutUp;-ms-animation-name:slideOutUp;-o-animation-name:slideOutUp;animation-name:slideOutUp;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.slideOutRight,.slideOutUp{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.slideOutRight{-webkit-animation-name:slideOutRight;-moz-animation-name:slideOutRight;-ms-animation-name:slideOutRight;-o-animation-name:slideOutRight;animation-name:slideOutRight;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.slideOutLeft{-webkit-animation-name:slideOutLeft;-moz-animation-name:slideOutLeft;-ms-animation-name:slideOutLeft;-o-animation-name:slideOutLeft;animation-name:slideOutLeft;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.slideOutDown,.slideOutLeft{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.slideOutDown{-webkit-animation-name:slideOutDown;-moz-animation-name:slideOutDown;-ms-animation-name:slideOutDown;-o-animation-name:slideOutDown;animation-name:slideOutDown;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.zoomIn{-webkit-animation-name:zoomIn;-moz-animation-name:zoomIn;-ms-animation-name:zoomIn;-o-animation-name:zoomIn;animation-name:zoomIn;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.zoomIn,.zoomOut{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.zoomOut{-webkit-animation-name:zoomOut;-moz-animation-name:zoomOut;-ms-animation-name:zoomOut;-o-animation-name:zoomOut;animation-name:zoomOut;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.expandInDown{-webkit-animation-name:expandInDown;-moz-animation-name:expandInDown;-ms-animation-name:expandInDown;-o-animation-name:expandInDown;animation-name:expandInDown;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.expandInDown,.expandOutUp{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.expandOutUp{-webkit-animation-name:expandOutUp;-moz-animation-name:expandOutUp;-ms-animation-name:expandOutUp;-o-animation-name:expandOutUp;animation-name:expandOutUp;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.15s;-moz-animation-duration:.15s;-ms-animation-duration:.15s;-o-animation-duration:.15s;animation-duration:.15s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.expandInUp{-webkit-animation-name:expandInUp;-moz-animation-name:expandInUp;-ms-animation-name:expandInUp;-o-animation-name:expandInUp;animation-name:expandInUp;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.expandInUp,.expandOutDown{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.expandOutDown{-webkit-animation-name:expandOutDown;-moz-animation-name:expandOutDown;-ms-animation-name:expandOutDown;-o-animation-name:expandOutDown;animation-name:expandOutDown;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.15s;-moz-animation-duration:.15s;-ms-animation-duration:.15s;-o-animation-duration:.15s;animation-duration:.15s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.fadeInDownSmall{-webkit-animation-name:fadeInDownSmall;-moz-animation-name:fadeInDownSmall;-ms-animation-name:fadeInDownSmall;-o-animation-name:fadeInDownSmall;animation-name:fadeInDownSmall;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.fadeInDownSmall,.fadeOutUpSmall{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.fadeOutUpSmall{-webkit-animation-name:fadeOutUpSmall;-moz-animation-name:fadeOutUpSmall;-ms-animation-name:fadeOutUpSmall;-o-animation-name:fadeOutUpSmall;animation-name:fadeOutUpSmall;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.25s;-moz-animation-duration:.25s;-ms-animation-duration:.25s;-o-animation-duration:.25s;animation-duration:.25s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.zoomInBig{-webkit-animation-name:zoomInBig;-moz-animation-name:zoomInBig;-ms-animation-name:zoomInBig;-o-animation-name:zoomInBig;animation-name:zoomInBig;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.2s;-moz-animation-duration:.2s;-ms-animation-duration:.2s;-o-animation-duration:.2s;animation-duration:.2s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);-moz-animation-timing-function:cubic-bezier(0,0,.2,1);-ms-animation-timing-function:cubic-bezier(0,0,.2,1);-o-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.zoomInBig,.zoomOutBig{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.zoomOutBig{-webkit-animation-name:zoomOutBig;-moz-animation-name:zoomOutBig;-ms-animation-name:zoomOutBig;-o-animation-name:zoomOutBig;animation-name:zoomOutBig;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.2s;-moz-animation-duration:.2s;-ms-animation-duration:.2s;-o-animation-duration:.2s;animation-duration:.2s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);-moz-animation-timing-function:cubic-bezier(0,0,.2,1);-ms-animation-timing-function:cubic-bezier(0,0,.2,1);-o-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.pulse{-webkit-animation-name:pulse;-moz-animation-name:pulse;-ms-animation-name:pulse;-o-animation-name:pulse;animation-name:pulse;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.expand-enter{overflow:hidden}.expand-enter-active{transition:all .3s ease-out}.expand-enter-active>*{-webkit-animation-name:expandInWithFade;-moz-animation-name:expandInWithFade;-ms-animation-name:expandInWithFade;-o-animation-name:expandInWithFade;animation-name:expandInWithFade;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.2s;-moz-animation-duration:.2s;-ms-animation-duration:.2s;-o-animation-duration:.2s;animation-duration:.2s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:forwards;-moz-animation-fill-mode:forwards;-ms-animation-fill-mode:forwards;-o-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.expand-leave{overflow:hidden}.expand-leave-active{transition:all .2s ease-out}.expand-leave-active>*{-webkit-animation-name:expandOutWithFade;-moz-animation-name:expandOutWithFade;-ms-animation-name:expandOutWithFade;-o-animation-name:expandOutWithFade;animation-name:expandOutWithFade;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.2s;-moz-animation-duration:.2s;-ms-animation-duration:.2s;-o-animation-duration:.2s;animation-duration:.2s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:forwards;-moz-animation-fill-mode:forwards;-ms-animation-fill-mode:forwards;-o-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.next-icon[dir=rtl]:before{transform:rotateY(180deg)}@font-face{font-family:NextIcon;src:url(../console-ui/public/fonts/font_1533967_slipq25tezj.eot);src:url(../console-ui/public/fonts/font_1533967_slipq25tezj.eot?#iefix) format("embedded-opentype"),url(../console-ui/public/fonts/font_1533967_slipq25tezj.woff2) format("woff2"),url(../console-ui/public/fonts/font_1533967_slipq25tezj.woff) format("woff"),url(../console-ui/public/fonts/font_1533967_slipq25tezj.ttf) format("truetype"),url(../console-ui/public/fonts/font_1533967_slipq25tezj.svg#NextIcon) format("svg");font-display:swap}.next-icon{display:inline-block;font-family:NextIcon;font-style:normal;font-weight:400;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.next-icon:before{display:inline-block;vertical-align:middle;text-align:center}.next-icon-smile:before{content:"顧�"}.next-icon-cry:before{content:"顧�"}.next-icon-success:before{content:"顦�"}.next-icon-warning:before{content:"顦�"}.next-icon-prompt:before{content:"顦�"}.next-icon-error:before{content:"顦�"}.next-icon-help:before{content:"顧�"}.next-icon-clock:before{content:"顦�"}.next-icon-success-filling:before{content:"顦�"}.next-icon-delete-filling:before{content:"顦�"}.next-icon-favorites-filling:before{content:"顦�"}.next-icon-add:before{content:"顧�"}.next-icon-minus:before{content:"顦�"}.next-icon-arrow-up:before{content:"顦�"}.next-icon-arrow-down:before{content:"顦�"}.next-icon-arrow-left:before{content:"顦�"}.next-icon-arrow-right:before{content:"顦�"}.next-icon-arrow-double-left:before{content:"顧�"}.next-icon-arrow-double-right:before{content:"顧�"}.next-icon-switch:before{content:"顨�"}.next-icon-sorting:before{content:"顦�"}.next-icon-descending:before{content:"顦�"}.next-icon-ascending:before{content:"顦�"}.next-icon-select:before{content:"顦�"}.next-icon-semi-select:before{content:"顦�"}.next-icon-search:before{content:"顧�"}.next-icon-close:before{content:"顦�"}.next-icon-ellipsis:before{content:"顧�"}.next-icon-picture:before{content:"顦�"}.next-icon-calendar:before{content:"顦�"}.next-icon-ashbin:before{content:"顦�"}.next-icon-upload:before{content:"顭�"}.next-icon-download:before{content:"顦�"}.next-icon-set:before{content:"顨�"}.next-icon-edit:before{content:"顦�"}.next-icon-refresh:before{content:"顧�"}.next-icon-filter:before{content:"顦�"}.next-icon-attachment:before{content:"顧�"}.next-icon-account:before{content:"顦�"}.next-icon-email:before{content:"顦�"}.next-icon-atm:before{content:"顦�"}.next-icon-loading:before{content:"顧�";animation:loadingCircle 1s linear infinite}.next-icon-eye:before{content:"顦�"}.next-icon-copy:before{content:"顦�"}.next-icon-toggle-left:before{content:"顦�"}.next-icon-toggle-right:before{content:"顦�"}.next-icon-eye-close:before{content:"顦�"}.next-icon-unlock:before{content:"顦�"}.next-icon-lock:before{content:"顦�"}.next-icon-exit:before{content:"顦�"}.next-icon-chart-bar:before{content:"顦�"}.next-icon-chart-pie:before{content:"顦�"}.next-icon-form:before{content:"顭�"}.next-icon-detail:before{content:"顭�"}.next-icon-list:before{content:"顭�"}.next-icon-dashboard:before{content:"顭�"}.next-icon.next-xxs .next-icon-remote,.next-icon.next-xxs:before{width:8px;font-size:8px;line-height:inherit}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-icon.next-xxs{transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-icon.next-xxs:before{width:16px;font-size:16px}}.next-icon.next-xs .next-icon-remote,.next-icon.next-xs:before{width:12px;font-size:12px;line-height:inherit}.next-icon.next-small .next-icon-remote,.next-icon.next-small:before{width:16px;font-size:16px;line-height:inherit}.next-icon.next-medium .next-icon-remote,.next-icon.next-medium:before{width:20px;font-size:20px;line-height:inherit}.next-icon.next-large .next-icon-remote,.next-icon.next-large:before{width:24px;font-size:24px;line-height:inherit}.next-icon.next-xl .next-icon-remote,.next-icon.next-xl:before{width:32px;font-size:32px;line-height:inherit}.next-icon.next-xxl .next-icon-remote,.next-icon.next-xxl:before{width:48px;font-size:48px;line-height:inherit}.next-icon.next-xxxl .next-icon-remote,.next-icon.next-xxxl:before{width:64px;font-size:64px;line-height:inherit}.next-icon.next-inherit .next-icon-remote,.next-icon.next-inherit:before{width:inherit;font-size:inherit;line-height:inherit}.next-icon .next-icon-remote,.next-icon.next-inherit .next-icon-remote{width:1em;height:1em;vertical-align:middle;fill:currentColor}.next-overlay-wrapper .next-overlay-inner{z-index:1001}.next-overlay-wrapper .next-overlay-backdrop{position:fixed;z-index:1001;top:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.3);transition:opacity .3s cubic-bezier(.4,0,.2,1);opacity:0}.next-overlay-wrapper.opened .next-overlay-backdrop{opacity:1}.next-loading-fusion-reactor[dir=rtl]{-webkit-animation-name:nextVectorRouteRTL;-moz-animation-name:nextVectorRouteRTL;-ms-animation-name:nextVectorRouteRTL;-o-animation-name:nextVectorRouteRTL;animation-name:nextVectorRouteRTL}@-webkit-keyframes nextVectorRouteRTL{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}25%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}30%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}50%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}55%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}75%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}80%{-webkit-transform:rotate(-1turn);-moz-transform:rotate(-1turn);-ms-transform:rotate(-1turn);-o-transform:rotate(-1turn);transform:rotate(-1turn)}to{-webkit-transform:rotate(-1turn);-moz-transform:rotate(-1turn);-ms-transform:rotate(-1turn);-o-transform:rotate(-1turn);transform:rotate(-1turn)}}@-moz-keyframes nextVectorRouteRTL{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}25%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}30%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}50%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}55%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}75%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}80%{-webkit-transform:rotate(-1turn);-moz-transform:rotate(-1turn);-ms-transform:rotate(-1turn);-o-transform:rotate(-1turn);transform:rotate(-1turn)}to{-webkit-transform:rotate(-1turn);-moz-transform:rotate(-1turn);-ms-transform:rotate(-1turn);-o-transform:rotate(-1turn);transform:rotate(-1turn)}}@-ms-keyframes nextVectorRouteRTL{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}25%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}30%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}50%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}55%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}75%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}80%{-webkit-transform:rotate(-1turn);-moz-transform:rotate(-1turn);-ms-transform:rotate(-1turn);-o-transform:rotate(-1turn);transform:rotate(-1turn)}to{-webkit-transform:rotate(-1turn);-moz-transform:rotate(-1turn);-ms-transform:rotate(-1turn);-o-transform:rotate(-1turn);transform:rotate(-1turn)}}@-o-keyframes nextVectorRouteRTL{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}25%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}30%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}50%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}55%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}75%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}80%{-webkit-transform:rotate(-1turn);-moz-transform:rotate(-1turn);-ms-transform:rotate(-1turn);-o-transform:rotate(-1turn);transform:rotate(-1turn)}to{-webkit-transform:rotate(-1turn);-moz-transform:rotate(-1turn);-ms-transform:rotate(-1turn);-o-transform:rotate(-1turn);transform:rotate(-1turn)}}@keyframes nextVectorRouteRTL{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}25%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}30%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}50%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}55%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}75%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}80%{-webkit-transform:rotate(-1turn);-moz-transform:rotate(-1turn);-ms-transform:rotate(-1turn);-o-transform:rotate(-1turn);transform:rotate(-1turn)}to{-webkit-transform:rotate(-1turn);-moz-transform:rotate(-1turn);-ms-transform:rotate(-1turn);-o-transform:rotate(-1turn);transform:rotate(-1turn)}}.next-loading{position:relative}.next-loading.next-open{pointer-events:none}.next-loading .next-loading-component{opacity:.7;-webkit-filter:blur(1px);filter:blur(1px);filter:"progid:DXImageTransform.Microsoft.Blur(PixelRadius=1, MakeShadow=false)";position:relative;pointer-events:none}.next-loading-masker{position:absolute;top:0;bottom:0;left:0;right:0;z-index:99;opacity:.2;background:#fff}.next-loading-inline{display:inline-block}.next-loading-tip{display:block;position:absolute;top:50%;left:50%;z-index:4;transform:translate(-50%,-50%);text-align:center}.next-loading-tip-fullscreen{top:inherit;left:inherit;transform:inherit}.next-loading-tip-placeholder{display:none}.next-loading-right-tip .next-loading-indicator{display:inline-block}.next-loading-right-tip .next-loading-tip-content{position:absolute;display:block;top:50%;right:0;transform:translateY(-50%)}.next-loading-right-tip .next-loading-tip-placeholder{display:inline-block;visibility:hidden;margin-left:1em}.next-loading-fusion-reactor{display:inline-block;width:40px;height:40px;position:relative;margin:0;-webkit-animation-duration:5.6s;-moz-animation-duration:5.6s;-ms-animation-duration:5.6s;-o-animation-duration:5.6s;animation-duration:5.6s;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;-ms-animation-iteration-count:infinite;-o-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:linear;-moz-animation-timing-function:linear;-ms-animation-timing-function:linear;-o-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-name:nextVectorRoute;-moz-animation-name:nextVectorRoute;-ms-animation-name:nextVectorRoute;-o-animation-name:nextVectorRoute;animation-name:nextVectorRoute}.next-loading-fusion-reactor .next-loading-dot{position:absolute;margin:auto;width:12px;height:12px;border-radius:50%;background:#209bfa;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;-ms-animation-timing-function:ease-in-out;-o-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;-ms-animation-iteration-count:infinite;-o-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-duration:1.4s;-moz-animation-duration:1.4s;-ms-animation-duration:1.4s;-o-animation-duration:1.4s;animation-duration:1.4s}.next-loading-fusion-reactor .next-loading-dot:first-child{top:0;bottom:0;left:0;-webkit-animation-name:nextVectorDotsX;-moz-animation-name:nextVectorDotsX;-ms-animation-name:nextVectorDotsX;-o-animation-name:nextVectorDotsX;animation-name:nextVectorDotsX}.next-loading-fusion-reactor .next-loading-dot:nth-child(2){left:0;right:0;top:0;opacity:.8;-webkit-animation-name:nextVectorDotsY;-moz-animation-name:nextVectorDotsY;-ms-animation-name:nextVectorDotsY;-o-animation-name:nextVectorDotsY;animation-name:nextVectorDotsY}.next-loading-fusion-reactor .next-loading-dot:nth-child(3){top:0;bottom:0;right:0;opacity:.6;-webkit-animation-name:nextVectorDotsXR;-moz-animation-name:nextVectorDotsXR;-ms-animation-name:nextVectorDotsXR;-o-animation-name:nextVectorDotsXR;animation-name:nextVectorDotsXR}.next-loading-fusion-reactor .next-loading-dot:nth-child(4){left:0;right:0;bottom:0;opacity:.2;-webkit-animation-name:nextVectorDotsYR;-moz-animation-name:nextVectorDotsYR;-ms-animation-name:nextVectorDotsYR;-o-animation-name:nextVectorDotsYR;animation-name:nextVectorDotsYR}.next-loading-medium-fusion-reactor{width:24px;height:24px}.next-loading-medium-fusion-reactor .next-loading-dot{width:8px;height:8px}.next-loading-medium-fusion-reactor .next-loading-dot:first-child{-webkit-animation-name:nextVectorDotsX-medium;-moz-animation-name:nextVectorDotsX-medium;-ms-animation-name:nextVectorDotsX-medium;-o-animation-name:nextVectorDotsX-medium;animation-name:nextVectorDotsX-medium}.next-loading-medium-fusion-reactor .next-loading-dot:nth-child(2){-webkit-animation-name:nextVectorDotsY-medium;-moz-animation-name:nextVectorDotsY-medium;-ms-animation-name:nextVectorDotsY-medium;-o-animation-name:nextVectorDotsY-medium;animation-name:nextVectorDotsY-medium}.next-loading-medium-fusion-reactor .next-loading-dot:nth-child(3){-webkit-animation-name:nextVectorDotsXR-medium;-moz-animation-name:nextVectorDotsXR-medium;-ms-animation-name:nextVectorDotsXR-medium;-o-animation-name:nextVectorDotsXR-medium;animation-name:nextVectorDotsXR-medium}.next-loading-medium-fusion-reactor .next-loading-dot:nth-child(4){-webkit-animation-name:nextVectorDotsYR-medium;-moz-animation-name:nextVectorDotsYR-medium;-ms-animation-name:nextVectorDotsYR-medium;-o-animation-name:nextVectorDotsYR-medium;animation-name:nextVectorDotsYR-medium}@-webkit-keyframes nextVectorRoute{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}25%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}30%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}50%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}55%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}75%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}80%{-webkit-transform:rotate(1turn);-moz-transform:rotate(1turn);-ms-transform:rotate(1turn);-o-transform:rotate(1turn);transform:rotate(1turn)}to{-webkit-transform:rotate(1turn);-moz-transform:rotate(1turn);-ms-transform:rotate(1turn);-o-transform:rotate(1turn);transform:rotate(1turn)}}@-moz-keyframes nextVectorRoute{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}25%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}30%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}50%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}55%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}75%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}80%{-webkit-transform:rotate(1turn);-moz-transform:rotate(1turn);-ms-transform:rotate(1turn);-o-transform:rotate(1turn);transform:rotate(1turn)}to{-webkit-transform:rotate(1turn);-moz-transform:rotate(1turn);-ms-transform:rotate(1turn);-o-transform:rotate(1turn);transform:rotate(1turn)}}@-ms-keyframes nextVectorRoute{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}25%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}30%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}50%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}55%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}75%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}80%{-webkit-transform:rotate(1turn);-moz-transform:rotate(1turn);-ms-transform:rotate(1turn);-o-transform:rotate(1turn);transform:rotate(1turn)}to{-webkit-transform:rotate(1turn);-moz-transform:rotate(1turn);-ms-transform:rotate(1turn);-o-transform:rotate(1turn);transform:rotate(1turn)}}@-o-keyframes nextVectorRoute{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}25%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}30%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}50%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}55%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}75%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}80%{-webkit-transform:rotate(1turn);-moz-transform:rotate(1turn);-ms-transform:rotate(1turn);-o-transform:rotate(1turn);transform:rotate(1turn)}to{-webkit-transform:rotate(1turn);-moz-transform:rotate(1turn);-ms-transform:rotate(1turn);-o-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes nextVectorRoute{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}25%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}30%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}50%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}55%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}75%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}80%{-webkit-transform:rotate(1turn);-moz-transform:rotate(1turn);-ms-transform:rotate(1turn);-o-transform:rotate(1turn);transform:rotate(1turn)}to{-webkit-transform:rotate(1turn);-moz-transform:rotate(1turn);-ms-transform:rotate(1turn);-o-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes nextVectorDotsYR{25%{bottom:0}45%,50%{bottom:12.8px;height:14.4px;width:14.4px}90%{bottom:0;height:12px;width:12px}}@-moz-keyframes nextVectorDotsYR{25%{bottom:0}45%,50%{bottom:12.8px;height:14.4px;width:14.4px}90%{bottom:0;height:12px;width:12px}}@-ms-keyframes nextVectorDotsYR{25%{bottom:0}45%,50%{bottom:12.8px;height:14.4px;width:14.4px}90%{bottom:0;height:12px;width:12px}}@-o-keyframes nextVectorDotsYR{25%{bottom:0}45%,50%{bottom:12.8px;height:14.4px;width:14.4px}90%{bottom:0;height:12px;width:12px}}@keyframes nextVectorDotsYR{25%{bottom:0}45%,50%{bottom:12.8px;height:14.4px;width:14.4px}90%{bottom:0;height:12px;width:12px}}@-webkit-keyframes nextVectorDotsY{25%{top:0}45%,50%{top:12.8px;height:14.4px;width:14.4px}90%{top:0;height:12px;width:12px}}@-moz-keyframes nextVectorDotsY{25%{top:0}45%,50%{top:12.8px;height:14.4px;width:14.4px}90%{top:0;height:12px;width:12px}}@-ms-keyframes nextVectorDotsY{25%{top:0}45%,50%{top:12.8px;height:14.4px;width:14.4px}90%{top:0;height:12px;width:12px}}@-o-keyframes nextVectorDotsY{25%{top:0}45%,50%{top:12.8px;height:14.4px;width:14.4px}90%{top:0;height:12px;width:12px}}@keyframes nextVectorDotsY{25%{top:0}45%,50%{top:12.8px;height:14.4px;width:14.4px}90%{top:0;height:12px;width:12px}}@-webkit-keyframes nextVectorDotsX{25%{left:0}45%,50%{left:12.8px;width:14.4px;height:14.4px}90%{left:0;height:12px;width:12px}}@-moz-keyframes nextVectorDotsX{25%{left:0}45%,50%{left:12.8px;width:14.4px;height:14.4px}90%{left:0;height:12px;width:12px}}@-ms-keyframes nextVectorDotsX{25%{left:0}45%,50%{left:12.8px;width:14.4px;height:14.4px}90%{left:0;height:12px;width:12px}}@-o-keyframes nextVectorDotsX{25%{left:0}45%,50%{left:12.8px;width:14.4px;height:14.4px}90%{left:0;height:12px;width:12px}}@keyframes nextVectorDotsX{25%{left:0}45%,50%{left:12.8px;width:14.4px;height:14.4px}90%{left:0;height:12px;width:12px}}@-webkit-keyframes nextVectorDotsXR{25%{right:0}45%,50%{right:12.8px;width:14.4px;height:14.4px}90%{right:0;height:12px;width:12px}}@-moz-keyframes nextVectorDotsXR{25%{right:0}45%,50%{right:12.8px;width:14.4px;height:14.4px}90%{right:0;height:12px;width:12px}}@-ms-keyframes nextVectorDotsXR{25%{right:0}45%,50%{right:12.8px;width:14.4px;height:14.4px}90%{right:0;height:12px;width:12px}}@-o-keyframes nextVectorDotsXR{25%{right:0}45%,50%{right:12.8px;width:14.4px;height:14.4px}90%{right:0;height:12px;width:12px}}@keyframes nextVectorDotsXR{25%{right:0}45%,50%{right:12.8px;width:14.4px;height:14.4px}90%{right:0;height:12px;width:12px}}@-webkit-keyframes nextVectorDotsYR-medium{25%{bottom:0}45%,50%{bottom:7.2px;height:9.6px;width:9.6px}90%{bottom:0;height:8px;width:8px}}@-moz-keyframes nextVectorDotsYR-medium{25%{bottom:0}45%,50%{bottom:7.2px;height:9.6px;width:9.6px}90%{bottom:0;height:8px;width:8px}}@-ms-keyframes nextVectorDotsYR-medium{25%{bottom:0}45%,50%{bottom:7.2px;height:9.6px;width:9.6px}90%{bottom:0;height:8px;width:8px}}@-o-keyframes nextVectorDotsYR-medium{25%{bottom:0}45%,50%{bottom:7.2px;height:9.6px;width:9.6px}90%{bottom:0;height:8px;width:8px}}@keyframes nextVectorDotsYR-medium{25%{bottom:0}45%,50%{bottom:7.2px;height:9.6px;width:9.6px}90%{bottom:0;height:8px;width:8px}}@-webkit-keyframes nextVectorDotsY-medium{25%{top:0}45%,50%{top:7.2px;height:9.6px;width:9.6px}90%{top:0;height:8px;width:8px}}@-moz-keyframes nextVectorDotsY-medium{25%{top:0}45%,50%{top:7.2px;height:9.6px;width:9.6px}90%{top:0;height:8px;width:8px}}@-ms-keyframes nextVectorDotsY-medium{25%{top:0}45%,50%{top:7.2px;height:9.6px;width:9.6px}90%{top:0;height:8px;width:8px}}@-o-keyframes nextVectorDotsY-medium{25%{top:0}45%,50%{top:7.2px;height:9.6px;width:9.6px}90%{top:0;height:8px;width:8px}}@keyframes nextVectorDotsY-medium{25%{top:0}45%,50%{top:7.2px;height:9.6px;width:9.6px}90%{top:0;height:8px;width:8px}}@-webkit-keyframes nextVectorDotsX-medium{25%{left:0}45%,50%{left:7.2px;width:9.6px;height:9.6px}90%{left:0;height:8px;width:8px}}@-moz-keyframes nextVectorDotsX-medium{25%{left:0}45%,50%{left:7.2px;width:9.6px;height:9.6px}90%{left:0;height:8px;width:8px}}@-ms-keyframes nextVectorDotsX-medium{25%{left:0}45%,50%{left:7.2px;width:9.6px;height:9.6px}90%{left:0;height:8px;width:8px}}@-o-keyframes nextVectorDotsX-medium{25%{left:0}45%,50%{left:7.2px;width:9.6px;height:9.6px}90%{left:0;height:8px;width:8px}}@keyframes nextVectorDotsX-medium{25%{left:0}45%,50%{left:7.2px;width:9.6px;height:9.6px}90%{left:0;height:8px;width:8px}}@-webkit-keyframes nextVectorDotsXR-medium{25%{right:0}45%,50%{right:7.2px;width:9.6px;height:9.6px}90%{right:0;height:8px;width:8px}}@-moz-keyframes nextVectorDotsXR-medium{25%{right:0}45%,50%{right:7.2px;width:9.6px;height:9.6px}90%{right:0;height:8px;width:8px}}@-ms-keyframes nextVectorDotsXR-medium{25%{right:0}45%,50%{right:7.2px;width:9.6px;height:9.6px}90%{right:0;height:8px;width:8px}}@-o-keyframes nextVectorDotsXR-medium{25%{right:0}45%,50%{right:7.2px;width:9.6px;height:9.6px}90%{right:0;height:8px;width:8px}}@keyframes nextVectorDotsXR-medium{25%{right:0}45%,50%{right:7.2px;width:9.6px;height:9.6px}90%{right:0;height:8px;width:8px}}.next-radio-button-large[dir=rtl]>label:first-child{margin-left:-1px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-left-radius:0;border-bottom-left-radius:0}.next-radio-button-large[dir=rtl]>label:last-child{margin-left:0;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:3px;border-bottom-left-radius:3px}.next-radio-button-large[dir=rtl] .next-radio-label{height:38px;line-height:38px;font-size:16px}.next-radio-button-medium[dir=rtl]>label:first-child{margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:3px;border-bottom-right-radius:3px}.next-radio-button-medium[dir=rtl]>label:last-child{margin-left:0;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:3px;border-bottom-left-radius:3px}.next-radio-button-small[dir=rtl]>label:first-child{margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:3px;border-bottom-right-radius:3px}.next-radio-button-small[dir=rtl]>label:last-child{margin-left:0;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:3px;border-bottom-left-radius:3px}.next-radio-wrapper[dir=rtl] .next-radio-label{margin-left:0;margin-right:4px}.next-radio-group[dir=rtl] .next-radio-label{margin-right:4px;margin-left:16px}.next-radio-button[dir=rtl]>label .next-radio-label{margin:0}.next-radio-wrapper{outline:0;display:inline-block}.next-radio-wrapper .next-radio{box-sizing:border-box;display:inline-block;vertical-align:middle;position:relative;line-height:1}.next-radio-wrapper .next-radio *,.next-radio-wrapper .next-radio :after,.next-radio-wrapper .next-radio :before{box-sizing:border-box}.next-radio-wrapper .next-radio input[type=radio]{opacity:0;position:absolute;vertical-align:middle;top:0;left:0;width:16px;height:16px;margin:0;cursor:pointer}.next-radio-wrapper .next-radio-inner{display:block;width:16px;height:16px;background:#fff;border-radius:50%;border:1px solid #ddd;transition:all .1s linear;box-shadow:none}.next-radio-wrapper .next-radio-inner:after{transform:scale(0);position:absolute;border-radius:50%;top:50%;margin-top:-2px;left:50%;margin-left:-2px;background:#fff;content:"";transition:all .1s linear}.next-radio-wrapper.checked .next-radio-inner{border-color:#209bfa;background:#209bfa}.next-radio-wrapper.checked .next-radio-inner:after{width:4px;height:4px;font-weight:700;background:#fff;transform:scale(1)}.next-radio-wrapper.checked.hovered .next-radio-inner,.next-radio-wrapper.checked:hover .next-radio-inner{border-color:transparent}.next-radio-wrapper.disabled input[type=radio]{cursor:not-allowed}.next-radio-wrapper.disabled .next-radio-inner{border-color:#eee;background:#fafafa}.next-radio-wrapper.disabled .next-radio-inner:after{background:#ccc}.next-radio-wrapper.disabled .next-radio-inner.hovered,.next-radio-wrapper.disabled .next-radio-inner:hover{border-color:#eee}.next-radio-wrapper.disabled.checked .next-radio-inner{border-color:#eee;background:#fafafa}.next-radio-wrapper.disabled.checked .next-radio-inner:after{background:#ccc}.next-radio-wrapper.disabled .next-radio-label{color:#ccc}.next-radio-wrapper:not(.disabled).hovered .next-radio-inner,.next-radio-wrapper:not(.disabled):hover .next-radio-inner{border-color:#209bfa;background-color:#add9ff}.next-radio-wrapper:not(.disabled).hovered .next-radio-label,.next-radio-wrapper:not(.disabled):hover .next-radio-label{cursor:pointer}.next-radio-wrapper.checked:not(.disabled).hovered .next-radio-inner,.next-radio-wrapper.checked:not(.disabled):hover .next-radio-inner{border-color:transparent;background:#1274e7}.next-radio-wrapper.checked:not(.disabled).hovered .next-radio-inner:after,.next-radio-wrapper.checked:not(.disabled):hover .next-radio-inner:after{background:#fff}.next-radio-button .next-radio,.next-radio-button input[type=radio]{width:0;height:0}.next-radio-button>label{display:inline-block;box-sizing:border-box;position:relative;z-index:1;margin:0 0 0 -1px;border:1px solid #ddd;background-color:#fff;transition:all .1s linear;vertical-align:middle}.next-radio-button>label .next-radio-label{display:block;color:#333;margin:0;transition:all .1s linear}.next-radio-button>label.hovered,.next-radio-button>label:hover{z-index:10;border-color:#ccc;background-color:#f9f9f9}.next-radio-button>label.hovered .next-radio-label,.next-radio-button>label:hover .next-radio-label{color:#333}.next-radio-button>label.checked{z-index:11;border-color:#209bfa;background-color:#fff}.next-radio-button>label.checked .next-radio-label{color:#209bfa}.next-radio-button>label.disabled{z-index:0;cursor:not-allowed;border-color:#eee;background-color:#fafafa}.next-radio-button>label.disabled .next-radio-label{color:#ccc}.next-radio-button>label.checked.disabled{z-index:0;border-color:#eee;background-color:#f9f9f9}.next-radio-button>label.checked.disabled .next-radio-label{color:#ccc}.next-radio-button-large>label{padding:0 8px;height:40px;line-height:40px}.next-radio-button-large>label:first-child{margin-left:0;border-top-left-radius:3px;border-bottom-left-radius:3px}.next-radio-button-large>label:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.next-radio-button-large .next-radio-label{height:38px;line-height:38px;font-size:16px}.next-radio-button-medium>label{padding:0 8px;height:32px;line-height:32px}.next-radio-button-medium>label:first-child{margin-left:0;border-top-left-radius:3px;border-bottom-left-radius:3px}.next-radio-button-medium>label:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.next-radio-button-medium .next-radio-label{height:30px;line-height:30px;font-size:14px}.next-radio-button-small>label{padding:0 8px;height:20px;line-height:20px}.next-radio-button-small>label:first-child{margin-left:0;border-top-left-radius:3px;border-bottom-left-radius:3px}.next-radio-button-small>label:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.next-radio-button-small .next-radio-label{height:18px;line-height:18px;font-size:12px}.next-radio-single-input input[type=radio]{opacity:0;position:absolute;top:0;left:0;margin:0}.next-radio-group{display:inline-block}.next-radio-group .next-radio-wrapper{margin-right:12px}.next-radio-group .next-radio-wrapper:last-child{margin-right:0}.next-radio-group .next-radio-label{color:#333}.next-radio-group.disabled .next-radio-label{color:#ccc}.next-radio-group.next-radio-button .next-radio-wrapper{margin-right:0}.next-radio-group-ver .next-radio-wrapper{display:block;margin-bottom:8px}.next-radio-label{margin:0 4px;font-size:14px;vertical-align:middle;line-height:1;color:#333}@-moz-document url-prefix(){.next-radio{margin-top:-1px}@supports(animation:calc(0s)){.next-radio{margin-top:-3px}}}.next-badge{position:relative;display:inline-block;vertical-align:middle;line-height:1}.next-badge,.next-badge *,.next-badge :after,.next-badge :before{box-sizing:border-box}.next-badge .next-badge-count{color:#fff;background:#d23c26;text-align:center;white-space:nowrap;border-radius:8px;position:absolute;width:auto;height:16px;min-width:16px;padding:0 4px;font-size:12px;line-height:16px;transform:translateX(-50%);top:-.5em}.next-badge .next-badge-count a,.next-badge .next-badge-count a:hover{color:#fff}.next-badge .next-badge-dot{color:#fff;background:#d23c26;text-align:center;white-space:nowrap;border-radius:8px;position:absolute;width:8px;height:8px;min-width:8px;padding:0;font-size:1px;line-height:1;transform:translateX(-50%);top:-.5em}.next-badge .next-badge-dot a,.next-badge .next-badge-dot a:hover{color:#fff}.next-badge .next-badge-custom{line-height:1.166667;white-space:nowrap;font-size:12px;padding-left:4px;padding-right:4px;border-radius:3px;transform:translateX(-50%)}.next-badge .next-badge-custom>*{line-height:1}.next-badge .next-badge-custom>.next-icon:before,.next-badge .next-badge-custom>i:before{font-size:inherit;width:auto;vertical-align:top}.next-badge .next-badge-scroll-number{position:absolute;top:-4px;z-index:10;overflow:hidden;transform-origin:left center}.next-badge-scroll-number-only{position:relative;display:inline-block;transition:transform .1s linear,-webkit-transform .1s linear;min-width:8px}.next-badge-scroll-number-only span{display:block;height:16px;line-height:16px;font-size:12px}.next-badge-not-a-wrapper .next-badge-count,.next-badge-not-a-wrapper .next-badge-custom,.next-badge-not-a-wrapper .next-badge-dot{position:relative;display:block;top:auto;transform:translateX(0)}.next-badge-list-wrapper{margin-left:0}.next-badge-list-wrapper li{margin-bottom:0;list-style:none}.next-badge[dir=rtl] .next-badge-custom{padding-right:4px;padding-left:4px}.next-badge[dir=rtl] .next-badge-scroll-number{left:0;transform-origin:right center}.next-balloon{position:absolute;top:0;max-width:300px;border-style:solid;border-radius:3px;font-size:14px;font-weight:400;word-wrap:break-all;word-wrap:break-word;z-index:0}.next-balloon,.next-balloon *,.next-balloon :after,.next-balloon :before{box-sizing:border-box}.next-balloon:focus,.next-balloon :focus{outline:0}.next-balloon-title{margin-bottom:8px;font-size:16px;font-weight:700}.next-balloon-title.next-balloon-closable{padding:0 40px 0 0}.next-balloon-title.next-balloon-closable .next-balloon-close{top:-1px;transform:translateY(16px);right:16px}.next-balloon-primary{color:#333;border-color:#209bfa;background-color:#add9ff;box-shadow:0 1px 3px 0 rgba(0,0,0,.12);border-width:1px}.next-balloon-primary .next-balloon-close{position:absolute;top:-1px;transform:translateY(15px);right:12px;font-size:16px;cursor:pointer;color:#999}.next-balloon-primary .next-balloon-close .next-icon{width:16px;height:16px;line-height:1em}.next-balloon-primary .next-balloon-close .next-icon:before{width:16px;height:16px;font-size:16px;line-height:1em}.next-balloon-primary .next-balloon-close :hover{color:#333}.next-balloon-primary:after{position:absolute;width:12px;height:12px;content:"";transform:rotate(45deg);box-sizing:content-box!important;border:1px solid #209bfa;background-color:#add9ff;z-index:-1}.next-balloon-primary.next-balloon-top:after{top:-7px;left:calc(50% - 7px);border-right:none;border-bottom:none}.next-balloon-primary.next-balloon-right:after{top:calc(50% - 7px);right:-7px;border-left:none;border-bottom:none}.next-balloon-primary.next-balloon-bottom:after{bottom:-7px;left:calc(50% - 7px);border-top:none;border-left:none}.next-balloon-primary.next-balloon-left:after{top:calc(50% - 7px);left:-7px;border-top:none;border-right:none}.next-balloon-primary.next-balloon-left-top:after{top:12px;left:-7px;border-top:none;border-right:none}.next-balloon-primary.next-balloon-left-bottom:after{bottom:12px;left:-7px;border-top:none;border-right:none}.next-balloon-primary.next-balloon-right-top:after{top:12px;right:-7px;border-bottom:none;border-left:none}.next-balloon-primary.next-balloon-right-bottom:after{right:-7px;bottom:12px;border-bottom:none;border-left:none}.next-balloon-primary.next-balloon-top-left:after{top:-7px;left:12px;border-right:none;border-bottom:none}.next-balloon-primary.next-balloon-top-right:after{top:-7px;right:12px;border-right:none;border-bottom:none}.next-balloon-primary.next-balloon-bottom-left:after{bottom:-7px;left:12px;border-top:none;border-left:none}.next-balloon-primary.next-balloon-bottom-right:after{right:12px;bottom:-7px;border-top:none;border-left:none}.next-balloon-normal{color:#333;border-color:#e6e6e6;background-color:#fff;box-shadow:0 4px 8px 0 rgba(0,0,0,.12);border-width:1px}.next-balloon-normal .next-balloon-close{position:absolute;top:-1px;transform:translateY(15px);right:12px;font-size:16px;cursor:pointer;color:#999}.next-balloon-normal .next-balloon-close .next-icon{width:16px;height:16px;line-height:1em}.next-balloon-normal .next-balloon-close .next-icon:before{width:16px;height:16px;font-size:16px;line-height:1em}.next-balloon-normal .next-balloon-close :hover{color:#666}.next-balloon-normal:after{position:absolute;width:12px;height:12px;content:"";transform:rotate(45deg);box-sizing:content-box!important;border:1px solid #e6e6e6;background-color:#fff;z-index:-1}.next-balloon-normal.next-balloon-top:after{top:-7px;left:calc(50% - 7px);border-right:none;border-bottom:none}.next-balloon-normal.next-balloon-right:after{top:calc(50% - 7px);right:-7px;border-left:none;border-bottom:none}.next-balloon-normal.next-balloon-bottom:after{bottom:-7px;left:calc(50% - 7px);border-top:none;border-left:none}.next-balloon-normal.next-balloon-left:after{top:calc(50% - 7px);left:-7px;border-top:none;border-right:none}.next-balloon-normal.next-balloon-left-top:after{top:12px;left:-7px;border-top:none;border-right:none}.next-balloon-normal.next-balloon-left-bottom:after{bottom:12px;left:-7px;border-top:none;border-right:none}.next-balloon-normal.next-balloon-right-top:after{top:12px;right:-7px;border-bottom:none;border-left:none}.next-balloon-normal.next-balloon-right-bottom:after{right:-7px;bottom:12px;border-bottom:none;border-left:none}.next-balloon-normal.next-balloon-top-left:after{top:-7px;left:12px;border-right:none;border-bottom:none}.next-balloon-normal.next-balloon-top-right:after{top:-7px;right:12px;border-right:none;border-bottom:none}.next-balloon-normal.next-balloon-bottom-left:after{bottom:-7px;left:12px;border-top:none;border-left:none}.next-balloon-normal.next-balloon-bottom-right:after{right:12px;bottom:-7px;border-top:none;border-left:none}.next-balloon.visible{display:block}.next-balloon.hidden{display:none}.next-balloon-medium{padding:16px}.next-balloon-closable{padding:16px 40px 16px 16px}.next-balloon-tooltip{box-sizing:border-box;position:absolute;top:0;max-width:300px;border-radius:3px;font-size:14px;font-weight:400;z-index:0;word-wrap:break-all;word-wrap:break-word;color:#fafafa;background-color:#333;box-shadow:none;border:1px solid transparent}.next-balloon-tooltip *,.next-balloon-tooltip :after,.next-balloon-tooltip :before{box-sizing:border-box}.next-balloon-tooltip .next-balloon-arrow{position:absolute;display:block;width:24px;height:24px;overflow:hidden;background:0 0;pointer-events:none}.next-balloon-tooltip .next-balloon-arrow .next-balloon-arrow-content{content:"";position:absolute;top:0;right:0;bottom:0;left:0;display:block;width:12px;height:12px;margin:auto;background-color:#333;border:1px solid transparent;pointer-events:auto}.next-balloon-tooltip-top .next-balloon-arrow{top:-24px;left:calc(50% - 12px)}.next-balloon-tooltip-top .next-balloon-arrow .next-balloon-arrow-content{transform:translateY(12px) rotate(45deg)}.next-balloon-tooltip-right .next-balloon-arrow{top:calc(50% - 12px);right:-24px}.next-balloon-tooltip-right .next-balloon-arrow .next-balloon-arrow-content{transform:translateX(-12px) rotate(45deg)}.next-balloon-tooltip-bottom .next-balloon-arrow{left:calc(50% - 12px);bottom:-24px}.next-balloon-tooltip-bottom .next-balloon-arrow .next-balloon-arrow-content{transform:translateY(-12px) rotate(45deg)}.next-balloon-tooltip-left .next-balloon-arrow{top:calc(50% - 12px);left:-24px}.next-balloon-tooltip-left .next-balloon-arrow .next-balloon-arrow-content{transform:translateX(12px) rotate(45deg)}.next-balloon-tooltip-left-top .next-balloon-arrow{top:6px;left:-24px}.next-balloon-tooltip-left-top .next-balloon-arrow .next-balloon-arrow-content{transform:translateX(12px) rotate(45deg)}.next-balloon-tooltip-left-bottom .next-balloon-arrow{bottom:6px;left:-24px}.next-balloon-tooltip-left-bottom .next-balloon-arrow .next-balloon-arrow-content{transform:translateX(12px) rotate(45deg)}.next-balloon-tooltip-right-top .next-balloon-arrow{top:6px;right:-24px}.next-balloon-tooltip-right-top .next-balloon-arrow .next-balloon-arrow-content{transform:translateX(-12px) rotate(45deg)}.next-balloon-tooltip-right-bottom .next-balloon-arrow{bottom:6px;right:-24px}.next-balloon-tooltip-right-bottom .next-balloon-arrow .next-balloon-arrow-content{transform:translateX(-12px) rotate(45deg)}.next-balloon-tooltip-top-left .next-balloon-arrow{left:6px;top:-24px}.next-balloon-tooltip-top-left .next-balloon-arrow .next-balloon-arrow-content{transform:translateY(12px) rotate(45deg)}.next-balloon-tooltip-top-right .next-balloon-arrow{right:6px;top:-24px}.next-balloon-tooltip-top-right .next-balloon-arrow .next-balloon-arrow-content{transform:translateY(12px) rotate(45deg)}.next-balloon-tooltip-bottom-left .next-balloon-arrow{left:6px;bottom:-24px}.next-balloon-tooltip-bottom-left .next-balloon-arrow .next-balloon-arrow-content{transform:translateY(-12px) rotate(45deg)}.next-balloon-tooltip-bottom-right .next-balloon-arrow{right:6px;bottom:-24px}.next-balloon-tooltip-bottom-right .next-balloon-arrow .next-balloon-arrow-content{transform:translateY(-12px) rotate(45deg)}.next-balloon-tooltip.visible{display:block}.next-balloon-tooltip.hidden{display:none}.next-balloon-tooltip-medium{padding:8px}.next-balloon[dir=rtl].next-balloon-primary .next-balloon-close{left:12px;right:auto}.next-balloon[dir=rtl].next-balloon-primary.next-balloon-right:after{left:-7px;right:auto;border-right:none;border-top:none;border-left:inherit;border-bottom:inherit}.next-balloon[dir=rtl].next-balloon-primary.next-balloon-left-bottom:after,.next-balloon[dir=rtl].next-balloon-primary.next-balloon-left-top:after,.next-balloon[dir=rtl].next-balloon-primary.next-balloon-left:after{right:-7px;left:auto;border-left:none;border-bottom:none;border-right:inherit;border-top:inherit}.next-balloon[dir=rtl].next-balloon-primary.next-balloon-right-bottom:after,.next-balloon[dir=rtl].next-balloon-primary.next-balloon-right-top:after{left:-7px;right:auto;border-right:none;border-top:none;border-bottom:inherit;border-left:inherit}.next-balloon[dir=rtl].next-balloon-primary.next-balloon-top-left:after{right:12px;left:auto}.next-balloon[dir=rtl].next-balloon-primary.next-balloon-top-right:after{right:auto;left:12px}.next-balloon[dir=rtl].next-balloon-primary.next-balloon-bottom-left:after{right:12px;left:auto}.next-balloon[dir=rtl].next-balloon-normal .next-balloon-close,.next-balloon[dir=rtl].next-balloon-primary.next-balloon-bottom-right:after{left:12px;right:auto}.next-balloon[dir=rtl].next-balloon-normal.next-balloon-right:after{left:-7px;right:auto;border-right:none;border-top:none;border-left:inherit;border-bottom:inherit}.next-balloon[dir=rtl].next-balloon-normal.next-balloon-left-bottom:after,.next-balloon[dir=rtl].next-balloon-normal.next-balloon-left-top:after,.next-balloon[dir=rtl].next-balloon-normal.next-balloon-left:after{right:-7px;left:auto;border-left:none;border-bottom:none;border-right:inherit;border-top:inherit}.next-balloon[dir=rtl].next-balloon-normal.next-balloon-right-bottom:after,.next-balloon[dir=rtl].next-balloon-normal.next-balloon-right-top:after{left:-7px;right:auto;border-right:none;border-top:none;border-bottom:inherit;border-left:inherit}.next-balloon[dir=rtl].next-balloon-normal.next-balloon-top-left:after{right:12px;left:auto}.next-balloon[dir=rtl].next-balloon-normal.next-balloon-top-right:after{right:auto;left:12px}.next-balloon[dir=rtl].next-balloon-normal.next-balloon-bottom-left:after{right:12px;left:auto}.next-balloon[dir=rtl].next-balloon-normal.next-balloon-bottom-right:after{left:12px;right:auto}.next-balloon[dir=rtl].next-balloon-closable{padding:16px 16px 16px 40px}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-right .next-balloon-arrow{left:-24px;right:auto}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-right .next-balloon-arrow .next-balloon-arrow-content{transform:translateX(12px) rotate(45deg)}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-left .next-balloon-arrow{right:-24px;left:auto}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-left .next-balloon-arrow .next-balloon-arrow-content{transform:translateX(-12px) rotate(45deg)}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-left-top .next-balloon-arrow{right:-24px;left:auto}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-left-top .next-balloon-arrow .next-balloon-arrow-content{transform:translateX(-12px) rotate(45deg)}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-left-bottom .next-balloon-arrow{right:-24px;left:auto}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-left-bottom .next-balloon-arrow .next-balloon-arrow-content{transform:translateX(-12px) rotate(45deg)}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-right-top .next-balloon-arrow{left:-24px;right:auto}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-right-top .next-balloon-arrow .next-balloon-arrow-content{transform:translateX(12px) rotate(45deg)}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-right-bottom .next-balloon-arrow{left:-24px;right:auto}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-right-bottom .next-balloon-arrow .next-balloon-arrow-content{transform:translateX(12px) rotate(45deg)}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-top-left .next-balloon-arrow{right:10px;left:auto}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-top-right .next-balloon-arrow{left:10px;right:auto}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-bottom-left .next-balloon-arrow{right:10px;left:auto}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-bottom-right .next-balloon-arrow{left:10px;right:auto}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-medium{padding:8px}.next-menu[dir=rtl] .next-menu-item-helper{float:left}.next-menu[dir=rtl] .next-menu-item .next-checkbox,.next-menu[dir=rtl] .next-menu-item .next-radio{margin-left:4px;margin-right:0}.next-menu[dir=rtl] .next-menu-hoz-right{float:left}.next-menu[dir=rtl] .next-menu-hoz-icon-arrow.next-icon{left:6px;right:auto}.next-menu[dir=rtl] .next-menu-icon-selected.next-icon{margin-left:0;margin-right:-18px}.next-menu[dir=rtl] .next-menu-icon-selected.next-icon .next-icon-remote,.next-menu[dir=rtl] .next-menu-icon-selected.next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-menu[dir=rtl] .next-menu-icon-selected.next-icon.next-menu-icon-right{right:auto;left:4px}.next-menu[dir=rtl] .next-menu-icon-arrow.next-icon{left:10px;right:auto}.next-menu{position:relative;min-width:100px;margin:0;list-style:none;border:1px solid #e6e6e6;border-radius:3px;box-shadow:none;background:#fff;line-height:32px;font-size:14px;animation-duration:.3s;animation-timing-function:ease}.next-menu,.next-menu *,.next-menu :after,.next-menu :before{box-sizing:border-box}.next-menu:focus,.next-menu :focus{outline:0}.next-menu-spacing-lr{padding:0}.next-menu-spacing-lr.next-menu-outside>.next-menu{height:100%;overflow-y:auto}.next-menu-spacing-tb{padding:0}.next-menu.next-ver{padding:8px 0}.next-menu.next-ver .next-menu-item{padding:0 20px}.next-menu.next-hoz{padding:8px 0}.next-menu.next-hoz .next-menu-item{padding:0 20px}.next-menu-embeddable,.next-menu-embeddable .next-menu-item.next-disabled,.next-menu-embeddable .next-menu-item.next-disabled .next-menu-item-text>a{background:transparent;border:none}.next-menu-embeddable{box-shadow:none}.next-menu-embeddable .next-menu-item-inner{height:100%}.next-menu-content{position:relative}.next-menu-content,.next-menu-sub-menu{padding:0;margin:0;list-style:none}.next-menu-sub-menu.next-expand-enter{overflow:hidden}.next-menu-sub-menu.next-expand-enter-active{transition:height .3s ease}.next-menu-sub-menu.next-expand-leave{overflow:hidden}.next-menu-sub-menu.next-expand-leave-active{transition:height .3s ease}.next-menu-item{position:relative;transition:background .1s linear;color:#333;cursor:pointer}.next-menu-item-helper{float:right;color:#999;font-style:normal;font-size:14px}.next-menu-item .next-checkbox,.next-menu-item .next-radio{margin-right:4px}.next-menu-item.next-selected{color:#333;background-color:#fff}.next-menu-item.next-selected .next-menu-icon-arrow{color:#666}.next-menu-item.next-selected .next-menu-icon-selected{color:#209bfa}.next-menu-item.next-disabled,.next-menu-item.next-disabled .next-menu-item-text>a{color:#ccc;background-color:#fff;cursor:not-allowed}.next-menu-item.next-disabled .next-menu-icon-arrow,.next-menu-item.next-disabled .next-menu-icon-selected,.next-menu-item.next-disabled .next-menu-item-text>a .next-menu-icon-arrow,.next-menu-item.next-disabled .next-menu-item-text>a .next-menu-icon-selected{color:#ccc}.next-menu-item:not(.next-disabled).next-focused,.next-menu-item:not(.next-disabled).next-selected.next-focused,.next-menu-item:not(.next-disabled).next-selected.next-focused:hover,.next-menu-item:not(.next-disabled).next-selected:focus,.next-menu-item:not(.next-disabled).next-selected:focus:hover,.next-menu-item:not(.next-disabled).next-selected:hover,.next-menu-item:not(.next-disabled):hover{color:#333;background-color:#f9f9f9}.next-menu-item:not(.next-disabled).next-focused .next-menu-icon-arrow,.next-menu-item:not(.next-disabled).next-selected.next-focused .next-menu-icon-arrow,.next-menu-item:not(.next-disabled).next-selected.next-focused:hover .next-menu-icon-arrow,.next-menu-item:not(.next-disabled).next-selected:focus .next-menu-icon-arrow,.next-menu-item:not(.next-disabled).next-selected:focus:hover .next-menu-icon-arrow,.next-menu-item:not(.next-disabled).next-selected:hover .next-menu-icon-arrow,.next-menu-item:not(.next-disabled):hover .next-menu-icon-arrow{color:#333}.next-menu-item:not(.next-disabled).next-focused .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected.next-focused .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected.next-focused:hover .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected:focus .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected:focus:hover .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected:hover .next-menu-icon-selected,.next-menu-item:not(.next-disabled):hover .next-menu-icon-selected{color:#209bfa}.next-menu-item-inner{height:32px;font-size:14px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.next-menu-item .next-menu-item-text{vertical-align:middle}.next-menu-item .next-menu-item-text>a{display:inline-block;text-decoration:none;color:#333}.next-menu-item .next-menu-item-text>a:before{position:absolute;background-color:transparent;top:0;left:0;bottom:0;right:0;content:""}.next-menu.next-hoz{padding:0}.next-menu.next-hoz.next-menu-nowrap{overflow:hidden;white-space:nowrap}.next-menu.next-hoz.next-menu-nowrap .next-menu-more{text-align:center}.next-menu.next-hoz .next-menu-content>.next-menu-item,.next-menu.next-hoz>.next-menu-item,.next-menu.next-hoz>.next-menu-sub-menu-wrapper{display:inline-block;vertical-align:top}.next-menu.next-hoz .next-menu-content,.next-menu.next-hoz .next-menu-footer,.next-menu.next-hoz .next-menu-header{display:inline-block}.next-menu-hoz-right{float:right}.next-menu-group-label{padding:0 12px;color:#999}.next-menu-divider{margin:8px 12px;border-bottom:1px solid #eee}.next-menu .next-menu-icon-selected.next-icon{position:absolute;top:0;margin-left:-16px}.next-menu .next-menu-icon-selected.next-icon .next-icon-remote,.next-menu .next-menu-icon-selected.next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-menu .next-menu-icon-selected.next-icon.next-menu-icon-right{right:4px}.next-menu .next-menu-symbol-icon-selected.next-menu-icon-selected:before{content:"顦�"}.next-menu .next-menu-icon-arrow.next-icon{position:absolute;top:0;right:10px;color:#666;transition:all .1s linear}.next-menu .next-menu-icon-arrow.next-icon .next-icon-remote,.next-menu .next-menu-icon-arrow.next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-menu .next-menu-icon-arrow-down:before{content:"顦�"}.next-menu .next-menu-icon-arrow-down.next-open{transform:rotate(180deg)}.next-menu .next-menu-icon-arrow-down.next-open .next-icon-remote,.next-menu .next-menu-icon-arrow-down.next-open:before{width:20px;font-size:20px;line-height:inherit}.next-menu .next-menu-symbol-popupfold:before{content:"顦�"}.next-menu .next-menu-icon-arrow-right.next-open{transform:rotate(-90deg)}.next-menu .next-menu-icon-arrow-right.next-open .next-icon-remote,.next-menu .next-menu-icon-arrow-right.next-open:before{width:20px;font-size:20px;line-height:inherit}.next-menu .next-menu-hoz-icon-arrow.next-icon{position:absolute;top:0;right:6px;color:#666;transition:all .1s linear}.next-menu .next-menu-hoz-icon-arrow.next-icon .next-icon-remote,.next-menu .next-menu-hoz-icon-arrow.next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-menu .next-menu-hoz-icon-arrow.next-icon:before{content:"顦�"}.next-menu-unfold-icon:before{content:""}.next-menu .next-menu-hoz-icon-arrow.next-open{transform:rotate(180deg)}.next-menu .next-menu-hoz-icon-arrow.next-open .next-icon-remote,.next-menu .next-menu-hoz-icon-arrow.next-open:before{width:12px;font-size:12px;line-height:inherit}.next-menu.next-context{line-height:24px}.next-menu.next-context .next-menu-item-inner{height:24px}.next-breadcrumb{display:block;margin:0;padding:0;white-space:nowrap;height:16px;line-height:16px}.next-breadcrumb .next-breadcrumb-item{display:inline-block}.next-breadcrumb .next-breadcrumb-item .next-breadcrumb-text{display:inline-block;text-decoration:none;text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;transition:all .1s linear}.next-breadcrumb .next-breadcrumb-item .next-breadcrumb-text>b{font-weight:400}.next-breadcrumb .next-breadcrumb-item .next-breadcrumb-separator{display:inline-block;vertical-align:top}.next-breadcrumb .next-breadcrumb-text{height:16px;min-width:16px;font-size:12px;line-height:16px}.next-breadcrumb .next-breadcrumb-separator{height:16px;margin:0 8px;font-size:16px;line-height:16px}.next-breadcrumb .next-breadcrumb-separator .next-icon:before{display:block}.next-breadcrumb .next-breadcrumb-separator .next-icon .next-icon-remote,.next-breadcrumb .next-breadcrumb-separator .next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-breadcrumb .next-breadcrumb-text-ellipsis{font-size:12px}.next-breadcrumb .next-breadcrumb-text{color:#666}.next-breadcrumb .next-breadcrumb-text>b{color:#209bfa}.next-breadcrumb .next-breadcrumb-text>a{color:#666;text-decoration:none;text-align:center}.next-breadcrumb .next-breadcrumb-text.activated,.next-breadcrumb .next-breadcrumb-text.activated>a{color:#333;font-weight:700}.next-breadcrumb .next-breadcrumb-text-ellipsis{color:#666;cursor:default}.next-breadcrumb .next-breadcrumb-text-ellipsis-clickable{color:#666;cursor:pointer}.next-breadcrumb .next-breadcrumb-separator{color:#999}.next-breadcrumb .next-breadcrumb-text:not(.next-breadcrumb-text-ellipsis):hover>a,.next-breadcrumb a.next-breadcrumb-text.activated:hover>a,.next-breadcrumb a.next-breadcrumb-text:not(.next-breadcrumb-text-ellipsis):hover,.next-breadcrumb a.next-breadcrumb-text:not(.next-breadcrumb-text-ellipsis):hover>b{color:#209bfa}.next-breadcrumb a.next-breadcrumb-text.activated:hover{color:#209bfa;font-weight:700}.next-breadcrumb-icon-sep:before{content:"顦�"}.next-breadcrumb-dropdown-wrapper{padding:4px 0}.next-btn,.next-btn *,.next-btn :after,.next-btn :before{box-sizing:border-box}.next-btn::-moz-focus-inner{border:0;padding:0}.next-btn,.next-btn:active,.next-btn:focus,.next-btn:hover{outline:0}@keyframes loadingCircle{0%{transform-origin:50% 50%;transform:rotate(0deg)}to{transform-origin:50% 50%;transform:rotate(1turn)}}.next-btn{position:relative;display:inline-block;box-shadow:none;text-decoration:none;text-align:center;text-transform:none;white-space:nowrap;vertical-align:middle;user-select:none;transition:all .1s linear;line-height:1;cursor:pointer}.next-btn:after{text-align:center;position:absolute;opacity:0;visibility:hidden;transition:opacity .1s linear}.next-btn:before{content:"";height:100%;width:0}.next-btn .next-icon,.next-btn:before{display:inline-block;vertical-align:middle}.next-btn .next-icon{font-size:0}.next-btn>.next-btn-helper,.next-btn>div,.next-btn>span{display:inline-block;vertical-align:middle}.next-btn>.next-btn-helper{text-decoration:inherit}.next-btn.hover,.next-btn:hover{box-shadow:none}.next-btn.next-small{border-radius:3px;padding:0 16px;height:24px;font-size:12px;border-width:1px}.next-btn.next-small>.next-btn-icon.next-icon-first{transform:scale(1);margin-left:0;margin-right:4px}.next-btn.next-small>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn.next-small>.next-btn-icon.next-icon-first:before{width:12px;font-size:12px;line-height:inherit}.next-btn.next-small>.next-btn-icon.next-icon-last{transform:scale(1);margin-left:4px;margin-right:0}.next-btn.next-small>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn.next-small>.next-btn-icon.next-icon-last:before{width:12px;font-size:12px;line-height:inherit}.next-btn.next-small>.next-btn-icon.next-icon-alone{transform:scale(1)}.next-btn.next-small>.next-btn-icon.next-icon-alone .next-icon-remote,.next-btn.next-small>.next-btn-icon.next-icon-alone:before{width:12px;font-size:12px;line-height:inherit}.next-btn.next-small.next-btn-loading:before{width:12px;height:12px;font-size:12px;line-height:12px;left:16px;top:50%;text-align:center;margin-right:4px}.next-btn.next-small.next-btn-loading>.next-icon{display:none}.next-btn.next-small>.next-btn-custom-loading-icon{opacity:0;width:0}.next-btn.next-small>.next-btn-custom-loading-icon.show{width:12px;margin-right:4px;opacity:1;transition:all .1s linear}.next-btn.next-medium{border-radius:3px;padding:0 20px;height:32px;font-size:14px;border-width:1px}.next-btn.next-medium>.next-btn-icon.next-icon-first{transform:scale(1);margin-left:0;margin-right:4px}.next-btn.next-medium>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn.next-medium>.next-btn-icon.next-icon-first:before{width:20px;font-size:20px;line-height:inherit}.next-btn.next-medium>.next-btn-icon.next-icon-last{transform:scale(1);margin-left:4px;margin-right:0}.next-btn.next-medium>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn.next-medium>.next-btn-icon.next-icon-last:before{width:20px;font-size:20px;line-height:inherit}.next-btn.next-medium>.next-btn-icon.next-icon-alone{transform:scale(1)}.next-btn.next-medium>.next-btn-icon.next-icon-alone .next-icon-remote,.next-btn.next-medium>.next-btn-icon.next-icon-alone:before{width:20px;font-size:20px;line-height:inherit}.next-btn.next-medium.next-btn-loading:before{width:20px;height:20px;font-size:20px;line-height:20px;left:20px;top:50%;text-align:center;margin-right:4px}.next-btn.next-medium.next-btn-loading>.next-icon{display:none}.next-btn.next-medium>.next-btn-custom-loading-icon{opacity:0;width:0}.next-btn.next-medium>.next-btn-custom-loading-icon.show{width:20px;margin-right:4px;opacity:1;transition:all .1s linear}.next-btn.next-large{border-radius:3px;padding:0 24px;height:40px;font-size:16px;border-width:1px}.next-btn.next-large>.next-btn-icon.next-icon-first{transform:scale(1);margin-left:0;margin-right:4px}.next-btn.next-large>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn.next-large>.next-btn-icon.next-icon-first:before{width:20px;font-size:20px;line-height:inherit}.next-btn.next-large>.next-btn-icon.next-icon-last{transform:scale(1);margin-left:4px;margin-right:0}.next-btn.next-large>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn.next-large>.next-btn-icon.next-icon-last:before{width:20px;font-size:20px;line-height:inherit}.next-btn.next-large>.next-btn-icon.next-icon-alone{transform:scale(1)}.next-btn.next-large>.next-btn-icon.next-icon-alone .next-icon-remote,.next-btn.next-large>.next-btn-icon.next-icon-alone:before{width:20px;font-size:20px;line-height:inherit}.next-btn.next-large.next-btn-loading:before{width:20px;height:20px;font-size:20px;line-height:20px;left:24px;top:50%;text-align:center;margin-right:4px}.next-btn.next-large.next-btn-loading>.next-icon{display:none}.next-btn.next-large>.next-btn-custom-loading-icon{opacity:0;width:0}.next-btn.next-large>.next-btn-custom-loading-icon.show{width:20px;margin-right:4px;opacity:1;transition:all .1s linear}.next-btn.next-btn-normal{border-style:solid;background:#fff;border-color:#ddd}.next-btn.next-btn-normal,.next-btn.next-btn-normal.visited,.next-btn.next-btn-normal:link,.next-btn.next-btn-normal:visited{color:#333}.next-btn.next-btn-normal.active,.next-btn.next-btn-normal.hover,.next-btn.next-btn-normal:active,.next-btn.next-btn-normal:focus,.next-btn.next-btn-normal:hover{color:#333;background:#f9f9f9;border-color:#ccc;text-decoration:none}.next-btn.next-btn-primary{border-style:solid;background:#209bfa;border-color:transparent}.next-btn.next-btn-primary,.next-btn.next-btn-primary.visited,.next-btn.next-btn-primary:link,.next-btn.next-btn-primary:visited{color:#fff}.next-btn.next-btn-primary.active,.next-btn.next-btn-primary.hover,.next-btn.next-btn-primary:active,.next-btn.next-btn-primary:focus,.next-btn.next-btn-primary:hover{color:#fff;background:#1274e7;border-color:transparent;text-decoration:none}.next-btn.next-btn-secondary{border-style:solid;background:#fff;border-color:#209bfa}.next-btn.next-btn-secondary,.next-btn.next-btn-secondary.visited,.next-btn.next-btn-secondary:link,.next-btn.next-btn-secondary:visited{color:#209bfa}.next-btn.next-btn-secondary.active,.next-btn.next-btn-secondary.hover,.next-btn.next-btn-secondary:active,.next-btn.next-btn-secondary:focus,.next-btn.next-btn-secondary:hover{color:#fff;background:#1274e7;border-color:#1274e7;text-decoration:none}.next-btn.disabled,.next-btn[disabled]{cursor:not-allowed}.next-btn.disabled.next-btn-normal,.next-btn[disabled].next-btn-normal{background:#fafafa;border-color:#eee}.next-btn.disabled.next-btn-normal,.next-btn.disabled.next-btn-normal.visited,.next-btn.disabled.next-btn-normal:link,.next-btn.disabled.next-btn-normal:visited,.next-btn[disabled].next-btn-normal,.next-btn[disabled].next-btn-normal.visited,.next-btn[disabled].next-btn-normal:link,.next-btn[disabled].next-btn-normal:visited{color:#ccc}.next-btn.disabled.next-btn-normal.active,.next-btn.disabled.next-btn-normal.hover,.next-btn.disabled.next-btn-normal:active,.next-btn.disabled.next-btn-normal:focus,.next-btn.disabled.next-btn-normal:hover,.next-btn[disabled].next-btn-normal.active,.next-btn[disabled].next-btn-normal.hover,.next-btn[disabled].next-btn-normal:active,.next-btn[disabled].next-btn-normal:focus,.next-btn[disabled].next-btn-normal:hover{color:#ccc;background:#fafafa;border-color:#eee;text-decoration:none}.next-btn.disabled.next-btn-primary,.next-btn[disabled].next-btn-primary{background:#fafafa;border-color:#eee}.next-btn.disabled.next-btn-primary,.next-btn.disabled.next-btn-primary.visited,.next-btn.disabled.next-btn-primary:link,.next-btn.disabled.next-btn-primary:visited,.next-btn[disabled].next-btn-primary,.next-btn[disabled].next-btn-primary.visited,.next-btn[disabled].next-btn-primary:link,.next-btn[disabled].next-btn-primary:visited{color:#ccc}.next-btn.disabled.next-btn-primary.active,.next-btn.disabled.next-btn-primary.hover,.next-btn.disabled.next-btn-primary:active,.next-btn.disabled.next-btn-primary:focus,.next-btn.disabled.next-btn-primary:hover,.next-btn[disabled].next-btn-primary.active,.next-btn[disabled].next-btn-primary.hover,.next-btn[disabled].next-btn-primary:active,.next-btn[disabled].next-btn-primary:focus,.next-btn[disabled].next-btn-primary:hover{color:#ccc;background:#fafafa;border-color:#eee;text-decoration:none}.next-btn.disabled.next-btn-secondary,.next-btn[disabled].next-btn-secondary{background:#fafafa;border-color:#eee}.next-btn.disabled.next-btn-secondary,.next-btn.disabled.next-btn-secondary.visited,.next-btn.disabled.next-btn-secondary:link,.next-btn.disabled.next-btn-secondary:visited,.next-btn[disabled].next-btn-secondary,.next-btn[disabled].next-btn-secondary.visited,.next-btn[disabled].next-btn-secondary:link,.next-btn[disabled].next-btn-secondary:visited{color:#ccc}.next-btn.disabled.next-btn-secondary.active,.next-btn.disabled.next-btn-secondary.hover,.next-btn.disabled.next-btn-secondary:active,.next-btn.disabled.next-btn-secondary:focus,.next-btn.disabled.next-btn-secondary:hover,.next-btn[disabled].next-btn-secondary.active,.next-btn[disabled].next-btn-secondary.hover,.next-btn[disabled].next-btn-secondary:active,.next-btn[disabled].next-btn-secondary:focus,.next-btn[disabled].next-btn-secondary:hover{color:#ccc;background:#fafafa;border-color:#eee;text-decoration:none}.next-btn-warning{border-style:solid}.next-btn-warning.next-btn-primary{background:#d23c26;border-color:#d23c26}.next-btn-warning.next-btn-primary,.next-btn-warning.next-btn-primary.visited,.next-btn-warning.next-btn-primary:link,.next-btn-warning.next-btn-primary:visited{color:#fff}.next-btn-warning.next-btn-primary.active,.next-btn-warning.next-btn-primary.hover,.next-btn-warning.next-btn-primary:active,.next-btn-warning.next-btn-primary:focus,.next-btn-warning.next-btn-primary:hover{color:#fff;background:#b7321e;border-color:#b7321e;text-decoration:none}.next-btn-warning.next-btn-primary.disabled,.next-btn-warning.next-btn-primary[disabled]{background:#fafafa;border-color:#e6e6e6}.next-btn-warning.next-btn-primary.disabled,.next-btn-warning.next-btn-primary.disabled.visited,.next-btn-warning.next-btn-primary.disabled:link,.next-btn-warning.next-btn-primary.disabled:visited,.next-btn-warning.next-btn-primary[disabled],.next-btn-warning.next-btn-primary[disabled].visited,.next-btn-warning.next-btn-primary[disabled]:link,.next-btn-warning.next-btn-primary[disabled]:visited{color:#ccc}.next-btn-warning.next-btn-primary.disabled.active,.next-btn-warning.next-btn-primary.disabled.hover,.next-btn-warning.next-btn-primary.disabled:active,.next-btn-warning.next-btn-primary.disabled:focus,.next-btn-warning.next-btn-primary.disabled:hover,.next-btn-warning.next-btn-primary[disabled].active,.next-btn-warning.next-btn-primary[disabled].hover,.next-btn-warning.next-btn-primary[disabled]:active,.next-btn-warning.next-btn-primary[disabled]:focus,.next-btn-warning.next-btn-primary[disabled]:hover{color:#ccc;background:#fafafa;border-color:#e6e6e6;text-decoration:none}.next-btn-warning.next-btn-normal{background:#fff;border-color:#d23c26}.next-btn-warning.next-btn-normal,.next-btn-warning.next-btn-normal.visited,.next-btn-warning.next-btn-normal:link,.next-btn-warning.next-btn-normal:visited{color:#d23c26}.next-btn-warning.next-btn-normal.active,.next-btn-warning.next-btn-normal.hover,.next-btn-warning.next-btn-normal:active,.next-btn-warning.next-btn-normal:focus,.next-btn-warning.next-btn-normal:hover{color:#fff;background:#b7321e;border-color:#b7321e;text-decoration:none}.next-btn-warning.next-btn-normal.disabled,.next-btn-warning.next-btn-normal[disabled]{background:#fafafa;border-color:#eee}.next-btn-warning.next-btn-normal.disabled,.next-btn-warning.next-btn-normal.disabled.visited,.next-btn-warning.next-btn-normal.disabled:link,.next-btn-warning.next-btn-normal.disabled:visited,.next-btn-warning.next-btn-normal[disabled],.next-btn-warning.next-btn-normal[disabled].visited,.next-btn-warning.next-btn-normal[disabled]:link,.next-btn-warning.next-btn-normal[disabled]:visited{color:#ccc}.next-btn-warning.next-btn-normal.disabled.active,.next-btn-warning.next-btn-normal.disabled.hover,.next-btn-warning.next-btn-normal.disabled:active,.next-btn-warning.next-btn-normal.disabled:focus,.next-btn-warning.next-btn-normal.disabled:hover,.next-btn-warning.next-btn-normal[disabled].active,.next-btn-warning.next-btn-normal[disabled].hover,.next-btn-warning.next-btn-normal[disabled]:active,.next-btn-warning.next-btn-normal[disabled]:focus,.next-btn-warning.next-btn-normal[disabled]:hover{color:#ccc;background:#fafafa;border-color:#eee;text-decoration:none}.next-btn-text{border-radius:0;user-select:text}.next-btn-text,.next-btn-text.hover,.next-btn-text:hover{box-shadow:none}.next-btn-text.next-btn-primary{background:transparent;border-color:transparent}.next-btn-text.next-btn-primary,.next-btn-text.next-btn-primary.visited,.next-btn-text.next-btn-primary:link,.next-btn-text.next-btn-primary:visited{color:#298dff}.next-btn-text.next-btn-primary.active,.next-btn-text.next-btn-primary.hover,.next-btn-text.next-btn-primary:active,.next-btn-text.next-btn-primary:focus,.next-btn-text.next-btn-primary:hover{color:#1274e7;background:transparent;border-color:transparent;text-decoration:none}.next-btn-text.next-btn-primary.disabled,.next-btn-text.next-btn-primary[disabled]{background:transparent;border-color:transparent}.next-btn-text.next-btn-primary.disabled,.next-btn-text.next-btn-primary.disabled.visited,.next-btn-text.next-btn-primary.disabled:link,.next-btn-text.next-btn-primary.disabled:visited,.next-btn-text.next-btn-primary[disabled],.next-btn-text.next-btn-primary[disabled].visited,.next-btn-text.next-btn-primary[disabled]:link,.next-btn-text.next-btn-primary[disabled]:visited{color:#ccc}.next-btn-text.next-btn-primary.disabled.active,.next-btn-text.next-btn-primary.disabled.hover,.next-btn-text.next-btn-primary.disabled:active,.next-btn-text.next-btn-primary.disabled:focus,.next-btn-text.next-btn-primary.disabled:hover,.next-btn-text.next-btn-primary[disabled].active,.next-btn-text.next-btn-primary[disabled].hover,.next-btn-text.next-btn-primary[disabled]:active,.next-btn-text.next-btn-primary[disabled]:focus,.next-btn-text.next-btn-primary[disabled]:hover{color:#ccc;background:transparent;border-color:transparent;text-decoration:none}.next-btn-text.next-btn-secondary{background:transparent;border-color:transparent}.next-btn-text.next-btn-secondary,.next-btn-text.next-btn-secondary.visited,.next-btn-text.next-btn-secondary:link,.next-btn-text.next-btn-secondary:visited{color:#666}.next-btn-text.next-btn-secondary.active,.next-btn-text.next-btn-secondary.hover,.next-btn-text.next-btn-secondary:active,.next-btn-text.next-btn-secondary:focus,.next-btn-text.next-btn-secondary:hover{color:#209bfa;background:transparent;border-color:transparent;text-decoration:none}.next-btn-text.next-btn-secondary.disabled,.next-btn-text.next-btn-secondary[disabled]{background:transparent;border-color:transparent}.next-btn-text.next-btn-secondary.disabled,.next-btn-text.next-btn-secondary.disabled.visited,.next-btn-text.next-btn-secondary.disabled:link,.next-btn-text.next-btn-secondary.disabled:visited,.next-btn-text.next-btn-secondary[disabled],.next-btn-text.next-btn-secondary[disabled].visited,.next-btn-text.next-btn-secondary[disabled]:link,.next-btn-text.next-btn-secondary[disabled]:visited{color:#ccc}.next-btn-text.next-btn-secondary.disabled.active,.next-btn-text.next-btn-secondary.disabled.hover,.next-btn-text.next-btn-secondary.disabled:active,.next-btn-text.next-btn-secondary.disabled:focus,.next-btn-text.next-btn-secondary.disabled:hover,.next-btn-text.next-btn-secondary[disabled].active,.next-btn-text.next-btn-secondary[disabled].hover,.next-btn-text.next-btn-secondary[disabled]:active,.next-btn-text.next-btn-secondary[disabled]:focus,.next-btn-text.next-btn-secondary[disabled]:hover{color:#ccc;background:transparent;border-color:transparent;text-decoration:none}.next-btn-text.next-btn-normal{background:transparent;border-color:transparent}.next-btn-text.next-btn-normal,.next-btn-text.next-btn-normal.visited,.next-btn-text.next-btn-normal:link,.next-btn-text.next-btn-normal:visited{color:#333}.next-btn-text.next-btn-normal.active,.next-btn-text.next-btn-normal.hover,.next-btn-text.next-btn-normal:active,.next-btn-text.next-btn-normal:focus,.next-btn-text.next-btn-normal:hover{color:#209bfa;background:transparent;border-color:transparent;text-decoration:none}.next-btn-text.next-btn-normal.disabled,.next-btn-text.next-btn-normal[disabled]{background:transparent;border-color:transparent}.next-btn-text.next-btn-normal.disabled,.next-btn-text.next-btn-normal.disabled.visited,.next-btn-text.next-btn-normal.disabled:link,.next-btn-text.next-btn-normal.disabled:visited,.next-btn-text.next-btn-normal[disabled],.next-btn-text.next-btn-normal[disabled].visited,.next-btn-text.next-btn-normal[disabled]:link,.next-btn-text.next-btn-normal[disabled]:visited{color:#ccc}.next-btn-text.next-btn-normal.disabled.active,.next-btn-text.next-btn-normal.disabled.hover,.next-btn-text.next-btn-normal.disabled:active,.next-btn-text.next-btn-normal.disabled:focus,.next-btn-text.next-btn-normal.disabled:hover,.next-btn-text.next-btn-normal[disabled].active,.next-btn-text.next-btn-normal[disabled].hover,.next-btn-text.next-btn-normal[disabled]:active,.next-btn-text.next-btn-normal[disabled]:focus,.next-btn-text.next-btn-normal[disabled]:hover{color:#ccc;background:transparent;border-color:transparent;text-decoration:none}.next-btn-text.next-large{border-radius:0;padding:0;height:24px;font-size:14px;border-width:0}.next-btn-text.next-large>.next-btn-icon.next-icon-first{transform:scale(1);margin-left:0;margin-right:4px}.next-btn-text.next-large>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn-text.next-large>.next-btn-icon.next-icon-first:before{width:20px;font-size:20px;line-height:inherit}.next-btn-text.next-large>.next-btn-icon.next-icon-last{transform:scale(1);margin-left:4px;margin-right:0}.next-btn-text.next-large>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn-text.next-large>.next-btn-icon.next-icon-last:before{width:20px;font-size:20px;line-height:inherit}.next-btn-text.next-large>.next-btn-icon.next-icon-alone{transform:scale(1)}.next-btn-text.next-large>.next-btn-icon.next-icon-alone .next-icon-remote,.next-btn-text.next-large>.next-btn-icon.next-icon-alone:before{width:20px;font-size:20px;line-height:inherit}.next-btn-text.next-large.next-btn-loading:before{width:20px;height:20px;font-size:20px;line-height:20px;left:0;top:50%;text-align:center;margin-right:4px}.next-btn-text.next-large.next-btn-loading>.next-icon{display:none}.next-btn-text.next-large>.next-btn-custom-loading-icon{opacity:0;width:0}.next-btn-text.next-large>.next-btn-custom-loading-icon.show{width:20px;margin-right:4px;opacity:1;transition:all .1s linear}.next-btn-text.next-medium{border-radius:0;padding:0;height:20px;font-size:14px;border-width:0}.next-btn-text.next-medium>.next-btn-icon.next-icon-first{transform:scale(1);margin-left:0;margin-right:4px}.next-btn-text.next-medium>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn-text.next-medium>.next-btn-icon.next-icon-first:before{width:20px;font-size:20px;line-height:inherit}.next-btn-text.next-medium>.next-btn-icon.next-icon-last{transform:scale(1);margin-left:4px;margin-right:0}.next-btn-text.next-medium>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn-text.next-medium>.next-btn-icon.next-icon-last:before{width:20px;font-size:20px;line-height:inherit}.next-btn-text.next-medium>.next-btn-icon.next-icon-alone{transform:scale(1)}.next-btn-text.next-medium>.next-btn-icon.next-icon-alone .next-icon-remote,.next-btn-text.next-medium>.next-btn-icon.next-icon-alone:before{width:20px;font-size:20px;line-height:inherit}.next-btn-text.next-medium.next-btn-loading:before{width:20px;height:20px;font-size:20px;line-height:20px;left:0;top:50%;text-align:center;margin-right:4px}.next-btn-text.next-medium.next-btn-loading>.next-icon{display:none}.next-btn-text.next-medium>.next-btn-custom-loading-icon{opacity:0;width:0}.next-btn-text.next-medium>.next-btn-custom-loading-icon.show{width:20px;margin-right:4px;opacity:1;transition:all .1s linear}.next-btn-text.next-small{border-radius:0;padding:0;height:16px;font-size:12px;border-width:0}.next-btn-text.next-small>.next-btn-icon.next-icon-first{transform:scale(1);margin-left:0;margin-right:4px}.next-btn-text.next-small>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn-text.next-small>.next-btn-icon.next-icon-first:before{width:12px;font-size:12px;line-height:inherit}.next-btn-text.next-small>.next-btn-icon.next-icon-last{transform:scale(1);margin-left:4px;margin-right:0}.next-btn-text.next-small>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn-text.next-small>.next-btn-icon.next-icon-last:before{width:12px;font-size:12px;line-height:inherit}.next-btn-text.next-small>.next-btn-icon.next-icon-alone{transform:scale(1)}.next-btn-text.next-small>.next-btn-icon.next-icon-alone .next-icon-remote,.next-btn-text.next-small>.next-btn-icon.next-icon-alone:before{width:12px;font-size:12px;line-height:inherit}.next-btn-text.next-small.next-btn-loading:before{width:12px;height:12px;font-size:12px;line-height:12px;left:0;top:50%;text-align:center;margin-right:4px}.next-btn-text.next-small.next-btn-loading>.next-icon{display:none}.next-btn-text.next-small>.next-btn-custom-loading-icon{opacity:0;width:0}.next-btn-text.next-small>.next-btn-custom-loading-icon.show{width:12px;margin-right:4px;opacity:1;transition:all .1s linear}.next-btn-text.next-btn-loading{background:transparent;border-color:transparent}.next-btn-text.next-btn-loading,.next-btn-text.next-btn-loading.visited,.next-btn-text.next-btn-loading:link,.next-btn-text.next-btn-loading:visited{color:#333}.next-btn-text.next-btn-loading.active,.next-btn-text.next-btn-loading.hover,.next-btn-text.next-btn-loading:active,.next-btn-text.next-btn-loading:focus,.next-btn-text.next-btn-loading:hover{color:#333;background:transparent;border-color:transparent;text-decoration:none}.next-btn-loading{pointer-events:none}.next-btn-loading:before{font-family:NextIcon;content:"顧�";opacity:1;visibility:visible;animation:loadingCircle 2s linear infinite}.next-btn-loading:after{content:"";display:inline-block;position:static;height:100%;width:0;vertical-align:middle}.next-btn-custom-loading{pointer-events:none}.next-btn-ghost{box-shadow:none;border-style:solid}.next-btn-ghost.next-btn-dark{background:transparent;border-color:#fff}.next-btn-ghost.next-btn-dark,.next-btn-ghost.next-btn-dark.visited,.next-btn-ghost.next-btn-dark:link,.next-btn-ghost.next-btn-dark:visited{color:#fff}.next-btn-ghost.next-btn-dark.active,.next-btn-ghost.next-btn-dark.hover,.next-btn-ghost.next-btn-dark:active,.next-btn-ghost.next-btn-dark:focus,.next-btn-ghost.next-btn-dark:hover{color:#fff;background:hsla(0,0%,100%,.8);border-color:#fff;text-decoration:none}.next-btn-ghost.next-btn-dark.disabled,.next-btn-ghost.next-btn-dark[disabled]{background:transparent;border-color:hsla(0,0%,100%,.4)}.next-btn-ghost.next-btn-dark.disabled,.next-btn-ghost.next-btn-dark.disabled.visited,.next-btn-ghost.next-btn-dark.disabled:link,.next-btn-ghost.next-btn-dark.disabled:visited,.next-btn-ghost.next-btn-dark[disabled],.next-btn-ghost.next-btn-dark[disabled].visited,.next-btn-ghost.next-btn-dark[disabled]:link,.next-btn-ghost.next-btn-dark[disabled]:visited{color:hsla(0,0%,100%,.4)}.next-btn-ghost.next-btn-dark.disabled.active,.next-btn-ghost.next-btn-dark.disabled.hover,.next-btn-ghost.next-btn-dark.disabled:active,.next-btn-ghost.next-btn-dark.disabled:focus,.next-btn-ghost.next-btn-dark.disabled:hover,.next-btn-ghost.next-btn-dark[disabled].active,.next-btn-ghost.next-btn-dark[disabled].hover,.next-btn-ghost.next-btn-dark[disabled]:active,.next-btn-ghost.next-btn-dark[disabled]:focus,.next-btn-ghost.next-btn-dark[disabled]:hover{color:hsla(0,0%,100%,.4);background:transparent;border-color:hsla(0,0%,100%,.4);text-decoration:none}.next-btn-ghost.next-btn-light{background:transparent;border-color:#333}.next-btn-ghost.next-btn-light,.next-btn-ghost.next-btn-light.visited,.next-btn-ghost.next-btn-light:link,.next-btn-ghost.next-btn-light:visited{color:#333}.next-btn-ghost.next-btn-light.active,.next-btn-ghost.next-btn-light.hover,.next-btn-ghost.next-btn-light:active,.next-btn-ghost.next-btn-light:focus,.next-btn-ghost.next-btn-light:hover{color:#999;background:rgba(0,0,0,.92);border-color:#333;text-decoration:none}.next-btn-ghost.next-btn-light.disabled,.next-btn-ghost.next-btn-light[disabled]{background:transparent;border-color:rgba(0,0,0,.1)}.next-btn-ghost.next-btn-light.disabled,.next-btn-ghost.next-btn-light.disabled.visited,.next-btn-ghost.next-btn-light.disabled:link,.next-btn-ghost.next-btn-light.disabled:visited,.next-btn-ghost.next-btn-light[disabled],.next-btn-ghost.next-btn-light[disabled].visited,.next-btn-ghost.next-btn-light[disabled]:link,.next-btn-ghost.next-btn-light[disabled]:visited{color:rgba(0,0,0,.1)}.next-btn-ghost.next-btn-light.disabled.active,.next-btn-ghost.next-btn-light.disabled.hover,.next-btn-ghost.next-btn-light.disabled:active,.next-btn-ghost.next-btn-light.disabled:focus,.next-btn-ghost.next-btn-light.disabled:hover,.next-btn-ghost.next-btn-light[disabled].active,.next-btn-ghost.next-btn-light[disabled].hover,.next-btn-ghost.next-btn-light[disabled]:active,.next-btn-ghost.next-btn-light[disabled]:focus,.next-btn-ghost.next-btn-light[disabled]:hover{color:rgba(0,0,0,.1);background:transparent;border-color:rgba(0,0,0,.1);text-decoration:none}.next-btn-group{position:relative;display:inline-block;vertical-align:middle}.next-btn-group>.next-btn{position:relative;float:left;box-shadow:none}.next-btn-group>.next-btn.active,.next-btn-group>.next-btn:active,.next-btn-group>.next-btn:focus,.next-btn-group>.next-btn:hover{z-index:1}.next-btn-group>.next-btn.disabled,.next-btn-group>.next-btn[disabled]{z-index:0}.next-btn-group .next-btn.next-btn{margin:0 0 0 -1px}.next-btn-group .next-btn:not(:first-child):not(:last-child){border-radius:0}.next-btn-group>.next-btn:first-child{margin:0}.next-btn-group>.next-btn:first-child:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.next-btn-group>.next-btn:last-child:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.next-btn-group>.next-btn-primary:not(:first-child){border-left-color:hsla(0,0%,100%,.2)}.next-btn-group>.next-btn-primary:not(:first-child):hover{border-left-color:transparent}.next-btn-group>.next-btn-primary:not(:first-child).disabled,.next-btn-group>.next-btn-primary:not(:first-child)[disabled]{border-left-color:#eee}.next-btn-group[dir=rtl]>.next-btn{float:right}.next-btn-group[dir=rtl] .next-btn.next-btn{margin:0 -1px 0 0}.next-btn-group[dir=rtl]>.next-btn:first-child:not(:last-child){border-bottom-left-radius:0;border-top-left-radius:0}.next-btn-group[dir=rtl]>.next-btn:last-child:not(:first-child){border-bottom-right-radius:0;border-top-right-radius:0}.next-btn-group[dir=rtl]>.next-btn-primary:not(:first-child){border-right-color:hsla(0,0%,100%,.2)}.next-btn-group[dir=rtl]>.next-btn-primary:not(:first-child):hover{border-right-color:transparent}.next-btn-group[dir=rtl]>.next-btn-primary:not(:first-child).disabled,.next-btn-group[dir=rtl]>.next-btn-primary:not(:first-child)[disabled]{border-right-color:#eee}.next-btn.next-small[dir=rtl]{border-radius:3px}.next-btn.next-small[dir=rtl]>.next-btn-icon.next-icon-first{margin-left:4px;margin-right:0}.next-btn.next-small[dir=rtl]>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn.next-small[dir=rtl]>.next-btn-icon.next-icon-first:before{width:12px;font-size:12px;line-height:inherit}.next-btn.next-small[dir=rtl]>.next-btn-icon.next-icon-last{margin-left:0;margin-right:4px}.next-btn.next-small[dir=rtl]>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn.next-small[dir=rtl]>.next-btn-icon.next-icon-last:before{width:12px;font-size:12px;line-height:inherit}.next-btn.next-small[dir=rtl].next-btn-loading{padding-left:16px;padding-right:32px}.next-btn.next-small[dir=rtl].next-btn-loading:after{right:16px;top:50%;margin-right:0;margin-left:4px}.next-btn.next-medium[dir=rtl]{border-radius:3px}.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-first{margin-left:4px;margin-right:0}.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-first:before{width:20px;font-size:20px;line-height:inherit}.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-last{margin-left:0;margin-right:4px}.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-last:before{width:20px;font-size:20px;line-height:inherit}.next-btn.next-medium[dir=rtl].next-btn-loading{padding-left:20px;padding-right:44px}.next-btn.next-medium[dir=rtl].next-btn-loading:after{right:20px;top:50%;margin-right:0;margin-left:4px}.next-btn.next-large[dir=rtl]{border-radius:3px}.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-first{margin-left:4px;margin-right:0}.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-first:before{width:20px;font-size:20px;line-height:inherit}.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-last{margin-left:0;margin-right:4px}.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-last:before{width:20px;font-size:20px;line-height:inherit}.next-btn.next-large[dir=rtl].next-btn-loading{padding-left:24px;padding-right:48px}.next-btn.next-large[dir=rtl].next-btn-loading:after{right:24px;top:50%;margin-right:0;margin-left:4px}.next-btn-text[dir=rtl].next-large{border-radius:0}.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-first{margin-left:4px;margin-right:0}.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-first:before{width:20px;font-size:20px;line-height:inherit}.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-last{margin-left:0;margin-right:4px}.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-last:before{width:20px;font-size:20px;line-height:inherit}.next-btn-text[dir=rtl].next-large.next-btn-loading{padding-left:0;padding-right:24px}.next-btn-text[dir=rtl].next-large.next-btn-loading:after{right:0;top:50%;margin-right:0;margin-left:4px}.next-btn-text[dir=rtl].next-medium{border-radius:0}.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-first{margin-left:4px;margin-right:0}.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-first:before{width:20px;font-size:20px;line-height:inherit}.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-last{margin-left:0;margin-right:4px}.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-last:before{width:20px;font-size:20px;line-height:inherit}.next-btn-text[dir=rtl].next-medium.next-btn-loading{padding-left:0;padding-right:24px}.next-btn-text[dir=rtl].next-medium.next-btn-loading:after{right:0;top:50%;margin-right:0;margin-left:4px}.next-btn-text[dir=rtl].next-small{border-radius:0}.next-btn-text[dir=rtl].next-small>.next-btn-icon.next-icon-first{margin-left:4px;margin-right:0}.next-btn-text[dir=rtl].next-small>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn-text[dir=rtl].next-small>.next-btn-icon.next-icon-first:before{width:12px;font-size:12px;line-height:inherit}.next-btn-text[dir=rtl].next-small>.next-btn-icon.next-icon-last{margin-left:0;margin-right:4px}.next-btn-text[dir=rtl].next-small>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn-text[dir=rtl].next-small>.next-btn-icon.next-icon-last:before{width:12px;font-size:12px;line-height:inherit}.next-btn-text[dir=rtl].next-small.next-btn-loading{padding-left:0;padding-right:16px}.next-btn-text[dir=rtl].next-small.next-btn-loading:after{right:0;top:50%;margin-right:0;margin-left:4px}.next-input{vertical-align:middle;display:inline-table;border-collapse:separate;font-size:0;line-height:1;width:200px;border-spacing:0;transition:all .1s linear;border:1px solid #ddd;background-color:#fff}.next-input,.next-input *,.next-input :after,.next-input :before{box-sizing:border-box}.next-input input{height:100%}.next-input input[type=reset],.next-input input[type=submit]{-webkit-appearance:button;cursor:pointer}.next-input input::-moz-focus-inner{border:0;padding:0}.next-input input:-webkit-autofill{-webkit-box-shadow:0 0 0 1000px #fff inset;border-radius:3px}.next-input input[type=password]::-ms-reveal{display:none}.next-input textarea{resize:none}.next-input input,.next-input textarea{width:100%;border:none;outline:none;padding:0;margin:0;font-weight:400;vertical-align:middle;background-color:transparent;color:#333}.next-input input::-ms-clear,.next-input textarea::-ms-clear{display:none}.next-input.next-small{height:24px;border-radius:3px}.next-input.next-small .next-input-label{padding-left:8px;font-size:12px}.next-input.next-small .next-input-inner{font-size:12px}.next-input.next-small .next-input-control,.next-input.next-small .next-input-inner-text{padding-right:4px}.next-input.next-small input{height:22px;line-height:22px \0 ;padding:0 4px;font-size:12px}.next-input.next-small input::placeholder{font-size:12px}.next-input.next-small .next-input-text-field{padding:0 4px;font-size:12px;height:22px;line-height:22px}.next-input.next-small .next-icon .next-icon-remote,.next-input.next-small .next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-input.next-small .next-input-control{border-radius:0 3px 3px 0}.next-input.next-medium{height:32px;border-radius:3px}.next-input.next-medium .next-input-label{padding-left:8px;font-size:14px}.next-input.next-medium .next-input-inner{font-size:14px}.next-input.next-medium .next-input-control,.next-input.next-medium .next-input-inner-text{padding-right:8px}.next-input.next-medium input{height:30px;line-height:30px \0 ;padding:0 8px;font-size:14px}.next-input.next-medium input::placeholder{font-size:14px}.next-input.next-medium .next-input-text-field{padding:0 8px;font-size:14px;height:30px;line-height:30px}.next-input.next-medium .next-icon .next-icon-remote,.next-input.next-medium .next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-input.next-medium .next-input-control{border-radius:0 3px 3px 0}.next-input.next-large{height:40px;border-radius:3px}.next-input.next-large .next-input-label{padding-left:12px;font-size:16px}.next-input.next-large .next-input-inner{font-size:16px}.next-input.next-large .next-input-control,.next-input.next-large .next-input-inner-text{padding-right:8px}.next-input.next-large input{height:38px;line-height:38px \0 ;padding:0 12px;font-size:16px}.next-input.next-large input::placeholder{font-size:16px}.next-input.next-large .next-input-text-field{padding:0 12px;font-size:16px;height:38px;line-height:38px}.next-input.next-large .next-icon .next-icon-remote,.next-input.next-large .next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-input.next-large .next-input-control{border-radius:0 3px 3px 0}.next-input.next-input-textarea{height:auto;border-radius:3px;font-size:0}.next-input.next-input-textarea textarea{color:#333;padding:4px 8px;font-size:14px;border-radius:3px}.next-input.next-input-textarea.next-small textarea{font-size:14px}.next-input.next-input-textarea.next-large textarea{font-size:16px}.next-input.next-input-textarea .next-input-control{display:block;width:auto;border-radius:3px}.next-input.next-input-textarea .next-input-len{padding:0 8px 4px;display:block;text-align:right;width:auto}.next-input-hint-wrap{color:#999;position:relative}.next-input-hint-wrap .next-input-clear{opacity:0;z-index:1;position:absolute}.next-input-hint-wrap .next-input-hint{opacity:1}.next-input .next-icon-eye-close:hover,.next-input .next-icon-eye:hover,.next-input .next-input-clear-icon:hover{cursor:pointer;color:#666}.next-input .next-input-hover-show{opacity:0}.next-input.next-focus,.next-input:hover{border-color:#ccc;background-color:#fff}.next-input.next-focus .next-input-clear,.next-input:hover .next-input-clear{opacity:1}.next-input.next-focus .next-input-clear+.next-input-hint,.next-input:hover .next-input-clear+.next-input-hint{opacity:0}.next-input.next-focus .next-input-hover-show,.next-input .next-input-clear:focus,.next-input:hover .next-input-hover-show{opacity:1}.next-input .next-input-clear:focus+.next-input-hint{opacity:0}.next-input.next-focus{border-color:#209bfa;background-color:#fff;box-shadow:0 0 0 2px rgba(32,155,250,.2)}.next-input.next-warning{border-color:#f1c826;background-color:#fff}.next-input.next-warning.next-focus,.next-input.next-warning:hover{border-color:#f1c826}.next-input.next-warning.next-focus{box-shadow:0 0 0 2px rgba(241,200,38,.2)}.next-input.next-error{border-color:#d23c26;background-color:#fff}.next-input.next-error input,.next-input.next-error textarea{color:#333}.next-input.next-error.next-focus,.next-input.next-error:hover{border-color:#d23c26}.next-input.next-error.next-focus{box-shadow:0 0 0 2px rgba(210,60,38,.2)}.next-input.next-hidden{display:none}.next-input.next-noborder{border:none;box-shadow:none}.next-input-control .next-input-len{font-size:12px;line-height:12px;color:#999;display:table-cell;width:1px;vertical-align:bottom}.next-input-control .next-input-len.next-error{color:#d23c26}.next-input-control .next-input-len.next-warning{color:#f1c826}.next-input-control>*{display:table-cell;width:1%;top:0}.next-input-control>:not(:last-child){padding-right:4px}.next-input-control .next-icon{transition:all .1s linear;color:#999}.next-input-control .next-input-warning-icon{color:#f1c826}.next-input-control .next-input-warning-icon:before{content:"顦�"}.next-input-control .next-input-success-icon{color:#1ad78c}.next-input-control .next-input-success-icon:before{content:"顦�"}.next-input-control .next-input-loading-icon{color:#298dff}.next-input-control .next-input-loading-icon:before{content:"顧�";animation:loadingCircle 1s linear infinite}.next-input-control .next-input-clear-icon:before{content:"顦�"}.next-input-inner-text,.next-input-label{color:#666}.next-input input::-moz-placeholder,.next-input textarea::-moz-placeholder{color:#ccc;opacity:1}.next-input input:-ms-input-placeholder,.next-input textarea:-ms-input-placeholder{color:#ccc}.next-input input::-webkit-input-placeholder,.next-input textarea::-webkit-input-placeholder{color:#ccc}.next-input.next-disabled{color:#ccc;cursor:not-allowed}.next-input.next-disabled,.next-input.next-disabled:hover{border-color:#eee;background-color:#fafafa}.next-input.next-disabled input,.next-input.next-disabled textarea{-webkit-text-fill-color:#ccc;color:#ccc}.next-input.next-disabled input::-moz-placeholder,.next-input.next-disabled textarea::-moz-placeholder{color:#ccc;opacity:1}.next-input.next-disabled input:-ms-input-placeholder,.next-input.next-disabled textarea:-ms-input-placeholder{color:#ccc}.next-input.next-disabled input::-webkit-input-placeholder,.next-input.next-disabled textarea::-webkit-input-placeholder{color:#ccc}.next-input.next-disabled .next-input-hint-wrap,.next-input.next-disabled .next-input-inner-text,.next-input.next-disabled .next-input-label,.next-input.next-disabled .next-input-len{color:#ccc}.next-input.next-disabled .next-input-hint-wrap .next-input-clear{opacity:0}.next-input.next-disabled .next-input-hint-wrap .next-input-hint{opacity:1}.next-input.next-disabled .next-input-hint-wrap .next-input-clear-icon:hover{cursor:not-allowed;color:#ccc}.next-input.next-disabled .next-icon{color:#ccc}.next-input-control,.next-input-inner,.next-input-label{display:table-cell;width:1px;vertical-align:middle;line-height:1;background-color:transparent;white-space:nowrap}.next-input-group{display:inline-table;border-collapse:separate;border-spacing:0;line-height:0;width:100%}.next-input-group,.next-input-group *,.next-input-group :after,.next-input-group :before{box-sizing:border-box}.next-input-group-auto-width{width:100%;border-radius:0!important}.next-input-group>.next-input{border-radius:0}.next-input-group>.next-input.next-focus{position:relative;z-index:1}.next-input-group>.next-input:first-child.next-large,.next-input-group>.next-input:first-child.next-medium,.next-input-group>.next-input:first-child.next-small{border-top-left-radius:3px!important;border-bottom-left-radius:3px!important}.next-input-group>.next-input:last-child.next-large,.next-input-group>.next-input:last-child.next-medium,.next-input-group>.next-input:last-child.next-small{border-top-right-radius:3px!important;border-bottom-right-radius:3px!important}.next-input-group-addon{width:1px;display:table-cell;vertical-align:middle;white-space:nowrap}.next-input-group-addon:first-child,.next-input-group-addon:first-child>*{border-bottom-right-radius:0!important;border-top-right-radius:0!important}.next-input-group-addon:first-child>*{margin-right:-1px}.next-input-group-addon:first-child>.next-focus{position:relative;z-index:1}.next-input-group-addon:first-child>*>.next-input{border-bottom-right-radius:0!important;border-top-right-radius:0!important}.next-input-group-addon:first-child>*>.next-input.next-focus{position:relative;z-index:1}.next-input-group-addon:last-child,.next-input-group-addon:last-child>*{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.next-input-group-addon:last-child>*{margin-left:-1px}.next-input-group-addon:last-child>*>.next-input{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.next-input-group-text{color:#999;background-color:#f9f9f9;text-align:center;border:1px solid #ddd;padding:0 8px}.next-input-group-text:first-child{border-right-width:0}.next-input-group-text:last-child{border-left-width:0}.next-input-group-text.next-disabled{color:#ccc;cursor:not-allowed}.next-input-group-text.next-disabled,.next-input-group-text.next-disabled:hover{border-color:#eee;background-color:#fafafa}.next-input-group-text.next-small{font-size:12px;border-radius:3px}.next-input-group-text.next-medium{font-size:14px;border-radius:3px}.next-input-group-text.next-large{font-size:16px;border-radius:3px}.next-input[dir=rtl].next-small .next-input-label{padding-left:0;padding-right:8px}.next-input[dir=rtl].next-small .next-input-control{padding-right:0;padding-left:4px}.next-input[dir=rtl].next-medium .next-input-label{padding-left:0;padding-right:8px}.next-input[dir=rtl].next-medium .next-input-control{padding-right:0;padding-left:8px}.next-input[dir=rtl].next-large .next-input-label{padding-left:0;padding-right:12px}.next-input[dir=rtl].next-large .next-input-control{padding-right:0;padding-left:8px}.next-input[dir=rtl].next-input-textarea .next-input-len{text-align:left}.next-input[dir=rtl] .next-input-control>:not(:last-child){padding-left:4px;padding-right:0}.next-input-group[dir=rtl]>.next-input:first-child.next-large,.next-input-group[dir=rtl]>.next-input:first-child.next-medium,.next-input-group[dir=rtl]>.next-input:first-child.next-small{border-top-left-radius:0!important;border-bottom-left-radius:0!important;border-top-right-radius:3px!important;border-bottom-right-radius:3px!important}.next-input-group[dir=rtl]>.next-input:last-child.next-large,.next-input-group[dir=rtl]>.next-input:last-child.next-medium,.next-input-group[dir=rtl]>.next-input:last-child.next-small{border-top-left-radius:3px!important;border-bottom-left-radius:3px!important;border-top-right-radius:0!important;border-bottom-right-radius:0!important}.next-input-group[dir=rtl] .next-input-group-addon:first-child,.next-input-group[dir=rtl] .next-input-group-addon:first-child>*>.next-input,.next-input-group[dir=rtl] .next-input-group-addon:first-child>.next-input{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.next-input-group[dir=rtl] .next-input-group-addon:first-child.next-large,.next-input-group[dir=rtl] .next-input-group-addon:first-child.next-medium,.next-input-group[dir=rtl] .next-input-group-addon:first-child.next-small,.next-input-group[dir=rtl] .next-input-group-addon:first-child>*>.next-input.next-large,.next-input-group[dir=rtl] .next-input-group-addon:first-child>*>.next-input.next-medium,.next-input-group[dir=rtl] .next-input-group-addon:first-child>*>.next-input.next-small,.next-input-group[dir=rtl] .next-input-group-addon:first-child>.next-input.next-large,.next-input-group[dir=rtl] .next-input-group-addon:first-child>.next-input.next-medium,.next-input-group[dir=rtl] .next-input-group-addon:first-child>.next-input.next-small{border-bottom-right-radius:3px!important;border-top-right-radius:3px!important}.next-input-group[dir=rtl] .next-input-group-addon:first-child>*{margin-left:-1px;border-bottom-left-radius:0!important;border-top-left-radius:0!important}.next-input-group[dir=rtl] .next-input-group-addon:last-child,.next-input-group[dir=rtl] .next-input-group-addon:last-child>*>.next-input,.next-input-group[dir=rtl] .next-input-group-addon:last-child>.next-input{border-bottom-right-radius:0!important;border-top-right-radius:0!important}.next-input-group[dir=rtl] .next-input-group-addon:last-child.next-large,.next-input-group[dir=rtl] .next-input-group-addon:last-child.next-medium,.next-input-group[dir=rtl] .next-input-group-addon:last-child.next-small,.next-input-group[dir=rtl] .next-input-group-addon:last-child>*>.next-input.next-large,.next-input-group[dir=rtl] .next-input-group-addon:last-child>*>.next-input.next-medium,.next-input-group[dir=rtl] .next-input-group-addon:last-child>*>.next-input.next-small,.next-input-group[dir=rtl] .next-input-group-addon:last-child>.next-input.next-large,.next-input-group[dir=rtl] .next-input-group-addon:last-child>.next-input.next-medium,.next-input-group[dir=rtl] .next-input-group-addon:last-child>.next-input.next-small{border-bottom-left-radius:3px!important;border-top-left-radius:3px!important}.next-input-group[dir=rtl] .next-input-group-addon:last-child>*{margin-right:-1px;border-bottom-right-radius:0!important;border-top-right-radius:0!important}.next-input-group[dir=rtl] .next-input-group-text:first-child{border-right-width:1px;border-left:0}.next-input-group[dir=rtl] .next-input-group-text:last-child{border-left-width:1px;border-right:0}.next-calendar,.next-calendar *,.next-calendar :after,.next-calendar :before{box-sizing:border-box}.next-calendar table{border-collapse:collapse;border-spacing:0}.next-calendar td,.next-calendar th{padding:0}@keyframes cellZoomIn{0%{transform:scale(.5)}to{transform:scale(1)}}@keyframes cellHover{0%{opacity:0}to{opacity:1}}@keyframes enterToLeft{0%{transform:translate(-40%);opacity:0}50%{opacity:.6}to{opacity:1;transform:translate(0)}}@keyframes enterToRight{0%{transform:translate(40%);opacity:0}50%{opacity:.6}to{opacity:1;transform:translate(0)}}.next-calendar-card .next-calendar-header,.next-calendar-fullscreen .next-calendar-header{text-align:right}.next-calendar-card .next-calendar-header .next-select,.next-calendar-fullscreen .next-calendar-header .next-select{margin-right:4px;vertical-align:top}.next-calendar-card .next-calendar-header .next-menu,.next-calendar-fullscreen .next-calendar-header .next-menu{text-align:left}.next-calendar-card .next-calendar-header,.next-calendar-fullscreen .next-calendar-header{margin-bottom:8px}.next-calendar-panel-header{position:relative;background:#fff;margin-bottom:8px;border-bottom:1px solid transparent}.next-calendar-panel-header-full,.next-calendar-panel-header-left,.next-calendar-panel-header-right{height:32px;line-height:32px}.next-calendar-panel-header-full .next-calendar-btn,.next-calendar-panel-header-left .next-calendar-btn,.next-calendar-panel-header-right .next-calendar-btn{vertical-align:top;font-weight:700;margin:0 4px;background:transparent;border-color:transparent}.next-calendar-panel-header-full .next-calendar-btn,.next-calendar-panel-header-full .next-calendar-btn.visited,.next-calendar-panel-header-full .next-calendar-btn:link,.next-calendar-panel-header-full .next-calendar-btn:visited,.next-calendar-panel-header-left .next-calendar-btn,.next-calendar-panel-header-left .next-calendar-btn.visited,.next-calendar-panel-header-left .next-calendar-btn:link,.next-calendar-panel-header-left .next-calendar-btn:visited,.next-calendar-panel-header-right .next-calendar-btn,.next-calendar-panel-header-right .next-calendar-btn.visited,.next-calendar-panel-header-right .next-calendar-btn:link,.next-calendar-panel-header-right .next-calendar-btn:visited{color:#000}.next-calendar-panel-header-full .next-calendar-btn.active,.next-calendar-panel-header-full .next-calendar-btn.hover,.next-calendar-panel-header-full .next-calendar-btn:active,.next-calendar-panel-header-full .next-calendar-btn:focus,.next-calendar-panel-header-full .next-calendar-btn:hover,.next-calendar-panel-header-left .next-calendar-btn.active,.next-calendar-panel-header-left .next-calendar-btn.hover,.next-calendar-panel-header-left .next-calendar-btn:active,.next-calendar-panel-header-left .next-calendar-btn:focus,.next-calendar-panel-header-left .next-calendar-btn:hover,.next-calendar-panel-header-right .next-calendar-btn.active,.next-calendar-panel-header-right .next-calendar-btn.hover,.next-calendar-panel-header-right .next-calendar-btn:active,.next-calendar-panel-header-right .next-calendar-btn:focus,.next-calendar-panel-header-right .next-calendar-btn:hover{color:#fff;background:transparent;border-color:transparent;text-decoration:none}.next-calendar-panel-header-left,.next-calendar-panel-header-right{display:inline-block;width:50%;text-align:center}.next-calendar-panel-header-full{width:100%;text-align:center}.next-calendar-panel-menu{max-height:210px;overflow:auto;text-align:left}.next-calendar-btn{cursor:pointer;padding:0;margin:0;border:0;background:transparent;outline:none;height:100%}.next-calendar-btn>.next-icon.next-icon .next-icon-remote,.next-calendar-btn>.next-icon.next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-calendar-btn .next-icon{margin-left:4px}.next-calendar-btn-next-decade,.next-calendar-btn-next-month,.next-calendar-btn-next-year,.next-calendar-btn-prev-decade,.next-calendar-btn-prev-month,.next-calendar-btn-prev-year{position:absolute;top:0;background:transparent;border-color:transparent}.next-calendar-btn-next-decade,.next-calendar-btn-next-decade.visited,.next-calendar-btn-next-decade:link,.next-calendar-btn-next-decade:visited,.next-calendar-btn-next-month,.next-calendar-btn-next-month.visited,.next-calendar-btn-next-month:link,.next-calendar-btn-next-month:visited,.next-calendar-btn-next-year,.next-calendar-btn-next-year.visited,.next-calendar-btn-next-year:link,.next-calendar-btn-next-year:visited,.next-calendar-btn-prev-decade,.next-calendar-btn-prev-decade.visited,.next-calendar-btn-prev-decade:link,.next-calendar-btn-prev-decade:visited,.next-calendar-btn-prev-month,.next-calendar-btn-prev-month.visited,.next-calendar-btn-prev-month:link,.next-calendar-btn-prev-month:visited,.next-calendar-btn-prev-year,.next-calendar-btn-prev-year.visited,.next-calendar-btn-prev-year:link,.next-calendar-btn-prev-year:visited{color:#666}.next-calendar-btn-next-decade.active,.next-calendar-btn-next-decade.hover,.next-calendar-btn-next-decade:active,.next-calendar-btn-next-decade:focus,.next-calendar-btn-next-decade:hover,.next-calendar-btn-next-month.active,.next-calendar-btn-next-month.hover,.next-calendar-btn-next-month:active,.next-calendar-btn-next-month:focus,.next-calendar-btn-next-month:hover,.next-calendar-btn-next-year.active,.next-calendar-btn-next-year.hover,.next-calendar-btn-next-year:active,.next-calendar-btn-next-year:focus,.next-calendar-btn-next-year:hover,.next-calendar-btn-prev-decade.active,.next-calendar-btn-prev-decade.hover,.next-calendar-btn-prev-decade:active,.next-calendar-btn-prev-decade:focus,.next-calendar-btn-prev-decade:hover,.next-calendar-btn-prev-month.active,.next-calendar-btn-prev-month.hover,.next-calendar-btn-prev-month:active,.next-calendar-btn-prev-month:focus,.next-calendar-btn-prev-month:hover,.next-calendar-btn-prev-year.active,.next-calendar-btn-prev-year.hover,.next-calendar-btn-prev-year:active,.next-calendar-btn-prev-year:focus,.next-calendar-btn-prev-year:hover{color:#209bfa;background:transparent;border-color:transparent;text-decoration:none}.next-calendar-btn-prev-decade,.next-calendar-btn-prev-year{left:8px}.next-calendar-btn-prev-month{left:28px}.next-calendar-btn-next-month{right:28px}.next-calendar-btn-next-decade,.next-calendar-btn-next-year{right:8px}.next-calendar-fullscreen .next-calendar-th{text-align:right;color:#333;font-size:16px;font-weight:700;padding-right:12px;padding-bottom:4px}.next-calendar-fullscreen .next-calendar-cell{font-size:14px}.next-calendar-fullscreen .next-calendar-cell.next-selected .next-calendar-date,.next-calendar-fullscreen .next-calendar-cell.next-selected .next-calendar-month{font-weight:700;background:#add9ff;color:#209bfa;border-color:#209bfa}.next-calendar-fullscreen .next-calendar-cell.next-disabled .next-calendar-date,.next-calendar-fullscreen .next-calendar-cell.next-disabled .next-calendar-month{cursor:not-allowed;background:#fafafa;color:#ccc;border-color:#eee}.next-calendar-fullscreen .next-calendar-date,.next-calendar-fullscreen .next-calendar-month{text-align:right;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:0 4px;padding:4px 8px;min-height:80px;transition:background .1s linear;background:#fff;color:#333;border-color:currentcolor #e6e6e6 #e6e6e6;border-top:2px solid #e6e6e6}.next-calendar-fullscreen .next-calendar-date:hover,.next-calendar-fullscreen .next-calendar-month:hover{background:#add9ff;color:#209bfa;border-color:#209bfa}.next-calendar-fullscreen .next-calendar-cell-next-month .next-calendar-date,.next-calendar-fullscreen .next-calendar-cell-prev-month .next-calendar-date{background:transparent;color:#ccc;border-color:transparent}.next-calendar-fullscreen .next-calendar-cell-current .next-calendar-date,.next-calendar-fullscreen .next-calendar-cell-current .next-calendar-month{font-weight:700;background:#fff;color:#209bfa;border-color:#209bfa}.next-calendar-card .next-calendar-th,.next-calendar-panel .next-calendar-th,.next-calendar-range .next-calendar-th{text-align:center;color:#999;font-size:12px;font-weight:400}.next-calendar-card .next-calendar-cell,.next-calendar-panel .next-calendar-cell,.next-calendar-range .next-calendar-cell{text-align:center;font-size:12px}.next-calendar-card .next-calendar-cell.next-selected .next-calendar-date,.next-calendar-card .next-calendar-cell.next-selected .next-calendar-month,.next-calendar-card .next-calendar-cell.next-selected .next-calendar-year,.next-calendar-panel .next-calendar-cell.next-selected .next-calendar-date,.next-calendar-panel .next-calendar-cell.next-selected .next-calendar-month,.next-calendar-panel .next-calendar-cell.next-selected .next-calendar-year,.next-calendar-range .next-calendar-cell.next-selected .next-calendar-date,.next-calendar-range .next-calendar-cell.next-selected .next-calendar-month,.next-calendar-range .next-calendar-cell.next-selected .next-calendar-year{animation:cellZoomIn .4s cubic-bezier(.23,1,.32,1);font-weight:700;background:#209bfa;color:#fff;border-color:#209bfa}.next-calendar-card .next-calendar-cell.next-disabled .next-calendar-date,.next-calendar-card .next-calendar-cell.next-disabled .next-calendar-month,.next-calendar-card .next-calendar-cell.next-disabled .next-calendar-year,.next-calendar-panel .next-calendar-cell.next-disabled .next-calendar-date,.next-calendar-panel .next-calendar-cell.next-disabled .next-calendar-month,.next-calendar-panel .next-calendar-cell.next-disabled .next-calendar-year,.next-calendar-range .next-calendar-cell.next-disabled .next-calendar-date,.next-calendar-range .next-calendar-cell.next-disabled .next-calendar-month,.next-calendar-range .next-calendar-cell.next-disabled .next-calendar-year{cursor:not-allowed;background:#fafafa;color:#ccc;border-color:#fafafa}.next-calendar-card .next-calendar-cell.next-inrange .next-calendar-date,.next-calendar-panel .next-calendar-cell.next-inrange .next-calendar-date,.next-calendar-range .next-calendar-cell.next-inrange .next-calendar-date{background:#e4f3fe;color:#209bfa;border-color:#e4f3fe}.next-calendar-card .next-calendar-date,.next-calendar-card .next-calendar-month,.next-calendar-card .next-calendar-year,.next-calendar-panel .next-calendar-date,.next-calendar-panel .next-calendar-month,.next-calendar-panel .next-calendar-year,.next-calendar-range .next-calendar-date,.next-calendar-range .next-calendar-month,.next-calendar-range .next-calendar-year{text-align:center;background:#fff;color:#666;border:1px solid #fff}.next-calendar-card .next-calendar-date:hover,.next-calendar-card .next-calendar-month:hover,.next-calendar-card .next-calendar-year:hover,.next-calendar-panel .next-calendar-date:hover,.next-calendar-panel .next-calendar-month:hover,.next-calendar-panel .next-calendar-year:hover,.next-calendar-range .next-calendar-date:hover,.next-calendar-range .next-calendar-month:hover,.next-calendar-range .next-calendar-year:hover{cursor:pointer;background:#e4f3fe;color:#209bfa;border-color:#e4f3fe}.next-calendar-card .next-calendar-date,.next-calendar-panel .next-calendar-date,.next-calendar-range .next-calendar-date{width:24px;height:24px;line-height:22px;margin:4px auto;border-radius:3px}.next-calendar-card .next-calendar-month,.next-calendar-panel .next-calendar-month,.next-calendar-range .next-calendar-month{width:60px;height:24px;line-height:22px;margin:8px auto;border-radius:3px}.next-calendar-card .next-calendar-year,.next-calendar-panel .next-calendar-year,.next-calendar-range .next-calendar-year{width:48px;height:24px;line-height:22px;margin:8px auto;border-radius:3px}.next-calendar-card .next-calendar-cell-next-month .next-calendar-date,.next-calendar-card .next-calendar-cell-prev-month .next-calendar-date,.next-calendar-panel .next-calendar-cell-next-month .next-calendar-date,.next-calendar-panel .next-calendar-cell-prev-month .next-calendar-date,.next-calendar-range .next-calendar-cell-next-month .next-calendar-date,.next-calendar-range .next-calendar-cell-prev-month .next-calendar-date{background:#fff;color:#ccc;border-color:#fff}.next-calendar-card .next-calendar-cell-current .next-calendar-date,.next-calendar-card .next-calendar-cell-current .next-calendar-month,.next-calendar-card .next-calendar-cell-current .next-calendar-year,.next-calendar-panel .next-calendar-cell-current .next-calendar-date,.next-calendar-panel .next-calendar-cell-current .next-calendar-month,.next-calendar-panel .next-calendar-cell-current .next-calendar-year,.next-calendar-range .next-calendar-cell-current .next-calendar-date,.next-calendar-range .next-calendar-cell-current .next-calendar-month,.next-calendar-range .next-calendar-cell-current .next-calendar-year{font-weight:700;background:#fff;color:#209bfa;border-color:transparent}.next-calendar-panel.next-calendar-week .next-calendar-tbody tr{cursor:pointer}.next-calendar-panel.next-calendar-week .next-calendar-tbody tr:hover .next-calendar-cell .next-calendar-date{background:#e4f3fe;color:#209bfa;border-color:#e4f3fe}.next-calendar-panel.next-calendar-week .next-calendar-tbody .next-calendar-cell.next-selected .next-calendar-date{font-weight:400;background:transparent;border-color:transparent}.next-calendar-panel.next-calendar-week .next-calendar-tbody .next-calendar-week-active-date{position:relative;color:#209bfa}.next-calendar-panel.next-calendar-week .next-calendar-tbody .next-calendar-week-active-date:before{content:"";position:absolute;left:-1px;top:-1px;bottom:-1px;right:-1px;background:#e4f3fe;border:1px solid #e4f3fe;border-radius:3px}.next-calendar-panel.next-calendar-week .next-calendar-tbody .next-calendar-week-active-date>span{position:relative}.next-calendar-panel.next-calendar-week .next-calendar-tbody .next-calendar-week-active-end,.next-calendar-panel.next-calendar-week .next-calendar-tbody .next-calendar-week-active-start{color:#fff}.next-calendar-panel.next-calendar-week .next-calendar-tbody .next-calendar-week-active-end:before,.next-calendar-panel.next-calendar-week .next-calendar-tbody .next-calendar-week-active-start:before{background:#209bfa;border-color:#209bfa}.next-calendar[dir=rtl] .next-calendar-header{text-align:left}.next-calendar[dir=rtl] .next-calendar-header .next-select{margin-right:0;margin-left:4px}.next-calendar[dir=rtl] .next-calendar-header .next-menu{text-align:right}.next-calendar[dir=rtl] .next-calendar-btn-prev-decade,.next-calendar[dir=rtl] .next-calendar-btn-prev-year{left:auto;right:8px}.next-calendar[dir=rtl] .next-calendar-btn-prev-month{left:auto;right:28px}.next-calendar[dir=rtl] .next-calendar-btn-next-month{right:auto;left:28px}.next-calendar[dir=rtl] .next-calendar-btn-next-decade,.next-calendar[dir=rtl] .next-calendar-btn-next-year{right:auto;left:8px}.next-calendar-fullscreen[dir=rtl] .next-calendar-th{text-align:left;padding-left:12px;padding-right:0}.next-calendar-fullscreen[dir=rtl] .next-calendar-date,.next-calendar-fullscreen[dir=rtl] .next-calendar-month{text-align:left}.next-calendar-range[dir=rtl] .next-calendar-body-left,.next-calendar-range[dir=rtl] .next-calendar-body-right{float:right}.next-calendar-range[dir=rtl] .next-calendar-body-left{padding-right:0;padding-left:8px}.next-calendar-range[dir=rtl] .next-calendar-body-right{padding-left:0;padding-right:8px}.next-calendar-table{width:100%;table-layout:fixed}.next-calendar-range .next-calendar-body-left,.next-calendar-range .next-calendar-body-right{float:left;width:50%}.next-calendar-range .next-calendar-body-left{padding-right:8px}.next-calendar-range .next-calendar-body-right{padding-left:8px}.next-calendar-range .next-calendar-body:after{visibility:hidden;display:block;height:0;font-size:0;content:" ";clear:both}.next-calendar-symbol-prev:before{content:"顦�"}.next-calendar-symbol-next:before{content:"顦�"}.next-calendar-symbol-prev-super:before{content:"顧�"}.next-calendar-symbol-next-super:before{content:"顧�"}.next-card,.next-card:after,.next-card:before{box-sizing:border-box}.next-card[dir=rtl] .next-card-extra{left:0;right:auto}.next-card[dir=rtl] .next-card-title:before{right:0;left:auto}.next-card[dir=rtl] .next-card-subtitle{float:left;padding-right:8px;padding-left:0}.next-card[dir=rtl] .next-card-head-show-bullet .next-card-title{padding-left:0;padding-right:8px}.next-card,.next-card *,.next-card :after,.next-card :before{box-sizing:border-box}.next-card{min-width:100px;border:0 solid #e6e6e6;border-radius:3px;box-shadow:none;background:#fff;overflow:hidden}.next-card-noborder{border:0}.next-card-head{background:#fff;padding-left:24px;padding-right:24px}.next-card-head-show-bullet .next-card-title{padding-left:8px}.next-card-head-show-bullet .next-card-title:before{content:"";display:inline-block;height:16px;width:3px;background:#209bfa;position:absolute;left:0;top:calc(50% - 8px)}.next-card-head-main{position:relative;margin-top:0;margin-bottom:0;height:64px;line-height:64px}.next-card-title{display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:80%;height:100%;color:#333;font-size:16px;font-weight:400}.next-card-subtitle{font-size:12px;color:#666;padding-left:8px}.next-card-extra{position:absolute;right:0;top:0;height:100%;font-size:14px;color:#298dff}.next-card-body{padding-bottom:20px;padding-left:24px;padding-right:24px}.next-card-show-divider .next-card-head-main{border-bottom:1px solid #eee}.next-card-show-divider .next-card-body{padding-top:20px}.next-card-hide-divider .next-card-body{padding-top:0}.next-card鈥攆ree{padding:0}.next-card-content{overflow:hidden;transition:all .3s ease;position:relative}.next-card-footer .next-icon{transition:all .1s linear}.next-card-footer .next-icon.next-icon-arrow-down.expand{transform-origin:50% 47%;transform:rotate(180deg)}.next-card-header{background:#fff;padding:0 24px;margin-bottom:20px;margin-top:20px}.next-card-media,.next-card-media>*{display:block;background-size:cover;background-repeat:no-repeat;background-position:50%;object-fit:cover;width:100%}.next-card-header-titles{overflow:hidden}.next-card-header-extra{float:right;text-align:right}.next-card-header-extra .next--btn{margin-left:12px;vertical-align:middle}.next-card-header-title{color:#333;font-size:16px;font-weight:400;line-height:1.5}.next-card-header-subtitle{font-size:12px;color:#666}.next-card-actions{display:block;padding:20px 24px}.next-card-actions .next-btn:not(:last-child){margin-right:12px;vertical-align:middle}.next-card-divider{border-style:none;width:100%;margin:0;position:relative;overflow:visible}.next-card-divider:before{content:"";display:block;border-bottom:1px solid #eee}.next-card-divider--inset{padding:0 24px}.next-card-content-container{margin-top:20px;padding-bottom:20px;padding-left:24px;padding-right:24px;font-size:14px;line-height:1.5;color:#666}.next-cascader{display:inline-block;overflow:auto;border:1px solid #e6e6e6;border-radius:3px}.next-cascader,.next-cascader *,.next-cascader :after,.next-cascader :before{box-sizing:border-box}.next-cascader-inner:after{visibility:hidden;display:block;height:0;font-size:0;content:" ";clear:both}.next-cascader-menu-wrapper{float:left;overflow:auto;width:auto;min-width:100px;height:192px;overflow-x:hidden;overflow-y:auto}.next-cascader-menu-wrapper+.next-cascader-menu-wrapper{border-left:1px solid #e6e6e6}.next-cascader-menu{position:relative;padding:0;border:none;border-radius:0;box-shadow:none;min-width:auto;min-height:100%}.next-cascader-menu.next-has-right-border{border-right:1px solid #e6e6e6}.next-cascader-menu-item.next-expanded{color:#333;background-color:#f9f9f9}.next-cascader-menu-icon-right{position:absolute;top:0;right:10px;color:#666}.next-cascader-menu-icon-right:hover{color:#333}.next-cascader-menu-icon-expand.next-icon .next-icon-remote,.next-cascader-menu-icon-expand.next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-cascader-menu-icon-loading.next-icon .next-icon-remote,.next-cascader-menu-icon-loading.next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-cascader-menu-item.next-expanded .next-cascader-menu-icon-right{color:#333}.next-cascader-menu-item.next-expanded .next-cascader-menu-icon-loading{color:#209bfa}.next-cascader-filtered-list{height:192px;padding:0;border:none;border-radius:0;box-shadow:none;overflow:auto}.next-cascader-filtered-list .next-menu-item-inner{overflow:visible}.next-cascader-filtered-item em{color:#209bfa;font-style:normal}.next-cascader[dir=rtl] .next-cascader-menu-wrapper{float:right;border-left:none;border-right:1px solid #e6e6e6}.next-cascader[dir=rtl] .next-cascader-menu-wrapper:first-child{border-right:none}.next-cascader[dir=rtl] .next-cascader-menu.next-has-right-border{border-right:none;border-left:1px solid #e6e6e6}.next-cascader[dir=rtl] .next-cascader-menu-icon-right{right:auto;left:10px}.next-cascader-select,.next-cascader-select *,.next-cascader-select :after,.next-cascader-select :before{box-sizing:border-box}.next-cascader-select-dropdown{box-sizing:border-box;border:1px solid #e6e6e6;border-radius:3px;box-shadow:none}.next-cascader-select-dropdown *,.next-cascader-select-dropdown :after,.next-cascader-select-dropdown :before{box-sizing:border-box}.next-cascader-select-dropdown .next-cascader{display:block;border:none;box-shadow:none}.next-cascader-select-not-found{padding:0;border:none;box-shadow:none;overflow:auto;color:#999}.next-cascader-select-not-found .next-menu-item:hover{color:#999;background:#fff;cursor:default}.next-checkbox-wrapper[dir=rtl]{margin-right:8px;margin-left:0}.next-checkbox-wrapper[dir=rtl]:first-child{margin-right:0}.next-checkbox-wrapper[dir=rtl]>.next-checkbox-label{margin-right:4px;margin-left:0}.next-checkbox-wrapper{box-sizing:border-box;display:inline-block}.next-checkbox-wrapper *,.next-checkbox-wrapper :after,.next-checkbox-wrapper :before{box-sizing:border-box}.next-checkbox-wrapper .next-checkbox{display:inline-block;position:relative;line-height:1;vertical-align:middle}.next-checkbox-wrapper input[type=checkbox]{opacity:0;position:absolute;top:0;left:0;width:16px;height:16px;margin:0;cursor:pointer}.next-checkbox-wrapper .next-checkbox-inner{display:block;width:16px;height:16px;background:#fff;border-radius:3px;border:1px solid #ddd;transition:all .1s linear;text-align:left;box-shadow:none}.next-checkbox-wrapper .next-checkbox-inner>.next-icon{transform:scale(0);position:absolute;top:0;opacity:0;line-height:16px;transition:all .1s linear;color:#fff;left:2px;margin-left:0}.next-checkbox-wrapper .next-checkbox-inner>.next-icon .next-icon-remote,.next-checkbox-wrapper .next-checkbox-inner>.next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-checkbox-wrapper .next-checkbox-inner>.next-icon:before{vertical-align:top;margin-top:0}.next-checkbox-wrapper .next-checkbox-inner>.next-checkbox-select-icon:before{content:"顦�"}.next-checkbox-wrapper .next-checkbox-inner>.next-checkbox-semi-select-icon:before{content:"顦�"}.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner{border-color:transparent;background-color:#209bfa}.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner.hovered,.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner:hover,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner.hovered,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner:hover{border-color:transparent}.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner>.next-icon,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner>.next-icon{opacity:1;transform:scale(1);margin-left:0}.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner>.next-icon .next-icon-remote,.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner>.next-icon:before,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner>.next-icon .next-icon-remote,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner>.next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner{border-color:transparent;background-color:#209bfa}.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner.hovered,.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner:hover,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner.hovered,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner:hover{border-color:transparent}.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner>.next-icon,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner>.next-icon{opacity:1;transform:scaleX(1);margin-left:0}.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner>.next-icon .next-icon-remote,.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner>.next-icon:before,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner>.next-icon .next-icon-remote,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner>.next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-checkbox-wrapper.focused>.next-checkbox>.next-checkbox-inner,.next-checkbox-wrapper.hovered>.next-checkbox>.next-checkbox-inner,.next-checkbox-wrapper:not(.disabled):hover>.next-checkbox>.next-checkbox-inner{border-color:#209bfa;background-color:#add9ff}.next-checkbox-wrapper.focused .next-checkbox-label,.next-checkbox-wrapper.hovered .next-checkbox-label,.next-checkbox-wrapper:not(.disabled):hover .next-checkbox-label{cursor:pointer}.next-checkbox-wrapper.checked:not(.disabled).hovered>.next-checkbox .next-checkbox-inner,.next-checkbox-wrapper.checked:not(.disabled):hover>.next-checkbox .next-checkbox-inner,.next-checkbox-wrapper.indeterminate:not(.disabled).hovered>.next-checkbox .next-checkbox-inner,.next-checkbox-wrapper.indeterminate:not(.disabled):hover>.next-checkbox .next-checkbox-inner{border-color:transparent;background-color:#1274e7}.next-checkbox-wrapper.checked:not(.disabled).hovered>.next-checkbox .next-checkbox-inner>.next-icon,.next-checkbox-wrapper.checked:not(.disabled):hover>.next-checkbox .next-checkbox-inner>.next-icon,.next-checkbox-wrapper.indeterminate:not(.disabled).hovered>.next-checkbox .next-checkbox-inner>.next-icon,.next-checkbox-wrapper.indeterminate:not(.disabled):hover>.next-checkbox .next-checkbox-inner>.next-icon{color:#fff;opacity:1}.next-checkbox-wrapper.disabled input[type=checkbox]{cursor:not-allowed}.next-checkbox-wrapper.disabled.checked .next-checkbox-inner,.next-checkbox-wrapper.disabled.indeterminate .next-checkbox-inner,.next-checkbox-wrapper.disabled .next-checkbox-inner{border-color:#eee;background:#fafafa}.next-checkbox-wrapper.disabled.checked .next-checkbox-inner.hovered,.next-checkbox-wrapper.disabled.checked .next-checkbox-inner:hover,.next-checkbox-wrapper.disabled.indeterminate .next-checkbox-inner.hovered,.next-checkbox-wrapper.disabled.indeterminate .next-checkbox-inner:hover{border-color:#eee}.next-checkbox-wrapper.disabled.checked .next-checkbox-inner>.next-icon,.next-checkbox-wrapper.disabled.indeterminate .next-checkbox-inner>.next-icon{color:#ccc;opacity:1}.next-checkbox-wrapper.disabled.checked.focused .next-checkbox-inner{border-color:#eee;background:#fafafa}.next-checkbox-wrapper.disabled.checked.focused .next-checkbox-inner>.next-icon{color:#ccc;opacity:1}.next-checkbox-wrapper.disabled .next-checkbox-label{color:#ccc;cursor:not-allowed}.next-checkbox-group .next-checkbox-wrapper{display:inline-block;margin-right:12px}.next-checkbox-group .next-checkbox-wrapper:last-child{margin-right:0}.next-checkbox-group-ver .next-checkbox-wrapper{display:block;margin-left:0;margin-right:0;margin-bottom:8px}.next-checkbox-label{font-size:14px;color:#333;vertical-align:middle;margin:0 4px;line-height:1}.next-collapse[dir=rtl] .next-collapse-panel-title{padding:8px 36px 8px 0}.next-collapse[dir=rtl] .next-collapse-panel-icon{left:inherit;right:12px;transform:rotate(180deg);margin-left:0;margin-right:0}.next-collapse[dir=rtl] .next-collapse-panel-icon .next-icon-remote,.next-collapse[dir=rtl] .next-collapse-panel-icon:before{width:16px;font-size:16px;line-height:inherit}.next-collapse{border:1px solid #e6e6e6;border-radius:3px}.next-collapse,.next-collapse *,.next-collapse :after,.next-collapse :before{box-sizing:border-box}.next-collapse:focus,.next-collapse :focus{outline:0}.next-collapse-panel:not(:first-child){border-top:1px solid #e6e6e6}.next-collapse .next-collapse-panel-icon{position:absolute;color:#333;transition:transform .1s linear;left:12px;margin-top:-2px;margin-left:0;margin-right:0}.next-collapse .next-collapse-panel-icon .next-icon-remote,.next-collapse .next-collapse-panel-icon:before{width:16px;font-size:16px;line-height:inherit}.next-collapse-panel-title{position:relative;line-height:1.5;background:#f9f9f9;font-size:14px;font-weight:400;color:#333;cursor:pointer;padding:8px 0 8px 36px;transition:background .1s linear}.next-collapse-panel-title:hover{background:#f5f5f5;color:#333;font-weight:400}.next-collapse-panel-title:hover .next-collapse-panel-icon{color:#333}.next-collapse-panel-content{height:0;line-height:1.5;padding:0 16px;background:#fff;font-size:14px;color:#666;transition:all .3s ease;opacity:0}.next-collapse-panel-expanded>.next-collapse-panel-content{display:block;padding:12px 16px;height:auto;opacity:1}.next-collapse .next-collapse-unfold-icon:before{content:""}.next-collapse-panel-hidden>.next-collapse-panel-content{overflow:hidden}.next-collapse .next-collapse-panel-icon:before{content:"顦�"}.next-collapse .next-collapse-panel-icon.next-collapse-panel-icon-expanded{transform:rotate(90deg);margin-left:0;margin-right:0}.next-collapse .next-collapse-panel-icon.next-collapse-panel-icon-expanded .next-icon-remote,.next-collapse .next-collapse-panel-icon.next-collapse-panel-icon-expanded:before{width:16px;font-size:16px;line-height:inherit}.next-collapse-disabled,.next-collapse-panel-disabled:not(:first-child){border-color:#eee}.next-collapse-panel-disabled>.next-collapse-panel-title{cursor:not-allowed;color:#ccc;background:#f9f9f9}.next-collapse-panel-disabled .next-collapse-panel-icon{color:#ccc}.next-collapse-panel-disabled .next-collapse-panel-title:hover{font-weight:400}.next-collapse-panel-disabled .next-collapse-panel-title:hover .next-collapse-panel-icon{color:#ccc}.next-collapse-panel-disabled:hover{color:#ccc;background:#f9f9f9}.next-time-picker-menu{float:left;text-align:center}.next-time-picker-menu:not(:last-child){border-right:1px solid #ddd}.next-time-picker-menu-title{cursor:default;height:28px;line-height:28px;font-size:12px;font-weight:400;color:#999;background:#fff}.next-time-picker-menu ul{position:relative;overflow-y:auto;list-style:none;margin:0;padding:0;font-size:12px;height:196px}.next-time-picker-menu-item{cursor:pointer;height:28px;line-height:28px;transition:background .1s linear;color:#666;background:#fff;outline:none}.next-time-picker-menu-item:hover{color:#333;background:#f9f9f9}.next-time-picker-menu-item.next-selected{font-weight:700;color:#666;background:#f9f9f9}.next-time-picker-menu-item.next-disabled{cursor:not-allowed;color:#ccc;background:#fff}.next-time-picker-panel,.next-time-picker-panel *,.next-time-picker-panel :after,.next-time-picker-panel :before{box-sizing:border-box}.next-time-picker-panel:after{visibility:hidden;display:block;height:0;font-size:0;content:" ";clear:both}.next-time-picker-panel-header{border-bottom:1px solid #e6e6e6}.next-time-picker-panel-input.next-input{width:100%;padding:6px;border-color:transparent;vertical-align:middle}.next-time-picker-panel-col-3 .next-time-picker-menu{width:33.3333333333%}.next-time-picker-panel-col-2 .next-time-picker-menu{width:50%}.next-time-picker-panel-col-1 .next-time-picker-menu{width:100%}.next-time-picker-body[dir=rtl] .next-time-picker-menu{float:right}.next-time-picker-body[dir=rtl] .next-time-picker-menu:not(:last-child){border-right:none;border-left:1px solid #ddd}.next-time-picker{display:inline-block;width:200px}.next-time-picker,.next-time-picker *,.next-time-picker :after,.next-time-picker :before{box-sizing:border-box}.next-time-picker-trigger .next-input{width:100%}.next-time-picker-body{overflow:hidden;width:200px;border:1px solid #e6e6e6;border-radius:3px;background:#fff;box-shadow:none}.next-time-picker-symbol-clock-icon:before{content:"顦�"}.next-range-picker-panel-input-separator,.next-range-picker-trigger-separator{cursor:default;display:inline-block;text-align:center;color:#ccc;width:16px;font-size:12px;vertical-align:middle}.next-date-picker,.next-month-picker,.next-week-picker,.next-year-picker{display:inline-block;width:200px}.next-date-picker-input,.next-month-picker-input,.next-week-picker-input,.next-year-picker-input{width:100%}.next-date-picker-body,.next-month-picker-body,.next-week-picker-body,.next-year-picker-body{width:288px}.next-date-picker-panel-input.next-input,.next-month-picker-panel-input.next-input,.next-week-picker-panel-input.next-input,.next-year-picker-panel-input.next-input{width:100%;background:transparent}.next-date-picker-body.next-date-picker-body-show-time .next-date-picker-panel-input.next-input{width:49%}.next-date-picker-body.next-date-picker-body-show-time .next-date-picker-panel-input.next-input:first-child{margin-right:2%}.next-range-picker{display:inline-block;width:336px}.next-range-picker-input{width:100%}.next-range-picker-trigger{border:1px solid #ddd;background-color:#fff}.next-range-picker-trigger:hover{border-color:#ccc;background-color:#fff}.next-range-picker-trigger.next-error{border-color:#d23c26}.next-range-picker-trigger-input.next-input{height:auto;width:calc(50% - 8px)}.next-range-picker.next-disabled .next-range-picker-trigger{color:#ccc;border-color:#eee;background-color:#fafafa;cursor:not-allowed}.next-range-picker.next-disabled .next-range-picker-trigger:hover{border-color:#eee;background-color:#fafafa}.next-range-picker.next-large .next-range-picker-panel-input,.next-range-picker.next-large .next-range-picker-trigger,.next-range-picker.next-medium .next-range-picker-panel-input,.next-range-picker.next-medium .next-range-picker-trigger,.next-range-picker.next-small .next-range-picker-panel-input,.next-range-picker.next-small .next-range-picker-trigger{border-radius:3px}.next-range-picker-body{width:600px}.next-range-picker-panel-input-end-date.next-input,.next-range-picker-panel-input-start-date.next-input{width:calc(50% - 8px)}.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-input-end-date,.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-input-end-time,.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-input-start-date,.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-input-start-time{width:calc(25% - 8px)}.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-input-start-date{margin-right:8px}.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-input-end-time{margin-left:8px}.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-time:after{visibility:hidden;display:block;height:0;font-size:0;content:" ";clear:both}.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-time-end,.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-time-start{width:50%;float:left}.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-time-start{border-right:1px solid #e6e6e6}.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-time-end{border-left:1px solid #e6e6e6}.next-date-picker-body[dir=rtl] .next-date-picker-panel-footer{text-align:left}.next-date-picker-body[dir=rtl] .next-date-picker-panel-footer>.next-btn:not(:last-child){margin-right:0;margin-left:16px}.next-date-picker-body[dir=rtl].next-date-picker-body-show-time .next-date-picker-panel-input.next-input:first-child{margin-left:2%;margin-right:0}.next-date-picker-body[dir=rtl].next-date-picker-body-show-time .next-time-picker-menu{float:right}.next-date-picker-body[dir=rtl].next-date-picker-body-show-time .next-time-picker-menu:not(:last-child){border-right:none;border-left:1px solid #ddd}.next-range-picker-body[dir=rtl] .next-range-picker-panel-input{text-align:right}.next-range-picker-body[dir=rtl] .next-date-picker-panel-footer{text-align:left}.next-range-picker-body[dir=rtl] .next-date-picker-panel-footer>.next-btn:not(:last-child){margin-right:0;margin-left:16px}.next-range-picker-body[dir=rtl].next-range-picker-body-show-time .next-range-picker-panel-input-start-date{margin-right:0;margin-left:8px}.next-range-picker-body[dir=rtl].next-range-picker-body-show-time .next-range-picker-panel-input-end-time{margin-left:0;margin-right:8px}.next-range-picker-body[dir=rtl].next-range-picker-body-show-time .next-range-picker-panel-time-end,.next-range-picker-body[dir=rtl].next-range-picker-body-show-time .next-range-picker-panel-time-start{float:right}.next-range-picker-body[dir=rtl].next-range-picker-body-show-time .next-range-picker-panel-time-start{border-right:none;border-left:1px solid #e6e6e6}.next-range-picker-body[dir=rtl].next-range-picker-body-show-time .next-range-picker-panel-time-end{border-left:none;border-right:1px solid #e6e6e6}.next-range-picker-body[dir=rtl].next-range-picker-body-show-time .next-time-picker-menu{float:right}.next-range-picker-body[dir=rtl].next-range-picker-body-show-time .next-time-picker-menu:not(:last-child){border-right:none;border-left:1px solid #ddd}.next-date-picker,.next-date-picker *,.next-date-picker :after,.next-date-picker :before,.next-month-picker,.next-month-picker *,.next-month-picker :after,.next-month-picker :before,.next-range-picker,.next-range-picker *,.next-range-picker :after,.next-range-picker :before,.next-week-picker,.next-week-picker *,.next-week-picker :after,.next-week-picker :before,.next-year-picker,.next-year-picker *,.next-year-picker :after,.next-year-picker :before{box-sizing:border-box}.next-date-picker-body,.next-month-picker-body,.next-range-picker-body,.next-week-picker-body,.next-year-picker-body{border:1px solid #e6e6e6;border-radius:3px;box-shadow:none;background:#fff}.next-date-picker-panel-header,.next-month-picker-panel-header,.next-range-picker-panel-header,.next-week-picker-panel-header,.next-year-picker-panel-header{padding:6px;text-align:center}.next-date-picker-panel-time,.next-month-picker-panel-time,.next-range-picker-panel-time,.next-week-picker-panel-time,.next-year-picker-panel-time{border-top:1px solid #e6e6e6}.next-date-picker-panel-footer,.next-month-picker-panel-footer,.next-range-picker-panel-footer,.next-week-picker-panel-footer,.next-year-picker-panel-footer{text-align:right;padding:8px 20px;border-top:1px solid #e6e6e6}.next-date-picker-panel-footer>.next-btn:not(:last-child),.next-date-picker-panel-tools>.next-btn:not(:last-child),.next-month-picker-panel-footer>.next-btn:not(:last-child),.next-month-picker-panel-tools>.next-btn:not(:last-child),.next-range-picker-panel-footer>.next-btn:not(:last-child),.next-range-picker-panel-tools>.next-btn:not(:last-child),.next-week-picker-panel-footer>.next-btn:not(:last-child),.next-week-picker-panel-tools>.next-btn:not(:last-child),.next-year-picker-panel-footer>.next-btn:not(:last-child),.next-year-picker-panel-tools>.next-btn:not(:last-child){margin-right:16px}.next-date-picker-panel-tools,.next-month-picker-panel-tools,.next-range-picker-panel-tools,.next-week-picker-panel-tools,.next-year-picker-panel-tools{float:left}.next-date-picker .next-calendar-panel-header,.next-month-picker .next-calendar-panel-header,.next-range-picker .next-calendar-panel-header,.next-week-picker .next-calendar-panel-header,.next-year-picker .next-calendar-panel-header{margin-left:-1px;margin-right:-1px}.next-date-picker .next-input input,.next-month-picker .next-input input,.next-range-picker .next-input input,.next-week-picker .next-input input,.next-year-picker .next-input input{vertical-align:baseline}.next-date-picker-symbol-calendar-icon:before,.next-month-picker-symbol-calendar-icon:before,.next-range-picker-symbol-calendar-icon:before,.next-week-picker-symbol-calendar-icon:before,.next-year-picker-symbol-calendar-icon:before{content:"顦�"}.next-range-picker-panel-body .next-calendar{display:inline-block;width:50%}.next-message{position:relative;display:block;vertical-align:baseline;animation-duration:.3s;animation-timing-function:ease-in-out}.next-message,.next-message *,.next-message :after,.next-message :before{box-sizing:border-box}.next-message:after{visibility:hidden;display:block;height:0;font-size:0;content:" ";clear:both}.next-message .next-message-close{color:#999;font-size:0;position:absolute;cursor:pointer}.next-message .next-message-close .next-icon-close{width:12px;height:12px;line-height:1em}.next-message .next-message-close .next-icon-close:before{width:12px;height:12px;font-size:12px;line-height:1em}.next-message .next-message-close:hover{color:#666}.next-message.next-message-success.next-inline{background-color:#e5fff5;border-color:#e5fff5;box-shadow:none;border-style:solid}.next-message.next-message-success.next-inline .next-message-title{color:#333}.next-message.next-message-success.next-inline .next-message-content{color:#666}.next-message.next-message-success.next-inline .next-message-symbol{color:#1ad78c}.next-message.next-message-success.next-inline .next-message-symbol-icon:before{content:"顦�"}.next-message.next-message-success.next-addon{background-color:transparent;border-color:transparent;box-shadow:none;border-style:solid}.next-message.next-message-success.next-addon .next-message-title{color:#333}.next-message.next-message-success.next-addon .next-message-content{color:#666}.next-message.next-message-success.next-addon .next-message-symbol{color:#1ad78c}.next-message.next-message-success.next-addon .next-message-symbol-icon:before{content:"顦�"}.next-message.next-message-success.next-toast{background-color:#fff;border-color:#fff;box-shadow:0 4px 8px 0 rgba(0,0,0,.12);border-style:solid}.next-message.next-message-success.next-toast .next-message-title{color:#333}.next-message.next-message-success.next-toast .next-message-content{color:#666}.next-message.next-message-success.next-toast .next-message-symbol{color:#1ad78c}.next-message.next-message-success.next-toast .next-message-symbol-icon:before{content:"顦�"}.next-message.next-message-warning.next-inline{background-color:#fff9e0;border-color:#fff9e0;box-shadow:none;border-style:solid}.next-message.next-message-warning.next-inline .next-message-title{color:#333}.next-message.next-message-warning.next-inline .next-message-content{color:#666}.next-message.next-message-warning.next-inline .next-message-symbol{color:#f1c826}.next-message.next-message-warning.next-inline .next-message-symbol-icon:before{content:"顦�"}.next-message.next-message-warning.next-addon{background-color:transparent;border-color:transparent;box-shadow:none;border-style:solid}.next-message.next-message-warning.next-addon .next-message-title{color:#333}.next-message.next-message-warning.next-addon .next-message-content{color:#666}.next-message.next-message-warning.next-addon .next-message-symbol{color:#f1c826}.next-message.next-message-warning.next-addon .next-message-symbol-icon:before{content:"顦�"}.next-message.next-message-warning.next-toast{background-color:#fff;border-color:#fff;box-shadow:0 4px 8px 0 rgba(0,0,0,.12);border-style:solid}.next-message.next-message-warning.next-toast .next-message-title{color:#333}.next-message.next-message-warning.next-toast .next-message-content{color:#666}.next-message.next-message-warning.next-toast .next-message-symbol{color:#f1c826}.next-message.next-message-warning.next-toast .next-message-symbol-icon:before{content:"顦�"}.next-message.next-message-error.next-inline{background-color:#ffece4;border-color:#ffece4;box-shadow:none;border-style:solid}.next-message.next-message-error.next-inline .next-message-title{color:#333}.next-message.next-message-error.next-inline .next-message-content{color:#666}.next-message.next-message-error.next-inline .next-message-symbol{color:#d23c26}.next-message.next-message-error.next-inline .next-message-symbol-icon:before{content:"顦�"}.next-message.next-message-error.next-addon{background-color:transparent;border-color:transparent;box-shadow:none;border-style:solid}.next-message.next-message-error.next-addon .next-message-title{color:#333}.next-message.next-message-error.next-addon .next-message-content{color:#666}.next-message.next-message-error.next-addon .next-message-symbol{color:#d23c26}.next-message.next-message-error.next-addon .next-message-symbol-icon:before{content:"顦�"}.next-message.next-message-error.next-toast{background-color:#fff;border-color:#fff;box-shadow:0 4px 8px 0 rgba(0,0,0,.12);border-style:solid}.next-message.next-message-error.next-toast .next-message-title{color:#333}.next-message.next-message-error.next-toast .next-message-content{color:#666}.next-message.next-message-error.next-toast .next-message-symbol{color:#d23c26}.next-message.next-message-error.next-toast .next-message-symbol-icon:before{content:"顦�"}.next-message.next-message-notice.next-inline{background-color:#e4f3fe;border-color:#e4f3fe;box-shadow:none;border-style:solid}.next-message.next-message-notice.next-inline .next-message-title{color:#333}.next-message.next-message-notice.next-inline .next-message-content{color:#666}.next-message.next-message-notice.next-inline .next-message-symbol{color:#298dff}.next-message.next-message-notice.next-inline .next-message-symbol-icon:before{content:"顦�"}.next-message.next-message-notice.next-addon{background-color:transparent;border-color:transparent;box-shadow:none;border-style:solid}.next-message.next-message-notice.next-addon .next-message-title{color:#333}.next-message.next-message-notice.next-addon .next-message-content{color:#666}.next-message.next-message-notice.next-addon .next-message-symbol{color:#298dff}.next-message.next-message-notice.next-addon .next-message-symbol-icon:before{content:"顦�"}.next-message.next-message-notice.next-toast{background-color:#fff;border-color:#fff;box-shadow:0 4px 8px 0 rgba(0,0,0,.12);border-style:solid}.next-message.next-message-notice.next-toast .next-message-title{color:#333}.next-message.next-message-notice.next-toast .next-message-content{color:#666}.next-message.next-message-notice.next-toast .next-message-symbol{color:#298dff}.next-message.next-message-notice.next-toast .next-message-symbol-icon:before{content:"顦�"}.next-message.next-message-help.next-inline{background-color:#fff9e0;border-color:#fff9e0;box-shadow:none;border-style:solid}.next-message.next-message-help.next-inline .next-message-title{color:#333}.next-message.next-message-help.next-inline .next-message-content{color:#666}.next-message.next-message-help.next-inline .next-message-symbol{color:#f1c826}.next-message.next-message-help.next-inline .next-message-symbol-icon:before{content:"顧�"}.next-message.next-message-help.next-addon{background-color:transparent;border-color:transparent;box-shadow:none;border-style:solid}.next-message.next-message-help.next-addon .next-message-title{color:#333}.next-message.next-message-help.next-addon .next-message-content{color:#666}.next-message.next-message-help.next-addon .next-message-symbol{color:#f1c826}.next-message.next-message-help.next-addon .next-message-symbol-icon:before{content:"顧�"}.next-message.next-message-help.next-toast{background-color:#fff;border-color:#fff;box-shadow:0 4px 8px 0 rgba(0,0,0,.12);border-style:solid}.next-message.next-message-help.next-toast .next-message-title{color:#333}.next-message.next-message-help.next-toast .next-message-content{color:#666}.next-message.next-message-help.next-toast .next-message-symbol{color:#f1c826}.next-message.next-message-help.next-toast .next-message-symbol-icon:before{content:"顧�"}.next-message.next-message-loading.next-inline{background-color:#fff;border-color:#fff;box-shadow:none;border-style:solid}.next-message.next-message-loading.next-inline .next-message-title{color:#333}.next-message.next-message-loading.next-inline .next-message-content{color:#666}.next-message.next-message-loading.next-inline .next-message-symbol{color:#209bfa}.next-message.next-message-loading.next-inline .next-message-symbol-icon:before{content:"顧�";animation:loadingCircle 1s linear infinite}.next-message.next-message-loading.next-addon{background-color:transparent;border-color:transparent;box-shadow:none;border-style:solid}.next-message.next-message-loading.next-addon .next-message-title{color:#333}.next-message.next-message-loading.next-addon .next-message-content{color:#666}.next-message.next-message-loading.next-addon .next-message-symbol{color:#209bfa}.next-message.next-message-loading.next-addon .next-message-symbol-icon:before{content:"顧�";animation:loadingCircle 1s linear infinite}.next-message.next-message-loading.next-toast{background-color:#fff;border-color:#fff;box-shadow:0 4px 8px 0 rgba(0,0,0,.12);border-style:solid}.next-message.next-message-loading.next-toast .next-message-title{color:#333}.next-message.next-message-loading.next-toast .next-message-content{color:#666}.next-message.next-message-loading.next-toast .next-message-symbol{color:#209bfa}.next-message.next-message-loading.next-toast .next-message-symbol-icon:before{content:"顧�";animation:loadingCircle 1s linear infinite}.next-message.next-medium{border-width:1px;padding:12px}.next-message.next-medium .next-message-symbol{float:left;line-height:16px}.next-message.next-medium .next-message-symbol .next-icon-remote,.next-message.next-medium .next-message-symbol:before{width:16px;font-size:16px;line-height:inherit}.next-message.next-medium .next-message-title{padding:0 20px 0 24px;font-size:16px;line-height:16px}.next-message.next-medium .next-message-content{margin-top:8px;padding:0 20px 0 24px;font-size:14px;line-height:1.5}.next-message.next-medium .next-message-symbol+.next-message-content{margin-top:0}.next-message.next-medium.next-only-content .next-message-content,.next-message.next-medium.next-title-content .next-message-title{line-height:16px}.next-message.next-medium .next-message-close{top:12px;right:12px}.next-message.next-medium.next-inline,.next-message.next-medium.next-toast{border-radius:3px}.next-message.next-large{border-width:2px;padding:16px}.next-message.next-large .next-message-symbol{float:left;line-height:24px}.next-message.next-large .next-message-symbol .next-icon-remote,.next-message.next-large .next-message-symbol:before{width:24px;font-size:24px;line-height:inherit}.next-message.next-large .next-message-title{padding:0 20px 0 36px;font-size:20px;line-height:20px}.next-message.next-large .next-message-content{margin-top:8px;padding:0 20px 0 36px;font-size:14px;line-height:1.5}.next-message.next-large .next-message-symbol+.next-message-content{margin-top:0}.next-message.next-large.next-only-content .next-message-content,.next-message.next-large.next-title-content .next-message-title{line-height:24px}.next-message.next-large .next-message-close{top:16px;right:16px}.next-message.next-large.next-inline,.next-message.next-large.next-toast{border-radius:3px}.next-message[dir=rtl] .next-message-symbol{float:right}.next-message[dir=rtl].next-medium .next-message-title{padding:0 24px 0 20px}.next-message[dir=rtl].next-medium .next-message-close{left:12px;right:auto}.next-message[dir=rtl].next-large .next-message-title{padding:0 36px 0 20px}.next-message[dir=rtl].next-large .next-message-close{left:16px;right:auto}.next-message-wrapper-v2{margin:0;padding:0;position:fixed;left:0;z-index:1001;width:100%;pointer-events:none}.next-message-list{padding:8px;text-align:center}.next-message-list .next-message{display:inline-block;pointer-events:all}.next-message-fade-leave{animation-duration:.3s;animation-play-state:paused;animation-fill-mode:both;animation-timing-function:ease}.next-message-fade-leave.next-message-fade-leave-active{animation-name:MessageFadeOut;animation-play-state:running}@keyframes MessageFadeOut{0%{max-height:150px;margin-bottom:16px;opacity:1}to{max-height:0;margin-bottom:0;padding-top:0;padding-bottom:0;opacity:0}}.next-dialog[dir=rtl],.next-dialog[dir=rtl] .next-dialog-footer.next-align-left{text-align:right}.next-dialog[dir=rtl] .next-dialog-footer.next-align-center{text-align:center}.next-dialog[dir=rtl] .next-dialog-footer.next-align-right{text-align:left}.next-dialog[dir=rtl] .next-dialog-btn+.next-dialog-btn{margin-right:4px;margin-left:0}.next-dialog[dir=rtl] .next-dialog-close{left:12px;right:auto}.next-dialog{position:fixed;z-index:1001;background:#fff;border:1px solid #e6e6e6;border-radius:6px;box-shadow:0 4px 8px 0 rgba(0,0,0,.12);text-align:left;overflow:hidden;max-width:90%}.next-dialog,.next-dialog *,.next-dialog :after,.next-dialog :before{box-sizing:border-box}.next-dialog-header{padding:12px 20px;border-bottom:0 solid transparent;font-size:16px;font-weight:400;background:transparent;color:#333}.next-dialog-body{padding:20px;font-size:14px;line-height:1.5;color:#666}.next-dialog-body-no-footer{margin-bottom:0}.next-dialog-footer{padding:12px 20px;border-top:0 solid transparent;background:transparent}.next-dialog-footer.next-align-left{text-align:left}.next-dialog-footer.next-align-center{text-align:center}.next-dialog-footer.next-align-right{text-align:right}.next-dialog-footer-fixed-height{position:absolute;width:100%;bottom:0}.next-dialog-btn+.next-dialog-btn{margin-left:4px}.next-dialog-close{position:absolute;top:12px;right:12px;width:16px;cursor:pointer}.next-dialog-close,.next-dialog-close:link,.next-dialog-close:visited{height:16px;color:#999}.next-dialog-close:hover{background:transparent;color:#333}.next-dialog-close .next-dialog-close-icon.next-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px;width:16px;height:16px;line-height:1em}.next-dialog-close .next-dialog-close-icon.next-icon:before{width:16px;height:16px;font-size:16px;line-height:1em}.next-dialog-container{position:fixed;top:0;left:0;right:0;bottom:0;z-index:1001;padding:40px;overflow:auto;text-align:center;box-sizing:border-box}.next-dialog-container:before{display:inline-block;vertical-align:middle;width:0;height:100%;content:""}.next-dialog-container .next-dialog{display:inline-block;position:relative;vertical-align:middle}.next-dialog-quick .next-dialog-body{padding:20px}.next-dialog .next-dialog-message.next-message{min-width:300px;padding:0}.next-dialog-wrapper{position:fixed;top:0;left:0;bottom:0;right:0;overflow:auto}.next-dialog-inner-wrapper{display:flex;position:relative;top:100px;pointer-events:none;padding-bottom:24px}.next-dialog-v2{pointer-events:auto;margin:0 auto}.next-dialog-v2 .next-dialog-header{word-break:break-word;padding-right:40px}.next-dialog-v2 .next-dialog-body{padding-right:40px}.next-dialog-v2 .next-dialog-header+.next-dialog-body{padding:20px}.next-dialog-v2 .next-dialog-header+.next-dialog-body-no-footer{margin-bottom:0}.next-dialog.next-dialog-v2{position:relative}.next-dialog-centered{text-align:center}.next-dialog-centered:before{display:inline-block;width:0;height:100%;vertical-align:middle;content:""}.next-dialog-centered .next-dialog-v2{margin:40px 0;display:inline-block;text-align:left;vertical-align:middle}.next-drawer{position:fixed;z-index:1001;background:#fff;border:1px solid #e6e6e6;box-shadow:0 4px 8px 0 rgba(0,0,0,.12);overflow:auto;animation-duration:.3s;animation-timing-function:ease-in-out}.next-drawer,.next-drawer *,.next-drawer :after,.next-drawer :before{box-sizing:border-box}.next-drawer-left,.next-drawer-right{height:100%;max-width:80%;width:240px}.next-drawer-bottom,.next-drawer-top{width:100%}.next-drawer-header{padding:12px 20px;border-bottom:1px solid #e6e6e6;font-size:16px;background:#fff;color:#333}.next-drawer-no-title{padding:0;border-bottom:0}.next-drawer-body{padding:20px;font-size:14px;line-height:1.5;color:#666}.next-drawer-close{position:absolute;top:12px;right:12px;width:16px;cursor:pointer}.next-drawer-close,.next-drawer-close:link,.next-drawer-close:visited{height:16px;color:#999}.next-drawer-close:hover{background:transparent;color:#333}.next-drawer-close .next-drawer-close-icon.next-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px;width:16px;height:16px;line-height:1em}.next-drawer-close .next-drawer-close-icon.next-icon:before{width:16px;height:16px;font-size:16px;line-height:1em}.next-row{display:flex}.next-row,.next-row *,.next-row :after,.next-row :before{box-sizing:border-box}.next-row.next-row-wrap{flex-wrap:wrap}@media(min-width:320px){.next-row.next-row-fixed{width:320px}}@media(min-width:480px){.next-row.next-row-fixed{width:480px}}@media(min-width:720px){.next-row.next-row-fixed{width:720px}}@media(min-width:990px){.next-row.next-row-fixed{width:990px}}@media(min-width:1200px){.next-row.next-row-fixed{width:1200px}}@media(min-width:1500px){.next-row.next-row-fixed{width:1500px}}.next-row.next-row-fixed-xxs{width:320px}.next-row.next-row-fixed-xs{width:480px}.next-row.next-row-fixed-s{width:720px}.next-row.next-row-fixed-m{width:990px}.next-row.next-row-fixed-l{width:1200px}.next-row.next-row-fixed-xl{width:1500px}.next-row.next-row-justify-start{justify-content:flex-start}.next-row.next-row-justify-end{justify-content:flex-end}.next-row.next-row-justify-center{justify-content:center}.next-row.next-row-justify-space-between{justify-content:space-between}.next-row.next-row-justify-space-around{justify-content:space-around}.next-row.next-row-align-top{align-items:flex-start}.next-row.next-row-align-bottom{align-items:flex-end}.next-row.next-row-align-center{align-items:center}.next-row.next-row-align-baseline{align-items:baseline}.next-row.next-row-align-stretch{align-items:stretch}.next-col{flex:1}.next-col.next-col-top{align-self:flex-start}.next-col.next-col-bottom{align-self:flex-end}.next-col.next-col-center{align-self:center}@media (min-width:0\0)and (min-resolution:0.001dpcm){.next-row{display:table;width:100%}.next-col{display:table-cell;vertical-align:top}}.next-col-1{flex:0 0 4.1666666667%;width:4.1666666667%;max-width:4.1666666667%}.next-col-2{flex:0 0 8.3333333333%;width:8.3333333333%;max-width:8.3333333333%}.next-col-3{flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-4{flex:0 0 16.6666666667%;width:16.6666666667%;max-width:16.6666666667%}.next-col-5{flex:0 0 20.8333333333%;width:20.8333333333%;max-width:20.8333333333%}.next-col-6{flex:0 0 25%;width:25%;max-width:25%}.next-col-7{flex:0 0 29.1666666667%;width:29.1666666667%;max-width:29.1666666667%}.next-col-8{flex:0 0 33.3333333333%;width:33.3333333333%;max-width:33.3333333333%}.next-col-9{flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-10{flex:0 0 41.6666666667%;width:41.6666666667%;max-width:41.6666666667%}.next-col-11{flex:0 0 45.8333333333%;width:45.8333333333%;max-width:45.8333333333%}.next-col-12{flex:0 0 50%;width:50%;max-width:50%}.next-col-13{flex:0 0 54.1666666667%;width:54.1666666667%;max-width:54.1666666667%}.next-col-14{flex:0 0 58.3333333333%;width:58.3333333333%;max-width:58.3333333333%}.next-col-15{flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-16{flex:0 0 66.6666666667%;width:66.6666666667%;max-width:66.6666666667%}.next-col-17{flex:0 0 70.8333333333%;width:70.8333333333%;max-width:70.8333333333%}.next-col-18{flex:0 0 75%;width:75%;max-width:75%}.next-col-19{flex:0 0 79.1666666667%;width:79.1666666667%;max-width:79.1666666667%}.next-col-20{flex:0 0 83.3333333333%;width:83.3333333333%;max-width:83.3333333333%}.next-col-21{flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-22{flex:0 0 91.6666666667%;width:91.6666666667%;max-width:91.6666666667%}.next-col-23{flex:0 0 95.8333333333%;width:95.8333333333%;max-width:95.8333333333%}.next-col-24{flex:0 0 100%;width:100%;max-width:100%}@media(min-width:320px){.next-col-xxs-1{flex:0 0 4.1666666667%;width:4.1666666667%;max-width:4.1666666667%}.next-col-xxs-2{flex:0 0 8.3333333333%;width:8.3333333333%;max-width:8.3333333333%}.next-col-xxs-3{flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-xxs-4{flex:0 0 16.6666666667%;width:16.6666666667%;max-width:16.6666666667%}.next-col-xxs-5{flex:0 0 20.8333333333%;width:20.8333333333%;max-width:20.8333333333%}.next-col-xxs-6{flex:0 0 25%;width:25%;max-width:25%}.next-col-xxs-7{flex:0 0 29.1666666667%;width:29.1666666667%;max-width:29.1666666667%}.next-col-xxs-8{flex:0 0 33.3333333333%;width:33.3333333333%;max-width:33.3333333333%}.next-col-xxs-9{flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-xxs-10{flex:0 0 41.6666666667%;width:41.6666666667%;max-width:41.6666666667%}.next-col-xxs-11{flex:0 0 45.8333333333%;width:45.8333333333%;max-width:45.8333333333%}.next-col-xxs-12{flex:0 0 50%;width:50%;max-width:50%}.next-col-xxs-13{flex:0 0 54.1666666667%;width:54.1666666667%;max-width:54.1666666667%}.next-col-xxs-14{flex:0 0 58.3333333333%;width:58.3333333333%;max-width:58.3333333333%}.next-col-xxs-15{flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-xxs-16{flex:0 0 66.6666666667%;width:66.6666666667%;max-width:66.6666666667%}.next-col-xxs-17{flex:0 0 70.8333333333%;width:70.8333333333%;max-width:70.8333333333%}.next-col-xxs-18{flex:0 0 75%;width:75%;max-width:75%}.next-col-xxs-19{flex:0 0 79.1666666667%;width:79.1666666667%;max-width:79.1666666667%}.next-col-xxs-20{flex:0 0 83.3333333333%;width:83.3333333333%;max-width:83.3333333333%}.next-col-xxs-21{flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-xxs-22{flex:0 0 91.6666666667%;width:91.6666666667%;max-width:91.6666666667%}.next-col-xxs-23{flex:0 0 95.8333333333%;width:95.8333333333%;max-width:95.8333333333%}.next-col-xxs-24{flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:480px){.next-col-xs-1{flex:0 0 4.1666666667%;width:4.1666666667%;max-width:4.1666666667%}.next-col-xs-2{flex:0 0 8.3333333333%;width:8.3333333333%;max-width:8.3333333333%}.next-col-xs-3{flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-xs-4{flex:0 0 16.6666666667%;width:16.6666666667%;max-width:16.6666666667%}.next-col-xs-5{flex:0 0 20.8333333333%;width:20.8333333333%;max-width:20.8333333333%}.next-col-xs-6{flex:0 0 25%;width:25%;max-width:25%}.next-col-xs-7{flex:0 0 29.1666666667%;width:29.1666666667%;max-width:29.1666666667%}.next-col-xs-8{flex:0 0 33.3333333333%;width:33.3333333333%;max-width:33.3333333333%}.next-col-xs-9{flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-xs-10{flex:0 0 41.6666666667%;width:41.6666666667%;max-width:41.6666666667%}.next-col-xs-11{flex:0 0 45.8333333333%;width:45.8333333333%;max-width:45.8333333333%}.next-col-xs-12{flex:0 0 50%;width:50%;max-width:50%}.next-col-xs-13{flex:0 0 54.1666666667%;width:54.1666666667%;max-width:54.1666666667%}.next-col-xs-14{flex:0 0 58.3333333333%;width:58.3333333333%;max-width:58.3333333333%}.next-col-xs-15{flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-xs-16{flex:0 0 66.6666666667%;width:66.6666666667%;max-width:66.6666666667%}.next-col-xs-17{flex:0 0 70.8333333333%;width:70.8333333333%;max-width:70.8333333333%}.next-col-xs-18{flex:0 0 75%;width:75%;max-width:75%}.next-col-xs-19{flex:0 0 79.1666666667%;width:79.1666666667%;max-width:79.1666666667%}.next-col-xs-20{flex:0 0 83.3333333333%;width:83.3333333333%;max-width:83.3333333333%}.next-col-xs-21{flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-xs-22{flex:0 0 91.6666666667%;width:91.6666666667%;max-width:91.6666666667%}.next-col-xs-23{flex:0 0 95.8333333333%;width:95.8333333333%;max-width:95.8333333333%}.next-col-xs-24{flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:720px){.next-col-s-1{flex:0 0 4.1666666667%;width:4.1666666667%;max-width:4.1666666667%}.next-col-s-2{flex:0 0 8.3333333333%;width:8.3333333333%;max-width:8.3333333333%}.next-col-s-3{flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-s-4{flex:0 0 16.6666666667%;width:16.6666666667%;max-width:16.6666666667%}.next-col-s-5{flex:0 0 20.8333333333%;width:20.8333333333%;max-width:20.8333333333%}.next-col-s-6{flex:0 0 25%;width:25%;max-width:25%}.next-col-s-7{flex:0 0 29.1666666667%;width:29.1666666667%;max-width:29.1666666667%}.next-col-s-8{flex:0 0 33.3333333333%;width:33.3333333333%;max-width:33.3333333333%}.next-col-s-9{flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-s-10{flex:0 0 41.6666666667%;width:41.6666666667%;max-width:41.6666666667%}.next-col-s-11{flex:0 0 45.8333333333%;width:45.8333333333%;max-width:45.8333333333%}.next-col-s-12{flex:0 0 50%;width:50%;max-width:50%}.next-col-s-13{flex:0 0 54.1666666667%;width:54.1666666667%;max-width:54.1666666667%}.next-col-s-14{flex:0 0 58.3333333333%;width:58.3333333333%;max-width:58.3333333333%}.next-col-s-15{flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-s-16{flex:0 0 66.6666666667%;width:66.6666666667%;max-width:66.6666666667%}.next-col-s-17{flex:0 0 70.8333333333%;width:70.8333333333%;max-width:70.8333333333%}.next-col-s-18{flex:0 0 75%;width:75%;max-width:75%}.next-col-s-19{flex:0 0 79.1666666667%;width:79.1666666667%;max-width:79.1666666667%}.next-col-s-20{flex:0 0 83.3333333333%;width:83.3333333333%;max-width:83.3333333333%}.next-col-s-21{flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-s-22{flex:0 0 91.6666666667%;width:91.6666666667%;max-width:91.6666666667%}.next-col-s-23{flex:0 0 95.8333333333%;width:95.8333333333%;max-width:95.8333333333%}.next-col-s-24{flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:990px){.next-col-m-1{flex:0 0 4.1666666667%;width:4.1666666667%;max-width:4.1666666667%}.next-col-m-2{flex:0 0 8.3333333333%;width:8.3333333333%;max-width:8.3333333333%}.next-col-m-3{flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-m-4{flex:0 0 16.6666666667%;width:16.6666666667%;max-width:16.6666666667%}.next-col-m-5{flex:0 0 20.8333333333%;width:20.8333333333%;max-width:20.8333333333%}.next-col-m-6{flex:0 0 25%;width:25%;max-width:25%}.next-col-m-7{flex:0 0 29.1666666667%;width:29.1666666667%;max-width:29.1666666667%}.next-col-m-8{flex:0 0 33.3333333333%;width:33.3333333333%;max-width:33.3333333333%}.next-col-m-9{flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-m-10{flex:0 0 41.6666666667%;width:41.6666666667%;max-width:41.6666666667%}.next-col-m-11{flex:0 0 45.8333333333%;width:45.8333333333%;max-width:45.8333333333%}.next-col-m-12{flex:0 0 50%;width:50%;max-width:50%}.next-col-m-13{flex:0 0 54.1666666667%;width:54.1666666667%;max-width:54.1666666667%}.next-col-m-14{flex:0 0 58.3333333333%;width:58.3333333333%;max-width:58.3333333333%}.next-col-m-15{flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-m-16{flex:0 0 66.6666666667%;width:66.6666666667%;max-width:66.6666666667%}.next-col-m-17{flex:0 0 70.8333333333%;width:70.8333333333%;max-width:70.8333333333%}.next-col-m-18{flex:0 0 75%;width:75%;max-width:75%}.next-col-m-19{flex:0 0 79.1666666667%;width:79.1666666667%;max-width:79.1666666667%}.next-col-m-20{flex:0 0 83.3333333333%;width:83.3333333333%;max-width:83.3333333333%}.next-col-m-21{flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-m-22{flex:0 0 91.6666666667%;width:91.6666666667%;max-width:91.6666666667%}.next-col-m-23{flex:0 0 95.8333333333%;width:95.8333333333%;max-width:95.8333333333%}.next-col-m-24{flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:1200px){.next-col-l-1{flex:0 0 4.1666666667%;width:4.1666666667%;max-width:4.1666666667%}.next-col-l-2{flex:0 0 8.3333333333%;width:8.3333333333%;max-width:8.3333333333%}.next-col-l-3{flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-l-4{flex:0 0 16.6666666667%;width:16.6666666667%;max-width:16.6666666667%}.next-col-l-5{flex:0 0 20.8333333333%;width:20.8333333333%;max-width:20.8333333333%}.next-col-l-6{flex:0 0 25%;width:25%;max-width:25%}.next-col-l-7{flex:0 0 29.1666666667%;width:29.1666666667%;max-width:29.1666666667%}.next-col-l-8{flex:0 0 33.3333333333%;width:33.3333333333%;max-width:33.3333333333%}.next-col-l-9{flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-l-10{flex:0 0 41.6666666667%;width:41.6666666667%;max-width:41.6666666667%}.next-col-l-11{flex:0 0 45.8333333333%;width:45.8333333333%;max-width:45.8333333333%}.next-col-l-12{flex:0 0 50%;width:50%;max-width:50%}.next-col-l-13{flex:0 0 54.1666666667%;width:54.1666666667%;max-width:54.1666666667%}.next-col-l-14{flex:0 0 58.3333333333%;width:58.3333333333%;max-width:58.3333333333%}.next-col-l-15{flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-l-16{flex:0 0 66.6666666667%;width:66.6666666667%;max-width:66.6666666667%}.next-col-l-17{flex:0 0 70.8333333333%;width:70.8333333333%;max-width:70.8333333333%}.next-col-l-18{flex:0 0 75%;width:75%;max-width:75%}.next-col-l-19{flex:0 0 79.1666666667%;width:79.1666666667%;max-width:79.1666666667%}.next-col-l-20{flex:0 0 83.3333333333%;width:83.3333333333%;max-width:83.3333333333%}.next-col-l-21{flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-l-22{flex:0 0 91.6666666667%;width:91.6666666667%;max-width:91.6666666667%}.next-col-l-23{flex:0 0 95.8333333333%;width:95.8333333333%;max-width:95.8333333333%}.next-col-l-24{flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:1500px){.next-col-xl-1{flex:0 0 4.1666666667%;width:4.1666666667%;max-width:4.1666666667%}.next-col-xl-2{flex:0 0 8.3333333333%;width:8.3333333333%;max-width:8.3333333333%}.next-col-xl-3{flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-xl-4{flex:0 0 16.6666666667%;width:16.6666666667%;max-width:16.6666666667%}.next-col-xl-5{flex:0 0 20.8333333333%;width:20.8333333333%;max-width:20.8333333333%}.next-col-xl-6{flex:0 0 25%;width:25%;max-width:25%}.next-col-xl-7{flex:0 0 29.1666666667%;width:29.1666666667%;max-width:29.1666666667%}.next-col-xl-8{flex:0 0 33.3333333333%;width:33.3333333333%;max-width:33.3333333333%}.next-col-xl-9{flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-xl-10{flex:0 0 41.6666666667%;width:41.6666666667%;max-width:41.6666666667%}.next-col-xl-11{flex:0 0 45.8333333333%;width:45.8333333333%;max-width:45.8333333333%}.next-col-xl-12{flex:0 0 50%;width:50%;max-width:50%}.next-col-xl-13{flex:0 0 54.1666666667%;width:54.1666666667%;max-width:54.1666666667%}.next-col-xl-14{flex:0 0 58.3333333333%;width:58.3333333333%;max-width:58.3333333333%}.next-col-xl-15{flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-xl-16{flex:0 0 66.6666666667%;width:66.6666666667%;max-width:66.6666666667%}.next-col-xl-17{flex:0 0 70.8333333333%;width:70.8333333333%;max-width:70.8333333333%}.next-col-xl-18{flex:0 0 75%;width:75%;max-width:75%}.next-col-xl-19{flex:0 0 79.1666666667%;width:79.1666666667%;max-width:79.1666666667%}.next-col-xl-20{flex:0 0 83.3333333333%;width:83.3333333333%;max-width:83.3333333333%}.next-col-xl-21{flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-xl-22{flex:0 0 91.6666666667%;width:91.6666666667%;max-width:91.6666666667%}.next-col-xl-23{flex:0 0 95.8333333333%;width:95.8333333333%;max-width:95.8333333333%}.next-col-xl-24{flex:0 0 100%;width:100%;max-width:100%}}.next-col-1p5{flex:0 0 20%;width:20%;max-width:20%}.next-col-2p5{flex:0 0 40%;width:40%;max-width:40%}.next-col-3p5{flex:0 0 60%;width:60%;max-width:60%}.next-col-4p5{flex:0 0 80%;width:80%;max-width:80%}.next-col-5p5{flex:0 0 100%;width:100%;max-width:100%}@media(min-width:320px){.next-col-xxs-1p5{flex:0 0 20%;width:20%;max-width:20%}.next-col-xxs-2p5{flex:0 0 40%;width:40%;max-width:40%}.next-col-xxs-3p5{flex:0 0 60%;width:60%;max-width:60%}.next-col-xxs-4p5{flex:0 0 80%;width:80%;max-width:80%}.next-col-xxs-5p5{flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:480px){.next-col-xs-1p5{flex:0 0 20%;width:20%;max-width:20%}.next-col-xs-2p5{flex:0 0 40%;width:40%;max-width:40%}.next-col-xs-3p5{flex:0 0 60%;width:60%;max-width:60%}.next-col-xs-4p5{flex:0 0 80%;width:80%;max-width:80%}.next-col-xs-5p5{flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:720px){.next-col-s-1p5{flex:0 0 20%;width:20%;max-width:20%}.next-col-s-2p5{flex:0 0 40%;width:40%;max-width:40%}.next-col-s-3p5{flex:0 0 60%;width:60%;max-width:60%}.next-col-s-4p5{flex:0 0 80%;width:80%;max-width:80%}.next-col-s-5p5{flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:990px){.next-col-m-1p5{flex:0 0 20%;width:20%;max-width:20%}.next-col-m-2p5{flex:0 0 40%;width:40%;max-width:40%}.next-col-m-3p5{flex:0 0 60%;width:60%;max-width:60%}.next-col-m-4p5{flex:0 0 80%;width:80%;max-width:80%}.next-col-m-5p5{flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:1200px){.next-col-l-1p5{flex:0 0 20%;width:20%;max-width:20%}.next-col-l-2p5{flex:0 0 40%;width:40%;max-width:40%}.next-col-l-3p5{flex:0 0 60%;width:60%;max-width:60%}.next-col-l-4p5{flex:0 0 80%;width:80%;max-width:80%}.next-col-l-5p5{flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:1500px){.next-col-xl-1p5{flex:0 0 20%;width:20%;max-width:20%}.next-col-xl-2p5{flex:0 0 40%;width:40%;max-width:40%}.next-col-xl-3p5{flex:0 0 60%;width:60%;max-width:60%}.next-col-xl-4p5{flex:0 0 80%;width:80%;max-width:80%}.next-col-xl-5p5{flex:0 0 100%;width:100%;max-width:100%}}.next-col-fixed-1{flex:0 0 20px;width:20px;max-width:20px}.next-col-fixed-2{flex:0 0 40px;width:40px;max-width:40px}.next-col-fixed-3{flex:0 0 60px;width:60px;max-width:60px}.next-col-fixed-4{flex:0 0 80px;width:80px;max-width:80px}.next-col-fixed-5{flex:0 0 100px;width:100px;max-width:100px}.next-col-fixed-6{flex:0 0 120px;width:120px;max-width:120px}.next-col-fixed-7{flex:0 0 140px;width:140px;max-width:140px}.next-col-fixed-8{flex:0 0 160px;width:160px;max-width:160px}.next-col-fixed-9{flex:0 0 180px;width:180px;max-width:180px}.next-col-fixed-10{flex:0 0 200px;width:200px;max-width:200px}.next-col-fixed-11{flex:0 0 220px;width:220px;max-width:220px}.next-col-fixed-12{flex:0 0 240px;width:240px;max-width:240px}.next-col-fixed-13{flex:0 0 260px;width:260px;max-width:260px}.next-col-fixed-14{flex:0 0 280px;width:280px;max-width:280px}.next-col-fixed-15{flex:0 0 300px;width:300px;max-width:300px}.next-col-fixed-16{flex:0 0 320px;width:320px;max-width:320px}.next-col-fixed-17{flex:0 0 340px;width:340px;max-width:340px}.next-col-fixed-18{flex:0 0 360px;width:360px;max-width:360px}.next-col-fixed-19{flex:0 0 380px;width:380px;max-width:380px}.next-col-fixed-20{flex:0 0 400px;width:400px;max-width:400px}.next-col-fixed-21{flex:0 0 420px;width:420px;max-width:420px}.next-col-fixed-22{flex:0 0 440px;width:440px;max-width:440px}.next-col-fixed-23{flex:0 0 460px;width:460px;max-width:460px}.next-col-fixed-24{flex:0 0 480px;width:480px;max-width:480px}.next-col-fixed-25{flex:0 0 500px;width:500px;max-width:500px}.next-col-fixed-26{flex:0 0 520px;width:520px;max-width:520px}.next-col-fixed-27{flex:0 0 540px;width:540px;max-width:540px}.next-col-fixed-28{flex:0 0 560px;width:560px;max-width:560px}.next-col-fixed-29{flex:0 0 580px;width:580px;max-width:580px}.next-col-fixed-30{flex:0 0 600px;width:600px;max-width:600px}.next-col-offset-1{margin-left:4.1666666667%}.next-col-offset-2{margin-left:8.3333333333%}.next-col-offset-3{margin-left:12.5%}.next-col-offset-4{margin-left:16.6666666667%}.next-col-offset-5{margin-left:20.8333333333%}.next-col-offset-6{margin-left:25%}.next-col-offset-7{margin-left:29.1666666667%}.next-col-offset-8{margin-left:33.3333333333%}.next-col-offset-9{margin-left:37.5%}.next-col-offset-10{margin-left:41.6666666667%}.next-col-offset-11{margin-left:45.8333333333%}.next-col-offset-12{margin-left:50%}.next-col-offset-13{margin-left:54.1666666667%}.next-col-offset-14{margin-left:58.3333333333%}.next-col-offset-15{margin-left:62.5%}.next-col-offset-16{margin-left:66.6666666667%}.next-col-offset-17{margin-left:70.8333333333%}.next-col-offset-18{margin-left:75%}.next-col-offset-19{margin-left:79.1666666667%}.next-col-offset-20{margin-left:83.3333333333%}.next-col-offset-21{margin-left:87.5%}.next-col-offset-22{margin-left:91.6666666667%}.next-col-offset-23{margin-left:95.8333333333%}.next-col-offset-24{margin-left:100%}@media(min-width:320px){.next-col-xxs-offset-1{margin-left:4.1666666667%}.next-col-xxs-offset-2{margin-left:8.3333333333%}.next-col-xxs-offset-3{margin-left:12.5%}.next-col-xxs-offset-4{margin-left:16.6666666667%}.next-col-xxs-offset-5{margin-left:20.8333333333%}.next-col-xxs-offset-6{margin-left:25%}.next-col-xxs-offset-7{margin-left:29.1666666667%}.next-col-xxs-offset-8{margin-left:33.3333333333%}.next-col-xxs-offset-9{margin-left:37.5%}.next-col-xxs-offset-10{margin-left:41.6666666667%}.next-col-xxs-offset-11{margin-left:45.8333333333%}.next-col-xxs-offset-12{margin-left:50%}.next-col-xxs-offset-13{margin-left:54.1666666667%}.next-col-xxs-offset-14{margin-left:58.3333333333%}.next-col-xxs-offset-15{margin-left:62.5%}.next-col-xxs-offset-16{margin-left:66.6666666667%}.next-col-xxs-offset-17{margin-left:70.8333333333%}.next-col-xxs-offset-18{margin-left:75%}.next-col-xxs-offset-19{margin-left:79.1666666667%}.next-col-xxs-offset-20{margin-left:83.3333333333%}.next-col-xxs-offset-21{margin-left:87.5%}.next-col-xxs-offset-22{margin-left:91.6666666667%}.next-col-xxs-offset-23{margin-left:95.8333333333%}.next-col-xxs-offset-24{margin-left:100%}}@media(min-width:480px){.next-col-xs-offset-1{margin-left:4.1666666667%}.next-col-xs-offset-2{margin-left:8.3333333333%}.next-col-xs-offset-3{margin-left:12.5%}.next-col-xs-offset-4{margin-left:16.6666666667%}.next-col-xs-offset-5{margin-left:20.8333333333%}.next-col-xs-offset-6{margin-left:25%}.next-col-xs-offset-7{margin-left:29.1666666667%}.next-col-xs-offset-8{margin-left:33.3333333333%}.next-col-xs-offset-9{margin-left:37.5%}.next-col-xs-offset-10{margin-left:41.6666666667%}.next-col-xs-offset-11{margin-left:45.8333333333%}.next-col-xs-offset-12{margin-left:50%}.next-col-xs-offset-13{margin-left:54.1666666667%}.next-col-xs-offset-14{margin-left:58.3333333333%}.next-col-xs-offset-15{margin-left:62.5%}.next-col-xs-offset-16{margin-left:66.6666666667%}.next-col-xs-offset-17{margin-left:70.8333333333%}.next-col-xs-offset-18{margin-left:75%}.next-col-xs-offset-19{margin-left:79.1666666667%}.next-col-xs-offset-20{margin-left:83.3333333333%}.next-col-xs-offset-21{margin-left:87.5%}.next-col-xs-offset-22{margin-left:91.6666666667%}.next-col-xs-offset-23{margin-left:95.8333333333%}.next-col-xs-offset-24{margin-left:100%}}@media(min-width:720px){.next-col-s-offset-1{margin-left:4.1666666667%}.next-col-s-offset-2{margin-left:8.3333333333%}.next-col-s-offset-3{margin-left:12.5%}.next-col-s-offset-4{margin-left:16.6666666667%}.next-col-s-offset-5{margin-left:20.8333333333%}.next-col-s-offset-6{margin-left:25%}.next-col-s-offset-7{margin-left:29.1666666667%}.next-col-s-offset-8{margin-left:33.3333333333%}.next-col-s-offset-9{margin-left:37.5%}.next-col-s-offset-10{margin-left:41.6666666667%}.next-col-s-offset-11{margin-left:45.8333333333%}.next-col-s-offset-12{margin-left:50%}.next-col-s-offset-13{margin-left:54.1666666667%}.next-col-s-offset-14{margin-left:58.3333333333%}.next-col-s-offset-15{margin-left:62.5%}.next-col-s-offset-16{margin-left:66.6666666667%}.next-col-s-offset-17{margin-left:70.8333333333%}.next-col-s-offset-18{margin-left:75%}.next-col-s-offset-19{margin-left:79.1666666667%}.next-col-s-offset-20{margin-left:83.3333333333%}.next-col-s-offset-21{margin-left:87.5%}.next-col-s-offset-22{margin-left:91.6666666667%}.next-col-s-offset-23{margin-left:95.8333333333%}.next-col-s-offset-24{margin-left:100%}}@media(min-width:990px){.next-col-m-offset-1{margin-left:4.1666666667%}.next-col-m-offset-2{margin-left:8.3333333333%}.next-col-m-offset-3{margin-left:12.5%}.next-col-m-offset-4{margin-left:16.6666666667%}.next-col-m-offset-5{margin-left:20.8333333333%}.next-col-m-offset-6{margin-left:25%}.next-col-m-offset-7{margin-left:29.1666666667%}.next-col-m-offset-8{margin-left:33.3333333333%}.next-col-m-offset-9{margin-left:37.5%}.next-col-m-offset-10{margin-left:41.6666666667%}.next-col-m-offset-11{margin-left:45.8333333333%}.next-col-m-offset-12{margin-left:50%}.next-col-m-offset-13{margin-left:54.1666666667%}.next-col-m-offset-14{margin-left:58.3333333333%}.next-col-m-offset-15{margin-left:62.5%}.next-col-m-offset-16{margin-left:66.6666666667%}.next-col-m-offset-17{margin-left:70.8333333333%}.next-col-m-offset-18{margin-left:75%}.next-col-m-offset-19{margin-left:79.1666666667%}.next-col-m-offset-20{margin-left:83.3333333333%}.next-col-m-offset-21{margin-left:87.5%}.next-col-m-offset-22{margin-left:91.6666666667%}.next-col-m-offset-23{margin-left:95.8333333333%}.next-col-m-offset-24{margin-left:100%}}@media(min-width:1200px){.next-col-l-offset-1{margin-left:4.1666666667%}.next-col-l-offset-2{margin-left:8.3333333333%}.next-col-l-offset-3{margin-left:12.5%}.next-col-l-offset-4{margin-left:16.6666666667%}.next-col-l-offset-5{margin-left:20.8333333333%}.next-col-l-offset-6{margin-left:25%}.next-col-l-offset-7{margin-left:29.1666666667%}.next-col-l-offset-8{margin-left:33.3333333333%}.next-col-l-offset-9{margin-left:37.5%}.next-col-l-offset-10{margin-left:41.6666666667%}.next-col-l-offset-11{margin-left:45.8333333333%}.next-col-l-offset-12{margin-left:50%}.next-col-l-offset-13{margin-left:54.1666666667%}.next-col-l-offset-14{margin-left:58.3333333333%}.next-col-l-offset-15{margin-left:62.5%}.next-col-l-offset-16{margin-left:66.6666666667%}.next-col-l-offset-17{margin-left:70.8333333333%}.next-col-l-offset-18{margin-left:75%}.next-col-l-offset-19{margin-left:79.1666666667%}.next-col-l-offset-20{margin-left:83.3333333333%}.next-col-l-offset-21{margin-left:87.5%}.next-col-l-offset-22{margin-left:91.6666666667%}.next-col-l-offset-23{margin-left:95.8333333333%}.next-col-l-offset-24{margin-left:100%}}@media(min-width:1500px){.next-col-xl-offset-1{margin-left:4.1666666667%}.next-col-xl-offset-2{margin-left:8.3333333333%}.next-col-xl-offset-3{margin-left:12.5%}.next-col-xl-offset-4{margin-left:16.6666666667%}.next-col-xl-offset-5{margin-left:20.8333333333%}.next-col-xl-offset-6{margin-left:25%}.next-col-xl-offset-7{margin-left:29.1666666667%}.next-col-xl-offset-8{margin-left:33.3333333333%}.next-col-xl-offset-9{margin-left:37.5%}.next-col-xl-offset-10{margin-left:41.6666666667%}.next-col-xl-offset-11{margin-left:45.8333333333%}.next-col-xl-offset-12{margin-left:50%}.next-col-xl-offset-13{margin-left:54.1666666667%}.next-col-xl-offset-14{margin-left:58.3333333333%}.next-col-xl-offset-15{margin-left:62.5%}.next-col-xl-offset-16{margin-left:66.6666666667%}.next-col-xl-offset-17{margin-left:70.8333333333%}.next-col-xl-offset-18{margin-left:75%}.next-col-xl-offset-19{margin-left:79.1666666667%}.next-col-xl-offset-20{margin-left:83.3333333333%}.next-col-xl-offset-21{margin-left:87.5%}.next-col-xl-offset-22{margin-left:91.6666666667%}.next-col-xl-offset-23{margin-left:95.8333333333%}.next-col-xl-offset-24{margin-left:100%}}.next-col-offset-fixed-1{margin-left:20px}.next-col-offset-fixed-2{margin-left:40px}.next-col-offset-fixed-3{margin-left:60px}.next-col-offset-fixed-4{margin-left:80px}.next-col-offset-fixed-5{margin-left:100px}.next-col-offset-fixed-6{margin-left:120px}.next-col-offset-fixed-7{margin-left:140px}.next-col-offset-fixed-8{margin-left:160px}.next-col-offset-fixed-9{margin-left:180px}.next-col-offset-fixed-10{margin-left:200px}.next-col-offset-fixed-11{margin-left:220px}.next-col-offset-fixed-12{margin-left:240px}.next-col-offset-fixed-13{margin-left:260px}.next-col-offset-fixed-14{margin-left:280px}.next-col-offset-fixed-15{margin-left:300px}.next-col-offset-fixed-16{margin-left:320px}.next-col-offset-fixed-17{margin-left:340px}.next-col-offset-fixed-18{margin-left:360px}.next-col-offset-fixed-19{margin-left:380px}.next-col-offset-fixed-20{margin-left:400px}.next-col-offset-fixed-21{margin-left:420px}.next-col-offset-fixed-22{margin-left:440px}.next-col-offset-fixed-23{margin-left:460px}.next-col-offset-fixed-24{margin-left:480px}.next-col-offset-fixed-25{margin-left:500px}.next-col-offset-fixed-26{margin-left:520px}.next-col-offset-fixed-27{margin-left:540px}.next-col-offset-fixed-28{margin-left:560px}.next-col-offset-fixed-29{margin-left:580px}.next-col-offset-fixed-30{margin-left:600px}.next-col-offset-fixed-xxs-1{margin-left:20px}.next-col-offset-fixed-xxs-2{margin-left:40px}.next-col-offset-fixed-xxs-3{margin-left:60px}.next-col-offset-fixed-xxs-4{margin-left:80px}.next-col-offset-fixed-xxs-5{margin-left:100px}.next-col-offset-fixed-xxs-6{margin-left:120px}.next-col-offset-fixed-xxs-7{margin-left:140px}.next-col-offset-fixed-xxs-8{margin-left:160px}.next-col-offset-fixed-xxs-9{margin-left:180px}.next-col-offset-fixed-xxs-10{margin-left:200px}.next-col-offset-fixed-xxs-11{margin-left:220px}.next-col-offset-fixed-xxs-12{margin-left:240px}.next-col-offset-fixed-xxs-13{margin-left:260px}.next-col-offset-fixed-xxs-14{margin-left:280px}.next-col-offset-fixed-xxs-15{margin-left:300px}.next-col-offset-fixed-xxs-16{margin-left:320px}.next-col-offset-fixed-xxs-17{margin-left:340px}.next-col-offset-fixed-xxs-18{margin-left:360px}.next-col-offset-fixed-xxs-19{margin-left:380px}.next-col-offset-fixed-xxs-20{margin-left:400px}.next-col-offset-fixed-xxs-21{margin-left:420px}.next-col-offset-fixed-xxs-22{margin-left:440px}.next-col-offset-fixed-xxs-23{margin-left:460px}.next-col-offset-fixed-xxs-24{margin-left:480px}.next-col-offset-fixed-xxs-25{margin-left:500px}.next-col-offset-fixed-xxs-26{margin-left:520px}.next-col-offset-fixed-xxs-27{margin-left:540px}.next-col-offset-fixed-xxs-28{margin-left:560px}.next-col-offset-fixed-xxs-29{margin-left:580px}.next-col-offset-fixed-xxs-30{margin-left:600px}.next-col-offset-fixed-xs-1{margin-left:20px}.next-col-offset-fixed-xs-2{margin-left:40px}.next-col-offset-fixed-xs-3{margin-left:60px}.next-col-offset-fixed-xs-4{margin-left:80px}.next-col-offset-fixed-xs-5{margin-left:100px}.next-col-offset-fixed-xs-6{margin-left:120px}.next-col-offset-fixed-xs-7{margin-left:140px}.next-col-offset-fixed-xs-8{margin-left:160px}.next-col-offset-fixed-xs-9{margin-left:180px}.next-col-offset-fixed-xs-10{margin-left:200px}.next-col-offset-fixed-xs-11{margin-left:220px}.next-col-offset-fixed-xs-12{margin-left:240px}.next-col-offset-fixed-xs-13{margin-left:260px}.next-col-offset-fixed-xs-14{margin-left:280px}.next-col-offset-fixed-xs-15{margin-left:300px}.next-col-offset-fixed-xs-16{margin-left:320px}.next-col-offset-fixed-xs-17{margin-left:340px}.next-col-offset-fixed-xs-18{margin-left:360px}.next-col-offset-fixed-xs-19{margin-left:380px}.next-col-offset-fixed-xs-20{margin-left:400px}.next-col-offset-fixed-xs-21{margin-left:420px}.next-col-offset-fixed-xs-22{margin-left:440px}.next-col-offset-fixed-xs-23{margin-left:460px}.next-col-offset-fixed-xs-24{margin-left:480px}.next-col-offset-fixed-xs-25{margin-left:500px}.next-col-offset-fixed-xs-26{margin-left:520px}.next-col-offset-fixed-xs-27{margin-left:540px}.next-col-offset-fixed-xs-28{margin-left:560px}.next-col-offset-fixed-xs-29{margin-left:580px}.next-col-offset-fixed-xs-30{margin-left:600px}.next-col-offset-fixed-s-1{margin-left:20px}.next-col-offset-fixed-s-2{margin-left:40px}.next-col-offset-fixed-s-3{margin-left:60px}.next-col-offset-fixed-s-4{margin-left:80px}.next-col-offset-fixed-s-5{margin-left:100px}.next-col-offset-fixed-s-6{margin-left:120px}.next-col-offset-fixed-s-7{margin-left:140px}.next-col-offset-fixed-s-8{margin-left:160px}.next-col-offset-fixed-s-9{margin-left:180px}.next-col-offset-fixed-s-10{margin-left:200px}.next-col-offset-fixed-s-11{margin-left:220px}.next-col-offset-fixed-s-12{margin-left:240px}.next-col-offset-fixed-s-13{margin-left:260px}.next-col-offset-fixed-s-14{margin-left:280px}.next-col-offset-fixed-s-15{margin-left:300px}.next-col-offset-fixed-s-16{margin-left:320px}.next-col-offset-fixed-s-17{margin-left:340px}.next-col-offset-fixed-s-18{margin-left:360px}.next-col-offset-fixed-s-19{margin-left:380px}.next-col-offset-fixed-s-20{margin-left:400px}.next-col-offset-fixed-s-21{margin-left:420px}.next-col-offset-fixed-s-22{margin-left:440px}.next-col-offset-fixed-s-23{margin-left:460px}.next-col-offset-fixed-s-24{margin-left:480px}.next-col-offset-fixed-s-25{margin-left:500px}.next-col-offset-fixed-s-26{margin-left:520px}.next-col-offset-fixed-s-27{margin-left:540px}.next-col-offset-fixed-s-28{margin-left:560px}.next-col-offset-fixed-s-29{margin-left:580px}.next-col-offset-fixed-s-30{margin-left:600px}.next-col-offset-fixed-m-1{margin-left:20px}.next-col-offset-fixed-m-2{margin-left:40px}.next-col-offset-fixed-m-3{margin-left:60px}.next-col-offset-fixed-m-4{margin-left:80px}.next-col-offset-fixed-m-5{margin-left:100px}.next-col-offset-fixed-m-6{margin-left:120px}.next-col-offset-fixed-m-7{margin-left:140px}.next-col-offset-fixed-m-8{margin-left:160px}.next-col-offset-fixed-m-9{margin-left:180px}.next-col-offset-fixed-m-10{margin-left:200px}.next-col-offset-fixed-m-11{margin-left:220px}.next-col-offset-fixed-m-12{margin-left:240px}.next-col-offset-fixed-m-13{margin-left:260px}.next-col-offset-fixed-m-14{margin-left:280px}.next-col-offset-fixed-m-15{margin-left:300px}.next-col-offset-fixed-m-16{margin-left:320px}.next-col-offset-fixed-m-17{margin-left:340px}.next-col-offset-fixed-m-18{margin-left:360px}.next-col-offset-fixed-m-19{margin-left:380px}.next-col-offset-fixed-m-20{margin-left:400px}.next-col-offset-fixed-m-21{margin-left:420px}.next-col-offset-fixed-m-22{margin-left:440px}.next-col-offset-fixed-m-23{margin-left:460px}.next-col-offset-fixed-m-24{margin-left:480px}.next-col-offset-fixed-m-25{margin-left:500px}.next-col-offset-fixed-m-26{margin-left:520px}.next-col-offset-fixed-m-27{margin-left:540px}.next-col-offset-fixed-m-28{margin-left:560px}.next-col-offset-fixed-m-29{margin-left:580px}.next-col-offset-fixed-m-30{margin-left:600px}.next-col-offset-fixed-l-1{margin-left:20px}.next-col-offset-fixed-l-2{margin-left:40px}.next-col-offset-fixed-l-3{margin-left:60px}.next-col-offset-fixed-l-4{margin-left:80px}.next-col-offset-fixed-l-5{margin-left:100px}.next-col-offset-fixed-l-6{margin-left:120px}.next-col-offset-fixed-l-7{margin-left:140px}.next-col-offset-fixed-l-8{margin-left:160px}.next-col-offset-fixed-l-9{margin-left:180px}.next-col-offset-fixed-l-10{margin-left:200px}.next-col-offset-fixed-l-11{margin-left:220px}.next-col-offset-fixed-l-12{margin-left:240px}.next-col-offset-fixed-l-13{margin-left:260px}.next-col-offset-fixed-l-14{margin-left:280px}.next-col-offset-fixed-l-15{margin-left:300px}.next-col-offset-fixed-l-16{margin-left:320px}.next-col-offset-fixed-l-17{margin-left:340px}.next-col-offset-fixed-l-18{margin-left:360px}.next-col-offset-fixed-l-19{margin-left:380px}.next-col-offset-fixed-l-20{margin-left:400px}.next-col-offset-fixed-l-21{margin-left:420px}.next-col-offset-fixed-l-22{margin-left:440px}.next-col-offset-fixed-l-23{margin-left:460px}.next-col-offset-fixed-l-24{margin-left:480px}.next-col-offset-fixed-l-25{margin-left:500px}.next-col-offset-fixed-l-26{margin-left:520px}.next-col-offset-fixed-l-27{margin-left:540px}.next-col-offset-fixed-l-28{margin-left:560px}.next-col-offset-fixed-l-29{margin-left:580px}.next-col-offset-fixed-l-30{margin-left:600px}.next-col-offset-fixed-xl-1{margin-left:20px}.next-col-offset-fixed-xl-2{margin-left:40px}.next-col-offset-fixed-xl-3{margin-left:60px}.next-col-offset-fixed-xl-4{margin-left:80px}.next-col-offset-fixed-xl-5{margin-left:100px}.next-col-offset-fixed-xl-6{margin-left:120px}.next-col-offset-fixed-xl-7{margin-left:140px}.next-col-offset-fixed-xl-8{margin-left:160px}.next-col-offset-fixed-xl-9{margin-left:180px}.next-col-offset-fixed-xl-10{margin-left:200px}.next-col-offset-fixed-xl-11{margin-left:220px}.next-col-offset-fixed-xl-12{margin-left:240px}.next-col-offset-fixed-xl-13{margin-left:260px}.next-col-offset-fixed-xl-14{margin-left:280px}.next-col-offset-fixed-xl-15{margin-left:300px}.next-col-offset-fixed-xl-16{margin-left:320px}.next-col-offset-fixed-xl-17{margin-left:340px}.next-col-offset-fixed-xl-18{margin-left:360px}.next-col-offset-fixed-xl-19{margin-left:380px}.next-col-offset-fixed-xl-20{margin-left:400px}.next-col-offset-fixed-xl-21{margin-left:420px}.next-col-offset-fixed-xl-22{margin-left:440px}.next-col-offset-fixed-xl-23{margin-left:460px}.next-col-offset-fixed-xl-24{margin-left:480px}.next-col-offset-fixed-xl-25{margin-left:500px}.next-col-offset-fixed-xl-26{margin-left:520px}.next-col-offset-fixed-xl-27{margin-left:540px}.next-col-offset-fixed-xl-28{margin-left:560px}.next-col-offset-fixed-xl-29{margin-left:580px}.next-col-offset-fixed-xl-30{margin-left:600px}.next-col.next-col-hidden{display:none}@media(min-width:320px)and (max-width:479px){.next-col.next-col-xxs-hidden{display:none}}@media(min-width:480px)and (max-width:719px){.next-col.next-col-xs-hidden{display:none}}@media(min-width:720px)and (max-width:989px){.next-col.next-col-s-hidden{display:none}}@media(min-width:990px)and (max-width:1199px){.next-col.next-col-m-hidden{display:none}}@media(min-width:1200px)and (max-width:1499px){.next-col.next-col-l-hidden{display:none}}@media(min-width:1500px){.next-col.next-col-xl-hidden{display:none}}.next-row.next-row-hidden{display:none}@media(min-width:320px)and (max-width:479px){.next-row.next-row-xxs-hidden{display:none}}@media(min-width:480px)and (max-width:719px){.next-row.next-row-xs-hidden{display:none}}@media(min-width:720px)and (max-width:989px){.next-row.next-row-s-hidden{display:none}}@media(min-width:990px)and (max-width:1199px){.next-row.next-row-m-hidden{display:none}}@media(min-width:1200px)and (max-width:1499px){.next-row.next-row-l-hidden{display:none}}@media(min-width:1500px){.next-row.next-row-xl-hidden{display:none}}.next-col-offset-1[dir=rtl]{margin-right:4.1666666667%;margin-left:auto}.next-col-offset-2[dir=rtl]{margin-right:8.3333333333%;margin-left:auto}.next-col-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-offset-4[dir=rtl]{margin-right:16.6666666667%;margin-left:auto}.next-col-offset-5[dir=rtl]{margin-right:20.8333333333%;margin-left:auto}.next-col-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-offset-7[dir=rtl]{margin-right:29.1666666667%;margin-left:auto}.next-col-offset-8[dir=rtl]{margin-right:33.3333333333%;margin-left:auto}.next-col-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-offset-10[dir=rtl]{margin-right:41.6666666667%;margin-left:auto}.next-col-offset-11[dir=rtl]{margin-right:45.8333333333%;margin-left:auto}.next-col-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-offset-13[dir=rtl]{margin-right:54.1666666667%;margin-left:auto}.next-col-offset-14[dir=rtl]{margin-right:58.3333333333%;margin-left:auto}.next-col-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-offset-16[dir=rtl]{margin-right:66.6666666667%;margin-left:auto}.next-col-offset-17[dir=rtl]{margin-right:70.8333333333%;margin-left:auto}.next-col-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-offset-19[dir=rtl]{margin-right:79.1666666667%;margin-left:auto}.next-col-offset-20[dir=rtl]{margin-right:83.3333333333%;margin-left:auto}.next-col-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-offset-22[dir=rtl]{margin-right:91.6666666667%;margin-left:auto}.next-col-offset-23[dir=rtl]{margin-right:95.8333333333%;margin-left:auto}.next-col-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}@media(min-width:320px){.next-col-xxs-offset-1[dir=rtl]{margin-right:4.1666666667%;margin-left:auto}.next-col-xxs-offset-2[dir=rtl]{margin-right:8.3333333333%;margin-left:auto}.next-col-xxs-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-xxs-offset-4[dir=rtl]{margin-right:16.6666666667%;margin-left:auto}.next-col-xxs-offset-5[dir=rtl]{margin-right:20.8333333333%;margin-left:auto}.next-col-xxs-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-xxs-offset-7[dir=rtl]{margin-right:29.1666666667%;margin-left:auto}.next-col-xxs-offset-8[dir=rtl]{margin-right:33.3333333333%;margin-left:auto}.next-col-xxs-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-xxs-offset-10[dir=rtl]{margin-right:41.6666666667%;margin-left:auto}.next-col-xxs-offset-11[dir=rtl]{margin-right:45.8333333333%;margin-left:auto}.next-col-xxs-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-xxs-offset-13[dir=rtl]{margin-right:54.1666666667%;margin-left:auto}.next-col-xxs-offset-14[dir=rtl]{margin-right:58.3333333333%;margin-left:auto}.next-col-xxs-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-xxs-offset-16[dir=rtl]{margin-right:66.6666666667%;margin-left:auto}.next-col-xxs-offset-17[dir=rtl]{margin-right:70.8333333333%;margin-left:auto}.next-col-xxs-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-xxs-offset-19[dir=rtl]{margin-right:79.1666666667%;margin-left:auto}.next-col-xxs-offset-20[dir=rtl]{margin-right:83.3333333333%;margin-left:auto}.next-col-xxs-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-xxs-offset-22[dir=rtl]{margin-right:91.6666666667%;margin-left:auto}.next-col-xxs-offset-23[dir=rtl]{margin-right:95.8333333333%;margin-left:auto}.next-col-xxs-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}}@media(min-width:480px){.next-col-xs-offset-1[dir=rtl]{margin-right:4.1666666667%;margin-left:auto}.next-col-xs-offset-2[dir=rtl]{margin-right:8.3333333333%;margin-left:auto}.next-col-xs-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-xs-offset-4[dir=rtl]{margin-right:16.6666666667%;margin-left:auto}.next-col-xs-offset-5[dir=rtl]{margin-right:20.8333333333%;margin-left:auto}.next-col-xs-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-xs-offset-7[dir=rtl]{margin-right:29.1666666667%;margin-left:auto}.next-col-xs-offset-8[dir=rtl]{margin-right:33.3333333333%;margin-left:auto}.next-col-xs-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-xs-offset-10[dir=rtl]{margin-right:41.6666666667%;margin-left:auto}.next-col-xs-offset-11[dir=rtl]{margin-right:45.8333333333%;margin-left:auto}.next-col-xs-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-xs-offset-13[dir=rtl]{margin-right:54.1666666667%;margin-left:auto}.next-col-xs-offset-14[dir=rtl]{margin-right:58.3333333333%;margin-left:auto}.next-col-xs-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-xs-offset-16[dir=rtl]{margin-right:66.6666666667%;margin-left:auto}.next-col-xs-offset-17[dir=rtl]{margin-right:70.8333333333%;margin-left:auto}.next-col-xs-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-xs-offset-19[dir=rtl]{margin-right:79.1666666667%;margin-left:auto}.next-col-xs-offset-20[dir=rtl]{margin-right:83.3333333333%;margin-left:auto}.next-col-xs-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-xs-offset-22[dir=rtl]{margin-right:91.6666666667%;margin-left:auto}.next-col-xs-offset-23[dir=rtl]{margin-right:95.8333333333%;margin-left:auto}.next-col-xs-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}}@media(min-width:720px){.next-col-s-offset-1[dir=rtl]{margin-right:4.1666666667%;margin-left:auto}.next-col-s-offset-2[dir=rtl]{margin-right:8.3333333333%;margin-left:auto}.next-col-s-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-s-offset-4[dir=rtl]{margin-right:16.6666666667%;margin-left:auto}.next-col-s-offset-5[dir=rtl]{margin-right:20.8333333333%;margin-left:auto}.next-col-s-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-s-offset-7[dir=rtl]{margin-right:29.1666666667%;margin-left:auto}.next-col-s-offset-8[dir=rtl]{margin-right:33.3333333333%;margin-left:auto}.next-col-s-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-s-offset-10[dir=rtl]{margin-right:41.6666666667%;margin-left:auto}.next-col-s-offset-11[dir=rtl]{margin-right:45.8333333333%;margin-left:auto}.next-col-s-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-s-offset-13[dir=rtl]{margin-right:54.1666666667%;margin-left:auto}.next-col-s-offset-14[dir=rtl]{margin-right:58.3333333333%;margin-left:auto}.next-col-s-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-s-offset-16[dir=rtl]{margin-right:66.6666666667%;margin-left:auto}.next-col-s-offset-17[dir=rtl]{margin-right:70.8333333333%;margin-left:auto}.next-col-s-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-s-offset-19[dir=rtl]{margin-right:79.1666666667%;margin-left:auto}.next-col-s-offset-20[dir=rtl]{margin-right:83.3333333333%;margin-left:auto}.next-col-s-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-s-offset-22[dir=rtl]{margin-right:91.6666666667%;margin-left:auto}.next-col-s-offset-23[dir=rtl]{margin-right:95.8333333333%;margin-left:auto}.next-col-s-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}}@media(min-width:990px){.next-col-m-offset-1[dir=rtl]{margin-right:4.1666666667%;margin-left:auto}.next-col-m-offset-2[dir=rtl]{margin-right:8.3333333333%;margin-left:auto}.next-col-m-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-m-offset-4[dir=rtl]{margin-right:16.6666666667%;margin-left:auto}.next-col-m-offset-5[dir=rtl]{margin-right:20.8333333333%;margin-left:auto}.next-col-m-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-m-offset-7[dir=rtl]{margin-right:29.1666666667%;margin-left:auto}.next-col-m-offset-8[dir=rtl]{margin-right:33.3333333333%;margin-left:auto}.next-col-m-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-m-offset-10[dir=rtl]{margin-right:41.6666666667%;margin-left:auto}.next-col-m-offset-11[dir=rtl]{margin-right:45.8333333333%;margin-left:auto}.next-col-m-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-m-offset-13[dir=rtl]{margin-right:54.1666666667%;margin-left:auto}.next-col-m-offset-14[dir=rtl]{margin-right:58.3333333333%;margin-left:auto}.next-col-m-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-m-offset-16[dir=rtl]{margin-right:66.6666666667%;margin-left:auto}.next-col-m-offset-17[dir=rtl]{margin-right:70.8333333333%;margin-left:auto}.next-col-m-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-m-offset-19[dir=rtl]{margin-right:79.1666666667%;margin-left:auto}.next-col-m-offset-20[dir=rtl]{margin-right:83.3333333333%;margin-left:auto}.next-col-m-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-m-offset-22[dir=rtl]{margin-right:91.6666666667%;margin-left:auto}.next-col-m-offset-23[dir=rtl]{margin-right:95.8333333333%;margin-left:auto}.next-col-m-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}}@media(min-width:1200px){.next-col-l-offset-1[dir=rtl]{margin-right:4.1666666667%;margin-left:auto}.next-col-l-offset-2[dir=rtl]{margin-right:8.3333333333%;margin-left:auto}.next-col-l-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-l-offset-4[dir=rtl]{margin-right:16.6666666667%;margin-left:auto}.next-col-l-offset-5[dir=rtl]{margin-right:20.8333333333%;margin-left:auto}.next-col-l-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-l-offset-7[dir=rtl]{margin-right:29.1666666667%;margin-left:auto}.next-col-l-offset-8[dir=rtl]{margin-right:33.3333333333%;margin-left:auto}.next-col-l-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-l-offset-10[dir=rtl]{margin-right:41.6666666667%;margin-left:auto}.next-col-l-offset-11[dir=rtl]{margin-right:45.8333333333%;margin-left:auto}.next-col-l-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-l-offset-13[dir=rtl]{margin-right:54.1666666667%;margin-left:auto}.next-col-l-offset-14[dir=rtl]{margin-right:58.3333333333%;margin-left:auto}.next-col-l-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-l-offset-16[dir=rtl]{margin-right:66.6666666667%;margin-left:auto}.next-col-l-offset-17[dir=rtl]{margin-right:70.8333333333%;margin-left:auto}.next-col-l-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-l-offset-19[dir=rtl]{margin-right:79.1666666667%;margin-left:auto}.next-col-l-offset-20[dir=rtl]{margin-right:83.3333333333%;margin-left:auto}.next-col-l-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-l-offset-22[dir=rtl]{margin-right:91.6666666667%;margin-left:auto}.next-col-l-offset-23[dir=rtl]{margin-right:95.8333333333%;margin-left:auto}.next-col-l-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}}@media(min-width:1500px){.next-col-xl-offset-1[dir=rtl]{margin-right:4.1666666667%;margin-left:auto}.next-col-xl-offset-2[dir=rtl]{margin-right:8.3333333333%;margin-left:auto}.next-col-xl-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-xl-offset-4[dir=rtl]{margin-right:16.6666666667%;margin-left:auto}.next-col-xl-offset-5[dir=rtl]{margin-right:20.8333333333%;margin-left:auto}.next-col-xl-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-xl-offset-7[dir=rtl]{margin-right:29.1666666667%;margin-left:auto}.next-col-xl-offset-8[dir=rtl]{margin-right:33.3333333333%;margin-left:auto}.next-col-xl-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-xl-offset-10[dir=rtl]{margin-right:41.6666666667%;margin-left:auto}.next-col-xl-offset-11[dir=rtl]{margin-right:45.8333333333%;margin-left:auto}.next-col-xl-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-xl-offset-13[dir=rtl]{margin-right:54.1666666667%;margin-left:auto}.next-col-xl-offset-14[dir=rtl]{margin-right:58.3333333333%;margin-left:auto}.next-col-xl-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-xl-offset-16[dir=rtl]{margin-right:66.6666666667%;margin-left:auto}.next-col-xl-offset-17[dir=rtl]{margin-right:70.8333333333%;margin-left:auto}.next-col-xl-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-xl-offset-19[dir=rtl]{margin-right:79.1666666667%;margin-left:auto}.next-col-xl-offset-20[dir=rtl]{margin-right:83.3333333333%;margin-left:auto}.next-col-xl-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-xl-offset-22[dir=rtl]{margin-right:91.6666666667%;margin-left:auto}.next-col-xl-offset-23[dir=rtl]{margin-right:95.8333333333%;margin-left:auto}.next-col-xl-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}}.next-col-offset-fixed-1[dir=rtl]{margin-right:20px;margin-left:auto}.next-col-offset-fixed-2[dir=rtl]{margin-right:40px;margin-left:auto}.next-col-offset-fixed-3[dir=rtl]{margin-right:60px;margin-left:auto}.next-col-offset-fixed-4[dir=rtl]{margin-right:80px;margin-left:auto}.next-col-offset-fixed-5[dir=rtl]{margin-right:100px;margin-left:auto}.next-col-offset-fixed-6[dir=rtl]{margin-right:120px;margin-left:auto}.next-col-offset-fixed-7[dir=rtl]{margin-right:140px;margin-left:auto}.next-col-offset-fixed-8[dir=rtl]{margin-right:160px;margin-left:auto}.next-col-offset-fixed-9[dir=rtl]{margin-right:180px;margin-left:auto}.next-col-offset-fixed-10[dir=rtl]{margin-right:200px;margin-left:auto}.next-col-offset-fixed-11[dir=rtl]{margin-right:220px;margin-left:auto}.next-col-offset-fixed-12[dir=rtl]{margin-right:240px;margin-left:auto}.next-col-offset-fixed-13[dir=rtl]{margin-right:260px;margin-left:auto}.next-col-offset-fixed-14[dir=rtl]{margin-right:280px;margin-left:auto}.next-col-offset-fixed-15[dir=rtl]{margin-right:300px;margin-left:auto}.next-col-offset-fixed-16[dir=rtl]{margin-right:320px;margin-left:auto}.next-col-offset-fixed-17[dir=rtl]{margin-right:340px;margin-left:auto}.next-col-offset-fixed-18[dir=rtl]{margin-right:360px;margin-left:auto}.next-col-offset-fixed-19[dir=rtl]{margin-right:380px;margin-left:auto}.next-col-offset-fixed-20[dir=rtl]{margin-right:400px;margin-left:auto}.next-col-offset-fixed-21[dir=rtl]{margin-right:420px;margin-left:auto}.next-col-offset-fixed-22[dir=rtl]{margin-right:440px;margin-left:auto}.next-col-offset-fixed-23[dir=rtl]{margin-right:460px;margin-left:auto}.next-col-offset-fixed-24[dir=rtl]{margin-right:480px;margin-left:auto}.next-col-offset-fixed-25[dir=rtl]{margin-right:500px;margin-left:auto}.next-col-offset-fixed-26[dir=rtl]{margin-right:520px;margin-left:auto}.next-col-offset-fixed-27[dir=rtl]{margin-right:540px;margin-left:auto}.next-col-offset-fixed-28[dir=rtl]{margin-right:560px;margin-left:auto}.next-col-offset-fixed-29[dir=rtl]{margin-right:580px;margin-left:auto}.next-col-offset-fixed-30[dir=rtl]{margin-right:600px;margin-left:auto}.next-col-offset-fixed-xxs-1[dir=rtl]{margin-right:20px;margin-left:auto}.next-col-offset-fixed-xxs-2[dir=rtl]{margin-right:40px;margin-left:auto}.next-col-offset-fixed-xxs-3[dir=rtl]{margin-right:60px;margin-left:auto}.next-col-offset-fixed-xxs-4[dir=rtl]{margin-right:80px;margin-left:auto}.next-col-offset-fixed-xxs-5[dir=rtl]{margin-right:100px;margin-left:auto}.next-col-offset-fixed-xxs-6[dir=rtl]{margin-right:120px;margin-left:auto}.next-col-offset-fixed-xxs-7[dir=rtl]{margin-right:140px;margin-left:auto}.next-col-offset-fixed-xxs-8[dir=rtl]{margin-right:160px;margin-left:auto}.next-col-offset-fixed-xxs-9[dir=rtl]{margin-right:180px;margin-left:auto}.next-col-offset-fixed-xxs-10[dir=rtl]{margin-right:200px;margin-left:auto}.next-col-offset-fixed-xxs-11[dir=rtl]{margin-right:220px;margin-left:auto}.next-col-offset-fixed-xxs-12[dir=rtl]{margin-right:240px;margin-left:auto}.next-col-offset-fixed-xxs-13[dir=rtl]{margin-right:260px;margin-left:auto}.next-col-offset-fixed-xxs-14[dir=rtl]{margin-right:280px;margin-left:auto}.next-col-offset-fixed-xxs-15[dir=rtl]{margin-right:300px;margin-left:auto}.next-col-offset-fixed-xxs-16[dir=rtl]{margin-right:320px;margin-left:auto}.next-col-offset-fixed-xxs-17[dir=rtl]{margin-right:340px;margin-left:auto}.next-col-offset-fixed-xxs-18[dir=rtl]{margin-right:360px;margin-left:auto}.next-col-offset-fixed-xxs-19[dir=rtl]{margin-right:380px;margin-left:auto}.next-col-offset-fixed-xxs-20[dir=rtl]{margin-right:400px;margin-left:auto}.next-col-offset-fixed-xxs-21[dir=rtl]{margin-right:420px;margin-left:auto}.next-col-offset-fixed-xxs-22[dir=rtl]{margin-right:440px;margin-left:auto}.next-col-offset-fixed-xxs-23[dir=rtl]{margin-right:460px;margin-left:auto}.next-col-offset-fixed-xxs-24[dir=rtl]{margin-right:480px;margin-left:auto}.next-col-offset-fixed-xxs-25[dir=rtl]{margin-right:500px;margin-left:auto}.next-col-offset-fixed-xxs-26[dir=rtl]{margin-right:520px;margin-left:auto}.next-col-offset-fixed-xxs-27[dir=rtl]{margin-right:540px;margin-left:auto}.next-col-offset-fixed-xxs-28[dir=rtl]{margin-right:560px;margin-left:auto}.next-col-offset-fixed-xxs-29[dir=rtl]{margin-right:580px;margin-left:auto}.next-col-offset-fixed-xxs-30[dir=rtl]{margin-right:600px;margin-left:auto}.next-col-offset-fixed-xs-1[dir=rtl]{margin-right:20px;margin-left:auto}.next-col-offset-fixed-xs-2[dir=rtl]{margin-right:40px;margin-left:auto}.next-col-offset-fixed-xs-3[dir=rtl]{margin-right:60px;margin-left:auto}.next-col-offset-fixed-xs-4[dir=rtl]{margin-right:80px;margin-left:auto}.next-col-offset-fixed-xs-5[dir=rtl]{margin-right:100px;margin-left:auto}.next-col-offset-fixed-xs-6[dir=rtl]{margin-right:120px;margin-left:auto}.next-col-offset-fixed-xs-7[dir=rtl]{margin-right:140px;margin-left:auto}.next-col-offset-fixed-xs-8[dir=rtl]{margin-right:160px;margin-left:auto}.next-col-offset-fixed-xs-9[dir=rtl]{margin-right:180px;margin-left:auto}.next-col-offset-fixed-xs-10[dir=rtl]{margin-right:200px;margin-left:auto}.next-col-offset-fixed-xs-11[dir=rtl]{margin-right:220px;margin-left:auto}.next-col-offset-fixed-xs-12[dir=rtl]{margin-right:240px;margin-left:auto}.next-col-offset-fixed-xs-13[dir=rtl]{margin-right:260px;margin-left:auto}.next-col-offset-fixed-xs-14[dir=rtl]{margin-right:280px;margin-left:auto}.next-col-offset-fixed-xs-15[dir=rtl]{margin-right:300px;margin-left:auto}.next-col-offset-fixed-xs-16[dir=rtl]{margin-right:320px;margin-left:auto}.next-col-offset-fixed-xs-17[dir=rtl]{margin-right:340px;margin-left:auto}.next-col-offset-fixed-xs-18[dir=rtl]{margin-right:360px;margin-left:auto}.next-col-offset-fixed-xs-19[dir=rtl]{margin-right:380px;margin-left:auto}.next-col-offset-fixed-xs-20[dir=rtl]{margin-right:400px;margin-left:auto}.next-col-offset-fixed-xs-21[dir=rtl]{margin-right:420px;margin-left:auto}.next-col-offset-fixed-xs-22[dir=rtl]{margin-right:440px;margin-left:auto}.next-col-offset-fixed-xs-23[dir=rtl]{margin-right:460px;margin-left:auto}.next-col-offset-fixed-xs-24[dir=rtl]{margin-right:480px;margin-left:auto}.next-col-offset-fixed-xs-25[dir=rtl]{margin-right:500px;margin-left:auto}.next-col-offset-fixed-xs-26[dir=rtl]{margin-right:520px;margin-left:auto}.next-col-offset-fixed-xs-27[dir=rtl]{margin-right:540px;margin-left:auto}.next-col-offset-fixed-xs-28[dir=rtl]{margin-right:560px;margin-left:auto}.next-col-offset-fixed-xs-29[dir=rtl]{margin-right:580px;margin-left:auto}.next-col-offset-fixed-xs-30[dir=rtl]{margin-right:600px;margin-left:auto}.next-col-offset-fixed-s-1[dir=rtl]{margin-right:20px;margin-left:auto}.next-col-offset-fixed-s-2[dir=rtl]{margin-right:40px;margin-left:auto}.next-col-offset-fixed-s-3[dir=rtl]{margin-right:60px;margin-left:auto}.next-col-offset-fixed-s-4[dir=rtl]{margin-right:80px;margin-left:auto}.next-col-offset-fixed-s-5[dir=rtl]{margin-right:100px;margin-left:auto}.next-col-offset-fixed-s-6[dir=rtl]{margin-right:120px;margin-left:auto}.next-col-offset-fixed-s-7[dir=rtl]{margin-right:140px;margin-left:auto}.next-col-offset-fixed-s-8[dir=rtl]{margin-right:160px;margin-left:auto}.next-col-offset-fixed-s-9[dir=rtl]{margin-right:180px;margin-left:auto}.next-col-offset-fixed-s-10[dir=rtl]{margin-right:200px;margin-left:auto}.next-col-offset-fixed-s-11[dir=rtl]{margin-right:220px;margin-left:auto}.next-col-offset-fixed-s-12[dir=rtl]{margin-right:240px;margin-left:auto}.next-col-offset-fixed-s-13[dir=rtl]{margin-right:260px;margin-left:auto}.next-col-offset-fixed-s-14[dir=rtl]{margin-right:280px;margin-left:auto}.next-col-offset-fixed-s-15[dir=rtl]{margin-right:300px;margin-left:auto}.next-col-offset-fixed-s-16[dir=rtl]{margin-right:320px;margin-left:auto}.next-col-offset-fixed-s-17[dir=rtl]{margin-right:340px;margin-left:auto}.next-col-offset-fixed-s-18[dir=rtl]{margin-right:360px;margin-left:auto}.next-col-offset-fixed-s-19[dir=rtl]{margin-right:380px;margin-left:auto}.next-col-offset-fixed-s-20[dir=rtl]{margin-right:400px;margin-left:auto}.next-col-offset-fixed-s-21[dir=rtl]{margin-right:420px;margin-left:auto}.next-col-offset-fixed-s-22[dir=rtl]{margin-right:440px;margin-left:auto}.next-col-offset-fixed-s-23[dir=rtl]{margin-right:460px;margin-left:auto}.next-col-offset-fixed-s-24[dir=rtl]{margin-right:480px;margin-left:auto}.next-col-offset-fixed-s-25[dir=rtl]{margin-right:500px;margin-left:auto}.next-col-offset-fixed-s-26[dir=rtl]{margin-right:520px;margin-left:auto}.next-col-offset-fixed-s-27[dir=rtl]{margin-right:540px;margin-left:auto}.next-col-offset-fixed-s-28[dir=rtl]{margin-right:560px;margin-left:auto}.next-col-offset-fixed-s-29[dir=rtl]{margin-right:580px;margin-left:auto}.next-col-offset-fixed-s-30[dir=rtl]{margin-right:600px;margin-left:auto}.next-col-offset-fixed-m-1[dir=rtl]{margin-right:20px;margin-left:auto}.next-col-offset-fixed-m-2[dir=rtl]{margin-right:40px;margin-left:auto}.next-col-offset-fixed-m-3[dir=rtl]{margin-right:60px;margin-left:auto}.next-col-offset-fixed-m-4[dir=rtl]{margin-right:80px;margin-left:auto}.next-col-offset-fixed-m-5[dir=rtl]{margin-right:100px;margin-left:auto}.next-col-offset-fixed-m-6[dir=rtl]{margin-right:120px;margin-left:auto}.next-col-offset-fixed-m-7[dir=rtl]{margin-right:140px;margin-left:auto}.next-col-offset-fixed-m-8[dir=rtl]{margin-right:160px;margin-left:auto}.next-col-offset-fixed-m-9[dir=rtl]{margin-right:180px;margin-left:auto}.next-col-offset-fixed-m-10[dir=rtl]{margin-right:200px;margin-left:auto}.next-col-offset-fixed-m-11[dir=rtl]{margin-right:220px;margin-left:auto}.next-col-offset-fixed-m-12[dir=rtl]{margin-right:240px;margin-left:auto}.next-col-offset-fixed-m-13[dir=rtl]{margin-right:260px;margin-left:auto}.next-col-offset-fixed-m-14[dir=rtl]{margin-right:280px;margin-left:auto}.next-col-offset-fixed-m-15[dir=rtl]{margin-right:300px;margin-left:auto}.next-col-offset-fixed-m-16[dir=rtl]{margin-right:320px;margin-left:auto}.next-col-offset-fixed-m-17[dir=rtl]{margin-right:340px;margin-left:auto}.next-col-offset-fixed-m-18[dir=rtl]{margin-right:360px;margin-left:auto}.next-col-offset-fixed-m-19[dir=rtl]{margin-right:380px;margin-left:auto}.next-col-offset-fixed-m-20[dir=rtl]{margin-right:400px;margin-left:auto}.next-col-offset-fixed-m-21[dir=rtl]{margin-right:420px;margin-left:auto}.next-col-offset-fixed-m-22[dir=rtl]{margin-right:440px;margin-left:auto}.next-col-offset-fixed-m-23[dir=rtl]{margin-right:460px;margin-left:auto}.next-col-offset-fixed-m-24[dir=rtl]{margin-right:480px;margin-left:auto}.next-col-offset-fixed-m-25[dir=rtl]{margin-right:500px;margin-left:auto}.next-col-offset-fixed-m-26[dir=rtl]{margin-right:520px;margin-left:auto}.next-col-offset-fixed-m-27[dir=rtl]{margin-right:540px;margin-left:auto}.next-col-offset-fixed-m-28[dir=rtl]{margin-right:560px;margin-left:auto}.next-col-offset-fixed-m-29[dir=rtl]{margin-right:580px;margin-left:auto}.next-col-offset-fixed-m-30[dir=rtl]{margin-right:600px;margin-left:auto}.next-col-offset-fixed-l-1[dir=rtl]{margin-right:20px;margin-left:auto}.next-col-offset-fixed-l-2[dir=rtl]{margin-right:40px;margin-left:auto}.next-col-offset-fixed-l-3[dir=rtl]{margin-right:60px;margin-left:auto}.next-col-offset-fixed-l-4[dir=rtl]{margin-right:80px;margin-left:auto}.next-col-offset-fixed-l-5[dir=rtl]{margin-right:100px;margin-left:auto}.next-col-offset-fixed-l-6[dir=rtl]{margin-right:120px;margin-left:auto}.next-col-offset-fixed-l-7[dir=rtl]{margin-right:140px;margin-left:auto}.next-col-offset-fixed-l-8[dir=rtl]{margin-right:160px;margin-left:auto}.next-col-offset-fixed-l-9[dir=rtl]{margin-right:180px;margin-left:auto}.next-col-offset-fixed-l-10[dir=rtl]{margin-right:200px;margin-left:auto}.next-col-offset-fixed-l-11[dir=rtl]{margin-right:220px;margin-left:auto}.next-col-offset-fixed-l-12[dir=rtl]{margin-right:240px;margin-left:auto}.next-col-offset-fixed-l-13[dir=rtl]{margin-right:260px;margin-left:auto}.next-col-offset-fixed-l-14[dir=rtl]{margin-right:280px;margin-left:auto}.next-col-offset-fixed-l-15[dir=rtl]{margin-right:300px;margin-left:auto}.next-col-offset-fixed-l-16[dir=rtl]{margin-right:320px;margin-left:auto}.next-col-offset-fixed-l-17[dir=rtl]{margin-right:340px;margin-left:auto}.next-col-offset-fixed-l-18[dir=rtl]{margin-right:360px;margin-left:auto}.next-col-offset-fixed-l-19[dir=rtl]{margin-right:380px;margin-left:auto}.next-col-offset-fixed-l-20[dir=rtl]{margin-right:400px;margin-left:auto}.next-col-offset-fixed-l-21[dir=rtl]{margin-right:420px;margin-left:auto}.next-col-offset-fixed-l-22[dir=rtl]{margin-right:440px;margin-left:auto}.next-col-offset-fixed-l-23[dir=rtl]{margin-right:460px;margin-left:auto}.next-col-offset-fixed-l-24[dir=rtl]{margin-right:480px;margin-left:auto}.next-col-offset-fixed-l-25[dir=rtl]{margin-right:500px;margin-left:auto}.next-col-offset-fixed-l-26[dir=rtl]{margin-right:520px;margin-left:auto}.next-col-offset-fixed-l-27[dir=rtl]{margin-right:540px;margin-left:auto}.next-col-offset-fixed-l-28[dir=rtl]{margin-right:560px;margin-left:auto}.next-col-offset-fixed-l-29[dir=rtl]{margin-right:580px;margin-left:auto}.next-col-offset-fixed-l-30[dir=rtl]{margin-right:600px;margin-left:auto}.next-col-offset-fixed-xl-1[dir=rtl]{margin-right:20px;margin-left:auto}.next-col-offset-fixed-xl-2[dir=rtl]{margin-right:40px;margin-left:auto}.next-col-offset-fixed-xl-3[dir=rtl]{margin-right:60px;margin-left:auto}.next-col-offset-fixed-xl-4[dir=rtl]{margin-right:80px;margin-left:auto}.next-col-offset-fixed-xl-5[dir=rtl]{margin-right:100px;margin-left:auto}.next-col-offset-fixed-xl-6[dir=rtl]{margin-right:120px;margin-left:auto}.next-col-offset-fixed-xl-7[dir=rtl]{margin-right:140px;margin-left:auto}.next-col-offset-fixed-xl-8[dir=rtl]{margin-right:160px;margin-left:auto}.next-col-offset-fixed-xl-9[dir=rtl]{margin-right:180px;margin-left:auto}.next-col-offset-fixed-xl-10[dir=rtl]{margin-right:200px;margin-left:auto}.next-col-offset-fixed-xl-11[dir=rtl]{margin-right:220px;margin-left:auto}.next-col-offset-fixed-xl-12[dir=rtl]{margin-right:240px;margin-left:auto}.next-col-offset-fixed-xl-13[dir=rtl]{margin-right:260px;margin-left:auto}.next-col-offset-fixed-xl-14[dir=rtl]{margin-right:280px;margin-left:auto}.next-col-offset-fixed-xl-15[dir=rtl]{margin-right:300px;margin-left:auto}.next-col-offset-fixed-xl-16[dir=rtl]{margin-right:320px;margin-left:auto}.next-col-offset-fixed-xl-17[dir=rtl]{margin-right:340px;margin-left:auto}.next-col-offset-fixed-xl-18[dir=rtl]{margin-right:360px;margin-left:auto}.next-col-offset-fixed-xl-19[dir=rtl]{margin-right:380px;margin-left:auto}.next-col-offset-fixed-xl-20[dir=rtl]{margin-right:400px;margin-left:auto}.next-col-offset-fixed-xl-21[dir=rtl]{margin-right:420px;margin-left:auto}.next-col-offset-fixed-xl-22[dir=rtl]{margin-right:440px;margin-left:auto}.next-col-offset-fixed-xl-23[dir=rtl]{margin-right:460px;margin-left:auto}.next-col-offset-fixed-xl-24[dir=rtl]{margin-right:480px;margin-left:auto}.next-col-offset-fixed-xl-25[dir=rtl]{margin-right:500px;margin-left:auto}.next-col-offset-fixed-xl-26[dir=rtl]{margin-right:520px;margin-left:auto}.next-col-offset-fixed-xl-27[dir=rtl]{margin-right:540px;margin-left:auto}.next-col-offset-fixed-xl-28[dir=rtl]{margin-right:560px;margin-left:auto}.next-col-offset-fixed-xl-29[dir=rtl]{margin-right:580px;margin-left:auto}.next-col-offset-fixed-xl-30[dir=rtl]{margin-right:600px;margin-left:auto}.next-responsive-grid{box-sizing:border-box;display:grid}.next-responsive-grid *,.next-responsive-grid :after,.next-responsive-grid :before{box-sizing:border-box}.next-responsive-grid-ie{display:block}.next-form,.next-form *,.next-form :after,.next-form :before{box-sizing:border-box}.next-form-preview.next-form-item .next-form-item-label{color:#666}.next-form-preview.next-form-item .next-form-preview{color:#333}.next-form-preview.next-form-item.next-medium .next-form-item-label{font-size:14px;line-height:28px}.next-form-preview.next-form-item.next-small .next-form-item-label{font-size:12px;line-height:20px}.next-form-preview.next-form-item.next-large .next-form-item-label{font-size:16px;line-height:40px}.next-form-responsive-grid .next-form-item-control{flex:1}.next-form-responsive-grid .next-form-item{margin-bottom:0}.next-form-responsive-grid .next-form-item.next-left{display:flex}.next-form-responsive-grid.next-small .next-responsive-grid{gap:16px}.next-form-responsive-grid.next-small .next-form-item.next-left .next-form-item-label{line-height:1.4;margin-top:6px;margin-bottom:6px}.next-form-responsive-grid.next-medium .next-responsive-grid{gap:20px}.next-form-responsive-grid.next-medium .next-form-item.next-left .next-form-item-label{line-height:1.4;margin-top:9px;margin-bottom:9px}.next-form-responsive-grid.next-large .next-responsive-grid{gap:24px}.next-form-responsive-grid.next-large .next-form-item.next-left .next-form-item-label{line-height:1.4;margin-top:12px;margin-bottom:12px}.next-form-item{margin-bottom:16px}.next-form-item.has-error>.next-form-item-control>.next-form-item-help{color:#d23c26}.next-form-item.has-warning>.next-form-item-control>.next-form-item-help{color:#f1c826}.next-form-item .next-form-item-label,.next-form-item .next-form-text-align,.next-form-item p{line-height:32px}.next-form-item .next-form-text-align,.next-form-item p{margin:0}.next-form-item .next-checkbox-group,.next-form-item .next-checkbox-wrapper,.next-form-item .next-radio-group,.next-form-item .next-radio-wrapper,.next-form-item .next-rating{line-height:28px}.next-form-item .next-form-preview{font-size:14px;line-height:28px}.next-form-item .next-form-preview.next-input-textarea>p{font-size:14px;text-align:justify;min-height:19.6px;line-height:1.4;margin-top:4.2px}.next-form-item .next-form-item-label{font-size:14px}.next-form-item .next-form-item-label>label{display:inline-block;line-height:1.5}.next-form-item.next-large{margin-bottom:20px}.next-form-item.next-large .next-form-item-label,.next-form-item.next-large .next-form-text-align,.next-form-item.next-large p{line-height:40px}.next-form-item.next-large .next-checkbox-group,.next-form-item.next-large .next-checkbox-wrapper,.next-form-item.next-large .next-radio-group,.next-form-item.next-large .next-radio-wrapper,.next-form-item.next-large .next-rating{line-height:39px}.next-form-item.next-large .next-form-preview{font-size:16px;line-height:40px}.next-form-item.next-large .next-form-preview.next-input-textarea>p{font-size:16px;text-align:justify;min-height:22.4px;line-height:1.4;margin-top:8.8px}.next-form-item.next-large .next-switch{margin-top:7px}.next-form-item.next-large .next-form-item-label{font-size:16px}.next-form-item.next-small{margin-bottom:12px}.next-form-item.next-small .next-checkbox-group,.next-form-item.next-small .next-checkbox-wrapper,.next-form-item.next-small .next-form-item-label,.next-form-item.next-small .next-form-text-align,.next-form-item.next-small .next-radio-group,.next-form-item.next-small .next-radio-wrapper,.next-form-item.next-small .next-rating,.next-form-item.next-small p{line-height:24px}.next-form-item.next-small .next-form-preview{font-size:12px;line-height:20px}.next-form-item.next-small .next-form-preview.next-input-textarea>p{font-size:12px;text-align:justify;min-height:16.8px;line-height:1.4;margin-top:1.6px}.next-form-item.next-small .next-form-item-label{font-size:12px}.next-form-item.next-top>.next-form-item-label{margin-bottom:2px}.next-form-item.next-inset .next-form-item-label{padding-right:0;padding-left:0;line-height:inherit}.next-form-item-control .next-form-text-align{margin:0}.next-form-item-control>.next-input,.next-form-item-control>.next-input-group,.next-form-item-fullwidth .next-form-item-control>.next-date-picker,.next-form-item-fullwidth .next-form-item-control>.next-input,.next-form-item-fullwidth .next-form-item-control>.next-input-group,.next-form-item-fullwidth .next-form-item-control>.next-month-picker,.next-form-item-fullwidth .next-form-item-control>.next-range-picker,.next-form-item-fullwidth .next-form-item-control>.next-select,.next-form-item-fullwidth .next-form-item-control>.next-time-picker,.next-form-item-fullwidth .next-form-item-control>.next-year-picker{width:100%}.next-form-item-fullwidth .next-form-item-control>.next-date-picker2 .next-date-picker2-input input{width:inherit}.next-form-item-label{display:inline-block;vertical-align:top;color:#666;text-align:right;padding-right:12px}.next-form-item-label label[required]:before{margin-right:4px;content:"*";color:#d23c26}.next-form-item-label.has-colon label:after{content:":";position:relative;top:-.5px;margin:0 0 0 2px}.next-form-item-label.next-left{text-align:left}.next-form-item-label.next-left>label[required]:before{display:none}.next-form-item-label.next-left>label[required]:after{margin-left:4px;content:"*";color:#d23c26}.next-form-item-help{margin-top:4px;font-size:12px;line-height:1.5;color:#999}.next-form.next-inline .next-form-item{display:inline-block;vertical-align:top}.next-form.next-inline .next-form-item.next-left .next-form-item-control{display:inline-block;vertical-align:top;line-height:0}.next-form.next-inline .next-form-item:not(:last-child){margin-right:20px}.next-form.next-inline .next-form-item.next-large:not(:last-child){margin-right:24px}.next-form.next-inline .next-form-item.next-small:not(:last-child){margin-right:16px}@media screen and (min-width:0\0)and (min-resolution:0.001dpcm){.next-form-item.next-left>.next-form-item-label,.next-form.next-inline .next-form-item.next-left .next-form-item-control{display:table-cell}}.next-form[dir=rtl] .next-form-item-label{text-align:left;padding-left:12px;padding-right:0}.next-form[dir=rtl].next-inline .next-form-item:not(:last-child){margin-left:20px;margin-right:0}.next-form[dir=rtl].next-inline .next-form-item.next-large:not(:last-child){margin-left:24px;margin-right:0}.next-form[dir=rtl].next-inline .next-form-item.next-small:not(:last-child){margin-left:16px;margin-right:0}.next-avatar{position:relative;display:inline-block;overflow:hidden;color:#fff;white-space:nowrap;text-align:center;vertical-align:middle;background:#f2f2f2;width:40px;height:40px;line-height:40px;border-radius:50%}.next-avatar-image{background:transparent}.next-avatar-string{position:absolute;left:50%;transform-origin:0 center}.next-avatar-large{width:52px;height:52px;line-height:52px;border-radius:50%}.next-avatar-large-string{position:absolute;left:50%;transform-origin:0 center}.next-avatar-small{width:28px;height:28px;line-height:28px;border-radius:50%}.next-avatar-small-string{position:absolute;left:50%;transform-origin:0 center}.next-avatar-square{border-radius:3px}.next-avatar>img{display:block;width:100%;height:100%;object-fit:cover}.next-select{display:inline-block;position:relative;font-size:0;vertical-align:middle}.next-select,.next-select *,.next-select :after,.next-select :before{box-sizing:border-box}.next-select-trigger{min-width:100px;outline:0;transition:all .1s linear}.next-select-trigger .next-input-label{flex:0 0 auto;width:auto}.next-select-trigger .next-select-values{display:block;width:100%;flex:1 1 0;overflow:hidden}.next-select-trigger .next-select-values>em{font-style:inherit}.next-select-trigger .next-select-values input{padding-left:0;padding-right:0}.next-select-trigger .next-input-control{flex:0 0 auto;width:auto}.next-select-trigger .next-input-control>*{display:inline-block;width:auto}.next-select-trigger .next-input-control>.next-select-arrow{padding-right:0}.next-select-trigger .next-input.next-disabled em{color:#ccc}.next-select-trigger .next-input.next-disabled .next-select-arrow{cursor:not-allowed}.next-select-trigger .next-select-clear{display:none}.next-select-trigger.next-has-clear:hover .next-select-clear{display:inline-block}.next-select-trigger.next-has-clear:hover .next-select-arrow{display:none}.next-select .next-select-inner{display:inline-flex;align-items:center;width:100%;min-width:100px;outline:0;color:#333}.next-select .next-select-inner .next-tag{line-height:1;margin-right:4px;margin-bottom:3px;padding-left:0;padding-right:0}.next-select .next-select-inner .next-input-inner{width:auto}.next-select-trigger-search{position:relative;display:inline-block;vertical-align:top;overflow:hidden;width:100%;max-width:100%}.next-select-trigger-search>input,.next-select-trigger-search>span{display:block;font-size:inherit;font-family:inherit;letter-spacing:inherit;white-space:nowrap;overflow:hidden}.next-select-trigger-search input{position:absolute;background-color:transparent;width:100%;height:100%!important;z-index:1;left:0;border:0;outline:0;margin:0;padding:0;cursor:inherit}.next-select-trigger-search>span{position:relative;visibility:hidden;white-space:pre;max-width:100%;z-index:-1}.next-select-single.next-no-search{cursor:pointer}.next-select-single.next-has-search.next-active .next-select-values>em{display:none}.next-select-single.next-inactive .next-select-values>em+.next-select-trigger-search,.next-select-single.next-no-search .next-select-values>em+.next-select-trigger-search{width:1px;opacity:0;filter:alpha(opacity=0)}.next-select-single .next-select-values{display:inline-flex;align-items:center}.next-select-single .next-select-values>em{vertical-align:middle;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.next-select-multiple .next-select-compact{position:relative;white-space:nowrap}.next-select-multiple .next-select-compact .next-select-trigger-search{width:auto}.next-select-multiple .next-select-compact .next-select-tag-compact{position:absolute;top:0;right:0;z-index:1;padding:0 4px 0 16px;color:#333;background:linear-gradient(90deg,transparent,#fff 10px)}.next-select-multiple .next-disabled .next-select-tag-compact{background:linear-gradient(90deg,transparent,#fafafa 10px)}.next-select-multiple .next-select-values,.next-select-tag .next-select-values{margin-bottom:-3px;height:auto!important}.next-select-multiple .next-select-trigger-search,.next-select-tag .next-select-trigger-search{margin-bottom:3px}.next-select-multiple .next-tag+.next-select-trigger-search,.next-select-tag .next-tag+.next-select-trigger-search{width:auto;min-width:1px}.next-select-multiple .next-input,.next-select-tag .next-input{height:auto;align-items:start}.next-select-multiple.next-small .next-select-values,.next-select-tag.next-small .next-select-values{min-height:22px;padding-top:4px;padding-bottom:4px;line-height:14px}.next-select-multiple.next-small .next-select-values-compact,.next-select-tag.next-small .next-select-values-compact{height:24px!important}.next-select-multiple.next-small .next-tag,.next-select-tag.next-small .next-tag{border:0;padding-top:0;padding-bottom:0;height:14px}.next-select-multiple.next-small .next-tag-body,.next-select-multiple.next-small .next-tag .next-tag-body,.next-select-multiple.next-small .next-tag .next-tag-close-btn,.next-select-tag.next-small .next-tag-body,.next-select-tag.next-small .next-tag .next-tag-body,.next-select-tag.next-small .next-tag .next-tag-close-btn{line-height:14px}.next-select-multiple.next-small .next-input-control,.next-select-multiple.next-small .next-input-inner,.next-select-multiple.next-small .next-input-label,.next-select-multiple.next-small .next-select-tag-compact,.next-select-tag.next-small .next-input-control,.next-select-tag.next-small .next-input-inner,.next-select-tag.next-small .next-input-label,.next-select-tag.next-small .next-select-tag-compact{line-height:22px}.next-select-multiple.next-medium .next-select-values,.next-select-tag.next-medium .next-select-values{min-height:30px;padding-top:5px;padding-bottom:5px;line-height:20px}.next-select-multiple.next-medium .next-select-values-compact,.next-select-tag.next-medium .next-select-values-compact{height:32px!important}.next-select-multiple.next-medium .next-tag,.next-select-tag.next-medium .next-tag{padding-top:1px;padding-bottom:1px;height:20px}.next-select-multiple.next-medium .next-tag .next-tag-body,.next-select-multiple.next-medium .next-tag .next-tag-close-btn,.next-select-tag.next-medium .next-tag .next-tag-body,.next-select-tag.next-medium .next-tag .next-tag-close-btn{line-height:18px}.next-select-multiple.next-medium .next-input-control,.next-select-multiple.next-medium .next-input-inner,.next-select-multiple.next-medium .next-input-label,.next-select-multiple.next-medium .next-select-tag-compact,.next-select-tag.next-medium .next-input-control,.next-select-tag.next-medium .next-input-inner,.next-select-tag.next-medium .next-input-label,.next-select-tag.next-medium .next-select-tag-compact{line-height:30px}.next-select-multiple.next-large .next-select-values,.next-select-tag.next-large .next-select-values{min-height:38px;padding-top:7px;padding-bottom:7px;line-height:24px}.next-select-multiple.next-large .next-select-values-compact,.next-select-tag.next-large .next-select-values-compact{height:40px!important}.next-select-multiple.next-large .next-tag,.next-select-tag.next-large .next-tag{padding-top:3px;padding-bottom:3px;height:24px}.next-select-multiple.next-large .next-tag .next-tag-body,.next-select-multiple.next-large .next-tag .next-tag-close-btn,.next-select-tag.next-large .next-tag .next-tag-body,.next-select-tag.next-large .next-tag .next-tag-close-btn{line-height:18px}.next-select-multiple.next-large .next-input-control,.next-select-multiple.next-large .next-input-inner,.next-select-multiple.next-large .next-input-label,.next-select-multiple.next-large .next-select-tag-compact,.next-select-tag.next-large .next-input-control,.next-select-tag.next-large .next-input-inner,.next-select-tag.next-large .next-input-label,.next-select-tag.next-large .next-select-tag-compact{line-height:38px}.next-select-auto-complete{width:160px}.next-select-auto-complete .next-input{width:100%}.next-select-auto-complete .next-input .next-input-hint-wrap{padding-right:1px}.next-select-auto-complete .next-input .next-select-arrow{padding-left:0}.next-select.next-active .next-select-arrow .next-icon-arrow-down{transform:rotate(180deg)}.next-select .next-select-unfold-icon:before{content:""}.next-select-symbol-fold:before{content:"顦�"}.next-select-arrow{cursor:pointer;width:auto!important;text-align:center;transition:all .1s linear}.next-select-popup-wrap{animation-duration:.3s;animation-timing-function:ease;padding:0}.next-select-spacing-tb{padding:0}.next-select-menu-wrapper{max-height:260px;overflow:auto;border:1px solid #e6e6e6;border-radius:3px;box-shadow:none}.next-select-menu-wrapper .next-select-menu{max-height:none;border:none}.next-select-menu{max-height:260px;overflow:auto}.next-select-menu .next-select-menu-empty-content{padding-left:8px;padding-right:8px;color:#999}.next-select-menu.next-select-auto-complete-menu.next-select-menu-empty{display:none}.next-select-menu .next-menu-item-text .next-icon{vertical-align:middle}.next-select-all{display:block;cursor:pointer;padding:0 8px;margin:0 12px 8px;border-bottom:1px solid #e6e6e6}.next-select-all:hover{color:#2580e7}.next-select-all .next-menu-icon-selected.next-icon{display:inline-block!important;top:auto;color:#209bfa}.next-select-highlight{color:#209bfa;font-size:14px}.next-select-in-ie.next-select-trigger .next-select-values{overflow:visible}.next-select-in-ie.next-select-trigger .next-input-control,.next-select-in-ie.next-select-trigger .next-input-label{width:1px}.next-select-in-ie.next-select-trigger .next-input-control>*{display:table-cell;width:1%}.next-select-in-ie.next-select-trigger .next-select-arrow{display:table-cell}.next-select-in-ie.next-select-trigger .next-select-clear{display:none}.next-select-in-ie.next-select-trigger.next-select-multiple .next-select-inner,.next-select-in-ie.next-select-trigger.next-select-tag .next-select-inner{vertical-align:top}.next-select-in-ie.next-select-trigger .next-select-inner,.next-select-in-ie.next-select-trigger.next-select-single .next-select-values{display:inline-table}.next-select-in-ie.next-select-trigger.next-select-single .next-input.next-small .next-select-values{line-height:24px}.next-select-in-ie.next-select-trigger.next-select-single .next-input.next-medium .next-select-values{line-height:32px}.next-select-in-ie.next-select-trigger.next-select-single .next-input.next-large .next-select-values{line-height:40px}.next-select-in-ie.next-select-trigger .next-select-trigger-search>span{max-width:100px}.next-select-in-ie.next-select-trigger.next-select-single.next-select-in-ie-fixwidth .next-select-values{position:relative}.next-select-in-ie.next-select-trigger.next-select-single.next-select-in-ie-fixwidth .next-select-values>em{position:absolute;display:inline-block;height:100%;line-height:1;vertical-align:middle;overflow:hidden;left:4px;right:0;top:30%}.next-select-in-ie.next-select-trigger.next-select-single.next-inactive .next-select-values>em+.next-select-trigger-search,.next-select-in-ie.next-select-trigger.next-select-single.next-no-search .next-select-values>em+.next-select-trigger-search{filter:alpha(opacity=0);font-size:0}.next-select-in-ie.next-select-trigger.next-no-search .next-select-trigger-search input{color:inherit}@media screen and (-webkit-min-device-pixel-ratio:0){.next-select-multiple .next-select-compact .next-select-tag-compact{background:linear-gradient(90deg,hsla(0,0%,100%,0),#fff 10px)}.next-select-multiple .next-disabled .next-select-tag-compact{background:linear-gradient(90deg,hsla(0,0%,100%,0),#fafafa 10px)}}.next-select.next-select-multiple[dir=rtl] .next-select-compact .next-select-tag-compact{left:0;right:auto;padding:0 16px 0 4px;background:linear-gradient(270deg,hsla(0,0%,100%,0),#fff 10px)}.next-list-header{border-bottom:1px solid #e6e6e6;color:#333}.next-list-footer{border-top:1px solid #e6e6e6;color:#666}.next-list-loading.next-loading{display:block}.next-list-empty{font-size:14px;color:#ccc;padding:32px 0;text-align:center}.next-list-items{margin:0;padding:0;list-style:none}.next-list-item{display:table;display:flex;width:100%;color:#666}.next-list-item-extra,.next-list-item-media{display:table-cell;display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-start;min-width:1px;flex-shrink:0;vertical-align:top}.next-list-item-extra{color:#999}.next-list-item-content{display:table-cell;display:flex;flex-direction:column;align-items:flex-start;justify-content:center;flex:1;width:100%;vertical-align:middle}.next-list-item-title{color:#333}.next-list-medium .next-list-header{padding:16px 0;font-size:20px;font-weight:700}.next-list-medium .next-list-footer{padding:16px 0}.next-list-medium .next-list-item-media{padding-right:8px}.next-list-medium .next-list-item-extra{padding-left:8px}.next-list-medium .next-list-item{font-size:14px;line-height:1.5;padding:16px 0}.next-list-medium .next-list-item-title{font-weight:400;font-size:16px;line-height:1.5}.next-list-small .next-list-header{padding:8px 0;font-size:16px;font-weight:700}.next-list-small .next-list-footer{padding:8px 0}.next-list-small .next-list-item-media{padding-right:8px}.next-list-small .next-list-item-extra{padding-left:8px}.next-list-small .next-list-item{font-size:14px;font-weight:400;line-height:1.3;padding:8px 0}.next-list-small .next-list-item-title{font-size:14px;line-height:1.5}.next-list-divider .next-list-item{border-bottom:1px solid #e6e6e6}.next-list-divider .next-list-item:last-child{border-bottom:none}.next-list[dir=rtl] .next-list-item-media{padding-left:8px;padding-right:0}.next-list[dir=rtl] .next-list-item-extra{padding-right:8px;padding-left:0}.next-list[dir=rtl] .next-list-small .next-list-item-media{padding-left:8px;padding-right:0}.next-list[dir=rtl] .next-list-small .next-list-item-extra{padding-right:8px;padding-left:0}.next-menu-btn{display:inline-block;box-shadow:none}.next-menu-btn-spacing-tb{padding:0}.next-menu-btn .next-icon{transition:transform .1s linear}.next-menu-btn .next-menu-btn-arrow:before{content:"顦�"}.next-menu-btn.next-expand .next-menu-btn-arrow{transform:rotate(180deg)}.next-menu-btn-symbol-unfold:before{content:""}.next-menu-btn.next-btn-normal .next-menu-btn-arrow{color:#999}.next-menu-btn.next-btn-normal:hover .next-menu-btn-arrow{color:#333}.next-menu-btn.next-btn-secondary .next-menu-btn-arrow{color:#209bfa}.next-menu-btn.next-btn-secondary:hover .next-menu-btn-arrow{color:#fff}.next-menu-btn.next-btn-secondary.next-btn-text:hover .next-menu-btn-arrow{color:#209bfa}.next-menu-btn.next-btn-primary .next-menu-btn-arrow,.next-menu-btn.next-btn-primary:hover .next-menu-btn-arrow{color:#fff}.next-menu-btn.next-btn-text.next-btn-normal .next-menu-btn-arrow{color:#333}.next-menu-btn.next-btn-text.next-btn-normal:hover .next-menu-btn-arrow{color:#209bfa}.next-menu-btn.next-btn-text.next-btn-primary .next-menu-btn-arrow{color:#298dff}.next-menu-btn.next-btn-text.next-btn-primary:hover .next-menu-btn-arrow{color:#1274e7}.next-menu-btn.next-btn-ghost.next-btn-light .next-menu-btn-arrow{color:#333}.next-menu-btn.next-btn-ghost.next-btn-light:hover .next-menu-btn-arrow{color:#999}.next-menu-btn.next-btn-ghost.next-btn-dark .next-menu-btn-arrow,.next-menu-btn.next-btn-ghost.next-btn-dark:hover .next-menu-btn-arrow{color:#fff}.next-menu-btn.disabled .next-menu-btn-arrow,.next-menu-btn.next-btn-text.disabled .next-menu-btn-arrow,.next-menu-btn.next-btn-text[disabled] .next-menu-btn-arrow,.next-menu-btn[disabled] .next-menu-btn-arrow{color:#ccc}.next-menu-btn[disabled].next-btn-ghost.next-btn-dark .next-menu-btn-arrow{color:hsla(0,0%,100%,.4)}.next-menu-btn[disabled].next-btn-ghost.next-btn-light .next-menu-btn-arrow{color:rgba(0,0,0,.1)}.next-nav{min-width:auto;border-radius:0}.next-nav,.next-nav *,.next-nav :after,.next-nav :before{box-sizing:border-box}.next-nav-icon.next-icon{margin-right:12px;font-weight:inherit}.next-nav-icon.next-icon .next-icon-remote,.next-nav-icon.next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-nav-group-label{height:40px;line-height:40px;font-size:14px}.next-nav-item .next-menu-item-text>span,.next-nav-item .next-nav-group-label>span{opacity:1;transition:opacity .1s linear}.next-nav-item .next-menu-item-text>a{text-decoration:none;color:inherit}.next-nav-item.next-focused .next-menu-hoz-icon-arrow.next-icon,.next-nav-item.next-focused .next-menu-icon-arrow.next-icon,.next-nav-item .next-menu-hoz-icon-arrow.next-icon,.next-nav-item .next-menu-icon-arrow.next-icon,.next-nav-item.next-opened .next-menu-hoz-icon-arrow.next-icon,.next-nav-item.next-opened .next-menu-icon-arrow.next-icon,.next-nav-item.next-selected .next-menu-hoz-icon-arrow.next-icon,.next-nav-item.next-selected .next-menu-icon-arrow.next-icon,.next-nav-item:hover .next-menu-hoz-icon-arrow.next-icon,.next-nav-item:hover .next-menu-icon-arrow.next-icon{color:inherit;top:0;transform-origin:center 50%}.next-nav.next-active .next-nav-item:before{position:absolute;transition:all .3s ease;content:""}.next-nav.next-hoz{padding:0;height:44px;line-height:42px;font-size:14px}.next-nav.next-hoz .next-menu-item.next-nav-item{margin-left:0;margin-right:0;padding:0 20px;border-radius:0}.next-nav.next-hoz .next-menu-item,.next-nav.next-hoz .next-menu-sub-menu-wrapper>.next-menu-item{margin-top:0;margin-bottom:0}.next-nav.next-hoz .next-menu-item-inner{height:42px;font-size:14px}.next-nav.next-hoz .next-menu-item.next-nav-item.next-nav-with-title{line-height:1;padding:12px 8px}.next-nav.next-hoz .next-menu-item.next-nav-item.next-nav-with-title .next-menu-item-inner{height:auto;min-height:42px}.next-nav.next-hoz .next-menu-item.next-nav-item.next-nav-with-title .next-nav-text{display:block;line-height:1;margin-top:8px;overflow:hidden;text-overflow:ellipsis}.next-nav.next-hoz .next-nav-group-label .next-menu-item-inner{height:40px;line-height:40px;font-size:14px}.next-nav.next-hoz .next-menu-header{float:left;height:42px}.next-nav.next-hoz .next-menu-footer{float:right;height:42px}.next-nav.next-hoz .next-nav-item:before{width:0;left:50%;height:2px}.next-nav.next-hoz .next-nav-item:hover:before{height:0}.next-nav.next-hoz.next-top .next-nav-item:before{top:-1px}.next-nav.next-hoz.next-bottom .next-nav-item:before{bottom:-1px}.next-nav.next-hoz .next-selected.next-nav-item:before{width:100%;left:0;height:2px}.next-nav.next-ver{padding:0;transition:width .3s ease;line-height:52px;font-size:14px}.next-nav.next-ver .next-menu-item.next-nav-item{margin-left:0;margin-right:0;padding:0 16px;border-radius:0}.next-nav.next-ver .next-menu-item:not(:first-child),.next-nav.next-ver .next-menu-sub-menu-wrapper:not(:first-child)>.next-menu-item{margin-top:0}.next-nav.next-ver .next-menu-item:not(:last-child),.next-nav.next-ver .next-menu-sub-menu-wrapper:not(:last-child)>.next-menu-item{margin-bottom:0}.next-nav.next-ver .next-menu-item-inner{height:52px;font-size:14px}.next-nav.next-ver .next-menu-item.next-nav-item.next-nav-with-title{line-height:1;padding:12px 8px}.next-nav.next-ver .next-menu-item.next-nav-item.next-nav-with-title .next-menu-item-inner{height:auto;min-height:52px}.next-nav.next-ver .next-menu-item.next-nav-item.next-nav-with-title .next-nav-text{display:block;line-height:1;margin-top:8px;overflow:hidden;text-overflow:ellipsis}.next-nav.next-ver .next-nav-group-label .next-menu-item-inner{height:40px;line-height:40px;font-size:14px}.next-nav.next-ver>.next-menu-item:first-child,.next-nav.next-ver>.next-menu-sub-menu-wrapper:first-child>.next-menu-item{margin-top:0}.next-nav.next-ver>.next-menu-item:last-child,.next-nav.next-ver>.next-menu-sub-menu-wrapper:last-child>.next-menu-item{margin-bottom:0}.next-nav.next-ver .next-menu-sub-menu{line-height:52px}.next-nav.next-ver .next-menu-sub-menu .next-menu-item-inner{height:52px;font-size:14px}.next-nav.next-ver .next-nav-item:before{height:0;top:50%;width:2px}.next-nav.next-ver .next-nav-item:hover:before{width:0}.next-nav.next-ver.next-left .next-nav-item:before,.next-nav.next-ver.next-top .next-nav-item:before{left:-1px}.next-nav.next-ver.next-bottom .next-nav-item:before,.next-nav.next-ver.next-right .next-nav-item:before{right:-1px}.next-nav.next-ver .next-selected.next-nav-item:before{height:100%;top:0;width:2px}.next-nav.next-primary{border-width:0;background:#222;border-color:#222;color:#ddd;font-weight:400;box-shadow:4px 4px 8px 0 rgba(0,0,0,.12)}.next-nav.next-primary.next-hoz{line-height:44px}.next-nav.next-primary.next-hoz .next-menu-footer,.next-nav.next-primary.next-hoz .next-menu-header,.next-nav.next-primary.next-hoz .next-menu-item-inner{line-height:44px;height:44px}.next-nav.next-primary.next-hoz.next-top .next-nav-item:before{top:0}.next-nav.next-primary.next-hoz.next-bottom .next-nav-item:before{bottom:0}.next-nav.next-primary.next-ver.next-left .next-nav-item:before{left:0}.next-nav.next-primary.next-ver.next-right .next-nav-item:before{right:0}.next-nav.next-primary .next-nav-item.next-menu-item{background:#222;color:#ddd}.next-nav.next-primary .next-nav-item.next-menu-item.next-focused,.next-nav.next-primary .next-nav-item.next-menu-item:hover{background:#333;color:#fff;font-weight:400}.next-nav.next-primary .next-nav-item.next-menu-item.next-selected{background:#333;color:#fff;font-weight:700}.next-nav.next-primary .next-nav-item.next-menu-item.next-opened{background:#222;color:#fff}.next-nav.next-primary .next-nav-item.next-menu-item.next-child-selected{font-weight:700;background:transparent;color:#fff}.next-nav.next-primary .next-nav-item.next-menu-item.next-child-selected.next-nav-popup,.next-nav.next-primary .next-nav-item.next-menu-item.next-opened.next-nav-popup{color:#fff}.next-nav.next-primary .next-nav-item.next-menu-item:before,.next-nav.next-primary .next-nav-item.next-menu-item:hover:before{background:#209bfa}.next-nav.next-primary .next-menu-sub-menu .next-menu-item.next-opened{background:#222;color:#fff}.next-nav.next-primary .next-nav-group-label{color:#999;font-weight:400}.next-nav.next-primary .next-menu-sub-menu .next-menu-item{background:#151515;color:#ddd;font-weight:400}.next-nav.next-primary .next-menu-sub-menu .next-menu-item.next-focused,.next-nav.next-primary .next-menu-sub-menu .next-menu-item:hover{background:#333;color:#ddd}.next-nav.next-primary .next-menu-sub-menu .next-menu-item.next-selected{background:#333;color:#fff}.next-nav.next-primary .next-nav-item.next-menu-item.next-disabled,.next-nav.next-primary .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a{color:#ccc;cursor:not-allowed}.next-nav.next-primary .next-nav-item.next-menu-item.next-disabled .next-menu-icon-arrow,.next-nav.next-primary .next-nav-item.next-menu-item.next-disabled .next-menu-icon-selected,.next-nav.next-primary .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a .next-menu-icon-arrow,.next-nav.next-primary .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a .next-menu-icon-selected{color:#ccc}.next-nav.next-secondary{border-width:0;background:#209bfa;border-color:#209bfa;color:#fff;font-weight:400;box-shadow:4px 4px 8px 0 rgba(0,0,0,.12)}.next-nav.next-secondary.next-hoz{line-height:44px}.next-nav.next-secondary.next-hoz .next-menu-footer,.next-nav.next-secondary.next-hoz .next-menu-header,.next-nav.next-secondary.next-hoz .next-menu-item-inner{line-height:44px;height:44px}.next-nav.next-secondary.next-hoz.next-top .next-nav-item:before{top:0}.next-nav.next-secondary.next-hoz.next-bottom .next-nav-item:before{bottom:0}.next-nav.next-secondary.next-ver.next-left .next-nav-item:before{left:0}.next-nav.next-secondary.next-ver.next-right .next-nav-item:before{right:0}.next-nav.next-secondary .next-nav-item.next-menu-item{background:#209bfa;color:#fff}.next-nav.next-secondary .next-nav-item.next-menu-item.next-focused,.next-nav.next-secondary .next-nav-item.next-menu-item:hover{background:#1274e7;color:#fff;font-weight:400}.next-nav.next-secondary .next-nav-item.next-menu-item.next-selected{background:#1274e7;color:#fff;font-weight:700}.next-nav.next-secondary .next-nav-item.next-menu-item.next-opened{background:transparent;color:#fff}.next-nav.next-secondary .next-nav-item.next-menu-item.next-child-selected{font-weight:700;background:transparent;color:#fff}.next-nav.next-secondary .next-nav-item.next-menu-item.next-child-selected.next-nav-popup,.next-nav.next-secondary .next-nav-item.next-menu-item.next-opened.next-nav-popup{color:#fff}.next-nav.next-secondary .next-nav-item.next-menu-item:before,.next-nav.next-secondary .next-nav-item.next-menu-item:hover:before{background:#1274e7}.next-nav.next-secondary .next-menu-sub-menu .next-menu-item.next-opened{background:transparent;color:#fff}.next-nav.next-secondary .next-nav-group-label{color:#fff;font-weight:400}.next-nav.next-secondary .next-menu-sub-menu .next-menu-item{background:#209bfa;color:#fff;font-weight:400}.next-nav.next-secondary .next-menu-sub-menu .next-menu-item.next-focused,.next-nav.next-secondary .next-menu-sub-menu .next-menu-item.next-selected,.next-nav.next-secondary .next-menu-sub-menu .next-menu-item:hover{background:#1274e7;color:#fff}.next-nav.next-secondary .next-nav-item.next-menu-item.next-disabled,.next-nav.next-secondary .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a{color:#add9ff;cursor:not-allowed}.next-nav.next-secondary .next-nav-item.next-menu-item.next-disabled .next-menu-icon-arrow,.next-nav.next-secondary .next-nav-item.next-menu-item.next-disabled .next-menu-icon-selected,.next-nav.next-secondary .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a .next-menu-icon-arrow,.next-nav.next-secondary .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a .next-menu-icon-selected{color:#add9ff}.next-nav.next-normal{border-color:#eee;font-weight:400;box-shadow:4px 4px 8px 0 rgba(0,0,0,.12)}.next-nav.next-normal,.next-nav.next-normal .next-nav-item.next-menu-item{background:#fff;color:#666}.next-nav.next-normal .next-nav-item.next-menu-item.next-focused,.next-nav.next-normal .next-nav-item.next-menu-item:hover{background:#fff;color:#333;font-weight:500}.next-nav.next-normal .next-nav-item.next-menu-item.next-selected{background:#e4f3fe;color:#209bfa;font-weight:700}.next-nav.next-normal .next-nav-item.next-menu-item.next-opened{background:transparent;color:#333}.next-nav.next-normal .next-nav-item.next-menu-item.next-child-selected{font-weight:400;background:transparent;color:#209bfa}.next-nav.next-normal .next-nav-item.next-menu-item.next-opened.next-nav-popup{color:#333}.next-nav.next-normal .next-nav-item.next-menu-item.next-child-selected.next-nav-popup{color:#209bfa}.next-nav.next-normal .next-nav-item.next-menu-item:before{background:#209bfa}.next-nav.next-normal .next-nav-item.next-menu-item:hover:before{background:#1b84e0}.next-nav.next-normal .next-menu-sub-menu .next-menu-item.next-opened{background:transparent;color:#333}.next-nav.next-normal .next-nav-group-label{color:#999;font-weight:400}.next-nav.next-normal .next-menu-sub-menu .next-menu-item{background:#fafafa;color:#666;font-weight:400}.next-nav.next-normal .next-menu-sub-menu .next-menu-item.next-focused,.next-nav.next-normal .next-menu-sub-menu .next-menu-item:hover{background:#f9f9f9;color:#298dff}.next-nav.next-normal .next-menu-sub-menu .next-menu-item.next-selected{background:#e4f3fe;color:#209bfa}.next-nav.next-normal .next-nav-item.next-menu-item.next-disabled,.next-nav.next-normal .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a{color:#999;cursor:not-allowed}.next-nav.next-normal .next-nav-item.next-menu-item.next-disabled .next-menu-icon-arrow,.next-nav.next-normal .next-nav-item.next-menu-item.next-disabled .next-menu-icon-selected,.next-nav.next-normal .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a .next-menu-icon-arrow,.next-nav.next-normal .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a .next-menu-icon-selected{color:#999}.next-nav.next-line{background:transparent;border-color:#e6e6e6;color:#333;font-weight:400;box-shadow:none}.next-nav.next-line.next-hoz{border-right-color:transparent}.next-nav.next-line.next-hoz,.next-nav.next-line.next-ver{border-top-color:transparent;border-left-color:transparent}.next-nav.next-line.next-ver{border-bottom-color:transparent}.next-nav.next-line .next-nav-item.next-menu-item{background:transparent;color:#333}.next-nav.next-line .next-nav-item.next-menu-item.next-focused,.next-nav.next-line .next-nav-item.next-menu-item:hover{background:transparent;color:#209bfa;font-weight:400}.next-nav.next-line .next-nav-item.next-menu-item.next-selected{background:transparent;color:#209bfa;font-weight:700}.next-nav.next-line .next-nav-item.next-menu-item.next-opened{background:transparent;color:#209bfa}.next-nav.next-line .next-nav-item.next-menu-item.next-child-selected{font-weight:400;background:transparent;color:#209bfa}.next-nav.next-line .next-nav-item.next-menu-item.next-child-selected.next-nav-popup,.next-nav.next-line .next-nav-item.next-menu-item.next-opened.next-nav-popup{color:#209bfa}.next-nav.next-line .next-nav-item.next-menu-item:before,.next-nav.next-line .next-nav-item.next-menu-item:hover:before{background:#209bfa}.next-nav.next-line .next-menu-sub-menu .next-menu-item.next-opened{background:transparent;color:#209bfa}.next-nav.next-line .next-nav-group-label{color:#999;font-weight:400}.next-nav.next-line .next-menu-sub-menu .next-menu-item{background:transparent;color:#333;font-weight:400}.next-nav.next-line .next-menu-sub-menu .next-menu-item.next-focused,.next-nav.next-line .next-menu-sub-menu .next-menu-item.next-selected,.next-nav.next-line .next-menu-sub-menu .next-menu-item:hover{background:transparent;color:#209bfa}.next-nav.next-line .next-nav-item.next-menu-item.next-disabled,.next-nav.next-line .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a{color:#999;cursor:not-allowed}.next-nav.next-line .next-nav-item.next-menu-item.next-disabled .next-menu-icon-arrow,.next-nav.next-line .next-nav-item.next-menu-item.next-disabled .next-menu-icon-selected,.next-nav.next-line .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a .next-menu-icon-arrow,.next-nav.next-line .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a .next-menu-icon-selected{color:#999}.next-nav.next-icon-only.next-icon-only-text{padding-top:4px;padding-bottom:4px}.next-nav.next-icon-only.next-custom-icon-only-width{text-align:center}.next-nav.next-icon-only .next-menu-item-inner{text-overflow:clip}.next-nav.next-icon-only.next-normal .next-nav-icon.next-icon{margin-left:2px;margin-right:2px}.next-nav.next-icon-only.next-normal .next-nav-icon.next-icon .next-icon-remote,.next-nav.next-icon-only.next-normal .next-nav-icon.next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-nav.next-icon-only.next-primary .next-nav-icon.next-icon{margin-left:3px;margin-right:3px}.next-nav.next-icon-only.next-primary .next-nav-icon.next-icon .next-icon-remote,.next-nav.next-icon-only.next-primary .next-nav-icon.next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-nav.next-icon-only.next-secondary .next-nav-icon.next-icon{margin-left:3px;margin-right:3px}.next-nav.next-icon-only.next-secondary .next-nav-icon.next-icon .next-icon-remote,.next-nav.next-icon-only.next-secondary .next-nav-icon.next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-nav.next-icon-only .next-nav-icon-only-arrow.next-icon{margin-left:3px;margin-right:3px;transition:all .1s linear;transform-origin:center 50%}.next-nav.next-icon-only .next-nav-icon-only-arrow.next-icon .next-icon-remote,.next-nav.next-icon-only .next-nav-icon-only-arrow.next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-nav.next-icon-only .next-nav-item.next-opened .next-nav-icon-only-arrow.next-icon-arrow-down{transform:rotate(180deg);margin-left:3px;margin-right:3px}.next-nav.next-icon-only .next-nav-item.next-opened .next-nav-icon-only-arrow.next-icon-arrow-down .next-icon-remote,.next-nav.next-icon-only .next-nav-item.next-opened .next-nav-icon-only-arrow.next-icon-arrow-down:before{width:20px;font-size:20px;line-height:inherit}.next-nav.next-icon-only .next-menu-hoz-icon-arrow,.next-nav.next-icon-only .next-menu-icon-arrow{display:none}.next-nav-embeddable.next-normal,.next-nav-embeddable.next-primary,.next-nav-embeddable.next-secondary{height:100%;background:transparent;box-shadow:none;border:none}.next-nav-embeddable.next-normal .next-menu-sub-menu .next-menu-item,.next-nav-embeddable.next-normal .next-nav-item.next-menu-item,.next-nav-embeddable.next-primary .next-menu-sub-menu .next-menu-item,.next-nav-embeddable.next-primary .next-nav-item.next-menu-item,.next-nav-embeddable.next-secondary .next-menu-sub-menu .next-menu-item,.next-nav-embeddable.next-secondary .next-nav-item.next-menu-item{background:transparent}.next-nav-embeddable.next-normal.next-icon-only .next-nav-icon.next-icon,.next-nav-embeddable.next-primary.next-icon-only .next-nav-icon.next-icon,.next-nav-embeddable.next-secondary.next-icon-only .next-nav-icon.next-icon{margin-left:3px;margin-right:3px}.next-nav-embeddable.next-normal.next-icon-only .next-nav-icon.next-icon .next-icon-remote,.next-nav-embeddable.next-normal.next-icon-only .next-nav-icon.next-icon:before,.next-nav-embeddable.next-primary.next-icon-only .next-nav-icon.next-icon .next-icon-remote,.next-nav-embeddable.next-primary.next-icon-only .next-nav-icon.next-icon:before,.next-nav-embeddable.next-secondary.next-icon-only .next-nav-icon.next-icon .next-icon-remote,.next-nav-embeddable.next-secondary.next-icon-only .next-nav-icon.next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-nav-embeddable.next-nav.next-hoz .next-menu-item-inner,.next-nav-embeddable.next-nav.next-hoz .next-menu-sub-menu .next-menu-item,.next-nav-embeddable.next-nav.next-hoz .next-nav-item.next-menu-item{height:100%}.next-nav-embeddable,.next-nav-embeddable .next-nav-item.next-disabled,.next-nav-embeddable .next-nav-item.next-disabled .next-menu-item-text>a{background:transparent;border:none}.next-nav[dir=rtl] .next-nav-icon.next-icon{margin-left:12px;margin-right:0}.next-nav[dir=rtl] .next-nav-icon.next-icon .next-icon-remote,.next-nav[dir=rtl] .next-nav-icon.next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-nav[dir=rtl].next-hoz .next-menu-header{float:right}.next-nav[dir=rtl].next-hoz .next-menu-footer{float:left}.next-nav[dir=rtl].next-hoz .next-nav-item:before{width:0;left:50%}.next-nav[dir=rtl].next-hoz .next-selected.next-nav-item:before{width:100%;left:auto;right:0}.next-nav[dir=rtl].next-ver.next-left .next-nav-item:before{right:0;right:-1px;left:auto}.next-nav[dir=rtl].next-ver.next-right .next-nav-item:before{left:0;left:-1px;right:auto}.next-nav[dir=rtl].next-primary.next-ver.next-left .next-nav-item:before{right:0;left:auto}.next-nav[dir=rtl].next-primary.next-ver.next-right .next-nav-item:before{left:0;right:auto}.next-nav[dir=rtl].next-secondary.next-ver.next-left .next-nav-item:before{right:0;left:auto}.next-nav[dir=rtl].next-secondary.next-ver.next-right .next-nav-item:before{left:0;right:auto}.next-nav[dir=rtl] .next-nav.next-line.next-ver{border-color:transparent}.next-nav[dir=rtl].next-icon-only .next-nav-icon-only-arrow.next-icon,.next-nav[dir=rtl].next-icon-only .next-nav-icon.next-icon,.next-nav[dir=rtl].next-icon-only .next-nav-item.next-opened .next-nav-icon-only-arrow.next-icon-arrow-down{margin-left:0;margin-right:-1px}.next-nav[dir=rtl].next-icon-only .next-nav-icon-only-arrow.next-icon .next-icon-remote,.next-nav[dir=rtl].next-icon-only .next-nav-icon-only-arrow.next-icon:before,.next-nav[dir=rtl].next-icon-only .next-nav-icon.next-icon .next-icon-remote,.next-nav[dir=rtl].next-icon-only .next-nav-icon.next-icon:before,.next-nav[dir=rtl].next-icon-only .next-nav-item.next-opened .next-nav-icon-only-arrow.next-icon-arrow-down .next-icon-remote,.next-nav[dir=rtl].next-icon-only .next-nav-item.next-opened .next-nav-icon-only-arrow.next-icon-arrow-down:before{width:20px;font-size:20px;line-height:inherit}.next-number-picker{display:inline-block}.next-number-picker,.next-number-picker *,.next-number-picker :after,.next-number-picker :before{box-sizing:border-box}.next-number-picker .next-btn{padding:0!important;line-height:0!important;box-shadow:none!important}.next-number-picker-normal .next-input{width:100%}.next-number-picker-normal .next-input .next-input-control{padding-right:0;height:100%}.next-number-picker-normal:not(.next-number-picker-no-trigger) .next-input input{padding-right:2px}.next-number-picker-normal .next-btn{display:block}.next-number-picker-normal .next-btn:hover{z-index:1}.next-number-picker-normal .next-btn:first-child{border-right:none;border-top:none;height:50%;border-top-left-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.next-number-picker-normal .next-btn:last-child{border-right:none;border-bottom:none;margin-top:-1px;height:calc(50% + 1px);border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:0}.next-number-picker-normal .next-number-picker-handler{transition:opacity .1s linear;height:100%;display:block}.next-number-picker-normal:not(.next-number-picker-show-trigger) .next-number-picker-handler{opacity:0}.next-number-picker-normal.hover .next-number-picker-handler,.next-number-picker-normal:hover .next-number-picker-handler{opacity:1}.next-number-picker-normal .next-input.next-disabled .next-number-picker-handler{opacity:0}.next-number-picker-normal .next-number-picker-up-icon:before{content:"顦�"}.next-number-picker-normal .next-number-picker-down-icon:before{content:"顦�"}.next-number-picker-normal.next-small{width:68px}.next-number-picker-normal.next-small .next-btn{width:20px}.next-number-picker-normal.next-small .next-btn:first-child{border-top-right-radius:3px}.next-number-picker-normal.next-small .next-btn:last-child{border-bottom-right-radius:3px}.next-number-picker-normal.next-small .next-icon .next-icon-remote,.next-number-picker-normal.next-small .next-icon:before{width:8px;font-size:8px;line-height:inherit}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-number-picker-normal.next-small .next-icon{transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-number-picker-normal.next-small .next-icon:before{width:16px;font-size:16px}}.next-number-picker-normal.next-medium{width:80px}.next-number-picker-normal.next-medium .next-btn{width:20px}.next-number-picker-normal.next-medium .next-btn:first-child{border-top-right-radius:3px}.next-number-picker-normal.next-medium .next-btn:last-child{border-bottom-right-radius:3px}.next-number-picker-normal.next-medium .next-icon .next-icon-remote,.next-number-picker-normal.next-medium .next-icon:before{width:8px;font-size:8px;line-height:inherit}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-number-picker-normal.next-medium .next-icon{transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-number-picker-normal.next-medium .next-icon:before{width:16px;font-size:16px}}.next-number-picker-normal.next-large{width:80px}.next-number-picker-normal.next-large .next-btn{width:20px}.next-number-picker-normal.next-large .next-btn:first-child{border-top-right-radius:3px}.next-number-picker-normal.next-large .next-btn:last-child{border-bottom-right-radius:3px}.next-number-picker-normal.next-large .next-icon .next-icon-remote,.next-number-picker-normal.next-large .next-icon:before{width:8px;font-size:8px;line-height:inherit}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-number-picker-normal.next-large .next-icon{transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-number-picker-normal.next-large .next-icon:before{width:16px;font-size:16px}}.next-number-picker-inline input{text-align:center}.next-number-picker-inline .next-input input{padding:0}.next-number-picker-inline .next-number-picker-add-icon:before{content:"顧�"}.next-number-picker-inline .next-number-picker-minus-icon:before{content:"顦�"}.next-number-picker-inline.next-small{width:68px;min-width:72px}.next-number-picker-inline.next-small .next-icon .next-icon-remote,.next-number-picker-inline.next-small .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-number-picker-inline.next-small .next-btn{height:24px}.next-number-picker-inline.next-small .next-before .next-btn{margin-right:2px;border-top-left-radius:3px;border-bottom-left-radius:3px}.next-number-picker-inline.next-small .next-after .next-btn{margin-left:2px;border-top-right-radius:3px;border-bottom-right-radius:3px}.next-number-picker-inline.next-medium{width:100px;min-width:96px}.next-number-picker-inline.next-medium .next-icon .next-icon-remote,.next-number-picker-inline.next-medium .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-number-picker-inline.next-medium .next-btn{height:32px}.next-number-picker-inline.next-medium .next-before .next-btn{margin-right:2px;border-top-left-radius:3px;border-bottom-left-radius:3px}.next-number-picker-inline.next-medium .next-after .next-btn{margin-left:2px;border-top-right-radius:3px;border-bottom-right-radius:3px}.next-number-picker-inline.next-large{width:128px;min-width:120px}.next-number-picker-inline.next-large .next-icon .next-icon-remote,.next-number-picker-inline.next-large .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-number-picker-inline.next-large .next-btn{height:40px}.next-number-picker-inline.next-large .next-before .next-btn{margin-right:2px;border-top-left-radius:3px;border-bottom-left-radius:3px}.next-number-picker-inline.next-large .next-after .next-btn{margin-left:2px;border-top-right-radius:3px;border-bottom-right-radius:3px}.next-number-picker-inline .next-btn.next-small{width:24px}.next-number-picker-inline .next-btn.next-medium{width:32px}.next-number-picker-inline .next-btn.next-large{width:40px}@-moz-document url-prefix(){.next-number-picker-normal.next-small .next-number-picker-handler{height:22px}.next-number-picker-normal.next-medium .next-number-picker-handler{height:30px}.next-number-picker-normal.next-large .next-number-picker-handler{height:38px}}.next-number-picker-normal[dir=rtl] .next-btn:first-child{border-right:1px solid #ddd;border-left:0;border-top-right-radius:0}.next-number-picker-normal[dir=rtl] .next-btn:first-child.next-large,.next-number-picker-normal[dir=rtl] .next-btn:first-child.next-medium,.next-number-picker-normal[dir=rtl] .next-btn:first-child.next-small{border-top-left-radius:3px}.next-number-picker-normal[dir=rtl] .next-btn:last-child{border-right:1px solid #ddd;border-left:0;border-bottom-right-radius:0}.next-number-picker-normal[dir=rtl] .next-btn:last-child.next-large,.next-number-picker-normal[dir=rtl] .next-btn:last-child.next-medium,.next-number-picker-normal[dir=rtl] .next-btn:last-child.next-small{border-bottom-left-radius:3px}.next-number-picker-normal[dir=rtl] .next-input .next-input-control{padding-left:0}.next-number-picker-inline[dir=rtl] .next-before .next-btn{margin-right:0}.next-number-picker-inline[dir=rtl] .next-before .next-btn.next-large,.next-number-picker-inline[dir=rtl] .next-before .next-btn.next-medium,.next-number-picker-inline[dir=rtl] .next-before .next-btn.next-small{margin-left:2px;border-top-right-radius:3px!important;border-bottom-right-radius:3px!important}.next-number-picker-inline[dir=rtl] .next-after .next-btn{margin-left:0}.next-number-picker-inline[dir=rtl] .next-after .next-btn.next-large,.next-number-picker-inline[dir=rtl] .next-after .next-btn.next-medium,.next-number-picker-inline[dir=rtl] .next-after .next-btn.next-small{margin-right:2px;border-top-left-radius:3px!important;border-bottom-left-radius:3px!important}.next-pagination[dir=rtl] .next-pagination-total{margin-right:0;margin-left:16px}.next-pagination[dir=rtl] .next-pagination-jump-go{margin-left:0;margin-right:4px}.next-pagination[dir=rtl] .next-pagination-size-selector-title{margin-right:0;margin-left:4px}.next-pagination[dir=rtl] .next-pagination-size-selector-btn.next-btn-text+.next-pagination-size-selector-btn{border-left:none;border-right:1px solid #e6e6e6}.next-pagination[dir=rtl] .next-pagination-pages+.next-pagination-size-selector,.next-pagination[dir=rtl] .next-pagination-size-selector+.next-pagination-pages{margin-left:0;margin-right:40px}.next-pagination[dir=rtl].next-start .next-pagination-pages{float:left}.next-pagination[dir=rtl].next-end .next-pagination-pages,.next-pagination[dir=rtl].next-start .next-pagination-size-selector{float:right}.next-pagination[dir=rtl].next-end .next-pagination-size-selector{float:left}.next-pagination[dir=rtl].next-small .next-pagination-list{margin:0 4px}.next-pagination[dir=rtl].next-small .next-pagination-total{line-height:24px;vertical-align:middle}.next-pagination[dir=rtl].next-small .next-pagination-item{padding:0 6px;border-width:1px;border-radius:3px}.next-pagination[dir=rtl].next-small .next-pagination-item+.next-pagination-item{margin:0 4px 0 0}.next-pagination[dir=rtl].next-small .next-pagination-ellipsis{height:24px;line-height:24px;margin-left:8px;margin-right:8px}.next-pagination[dir=rtl].next-small .next-pagination-ellipsis .next-icon-remote,.next-pagination[dir=rtl].next-small .next-pagination-ellipsis:before{width:12px;font-size:12px;line-height:inherit}.next-pagination[dir=rtl].next-small .next-pagination-display,.next-pagination[dir=rtl].next-small .next-pagination-display em,.next-pagination[dir=rtl].next-small .next-pagination-jump-text{font-size:12px}.next-pagination[dir=rtl].next-small .next-pagination-jump-input{width:28px}.next-pagination[dir=rtl].next-small .next-pagination-size-selector-title{height:24px;line-height:24px;font-size:12px;vertical-align:middle}.next-pagination[dir=rtl].next-small .next-pagination-size-selector-btn{padding:0 8px}.next-pagination[dir=rtl].next-small .next-pagination-item.next-next:not([disabled]) i,.next-pagination[dir=rtl].next-small .next-pagination-item.next-prev:not([disabled]) i{color:#666}.next-pagination[dir=rtl].next-small .next-pagination-item:hover.next-next:not([disabled]) i,.next-pagination[dir=rtl].next-small .next-pagination-item:hover.next-prev:not([disabled]) i{color:#333}.next-pagination[dir=rtl].next-medium .next-pagination-list{margin:0 4px}.next-pagination[dir=rtl].next-medium .next-pagination-total{line-height:32px;vertical-align:middle}.next-pagination[dir=rtl].next-medium .next-pagination-item{padding:0 10px;border-width:1px;border-radius:3px}.next-pagination[dir=rtl].next-medium .next-pagination-item+.next-pagination-item{margin:0 4px 0 0}.next-pagination[dir=rtl].next-medium .next-pagination-ellipsis{height:32px;line-height:32px;margin-left:8px;margin-right:8px}.next-pagination[dir=rtl].next-medium .next-pagination-ellipsis .next-icon-remote,.next-pagination[dir=rtl].next-medium .next-pagination-ellipsis:before{width:12px;font-size:12px;line-height:inherit}.next-pagination[dir=rtl].next-medium .next-pagination-display,.next-pagination[dir=rtl].next-medium .next-pagination-display em,.next-pagination[dir=rtl].next-medium .next-pagination-jump-text{font-size:14px}.next-pagination[dir=rtl].next-medium .next-pagination-jump-input{width:36px}.next-pagination[dir=rtl].next-medium .next-pagination-size-selector-title{height:32px;line-height:32px;font-size:14px;vertical-align:middle}.next-pagination[dir=rtl].next-medium .next-pagination-size-selector-btn{padding:0 12px}.next-pagination[dir=rtl].next-medium .next-pagination-item.next-next:not([disabled]) i,.next-pagination[dir=rtl].next-medium .next-pagination-item.next-prev:not([disabled]) i{color:#666}.next-pagination[dir=rtl].next-medium .next-pagination-item:hover.next-next:not([disabled]) i,.next-pagination[dir=rtl].next-medium .next-pagination-item:hover.next-prev:not([disabled]) i{color:#333}.next-pagination[dir=rtl].next-large .next-pagination-list{margin:0 8px}.next-pagination[dir=rtl].next-large .next-pagination-total{line-height:40px;vertical-align:middle}.next-pagination[dir=rtl].next-large .next-pagination-item{padding:0 15px;border-width:1px;border-radius:3px}.next-pagination[dir=rtl].next-large .next-pagination-item+.next-pagination-item{margin:0 8px 0 0}.next-pagination[dir=rtl].next-large .next-pagination-ellipsis{height:40px;line-height:40px;margin-left:8px;margin-right:8px}.next-pagination[dir=rtl].next-large .next-pagination-ellipsis .next-icon-remote,.next-pagination[dir=rtl].next-large .next-pagination-ellipsis:before{width:16px;font-size:16px;line-height:inherit}.next-pagination[dir=rtl].next-large .next-pagination-display,.next-pagination[dir=rtl].next-large .next-pagination-display em,.next-pagination[dir=rtl].next-large .next-pagination-jump-text{font-size:16px}.next-pagination[dir=rtl].next-large .next-pagination-jump-input{width:48px}.next-pagination[dir=rtl].next-large .next-pagination-size-selector-title{height:40px;line-height:40px;font-size:16px;vertical-align:middle}.next-pagination[dir=rtl].next-large .next-pagination-size-selector-btn{padding:0 16px}.next-pagination[dir=rtl].next-large .next-pagination-item.next-next:not([disabled]) i,.next-pagination[dir=rtl].next-large .next-pagination-item.next-prev:not([disabled]) i{color:#666}.next-pagination[dir=rtl].next-large .next-pagination-item:hover.next-next:not([disabled]) i,.next-pagination[dir=rtl].next-large .next-pagination-item:hover.next-prev:not([disabled]) i{color:#333}.next-pagination{font-size:0}.next-pagination,.next-pagination *,.next-pagination :after,.next-pagination :before{box-sizing:border-box}.next-pagination:after{visibility:hidden;display:block;height:0;font-size:0;content:" ";clear:both}.next-pagination-total{display:inline-block;font-size:14px;margin-right:16px}.next-pagination-pages{display:inline-block}.next-pagination-list{display:inline-block;vertical-align:top}.next-pagination .next-pagination-item:not([disabled]){display:inline-block;border-style:solid;border-color:#ddd;background:#fff;color:#333;box-shadow:none}.next-pagination .next-pagination-item{transition:none}.next-pagination .next-pagination-item.next-current{border-color:#209bfa;background:#209bfa;color:#fff;box-shadow:none}.next-pagination .next-pagination-item.next-current:focus,.next-pagination .next-pagination-item.next-current:hover{border-color:#209bfa;background:#fff;color:#209bfa;box-shadow:none}.next-pagination-ellipsis{display:inline-block;color:#999;vertical-align:top}.next-pagination-display{display:inline-block;margin:0 16px;color:#333;vertical-align:middle}.next-pagination-display em{font-style:normal;color:#209bfa}.next-pagination-jump-text{display:inline-block;vertical-align:middle;color:#999}.next-pagination-jump-input{margin:0 4px;vertical-align:top}.next-pagination-jump-go{margin-left:4px;vertical-align:top}.next-pagination-size-selector{display:inline-block;position:relative}.next-pagination-size-selector-title{margin-right:4px;color:#999}.next-pagination-size-selector-filter{display:inline-block;vertical-align:middle}.next-pagination-size-selector-dropdown{vertical-align:top;min-width:64px}.next-pagination-size-selector-dropdown .next-select-inner,.next-pagination-size-selector-popup{min-width:64px}.next-pagination-size-selector-btn.next-btn-text{height:auto;line-height:normal;color:#666;border-radius:0}.next-pagination-size-selector-btn.next-btn-text.next-current{color:#209bfa}.next-pagination-size-selector-btn.next-btn-text+.next-pagination-size-selector-btn{border-left:1px solid #e6e6e6}.next-pagination-pages+.next-pagination-size-selector,.next-pagination-size-selector+.next-pagination-pages{margin-left:40px}.next-pagination.next-hide{display:none}.next-pagination.next-start .next-pagination-pages{float:right}.next-pagination.next-end .next-pagination-pages,.next-pagination.next-start .next-pagination-size-selector{float:left}.next-pagination.next-end .next-pagination-size-selector{float:right}.next-pagination.next-small .next-pagination-list{margin:0 4px}.next-pagination.next-small .next-pagination-total{line-height:24px;vertical-align:middle}.next-pagination.next-small .next-pagination-item{padding:0 6px;border-width:1px;border-radius:3px}.next-pagination.next-small .next-pagination-item+.next-pagination-item{margin:0 0 0 4px}.next-pagination.next-small .next-pagination-ellipsis{height:24px;line-height:24px;margin-left:8px;margin-right:8px}.next-pagination.next-small .next-pagination-ellipsis .next-icon-remote,.next-pagination.next-small .next-pagination-ellipsis:before{width:12px;font-size:12px;line-height:inherit}.next-pagination.next-small .next-pagination-display,.next-pagination.next-small .next-pagination-display em,.next-pagination.next-small .next-pagination-jump-text{font-size:12px}.next-pagination.next-small .next-pagination-jump-input{width:28px}.next-pagination.next-small .next-pagination-size-selector-title{height:24px;line-height:24px;font-size:12px;vertical-align:middle}.next-pagination.next-small .next-pagination-size-selector-btn{padding:0 8px}.next-pagination.next-small .next-pagination-item.next-next:not([disabled]) i,.next-pagination.next-small .next-pagination-item.next-prev:not([disabled]) i{color:#666}.next-pagination.next-small .next-pagination-item:hover.next-next:not([disabled]) i,.next-pagination.next-small .next-pagination-item:hover.next-prev:not([disabled]) i{color:#333}.next-pagination.next-small.next-arrow-only .next-pagination-item.next-next,.next-pagination.next-small.next-arrow-only .next-pagination-item.next-prev{width:20px;padding:0}.next-pagination.next-small.next-arrow-only .next-pagination-item.next-next .next-icon,.next-pagination.next-small.next-arrow-only .next-pagination-item.next-prev .next-icon{margin:0 auto}.next-pagination.next-small.next-arrow-prev-only .next-pagination-item.next-prev{width:20px;padding:0}.next-pagination.next-small.next-arrow-prev-only .next-pagination-item.next-prev .next-icon{margin:0 auto}.next-pagination.next-small.next-no-border .next-pagination-item.next-next,.next-pagination.next-small.next-no-border .next-pagination-item.next-prev{padding:0;border:none;background-color:transparent;box-shadow:none}.next-pagination.next-small.next-no-border .next-pagination-item.next-next .next-icon,.next-pagination.next-small.next-no-border .next-pagination-item.next-prev .next-icon{margin:0}.next-pagination.next-small.next-no-border .next-pagination-item.next-next:not([disabled]):hover i,.next-pagination.next-small.next-no-border .next-pagination-item.next-prev:not([disabled]):hover i{color:#209bfa}.next-pagination.next-small.next-no-border .next-pagination-display{margin:0 8px}.next-pagination.next-small.next-mini .next-pagination-item.next-prev{margin-right:4px}.next-pagination.next-small.next-mini .next-pagination-item.next-next{margin-left:4px}.next-pagination.next-medium .next-pagination-list{margin:0 4px}.next-pagination.next-medium .next-pagination-total{line-height:32px;vertical-align:middle}.next-pagination.next-medium .next-pagination-item{padding:0 10px;border-width:1px;border-radius:3px}.next-pagination.next-medium .next-pagination-item+.next-pagination-item{margin:0 0 0 4px}.next-pagination.next-medium .next-pagination-ellipsis{height:32px;line-height:32px;margin-left:8px;margin-right:8px}.next-pagination.next-medium .next-pagination-ellipsis .next-icon-remote,.next-pagination.next-medium .next-pagination-ellipsis:before{width:12px;font-size:12px;line-height:inherit}.next-pagination.next-medium .next-pagination-display,.next-pagination.next-medium .next-pagination-display em,.next-pagination.next-medium .next-pagination-jump-text{font-size:14px}.next-pagination.next-medium .next-pagination-jump-input{width:36px}.next-pagination.next-medium .next-pagination-size-selector-title{height:32px;line-height:32px;font-size:14px;vertical-align:middle}.next-pagination.next-medium .next-pagination-size-selector-btn{padding:0 12px}.next-pagination.next-medium .next-pagination-item.next-next:not([disabled]) i,.next-pagination.next-medium .next-pagination-item.next-prev:not([disabled]) i{color:#666}.next-pagination.next-medium .next-pagination-item:hover.next-next:not([disabled]) i,.next-pagination.next-medium .next-pagination-item:hover.next-prev:not([disabled]) i{color:#333}.next-pagination.next-medium.next-arrow-only .next-pagination-item.next-next,.next-pagination.next-medium.next-arrow-only .next-pagination-item.next-prev{width:28px;padding:0}.next-pagination.next-medium.next-arrow-only .next-pagination-item.next-next .next-icon,.next-pagination.next-medium.next-arrow-only .next-pagination-item.next-prev .next-icon{margin:0 auto}.next-pagination.next-medium.next-arrow-prev-only .next-pagination-item.next-prev{width:28px;padding:0}.next-pagination.next-medium.next-arrow-prev-only .next-pagination-item.next-prev .next-icon{margin:0 auto}.next-pagination.next-medium.next-no-border .next-pagination-item.next-next,.next-pagination.next-medium.next-no-border .next-pagination-item.next-prev{padding:0;border:none;background-color:transparent;box-shadow:none}.next-pagination.next-medium.next-no-border .next-pagination-item.next-next .next-icon,.next-pagination.next-medium.next-no-border .next-pagination-item.next-prev .next-icon{margin:0}.next-pagination.next-medium.next-no-border .next-pagination-item.next-next:not([disabled]):hover i,.next-pagination.next-medium.next-no-border .next-pagination-item.next-prev:not([disabled]):hover i{color:#209bfa}.next-pagination.next-medium.next-no-border .next-pagination-display{margin:0 12px}.next-pagination.next-medium.next-mini .next-pagination-item.next-prev{margin-right:4px}.next-pagination.next-medium.next-mini .next-pagination-item.next-next{margin-left:4px}.next-pagination.next-large .next-pagination-list{margin:0 8px}.next-pagination.next-large .next-pagination-total{line-height:40px;vertical-align:middle}.next-pagination.next-large .next-pagination-item{padding:0 15px;border-width:1px;border-radius:3px}.next-pagination.next-large .next-pagination-item+.next-pagination-item{margin:0 0 0 8px}.next-pagination.next-large .next-pagination-ellipsis{height:40px;line-height:40px;margin-left:8px;margin-right:8px}.next-pagination.next-large .next-pagination-ellipsis .next-icon-remote,.next-pagination.next-large .next-pagination-ellipsis:before{width:16px;font-size:16px;line-height:inherit}.next-pagination.next-large .next-pagination-display,.next-pagination.next-large .next-pagination-display em,.next-pagination.next-large .next-pagination-jump-text{font-size:16px}.next-pagination.next-large .next-pagination-jump-input{width:48px}.next-pagination.next-large .next-pagination-size-selector-title{height:40px;line-height:40px;font-size:16px;vertical-align:middle}.next-pagination.next-large .next-pagination-size-selector-btn{padding:0 16px}.next-pagination.next-large .next-pagination-item.next-next:not([disabled]) i,.next-pagination.next-large .next-pagination-item.next-prev:not([disabled]) i{color:#666}.next-pagination.next-large .next-pagination-item:hover.next-next:not([disabled]) i,.next-pagination.next-large .next-pagination-item:hover.next-prev:not([disabled]) i{color:#333}.next-pagination.next-large.next-arrow-only .next-pagination-item.next-next,.next-pagination.next-large.next-arrow-only .next-pagination-item.next-prev{width:40px;padding:0}.next-pagination.next-large.next-arrow-only .next-pagination-item.next-next .next-icon,.next-pagination.next-large.next-arrow-only .next-pagination-item.next-prev .next-icon{margin:0 auto}.next-pagination.next-large.next-arrow-prev-only .next-pagination-item.next-prev{width:40px;padding:0}.next-pagination.next-large.next-arrow-prev-only .next-pagination-item.next-prev .next-icon{margin:0 auto}.next-pagination.next-large.next-no-border .next-pagination-item.next-next,.next-pagination.next-large.next-no-border .next-pagination-item.next-prev{padding:0;border:none;background-color:transparent;box-shadow:none}.next-pagination.next-large.next-no-border .next-pagination-item.next-next .next-icon,.next-pagination.next-large.next-no-border .next-pagination-item.next-prev .next-icon{margin:0}.next-pagination.next-large.next-no-border .next-pagination-item.next-next:not([disabled]):hover i,.next-pagination.next-large.next-no-border .next-pagination-item.next-prev:not([disabled]):hover i{color:#209bfa}.next-pagination.next-large.next-no-border .next-pagination-display{margin:0 16px}.next-pagination.next-large.next-mini .next-pagination-item.next-prev{margin-right:8px}.next-pagination.next-large.next-mini .next-pagination-item.next-next{margin-left:8px}.next-pagination-icon-prev:before{content:"顦�"}.next-pagination-icon-next:before{content:"顦�"}.next-pagination-icon-ellipsis:before{content:"顧�"}.next-paragraph{color:#333}.next-paragraph-short{line-height:1.5}.next-paragraph-long{line-height:1.7}.next-paragraph-medium,.next-paragraph-small{font-size:14px}.next-progress-circle[dir=rtl] .next-progress-circle-container{transform:scaleX(-1)}.next-progress-line[dir=rtl] .next-progress-line-overlay{left:auto;right:0}.next-progress-line,.next-progress-line *,.next-progress-line :after,.next-progress-line :before{box-sizing:border-box}.next-progress-line{width:100%;display:inline-block;position:relative}.next-progress-line-container{display:inline-block;width:100%;vertical-align:middle}.next-progress-line-underlay{position:relative;overflow:hidden;width:100%;background:#f5f5f5}.next-progress-line-overlay{position:absolute;left:0;top:0;transition:all .3s ease}.next-progress-line-overlay-normal{background:#209bfa}.next-progress-line-overlay-success{background:#1ad78c}.next-progress-line-overlay-error,.next-progress-line-overlay-started{background:#d23c26}.next-progress-line-overlay-middle{background:#f1c826}.next-progress-line-overlay-finishing{background:#1ad78c}.next-progress-line.next-small .next-progress-line-underlay{border-radius:12px;height:4px}.next-progress-line.next-small .next-progress-line-overlay{height:4px;border-radius:12px;top:50%;margin-top:-2px}.next-progress-line.next-small .next-progress-line-text{font-size:12px;line-height:4px}.next-progress-line.next-medium .next-progress-line-underlay{border-radius:12px;height:8px}.next-progress-line.next-medium .next-progress-line-overlay{height:8px;border-radius:12px;top:50%;margin-top:-4px}.next-progress-line.next-medium .next-progress-line-text{font-size:12px;line-height:8px}.next-progress-line.next-large .next-progress-line-underlay{border-radius:12px;height:12px}.next-progress-line.next-large .next-progress-line-overlay{height:12px;border-radius:12px;top:50%;margin-top:-6px}.next-progress-line.next-large .next-progress-line-text{font-size:14px;line-height:12px}.next-progress-line-show-info .next-progress-line-container{padding-right:60px;margin-right:-60px}.next-progress-line-show-info .next-progress-line-text{width:50px;text-align:left;margin-left:10px;vertical-align:middle;display:inline-block;color:#333}.next-progress-line-show-border .next-progress-line-underlay{border:1px solid #e6e6e6}.next-progress-line-show-border.next-small .next-progress-line-underlay{border-radius:12px;height:6px}.next-progress-line-show-border.next-small .next-progress-line-overlay{height:4px;border-radius:12px;top:50%;margin-top:-2px}.next-progress-line-show-border.next-small .next-progress-line-text{font-size:12px;line-height:6px}.next-progress-line-show-border.next-medium .next-progress-line-underlay{border-radius:12px;height:10px}.next-progress-line-show-border.next-medium .next-progress-line-overlay{height:8px;border-radius:12px;top:50%;margin-top:-4px}.next-progress-line-show-border.next-medium .next-progress-line-text{font-size:12px;line-height:10px}.next-progress-line-show-border.next-large .next-progress-line-underlay{border-radius:12px;height:14px}.next-progress-line-show-border.next-large .next-progress-line-overlay{height:12px;border-radius:12px;top:50%;margin-top:-6px}.next-progress-line-show-border.next-large .next-progress-line-text{font-size:14px;line-height:14px}.next-progress-circle,.next-progress-circle *,.next-progress-circle :after,.next-progress-circle :before{box-sizing:border-box}.next-progress-circle{position:relative;display:inline-block}.next-progress-circle-underlay{stroke-width:8px;stroke:#f5f5f5}.next-progress-circle-overlay{transition:all .3s ease;stroke-linecap:round;stroke-width:8px}.next-progress-circle-overlay-normal{stroke:#209bfa}.next-progress-circle-overlay-success{stroke:#1ad78c}.next-progress-circle-overlay-error,.next-progress-circle-overlay-started{stroke:#d23c26}.next-progress-circle-overlay-middle{stroke:#f1c826}.next-progress-circle-overlay-finishing{stroke:#1ad78c}.next-progress-circle.next-small{width:100px;height:100px;font-size:20px}.next-progress-circle.next-medium{width:116px;height:116px;font-size:24px}.next-progress-circle.next-large{width:132px;height:132px;font-size:36px}.next-progress-circle-text{display:block;position:absolute;width:100%;top:50%;left:0;text-align:center;line-height:1;-webkit-transform:translateY(-50%);transform:translateY(-50%);transition:transform .3s ease;color:#333}.next-range{width:100%;font-family:inherit;font-weight:400;font-size:inherit;line-height:inherit;vertical-align:baseline;display:flex;flex-direction:column;cursor:pointer}.next-range,.next-range *,.next-range :after,.next-range :before{box-sizing:border-box}.next-range .next-range-inner{position:relative}.next-range .next-range-inner:only-child{margin-top:auto;margin-bottom:auto}.next-range .next-range-track{position:absolute;width:100%;top:50%;border-radius:0}.next-range .next-range-selected{position:absolute;width:0;top:50%;left:0;border-radius:0}.next-range .next-range-scale{position:relative;width:100%;height:12px}.next-range .next-range-scale .next-range-scale-item{position:absolute;left:0;width:2px;border:1px solid;border-radius:0}.next-range .next-range-scale .next-range-scale-item:last-child{margin-left:-2px}.next-range .next-range-slider{position:absolute;top:50%;left:0;border-radius:50%}.next-range .next-range-slider-inner{position:absolute;top:50%;left:50%;border:1px solid #ddd;border-radius:50%;transition:transform .1s linear,border-color .1s linear}.next-range .next-range-frag.next-range-active .next-range-slider .next-range-slider-inner,.next-range .next-range-slider.next-range-slider-moving .next-range-slider-inner{border:2px solid #209bfa;box-shadow:4px 4px 8px 0 rgba(0,0,0,.12);transform:scale(1.2)}.next-range .next-range-mark{position:relative;cursor:auto}.next-range .next-range-mark .next-range-mark-text{position:absolute;left:0;transform:translateX(-50%);padding-left:2px;text-align:center}.next-range .next-range-frag{position:absolute;top:0}.next-range .next-range-frag .next-range-slider{left:0}.next-range .next-range-frag .next-range-slider:nth-child(2){left:100%}.next-range .next-range-frag .next-range-selected{width:100%}.next-range.disabled{cursor:not-allowed}.next-range.disabled .next-range-mark{cursor:auto}.next-range .next-range-track,.next-range .next-range-track:hover{background:#ddd}.next-range .next-range-selected,.next-range .next-range-selected:hover{background:#209bfa}.next-range .next-range-scale .next-range-scale-item{border-color:#ddd;background:#ddd}.next-range .next-range-scale .next-range-scale-item:hover{border-color:#ddd}.next-range .next-range-scale .next-range-scale-item.activated{border-color:#209bfa;background:#209bfa}.next-range .next-range-scale .next-range-scale-item.activated:hover{border-color:#209bfa}.next-range .next-range-slider-inner{background:#fff;border-color:#ddd}.next-range .next-range-slider-inner:hover{background:#fff;box-shadow:20px 20px 30px 0 rgba(0,0,0,.15);transform:scale(1.2)}.next-range .next-range-mark .next-range-mark-text,.next-range .next-range-mark .next-range-mark-text:hover{color:#999}.next-range .next-range-mark .next-range-mark-text.activated,.next-range .next-range-mark .next-range-mark-text.activated:hover{color:#333}.next-range.disabled .next-range-track{background:#ddd}.next-range.disabled .next-range-selected{background:#ccc}.next-range.disabled .next-range-scale-item{border-color:#ddd}.next-range.disabled .next-range-scale-item.activated{border-color:#ccc}.next-range.disabled .next-range-slider-inner{background:#eee;border-color:#eee;transform:none;box-shadow:none}.next-range.disabled .next-range-mark-text{color:#ccc}.next-range.disabled .next-range-mark-text.activated{color:#999}.next-range .next-range-selected,.next-range .next-range-track{height:4px;margin-top:-2px}.next-range .next-range-frag{margin-top:4px;height:4px}.next-range .next-range-slider{box-shadow:1px 1px 3px 0 rgba(0,0,0,.12)}.next-range .next-range-slider,.next-range .next-range-slider-inner{height:16px;width:16px;margin-top:-8px;margin-left:-8px}.next-range .next-range-mark{display:block}.next-range .next-range-mark .next-range-mark-text{font-size:14px;font-weight:400;line-height:20px;height:20px}.next-range .next-range-mark.next-range-mark-below{height:30px}.next-range .next-range-mark.next-range-mark-below .next-range-mark-text{bottom:0}.next-range .next-range-mark.next-range-mark-above{height:30px}.next-range .next-range-scale .next-range-scale-item{height:12px}.next-range.simulation-hover>.next-range-slider-inner{background:#fff;box-shadow:20px 20px 30px 0 rgba(0,0,0,.15);transform:scale(1.2)}.next-range.simulation-hover .next-range-selected{background:#209bfa}.next-range.simulation-hover .next-range-track{background:#ddd}.next-range.simulation-hover .next-range-scale-item{border-color:#ddd}.next-range.simulation-hover .next-range-scale-item.activated{border-color:#209bfa}.next-range.simulation-click>.next-range-slider-inner{border:2px solid #209bfa;box-shadow:4px 4px 8px 0 rgba(0,0,0,.12);transform:scale(1.2)}.next-range[dir=rtl] .next-range-mark{position:relative;cursor:auto}.next-range[dir=rtl] .next-range-mark .next-range-mark-text{position:absolute;right:0;transform:translateX(50%);padding-right:2px;text-align:center}.next-rating[dir=rtl] .next-rating-overlay{right:0;left:auto}.next-rating[dir=rtl] .next-rating-overlay .next-rating-icon,.next-rating[dir=rtl] .next-rating-underlay .next-rating-icon{margin-right:4px;margin-left:0}.next-rating[dir=rtl] .next-rating-overlay .next-rating-icon:last-child,.next-rating[dir=rtl] .next-rating-underlay .next-rating-icon:last-child{margin-left:4px}.next-rating{vertical-align:top;display:inline-block;position:relative}.next-rating:after{visibility:hidden;display:block;height:0;font-size:0;content:" ";clear:both}.next-rating-base,.next-rating-text{float:left}.next-rating-base-disabled,.next-rating-base-disabled .next-rating-overlay .next-rating-icon,.next-rating-base-disabled .next-rating-underlay .next-rating-icon{cursor:not-allowed}.next-rating-symbol-icon:before{content:"顦�"}.next-rating-underlay{white-space:nowrap;overflow:hidden}.next-rating-underlay .next-icon{color:#f2f2f2}.next-rating-stroke-mode .next-rating-underlay .next-icon{color:transparent;-webkit-text-stroke:1px #209bfa}.next-rating-overlay{white-space:nowrap;overflow:hidden;position:absolute;width:0;top:0;left:0}.next-rating-overlay .next-icon{color:#209bfa}.next-rating-overlay .next-rating-icon,.next-rating-underlay .next-rating-icon{cursor:pointer;margin-left:4px}.next-rating-overlay .next-rating-icon:last-child,.next-rating-underlay .next-rating-icon:last-child{margin-right:4px}.next-rating-overlay .next-icon,.next-rating-underlay .next-icon{transition:all .1s linear}.next-rating-overlay .next-icon.hover,.next-rating-underlay .next-icon.hover{transform:scale3d(1.1,1.1,1.1)}.next-rating-overlay .next-icon.clicked,.next-rating-underlay .next-icon.clicked{transform:scale3d(.9,.9,.9)}.next-rating-info{position:absolute;top:calc(100% + 4px);left:0;border:1px solid #f2f2f2;background:#fff;padding:4px 8px 3px;font-size:12px;white-space:nowrap}.next-rating-info:after{position:absolute;content:"";width:4px;height:4px;transform:rotate(45deg);background:#fff;border-color:#f2f2f2 transparent transparent #f2f2f2;border-style:solid;border-width:1px;top:-3px;left:4px}.next-rating.hover,.next-rating:focus .next-rating-base:not(.next-rating-base-disabled){outline:none}.next-rating.hover .next-rating-overlay .next-icon,.next-rating:focus .next-rating-base:not(.next-rating-base-disabled) .next-rating-overlay .next-icon{color:#209bfa}.next-rating-grade-low.hover .next-rating-overlay .next-icon,.next-rating-grade-low .next-rating-overlay .next-icon{color:#666}.next-rating-grade-high.hover .next-rating-overlay .next-icon,.next-rating-grade-high .next-rating-overlay .next-icon{color:#209bfa}.next-rating-small{font-size:12px}.next-rating-small .next-icon .next-icon-remote,.next-rating-small .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-rating-small .next-rating-text{margin-left:8px}.next-rating-medium{font-size:14px}.next-rating-medium .next-icon .next-icon-remote,.next-rating-medium .next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-rating-medium .next-rating-text{margin-left:12px}.next-rating-large{font-size:16px}.next-rating-large .next-icon .next-icon-remote,.next-rating-large .next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-rating-large .next-rating-text{margin-left:16px}.next-search-simple[dir=rtl].next-large .next-search-icon{margin-left:12px;margin-right:0}.next-search-simple[dir=rtl].next-medium .next-search-icon{margin-left:8px;margin-right:0}.next-search-simple[dir=rtl].next-normal .next-search-left .next-search-left-addon{border-left:1px solid #ddd;border-right:none}.next-search-simple[dir=rtl].next-dark .next-search-left{border-color:#666}.next-search-simple[dir=rtl].next-dark .next-search-left .next-search-left-addon{border-right:1px solid #ddd}.next-search-simple[dir=rtl].next-dark:hover .next-search-left{border-color:#999}.next-search-simple[dir=rtl].next-dark .next-search-icon{color:#666}.next-search-simple[dir=rtl].next-dark .next-search-icon:hover{color:#999}.next-search-normal[dir=rtl] .next-search-left{border-left:none;border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-left-radius:0;border-bottom-left-radius:0}.next-search-normal[dir=rtl] .next-search-btn.next-btn{border-radius:3px 0 0 3px!important}.next-search-normal[dir=rtl] .next-input{border-radius:0 3px 3px 0}.next-search-normal[dir=rtl].next-primary .next-input{border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px}.next-search-normal[dir=rtl].next-primary .next-search-left .next-search-left-addon{border-left:1px solid #eee;border-right:none}.next-search-normal[dir=rtl].next-secondary .next-input{border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px}.next-search-normal[dir=rtl].next-secondary .next-search-left .next-search-left-addon{border-left:1px solid #eee;border-right:none}.next-search-normal[dir=rtl].next-normal .next-input{border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px}.next-search-normal[dir=rtl].next-normal .next-search-left .next-search-left-addon{border-left:1px solid #eee;border-right:none}.next-search-normal[dir=rtl].next-dark .next-search-left .next-search-left-addon{border-left:1px solid #209bfa;border-right:none}.next-search{width:100%;display:inline-block}.next-search,.next-search *,.next-search :after,.next-search :before{box-sizing:border-box}.next-search .next-input,.next-search .next-select{border:none;box-shadow:none}.next-search .next-select .next-input,.next-search .next-select .next-input .next-input-text-field{height:auto}.next-search .next-search-left{border-style:solid;transition:all .1s linear}.next-search .next-search-left-addon .next-input,.next-search .next-search-left-addon .next-select-trigger-search{min-height:100%;border-bottom-right-radius:0;border-top-right-radius:0}.next-search .next-search-left-addon .next-select-values{line-height:1}.next-search .next-search-left-addon.next-input-group-addon .next-select{margin:0}.next-search .next-search-left-addon+.next-search-input .next-input{border-bottom-left-radius:0;border-top-left-radius:0}.next-search .next-search-input{width:100%}.next-search .next-search-btn{box-shadow:none}.next-search .next-search-symbol-icon:before{content:"顧�"}.next-search-normal{width:600px}.next-search-normal .next-search-left{border-top-left-radius:3px;border-bottom-left-radius:3px}.next-search-normal .next-input{border-radius:3px 0 0 3px}.next-search-normal .next-btn{border-radius:0 3px 3px 0}.next-search-normal.next-primary .next-search-left{border-color:#209bfa}.next-search-normal.next-primary .next-search-left .next-search-left-addon{border-right:1px solid #eee}.next-search-normal.next-primary:hover .next-btn,.next-search-normal.next-primary:hover .next-search-left{border-color:#209bfa}.next-search-normal.next-primary .next-search-btn{background:#209bfa;border-color:#209bfa;color:#fff}.next-search-normal.next-primary .next-search-btn:hover{background:#1274e7;border-color:#209bfa;color:#fff}.next-search-normal.next-primary .next-search-btn .next-icon,.next-search-normal.next-primary .next-search-btn .next-icon:hover{color:#fff}.next-search-normal.next-primary.next-large{box-shadow:none}.next-search-normal.next-primary.next-large .next-search-btn,.next-search-normal.next-primary.next-large .next-search-left{border-width:1px;height:40px}.next-search-normal.next-primary.next-large .next-search-input{height:38px;overflow-y:hidden}.next-search-normal.next-primary.next-large .next-search-input input{height:38px;line-height:38px \0 }.next-search-normal.next-primary.next-large .next-select{height:38px}.next-search-normal.next-primary.next-large .next-search-btn{font-size:16px}.next-search-normal.next-primary.next-large .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-primary.next-large .next-search-btn .next-icon:before{width:24px;font-size:24px;line-height:inherit}.next-search-normal.next-primary.next-large .next-search-btn .next-search-btn-text{display:inline-block;padding-left:0}.next-search-normal.next-primary.next-medium{box-shadow:none}.next-search-normal.next-primary.next-medium .next-search-btn,.next-search-normal.next-primary.next-medium .next-search-left{border-width:1px;height:32px}.next-search-normal.next-primary.next-medium .next-search-input{height:30px;overflow-y:hidden}.next-search-normal.next-primary.next-medium .next-search-input input{height:30px;line-height:30px \0 }.next-search-normal.next-primary.next-medium .next-select{height:30px}.next-search-normal.next-primary.next-medium .next-search-btn{font-size:16px}.next-search-normal.next-primary.next-medium .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-primary.next-medium .next-search-btn .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-search-normal.next-primary.next-medium .next-search-btn .next-search-btn-text{display:inline-block;padding-left:0}.next-search-normal.next-primary .next-input{border-top-left-radius:2px;border-bottom-left-radius:2px}.next-search-normal.next-secondary .next-search-left{border-color:#ddd}.next-search-normal.next-secondary .next-search-left .next-search-left-addon{border-right:1px solid #eee}.next-search-normal.next-secondary:hover .next-btn,.next-search-normal.next-secondary:hover .next-search-left{border-color:#209bfa}.next-search-normal.next-secondary .next-search-btn{background:#209bfa;border-color:#209bfa;color:#fff}.next-search-normal.next-secondary .next-search-btn:hover{background:#1274e7;border-color:#209bfa;color:#fff}.next-search-normal.next-secondary .next-search-btn .next-icon,.next-search-normal.next-secondary .next-search-btn .next-icon:hover{color:#fff}.next-search-normal.next-secondary.next-large{box-shadow:none}.next-search-normal.next-secondary.next-large .next-search-btn,.next-search-normal.next-secondary.next-large .next-search-left{border-width:1px;height:40px}.next-search-normal.next-secondary.next-large .next-search-input{height:38px;overflow-y:hidden}.next-search-normal.next-secondary.next-large .next-search-input input{height:38px;line-height:38px \0 }.next-search-normal.next-secondary.next-large .next-select{height:38px}.next-search-normal.next-secondary.next-large .next-search-btn{font-size:16px}.next-search-normal.next-secondary.next-large .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-secondary.next-large .next-search-btn .next-icon:before{width:24px;font-size:24px;line-height:inherit}.next-search-normal.next-secondary.next-large .next-search-btn .next-search-btn-text{display:inline-block;padding-left:0}.next-search-normal.next-secondary.next-medium{box-shadow:none}.next-search-normal.next-secondary.next-medium .next-search-btn,.next-search-normal.next-secondary.next-medium .next-search-left{border-width:1px;height:32px}.next-search-normal.next-secondary.next-medium .next-search-input{height:30px;overflow-y:hidden}.next-search-normal.next-secondary.next-medium .next-search-input input{height:30px;line-height:30px \0 }.next-search-normal.next-secondary.next-medium .next-select{height:30px}.next-search-normal.next-secondary.next-medium .next-search-btn{font-size:16px}.next-search-normal.next-secondary.next-medium .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-secondary.next-medium .next-search-btn .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-search-normal.next-secondary.next-medium .next-search-btn .next-search-btn-text{display:inline-block;padding-left:0}.next-search-normal.next-secondary .next-input{border-top-left-radius:2px;border-bottom-left-radius:2px}.next-search-normal.next-normal .next-search-left{border-color:#ddd}.next-search-normal.next-normal .next-search-left .next-search-left-addon{border-right:1px solid #eee}.next-search-normal.next-normal:hover .next-btn,.next-search-normal.next-normal:hover .next-search-left{border-color:#ccc}.next-search-normal.next-normal .next-search-btn{background:#fafafa;border-color:#ddd;color:#666}.next-search-normal.next-normal .next-search-btn:hover{background:#f5f5f5;border-color:#ccc;color:#333}.next-search-normal.next-normal .next-search-btn .next-icon{color:#666}.next-search-normal.next-normal .next-search-btn .next-icon:hover{color:#333}.next-search-normal.next-normal.next-large{box-shadow:none}.next-search-normal.next-normal.next-large .next-search-btn,.next-search-normal.next-normal.next-large .next-search-left{border-width:1px;height:40px}.next-search-normal.next-normal.next-large .next-search-input{height:38px;overflow-y:hidden}.next-search-normal.next-normal.next-large .next-search-input input{height:38px;line-height:38px \0 }.next-search-normal.next-normal.next-large .next-select{height:38px}.next-search-normal.next-normal.next-large .next-search-btn{font-size:16px}.next-search-normal.next-normal.next-large .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-normal.next-large .next-search-btn .next-icon:before{width:24px;font-size:24px;line-height:inherit}.next-search-normal.next-normal.next-large .next-search-btn .next-search-btn-text{display:inline-block;padding-left:0}.next-search-normal.next-normal.next-medium{box-shadow:none}.next-search-normal.next-normal.next-medium .next-search-btn,.next-search-normal.next-normal.next-medium .next-search-left{border-width:1px;height:32px}.next-search-normal.next-normal.next-medium .next-search-input{height:30px;overflow-y:hidden}.next-search-normal.next-normal.next-medium .next-search-input input{height:30px;line-height:30px \0 }.next-search-normal.next-normal.next-medium .next-select{height:30px}.next-search-normal.next-normal.next-medium .next-search-btn{font-size:16px}.next-search-normal.next-normal.next-medium .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-normal.next-medium .next-search-btn .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-search-normal.next-normal.next-medium .next-search-btn .next-search-btn-text{display:inline-block;padding-left:0}.next-search-normal.next-normal .next-input{border-top-left-radius:2px;border-bottom-left-radius:2px}.next-search-normal.next-dark .next-search-left{border-color:#209bfa}.next-search-normal.next-dark .next-search-left .next-search-left-addon{border-right:1px solid #209bfa}.next-search-normal.next-dark:hover .next-btn,.next-search-normal.next-dark:hover .next-search-left{border-color:#209bfa}.next-search-normal.next-dark .next-search-btn{background:#209bfa;border-color:#209bfa;color:#fff}.next-search-normal.next-dark .next-search-btn:hover{background:#1274e7;border-color:#209bfa;color:#fff}.next-search-normal.next-dark .next-search-btn .next-icon,.next-search-normal.next-dark .next-search-btn .next-icon:hover,.next-search-normal.next-dark .next-select-inner,.next-search-normal.next-dark input{color:#fff}.next-search-normal.next-dark .next-input,.next-search-normal.next-dark .next-select{background:hsla(0,0%,100%,0)}.next-search-normal.next-dark.next-large{box-shadow:none}.next-search-normal.next-dark.next-large .next-search-btn,.next-search-normal.next-dark.next-large .next-search-left{border-width:1px;height:40px}.next-search-normal.next-dark.next-large .next-search-input{height:38px;overflow-y:hidden}.next-search-normal.next-dark.next-large .next-search-input input{height:38px;line-height:38px \0 }.next-search-normal.next-dark.next-large .next-select{height:38px}.next-search-normal.next-dark.next-large .next-search-btn{font-size:16px}.next-search-normal.next-dark.next-large .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-dark.next-large .next-search-btn .next-icon:before{width:24px;font-size:24px;line-height:inherit}.next-search-normal.next-dark.next-large .next-search-btn .next-search-btn-text{display:inline-block;padding-left:0}.next-search-normal.next-dark.next-medium{box-shadow:none}.next-search-normal.next-dark.next-medium .next-search-btn,.next-search-normal.next-dark.next-medium .next-search-left{border-width:1px;height:32px}.next-search-normal.next-dark.next-medium .next-search-input{height:30px;overflow-y:hidden}.next-search-normal.next-dark.next-medium .next-search-input input{height:30px;line-height:30px \0 }.next-search-normal.next-dark.next-medium .next-select{height:30px}.next-search-normal.next-dark.next-medium .next-search-btn{font-size:16px}.next-search-normal.next-dark.next-medium .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-dark.next-medium .next-search-btn .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-search-normal.next-dark.next-medium .next-search-btn .next-search-btn-text{display:inline-block;padding-left:0}.next-search-normal:not([dir=rtl]) .next-search-left{border-right:none}.next-search-simple{width:300px;box-shadow:none;border-radius:3px}.next-search-simple .next-search-icon{cursor:pointer;transition:all .1s linear}.next-search-simple .next-input,.next-search-simple .next-search-left{border-radius:3px}.next-search-simple.next-large .next-search-icon{margin-right:12px}.next-search-simple.next-medium .next-search-icon{margin-right:8px}.next-search-simple.next-normal .next-search-left{border-color:#ddd}.next-search-simple.next-normal .next-search-left .next-search-left-addon{border-right:1px solid #ddd}.next-search-simple.next-normal:hover .next-search-left{border-color:#ccc}.next-search-simple.next-normal .next-search-icon{color:#999}.next-search-simple.next-normal .next-search-icon:hover{color:#666}.next-search-simple.next-normal .next-search-left{border-width:1px}.next-search-simple.next-normal.next-large .next-search-icon .next-icon-remote,.next-search-simple.next-normal.next-large .next-search-icon:before{width:20px;font-size:20px;line-height:inherit}.next-search-simple.next-normal.next-medium .next-search-icon .next-icon-remote,.next-search-simple.next-normal.next-medium .next-search-icon:before{width:12px;font-size:12px;line-height:inherit}.next-search-simple.next-dark .next-search-left{border-color:#666}.next-search-simple.next-dark .next-search-left .next-search-left-addon{border-right:1px solid #ddd}.next-search-simple.next-dark:hover .next-search-left{border-color:#999}.next-search-simple.next-dark .next-search-icon{color:#666}.next-search-simple.next-dark .next-search-icon:hover{color:#999}.next-search-simple.next-dark .next-select-inner,.next-search-simple.next-dark input{color:#fff}.next-search-simple.next-dark .next-input,.next-search-simple.next-dark .next-select{background:hsla(0,0%,100%,0)}.next-search-simple.next-dark .next-search-left{border-width:1px}.next-search-simple.next-dark.next-large .next-search-icon .next-icon-remote,.next-search-simple.next-dark.next-large .next-search-icon:before,.next-search-simple.next-dark.next-medium .next-search-icon .next-icon-remote,.next-search-simple.next-dark.next-medium .next-search-icon:before{width:20px;font-size:20px;line-height:inherit}.next-search-simple .next-select.next-large{height:38px}.next-search-simple .next-select.next-medium{height:30px}.next-slick{position:relative;display:block;-webkit-touch-callout:none;user-select:none;-ms-touch-action:pan-y;touch-action:pan-y;-webkit-tap-highlight-color:rgba(0,0,0,0)}.next-slick,.next-slick *,.next-slick :after,.next-slick :before{box-sizing:border-box}.next-slick-initialized .next-slick-slide{display:block}.next-slick-list{position:relative;overflow:hidden;display:block;margin:0;padding:0;transform:translateZ(0)}.next-slick-list:focus{outline:none}.next-slick-list.dragging{cursor:pointer;cursor:hand}.next-slick-track{position:relative;top:0;left:0;display:block;transform:translateZ(0)}.next-slick-slide{float:left;height:100%;min-height:1px;outline:0;transition:all .1s linear}.next-slick[dir=rtl] .next-slick-slide{float:right}.next-slick-slide img{display:block}.next-slick-arrow{display:block;position:absolute;cursor:pointer;text-align:center;transition:all .1s linear}.next-slick-arrow.inner{color:#fff;background:#000;opacity:.2;padding:0;border:none}.next-slick-arrow.inner:focus,.next-slick-arrow.inner:hover{color:#fff;background:#000;opacity:.4}.next-slick-arrow.inner.disabled{color:#ccc;background:#fafafa;opacity:.5}.next-slick-arrow.outer{color:#666;background:transparent;opacity:.32;padding:0;border:none;border-radius:0}.next-slick-arrow.outer:focus,.next-slick-arrow.outer:hover{color:#333;background:transparent;opacity:.32}.next-slick-arrow.outer.disabled{color:#ccc;background:transparent;opacity:.32}.next-slick-arrow.disabled{cursor:not-allowed}.next-slick-dots{display:block;position:absolute;margin:0;padding:0}.next-slick-dots-item{position:relative;display:inline-block;cursor:pointer}.next-slick-dots-item button{cursor:pointer;border:0 solid #fff;outline:none;padding:0;height:8px;width:8px;border-radius:50%;background:rgba(0,0,0,.32)}.next-slick-dots-item button:focus,.next-slick-dots-item button:hover{background-color:rgba(0,0,0,.32);border-color:#fff}.next-slick-dots-item.active button{background:#209bfa;border-color:#fff;animation:zoom .3s cubic-bezier(.86,0,.07,1)}.next-slick-dots.hoz{width:100%;bottom:12px;left:0;text-align:center}.next-slick-dots.hoz .next-slick-dots-item{margin:0 4px}.next-slick-dots.ver{width:16px;top:0;right:20px;bottom:0;display:flex;justify-content:center;flex-direction:column}.next-slick-dots.ver .next-slick-dots-item{margin:0}.next-slick.next-slick-hoz.next-slick-outer{padding:0 24px}.next-slick.next-slick-hoz .next-slick-arrow.medium{width:28px;height:56px;line-height:56px}.next-slick.next-slick-hoz .next-slick-arrow.medium .next-icon .next-icon-remote,.next-slick.next-slick-hoz .next-slick-arrow.medium .next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-slick.next-slick-hoz .next-slick-arrow.medium.inner{top:calc(50% - 28px)}.next-slick.next-slick-hoz .next-slick-arrow.medium.inner.next-slick-prev{left:0}.next-slick.next-slick-hoz .next-slick-arrow.medium.inner.next-slick-next{right:0}.next-slick.next-slick-hoz .next-slick-arrow.medium.outer{top:calc(50% - 28px)}.next-slick.next-slick-hoz .next-slick-arrow.medium.outer.next-slick-prev{left:-4px}.next-slick.next-slick-hoz .next-slick-arrow.medium.outer.next-slick-next{right:-4px}.next-slick.next-slick-hoz .next-slick-arrow.large{width:48px;height:96px;line-height:96px}.next-slick.next-slick-hoz .next-slick-arrow.large .next-icon .next-icon-remote,.next-slick.next-slick-hoz .next-slick-arrow.large .next-icon:before{width:32px;font-size:32px;line-height:inherit}.next-slick.next-slick-hoz .next-slick-arrow.large.inner{top:calc(50% - 48px)}.next-slick.next-slick-hoz .next-slick-arrow.large.inner.next-slick-prev{left:0}.next-slick.next-slick-hoz .next-slick-arrow.large.inner.next-slick-next{right:0}.next-slick.next-slick-hoz .next-slick-arrow.large.outer{top:calc(50% - 48px)}.next-slick.next-slick-hoz .next-slick-arrow.large.outer.next-slick-prev{left:-8px}.next-slick.next-slick-hoz .next-slick-arrow.large.outer.next-slick-next{right:-8px}.next-slick.next-slick-ver.next-slick-outer{padding:24px 0}.next-slick.next-slick-ver .next-slick-slide{display:block;height:auto}.next-slick.next-slick-ver .next-slick-arrow.medium{width:56px;height:28px;line-height:28px}.next-slick.next-slick-ver .next-slick-arrow.medium .next-icon .next-icon-remote,.next-slick.next-slick-ver .next-slick-arrow.medium .next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-slick.next-slick-ver .next-slick-arrow.medium.inner{left:calc(50% - 28px)}.next-slick.next-slick-ver .next-slick-arrow.medium.inner.next-slick-prev{top:0}.next-slick.next-slick-ver .next-slick-arrow.medium.inner.next-slick-next{bottom:0}.next-slick.next-slick-ver .next-slick-arrow.medium.outer{left:calc(50% - 28px)}.next-slick.next-slick-ver .next-slick-arrow.medium.outer.next-slick-prev{top:-4px}.next-slick.next-slick-ver .next-slick-arrow.medium.outer.next-slick-next{bottom:-4px}.next-slick.next-slick-ver .next-slick-arrow.large{width:96px;height:48px;line-height:48px}.next-slick.next-slick-ver .next-slick-arrow.large .next-icon .next-icon-remote,.next-slick.next-slick-ver .next-slick-arrow.large .next-icon:before{width:32px;font-size:32px;line-height:inherit}.next-slick.next-slick-ver .next-slick-arrow.large.inner{left:calc(50% - 48px)}.next-slick.next-slick-ver .next-slick-arrow.large.inner.next-slick-prev{top:0}.next-slick.next-slick-ver .next-slick-arrow.large.inner.next-slick-next{bottom:0}.next-slick.next-slick-ver .next-slick-arrow.large.outer{left:calc(50% - 48px)}.next-slick.next-slick-ver .next-slick-arrow.large.outer.next-slick-prev{top:-16px}.next-slick.next-slick-ver .next-slick-arrow.large.outer.next-slick-next{bottom:-16px}.next-split-btn{display:inline-block;position:relative}.next-split-btn-spacing-tb{padding:0}.next-split-btn-trigger .next-icon{transition:transform .1s linear}.next-split-btn-trigger.next-expand .next-split-btn-symbol-fold{transform:rotate(180deg)}.next-split-btn-trigger.next-btn-normal:not(:disabled):not(.disabled) .next-icon{color:#999}.next-split-btn-trigger.next-small{padding-left:4px;padding-right:4px}.next-split-btn-trigger.next-medium{padding-left:8px;padding-right:8px}.next-split-btn-symbol-fold:before{content:"顦�"}.next-split-btn-symbol-unfold:before{content:""}.next-step,.next-step *,.next-step:after,.next-step :after,.next-step:before,.next-step :before{box-sizing:border-box}.next-step{width:100%;position:relative;border:none}.next-step-item{position:relative;vertical-align:middle;outline:0;height:100%}.next-step-item-body{outline:0}.next-step-item-node{transition:all .1s linear}.next-step-item-node.clicked{transform:scale3d(.8,.8,.8)}.next-step-horizontal{overflow:hidden}.next-step-horizontal>.next-step-item{display:inline-block;text-align:left}.next-step-vertical>.next-step-item{display:block;text-align:center}.next-step-arrow{display:flex}.next-step-arrow .next-step-item{flex:1;height:32px;line-height:32px;margin-left:16px;margin-right:4px}.next-step-arrow .next-step-item:before{content:"";position:absolute;left:-16px;top:0;z-index:1;border:16px solid transparent}.next-step-arrow .next-step-item:after{content:"";position:absolute;right:-16px;top:0;z-index:1;border-top:16px solid transparent;border-bottom:16px solid transparent;border-left:16px solid transparent}.next-step-arrow .next-step-item .next-step-item-container{min-width:100px;height:32px;cursor:pointer}.next-step-arrow .next-step-item .next-step-item-container .next-step-item-title{height:32px;line-height:32px;font-weight:700;font-size:14px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:center}.next-step-arrow>.next-step-item-wait{background:#f5f5f5}.next-step-arrow>.next-step-item-wait .next-step-item-tail-overlay{background:#000}.next-step-arrow>.next-step-item-wait .next-step-item-tail-underlay{background:#ccc}.next-step-arrow>.next-step-item-wait>.next-step-item-container .next-step-item-progress{width:32px;height:32px}.next-step-arrow>.next-step-item-wait>.next-step-item-container .next-step-item-node{color:#000}.next-step-arrow>.next-step-item-wait>.next-step-item-container .next-step-item-node-circle,.next-step-arrow>.next-step-item-wait>.next-step-item-container .next-step-item-node-dot{background:#f5f5f5;border-color:#000}.next-step-arrow>.next-step-item-wait .next-step-item-title{color:#999;word-break:break-word}.next-step-arrow>.next-step-item-wait .next-step-item-content{color:#999;font-size:12px;line-height:1.5;word-break:break-word}.next-step-arrow>.next-step-item-wait .next-step-item-node-placeholder{width:32px;height:32px;position:relative}.next-step-arrow>.next-step-item-wait .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-arrow>.next-step-item-wait .next-step-item-node-circle{display:block;width:32px;height:32px;font-size:12px;font-weight:400;line-height:30px;text-align:center;border:1px solid;border-radius:50%;transition:background-color .1s linear}.next-step-arrow>.next-step-item-wait .next-step-item-node-circle .next-icon{animation:zoomIn .3s linear}.next-step-arrow>.next-step-item-wait .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-arrow>.next-step-item-wait .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-arrow>.next-step-item-wait:before{border:16px solid #f5f5f5;border-left-color:transparent}.next-step-arrow>.next-step-item-wait:after{border-left-color:#f5f5f5}.next-step-arrow>.next-step-item-process{background:#209bfa}.next-step-arrow>.next-step-item-process .next-step-item-tail-overlay{background:#000}.next-step-arrow>.next-step-item-process .next-step-item-tail-underlay{background:#ccc}.next-step-arrow>.next-step-item-process>.next-step-item-container .next-step-item-progress{width:32px;height:32px}.next-step-arrow>.next-step-item-process>.next-step-item-container .next-step-item-node{color:#000}.next-step-arrow>.next-step-item-process>.next-step-item-container .next-step-item-node-circle,.next-step-arrow>.next-step-item-process>.next-step-item-container .next-step-item-node-dot{background:#209bfa;border-color:#000}.next-step-arrow>.next-step-item-process .next-step-item-title{color:#fff;word-break:break-word}.next-step-arrow>.next-step-item-process .next-step-item-content{color:#fff;font-size:12px;line-height:1.5;word-break:break-word}.next-step-arrow>.next-step-item-process .next-step-item-node-placeholder{width:32px;height:32px;position:relative}.next-step-arrow>.next-step-item-process .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-arrow>.next-step-item-process .next-step-item-node-circle{display:block;width:32px;height:32px;font-size:12px;font-weight:400;line-height:30px;text-align:center;border:1px solid;border-radius:50%;transition:background-color .1s linear}.next-step-arrow>.next-step-item-process .next-step-item-node-circle .next-icon{animation:zoomIn .3s linear}.next-step-arrow>.next-step-item-process .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-arrow>.next-step-item-process .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-arrow>.next-step-item-process:before{border:16px solid #209bfa;border-left-color:transparent}.next-step-arrow>.next-step-item-process:after{border-left-color:#209bfa}.next-step-arrow>.next-step-item-finish{background:#add9ff}.next-step-arrow>.next-step-item-finish .next-step-item-tail-overlay{background:#000}.next-step-arrow>.next-step-item-finish .next-step-item-tail-underlay{background:#ccc}.next-step-arrow>.next-step-item-finish>.next-step-item-container .next-step-item-progress{width:32px;height:32px}.next-step-arrow>.next-step-item-finish>.next-step-item-container .next-step-item-node{color:#000}.next-step-arrow>.next-step-item-finish>.next-step-item-container .next-step-item-node-circle,.next-step-arrow>.next-step-item-finish>.next-step-item-container .next-step-item-node-dot{background:#add9ff;border-color:#000}.next-step-arrow>.next-step-item-finish .next-step-item-title{color:#209bfa;word-break:break-word}.next-step-arrow>.next-step-item-finish .next-step-item-content{color:#209bfa;font-size:12px;line-height:1.5;word-break:break-word}.next-step-arrow>.next-step-item-finish .next-step-item-node-placeholder{width:32px;height:32px;position:relative}.next-step-arrow>.next-step-item-finish .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-arrow>.next-step-item-finish .next-step-item-node-circle{display:block;width:32px;height:32px;font-size:12px;font-weight:400;line-height:30px;text-align:center;border:1px solid;border-radius:50%;transition:background-color .1s linear}.next-step-arrow>.next-step-item-finish .next-step-item-node-circle .next-icon{animation:zoomIn .3s linear}.next-step-arrow>.next-step-item-finish .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-arrow>.next-step-item-finish .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-arrow>.next-step-item-finish:before{border:16px solid #add9ff;border-left-color:transparent}.next-step-arrow>.next-step-item-finish:after{border-left-color:#add9ff}.next-step-arrow .next-step-item-disabled{cursor:not-allowed;background:#fafafa}.next-step-arrow .next-step-item-disabled .next-step-item-tail-overlay{background:#000}.next-step-arrow .next-step-item-disabled .next-step-item-tail-underlay{background:#ccc}.next-step-arrow .next-step-item-disabled>.next-step-item-container .next-step-item-progress{width:32px;height:32px}.next-step-arrow .next-step-item-disabled>.next-step-item-container .next-step-item-node{color:#000}.next-step-arrow .next-step-item-disabled>.next-step-item-container .next-step-item-node-circle,.next-step-arrow .next-step-item-disabled>.next-step-item-container .next-step-item-node-dot{background:#fafafa;border-color:#000}.next-step-arrow .next-step-item-disabled .next-step-item-title{color:#ccc;word-break:break-word}.next-step-arrow .next-step-item-disabled .next-step-item-content{color:#ccc;font-size:12px;line-height:1.5;word-break:break-word}.next-step-arrow .next-step-item-disabled .next-step-item-node-placeholder{width:32px;height:32px;position:relative}.next-step-arrow .next-step-item-disabled .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-arrow .next-step-item-disabled .next-step-item-node-circle{display:block;width:32px;height:32px;font-size:12px;font-weight:400;line-height:30px;text-align:center;border:1px solid;border-radius:50%;transition:background-color .1s linear}.next-step-arrow .next-step-item-disabled .next-step-item-node-circle .next-icon{animation:zoomIn .3s linear}.next-step-arrow .next-step-item-disabled .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-arrow .next-step-item-disabled .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-arrow .next-step-item-disabled:before{border:16px solid #fafafa;border-left-color:transparent}.next-step-arrow .next-step-item-disabled:after{border-left-color:#fafafa}.next-step-arrow .next-step-item-disabled .next-step-item-container{cursor:not-allowed}.next-step-arrow .next-step-item-read-only,.next-step-arrow .next-step-item-read-only .next-step-item-container{cursor:default}.next-step-arrow .next-step-item-first{margin-left:0}.next-step-arrow .next-step-item-first:before{border:16px solid transparent}.next-step-arrow .next-step-item-last{margin-right:0}.next-step-arrow .next-step-item-last:after{border:16px solid transparent}.next-step-circle .next-step-item-container{display:inline-block;vertical-align:middle;position:relative;padding:0 8px}.next-step-circle .next-step-item-container .next-step-item-progress .next-progress-circle-text{color:#209bfa;font-size:14px}.next-step-circle .next-step-item-container .next-step-item-progress .next-progress-circle-underlay{stroke:#ccc;stroke-width:3px}.next-step-circle .next-step-item-container .next-step-item-progress .next-progress-circle-overlay-normal{stroke:#209bfa;stroke-width:3px}.next-step-circle .next-step-item-container .next-step-item-node-placeholder{display:inline-block}.next-step-circle>.next-step-item-wait .next-step-item-tail-overlay{background:#ddd}.next-step-circle>.next-step-item-wait .next-step-item-tail-underlay{background:#eee}.next-step-circle>.next-step-item-wait>.next-step-item-container .next-step-item-progress{width:32px;height:32px}.next-step-circle>.next-step-item-wait>.next-step-item-container .next-step-item-node{color:#666}.next-step-circle>.next-step-item-wait>.next-step-item-container .next-step-item-node-circle,.next-step-circle>.next-step-item-wait>.next-step-item-container .next-step-item-node-dot{background:#fff;border-color:#ccc}.next-step-circle>.next-step-item-wait .next-step-item-title{color:#666;word-break:break-word}.next-step-circle>.next-step-item-wait .next-step-item-content{color:#666;font-size:12px;line-height:1.5;word-break:break-word}.next-step-circle>.next-step-item-wait .next-step-item-node-placeholder{width:32px;height:32px;position:relative}.next-step-circle>.next-step-item-wait .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-circle>.next-step-item-wait .next-step-item-node-circle{display:block;width:32px;height:32px;font-size:12px;font-weight:400;line-height:30px;text-align:center;border:1px solid;border-radius:50%;transition:background-color .1s linear}.next-step-circle>.next-step-item-wait .next-step-item-node-circle .next-icon{animation:zoomIn .3s linear}.next-step-circle>.next-step-item-wait .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-circle>.next-step-item-wait .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-circle>.next-step-item-process .next-step-item-tail-overlay{background:#ddd}.next-step-circle>.next-step-item-process .next-step-item-tail-underlay{background:#eee}.next-step-circle>.next-step-item-process>.next-step-item-container .next-step-item-progress{width:32px;height:32px}.next-step-circle>.next-step-item-process>.next-step-item-container .next-step-item-node{color:#fff}.next-step-circle>.next-step-item-process>.next-step-item-container .next-step-item-node-circle,.next-step-circle>.next-step-item-process>.next-step-item-container .next-step-item-node-dot{background:#209bfa;border-color:#209bfa}.next-step-circle>.next-step-item-process .next-step-item-title{color:#333;word-break:break-word}.next-step-circle>.next-step-item-process .next-step-item-content{color:#333;font-size:12px;line-height:1.5;word-break:break-word}.next-step-circle>.next-step-item-process .next-step-item-node-placeholder{width:32px;height:32px;position:relative}.next-step-circle>.next-step-item-process .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-circle>.next-step-item-process .next-step-item-node-circle{display:block;width:32px;height:32px;font-size:12px;font-weight:400;line-height:30px;text-align:center;border:1px solid;border-radius:50%;transition:background-color .1s linear}.next-step-circle>.next-step-item-process .next-step-item-node-circle .next-icon{animation:zoomIn .3s linear}.next-step-circle>.next-step-item-process .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-circle>.next-step-item-process .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-circle>.next-step-item-finish .next-step-item-tail-overlay{background:#209bfa}.next-step-circle>.next-step-item-finish .next-step-item-tail-underlay{background:#eee}.next-step-circle>.next-step-item-finish>.next-step-item-container .next-step-item-progress{width:32px;height:32px}.next-step-circle>.next-step-item-finish>.next-step-item-container .next-step-item-node{color:#209bfa}.next-step-circle>.next-step-item-finish>.next-step-item-container .next-step-item-node-circle,.next-step-circle>.next-step-item-finish>.next-step-item-container .next-step-item-node-dot{background:#fff;border-color:#209bfa}.next-step-circle>.next-step-item-finish .next-step-item-title{color:#666;word-break:break-word}.next-step-circle>.next-step-item-finish .next-step-item-content{color:#666;font-size:12px;line-height:1.5;word-break:break-word}.next-step-circle>.next-step-item-finish .next-step-item-node-placeholder{width:32px;height:32px;position:relative}.next-step-circle>.next-step-item-finish .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-circle>.next-step-item-finish .next-step-item-node-circle{display:block;width:32px;height:32px;font-size:12px;font-weight:400;line-height:30px;text-align:center;border:1px solid;border-radius:50%;transition:background-color .1s linear}.next-step-circle>.next-step-item-finish .next-step-item-node-circle .next-icon{animation:zoomIn .3s linear}.next-step-circle>.next-step-item-finish .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-circle>.next-step-item-finish .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-circle .next-step-item-disabled .next-step-item-tail-overlay,.next-step-circle .next-step-item-disabled .next-step-item-tail-underlay{background:#eee}.next-step-circle .next-step-item-disabled>.next-step-item-container .next-step-item-progress{width:32px;height:32px}.next-step-circle .next-step-item-disabled>.next-step-item-container .next-step-item-node{color:#ccc}.next-step-circle .next-step-item-disabled>.next-step-item-container .next-step-item-node-circle,.next-step-circle .next-step-item-disabled>.next-step-item-container .next-step-item-node-dot{background:#fff;border-color:#eee}.next-step-circle .next-step-item-disabled .next-step-item-title{color:#ccc;word-break:break-word}.next-step-circle .next-step-item-disabled .next-step-item-content{color:#ccc;font-size:12px;line-height:1.5;word-break:break-word}.next-step-circle .next-step-item-disabled .next-step-item-node-placeholder{width:32px;height:32px;position:relative}.next-step-circle .next-step-item-disabled .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-circle .next-step-item-disabled .next-step-item-node-circle{display:block;width:32px;height:32px;font-size:12px;font-weight:400;line-height:30px;text-align:center;border:1px solid;border-radius:50%;transition:background-color .1s linear}.next-step-circle .next-step-item-disabled .next-step-item-node-circle .next-icon{animation:zoomIn .3s linear}.next-step-circle .next-step-item-disabled .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-circle .next-step-item-disabled .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-circle .next-step-item-disabled .next-step-item-node,.next-step-circle .next-step-item-disabled .next-step-item-node-placeholder{cursor:not-allowed}.next-step-circle .next-step-item-read-only .next-step-item-node,.next-step-circle .next-step-item-read-only .next-step-item-node-placeholder{cursor:default}.next-step-circle .next-step-item-last .next-step-item-tail{display:none}.next-step-circle.next-step-horizontal{text-align:center;white-space:nowrap}.next-step-circle.next-step-horizontal>.next-step-item .next-step-item-content,.next-step-circle.next-step-horizontal>.next-step-item .next-step-item-title{white-space:normal}.next-step-circle.next-step-horizontal>.next-step-item-wait .next-step-item-tail{display:inline-block;clear:both;width:calc(100% - 48px);vertical-align:middle}.next-step-circle.next-step-horizontal>.next-step-item-wait .next-step-item-tail .next-step-item-tail-underlay{display:block;height:1px;position:relative}.next-step-circle.next-step-horizontal>.next-step-item-wait .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:1px;transition:all .1s linear;width:100%}.next-step-circle.next-step-horizontal>.next-step-item-wait>.next-step-item-body{width:100px;left:-26px;text-align:center;position:absolute}.next-step-circle.next-step-horizontal>.next-step-item-wait>.next-step-item-body>.next-step-item-title{font-size:14px;line-height:18px;margin-top:8px;font-weight:700}.next-step-circle.next-step-horizontal>.next-step-item-wait>.next-step-item-body>.next-step-item-content{margin-top:4px}.next-step-circle.next-step-horizontal>.next-step-item-process .next-step-item-tail{display:inline-block;clear:both;width:calc(100% - 48px);vertical-align:middle}.next-step-circle.next-step-horizontal>.next-step-item-process .next-step-item-tail .next-step-item-tail-underlay{display:block;height:1px;position:relative}.next-step-circle.next-step-horizontal>.next-step-item-process .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:1px;transition:all .1s linear;width:100%}.next-step-circle.next-step-horizontal>.next-step-item-process>.next-step-item-body{width:100px;left:-26px;text-align:center;position:absolute}.next-step-circle.next-step-horizontal>.next-step-item-process>.next-step-item-body>.next-step-item-title{font-size:14px;line-height:18px;margin-top:8px;font-weight:700}.next-step-circle.next-step-horizontal>.next-step-item-process>.next-step-item-body>.next-step-item-content{margin-top:4px}.next-step-circle.next-step-horizontal>.next-step-item-finish .next-step-item-tail{display:inline-block;clear:both;width:calc(100% - 48px);vertical-align:middle}.next-step-circle.next-step-horizontal>.next-step-item-finish .next-step-item-tail .next-step-item-tail-underlay{display:block;height:1px;position:relative}.next-step-circle.next-step-horizontal>.next-step-item-finish .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:1px;transition:all .1s linear;width:100%}.next-step-circle.next-step-horizontal>.next-step-item-finish>.next-step-item-body{width:100px;left:-26px;text-align:center;position:absolute}.next-step-circle.next-step-horizontal>.next-step-item-finish>.next-step-item-body>.next-step-item-title{font-size:14px;line-height:18px;margin-top:8px;font-weight:700}.next-step-circle.next-step-horizontal>.next-step-item-finish>.next-step-item-body>.next-step-item-content{margin-top:4px}.next-step-circle.next-step-horizontal>.next-step-item-disabled .next-step-item-tail{display:inline-block;clear:both;width:calc(100% - 48px);vertical-align:middle}.next-step-circle.next-step-horizontal>.next-step-item-disabled .next-step-item-tail .next-step-item-tail-underlay{display:block;height:1px;position:relative}.next-step-circle.next-step-horizontal>.next-step-item-disabled .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:1px;transition:all .1s linear;width:100%}.next-step-circle.next-step-horizontal>.next-step-item-disabled>.next-step-item-body{width:100px;left:-26px;text-align:center;position:absolute}.next-step-circle.next-step-horizontal>.next-step-item-disabled>.next-step-item-body>.next-step-item-title{font-size:14px;line-height:18px;margin-top:8px;font-weight:700}.next-step-circle.next-step-horizontal>.next-step-item-disabled>.next-step-item-body>.next-step-item-content{margin-top:4px}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item{vertical-align:unset}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-wait .next-step-item:last-child .next-step-item-tail{display:none}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-wait .next-step-item-body{position:relative;display:inline-block;top:0;left:0;max-width:100px;overflow:hidden;vertical-align:top;text-align:left}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-wait .next-step-item-body .next-step-item-title{display:inline-block;padding-right:8px;margin-top:9px}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-wait .next-step-item-tail{width:calc(100% - 148px);position:absolute;right:0;margin-top:-1px}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-process .next-step-item:last-child .next-step-item-tail{display:none}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-process .next-step-item-body{position:relative;display:inline-block;top:0;left:0;max-width:100px;overflow:hidden;vertical-align:top;text-align:left}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-process .next-step-item-body .next-step-item-title{display:inline-block;padding-right:8px;margin-top:9px}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-process .next-step-item-tail{width:calc(100% - 148px);position:absolute;right:0;margin-top:-1px}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-finish .next-step-item:last-child .next-step-item-tail{display:none}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-finish .next-step-item-body{position:relative;display:inline-block;top:0;left:0;max-width:100px;overflow:hidden;vertical-align:top;text-align:left}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-finish .next-step-item-body .next-step-item-title{display:inline-block;padding-right:8px;margin-top:9px}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-finish .next-step-item-tail{width:calc(100% - 148px);position:absolute;right:0;margin-top:-1px}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-disabled .next-step-item:last-child .next-step-item-tail{display:none}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-disabled .next-step-item-body{position:relative;display:inline-block;top:0;left:0;max-width:100px;overflow:hidden;vertical-align:top;text-align:left}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-disabled .next-step-item-body .next-step-item-title{display:inline-block;padding-right:8px;margin-top:9px}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-disabled .next-step-item-tail{width:calc(100% - 148px);position:absolute;right:0;margin-top:-1px}.next-step-circle.next-step-vertical{font-size:0;display:table-cell;vertical-align:middle;position:relative}.next-step-circle.next-step-vertical .next-step-item-container{padding:0}.next-step-circle.next-step-vertical>.next-step-item:last-child .next-step-item-tail{display:block;visibility:hidden}.next-step-circle.next-step-vertical>.next-step-item-wait .next-step-item-tail{width:1px;height:0;margin:8px auto}.next-step-circle.next-step-vertical>.next-step-item-wait .next-step-item-tail .next-step-item-tail-underlay{height:100%;width:1px;position:relative}.next-step-circle.next-step-vertical>.next-step-item-wait .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:100%;width:1px}.next-step-circle.next-step-vertical>.next-step-item-wait>.next-step-item-body{position:absolute;top:0;left:16px;margin-left:8px}.next-step-circle.next-step-vertical>.next-step-item-wait>.next-step-item-body>.next-step-item-title{margin-top:8px;text-align:left;font-weight:700;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142}.next-step-circle.next-step-vertical>.next-step-item-wait>.next-step-item-body>.next-step-item-content{margin-top:4px;min-height:8px;text-align:left;font-size:12px;line-height:1.5}.next-step-circle.next-step-vertical>.next-step-item-process .next-step-item-tail{width:1px;height:0;margin:8px auto}.next-step-circle.next-step-vertical>.next-step-item-process .next-step-item-tail .next-step-item-tail-underlay{height:100%;width:1px;position:relative}.next-step-circle.next-step-vertical>.next-step-item-process .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:100%;width:1px}.next-step-circle.next-step-vertical>.next-step-item-process>.next-step-item-body{position:absolute;top:0;left:16px;margin-left:8px}.next-step-circle.next-step-vertical>.next-step-item-process>.next-step-item-body>.next-step-item-title{margin-top:8px;text-align:left;font-weight:700;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142}.next-step-circle.next-step-vertical>.next-step-item-process>.next-step-item-body>.next-step-item-content{margin-top:4px;min-height:8px;text-align:left;font-size:12px;line-height:1.5}.next-step-circle.next-step-vertical>.next-step-item-finish .next-step-item-tail{width:1px;height:0;margin:8px auto}.next-step-circle.next-step-vertical>.next-step-item-finish .next-step-item-tail .next-step-item-tail-underlay{height:100%;width:1px;position:relative}.next-step-circle.next-step-vertical>.next-step-item-finish .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:100%;width:1px}.next-step-circle.next-step-vertical>.next-step-item-finish>.next-step-item-body{position:absolute;top:0;left:16px;margin-left:8px}.next-step-circle.next-step-vertical>.next-step-item-finish>.next-step-item-body>.next-step-item-title{margin-top:8px;text-align:left;font-weight:700;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142}.next-step-circle.next-step-vertical>.next-step-item-finish>.next-step-item-body>.next-step-item-content{margin-top:4px;min-height:8px;text-align:left;font-size:12px;line-height:1.5}.next-step-circle.next-step-vertical>.next-step-item-disabled .next-step-item-tail{width:1px;height:0;margin:8px auto}.next-step-circle.next-step-vertical>.next-step-item-disabled .next-step-item-tail .next-step-item-tail-underlay{height:100%;width:1px;position:relative}.next-step-circle.next-step-vertical>.next-step-item-disabled .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:100%;width:1px}.next-step-circle.next-step-vertical>.next-step-item-disabled>.next-step-item-body{position:absolute;top:0;left:16px;margin-left:8px}.next-step-circle.next-step-vertical>.next-step-item-disabled>.next-step-item-body>.next-step-item-title{margin-top:8px;text-align:left;font-weight:700;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142}.next-step-circle.next-step-vertical>.next-step-item-disabled>.next-step-item-body>.next-step-item-content{margin-top:4px;min-height:8px;text-align:left;font-size:12px;line-height:1.5}.next-step-dot .next-step-item-container{display:inline-block;vertical-align:middle;position:relative;padding:0 8px;margin-top:-1px;margin-bottom:-1px}.next-step-dot .next-step-item-container .next-step-item-node-placeholder{display:inline-block}.next-step-dot .next-step-item-container .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-dot .next-step-item-container .next-step-item-node .next-icon .next-icon-remote,.next-step-dot .next-step-item-container .next-step-item-node .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-dot>.next-step-item-wait .next-step-item-tail-overlay{background:#ddd}.next-step-dot>.next-step-item-wait .next-step-item-tail-underlay{background:#eee}.next-step-dot>.next-step-item-wait>.next-step-item-container .next-step-item-progress{width:12px;height:12px}.next-step-dot>.next-step-item-wait>.next-step-item-container .next-step-item-node{color:#999}.next-step-dot>.next-step-item-wait>.next-step-item-container .next-step-item-node-circle,.next-step-dot>.next-step-item-wait>.next-step-item-container .next-step-item-node-dot{background:#fff;border-color:#ccc}.next-step-dot>.next-step-item-wait .next-step-item-title{color:#666;word-break:break-word}.next-step-dot>.next-step-item-wait .next-step-item-content{color:#666;line-height:1.5;word-break:break-word}.next-step-dot>.next-step-item-wait .next-step-item-node-placeholder{width:12px;height:12px;position:relative}.next-step-dot>.next-step-item-wait .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-dot>.next-step-item-wait .next-step-item-node-circle{display:block;width:12px;height:12px;font-size:12px;font-weight:400;line-height:10px;text-align:center;border:1px solid;border-radius:50%;transition:background-color .1s linear}.next-step-dot>.next-step-item-wait .next-step-item-node-circle .next-icon{animation:zoomIn .3s linear}.next-step-dot>.next-step-item-wait .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-dot>.next-step-item-wait .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-dot>.next-step-item-wait .next-step-item-content{font-size:12px}.next-step-dot>.next-step-item-wait .next-step-item-node-dot{display:block;width:12px;height:12px;font-size:12px;line-height:10px;text-align:center;border:1px solid;border-radius:50%;transition:background-color .3s ease,border-color .3s ease}.next-step-dot>.next-step-item-process .next-step-item-tail-overlay{background:#ddd}.next-step-dot>.next-step-item-process .next-step-item-tail-underlay{background:#eee}.next-step-dot>.next-step-item-process>.next-step-item-container .next-step-item-progress{width:12px;height:12px}.next-step-dot>.next-step-item-process>.next-step-item-container .next-step-item-node{color:#209bfa}.next-step-dot>.next-step-item-process>.next-step-item-container .next-step-item-node-circle,.next-step-dot>.next-step-item-process>.next-step-item-container .next-step-item-node-dot{background:#209bfa;border-color:#209bfa}.next-step-dot>.next-step-item-process .next-step-item-title{color:#333;word-break:break-word}.next-step-dot>.next-step-item-process .next-step-item-content{color:#333;line-height:1.5;word-break:break-word}.next-step-dot>.next-step-item-process .next-step-item-node-placeholder{width:12px;height:12px;position:relative}.next-step-dot>.next-step-item-process .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-dot>.next-step-item-process .next-step-item-node-circle{display:block;width:12px;height:12px;font-size:12px;font-weight:400;line-height:10px;text-align:center;border:1px solid;border-radius:50%;transition:background-color .1s linear}.next-step-dot>.next-step-item-process .next-step-item-node-circle .next-icon{animation:zoomIn .3s linear}.next-step-dot>.next-step-item-process .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-dot>.next-step-item-process .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-dot>.next-step-item-process .next-step-item-content{font-size:12px}.next-step-dot>.next-step-item-process .next-step-item-node-dot{display:block;width:12px;height:12px;font-size:12px;line-height:10px;text-align:center;border:1px solid;border-radius:50%;transition:background-color .3s ease,border-color .3s ease}.next-step-dot>.next-step-item-finish .next-step-item-tail-overlay{background:#209bfa}.next-step-dot>.next-step-item-finish .next-step-item-tail-underlay{background:#eee}.next-step-dot>.next-step-item-finish>.next-step-item-container .next-step-item-progress{width:12px;height:12px}.next-step-dot>.next-step-item-finish>.next-step-item-container .next-step-item-node{color:#209bfa}.next-step-dot>.next-step-item-finish>.next-step-item-container .next-step-item-node-circle,.next-step-dot>.next-step-item-finish>.next-step-item-container .next-step-item-node-dot{background:#fff;border-color:#209bfa}.next-step-dot>.next-step-item-finish .next-step-item-title{color:#666;word-break:break-word}.next-step-dot>.next-step-item-finish .next-step-item-content{color:#666;line-height:1.5;word-break:break-word}.next-step-dot>.next-step-item-finish .next-step-item-node-placeholder{width:12px;height:12px;position:relative}.next-step-dot>.next-step-item-finish .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-dot>.next-step-item-finish .next-step-item-node-circle{display:block;width:12px;height:12px;font-size:12px;font-weight:400;line-height:10px;text-align:center;border:1px solid;border-radius:50%;transition:background-color .1s linear}.next-step-dot>.next-step-item-finish .next-step-item-node-circle .next-icon{animation:zoomIn .3s linear}.next-step-dot>.next-step-item-finish .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-dot>.next-step-item-finish .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-dot>.next-step-item-finish .next-step-item-content{font-size:12px}.next-step-dot>.next-step-item-finish .next-step-item-node-dot{display:block;width:12px;height:12px;font-size:12px;line-height:10px;text-align:center;border:1px solid;border-radius:50%;transition:background-color .3s ease,border-color .3s ease}.next-step-dot .next-step-item-disabled .next-step-item-tail-overlay,.next-step-dot .next-step-item-disabled .next-step-item-tail-underlay{background:#eee}.next-step-dot .next-step-item-disabled>.next-step-item-container .next-step-item-progress{width:12px;height:12px}.next-step-dot .next-step-item-disabled>.next-step-item-container .next-step-item-node{color:#eee}.next-step-dot .next-step-item-disabled>.next-step-item-container .next-step-item-node-circle,.next-step-dot .next-step-item-disabled>.next-step-item-container .next-step-item-node-dot{background:#fff;border-color:#e6e6e6}.next-step-dot .next-step-item-disabled .next-step-item-title{color:#ccc;word-break:break-word}.next-step-dot .next-step-item-disabled .next-step-item-content{color:#ccc;line-height:1.5;word-break:break-word}.next-step-dot .next-step-item-disabled .next-step-item-node-placeholder{width:12px;height:12px;position:relative}.next-step-dot .next-step-item-disabled .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-dot .next-step-item-disabled .next-step-item-node-circle{display:block;width:12px;height:12px;font-size:12px;font-weight:400;line-height:10px;text-align:center;border:1px solid;border-radius:50%;transition:background-color .1s linear}.next-step-dot .next-step-item-disabled .next-step-item-node-circle .next-icon{animation:zoomIn .3s linear}.next-step-dot .next-step-item-disabled .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-dot .next-step-item-disabled .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-dot .next-step-item-disabled .next-step-item-content{font-size:12px}.next-step-dot .next-step-item-disabled .next-step-item-node-dot{display:block;width:12px;height:12px;font-size:12px;line-height:10px;text-align:center;border:1px solid;border-radius:50%;transition:background-color .3s ease,border-color .3s ease}.next-step-dot .next-step-item-disabled .next-step-item-node,.next-step-dot .next-step-item-disabled .next-step-item-node-placeholder{cursor:not-allowed}.next-step-dot .next-step-item-read-only .next-step-item-node,.next-step-dot .next-step-item-read-only .next-step-item-node-placeholder{cursor:default}.next-step-dot .next-step-item-last .next-step-item-tail{display:none}.next-step-dot.next-step-horizontal{text-align:center;white-space:nowrap}.next-step-dot.next-step-horizontal>.next-step-item .next-step-item-content,.next-step-dot.next-step-horizontal>.next-step-item .next-step-item-title{white-space:normal}.next-step-dot.next-step-horizontal .next-step-item-node .next-icon{vertical-align:middle}.next-step-dot.next-step-horizontal>.next-step-item-wait .next-step-item-tail{display:inline-block;clear:both;width:calc(100% - 28px);vertical-align:middle}.next-step-dot.next-step-horizontal>.next-step-item-wait .next-step-item-tail .next-step-item-tail-underlay{display:block;height:1px;position:relative}.next-step-dot.next-step-horizontal>.next-step-item-wait .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:1px;transition:all .1s linear;width:100%}.next-step-dot.next-step-horizontal>.next-step-item-wait>.next-step-item-body{width:100px;left:-36px;text-align:center;position:absolute}.next-step-dot.next-step-horizontal>.next-step-item-wait>.next-step-item-body>.next-step-item-title{font-size:14px;line-height:18px;margin-top:8px;font-weight:700}.next-step-dot.next-step-horizontal>.next-step-item-wait>.next-step-item-body>.next-step-item-content{margin-top:4px}.next-step-dot.next-step-horizontal>.next-step-item-process .next-step-item-tail{display:inline-block;clear:both;width:calc(100% - 28px);vertical-align:middle}.next-step-dot.next-step-horizontal>.next-step-item-process .next-step-item-tail .next-step-item-tail-underlay{display:block;height:1px;position:relative}.next-step-dot.next-step-horizontal>.next-step-item-process .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:1px;transition:all .1s linear;width:100%}.next-step-dot.next-step-horizontal>.next-step-item-process>.next-step-item-body{width:100px;left:-36px;text-align:center;position:absolute}.next-step-dot.next-step-horizontal>.next-step-item-process>.next-step-item-body>.next-step-item-title{font-size:14px;line-height:18px;margin-top:8px;font-weight:700}.next-step-dot.next-step-horizontal>.next-step-item-process>.next-step-item-body>.next-step-item-content{margin-top:4px}.next-step-dot.next-step-horizontal>.next-step-item-finish .next-step-item-tail{display:inline-block;clear:both;width:calc(100% - 28px);vertical-align:middle}.next-step-dot.next-step-horizontal>.next-step-item-finish .next-step-item-tail .next-step-item-tail-underlay{display:block;height:1px;position:relative}.next-step-dot.next-step-horizontal>.next-step-item-finish .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:1px;transition:all .1s linear;width:100%}.next-step-dot.next-step-horizontal>.next-step-item-finish>.next-step-item-body{width:100px;left:-36px;text-align:center;position:absolute}.next-step-dot.next-step-horizontal>.next-step-item-finish>.next-step-item-body>.next-step-item-title{font-size:14px;line-height:18px;margin-top:8px;font-weight:700}.next-step-dot.next-step-horizontal>.next-step-item-finish>.next-step-item-body>.next-step-item-content{margin-top:4px}.next-step-dot.next-step-horizontal>.next-step-item-disabled .next-step-item-tail{display:inline-block;clear:both;width:calc(100% - 28px);vertical-align:middle}.next-step-dot.next-step-horizontal>.next-step-item-disabled .next-step-item-tail .next-step-item-tail-underlay{display:block;height:1px;position:relative}.next-step-dot.next-step-horizontal>.next-step-item-disabled .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:1px;transition:all .1s linear;width:100%}.next-step-dot.next-step-horizontal>.next-step-item-disabled>.next-step-item-body{width:100px;left:-36px;text-align:center;position:absolute}.next-step-dot.next-step-horizontal>.next-step-item-disabled>.next-step-item-body>.next-step-item-title{font-size:14px;line-height:18px;margin-top:8px;font-weight:700}.next-step-dot.next-step-horizontal>.next-step-item-disabled>.next-step-item-body>.next-step-item-content{margin-top:4px}.next-step-dot.next-step-vertical{padding:0 0 0 4px;font-size:0;display:table-cell;position:relative}.next-step-dot.next-step-vertical .next-step-item-container{padding:0}.next-step-dot.next-step-vertical>.next-step-item:last-child .next-step-item-tail{display:block;visibility:hidden}.next-step-dot.next-step-vertical>.next-step-item-wait .next-step-item-tail{width:1px;height:0;margin:8px auto}.next-step-dot.next-step-vertical>.next-step-item-wait .next-step-item-tail .next-step-item-tail-underlay{height:100%;width:1px;position:relative}.next-step-dot.next-step-vertical>.next-step-item-wait .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:100%;width:1px}.next-step-dot.next-step-vertical>.next-step-item-wait>.next-step-item-body{position:absolute;top:0;left:6px;margin-left:8px}.next-step-dot.next-step-vertical>.next-step-item-wait>.next-step-item-body>.next-step-item-title{margin-top:0;font-weight:700;text-align:left;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142}.next-step-dot.next-step-vertical>.next-step-item-wait>.next-step-item-body>.next-step-item-content{margin-top:8px;min-height:8px;text-align:left;font-size:12px;line-height:1.5}.next-step-dot.next-step-vertical>.next-step-item-process .next-step-item-tail{width:1px;height:0;margin:8px auto}.next-step-dot.next-step-vertical>.next-step-item-process .next-step-item-tail .next-step-item-tail-underlay{height:100%;width:1px;position:relative}.next-step-dot.next-step-vertical>.next-step-item-process .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:100%;width:1px}.next-step-dot.next-step-vertical>.next-step-item-process>.next-step-item-body{position:absolute;top:0;left:6px;margin-left:8px}.next-step-dot.next-step-vertical>.next-step-item-process>.next-step-item-body>.next-step-item-title{margin-top:0;font-weight:700;text-align:left;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142}.next-step-dot.next-step-vertical>.next-step-item-process>.next-step-item-body>.next-step-item-content{margin-top:8px;min-height:8px;text-align:left;font-size:12px;line-height:1.5}.next-step-dot.next-step-vertical>.next-step-item-finish .next-step-item-tail{width:1px;height:0;margin:8px auto}.next-step-dot.next-step-vertical>.next-step-item-finish .next-step-item-tail .next-step-item-tail-underlay{height:100%;width:1px;position:relative}.next-step-dot.next-step-vertical>.next-step-item-finish .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:100%;width:1px}.next-step-dot.next-step-vertical>.next-step-item-finish>.next-step-item-body{position:absolute;top:0;left:6px;margin-left:8px}.next-step-dot.next-step-vertical>.next-step-item-finish>.next-step-item-body>.next-step-item-title{margin-top:0;font-weight:700;text-align:left;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142}.next-step-dot.next-step-vertical>.next-step-item-finish>.next-step-item-body>.next-step-item-content{margin-top:8px;min-height:8px;text-align:left;font-size:12px;line-height:1.5}.next-step-dot.next-step-vertical>.next-step-item-disabled .next-step-item-tail{width:1px;height:0;margin:8px auto}.next-step-dot.next-step-vertical>.next-step-item-disabled .next-step-item-tail .next-step-item-tail-underlay{height:100%;width:1px;position:relative}.next-step-dot.next-step-vertical>.next-step-item-disabled .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:100%;width:1px}.next-step-dot.next-step-vertical>.next-step-item-disabled>.next-step-item-body{position:absolute;top:0;left:6px;margin-left:8px}.next-step-dot.next-step-vertical>.next-step-item-disabled>.next-step-item-body>.next-step-item-title{margin-top:0;font-weight:700;text-align:left;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142}.next-step-dot.next-step-vertical>.next-step-item-disabled>.next-step-item-body>.next-step-item-content{margin-top:8px;min-height:8px;text-align:left;font-size:12px;line-height:1.5}.next-step-horizontal[dir=rtl]>.next-step-item{text-align:right}.next-step-arrow[dir=rtl] .next-step-item{height:32px;line-height:32px;margin-left:4px;margin-right:16px}.next-step-arrow[dir=rtl] .next-step-item:before{right:-16px;left:auto;border:16px solid transparent}.next-step-arrow[dir=rtl] .next-step-item:after{left:-32px;right:auto;border-top:16px solid transparent;border-bottom:16px solid transparent;border-right:16px solid transparent}.next-step-arrow[dir=rtl]>.next-step-item-wait{background:#f5f5f5}.next-step-arrow[dir=rtl]>.next-step-item-wait .next-step-item-node-dot{right:50%;left:auto}.next-step-arrow[dir=rtl]>.next-step-item-wait:before{border:16px solid #f5f5f5;border-right-color:transparent}.next-step-arrow[dir=rtl]>.next-step-item-wait:after{border-right-color:#f5f5f5;border-left-color:transparent}.next-step-arrow[dir=rtl]>.next-step-item-process{background:#209bfa}.next-step-arrow[dir=rtl]>.next-step-item-process .next-step-item-node-dot{right:50%;left:auto}.next-step-arrow[dir=rtl]>.next-step-item-process:before{border:16px solid #209bfa;border-right-color:transparent}.next-step-arrow[dir=rtl]>.next-step-item-process:after{border-right-color:#209bfa;border-left-color:transparent}.next-step-arrow[dir=rtl]>.next-step-item-finish{background:#add9ff}.next-step-arrow[dir=rtl]>.next-step-item-finish .next-step-item-node-dot{right:50%;left:auto}.next-step-arrow[dir=rtl]>.next-step-item-finish:before{border:16px solid #add9ff;border-right-color:transparent}.next-step-arrow[dir=rtl]>.next-step-item-finish:after{border-right-color:#add9ff;border-left-color:transparent}.next-step-arrow[dir=rtl] .next-step-item-disabled{background:#fafafa}.next-step-arrow[dir=rtl] .next-step-item-disabled .next-step-item-node-dot{right:50%;left:auto}.next-step-arrow[dir=rtl] .next-step-item-disabled:before{border:16px solid #fafafa;border-right-color:transparent}.next-step-arrow[dir=rtl] .next-step-item-disabled:after{border-right-color:#fafafa;border-left-color:transparent}.next-step-arrow[dir=rtl] .next-step-item-first{margin-right:0}.next-step-arrow[dir=rtl] .next-step-item-last{margin-left:0}.next-step-circle[dir=rtl] .next-step-item-disabled .next-step-item-node-dot,.next-step-circle[dir=rtl]>.next-step-item-finish .next-step-item-node-dot,.next-step-circle[dir=rtl]>.next-step-item-process .next-step-item-node-dot,.next-step-circle[dir=rtl]>.next-step-item-wait .next-step-item-node-dot{right:50%;left:auto}.next-step-circle[dir=rtl].next-step-horizontal>.next-step-item-disabled>.next-step-item-body,.next-step-circle[dir=rtl].next-step-horizontal>.next-step-item-finish>.next-step-item-body,.next-step-circle[dir=rtl].next-step-horizontal>.next-step-item-process>.next-step-item-body,.next-step-circle[dir=rtl].next-step-horizontal>.next-step-item-wait>.next-step-item-body{right:-26px;left:auto}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-wait .next-step-item-body{left:auto;right:0;text-align:right}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-wait .next-step-item-body .next-step-item-title{padding-left:8px;padding-right:0}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-wait .next-step-item-tail{left:0;right:auto}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-process .next-step-item-body{left:auto;right:0;text-align:right}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-process .next-step-item-body .next-step-item-title{padding-left:8px;padding-right:0}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-process .next-step-item-tail{left:0;right:auto}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-finish .next-step-item-body{left:auto;right:0;text-align:right}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-finish .next-step-item-body .next-step-item-title{padding-left:8px;padding-right:0}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-finish .next-step-item-tail{left:0;right:auto}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-disabled .next-step-item-body{left:auto;right:0;text-align:right}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-disabled .next-step-item-body .next-step-item-title{padding-left:8px;padding-right:0}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-disabled .next-step-item-tail{left:0;right:auto}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-wait>.next-step-item-body{right:16px;left:auto;margin-right:8px;margin-left:0}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-wait>.next-step-item-body>.next-step-item-title{text-align:right;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-wait>.next-step-item-body>.next-step-item-content{text-align:right}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-process>.next-step-item-body{right:16px;left:auto;margin-right:8px;margin-left:0}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-process>.next-step-item-body>.next-step-item-title{text-align:right;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-process>.next-step-item-body>.next-step-item-content{text-align:right}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-finish>.next-step-item-body{right:16px;left:auto;margin-right:8px;margin-left:0}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-finish>.next-step-item-body>.next-step-item-title{text-align:right;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-finish>.next-step-item-body>.next-step-item-content{text-align:right}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-disabled>.next-step-item-body{right:16px;left:auto;margin-right:8px;margin-left:0}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-disabled>.next-step-item-body>.next-step-item-title{text-align:right;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-disabled>.next-step-item-body>.next-step-item-content{text-align:right}.next-step-dot[dir=rtl] .next-step-item-disabled .next-step-item-node-dot,.next-step-dot[dir=rtl]>.next-step-item-finish .next-step-item-node-dot,.next-step-dot[dir=rtl]>.next-step-item-process .next-step-item-node-dot,.next-step-dot[dir=rtl]>.next-step-item-wait .next-step-item-node-dot{right:50%;left:auto}.next-step-dot[dir=rtl].next-step-horizontal>.next-step-item-disabled>.next-step-item-body,.next-step-dot[dir=rtl].next-step-horizontal>.next-step-item-finish>.next-step-item-body,.next-step-dot[dir=rtl].next-step-horizontal>.next-step-item-process>.next-step-item-body,.next-step-dot[dir=rtl].next-step-horizontal>.next-step-item-wait>.next-step-item-body{right:-36px;left:auto}.next-step-dot[dir=rtl].next-step-vertical{padding:0 4px 0 0}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-wait>.next-step-item-body{right:6px;left:auto;margin-right:8px;margin-left:0}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-wait>.next-step-item-body>.next-step-item-title{text-align:right;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-wait>.next-step-item-body>.next-step-item-content{text-align:right}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-process>.next-step-item-body{right:6px;left:auto;margin-right:8px;margin-left:0}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-process>.next-step-item-body>.next-step-item-title{text-align:right;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-process>.next-step-item-body>.next-step-item-content{text-align:right}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-finish>.next-step-item-body{right:6px;left:auto;margin-right:8px;margin-left:0}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-finish>.next-step-item-body>.next-step-item-title{text-align:right;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-finish>.next-step-item-body>.next-step-item-content{text-align:right}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-disabled>.next-step-item-body{right:6px;left:auto;margin-right:8px;margin-left:0}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-disabled>.next-step-item-body>.next-step-item-title{text-align:right;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-disabled>.next-step-item-body>.next-step-item-content{text-align:right}.next-switch:after[dir=rtl]{content:" ";transition:all .1s linear;transform-origin:right center}.next-switch-medium[dir=rtl]:after,.next-switch-small[dir=rtl]:after{right:100%;transform:translateX(100%)}.next-switch-on[dir=rtl]>.next-switch-children{color:#fff}.next-switch-on[disabled][dir=rtl]:after{left:0;right:100%;box-shadow:1px 1px 3px 0 rgba(0,0,0,.12)}.next-switch-off[dir=rtl]:after{right:0;transform:translateX(0);box-shadow:-1px 0 3px 0 rgba(0,0,0,.12)}.next-switch-off.next-switch-small[dir=rtl]>.next-switch-children,.next-switch-off[dir=rtl]>.next-switch-children{right:auto}.next-switch{outline:none;text-align:left;cursor:pointer;vertical-align:middle;user-select:none;overflow:hidden;transition:background .1s cubic-bezier(.4,0,.2,1),border-color .1s cubic-bezier(.4,0,.2,1)}.next-switch,.next-switch *,.next-switch :after,.next-switch :before{box-sizing:border-box}.next-switch-btn{transition:all .15s cubic-bezier(.4,0,.2,1);transform-origin:left center}.next-switch:after{content:""}.next-switch-loading{pointer-events:none}.next-switch-loading .next-icon-loading{color:#209bfa;text-align:center;transform:translate(-1px,-1px)}.next-switch-loading .next-icon-loading.next-switch-inner-icon:before{vertical-align:top}.next-switch-medium{position:relative;display:inline-block;border:2px solid transparent;width:48px;height:28px;border-radius:12px}.next-switch-medium:not([disabled]):active .next-switch-btn{width:31.2px}.next-switch-medium.next-switch-on:not([disabled]):active .next-switch-btn{left:calc(100% - 31.2px)}.next-switch-medium.next-switch-auto-width{min-width:48px;width:auto;overflow:initial}.next-switch-medium:after{content:""}.next-switch-medium>.next-switch-btn{border:1px solid transparent;position:absolute;left:calc(100% - 24px);width:24px;height:24px;border-radius:12px;box-sizing:border-box}.next-switch-medium>.next-switch-children{height:24px;line-height:24px;font-size:14px}.next-switch-medium.next-switch.next-switch-on>.next-switch-children{margin:0 32px 0 8px}.next-switch-medium.next-switch.next-switch-off>.next-switch-children{margin:0 8px 0 32px}.next-switch-medium.next-switch-loading .next-icon-loading{line-height:24px;height:24px;width:24px}.next-switch-medium.next-switch-loading .next-icon-loading .next-icon-remote,.next-switch-medium.next-switch-loading .next-icon-loading:before{width:16px;font-size:16px;line-height:inherit}.next-switch-small{position:relative;display:inline-block;border:2px solid transparent;width:44px;height:24px;border-radius:12px}.next-switch-small:not([disabled]):active .next-switch-btn{width:26px}.next-switch-small.next-switch-on:not([disabled]):active .next-switch-btn{left:calc(100% - 26px)}.next-switch-small.next-switch-auto-width{min-width:44px;width:auto;overflow:initial}.next-switch-small:after{content:""}.next-switch-small>.next-switch-btn{border:1px solid transparent;position:absolute;left:calc(100% - 20px);width:20px;height:20px;border-radius:12px;box-sizing:border-box}.next-switch-small>.next-switch-children{height:20px;line-height:20px;font-size:12px}.next-switch-small.next-switch.next-switch-on>.next-switch-children{margin:0 28px 0 8px}.next-switch-small.next-switch.next-switch-off>.next-switch-children{margin:0 8px 0 28px}.next-switch-small.next-switch-loading .next-icon-loading{line-height:20px;height:20px;width:20px}.next-switch-small.next-switch-loading .next-icon-loading .next-icon-remote,.next-switch-small.next-switch-loading .next-icon-loading:before{width:12px;font-size:12px;line-height:inherit}.next-switch-on{background-color:#209bfa}.next-switch-on .next-switch-btn{box-shadow:1px 1px 3px 0 rgba(0,0,0,.12);background-color:#fff;border-color:transparent}.next-switch-on>.next-switch-children{color:#fff}.next-switch-on.hover,.next-switch-on:focus,.next-switch-on:hover{background-color:#1274e7}.next-switch-on.hover .next-switch-btn,.next-switch-on:focus .next-switch-btn,.next-switch-on:hover .next-switch-btn{background-color:#fff}.next-switch-on[disabled]{background-color:#f5f5f5;cursor:not-allowed}.next-switch-on[disabled] .next-switch-btn{right:0;box-shadow:1px 1px 3px 0 rgba(0,0,0,.12);background-color:#fafafa;border-color:transparent}.next-switch-on[disabled]>.next-switch-children{color:#ccc}.next-switch-off,.next-switch-off.hover,.next-switch-off:focus,.next-switch-off:hover{background-color:#f5f5f5;border-color:#f5f5f5}.next-switch-off .next-switch-btn{left:0;box-shadow:1px 1px 3px 0 rgba(0,0,0,.12);background-color:#fff;border-color:transparent}.next-switch-off.hover .next-switch-btn,.next-switch-off:focus .next-switch-btn,.next-switch-off:hover .next-switch-btn{background-color:#fff}.next-switch-off>.next-switch-children{color:#999}.next-switch-off[disabled]{background-color:#f5f5f5;cursor:not-allowed}.next-switch-off[disabled] .next-switch-btn{box-shadow:1px 1px 3px 0 rgba(0,0,0,.12);background-color:#fafafa;border-color:transparent}.next-switch-off[disabled]>.next-switch-children{color:#ddd}.next-tabs{width:100%}.next-tabs,.next-tabs *,.next-tabs :after,.next-tabs :before{box-sizing:border-box}.next-tabs-bar{outline:none}.next-tabs-bar-popup{overflow-y:auto;max-height:480px}.next-tabs-nav-container{position:relative}.next-tabs-nav-container:after{visibility:hidden;display:block;height:0;font-size:0;content:" ";clear:both}.next-tabs-nav-wrap{overflow:hidden}.next-tabs-nav-scroll{overflow:hidden;white-space:nowrap}.next-tabs-scrollable .next-tabs-nav-scroll{overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch}.next-tabs-scrollable .next-tabs-nav-scroll::-webkit-scrollbar{display:none!important;width:0!important;height:0!important;-webkit-appearance:none;opacity:0!important}.next-tabs-nav{display:inline-block;position:relative;transition:all .3s ease;list-style:none;padding:0;margin:0}.next-tabs-nav-appear,.next-tabs-nav-enter{animation:fadeInLeft .4s cubic-bezier(.78,.14,.15,.86);animation-fill-mode:both}.next-tabs-nav-leave{animation:fadeOutLeft .2s cubic-bezier(.78,.14,.15,.86);animation-fill-mode:both}.next-tabs-nav.next-disable-animation .next-tabs-tab:before{transition:none}.next-tabs-tab{display:inline-block;position:relative;transition:all .1s linear}.next-tabs-tab-inner{position:relative;cursor:pointer;text-decoration:none}.next-tabs-tab:before{content:"";position:absolute;transition:all .3s ease}.next-tabs-tab.active{font-weight:400}.next-tabs-tab .next-tabs-tab-close{color:#666}.next-tabs-tab .next-tabs-tab-close:hover{color:#333}.next-tabs-tab .next-tabs-tab-close:focus{outline:none}.next-tabs-tab.active .next-tabs-tab-close{color:#209bfa}.next-tabs-tab.disabled .next-tabs-tab-close{color:#e6e6e6}.next-tabs-tab:focus{outline:none}.next-tabs-tabpane{visibility:hidden;opacity:0}.next-tabs-tabpane.active{visibility:visible;opacity:1;height:auto}.next-tabs-tabpane.hidden{overflow:hidden;height:0!important;margin:0!important;padding:0!important;border:0!important}.next-tabs-btn-down,.next-tabs-btn-next,.next-tabs-btn-prev{position:absolute;top:0;cursor:pointer;padding:0;border:0;outline:none;height:100%;background:transparent;border-color:transparent}.next-tabs-btn-down,.next-tabs-btn-down.visited,.next-tabs-btn-down:link,.next-tabs-btn-down:visited,.next-tabs-btn-next,.next-tabs-btn-next.visited,.next-tabs-btn-next:link,.next-tabs-btn-next:visited,.next-tabs-btn-prev,.next-tabs-btn-prev.visited,.next-tabs-btn-prev:link,.next-tabs-btn-prev:visited{color:#666}.next-tabs-btn-down.active,.next-tabs-btn-down.hover,.next-tabs-btn-down:active,.next-tabs-btn-down:focus,.next-tabs-btn-down:hover,.next-tabs-btn-next.active,.next-tabs-btn-next.hover,.next-tabs-btn-next:active,.next-tabs-btn-next:focus,.next-tabs-btn-next:hover,.next-tabs-btn-prev.active,.next-tabs-btn-prev.hover,.next-tabs-btn-prev:active,.next-tabs-btn-prev:focus,.next-tabs-btn-prev:hover{color:#333;background:transparent;border-color:transparent;text-decoration:none}.next-tabs-btn-down.disabled,.next-tabs-btn-next.disabled,.next-tabs-btn-prev.disabled{cursor:not-allowed;color:#e6e6e6}.next-tabs-btn-next{right:8px}.next-tabs-btn-prev{right:32px}.next-tabs-btn-down{right:8px}.next-tabs .next-tab-icon-dropdown:before{content:"顦�"}.next-tabs .next-tab-icon-prev:before{content:"顦�"}.next-tabs .next-tab-icon-next:before{content:"顦�"}.next-tabs-content{overflow:hidden}.next-tabs-vertical>.next-tabs-bar .next-tabs-nav{width:100%}.next-tabs-vertical>.next-tabs-bar .next-tabs-tab{display:block}.next-tabs.next-medium .next-tabs-nav-container-scrolling{padding-right:60px}.next-tabs.next-medium .next-tabs-tab-inner{font-size:14px;padding:20px 16px}.next-tabs.next-medium .next-tabs-tab-inner .next-icon{line-height:1}.next-tabs.next-medium .next-tabs-tab-inner .next-icon .next-icon-remote,.next-tabs.next-medium .next-tabs-tab-inner .next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-tabs.next-medium .next-tabs-tab-inner .next-tabs-tab-close{margin-left:8px}.next-tabs.next-medium .next-tabs-tab-inner .next-tabs-tab-close .next-icon-remote,.next-tabs.next-medium .next-tabs-tab-inner .next-tabs-tab-close:before{width:12px;font-size:12px;line-height:inherit}.next-tabs.next-medium .next-tabs-btn-down .next-icon .next-icon-remote,.next-tabs.next-medium .next-tabs-btn-down .next-icon:before,.next-tabs.next-medium .next-tabs-btn-next .next-icon .next-icon-remote,.next-tabs.next-medium .next-tabs-btn-next .next-icon:before,.next-tabs.next-medium .next-tabs-btn-prev .next-icon .next-icon-remote,.next-tabs.next-medium .next-tabs-btn-prev .next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-tabs.next-small .next-tabs-nav-container-scrolling{padding-right:56px}.next-tabs.next-small .next-tabs-tab-inner{font-size:12px;padding:8px 12px}.next-tabs.next-small .next-tabs-tab-inner .next-icon{line-height:1}.next-tabs.next-small .next-tabs-tab-inner .next-icon .next-icon-remote,.next-tabs.next-small .next-tabs-tab-inner .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-tabs.next-small .next-tabs-tab-inner .next-tabs-tab-close{margin-left:8px}.next-tabs.next-small .next-tabs-tab-inner .next-tabs-tab-close .next-icon-remote,.next-tabs.next-small .next-tabs-tab-inner .next-tabs-tab-close:before{width:8px;font-size:8px;line-height:inherit}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-tabs.next-small .next-tabs-tab-inner .next-tabs-tab-close{transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-tabs.next-small .next-tabs-tab-inner .next-tabs-tab-close:before{width:16px;font-size:16px}}.next-tabs.next-small .next-tabs-btn-down .next-icon .next-icon-remote,.next-tabs.next-small .next-tabs-btn-down .next-icon:before,.next-tabs.next-small .next-tabs-btn-next .next-icon .next-icon-remote,.next-tabs.next-small .next-tabs-btn-next .next-icon:before,.next-tabs.next-small .next-tabs-btn-prev .next-icon .next-icon-remote,.next-tabs.next-small .next-tabs-btn-prev .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-tabs-pure>.next-tabs-bar{border-bottom:1px solid #e6e6e6;background-color:transparent}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-container{margin-bottom:-1px;box-shadow:none}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-container .next-tabs-tab{color:#666;background-color:transparent}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-container .next-tabs-tab:hover{cursor:pointer;color:#333;background-color:transparent}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-container .next-tabs-tab.active{z-index:1;color:#209bfa;background-color:transparent}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-container .next-tabs-tab.disabled{pointer-events:none;cursor:default;color:#e6e6e6;background:transparent}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-container .next-tabs-tab:before{border-radius:0;width:0;border-bottom:2px solid #209bfa;left:50%;bottom:0}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-container .next-tabs-tab.active:before{width:100%;left:0}.next-tabs-wrapped>.next-tabs-bar{background:transparent}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab{color:#666;background-color:#f9f9f9}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab:hover{cursor:pointer;color:#333;background-color:#f5f5f5}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab.active{z-index:1;color:#209bfa;background-color:#fff}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab.disabled{pointer-events:none;cursor:default;color:#ccc;background:#fafafa}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab .next-tabs-tab-close{color:#666}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab .next-tabs-tab-close:hover{color:#333}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab .next-tabs-tab-close:focus{outline:none}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab.active .next-tabs-tab-close{color:#209bfa}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab.disabled .next-tabs-tab-close{color:#e6e6e6}.next-tabs-wrapped:after,.next-tabs-wrapped:before{content:"";display:table}.next-tabs-wrapped:after{clear:both}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar,.next-tabs-wrapped>.next-tabs-content{position:relative}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-nav-extra{position:absolute;top:50%;right:0;transform:translateY(-50%)}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-tab{margin-right:4px;border-radius:3px 3px 0 0;border:1px solid #e6e6e6}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-tab:hover{border-color:#ddd}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-tab.active{border-color:#e6e6e6 #e6e6e6 #fff}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-tab:before{border-radius:3px;width:0;border-top:2px solid #209bfa;left:50%;top:-1px}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-tab.active:before{width:calc(100% - 6px);left:3px}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-tab.active{border-width:1px}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar:before{content:"";position:absolute;top:100%;width:100%;height:0;border-bottom:1px solid #e6e6e6;transform:translateY(-1px);display:block}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar{position:relative}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-nav-extra{position:absolute;top:50%;right:0;transform:translateY(-50%)}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-tab{margin-right:4px;border:1px solid #e6e6e6;border-radius:0 0 3px 3px}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-tab:hover{border-color:#ddd}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-tab.active{border-color:#fff #e6e6e6 #e6e6e6}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-tab:before{border-radius:3px;width:0;border-bottom:2px solid #209bfa;left:50%;bottom:-1px}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-tab.active:before{width:calc(100% - 6px);left:3px}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-content{top:1px;border-bottom:1px solid #e6e6e6}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar{float:left}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar .next-tabs-tab{float:none;margin-bottom:4px;border-radius:3px 0 0 3px;border:1px solid #e6e6e6}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar .next-tabs-tab:hover{border-color:#ddd}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar .next-tabs-tab.active{border-color:#e6e6e6 #fff #e6e6e6 #e6e6e6}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar .next-tabs-tab:before{border-radius:3px;height:0;border-left:2px solid #209bfa;top:50%;left:-1px}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar .next-tabs-tab.active:before{height:calc(100% - 6px);top:3px}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar .next-tabs-tab.active{border-width:1px}.next-tabs-wrapped.next-tabs-left>.next-tabs-content{right:1px;border-left:1px solid #e6e6e6}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar{float:right}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar .next-tabs-tab{float:none;margin-bottom:4px;border-radius:0 3px 3px 0;border:1px solid #e6e6e6}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar .next-tabs-tab:hover{border-color:#ddd}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar .next-tabs-tab.active{border-color:#e6e6e6 #e6e6e6 #e6e6e6 #fff}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar .next-tabs-tab:before{border-radius:3px;height:0;border-right:2px solid #209bfa;top:50%;right:-1px}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar .next-tabs-tab.active:before{height:calc(100% - 6px);top:3px}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar .next-tabs-tab.active{border-width:1px}.next-tabs-wrapped.next-tabs-right>.next-tabs-content{right:-1px;border-right:1px solid #e6e6e6}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab{transition:background-color .1s linear;border:1px solid #ddd;border-right-color:transparent;margin-right:-1px;color:#333;background-color:#f9f9f9}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab:first-child{border-radius:3px 0 0 3px}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab:last-child{border-radius:0 3px 3px 0;border-right:1px solid #ddd}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab.active{border-right:1px solid;border-color:#209bfa}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab.disabled{border-color:#eee}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab:hover{z-index:2;border-right:1px solid;border-color:#ddd;cursor:pointer;color:#333;background-color:#f5f5f5}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab.active{z-index:1;color:#fff;background-color:#209bfa}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab.disabled{pointer-events:none;cursor:default;color:#ccc;background:#fafafa}.next-tabs-text>.next-tabs-bar .next-tabs-tab{color:#666;background-color:transparent}.next-tabs-text>.next-tabs-bar .next-tabs-tab:hover{cursor:pointer;color:#333;background-color:transparent}.next-tabs-text>.next-tabs-bar .next-tabs-tab.active{z-index:1;color:#209bfa;background-color:transparent}.next-tabs-text>.next-tabs-bar .next-tabs-tab.disabled{pointer-events:none;cursor:default;color:#ccc;background:transparent}.next-tabs-text>.next-tabs-bar .next-tabs-tab:not(:last-child):after{content:"";position:absolute;right:0;top:calc(50% - 4px);width:1px;height:8px;background-color:#e6e6e6}.next-tabs-pure>.next-tabs-bar{position:relative}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-extra{position:absolute;top:50%;right:0;transform:translateY(-50%)}.next-tabs-capsule>.next-tabs-bar{position:relative}.next-tabs-capsule>.next-tabs-bar .next-tabs-nav-extra{position:absolute;top:50%;right:0;transform:translateY(-50%)}.next-tabs-text>.next-tabs-bar{position:relative}.next-tabs-text>.next-tabs-bar .next-tabs-nav-extra{position:absolute;top:50%;right:0;transform:translateY(-50%)}.next-tabs[dir=rtl].next-medium .next-tabs-nav-container-scrolling{padding-left:60px;padding-right:0}.next-tabs[dir=rtl].next-medium .next-tabs-tab-close{padding-right:8px;padding-left:0}.next-tabs[dir=rtl].next-small .next-tabs-nav-container-scrolling{padding-left:56px;padding-right:0}.next-tabs[dir=rtl].next-small .next-tabs-tab-close{padding-right:8px;padding-left:0}.next-tabs[dir=rtl].next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-nav-extra,.next-tabs[dir=rtl].next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-nav-extra,.next-tabs[dir=rtl]>.next-tabs-bar .next-tabs-nav-extra{right:auto;left:0}.next-tabs[dir=rtl].next-tabs-capsule>.next-tabs-bar .next-tabs-tab{border:1px solid #ddd;border-left:0}.next-tabs[dir=rtl].next-tabs-capsule>.next-tabs-bar .next-tabs-tab:first-child{border-left:0;border-radius:0 3px 3px 0}.next-tabs[dir=rtl].next-tabs-capsule>.next-tabs-bar .next-tabs-tab:last-child{border-radius:3px 0 0 3px;border-left:1px solid #ddd}.next-tabs[dir=rtl].next-tabs-capsule>.next-tabs-bar .next-tabs-tab.active{margin-left:-1px;margin-right:auto;border-left:1px solid;border-color:#209bfa}.next-tabs[dir=rtl] .next-tabs-btn-next{left:8px;right:auto}.next-tabs[dir=rtl] .next-tabs-btn-prev{left:32px;right:auto}.next-tabs[dir=rtl] .next-tabs-btn-down{left:8px;right:auto}.next-tabs-text[dir=rtl]>.next-tabs-bar .next-tabs-tab:not(:last-child):after{content:"";position:absolute;left:0;right:auto}@keyframes fadeInRightForTag{0%{opacity:0;transform:rotate(45deg) translateX(20px)}to{opacity:1;transform:rotate(45deg) translateX(0)}}.next-tag>.next-tag-body{overflow:hidden;text-overflow:ellipsis}.next-tag-checkable.next-tag-level-secondary{color:#333;border-color:transparent;background-color:transparent}.next-tag-checkable.next-tag-level-secondary:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-secondary:not(.disabled):not([disabled]):hover{color:#209bfa}.next-tag-default.next-tag-level-primary{color:#666;border-color:#f5f5f5;background-color:#f5f5f5}.next-tag-default.next-tag-level-primary:not(.disabled):not([disabled]).hover,.next-tag-default.next-tag-level-primary:not(.disabled):not([disabled]):hover{color:#333;border-color:#f2f2f2;background-color:#f2f2f2}.next-tag-default.next-tag-level-primary:not(.disabled):not([disabled]).hover>.next-tag-close-btn,.next-tag-default.next-tag-level-primary:not(.disabled):not([disabled]):hover>.next-tag-close-btn{color:#333}.disabled.next-tag-default.next-tag-level-primary,[disabled].next-tag-default.next-tag-level-primary{color:#ccc;border-color:#fafafa;background-color:#fafafa}.disabled.next-tag-default.next-tag-level-primary>.next-tag-close-btn,[disabled].next-tag-default.next-tag-level-primary>.next-tag-close-btn{color:#ccc}.next-tag-default.next-tag-level-primary>.next-tag-close-btn{color:#666}.next-tag-closable.next-tag-level-primary{color:#666;border-color:#f5f5f5;background-color:#f5f5f5}.next-tag-closable.next-tag-level-primary:not(.disabled):not([disabled]).hover,.next-tag-closable.next-tag-level-primary:not(.disabled):not([disabled]):hover{color:#333;border-color:#f2f2f2;background-color:#f2f2f2}.next-tag-closable.next-tag-level-primary:not(.disabled):not([disabled]).hover>.next-tag-close-btn,.next-tag-closable.next-tag-level-primary:not(.disabled):not([disabled]):hover>.next-tag-close-btn{color:#333}.disabled.next-tag-closable.next-tag-level-primary,[disabled].next-tag-closable.next-tag-level-primary{color:#ccc;border-color:#fafafa;background-color:#fafafa}.disabled.next-tag-closable.next-tag-level-primary>.next-tag-close-btn,[disabled].next-tag-closable.next-tag-level-primary>.next-tag-close-btn{color:#ccc}.next-tag-closable.next-tag-level-primary>.next-tag-close-btn{color:#666}.next-tag-checkable.next-tag-level-primary{color:#666;border-color:#f5f5f5;background-color:#f5f5f5}.next-tag-checkable.next-tag-level-primary:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-primary:not(.disabled):not([disabled]):hover{color:#333;border-color:#f2f2f2;background-color:#f2f2f2}.next-tag-checkable.next-tag-level-primary:not(.disabled):not([disabled]).hover>.next-tag-close-btn,.next-tag-checkable.next-tag-level-primary:not(.disabled):not([disabled]):hover>.next-tag-close-btn{color:#333}.disabled.next-tag-checkable.next-tag-level-primary,[disabled].next-tag-checkable.next-tag-level-primary{color:#ccc;border-color:#fafafa;background-color:#fafafa}.disabled.next-tag-checkable.next-tag-level-primary>.next-tag-close-btn,[disabled].next-tag-checkable.next-tag-level-primary>.next-tag-close-btn{color:#ccc}.next-tag-checkable.next-tag-level-primary>.next-tag-close-btn{color:#666}.next-tag-checkable.next-tag-level-primary.checked{color:#fff;border-color:#209bfa;background-color:#209bfa}.next-tag-checkable.next-tag-level-primary.checked:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-primary.checked:not(.disabled):not([disabled]):hover{color:#fff;border-color:#1274e7;background-color:#1274e7}.next-tag-checkable.next-tag-level-primary.checked:not(.disabled):not([disabled]).hover>.next-tag-close-btn,.next-tag-checkable.next-tag-level-primary.checked:not(.disabled):not([disabled]):hover>.next-tag-close-btn{color:#fff}.disabled.next-tag-checkable.next-tag-level-primary.checked,[disabled].next-tag-checkable.next-tag-level-primary.checked{color:#ccc;border-color:#fafafa;background-color:#fafafa}.disabled.next-tag-checkable.next-tag-level-primary.checked>.next-tag-close-btn,.next-tag-checkable.next-tag-level-primary.checked>.next-tag-close-btn,[disabled].next-tag-checkable.next-tag-level-primary.checked>.next-tag-close-btn{color:#fff}.next-tag-default.next-tag-level-normal{color:#666;border-color:#ddd;background-color:transparent}.next-tag-default.next-tag-level-normal:not(.disabled):not([disabled]).hover,.next-tag-default.next-tag-level-normal:not(.disabled):not([disabled]):hover{color:#333;border-color:#ccc;background-color:transparent}.next-tag-default.next-tag-level-normal:not(.disabled):not([disabled]).hover>.next-tag-close-btn,.next-tag-default.next-tag-level-normal:not(.disabled):not([disabled]):hover>.next-tag-close-btn{color:#333}.disabled.next-tag-default.next-tag-level-normal,[disabled].next-tag-default.next-tag-level-normal{color:#ccc;border-color:#eee;background-color:#fafafa}.disabled.next-tag-default.next-tag-level-normal>.next-tag-close-btn,[disabled].next-tag-default.next-tag-level-normal>.next-tag-close-btn{color:#ccc}.next-tag-default.next-tag-level-normal>.next-tag-close-btn{color:#666}.next-tag-closable.next-tag-level-normal{color:#666;border-color:#ddd;background-color:transparent}.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]).hover,.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]):hover{color:#333;border-color:#ccc;background-color:transparent}.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]).hover>.next-tag-close-btn,.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]):hover>.next-tag-close-btn{color:#333}.disabled.next-tag-closable.next-tag-level-normal,[disabled].next-tag-closable.next-tag-level-normal{color:#ccc;border-color:#eee;background-color:transparent}.disabled.next-tag-closable.next-tag-level-normal>.next-tag-close-btn,[disabled].next-tag-closable.next-tag-level-normal>.next-tag-close-btn{color:#ccc}.next-tag-closable.next-tag-level-normal>.next-tag-close-btn{color:#666}.next-tag-checkable.next-tag-level-normal.checked{color:#209bfa;border-color:#209bfa;background-color:transparent}.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]):hover{color:#1274e7;border-color:#1274e7;background-color:transparent}.next-tag-checkable.next-tag-level-secondary.checked{color:#209bfa;border-color:#209bfa;background-color:transparent}.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]):hover{color:#1274e7;border-color:#1274e7;background-color:transparent}.next-tag-checkable.next-tag-level-secondary.checked:before{position:absolute;content:"";-webkit-font-smoothing:antialiased;background-color:#209bfa;transform:rotate(45deg)}.next-tag-checkable.next-tag-level-secondary.checked:after{position:absolute;font-family:NextIcon;-webkit-font-smoothing:antialiased;content:"顦�";transform:scale(.6);color:#fff}.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]).hover:before,.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]):hover:before{background-color:#1274e7}.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]).hover:after,.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]):hover:after{color:#fff}.next-tag-checkable.next-tag-level-secondary.checked:disabled:before,[disabled].next-tag-checkable.next-tag-level-secondary.checked:before{background-color:#eee}.next-tag-checkable.next-tag-level-secondary.checked:disabled:after,[disabled].next-tag-checkable.next-tag-level-secondary.checked:after{color:#fff}.next-tag-checkable.next-tag-level-normal{color:#666;border-color:#ddd;background-color:transparent}.next-tag-checkable.next-tag-level-normal:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-normal:not(.disabled):not([disabled]):hover{color:#333;border-color:#ddd;background-color:transparent}.disabled.next-tag-checkable.next-tag-level-normal,[disabled].next-tag-checkable.next-tag-level-normal{color:#ccc;border-color:#eee;background-color:#fafafa}.next-tag-checkable.next-tag-level-normal.checked:before{position:absolute;content:"";-webkit-font-smoothing:antialiased;background-color:#209bfa;transform:rotate(45deg)}.next-tag-checkable.next-tag-level-normal.checked:after{position:absolute;font-family:NextIcon;-webkit-font-smoothing:antialiased;content:"顦�";transform:scale(.6);color:#fff}.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]).hover:before,.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]):hover:before{background-color:#1274e7}.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]).hover:after,.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]):hover:after{color:#fff}.next-tag-checkable.next-tag-level-normal.checked:disabled:before,[disabled].next-tag-checkable.next-tag-level-normal.checked:before{background-color:#eee}.next-tag-checkable.next-tag-level-normal.checked:disabled:after,[disabled].next-tag-checkable.next-tag-level-normal.checked:after{color:#fff}.next-tag-closable.next-tag-level-normal:before{position:absolute;content:"";-webkit-font-smoothing:antialiased;background-color:#ddd;transform:rotate(45deg)}.next-tag-closable.next-tag-level-normal:after{position:absolute;font-family:NextIcon;-webkit-font-smoothing:antialiased;content:"顦�";transform:scale(.6);color:#fff}.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]).hover:before,.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]):hover:before{background-color:#ccc}.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]).hover:after,.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]):hover:after{color:#fff}.next-tag-closable.next-tag-level-normal:disabled:before,[disabled].next-tag-closable.next-tag-level-normal:before{background-color:#eee}.next-tag-closable.next-tag-level-normal:disabled:after,[disabled].next-tag-closable.next-tag-level-normal:after{color:#fff}.next-tag-group .next-tag-large,.next-tag-group .next-tag-medium{margin-right:8px;margin-bottom:8px}.next-tag-group .next-tag-small{margin-right:4px;margin-bottom:4px}.next-tag{display:inline-block;max-width:100%;vertical-align:middle;border-width:1px;border-radius:3px;box-shadow:none;border-style:solid;overflow:hidden;white-space:nowrap;transition:all .1s linear;font-size:0;outline:0}.next-tag,.next-tag *,.next-tag :after,.next-tag :before{box-sizing:border-box}.next-tag>.next-tag-body{position:relative;display:inline-block;height:100%;text-align:center;vertical-align:middle;max-width:100%;cursor:default}.next-tag>.next-tag-body>a{text-decoration:none;color:inherit}.next-tag>.next-tag-body>a:before{content:" ";position:absolute;display:block;top:0;left:0;right:0;bottom:0}.next-tag>.next-tag-body .next-icon{line-height:1;vertical-align:baseline}.next-tag>.next-tag-body .next-icon:before{font-size:inherit}.next-tag.next-tag-body-pointer{cursor:pointer}.next-tag.disabled,.next-tag[disabled]{cursor:not-allowed;pointer-events:none}.next-tag-blue{background-color:#4494f9;border-color:#4494f9;color:#fff}.next-tag-blue-inverse{background-color:rgba(68,148,249,.25);border-color:#4494f9;color:#4494f9}.next-tag-green{background-color:#46bc15;border-color:#46bc15;color:#fff}.next-tag-green-inverse{background-color:rgba(70,188,21,.25);border-color:#46bc15;color:#46bc15}.next-tag-orange{background-color:#ff9300;border-color:#ff9300;color:#fff}.next-tag-orange-inverse{background-color:rgba(255,147,0,.25);border-color:#ff9300;color:#ff9300}.next-tag-red{background-color:#ff3000;border-color:#ff3000;color:#fff}.next-tag-red-inverse{background-color:rgba(255,48,0,.25);border-color:#ff3000;color:#ff3000}.next-tag-turquoise{background-color:#01c1b2;border-color:#01c1b2;color:#fff}.next-tag-turquoise-inverse{background-color:rgba(1,193,178,.25);border-color:#01c1b2;color:#01c1b2}.next-tag-yellow{background-color:#fccc12;border-color:#fccc12;color:#fff}.next-tag-yellow-inverse{background-color:rgba(252,204,18,.25);border-color:#fccc12;color:#fccc12}.next-tag-large{height:40px;padding:0;line-height:38px;font-size:0}.next-tag-large>.next-tag-body{font-size:16px;padding:0 16px;min-width:48px}.next-tag-large.next-tag-closable>.next-tag-body{padding:0 0 0 16px;max-width:calc(100% - 48px)}.next-tag-large[dir=rtl].next-tag-closable>.next-tag-body{padding:0 16px 0 0}.next-tag-large.next-tag-closable>.next-tag-close-btn{margin-left:16px;padding-right:16px}.next-tag-large.next-tag-closable>.next-tag-close-btn .next-icon .next-icon-remote,.next-tag-large.next-tag-closable>.next-tag-close-btn .next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-tag-large[dir=rtl]>.next-tag-close-btn{margin-right:16px;margin-left:0;padding-right:0;padding-left:16px}.next-tag-medium{height:32px;padding:0;line-height:30px;font-size:0}.next-tag-medium>.next-tag-body{font-size:14px;padding:0 12px;min-width:40px}.next-tag-medium.next-tag-closable>.next-tag-body{padding:0 0 0 12px;max-width:calc(100% - 36px)}.next-tag-medium[dir=rtl].next-tag-closable>.next-tag-body{padding:0 12px 0 0}.next-tag-medium.next-tag-closable>.next-tag-close-btn{margin-left:12px;padding-right:12px}.next-tag-medium.next-tag-closable>.next-tag-close-btn .next-icon .next-icon-remote,.next-tag-medium.next-tag-closable>.next-tag-close-btn .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-tag-medium[dir=rtl]>.next-tag-close-btn{margin-right:12px;margin-left:0;padding-right:0;padding-left:12px}.next-tag-small{height:24px;padding:0;line-height:22px;font-size:0}.next-tag-small>.next-tag-body{font-size:12px;padding:0 8px;min-width:28px}.next-tag-small.next-tag-closable>.next-tag-body{padding:0 0 0 8px;max-width:calc(100% - 24px)}.next-tag-small[dir=rtl].next-tag-closable>.next-tag-body{padding:0 8px 0 0}.next-tag-small.next-tag-closable>.next-tag-close-btn{margin-left:8px;padding-right:8px}.next-tag-small.next-tag-closable>.next-tag-close-btn .next-icon .next-icon-remote,.next-tag-small.next-tag-closable>.next-tag-close-btn .next-icon:before{width:8px;font-size:8px;line-height:inherit}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-tag-small.next-tag-closable>.next-tag-close-btn .next-icon{transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-tag-small.next-tag-closable>.next-tag-close-btn .next-icon:before{width:16px;font-size:16px}}.next-tag-small[dir=rtl]>.next-tag-close-btn{margin-right:8px;margin-left:0;padding-right:0;padding-left:8px}.next-tag-default{cursor:default}.next-tag-closable{position:relative}.next-tag-closable>.next-tag-close-btn{display:inline-block;vertical-align:middle;height:100%;text-align:center;cursor:pointer}.next-tag-checkable{cursor:pointer;position:relative;border-radius:3px}.next-tag-checkable.checked:before{animation:fadeInRightForTag .4s cubic-bezier(.78,.14,.15,.86)}.next-tag-checkable.checked:after{animation:zoomIn .4s cubic-bezier(.78,.14,.15,.86)}.next-tag-checkable.next-tag-small:not(.next-tag-level-primary):before{right:-10px;bottom:-10px;width:20px;height:20px}.next-tag-checkable.next-tag-small:not(.next-tag-level-primary):after{font-size:8px;line-height:8px;right:0;bottom:0}.next-tag-checkable.next-tag-medium:not(.next-tag-level-primary):before{right:-14px;bottom:-14px;width:28px;height:28px}.next-tag-checkable.next-tag-medium:not(.next-tag-level-primary):after{font-size:12px;line-height:12px;right:0;bottom:0}.next-tag-checkable.next-tag-large:not(.next-tag-level-primary):before{right:-18px;bottom:-18px;width:36px;height:36px}.next-tag-checkable.next-tag-large:not(.next-tag-level-primary):after{font-size:16px;line-height:16px;right:0;bottom:0}.next-tag-checkable.next-tag-level-secondary.disabled,.next-tag-checkable.next-tag-level-secondary[disabled]{color:#ccc;border-color:#eee;background-color:#fafafa}.next-tag-zoom-appear,.next-tag-zoom-enter{animation:fadeInLeft .4s cubic-bezier(.78,.14,.15,.86);animation-fill-mode:both}.next-tag-zoom-leave{animation:zoomOut .3s ease-in;animation-fill-mode:both}.next-timeline,.next-timeline *,.next-timeline:after,.next-timeline :after,.next-timeline:before,.next-timeline :before{box-sizing:border-box}.next-timeline ul{margin:0;padding:0;list-style:none}.next-timeline p{margin:0}.next-timeline-hide{display:none}.next-timeline[dir=rtl] .next-timeline-item-folder{padding-left:0;padding-right:28px}.next-timeline[dir=rtl] .next-timeline-item-dot-tail{left:auto;right:8px;border-left:none;border-right:1px dotted #e6e6e6}.next-timeline[dir=rtl] .next-timeline-item-has-left-content.next-timeline-item-folder{margin-left:0;margin-right:80px}.next-timeline[dir=rtl] .next-timeline-item-done{position:relative}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-timeline{position:absolute;left:auto;right:0;top:0;height:100%}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-node{position:relative;width:16px;height:24px;padding:4px 0;text-align:center;float:right}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-node.next-timeline-item-node-custom{width:40px;height:auto;font-size:12px;word-break:break-all;margin-right:-12px;margin-left:0;line-height:1}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-dot{display:block;position:absolute;width:8px;height:8px;border-radius:100%;top:50%;margin-top:-4px;left:50%;margin-left:-4px}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-icon{display:block;position:absolute;width:16px;height:16px;line-height:16px;border-radius:100%;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-icon .next-icon .next-icon-remote,.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-icon .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-tail{position:absolute;width:auto;height:calc(100% - 24px);top:24px;left:auto;right:8px}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-tail i{display:inline-block;vertical-align:top;height:100%;width:1px;position:relative;background:#e6e6e6;-webkit-transition:all .1s linear;transition:all .1s linear}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-content{display:inline-block;margin-right:28px;margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-content .next-timeline-item-title{font-size:14px;font-weight:700;line-height:1.5;margin:4px 0 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;text-align:right}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-content .next-timeline-item-body{margin:4px 0 0;font-size:12px;line-height:1.5;color:#666;text-align:right}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-content .next-timeline-item-time{margin:4px 0 12px;font-size:12px;color:#999;text-align:right}.next-timeline[dir=rtl] .next-timeline-item-done.next-timeline-item-has-left-content>.next-timeline-item-left-content{position:absolute;width:80px;display:inline-block;font-size:12px;color:#999;line-height:1.5;margin-top:4px;text-align:left;padding-left:12px;padding-right:0}.next-timeline[dir=rtl] .next-timeline-item-done.next-timeline-item-has-left-content>.next-timeline-item-left-content p{word-break:break-word}.next-timeline[dir=rtl] .next-timeline-item-done.next-timeline-item-has-left-content>.next-timeline-item-timeline{margin-right:80px;margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-done.next-timeline-item-has-left-content>.next-timeline-item-content{margin-right:108px;margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-dot{background:#ddd}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-icon{background:#ddd;color:#fff}.next-timeline[dir=rtl] .next-timeline-item-process{position:relative}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-timeline{position:absolute;left:auto;right:0;top:0;height:100%}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-node{position:relative;width:16px;height:24px;padding:4px 0;text-align:center;float:right}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-node.next-timeline-item-node-custom{width:40px;height:auto;font-size:12px;word-break:break-all;margin-right:-12px;margin-left:0;line-height:1}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-dot{display:block;position:absolute;width:8px;height:8px;border-radius:100%;top:50%;margin-top:-4px;left:50%;margin-left:-4px}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-icon{display:block;position:absolute;width:16px;height:16px;line-height:16px;border-radius:100%;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-icon .next-icon .next-icon-remote,.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-icon .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-tail{position:absolute;width:auto;height:calc(100% - 24px);top:24px;left:auto;right:8px}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-tail i{display:inline-block;vertical-align:top;height:100%;width:1px;position:relative;background:#e6e6e6;-webkit-transition:all .1s linear;transition:all .1s linear}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-content{display:inline-block;margin-right:28px;margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-content .next-timeline-item-title{font-size:14px;font-weight:700;line-height:1.5;margin:4px 0 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;text-align:right}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-content .next-timeline-item-body{margin:4px 0 0;font-size:12px;line-height:1.5;color:#666;text-align:right}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-content .next-timeline-item-time{margin:4px 0 12px;font-size:12px;color:#999;text-align:right}.next-timeline[dir=rtl] .next-timeline-item-process.next-timeline-item-has-left-content>.next-timeline-item-left-content{position:absolute;width:80px;display:inline-block;font-size:12px;color:#999;line-height:1.5;margin-top:4px;text-align:left;padding-left:12px;padding-right:0}.next-timeline[dir=rtl] .next-timeline-item-process.next-timeline-item-has-left-content>.next-timeline-item-left-content p{word-break:break-word}.next-timeline[dir=rtl] .next-timeline-item-process.next-timeline-item-has-left-content>.next-timeline-item-timeline{margin-right:80px;margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-process.next-timeline-item-has-left-content>.next-timeline-item-content{margin-right:108px;margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-dot{background:#209bfa}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-icon{background:#209bfa;color:#fff}.next-timeline[dir=rtl] .next-timeline-item-success{position:relative}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-timeline{position:absolute;left:auto;right:0;top:0;height:100%}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-node{position:relative;width:16px;height:24px;padding:4px 0;text-align:center;float:right}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-node.next-timeline-item-node-custom{width:40px;height:auto;font-size:12px;word-break:break-all;margin-right:-12px;margin-left:0;line-height:1}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-dot{display:block;position:absolute;width:8px;height:8px;border-radius:100%;top:50%;margin-top:-4px;left:50%;margin-left:-4px}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-icon{display:block;position:absolute;width:16px;height:16px;line-height:16px;border-radius:100%;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-icon .next-icon .next-icon-remote,.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-icon .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-tail{position:absolute;width:auto;height:calc(100% - 24px);top:24px;left:auto;right:8px}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-tail i{display:inline-block;vertical-align:top;height:100%;width:1px;position:relative;background:#e6e6e6;-webkit-transition:all .1s linear;transition:all .1s linear}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-content{display:inline-block;margin-right:28px;margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-content .next-timeline-item-title{font-size:14px;font-weight:700;line-height:1.5;margin:4px 0 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;text-align:right}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-content .next-timeline-item-body{margin:4px 0 0;font-size:12px;line-height:1.5;color:#666;text-align:right}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-content .next-timeline-item-time{margin:4px 0 12px;font-size:12px;color:#999;text-align:right}.next-timeline[dir=rtl] .next-timeline-item-success.next-timeline-item-has-left-content>.next-timeline-item-left-content{position:absolute;width:80px;display:inline-block;font-size:12px;color:#999;line-height:1.5;margin-top:4px;text-align:left;padding-left:12px;padding-right:0}.next-timeline[dir=rtl] .next-timeline-item-success.next-timeline-item-has-left-content>.next-timeline-item-left-content p{word-break:break-word}.next-timeline[dir=rtl] .next-timeline-item-success.next-timeline-item-has-left-content>.next-timeline-item-timeline{margin-right:80px;margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-success.next-timeline-item-has-left-content>.next-timeline-item-content{margin-right:108px;margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-dot{background:#1ad78c}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-icon{background:#1ad78c;color:#fff}.next-timeline[dir=rtl] .next-timeline-item-error{position:relative}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-timeline{position:absolute;left:auto;right:0;top:0;height:100%}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-node{position:relative;width:16px;height:24px;padding:4px 0;text-align:center;float:right}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-node.next-timeline-item-node-custom{width:40px;height:auto;font-size:12px;word-break:break-all;margin-right:-12px;margin-left:0;line-height:1}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-dot{display:block;position:absolute;width:8px;height:8px;border-radius:100%;top:50%;margin-top:-4px;left:50%;margin-left:-4px}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-icon{display:block;position:absolute;width:16px;height:16px;line-height:16px;border-radius:100%;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-icon .next-icon .next-icon-remote,.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-icon .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-tail{position:absolute;width:auto;height:calc(100% - 24px);top:24px;left:auto;right:8px}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-tail i{display:inline-block;vertical-align:top;height:100%;width:1px;position:relative;background:#e6e6e6;-webkit-transition:all .1s linear;transition:all .1s linear}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-content{display:inline-block;margin-right:28px;margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-content .next-timeline-item-title{font-size:14px;font-weight:700;line-height:1.5;margin:4px 0 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;text-align:right}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-content .next-timeline-item-body{margin:4px 0 0;font-size:12px;line-height:1.5;color:#666;text-align:right}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-content .next-timeline-item-time{margin:4px 0 12px;font-size:12px;color:#999;text-align:right}.next-timeline[dir=rtl] .next-timeline-item-error.next-timeline-item-has-left-content>.next-timeline-item-left-content{position:absolute;width:80px;display:inline-block;font-size:12px;color:#999;line-height:1.5;margin-top:4px;text-align:left;padding-left:12px;padding-right:0}.next-timeline[dir=rtl] .next-timeline-item-error.next-timeline-item-has-left-content>.next-timeline-item-left-content p{word-break:break-word}.next-timeline[dir=rtl] .next-timeline-item-error.next-timeline-item-has-left-content>.next-timeline-item-timeline{margin-right:80px;margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-error.next-timeline-item-has-left-content>.next-timeline-item-content{margin-right:108px;margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-dot{background:#d23c26}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-icon{background:#d23c26;color:#fff}.next-timeline{margin:0;padding:0;list-style:none}.next-timeline>li{outline:0}.next-timeline-item-folder{padding-left:28px;padding-top:4px;padding-bottom:4px;font-size:12px;line-height:1.5;position:relative}.next-timeline-item-dot-tail{position:absolute;top:0;left:8px;height:100%;border:0;border-left:1px dotted #e6e6e6}.next-timeline-item-dot-tail-solid{border-style:solid}.next-timeline-item-has-left-content.next-timeline-item-folder{margin-left:80px}.next-timeline-item-done{position:relative}.next-timeline-item-done .next-timeline-item-timeline{position:absolute;left:0;top:0;height:100%}.next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-node{position:relative;width:16px;height:24px;padding:4px 0;text-align:center;float:left}.next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-node.next-timeline-item-node-custom{width:40px;height:auto;font-size:12px;word-break:break-all;margin-left:-12px;line-height:1}.next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-dot{display:block;position:absolute;width:8px;height:8px;border-radius:100%;top:50%;margin-top:-4px;left:50%;margin-left:-4px}.next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-icon{display:block;position:absolute;width:16px;height:16px;line-height:16px;border-radius:100%;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-icon .next-icon .next-icon-remote,.next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-icon .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-tail{position:absolute;width:auto;height:calc(100% - 24px);top:24px;left:8px}.next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-tail i{display:inline-block;vertical-align:top;height:100%;width:1px;position:relative;background:#e6e6e6;-webkit-transition:all .1s linear;transition:all .1s linear}.next-timeline-item-done .next-timeline-item-content{display:inline-block;margin-left:28px}.next-timeline-item-done .next-timeline-item-content .next-timeline-item-title{font-size:14px;font-weight:700;line-height:1.5;margin:4px 0 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;text-align:left}.next-timeline-item-done .next-timeline-item-content .next-timeline-item-body{margin:4px 0 0;font-size:12px;line-height:1.5;color:#666;text-align:left}.next-timeline-item-done .next-timeline-item-content .next-timeline-item-time{margin:4px 0 12px;font-size:12px;color:#999;text-align:left}.next-timeline-item-done.next-timeline-item-has-left-content>.next-timeline-item-left-content{position:absolute;width:80px;display:inline-block;font-size:12px;color:#999;line-height:1.5;margin-top:4px;text-align:right;padding-right:12px}.next-timeline-item-done.next-timeline-item-has-left-content>.next-timeline-item-left-content p{word-break:break-word}.next-timeline-item-done.next-timeline-item-has-left-content>.next-timeline-item-timeline{margin-left:80px}.next-timeline-item-done.next-timeline-item-has-left-content>.next-timeline-item-content{margin-left:108px}.next-timeline-item-done .next-timeline-item-dot{background:#ddd}.next-timeline-item-done .next-timeline-item-icon{background:#ddd;color:#fff}.next-timeline-item-process{position:relative}.next-timeline-item-process .next-timeline-item-timeline{position:absolute;left:0;top:0;height:100%}.next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-node{position:relative;width:16px;height:24px;padding:4px 0;text-align:center;float:left}.next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-node.next-timeline-item-node-custom{width:40px;height:auto;font-size:12px;word-break:break-all;margin-left:-12px;line-height:1}.next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-dot{display:block;position:absolute;width:8px;height:8px;border-radius:100%;top:50%;margin-top:-4px;left:50%;margin-left:-4px}.next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-icon{display:block;position:absolute;width:16px;height:16px;line-height:16px;border-radius:100%;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-icon .next-icon .next-icon-remote,.next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-icon .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-tail{position:absolute;width:auto;height:calc(100% - 24px);top:24px;left:8px}.next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-tail i{display:inline-block;vertical-align:top;height:100%;width:1px;position:relative;background:#e6e6e6;-webkit-transition:all .1s linear;transition:all .1s linear}.next-timeline-item-process .next-timeline-item-content{display:inline-block;margin-left:28px}.next-timeline-item-process .next-timeline-item-content .next-timeline-item-title{font-size:14px;font-weight:700;line-height:1.5;margin:4px 0 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;text-align:left}.next-timeline-item-process .next-timeline-item-content .next-timeline-item-body{margin:4px 0 0;font-size:12px;line-height:1.5;color:#666;text-align:left}.next-timeline-item-process .next-timeline-item-content .next-timeline-item-time{margin:4px 0 12px;font-size:12px;color:#999;text-align:left}.next-timeline-item-process.next-timeline-item-has-left-content>.next-timeline-item-left-content{position:absolute;width:80px;display:inline-block;font-size:12px;color:#999;line-height:1.5;margin-top:4px;text-align:right;padding-right:12px}.next-timeline-item-process.next-timeline-item-has-left-content>.next-timeline-item-left-content p{word-break:break-word}.next-timeline-item-process.next-timeline-item-has-left-content>.next-timeline-item-timeline{margin-left:80px}.next-timeline-item-process.next-timeline-item-has-left-content>.next-timeline-item-content{margin-left:108px}.next-timeline-item-process .next-timeline-item-dot{background:#209bfa}.next-timeline-item-process .next-timeline-item-icon{background:#209bfa;color:#fff}.next-timeline-item-success{position:relative}.next-timeline-item-success .next-timeline-item-timeline{position:absolute;left:0;top:0;height:100%}.next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-node{position:relative;width:16px;height:24px;padding:4px 0;text-align:center;float:left}.next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-node.next-timeline-item-node-custom{width:40px;height:auto;font-size:12px;word-break:break-all;margin-left:-12px;line-height:1}.next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-dot{display:block;position:absolute;width:8px;height:8px;border-radius:100%;top:50%;margin-top:-4px;left:50%;margin-left:-4px}.next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-icon{display:block;position:absolute;width:16px;height:16px;line-height:16px;border-radius:100%;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-icon .next-icon .next-icon-remote,.next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-icon .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-tail{position:absolute;width:auto;height:calc(100% - 24px);top:24px;left:8px}.next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-tail i{display:inline-block;vertical-align:top;height:100%;width:1px;position:relative;background:#e6e6e6;-webkit-transition:all .1s linear;transition:all .1s linear}.next-timeline-item-success .next-timeline-item-content{display:inline-block;margin-left:28px}.next-timeline-item-success .next-timeline-item-content .next-timeline-item-title{font-size:14px;font-weight:700;line-height:1.5;margin:4px 0 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;text-align:left}.next-timeline-item-success .next-timeline-item-content .next-timeline-item-body{margin:4px 0 0;font-size:12px;line-height:1.5;color:#666;text-align:left}.next-timeline-item-success .next-timeline-item-content .next-timeline-item-time{margin:4px 0 12px;font-size:12px;color:#999;text-align:left}.next-timeline-item-success.next-timeline-item-has-left-content>.next-timeline-item-left-content{position:absolute;width:80px;display:inline-block;font-size:12px;color:#999;line-height:1.5;margin-top:4px;text-align:right;padding-right:12px}.next-timeline-item-success.next-timeline-item-has-left-content>.next-timeline-item-left-content p{word-break:break-word}.next-timeline-item-success.next-timeline-item-has-left-content>.next-timeline-item-timeline{margin-left:80px}.next-timeline-item-success.next-timeline-item-has-left-content>.next-timeline-item-content{margin-left:108px}.next-timeline-item-success .next-timeline-item-dot{background:#1ad78c}.next-timeline-item-success .next-timeline-item-icon{background:#1ad78c;color:#fff}.next-timeline-item-error{position:relative}.next-timeline-item-error .next-timeline-item-timeline{position:absolute;left:0;top:0;height:100%}.next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-node{position:relative;width:16px;height:24px;padding:4px 0;text-align:center;float:left}.next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-node.next-timeline-item-node-custom{width:40px;height:auto;font-size:12px;word-break:break-all;margin-left:-12px;line-height:1}.next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-dot{display:block;position:absolute;width:8px;height:8px;border-radius:100%;top:50%;margin-top:-4px;left:50%;margin-left:-4px}.next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-icon{display:block;position:absolute;width:16px;height:16px;line-height:16px;border-radius:100%;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-icon .next-icon .next-icon-remote,.next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-icon .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-tail{position:absolute;width:auto;height:calc(100% - 24px);top:24px;left:8px}.next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-tail i{display:inline-block;vertical-align:top;height:100%;width:1px;position:relative;background:#e6e6e6;-webkit-transition:all .1s linear;transition:all .1s linear}.next-timeline-item-error .next-timeline-item-content{display:inline-block;margin-left:28px}.next-timeline-item-error .next-timeline-item-content .next-timeline-item-title{font-size:14px;font-weight:700;line-height:1.5;margin:4px 0 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;text-align:left}.next-timeline-item-error .next-timeline-item-content .next-timeline-item-body{margin:4px 0 0;font-size:12px;line-height:1.5;color:#666;text-align:left}.next-timeline-item-error .next-timeline-item-content .next-timeline-item-time{margin:4px 0 12px;font-size:12px;color:#999;text-align:left}.next-timeline-item-error.next-timeline-item-has-left-content>.next-timeline-item-left-content{position:absolute;width:80px;display:inline-block;font-size:12px;color:#999;line-height:1.5;margin-top:4px;text-align:right;padding-right:12px}.next-timeline-item-error.next-timeline-item-has-left-content>.next-timeline-item-left-content p{word-break:break-word}.next-timeline-item-error.next-timeline-item-has-left-content>.next-timeline-item-timeline{margin-left:80px}.next-timeline-item-error.next-timeline-item-has-left-content>.next-timeline-item-content{margin-left:108px}.next-timeline-item-error .next-timeline-item-dot{background:#d23c26}.next-timeline-item-error .next-timeline-item-icon{background:#d23c26;color:#fff}.next-timeline.next-alternate .next-timeline-item-left .next-timeline-item-left-content,.next-timeline.next-alternate .next-timeline-item-right .next-timeline-item-left-content{width:50%;padding-right:12px}.next-timeline.next-alternate .next-timeline-item-left .next-timeline-item-timeline,.next-timeline.next-alternate .next-timeline-item-right .next-timeline-item-timeline{margin-left:50%}.next-timeline.next-alternate .next-timeline-item-left .next-timeline-item-content,.next-timeline.next-alternate .next-timeline-item-right .next-timeline-item-content{margin-left:calc(50% + 28px)}.next-timeline.next-alternate .next-timeline-item-folder{margin-left:50%}.next-timeline.next-alternate .next-timeline-item-right .next-timeline-item-title{margin:4px 0 0;font-size:14px;font-weight:700;line-height:1.5;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;text-align:right}.next-timeline.next-alternate .next-timeline-item-right .next-timeline-item-body{margin:4px 0 0;font-size:12px;line-height:1.5;color:#666;text-align:right}.next-timeline.next-alternate .next-timeline-item-right .next-timeline-item-time{margin:4px 0 12px;font-size:12px;color:#999;text-align:right}.next-timeline.next-alternate .next-timeline-item-right .next-timeline-item-left-content{display:inline-block;position:relative}.next-timeline.next-alternate .next-timeline-item-right .next-timeline-item-left-content .next-timeline-item-title{margin-top:0}.next-timeline.next-alternate .next-timeline-item-right .next-timeline-item-content{margin-left:28px;position:absolute}.next-timeline.next-alternate .next-timeline-item-right .next-timeline-item-content .next-timeline-item-body{margin-top:4px;color:#999}.next-timeline[dir=rtl].next-alternate .next-timeline-item-left .next-timeline-item-left-content,.next-timeline[dir=rtl].next-alternate .next-timeline-item-right .next-timeline-item-left-content{width:50%;padding-left:12px}.next-timeline[dir=rtl].next-alternate .next-timeline-item-left .next-timeline-item-timeline,.next-timeline[dir=rtl].next-alternate .next-timeline-item-right .next-timeline-item-timeline{margin-right:50%}.next-timeline[dir=rtl].next-alternate .next-timeline-item-left .next-timeline-item-content,.next-timeline[dir=rtl].next-alternate .next-timeline-item-right .next-timeline-item-content{width:50%;margin-right:calc(50% + 28px)}.next-timeline[dir=rtl].next-alternate .next-timeline-item-folder{margin-right:50%}.next-timeline[dir=rtl].next-alternate .next-timeline-item-right .next-timeline-item-title{margin:0;font-size:14px;font-weight:700;line-height:1.5;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;text-align:left}.next-timeline[dir=rtl].next-alternate .next-timeline-item-right .next-timeline-item-body{margin:0;font-size:12px;line-height:1.5;color:#666;text-align:left}.next-timeline[dir=rtl].next-alternate .next-timeline-item-right .next-timeline-item-time{margin:4px 0 12px;font-size:12px;color:#999;text-align:left}.next-timeline[dir=rtl].next-alternate .next-timeline-item-right .next-timeline-item-left-content{display:inline-block;position:relative}.next-timeline[dir=rtl].next-alternate .next-timeline-item-right .next-timeline-item-content{margin-right:28px;position:absolute}.next-timeline[dir=rtl].next-alternate .next-timeline-item-right .next-timeline-item-content .next-timeline-item-body{text-align:right}.next-timeline-item-last .next-timeline-item-tail{display:none}.next-timeline-item-has-left-content{min-height:48px}.next-timeline-item-folder.next-timeline-item-has-left-content{min-height:auto}.next-transfer{display:inline-block}.next-transfer,.next-transfer *,.next-transfer :after,.next-transfer :before{box-sizing:border-box}.next-transfer-panel{display:inline-block;border:1px solid #e6e6e6;border-radius:3px;background-color:#fff;vertical-align:middle}.next-transfer-panel-header{padding:8px 20px;border-bottom:1px solid #e6e6e6;background-color:#fafafa;color:#333;font-size:14px}.next-transfer-panel-search{padding:0 4px;margin-top:8px;margin-bottom:0;width:180px}.next-transfer .next-transfer-panel-list{width:180px;height:160px;padding:0;border:none;box-shadow:none;border-radius:0;overflow-y:auto}.next-transfer-panel-not-found-container{display:table;width:100%;height:100%}.next-transfer-panel-not-found{display:table-cell;vertical-align:middle;text-align:center;color:#999;font-size:14px}.next-transfer-panel-item.next-focused{transition:background-color .1s linear}.next-transfer-panel-item:not(.next-disabled).next-simple:hover{color:#209bfa}.next-transfer-panel-item.next-insert-before:before{position:absolute;top:0;left:0;content:"";width:100%;border-top:1px solid #209bfa}.next-transfer-panel-item.next-insert-after:after{position:absolute;left:0;bottom:0;content:"";width:100%;border-bottom:1px solid #209bfa}.next-transfer-panel-footer{position:relative;padding:8px 20px;border-top:1px solid #e6e6e6;background-color:#fff;font-size:0;box-shadow:none}.next-transfer-panel-count{margin-left:4px;font-size:14px;vertical-align:middle;color:#333}.next-transfer-panel-move-all{font-size:14px;color:#209bfa;cursor:pointer}.next-transfer-panel-move-all.next-disabled{color:#ccc;cursor:not-allowed}.next-transfer-operations{display:inline-block;vertical-align:middle;margin:0 20px}.next-transfer-move.next-icon{color:#ddd}.next-transfer-move.next-icon:before{content:"顨�"}.next-transfer-operation.next-btn{display:block}.next-transfer-operation.next-btn+.next-transfer-operation.next-btn{margin-top:8px}.next-transfer-operation.next-btn .next-icon .next-icon-remote,.next-transfer-operation.next-btn .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-tree,.next-tree *,.next-tree :after,.next-tree :before{box-sizing:border-box}.next-tree,.next-tree-child-tree{margin:0;padding:0;list-style:none}.next-tree-node{white-space:nowrap}.next-tree-node-inner{font-size:0;outline:none}.next-tree-node-label-wrapper{display:inline-block;margin:0 4px;vertical-align:middle}.next-tree-node-label{height:20px;line-height:20px;padding:0 4px;border-radius:3px;font-size:14px}.next-tree-node-label .next-icon{font-size:16px}.next-tree-node-label .next-icon:before{font-size:14px;width:14px;margin-right:.5em}.next-tree-node-input.next-input{margin:0 4px}.next-tree-node-indent-unit{display:inline-block;width:24px;vertical-align:middle;position:relative}.next-tree-node-indent-unit.next-line:before{content:"";position:absolute;display:inline-block;border-left:1px solid #ddd;height:28px;left:7.5px}.next-tree-switcher{position:relative;display:inline-block;vertical-align:middle;margin-right:8px}.next-tree .next-tree-unfold-icon:before{content:""}.next-tree-switcher.next-noline{width:20px;height:20px;line-height:20px;cursor:pointer}.next-tree-switcher.next-noline .next-tree-switcher-icon{transition:transform .1s linear;color:#999}.next-tree-switcher.next-noline .next-tree-switcher-icon .next-icon-remote,.next-tree-switcher.next-noline .next-tree-switcher-icon:before{width:20px;font-size:20px;line-height:inherit}.next-tree-switcher.next-noline .next-tree-fold-icon:before{content:"顦�"}.next-tree-switcher.next-noline.next-close .next-tree-switcher-icon{transform:rotate(-90deg)}.next-tree-switcher.next-noline.next-close .next-tree-switcher-icon .next-icon-remote,.next-tree-switcher.next-noline.next-close .next-tree-switcher-icon:before{width:20px;font-size:20px;line-height:inherit}.next-tree-switcher.next-noline:not(.next-disabled):hover .next-tree-switcher-icon{color:#333}.next-tree-switcher.next-noline.next-disabled{cursor:not-allowed}.next-tree-switcher.next-noline.next-disabled .next-tree-switcher-icon{color:#ccc}.next-tree-switcher.next-noop-noline{width:20px;height:20px}.next-tree-switcher.next-line{width:16px;height:16px;line-height:14px;border:1px solid #ddd;border-radius:3px;background-color:#fff;cursor:pointer}.next-tree-switcher.next-line .next-tree-switcher-icon{margin-left:3px;color:#666}.next-tree-switcher.next-line .next-tree-switcher-icon .next-icon-remote,.next-tree-switcher.next-line .next-tree-switcher-icon:before{width:8px;font-size:8px;line-height:inherit}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-tree-switcher.next-line .next-tree-switcher-icon{transform:scale(.5);margin-left:-1px;margin-right:-4px}.next-tree-switcher.next-line .next-tree-switcher-icon:before{width:16px;font-size:16px}}.next-tree-switcher.next-line .next-tree-switcher-fold-icon:before{content:"顧�"}.next-tree-switcher.next-line .next-tree-switcher-unfold-icon:before{content:"顦�"}.next-tree-switcher.next-line:not(.next-disabled):hover{border-color:#ccc;background-color:#f9f9f9}.next-tree-switcher.next-line:not(.next-disabled):hover .next-tree-switcher-icon{color:#333}.next-tree-switcher.next-line.next-disabled{border-color:#eee;background-color:#fff;cursor:not-allowed}.next-tree-switcher.next-line.next-disabled .next-tree-switcher-icon{color:#ccc}.next-tree-switcher.next-noop-line{width:16px;height:16px}.next-tree-switcher.next-noop-line-noroot{height:0;border-left:1px solid #ddd;border-bottom:1px solid #ddd}.next-tree-switcher.next-noop-line-noroot .next-tree-right-angle{bottom:-1px}.next-tree-switcher.next-loading.next-loading-noline{width:20px;height:20px;line-height:20px}.next-tree-switcher.next-loading.next-loading-line{width:16px;height:16px;line-height:14px;border:1px solid transparent}.next-tree-switcher.next-loading .next-tree-switcher-icon{color:#209bfa}.next-tree-switcher.next-loading .next-tree-switcher-icon .next-icon-remote,.next-tree-switcher.next-loading .next-tree-switcher-icon:before{width:20px;font-size:20px;line-height:inherit}.next-tree-right-angle{position:absolute;bottom:6.5px;left:-17.5px;display:block;width:16.5px;height:22px;border-left:1px solid #ddd;border-bottom:1px solid #ddd}.next-tree.next-label-block .next-tree-node-inner{display:flex;align-items:center;outline:none}.next-tree.next-label-block .next-tree-node-label-wrapper{flex:1 1 auto}.next-tree.next-node-indent .next-tree-node .next-tree-node{margin-left:24px}.next-tree.next-node-indent .next-tree-node-inner{padding-top:2px;padding-bottom:2px}.next-tree.next-node-indent .next-tree-node-inner:focus .next-tree-node-label{color:#333;background-color:#f9f9f9}.next-tree.next-node-indent .next-tree-node-label-wrapper{border-top:2px solid transparent;border-bottom:2px solid transparent}.next-tree.next-node-indent .next-tree-node-label{transition:color .1s linear,background-color .1s linear;cursor:default;color:#333;background-color:#fff}.next-tree.next-node-indent .next-tree-node-label-selectable{cursor:pointer}.next-tree.next-node-indent .next-tree-node-label:hover{color:#333;background-color:#f9f9f9}.next-tree.next-node-indent .next-tree-node-inner.next-selected .next-tree-node-label{color:#333;background-color:#add9ff}.next-tree.next-node-indent .next-tree-node-inner.next-disabled .next-tree-node-label,.next-tree.next-node-indent .next-tree-node-inner.next-disabled .next-tree-node-label:hover{color:#ccc;background-color:#fff;cursor:not-allowed}.next-tree.next-node-indent .next-tree-node-inner.next-drag-over .next-tree-node-label{background-color:#209bfa;color:#fff;opacity:.8}.next-tree.next-node-indent .next-tree-node-inner.next-drag-over-gap-top .next-tree-node-label-wrapper{border-top-color:#209bfa}.next-tree.next-node-indent .next-tree-node-inner.next-drag-over-gap-bottom .next-tree-node-label-wrapper{border-bottom-color:#209bfa}.next-tree.next-node-block .next-tree-node-inner{padding-top:4px;padding-bottom:4px;transition:color .1s linear,background-color .1s linear;cursor:pointer;color:#333;background-color:#fff}.next-tree.next-node-block .next-tree-node-inner:focus,.next-tree.next-node-block .next-tree-node-inner:hover{color:#333;background-color:#f9f9f9}.next-tree.next-node-block .next-tree-node-inner.next-selected{color:#333;background-color:#add9ff}.next-tree.next-node-block .next-tree-node-inner.next-disabled,.next-tree.next-node-block .next-tree-node-inner.next-disabled:hover{color:#ccc;background-color:#fff;cursor:not-allowed}.next-tree.next-show-line .next-tree-node .next-tree-node:not(:last-child){margin-left:7.5px;border-left:1px solid #ddd;padding-left:15.5px}.next-tree-node.next-filtered>.next-tree-node-inner .next-tree-node-label,.next-tree-node.next-filtered>.next-tree-node-inner .next-tree-node-label:hover{color:#209bfa}.next-tree[dir=rtl] .next-tree-switcher{margin-left:8px;margin-right:0}.next-tree[dir=rtl] .next-tree-right-angle,.next-tree[dir=rtl] .next-tree-switcher.next-noop-line-noroot{border-left:none;border-right:1px solid #ddd}.next-tree[dir=rtl] .next-tree-right-angle{left:auto;right:-17.5px}.next-tree[dir=rtl].next-show-line .next-tree-node .next-tree-node:not(:last-child){margin-left:0;margin-right:7.5px;border-left:none;border-right:1px solid #ddd;padding-left:0;padding-right:15.5px}.next-tree[dir=rtl].next-node-indent .next-tree-node .next-tree-node{margin-left:0;margin-right:24px}.next-tree-select,.next-tree-select *,.next-tree-select :after,.next-tree-select :before{box-sizing:border-box}.next-tree-select-dropdown{background:#fff;border:1px solid #e6e6e6;border-radius:3px;box-shadow:none;max-height:260px;overflow:auto}.next-tree-select-dropdown>.next-tree,.next-tree-select-dropdown>.next-tree-select-not-found,.next-tree-select-dropdown>.next-virtual-tree-container{padding:8px 20px}.next-tree-select-not-found{font-size:14px;color:#999}.next-upload-list[dir=rtl].next-upload-list-text .next-upload-list-item{padding:4px 8px 4px 40px}.next-upload-list[dir=rtl].next-upload-list-text .next-icon{left:12px;right:auto}.next-upload-list[dir=rtl].next-upload-list-image .next-icon-close{float:left;margin-left:4px;margin-right:0}.next-upload-list[dir=rtl].next-upload-list-image .next-upload-list-item-thumbnail{float:right;margin-left:8px;margin-right:0}.next-upload-list[dir=rtl].next-upload-list-image .next-upload-list-item-progress{margin-right:56px;margin-left:24px}.next-upload,.next-upload *,.next-upload :after,.next-upload :before{box-sizing:border-box}.next-upload-inner{outline:0;display:inline-block}.next-upload-inner.next-hidden{display:none}.next-upload-list{overflow:hidden}.next-upload-list,.next-upload-list *,.next-upload-list :after,.next-upload-list :before{box-sizing:border-box}.next-upload-list-item{position:relative}.next-upload-list-item.next-hidden{display:none}.next-upload-list-item-name{text-decoration:none}.next-upload.next-disabled{border-color:#eee!important;color:#ccc!important}.next-upload.next-disabled .next-icon-close{cursor:not-allowed!important}.next-upload.next-disabled .next-upload-inner *{color:#ccc!important;border-color:#eee!important;cursor:not-allowed!important}.next-upload-list-text .next-upload-list-item{background-color:#f9f9f9;padding:4px 40px 4px 8px;height:40px;line-height:32px;font-size:14px;overflow:hidden;transition:all .1s linear;border-radius:0}.next-upload-list-text .next-upload-list-item:not(:last-child){margin-bottom:4px}.next-upload-list-text .next-upload-list-item-op{position:absolute;top:0;right:12px}.next-upload-list-text .next-upload-list-item .next-icon-close{color:#999;cursor:pointer;text-align:center;transition:all .1s linear;line-height:40px}.next-upload-list-text .next-upload-list-item .next-icon-close .next-icon-remote,.next-upload-list-text .next-upload-list-item .next-icon-close:before{width:16px;font-size:16px;line-height:inherit}.next-upload-list-text .next-upload-list-item:hover{background-color:#f9f9f9}.next-upload-list-text .next-upload-list-item:hover .next-icon{color:#666}.next-upload-list-text .next-upload-list-item-name-wrap{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;margin-right:4px}.next-upload-list-text .next-upload-list-item-name{color:#333;transition:all .1s linear}.next-upload-list-text .next-upload-list-item-size{color:#999;margin-left:8px}.next-upload-list-text .next-upload-list-item-uploading{line-height:16px}.next-upload-list-text .next-upload-list-item-uploading .next-upload-list-item-progress{line-height:0;padding-top:4px;padding-bottom:4px}.next-upload-list-text .next-upload-list-item-uploading .next-upload-list-item-progress .next-progress-line-underlay{height:8px}.next-upload-list-text .next-upload-list-item-uploading .next-upload-list-item-progress .next-progress-line-overlay{height:8px;margin-top:-4px}.next-upload-list-text .next-upload-list-item-done{line-height:32px}.next-upload-list-text .next-upload-list-item-done:hover .next-upload-list-item-name,.next-upload-list-text .next-upload-list-item-done:hover .next-upload-list-item-size{color:#209bfa}.next-upload-list-text .next-upload-list-item-error{background-color:#ffece4!important}.next-upload-list-text .next-upload-list-item-error.next-upload-list-item-error-with-msg{line-height:16px}.next-upload-list-text .next-upload-list-item-error-msg{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;color:#d23c26}.next-upload-list-image .next-upload-list-item{box-sizing:content-box;border:1px solid #e6e6e6;background-color:#fff;padding:8px;height:48px;line-height:48px;font-size:14px;transition:all .1s linear;overflow:hidden;border-radius:0}.next-upload-list-image .next-upload-list-item:not(:last-child){margin-bottom:4px}.next-upload-list-image .next-upload-list-item:after{visibility:hidden;display:block;height:0;font-size:0;content:" ";clear:both}.next-upload-list-image .next-upload-list-item-op{float:right;margin-right:4px}.next-upload-list-image .next-upload-list-item .next-icon-close{cursor:pointer;color:#999;text-align:center}.next-upload-list-image .next-upload-list-item .next-icon-close .next-icon-remote,.next-upload-list-image .next-upload-list-item .next-icon-close:before{width:16px;font-size:16px;line-height:inherit}.next-upload-list-image .next-upload-list-item:hover{border-color:#209bfa}.next-upload-list-image .next-upload-list-item:hover .next-icon-close{color:#666}.next-upload-list-image .next-upload-list-item-name{display:block;color:#333;margin-left:56px;margin-right:24px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;transition:all .1s linear}.next-upload-list-image .next-upload-list-item-size{color:#999;margin-left:8px}.next-upload-list-image .next-upload-list-item-done:hover .next-upload-list-item-name,.next-upload-list-image .next-upload-list-item-done:hover .next-upload-list-item-size{color:#209bfa}.next-upload-list-image .next-upload-list-item-thumbnail{float:left;width:48px;height:48px;color:#ccc;border:1px solid #e6e6e6;border-radius:0;background-color:#f9f9f9;margin-right:8px;vertical-align:middle;text-align:center;overflow:hidden;box-sizing:border-box}.next-upload-list-image .next-upload-list-item-thumbnail img{width:100%;height:100%}.next-upload-list-image .next-upload-list-item-thumbnail .next-icon{display:block;margin:0;line-height:48px}.next-upload-list-image .next-upload-list-item-thumbnail .next-icon .next-icon-remote,.next-upload-list-image .next-upload-list-item-thumbnail .next-icon:before{width:24px;font-size:24px;line-height:inherit}.next-upload-list-image .next-upload-list-item-error{border-color:#d23c26!important;background-color:#fff}.next-upload-list-image .next-upload-list-item-uploading{background-color:#fff}.next-upload-list-image .next-upload-list-item-uploading .next-upload-list-item-name{height:24px;line-height:24px}.next-upload-list-image .next-upload-list-item-uploading .next-upload-list-item-progress{margin-left:56px;margin-right:24px;line-height:0;padding-top:8px;padding-bottom:8px}.next-upload-list-image .next-upload-list-item-uploading .next-upload-list-item-progress .next-progress-line-underlay{height:8px}.next-upload-list-image .next-upload-list-item-uploading .next-upload-list-item-progress .next-progress-line-overlay{height:8px;margin-top:-4px}.next-upload-list-image .next-upload-list-item-error-with-msg .next-upload-list-item-error-msg,.next-upload-list-image .next-upload-list-item-error-with-msg .next-upload-list-item-name{height:24px;line-height:24px}.next-upload-list-image .next-upload-list-item-error-with-msg .next-upload-list-item-error-msg{margin-left:56px;margin-right:24px;color:#d23c26;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.next-upload-list-card{display:inline-block}.next-upload-list-card .next-upload-list-item{vertical-align:middle;float:left}.next-upload-list-card .next-upload-list-item:not(:last-child){margin-right:12px}.next-upload-list-card .next-upload-list-item-wrapper{position:relative;border:1px solid #ddd;width:100px;height:100px;padding:0;background-color:transparent;border-radius:0;overflow:hidden}.next-upload-list-card .next-upload-list-item-thumbnail{text-align:center;width:100%;height:100%;color:#ccc;font-size:12px}.next-upload-list-card .next-upload-list-item-thumbnail img{max-width:100%;max-height:100%;position:absolute;top:0;right:0;bottom:0;left:0;margin:auto}.next-upload-list-card .next-upload-list-item-thumbnail img:focus{outline:0}.next-upload-list-card .next-upload-list-item-thumbnail .next-icon{width:100%}.next-upload-list-card .next-upload-list-item-thumbnail .next-icon .next-icon-remote,.next-upload-list-card .next-upload-list-item-thumbnail .next-icon:before{width:48px;font-size:48px;line-height:inherit}.next-upload-list-card .next-upload-list-item-handler{margin-top:13px}.next-upload-list-card .next-upload-list-item-handler .next-icon-cry{margin-top:10px}.next-upload-list-card .next-upload-list-item-name{display:block;width:100px;text-align:center;margin-top:4px;font-size:12px;color:#666;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.next-upload-list-card .next-upload-list-item-progress{position:absolute;font-size:0;bottom:0;left:0;width:100%}.next-upload-list-card .next-upload-list-item-progress .next-progress-line-underlay{border-radius:0;height:8px}.next-upload-list-card .next-upload-list-item-progress .next-progress-line-overlay{border-radius:0;height:8px;margin-top:-4px}.next-upload-list-card .next-upload-list-item-uploading .next-upload-list-item-wrapper{background-color:#fafafa}.next-upload-list-card .next-upload-list-item:hover .next-upload-tool{opacity:.8}.next-upload-list-card .next-upload-list-item .next-upload-tool{position:absolute;z-index:1;background-color:rgba(0,0,0,.7);transition:all .1s linear;opacity:0;width:100%;height:28px;left:0;bottom:0;display:flex}.next-upload-list-card .next-upload-list-item .next-upload-tool .next-icon{line-height:28px;color:#fff;cursor:pointer}.next-upload-list-card .next-upload-list-item .next-upload-tool .next-icon .next-icon-remote,.next-upload-list-card .next-upload-list-item .next-upload-tool .next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-upload-list-card .next-upload-list-item .next-upload-tool-item{width:100%;text-align:center}.next-upload-list-card .next-upload-list-item .next-upload-tool-item:not(:last-child){border-right:1px solid #fff}.next-upload-list-card .next-upload-list-item .next-upload-tool-reupload{display:inline-block}.next-upload-list-card .next-upload-list-item .next-upload-card{display:flex;flex-direction:column;justify-content:center}.next-upload-list-card .next-upload-list-item-error .next-upload-list-item-wrapper{border-color:#d23c26}.next-upload-list-card.next-upload-ie9 .next-upload-tool{display:table}.next-upload-list-card.next-upload-ie9 .next-upload-tool-item{display:table-cell;width:1%}.next-upload-card,.next-upload-list-card.next-upload-ie9 .next-upload-card{display:table-cell}.next-upload-card{border:1px dashed #ddd;width:100px;height:100px;background-color:#fff;text-align:center;cursor:pointer;transition:border-color .1s linear;vertical-align:middle;border-radius:0}.next-upload-card .next-icon{color:#ddd}.next-upload-card .next-icon .next-icon-remote,.next-upload-card .next-icon:before{width:24px;font-size:24px;line-height:inherit}.next-upload-card .next-upload-add-icon:before{content:"顧�"}.next-upload-card .next-upload-text{font-size:14px;margin-top:12px;color:#666;outline:none}.next-upload-card:hover{border-color:#209bfa}.next-upload-card:hover .next-icon,.next-upload-card:hover .next-upload-text{color:#209bfa}.next-upload-dragable .next-upload-inner{display:block}.next-upload-dragable .next-upload-drag{border:1px dashed #ddd;transition:border-color .1s linear;cursor:pointer;border-radius:3px;background-color:transparent;text-align:center;margin-bottom:4px}.next-upload-dragable .next-upload-drag-icon{margin:20px 0 0;color:#666}.next-upload-dragable .next-upload-drag-icon .next-upload-drag-upload-icon:before{content:"顭�";font-size:24px}.next-upload-dragable .next-upload-drag-text{margin:12px 0 0;font-size:14px;color:#666}.next-upload-dragable .next-upload-drag-hint{margin:4px 0 20px;font-size:12px;color:#999}.next-upload-dragable .next-upload-drag-over{border-color:#209bfa}.next-shell{position:relative;display:flex;flex-direction:column;transition:all .2s ease}.next-shell,.next-shell *,.next-shell :after,.next-shell :before{box-sizing:border-box}.next-shell-content-wrapper{overflow:auto}.next-shell-header{display:flex;width:100%;justify-content:space-between;align-items:center;z-index:9}.next-shell-header .dock-trigger,.next-shell-header .nav-trigger{outline:0;display:flex;justify-content:center;align-items:center;cursor:pointer;width:32px;height:32px}.next-shell-header .nav-trigger{margin-right:10px}.next-shell-header .dock-trigger{margin-left:10px}.next-shell-header.next-shell-fixed-header{position:sticky;top:0}.next-shell-header .next-shell-navigation{flex:1 1;display:flex;align-items:center;flex-direction:row}.next-shell-header .next-shell-action,.next-shell-header .next-shell-branding{display:flex;align-items:center}.next-shell-sub-main{flex:1 1;flex-direction:column;outline:0}.next-shell-main,.next-shell-sub-main{display:flex;height:100%;overflow:auto}.next-shell-main{flex:1 1 auto;flex-direction:row;position:relative;box-sizing:content-box;transition:all .2s ease}.next-shell-main .next-shell-content{flex:1 1 auto}.next-shell-main .next-shell-content-inner{margin:0 auto}.next-shell-main .next-shell-footer{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%}.next-shell .next-aside-navigation,.next-shell .next-aside-tooldock{display:flex}.next-shell .next-aside-navigation.fixed,.next-shell .next-aside-tooldock.fixed{position:fixed;top:0;bottom:0;z-index:1}.next-shell .next-aside-navigation.fixed{left:0}.next-shell .next-aside-tooldock.fixed{right:0}.next-shell-aside{transition:all .2s ease}.next-shell-aside .aside-trigger{cursor:pointer;outline:0;position:absolute;right:0;top:50%;width:20px;height:48px;display:flex;border:1px solid #ddd;align-items:center;justify-content:center}.next-shell-aside .local-nav-trigger{outline:0;border-left:none;transform:translate(100%,-50%);right:0}.next-shell-aside .ancillary-trigger{outline:0;transform:translate(-100%,-50%);border-right:0;left:1px}.next-shell-aside.next-aside-ancillary,.next-shell-aside.next-aside-localnavigation{position:relative}.next-shell-aside.next-shell-navigation{display:flex;flex-direction:column;justify-self:flex-start;transition:all .2s ease}.next-shell-aside.next-shell-tooldock{display:flex;flex-direction:column;align-items:center}.next-shell-aside .next-shell-tooldockitem{width:100%;text-align:center}.next-shell-aside .next-shell-localnavigation{position:relative}.next-shell-aside .next-shell-ancillary,.next-shell-aside .next-shell-localnavigation{height:100%;display:flex;flex-direction:column;justify-self:flex-start;transition:all .2s ease}.next-shell-light .next-shell-header .dock-trigger,.next-shell-light .next-shell-header .nav-trigger{background:#fff}.next-shell-light .next-shell-aside .local-nav-trigger{background:#f2f2f2}.next-shell-light .next-shell-aside .ancillary-trigger{background:#fff}.next-shell-light .next-shell-header{color:#000;height:52px;background:#fff;border-bottom:1px solid #eee;box-shadow:none;padding:0 16px}.next-shell-light .next-shell-header .next-shell-navigation{justify-content:flex-end;height:52px;line-height:52px;margin:0 48px}.next-shell-light .next-shell-task-header{width:100%;min-height:40px;background:#fff;border-bottom:1px solid #eee;box-shadow:none;padding:0;overflow:auto}.next-shell-light .next-shell-main{background:#f5f5f5}.next-shell-light .next-shell-main .next-shell-appbar{min-height:48px;background:#fff;border-bottom:1px solid #eee;box-shadow:none;padding:0 24px}.next-shell-light .next-shell-main .next-shell-content{padding:20px}.next-shell-light .next-shell-main .next-shell-footer{background:transparent;min-height:56px;color:#ccc;font-size:14px}.next-shell-light .next-shell-aside.next-shell-navigation{width:200px;background:#fff;border-right:1px solid #eee;box-shadow:none;padding:8px 0}.next-shell-light .next-shell-aside.next-shell-navigation.next-shell-collapse.next-shell-mini{width:60px}.next-shell-light .next-shell-aside.next-shell-navigation.next-shell-collapse{width:0}.next-shell-light .next-shell-aside.next-shell-tooldock{width:52px;background:#f2f2f2;border-left:1px solid #eee;box-shadow:none;padding:8px 0}.next-shell-light .next-shell-aside .next-shell-tooldockitem{padding:8px 0;color:#666;background:transparent}.next-shell-light .next-shell-aside .next-shell-tooldockitem:hover{color:#333;background:#f5f5f5}.next-shell-light .next-shell-aside .next-shell-localnavigation{width:168px;background:#f2f2f2;border-right:1px solid #eee;box-shadow:none;padding:8px 0}.next-shell-light .next-shell-aside .next-shell-localnavigation.next-shell-collapse{width:0}.next-shell-light .next-shell-aside .next-shell-ancillary{width:168px;background:#fff;border-left:1px solid #eee;box-shadow:none;padding:8px 0}.next-shell-light .next-shell-aside .next-shell-ancillary.next-shell-collapse{width:0}.next-shell-dark .next-shell-header .dock-trigger,.next-shell-dark .next-shell-header .nav-trigger{background:#222}.next-shell-dark .next-shell-aside .local-nav-trigger{background:#f2f2f2}.next-shell-dark .next-shell-aside .ancillary-trigger{background:#fff}.next-shell-dark .next-shell-header{color:#fff;height:52px;background:#222;border-bottom:1px solid #1f1f1f;box-shadow:0 1px 3px 0 rgba(0,0,0,.12);padding:0 16px}.next-shell-dark .next-shell-header .next-shell-navigation{justify-content:flex-end;height:52px;line-height:52px;margin:0 48px}.next-shell-dark .next-shell-task-header{width:100%;min-height:40px;background:#fff;border-bottom:1px solid #eee;box-shadow:none;padding:0;overflow:auto}.next-shell-dark .next-shell-main{background:#f5f5f5}.next-shell-dark .next-shell-main .next-shell-appbar{min-height:48px;background:#fff;border-bottom:1px solid #eee;box-shadow:none;padding:0 24px}.next-shell-dark .next-shell-main .next-shell-content{padding:20px}.next-shell-dark .next-shell-main .next-shell-footer{background:transparent;min-height:56px;color:#ccc;font-size:14px}.next-shell-dark .next-shell-aside.next-shell-navigation{width:200px;background:#222;border-right:1px solid #eee;box-shadow:none;padding:8px 0}.next-shell-dark .next-shell-aside.next-shell-navigation.next-shell-collapse.next-shell-mini{width:60px}.next-shell-dark .next-shell-aside.next-shell-navigation.next-shell-collapse{width:0}.next-shell-dark .next-shell-aside.next-shell-tooldock{width:52px;background:#f2f2f2;border-left:1px solid #eee;box-shadow:none;padding:8px 0}.next-shell-dark .next-shell-aside .next-shell-tooldockitem{padding:8px 0;color:#666;background:transparent}.next-shell-dark .next-shell-aside .next-shell-tooldockitem:hover{color:#333;background:#f5f5f5}.next-shell-dark .next-shell-aside .next-shell-localnavigation{width:168px;background:#f2f2f2;border-right:1px solid #eee;box-shadow:none;padding:8px 0}.next-shell-dark .next-shell-aside .next-shell-localnavigation.next-shell-collapse{width:0}.next-shell-dark .next-shell-aside .next-shell-ancillary{width:168px;background:#fff;border-left:1px solid #eee;box-shadow:none;padding:8px 0}.next-shell-dark .next-shell-aside .next-shell-ancillary.next-shell-collapse{width:0}.next-shell-brand .next-shell-header .dock-trigger,.next-shell-brand .next-shell-header .nav-trigger{background:#18263c}.next-shell-brand .next-shell-aside .local-nav-trigger{background:#f2f2f2}.next-shell-brand .next-shell-aside .ancillary-trigger{background:#fff}.next-shell-brand .next-shell-header{color:#fff;height:52px;background:#18263c;border-bottom:1px solid #eee;box-shadow:0 1px 3px 0 rgba(0,0,0,.12);padding:0 16px}.next-shell-brand .next-shell-header .next-shell-navigation{justify-content:flex-end;height:52px;line-height:52px;margin:0 48px}.next-shell-brand .next-shell-task-header{width:100%;min-height:40px;background:#fff;border-bottom:1px solid #eee;box-shadow:none;padding:0;overflow:auto}.next-shell-brand .next-shell-main{background:#f5f5f5}.next-shell-brand .next-shell-main .next-shell-appbar{min-height:48px;background:#fff;border-bottom:1px solid #eee;box-shadow:none;padding:0 24px}.next-shell-brand .next-shell-main .next-shell-content{padding:20px}.next-shell-brand .next-shell-main .next-shell-footer{background:transparent;min-height:56px;color:#ccc;font-size:14px}.next-shell-brand .next-shell-aside.next-shell-navigation{width:200px;background:#fff;border-right:1px solid #eee;box-shadow:none;padding:8px 0}.next-shell-brand .next-shell-aside.next-shell-navigation.next-shell-collapse.next-shell-mini{width:60px}.next-shell-brand .next-shell-aside.next-shell-navigation.next-shell-collapse{width:0}.next-shell-brand .next-shell-aside.next-shell-tooldock{width:52px;background:#f2f2f2;border-left:1px solid #eee;box-shadow:none;padding:8px 0}.next-shell-brand .next-shell-aside .next-shell-tooldockitem{padding:8px 0;color:#666;background:transparent}.next-shell-brand .next-shell-aside .next-shell-tooldockitem:hover{color:#333;background:#f5f5f5}.next-shell-brand .next-shell-aside .next-shell-localnavigation{width:168px;background:#f2f2f2;border-right:1px solid #eee;box-shadow:none;padding:8px 0}.next-shell-brand .next-shell-aside .next-shell-localnavigation.next-shell-collapse{width:0}.next-shell-brand .next-shell-aside .next-shell-ancillary{width:168px;background:#fff;border-left:1px solid #eee;box-shadow:none;padding:8px 0}.next-shell-brand .next-shell-aside .next-shell-ancillary.next-shell-collapse{width:0}.next-shell-header .next-shell-navigation.next-shell-nav-left{justify-content:flex-start}.next-shell-header .next-shell-navigation.next-shell-nav-right{justify-content:flex-end}.next-shell-header .next-shell-navigation.next-shell-nav-center{justify-content:center}.next-shell.next-shell-phone .next-aside-navigation{width:100%}.next-shell.next-shell-phone .next-aside-navigation.next-shell-collapse{width:0}.next-shell.next-shell-phone .next-shell-header .next-shell-navigation{display:none}.next-shell.next-shell-phone .next-shell-navigation{width:100%;height:100%;transition:height .2s ease}.next-shell.next-shell-phone .next-shell-navigation.next-shell-collapse{padding:0;height:0;transition:height .2s ease}.next-shell.next-shell-phone .next-shell-tooldock{height:52px;left:0;right:0;position:absolute;width:100%;flex-direction:row;justify-content:center}.next-shell.next-shell-phone .next-shell-tooldock.next-shell-collapse{display:none;height:0;padding:0;transition:all .2s ease}.next-shell.next-shell-phone .next-shell-aside.next-aside-ancillary,.next-shell.next-shell-tablet .next-shell-aside.next-aside-ancillary{width:0}.next-shell.next-shell-phone .next-shell-ancillary,.next-shell.next-shell-tablet .next-shell-ancillary{transform:translateX(-100%)}.next-shell.next-shell-phone .next-shell-aside.next-aside-localnavigation,.next-shell.next-shell-tablet .next-shell-aside.next-aside-localnavigation{width:0}.next-notification{width:384px;position:fixed;z-index:1010;padding:0;margin:0}.next-notification .next-message{margin-bottom:16px;overflow:hidden}.next-notification-fade-leave{animation-duration:.3s;animation-play-state:paused;animation-fill-mode:both;animation-timing-function:ease}.next-notification-fade-leave.next-notification-fade-leave-active{animation-name:NotificationFadeOut;animation-play-state:running}@keyframes NotificationFadeOut{0%{max-height:150px;margin-bottom:16px;opacity:1}to{max-height:0;margin-bottom:0;padding-top:0;padding-bottom:0;opacity:0}}.next-typography{color:#333}.next-typography-title{font-weight:600;margin-bottom:.5em}.next-typography+.next-typography-title{margin-top:1.2em}.next-typography-paragraph{color:#333;margin-bottom:1em;font-size:14px;line-height:1.5}.next-typography mark{padding:0;background:#ffe98f;color:#333}.next-typography strong{font-weight:600}.next-typography code{background-color:#f9f9f9;color:#333;border:1px solid #eee;margin:0 .2em;padding:.2em .4em .1em;font-size:85%;border-radius:3px}.next-typography ol,.next-typography ul{margin:0 0 1em;padding:0}.next-typography li{list-style-type:circle;margin:0 0 0 20px;padding:0 0 0 4px}.next-typography a{text-decoration:none}.next-typography a:link{color:#298dff}.next-typography a:visited{color:#4a83c5}.next-typography a:hover{color:#2580e7}.next-typography a:active{text-decoration:underline;color:#2580e7}h1.next-typography-title{font-size:24px}h2.next-typography-title{font-size:20px}h3.next-typography-title,h4.next-typography-title{font-size:16px}.next-divider,h5.next-typography-title,h6.next-typography-title{font-size:14px}.next-divider{margin:0;padding:0;line-height:1.5;list-style:none;font-variant:tabular-nums;font-feature-settings:"tnum";background:#e6e6e6;border-collapse:separate}.next-divider,.next-divider *,.next-divider :after,.next-divider :before{box-sizing:border-box}.next-divider-hoz{display:block;clear:both;width:100%;min-width:100%;height:1px;margin:16px 0}.next-divider-ver{position:relative;top:-.06em;display:inline-block;width:1px;background:#e6e6e6;height:.9em;margin:0 8px;vertical-align:middle}.next-divider-hoz.next-divider-with-text-center,.next-divider-hoz.next-divider-with-text-left,.next-divider-hoz.next-divider-with-text-right{display:table;margin:16px 0;color:#333;font-weight:400;font-size:16px;white-space:nowrap;text-align:center;background:transparent}.next-divider-hoz.next-divider-with-text-center:after,.next-divider-hoz.next-divider-with-text-center:before,.next-divider-hoz.next-divider-with-text-left:after,.next-divider-hoz.next-divider-with-text-left:before,.next-divider-hoz.next-divider-with-text-right:after,.next-divider-hoz.next-divider-with-text-right:before{top:50%;display:table-cell;width:50%;border-top:1px solid #e6e6e6;transform:translateY(50%);content:""}.next-divider-hoz.next-divider-with-text-center.next-divider-dashed,.next-divider-hoz.next-divider-with-text-left.next-divider-dashed,.next-divider-hoz.next-divider-with-text-right.next-divider-dashed{border-top:0}.next-divider-hoz.next-divider-with-text-center.next-divider-dashed:after,.next-divider-hoz.next-divider-with-text-center.next-divider-dashed:before,.next-divider-hoz.next-divider-with-text-left.next-divider-dashed:after,.next-divider-hoz.next-divider-with-text-left.next-divider-dashed:before,.next-divider-hoz.next-divider-with-text-right.next-divider-dashed:after,.next-divider-hoz.next-divider-with-text-right.next-divider-dashed:before{border-style:dashed none none}.next-divider-hoz.next-divider-with-text-left .next-divider-inner-text,.next-divider-hoz.next-divider-with-text-right .next-divider-inner-text{display:inline-block;padding:0 16px}.next-divider-hoz.next-divider-with-text-left:before{top:50%;width:5%}.next-divider-hoz.next-divider-with-text-left:after,.next-divider-hoz.next-divider-with-text-right:before{top:50%;width:95%}.next-divider-hoz.next-divider-with-text-right:after{top:50%;width:5%}.next-divider-inner-text{display:inline-block;padding:0 16px}.next-divider-dashed{background:none;border:dashed #e6e6e6;border-width:1px 0 0}.next-divider-dashed.next-divider-ver{border-width:0 0 0 1px}.next-box{display:flex}.next-box,.next-box *,.next-box :after,.next-box :before,.next-table{box-sizing:border-box}.next-table{position:relative;border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0;border-top:1px solid #e6e6e6;border-left:1px solid #e6e6e6}.next-table *,.next-table :after,.next-table :before{box-sizing:border-box}.next-table .next-table-header tr:first-child th:first-child{border-top-left-radius:0}.next-table .next-table-header tr:first-child th:last-child{border-top-right-radius:0}.next-table .next-table-header tr:last-child th:first-child{border-bottom-left-radius:0}.next-table .next-table-header tr:last-child th:last-child{border-bottom-right-radius:0}.next-table.next-table-layout-fixed{overflow:auto}.next-table.next-table-layout-fixed table{table-layout:fixed}.next-table.next-table-layout-auto table{table-layout:auto}.next-table.next-table-small .next-table-prerow .next-table-cell-wrapper,.next-table.next-table-small td .next-table-cell-wrapper,.next-table.next-table-small th .next-table-cell-wrapper{padding:8px}.next-table table{border-collapse:separate;border-spacing:0;width:100%;background:#fff;border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.next-table table tr:first-child td{border-top-width:0}.next-table th{padding:0;background:#f5f5f5;color:#333;text-align:left;font-weight:400;border-right:1px solid #e6e6e6;border-bottom:1px solid #e6e6e6}.next-table th .next-table-cell-wrapper{padding:12px 16px;overflow:hidden;text-overflow:ellipsis;word-break:break-all}.next-table th.next-table-prerow .next-table-cell-wrapper{padding:12px 16px}.next-table th.next-table-word-break-word .next-table-cell-wrapper{word-break:break-word}.next-table th.next-table-fix-left,.next-table th.next-table-fix-right{z-index:1}.next-table-affix{z-index:1;overflow:hidden}.next-table-stickylock .next-table-affix{z-index:9}.next-table-header-resizable{position:relative}.next-table-header-resizable .next-table-resize-handler{position:absolute;right:-5px;top:0;bottom:0;width:10px;background:transparent;cursor:ew-resize}.next-table-header-resizable .next-table-resize-handler:after{position:absolute;display:block;content:" ";width:2px;height:100%;right:50%}.next-table-header-resizable .next-table-resize-handler:hover:after{z-index:1;background:#209bfa}.next-table.next-table-lock-left .next-table-header-resizable .next-table-resize-handler,.next-table.next-table-lock-right .next-table-header-resizable .next-table-resize-handler{cursor:auto}.next-table.next-table-lock-left .next-table-header-resizable .next-table-resize-handler:hover:after,.next-table.next-table-lock-right .next-table-header-resizable .next-table-resize-handler:hover:after{z-index:-1}.next-table td{padding:0;border-right:1px solid #e6e6e6;border-bottom:1px solid #e6e6e6}.next-table td .next-table-cell-wrapper{padding:12px 16px;overflow:hidden;text-overflow:ellipsis;word-break:break-all}.next-table td .next-table-cell-wrapper .next-icon-arrow-down.next-table-tree-arrow,.next-table td .next-table-cell-wrapper .next-icon-arrow-right.next-table-tree-arrow,.next-table td .next-table-cell-wrapper .next-table-tree-placeholder{margin-right:8px;outline:0;cursor:pointer}.next-table td .next-table-cell-wrapper .next-icon-arrow-right.next-table-tree-arrow .next-icon-remote,.next-table td .next-table-cell-wrapper .next-icon-arrow-right.next-table-tree-arrow:before{width:12px;font-size:12px;line-height:inherit}.next-table td .next-table-cell-wrapper .next-icon-arrow-right.next-table-tree-arrow:before{content:"顦�"}.next-table td .next-table-cell-wrapper .next-icon-arrow-down.next-table-tree-arrow .next-icon-remote,.next-table td .next-table-cell-wrapper .next-icon-arrow-down.next-table-tree-arrow:before{width:12px;font-size:12px;line-height:inherit}.next-table td .next-table-cell-wrapper .next-icon-arrow-down.next-table-tree-arrow:before{content:"顦�"}.next-table td.next-table-prerow .next-table-cell-wrapper{padding:12px 16px}.next-table td.next-table-word-break-word .next-table-cell-wrapper{word-break:break-word}.next-table .next-table-expanded .next-table-cell-wrapper,.next-table .next-table-selection .next-table-cell-wrapper{overflow:visible}.next-table.no-header table tr:first-child td{border-top-width:1px}.next-table.only-bottom-border{border-width:0}.next-table.only-bottom-border td,.next-table.only-bottom-border th{border-width:0 0 1px}.next-table.only-bottom-border table tr td:first-child,.next-table.only-bottom-border table tr th:first-child{border-left-width:0}.next-table.only-bottom-border .next-table-body tr td:last-child,.next-table.only-bottom-border .next-table-header tr th:last-child{border-right-width:0}.next-table-loading{display:block}.next-table.zebra tr:nth-child(odd) td{background:#fff}.next-table.zebra tr:nth-child(2n) td{background:#fafafa}.next-table.zebra .next-table-cell.hovered,.next-table.zebra .next-table-row.hovered td{background:#fafafa;color:#333}.next-table.zebra .next-table-row.selected td{background:#f9f9f9;color:#333}.next-table-empty{color:#ccc;padding:32px 0;text-align:center}.next-table-expanded-row>td{border-width:0 0 1px}.next-table-expanded-row>td:first-child{border-left-width:1px}.next-table-expanded-row>td:last-child{border-right-width:1px}.next-table-expanded-row:last-child>td{border-bottom-width:1px}.next-table-expanded-row .next-table{border-top:0;border-left:0}.next-table-expanded-row .next-table td,.next-table-expanded-row .next-table th{border-right:1px solid #e6e6e6}.next-table-expanded-row .next-table.only-bottom-border td,.next-table-expanded-row .next-table.only-bottom-border th{border-right:0}.next-table-expanded-row .next-table .last td{border-bottom:0}.next-table-expanded-row .next-table td.last,.next-table-expanded-row .next-table th:last-child{border-right:0}.next-table-filter-footer{margin:10px 10px 0}.next-table-filter-footer button{margin-right:5px}.next-table-row{transition:all .1s linear;background:#fff;color:#333}.next-table-row.hidden{display:none}.next-table-row.hovered{background:#fafafa;color:#333}.next-table-row.selected{background:#f9f9f9;color:#333}.next-table-cell.hovered{background:#fafafa;color:#333}.next-table-tree-placeholder{visibility:hidden}.next-table-tree-placeholder .next-icon-remote,.next-table-tree-placeholder:before{width:12px;font-size:12px;line-height:inherit}.last .next-table-expanded-row td{border-bottom-width:1px}.next-table-body,.next-table-header{overflow:auto;font-size:14px}.next-table-column-resize-proxy{position:absolute;top:0;bottom:0;width:0;border-left:2px solid #209bfa;z-index:10;display:none}.next-table-header{margin-bottom:-20px;padding-bottom:20px;border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0;overflow:-moz-scrollbars-none;-ms-overflow-style:none;scrollbar-width:none}.next-table-header::-webkit-scrollbar{display:none}.next-table-body{font-size:14px;position:relative}.next-table-fixed{border-right:1px solid #e6e6e6;border-bottom:1px solid #e6e6e6}.next-table-fixed table{table-layout:fixed}.next-table-fixed .next-table-header{background:#f5f5f5}.next-table-fixed table tr td:first-child,.next-table-fixed table tr th:first-child{border-left-width:0}.next-table-fixed .next-table-header th{border-top-width:0}.next-table-fixed .next-table-header tr th:last-child{border-right-width:0}.next-table-fixed .next-table-body td{border-top-width:0}.next-table-fixed .next-table-body tr:last-child td{border-bottom-width:0}.next-table-fixed .next-table-body tr td:last-child{border-right-width:0}.next-table-fixed.only-bottom-border .next-table-body tr:last-child td{border-bottom-width:1px}.next-table-fixed.next-table-group table tr td:first-child,.next-table-fixed.next-table-group table tr th:first-child{border-left-width:1px}.next-table-fixed.next-table-group .next-table-header th{border-top-width:1px}.next-table-fixed.next-table-group .next-table-header tr th:last-child{border-right-width:1px}.next-table-fixed.next-table-group .next-table-body td{border-top-width:1px}.next-table-fixed.next-table-group .next-table-body tr:last-child td{border-bottom-width:1px}.next-table-fixed.next-table-group .next-table-body tr td:last-child,.next-table-fixed.next-table-lock-left .next-table-body tr td:last-child,.next-table-fixed.next-table-lock-left .next-table-header tr th:last-child{border-right-width:1px}.next-table-lock .next-table-body{overflow-x:auto;overflow-y:visible}.next-table-group{border-width:0}.next-table-group.only-bottom-border .next-table-body table,.next-table-group.only-bottom-border .next-table-header table{border-left:0}.next-table-group.only-bottom-border .next-table-body table,.next-table-group.only-bottom-border .next-table-body table.next-table-row,.next-table-group.only-bottom-border .next-table-header table{border-top:0}.next-table-group.only-bottom-border .next-table-body .next-table-group-footer td{border-bottom:0}.next-table-group .next-table-body{margin-top:8px}.next-table-group .next-table-body table{border-top:1px solid #e6e6e6;border-left:1px solid #e6e6e6;margin-bottom:8px}.next-table-group .next-table-body table tr:first-child td{border-top-width:1px}.next-table-group .next-table-body table:last-of-type{margin-bottom:0}.next-table-group .next-table-header table{border-top:1px solid #e6e6e6;border-left:1px solid #e6e6e6}.next-table-group .next-table-group-header td{background:#f5f5f5;color:#333}.next-table-group .next-table-group-header td:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.next-table-group .next-table-group-header td:last-child{border-top-right-radius:0;border-bottom-right-radius:0}.next-table-group .next-table-group-footer td{background:#f5f5f5;color:#333}.next-table-group .next-table-group-footer td:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.next-table-group .next-table-group-footer td:last-child{border-top-right-radius:0;border-bottom-right-radius:0}.next-table-group .next-table-row.hovered,.next-table-group .next-table-row.selected{background:#fff;color:#333}.next-table-lock{position:relative}.next-table-lock table{table-layout:fixed}.next-table-header-inner{overflow:unset}.next-table-header-fixer{content:" ";border-top-right-radius:0;border-bottom-right-radius:0;width:15px;background:inherit;position:absolute;right:0;height:100%;top:0}.next-table-wrap-empty .next-table-lock-left td,.next-table-wrap-empty .next-table-lock-right td{border:none}.next-table-wrap-empty .next-table-lock-left .next-table-empty,.next-table-wrap-empty .next-table-lock-right .next-table-empty{display:none}.next-table-wrap-empty>.next-table-inner>.next-table-body>table{table-layout:fixed}.next-table-lock-left,.next-table-lock-right{position:absolute;left:0;top:0;z-index:1;border:0;transition:box-shadow .3s ease;overflow:hidden}.next-table-lock-left table,.next-table-lock-right table{width:auto}.next-table-lock-left .next-table-body,.next-table-lock-right .next-table-body{overflow-y:scroll;overflow-x:hidden;margin-right:-20px;padding-right:0}.next-table-lock-left.shadow .next-table-body tr td:last-child,.next-table-lock-left.shadow .next-table-header tr th:last-child,.next-table-lock-right.shadow .next-table-body tr td:last-child,.next-table-lock-right.shadow .next-table-header tr th:last-child{border-right-width:0}.next-table-lock-right{right:0;left:auto}.next-table-lock-right table tr td:first-child,.next-table-lock-right table tr th:first-child{border-left-width:1px}.next-table-lock-right.shadow{box-shadow:-2px 0 3px rgba(0,0,0,.12)}.next-table-lock-left.shadow{box-shadow:2px 0 3px rgba(0,0,0,.12)}.next-table-filter{line-height:1}.next-table-sort{cursor:pointer;position:relative;width:16px;display:inline-block;line-height:1}.next-table-sort:focus{outline:0}.next-table-sort>a:before{content:" ";display:inline-block;vertical-align:middle}.next-table-sort .next-icon{position:absolute;left:-2px;color:#333}.next-table-sort .next-icon .next-icon-remote,.next-table-sort .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-table-sort .current .next-icon{color:#209bfa}.next-table-sort .next-icon-ascending{left:2px}.next-table-filter{cursor:pointer;width:20px;display:inline-block}.next-table-filter:focus{outline:0}.next-table-filter .next-icon{color:#333}.next-table-filter .next-icon .next-icon-remote,.next-table-filter .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-table-filter .next-table-filter-active{color:#209bfa}.next-table-filter-menu .next-menu-content{max-height:220px;overflow:auto}.next-table-header-icon{margin-left:8px}.next-table-expanded-ctrl{cursor:pointer}.next-table-expanded-ctrl:focus{outline:0}.next-table-expanded-ctrl.disabled{color:#999}.next-table-expanded-ctrl .next-table-expand-unfold .next-icon-remote,.next-table-expanded-ctrl .next-table-expand-unfold:before{width:12px;font-size:12px;line-height:inherit}.next-table-expanded-ctrl .next-table-expand-unfold:before{content:"顦�"}.next-table-expanded-ctrl .next-table-expand-fold .next-icon-remote,.next-table-expanded-ctrl .next-table-expand-fold:before{width:12px;font-size:12px;line-height:inherit}.next-table-expanded-ctrl .next-table-expand-fold:before{content:"顧�"}.next-table-fix-left,.next-table-fix-right{background:inherit;position:sticky;z-index:1;background-clip:padding-box}.next-table-ping-left .next-table-expanded-area .next-table-fix-left-last:after{content:none}.next-table-ping-left .next-table-expanded-area .next-table-ping-left .next-table-fix-left-last,.next-table-ping-left .next-table-fix-left-last{border-right-width:0}.next-table-ping-left .next-table-expanded-area .next-table-ping-left .next-table-fix-left-last:after,.next-table-ping-left .next-table-fix-left-last:after{box-shadow:inset 10px 0 8px -8px rgba(0,0,0,.15);position:absolute;top:0;right:0;bottom:0;width:30px;content:"";pointer-events:none;transition:box-shadow .3s,-webkit-box-shadow .3s;transform:translateX(100%)}.next-table-ping-right .next-table-expanded-area .next-table-fix-right-first:after{content:none}.next-table-ping-right .next-table-expanded-area .next-table-ping-right .next-table-fix-right-first:after,.next-table-ping-right .next-table-fix-right-first:after{box-shadow:inset -10px 0 8px -8px rgba(0,0,0,.15);position:absolute;top:0;left:0;bottom:0;width:30px;content:"";pointer-events:none;transition:box-shadow .3s,-webkit-box-shadow .3s;transform:translateX(-100%)}.next-table-fixed.next-table-scrolling-to-right:after,.next-table-lock.next-table-scrolling-to-right:after{box-shadow:inset -10px 0 8px -8px rgba(0,0,0,.15);position:absolute;top:0;right:-30px;bottom:0;width:30px;content:"";pointer-events:none;transition:box-shadow .3s,-webkit-box-shadow .3s;transform:translateX(-100%)}.next-table-fixed.only-bottom-border,.next-table-lock.only-bottom-border{border-right:0}.next-table[dir=rtl] th{text-align:right}.next-table[dir=rtl] .next-table-header-resizable .next-table-resize-handler{right:auto;left:0}.next-table[dir=rtl] td .next-table-cell-wrapper .next-icon-arrow-down.next-table-tree-arrow,.next-table[dir=rtl] td .next-table-cell-wrapper .next-icon-arrow-right.next-table-tree-arrow,.next-table[dir=rtl] td .next-table-cell-wrapper .next-table-tree-placeholder{margin-left:3px;margin-right:0;float:right}.next-table[dir=rtl] .next-table-expanded-row td:first-child{border-left-width:0;border-right-width:1px}.next-table[dir=rtl] .next-table-expanded-row td:last-child{border-left-width:1px;border-right-width:0}.next-table[dir=rtl].only-bottom-border .next-table-expanded-row td,.next-table[dir=rtl].only-bottom-border .next-table-expanded-row th{border-width:0 0 1px}.next-table[dir=rtl] .next-table-filter-footer button{margin-left:5px;margin-right:0}.next-table[dir=rtl] .next-table-lock-left,.next-table[dir=rtl] .next-table-lock-right{left:auto;right:0}.next-table[dir=rtl] .next-table-lock-right{right:auto;left:0}.next-table[dir=rtl] .next-table-lock-right table tr td:first-child,.next-table[dir=rtl] .next-table-lock-right table tr th:first-child{border-right-width:1px}.next-table[dir=rtl] .next-table-lock-right.shadow{box-shadow:2px 0 3px rgba(0,0,0,.12)}.next-table[dir=rtl] .next-table-lock-left.shadow{box-shadow:-2px 0 3px rgba(0,0,0,.12)}.next-table[dir=rtl] .next-table-sort .next-icon{right:0;left:auto}.next-table[dir=rtl] .next-table-sort .next-icon-ascending{right:4px;left:auto}.next-table[dir=rtl] .next-table-filter{margin-right:5px;margin-left:0}.next-table-fixed[dir=rtl] table tr td:first-child,.next-table-fixed[dir=rtl] table tr th:first-child{border-left-width:1px;border-right-width:0}.next-table-fixed[dir=rtl] .next-table-body tr td:last-child,.next-table-fixed[dir=rtl] .next-table-header tr th:last-child{border-left-width:1px}.next-calendar2,.next-calendar2 *,.next-calendar2 :after,.next-calendar2 :before{box-sizing:border-box}.next-calendar2 table{border-collapse:collapse;border-spacing:0}.next-calendar2 td,.next-calendar2 th{padding:0}div[dir=rtl].next-calendar2-card .next-calendar2-header-actions,div[dir=rtl].next-calendar2-fullscreen .next-calendar2-header-actions,div[dir=rtl].next-calendar2-panel .next-calendar2-header-actions{margin-right:auto;margin-left:0}div[dir=rtl].next-calendar2-card .next-calendar2-header-actions>:not(:first-child),div[dir=rtl].next-calendar2-card .next-calendar2-header-ranges>:not(:first-child),div[dir=rtl].next-calendar2-fullscreen .next-calendar2-header-actions>:not(:first-child),div[dir=rtl].next-calendar2-fullscreen .next-calendar2-header-ranges>:not(:first-child),div[dir=rtl].next-calendar2-panel .next-calendar2-header-actions>:not(:first-child),div[dir=rtl].next-calendar2-panel .next-calendar2-header-ranges>:not(:first-child){margin-right:8px;margin-left:0}div[dir=rtl].next-calendar2-fullscreen .next-calendar2-cell-value,div[dir=rtl].next-calendar2-fullscreen .next-calendar2-table th{text-align:left}div[dir=rtl].next-calendar2-fullscreen .next-calendar2-table th{padding:0 0 5px 12px}.next-calendar2{font-size:12px;user-select:none;background:#fff}.next-calendar2-header{display:flex}.next-calendar2-table{width:100%;table-layout:fixed}.next-calendar2-cell{cursor:pointer;position:relative;transition:background-color .2s,border .2s}.next-calendar2 .next-calendar2-cell-inner{color:#ccc;outline:none;min-width:24px;position:relative;border:1px solid transparent}.next-calendar2-cell-disabled:before{color:#ccc;background:#fafafa}.next-calendar2-card .next-calendar2-header-actions,.next-calendar2-fullscreen .next-calendar2-header-actions,.next-calendar2-panel .next-calendar2-header-actions{margin-left:auto}.next-calendar2-card .next-calendar2-header-actions>:not(:first-child),.next-calendar2-card .next-calendar2-header-ranges>:not(:first-child),.next-calendar2-fullscreen .next-calendar2-header-actions>:not(:first-child),.next-calendar2-fullscreen .next-calendar2-header-ranges>:not(:first-child),.next-calendar2-panel .next-calendar2-header-actions>:not(:first-child),.next-calendar2-panel .next-calendar2-header-ranges>:not(:first-child){margin-left:8px}.next-calendar2-card .next-calendar2-header-select-month,.next-calendar2-card .next-calendar2-header-select-year,.next-calendar2-fullscreen .next-calendar2-header-select-month,.next-calendar2-fullscreen .next-calendar2-header-select-year,.next-calendar2-panel .next-calendar2-header-select-month,.next-calendar2-panel .next-calendar2-header-select-year{min-width:88px}.next-calendar2-card .next-calendar2-header-select-month .next-input,.next-calendar2-card .next-calendar2-header-select-year .next-input,.next-calendar2-fullscreen .next-calendar2-header-select-month .next-input,.next-calendar2-fullscreen .next-calendar2-header-select-year .next-input,.next-calendar2-panel .next-calendar2-header-select-month .next-input,.next-calendar2-panel .next-calendar2-header-select-year .next-input{min-width:auto}.next-calendar2-card .next-calendar2-body,.next-calendar2-fullscreen .next-calendar2-body,.next-calendar2-panel .next-calendar2-body{padding:8px 0}.next-calendar2-card .next-calendar2-cell-inner,.next-calendar2-panel .next-calendar2-cell-inner{z-index:2;height:24px;line-height:22px;border-radius:2px;display:inline-block}.next-calendar2-card .next-calendar2,.next-calendar2-panel .next-calendar2{min-height:150px}.next-calendar2-card .next-calendar2-table thead>tr,.next-calendar2-panel .next-calendar2-table thead>tr{height:24px;color:#999}.next-calendar2-card .next-calendar2-table td,.next-calendar2-card .next-calendar2-table th,.next-calendar2-panel .next-calendar2-table td,.next-calendar2-panel .next-calendar2-table th{font-weight:400;text-align:center;padding:4px 0}.next-calendar2-card .next-calendar2-table th,.next-calendar2-panel .next-calendar2-table th{height:32px}.next-calendar2-card .next-calendar2-table-decade,.next-calendar2-card .next-calendar2-table-month,.next-calendar2-card .next-calendar2-table-year,.next-calendar2-panel .next-calendar2-table-decade,.next-calendar2-panel .next-calendar2-table-month,.next-calendar2-panel .next-calendar2-table-year{height:145px}.next-calendar2-card .next-calendar2-table-decade .next-calendar2-cell-inner,.next-calendar2-card .next-calendar2-table-month .next-calendar2-cell-inner,.next-calendar2-card .next-calendar2-table-year .next-calendar2-cell-inner,.next-calendar2-panel .next-calendar2-table-decade .next-calendar2-cell-inner,.next-calendar2-panel .next-calendar2-table-month .next-calendar2-cell-inner,.next-calendar2-panel .next-calendar2-table-year .next-calendar2-cell-inner{min-width:56px}.next-calendar2-card .next-calendar2-table-quarter,.next-calendar2-panel .next-calendar2-table-quarter{height:50px}.next-calendar2-card .next-calendar2-table-quarter .next-calendar2-cell-inner,.next-calendar2-panel .next-calendar2-table-quarter .next-calendar2-cell-inner{min-width:56px}.next-calendar2-card .next-calendar2-table-decade .next-calendar2-cell-inner,.next-calendar2-panel .next-calendar2-table-decade .next-calendar2-cell-inner{min-width:80px}.next-calendar2-card .next-calendar2-cell-current:not(.next-calendar2-cell-disabled):not(.next-calendar2-cell-selected):not(.next-calendar2-cell-today) .next-calendar2-cell-inner,.next-calendar2-panel .next-calendar2-cell-current:not(.next-calendar2-cell-disabled):not(.next-calendar2-cell-selected):not(.next-calendar2-cell-today) .next-calendar2-cell-inner{color:#666}.next-calendar2-card .next-calendar2-cell-current:not(.next-calendar2-cell-disabled):not(.next-calendar2-cell-selected):not(.next-calendar2-cell-today):hover:not(.next-calendar2-cell-hover) .next-calendar2-cell-inner,.next-calendar2-panel .next-calendar2-cell-current:not(.next-calendar2-cell-disabled):not(.next-calendar2-cell-selected):not(.next-calendar2-cell-today):hover:not(.next-calendar2-cell-hover) .next-calendar2-cell-inner{background:#f9f9f9}.next-calendar2-card .next-calendar2-cell-current.next-calendar2-cell-today:not(.next-calendar2-cell-disabled) .next-calendar2-cell-inner,.next-calendar2-panel .next-calendar2-cell-current.next-calendar2-cell-today:not(.next-calendar2-cell-disabled) .next-calendar2-cell-inner{color:#209bfa}.next-calendar2-card .next-calendar2-cell-current.next-calendar2-cell-selected:not(.next-calendar2-cell-disabled) .next-calendar2-cell-inner,.next-calendar2-panel .next-calendar2-cell-current.next-calendar2-cell-selected:not(.next-calendar2-cell-disabled) .next-calendar2-cell-inner{color:#fff;background:#209bfa}.next-calendar2-fullscreen .next-calendar2-cell-value,.next-calendar2-fullscreen .next-calendar2-table th{text-align:right}.next-calendar2-fullscreen .next-calendar2-table th{padding:0 12px 5px 0}.next-calendar2-fullscreen .next-calendar2-cell-inner{height:80px;border-top:2px solid #eee;margin:0 4px;padding:4px 8px 0}.next-calendar2-fullscreen td .next-calendar2-cell-inner{height:80px;border-top:2px solid #eee}.next-calendar2-fullscreen .next-calendar2-cell-disabled .next-calendar2-cell-inner{color:#ccc;background:#fafafa}.next-calendar2-fullscreen .next-calendar2-cell-current:not(.next-calendar2-cell-disabled):not(.next-calendar2-cell-selected):not(.next-calendar2-cell-today) .next-calendar2-cell-inner{color:#666}.next-calendar2-fullscreen .next-calendar2-cell-current:not(.next-calendar2-cell-disabled):not(.next-calendar2-cell-selected):not(.next-calendar2-cell-today):hover .next-calendar2-cell-inner{background-color:#f9f9f9}.next-calendar2-fullscreen .next-calendar2-cell-current.next-calendar2-cell-today .next-calendar2-cell-inner{color:#209bfa}.next-calendar2-fullscreen .next-calendar2-cell-current .next-calendar2-cell-inner{background-color:#fff}.next-calendar2-fullscreen .next-calendar2-cell-current.next-calendar2-cell-selected:not(.next-calendar2-cell-disabled) .next-calendar2-cell-inner{border-top-color:#209bfa;font-weight:700;color:#209bfa;background:#add9ff}.next-calendar2-card .next-calendar2-header{padding:8px;border-bottom:1px solid #eee}.next-calendar2-panel .next-calendar2-header{padding:0 8px;display:flex;align-items:center;border-bottom:1px solid #eee}.next-calendar2-panel .next-calendar2-header-btn{min-width:20px;line-height:20px;color:#666;font-family:inherit;vertical-align:initial;border-radius:2px}.next-calendar2-panel .next-calendar2-header-btn>span,.next-calendar2-panel .next-calendar2-header-text-field{text-align:center;font-size:14px;color:#333;font-weight:bolder;vertical-align:initial}.next-calendar2-panel .next-calendar2-header-btn:hover,.next-calendar2-panel .next-calendar2-header-btn:hover>span{color:#209bfa}.next-calendar2-panel .next-calendar2-header-left-btn:hover,.next-calendar2-panel .next-calendar2-header-right-btn:hover{background:#f9f9f9}.next-calendar2-panel .next-calendar2-header-text-field{flex:1;height:38px;line-height:38px}.next-calendar2-panel .next-calendar2-header-text-field .next-calendar2-header-btn:not(:first-child){margin-left:6px}.next-calendar2-header-select-month-popup,.next-calendar2-header-select-year-popup{min-width:auto}.next-time-picker2-menu{float:left;text-align:center;padding:8px 0}.next-time-picker2-menu:not(:last-child){border-right:1px solid #e6e6e6}.next-time-picker2-menu-title{cursor:default;height:28px;line-height:28px;font-size:12px;font-weight:400;color:#999;background:#fff}.next-time-picker2-menu ul{position:relative;overflow-y:hidden;overflow-x:auto;list-style:none;margin:0;width:54px;padding:0;font-size:12px;height:224px;scrollbar-width:none;-ms-overflow-style:none}.next-time-picker2-menu ul::-webkit-scrollbar{width:0}.next-time-picker2-menu ul:hover{overflow-y:auto}.next-time-picker2-menu ul:after{display:block;height:192px;content:""}.next-time-picker2-menu-item{cursor:pointer;height:32px;line-height:32px;transition:background .1s linear;color:#666;background:#fff;outline:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.next-time-picker2-menu-item:hover{color:#333;background:#f9f9f9}.next-time-picker2-menu-item.next-selected{color:#666;background:#add9ff}.next-time-picker2-menu-item.next-disabled{cursor:not-allowed;color:#ccc;background:#fafafa}.next-time-picker2-panel{box-sizing:border-box;display:flex}.next-time-picker2-panel *,.next-time-picker2-panel :after,.next-time-picker2-panel :before{box-sizing:border-box}.next-time-picker2-panel:after{visibility:hidden;display:block;height:0;font-size:0;content:" ";clear:both}.next-time-picker2-panel-header{border-bottom:1px solid #e6e6e6}.next-time-picker2-panel-input.next-input{width:100%;padding:6px;border-color:transparent;vertical-align:middle}.next-time-picker2-panel .next-time-picker2-menu{flex:1}.next-time-picker2-panel-range .next-time-picker2-panel-list:last-of-type{margin-left:20px}.next-time-picker2-footer{width:min-content;min-width:100%;box-sizing:border-box;text-align:center;border-top:1px solid #f0f0f0;padding:4px 12px;display:flex;min-height:40px;align-items:center;flex-wrap:wrap}.next-time-picker2-footer-actions{margin-left:auto}.next-time-picker2-wrapper[dir=rtl] .next-time-picker2-menu{float:right}.next-time-picker2-wrapper[dir=rtl] .next-time-picker2-menu:not(:last-child){border-right:none;border-left:1px solid #e6e6e6}.next-time-picker2{display:inline-block}.next-time-picker2,.next-time-picker2 *,.next-time-picker2 :after,.next-time-picker2 :before{box-sizing:border-box}.next-time-picker2-trigger .next-input{width:100%}.next-time-picker2-wrapper{padding:4px 0}.next-time-picker2-body{display:block;overflow:hidden;border:1px solid #e6e6e6;border-radius:3px;background:#fff;box-shadow:none}.next-time-picker2-symbol-clock-icon:before{content:"顦�"}.next-time-picker2-input{display:inline-flex;align-items:center;outline:none;box-sizing:border-box;border:1px solid #ddd;vertical-align:middle;width:inherit}.next-time-picker2-input .next-input{border:none;width:100%;height:100%}.next-time-picker2-input .next-input input{height:100%}.next-time-picker2-input.next-time-picker2-input-small{height:24px;border-radius:3px}.next-time-picker2-input.next-time-picker2-input-small .next-input-label{padding-left:8px;font-size:12px}.next-time-picker2-input.next-time-picker2-input-small .next-input-inner{font-size:12px}.next-time-picker2-input.next-time-picker2-input-small .next-input-control,.next-time-picker2-input.next-time-picker2-input-small .next-input-inner-text{padding-right:4px}.next-time-picker2-input.next-time-picker2-input-small input{height:22px;line-height:22px \0 ;padding:0 4px;font-size:12px}.next-time-picker2-input.next-time-picker2-input-small input::placeholder{font-size:12px}.next-time-picker2-input.next-time-picker2-input-small .next-input-text-field{padding:0 4px;font-size:12px;height:22px;line-height:22px}.next-time-picker2-input.next-time-picker2-input-small .next-icon .next-icon-remote,.next-time-picker2-input.next-time-picker2-input-small .next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-time-picker2-input.next-time-picker2-input-small .next-input-control{border-radius:0 3px 3px 0}.next-time-picker2-input.next-time-picker2-input-medium{height:32px;border-radius:3px}.next-time-picker2-input.next-time-picker2-input-medium .next-input-label{padding-left:8px;font-size:14px}.next-time-picker2-input.next-time-picker2-input-medium .next-input-inner{font-size:14px}.next-time-picker2-input.next-time-picker2-input-medium .next-input-control,.next-time-picker2-input.next-time-picker2-input-medium .next-input-inner-text{padding-right:8px}.next-time-picker2-input.next-time-picker2-input-medium input{height:30px;line-height:30px \0 ;padding:0 8px;font-size:14px}.next-time-picker2-input.next-time-picker2-input-medium input::placeholder{font-size:14px}.next-time-picker2-input.next-time-picker2-input-medium .next-input-text-field{padding:0 8px;font-size:14px;height:30px;line-height:30px}.next-time-picker2-input.next-time-picker2-input-medium .next-icon .next-icon-remote,.next-time-picker2-input.next-time-picker2-input-medium .next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-time-picker2-input.next-time-picker2-input-medium .next-input-control{border-radius:0 3px 3px 0}.next-time-picker2-input.next-time-picker2-input-large{height:40px;border-radius:3px}.next-time-picker2-input.next-time-picker2-input-large .next-input-label{padding-left:12px;font-size:16px}.next-time-picker2-input.next-time-picker2-input-large .next-input-inner{font-size:16px}.next-time-picker2-input.next-time-picker2-input-large .next-input-control,.next-time-picker2-input.next-time-picker2-input-large .next-input-inner-text{padding-right:8px}.next-time-picker2-input.next-time-picker2-input-large input{height:38px;line-height:38px \0 ;padding:0 12px;font-size:16px}.next-time-picker2-input.next-time-picker2-input-large input::placeholder{font-size:16px}.next-time-picker2-input.next-time-picker2-input-large .next-input-text-field{padding:0 12px;font-size:16px;height:38px;line-height:38px}.next-time-picker2-input.next-time-picker2-input-large .next-icon .next-icon-remote,.next-time-picker2-input.next-time-picker2-input-large .next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-time-picker2-input.next-time-picker2-input-large .next-input-control{border-radius:0 3px 3px 0}.next-time-picker2-input:hover{border-color:#ccc;background-color:#fff}.next-time-picker2-input.next-time-picker2-input-focus{border-color:#209bfa;background-color:#fff;box-shadow:0 0 0 2px rgba(32,155,250,.2)}.next-time-picker2-input.next-time-picker2-input-noborder{border-color:transparent!important;box-shadow:none!important}.next-time-picker2-input.next-time-picker2-input-disabled{color:#ccc;border-color:#eee;background-color:#fafafa;cursor:not-allowed}.next-time-picker2-input.next-time-picker2-input-disabled:hover{border-color:#eee;background-color:#fafafa}.next-time-picker2-input-separator{color:#ddd;font-size:12px;display:inline-block;min-width:16px;text-align:center}.next-sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;top:0;margin:-1px}.next-date-picker2-footer{width:min-content;min-width:100%;box-sizing:border-box;text-align:center;border-top:1px solid #eee;padding:4px 12px;display:flex;min-height:40px;align-items:center;flex-wrap:wrap;position:relative}.next-date-picker2-footer-preset>.next-btn{margin-right:8px}.next-date-picker2-footer-actions{margin-left:auto}.next-date-picker2-footer-preset-only{width:100%}div[dir=rtl] .next-date-picker2-footer-preset>.next-btn{margin-left:8px;margin-right:0}div[dir=rtl] .next-date-picker2-footer-actions{margin-left:0;margin-right:auto}div[dir=rtl] .next-date-picker2-wrapper .next-calendar2-cell:last-child:before{border-top-right-radius:0;border-bottom-right-radius:0;right:0;border-top-left-radius:2px;border-bottom-left-radius:2px;left:8px}div[dir=rtl] .next-date-picker2-wrapper .next-calendar2-cell:first-child:before{border-top-left-radius:0;border-bottom-left-radius:0;left:0;border-top-right-radius:2px;border-bottom-right-radius:2px;right:8px}div[dir=rtl] .next-date-time-picker-wrapper{border-right:1px solid #eee;border-left:node}div[dir=rtl] .next-date-time-picker-wrapper .next-time-picker2-menu:not(:last-child){border-left:1px solid #dcdee3;border-right:none}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-selected.next-calendar2-cell-range-begin:before{right:50%;left:0}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-selected.next-calendar2-cell-range-end:before{left:50%;right:0}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover.next-calendar2-cell-hover-begin:after,div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover:first-child:after{right:8px}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover.next-calendar2-cell-hover-begin:not(:last-child):after,div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover:first-child:not(.next-calendar2-cell-hover-end):after{left:0}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover.next-calendar2-cell-hover-end:after,div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover:last-child:after{left:8px}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover.next-calendar2-cell-hover-end:not(:first-child):after,div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover:last-child:not(.next-calendar2-cell-hover-begin):after{right:0}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover.next-calendar2-cell-selected.next-calendar2-cell-hover-begin:after{left:0;right:7px}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover.next-calendar2-cell-selected.next-calendar2-cell-hover-end:after{right:0;left:7px}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover:first-of-type:after{border-top-left-radius:0;border-bottom-left-radius:0;border-left:none;border-top-right-radius:2px;border-bottom-right-radius:2px;border-right:1px dashed #1274e7}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover:last-of-type:after{border-top-right-radius:0;border-bottom-right-radius:0;border-right:none;border-top-left-radius:2px;border-bottom-left-radius:2px;border-left:1px dashed #1274e7}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-edge-end:after,div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-edge-end:before{right:0;left:8px}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-edge-end.next-calendar2-cell-hover:after{border-top-right-radius:0;border-bottom-right-radius:0;border-right:none;border-top-left-radius:2px;border-bottom-left-radius:2px;border-left:1px dashed #1274e7}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover-begin:after{border-left:none;border-top-left-radius:0;border-bottom-left-radius:0;border-right:1px dashed #1274e7;border-top-right-radius:2px;border-bottom-right-radius:2px}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover-end:after{border-right:none;border-top-right-radius:0;border-bottom-right-radius:0;border-left:1px dashed #1274e7;border-top-left-radius:2px;border-bottom-left-radius:2px}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-edge-end+.next-calendar2-cell-current:not(.next-calendar2-cell-disabled):after,div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-edge-end+.next-calendar2-cell-current:not(.next-calendar2-cell-disabled):before{right:8px;left:0}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-edge-end+.next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover:after{right:8px;border-top-right-radius:2px;border-bottom-right-radius:2px;border-right:1px dashed #1274e7}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-edge-end+.next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover:not(.next-calendar2-cell-hover-end):not(.next-calendar2-cell-hover-begin):after{border-top-left-radius:0;border-bottom-left-radius:0;border-left:none}div[dir=rtl] .next-calendar2-table-week .next-calendar2-week-current .next-calendar2-cell.next-calendar2-cell-selected:nth-child(2):before{right:50%;left:0}div[dir=rtl] .next-calendar2-table-week .next-calendar2-week-current .next-calendar2-cell.next-calendar2-cell-selected:last-child:before{left:50%;right:0}.next-date-picker2{outline:none;display:inline-table;position:relative;width:inherit}.next-date-picker2-overlay{vertical-align:top;padding:4px 0}.next-date-picker2-overlay-range{padding:12px 0}.next-date-picker2-wrapper{box-shadow:0 4px 16px 0 rgba(0,0,0,.12);background-color:#fff;border:1px solid #eee;border-radius:3px}.next-date-picker2-wrapper .next-calendar2-panel{border-radius:3px}.next-date-picker2-wrapper .next-calendar2-body{width:272px}.next-date-picker2-wrapper .next-calendar2-cell:before{content:"";position:absolute;top:50%;right:0;left:0;z-index:1;height:24px;transform:translateY(-50%)}.next-date-picker2-wrapper .next-calendar2-cell:last-child:before{border-top-right-radius:2px;border-bottom-right-radius:2px;right:8px}.next-date-picker2-wrapper .next-calendar2-cell:first-child:before{border-top-left-radius:2px;border-bottom-left-radius:2px;left:8px}.next-date-picker2-input{display:inline-flex;align-items:center;outline:none;box-sizing:border-box;border:1px solid #ddd;vertical-align:middle;width:inherit;background-color:#fff}.next-date-picker2-input .next-input{border:none;flex-basis:100%;height:100%;width:100%}.next-date-picker2-input .next-input input{height:100%;width:auto}.next-date-picker2-input.next-date-picker2-input-small{height:24px;border-radius:3px}.next-date-picker2-input.next-date-picker2-input-small .next-input-label{padding-left:8px;font-size:12px}.next-date-picker2-input.next-date-picker2-input-small .next-input-inner{font-size:12px}.next-date-picker2-input.next-date-picker2-input-small .next-input-control,.next-date-picker2-input.next-date-picker2-input-small .next-input-inner-text{padding-right:4px}.next-date-picker2-input.next-date-picker2-input-small input{height:22px;line-height:22px \0 ;padding:0 4px;font-size:12px}.next-date-picker2-input.next-date-picker2-input-small input::placeholder{font-size:12px}.next-date-picker2-input.next-date-picker2-input-small .next-input-text-field{padding:0 4px;font-size:12px;height:22px;line-height:22px}.next-date-picker2-input.next-date-picker2-input-small .next-icon .next-icon-remote,.next-date-picker2-input.next-date-picker2-input-small .next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-date-picker2-input.next-date-picker2-input-small .next-input-control{border-radius:0 3px 3px 0}.next-date-picker2-input.next-date-picker2-input-medium{height:32px;border-radius:3px}.next-date-picker2-input.next-date-picker2-input-medium .next-input-label{padding-left:8px;font-size:14px}.next-date-picker2-input.next-date-picker2-input-medium .next-input-inner{font-size:14px}.next-date-picker2-input.next-date-picker2-input-medium .next-input-control,.next-date-picker2-input.next-date-picker2-input-medium .next-input-inner-text{padding-right:8px}.next-date-picker2-input.next-date-picker2-input-medium input{height:30px;line-height:30px \0 ;padding:0 8px;font-size:14px}.next-date-picker2-input.next-date-picker2-input-medium input::placeholder{font-size:14px}.next-date-picker2-input.next-date-picker2-input-medium .next-input-text-field{padding:0 8px;font-size:14px;height:30px;line-height:30px}.next-date-picker2-input.next-date-picker2-input-medium .next-icon .next-icon-remote,.next-date-picker2-input.next-date-picker2-input-medium .next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-date-picker2-input.next-date-picker2-input-medium .next-input-control{border-radius:0 3px 3px 0}.next-date-picker2-input.next-date-picker2-input-large{height:40px;border-radius:3px}.next-date-picker2-input.next-date-picker2-input-large .next-input-label{padding-left:12px;font-size:16px}.next-date-picker2-input.next-date-picker2-input-large .next-input-inner{font-size:16px}.next-date-picker2-input.next-date-picker2-input-large .next-input-control,.next-date-picker2-input.next-date-picker2-input-large .next-input-inner-text{padding-right:8px}.next-date-picker2-input.next-date-picker2-input-large input{height:38px;line-height:38px \0 ;padding:0 12px;font-size:16px}.next-date-picker2-input.next-date-picker2-input-large input::placeholder{font-size:16px}.next-date-picker2-input.next-date-picker2-input-large .next-input-text-field{padding:0 12px;font-size:16px;height:38px;line-height:38px}.next-date-picker2-input.next-date-picker2-input-large .next-icon .next-icon-remote,.next-date-picker2-input.next-date-picker2-input-large .next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-date-picker2-input.next-date-picker2-input-large .next-input-control{border-radius:0 3px 3px 0}.next-date-picker2-input:hover{border-color:#ccc;background-color:#fff}.next-date-picker2-input.next-date-picker2-input-focus{border-color:#209bfa;background-color:#fff;box-shadow:0 0 0 2px rgba(32,155,250,.2)}.next-date-picker2-input.next-date-picker2-input-noborder{border-color:transparent!important;box-shadow:none!important}.next-date-picker2-input.next-date-picker2-input-disabled{color:#ccc;border-color:#eee;background-color:#fafafa;cursor:not-allowed}.next-date-picker2-input.next-date-picker2-input-disabled:hover{border-color:#eee;background-color:#fafafa}.next-date-picker2-input-separator{color:#ddd;font-size:12px;line-height:12px;display:inline-block;min-width:16px;text-align:center}.next-date-picker2-panel,.next-range-picker2-panel{display:inline-flex}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-range-picker-left .next-calendar2-header-right-btn,.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-range-picker-right .next-calendar2-header-left-btn{visibility:hidden}.next-range-picker2-arrow{display:block;transform:translateY(-50%) rotate(-45deg);position:absolute;z-index:1;width:10px;height:10px;margin-left:16.5px;border-color:#eee #eee transparent transparent;border-style:solid;border-width:1px;transition:left .3s ease-out;background:#fff}.next-date-picker2-tl-bl .next-range-picker2-arrow{top:12.5px}.next-date-picker2-bl-tl .next-range-picker2-arrow{bottom:13px;transform:translateY(50%) rotate(135deg)}.next-date-time-picker-wrapper{border-left:1px solid #eee}.next-date-time-picker-wrapper .next-calendar2-body{padding-right:0;padding-left:0}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-disabled .next-calendar2-cell-inner{color:#ccc;background:#fafafa}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-selected:before{color:#666;background:#add9ff}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-selected .next-calendar2-cell-inner{color:#666;background:transparent}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-selected.next-calendar2-cell-range-begin .next-calendar2-cell-inner,.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-selected.next-calendar2-cell-range-end .next-calendar2-cell-inner{z-index:10;color:#fff;background:#209bfa}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-selected.next-calendar2-cell-range-begin:before{left:50%}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-selected.next-calendar2-cell-range-end:before{right:50%}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-selected.next-calendar2-cell-range-begin-single:before,.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-selected.next-calendar2-cell-range-end-single:before{display:none}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover:after{content:"";position:absolute;top:50%;right:0;left:0;z-index:2;height:24px;transform:translateY(-50%);border-color:#1274e7 transparent;border-style:dashed;border-width:1px}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover.next-calendar2-cell-hover-begin:after,.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover:first-child:after{left:8px}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover.next-calendar2-cell-hover-end:after,.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover:last-child:after{right:8px}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover.next-calendar2-cell-selected.next-calendar2-cell-hover-begin:after{left:8px}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover.next-calendar2-cell-selected.next-calendar2-cell-hover-end:after{right:8px}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover:first-of-type:after{border-top-left-radius:2px;border-bottom-left-radius:2px;border-left:1px dashed #1274e7}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover:last-of-type:after{border-top-right-radius:2px;border-bottom-right-radius:2px;border-right:1px dashed #1274e7}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-edge-end:after,.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-edge-end:before{right:8px}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-edge-end.next-calendar2-cell-hover:after{border-top-right-radius:2px;border-bottom-right-radius:2px;border-right:1px dashed #1274e7}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover-begin:after{border-top:1px dashed #1274e7;border-left:1px dashed #1274e7;border-top-left-radius:2px;border-bottom-left-radius:2px}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover-end:after{border-top:1px dashed #1274e7;border-right:1px dashed #1274e7;border-top-right-radius:2px;border-bottom-right-radius:2px}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-edge-end+.next-calendar2-cell-current:not(.next-calendar2-cell-disabled):after,.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-edge-end+.next-calendar2-cell-current:not(.next-calendar2-cell-disabled):before{left:8px}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-edge-end+.next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover:after{border-top-left-radius:2px;border-bottom-left-radius:2px;border-left:1px dashed #1274e7}.next-calendar2-table-week .next-calendar2-cell-hover:after{display:none}.next-calendar2-table-week tr:hover .next-calendar2-cell:not(.next-calendar2-cell-disabled):not(.next-calendar2-cell-selected):before{background:#f9f9f9}.next-calendar2-table-week .next-calendar2-week-current .next-calendar2-cell.next-calendar2-cell-selected .next-calendar2-cell-inner,.next-calendar2-table-week .next-calendar2-week-current .next-calendar2-cell.next-calendar2-cell-selected:before{color:#666;background-color:#add9ff}.next-calendar2-table-week .next-calendar2-week-current .next-calendar2-cell.next-calendar2-cell-selected:last-child .next-calendar2-cell-inner,.next-calendar2-table-week .next-calendar2-week-current .next-calendar2-cell.next-calendar2-cell-selected:nth-child(2) .next-calendar2-cell-inner{color:#fff;background:#209bfa}.next-calendar2-table-week .next-calendar2-week-current .next-calendar2-cell.next-calendar2-cell-selected:nth-child(2):before{left:50%}.next-calendar2-table-week .next-calendar2-week-current .next-calendar2-cell.next-calendar2-cell-selected:last-child:before{right:50%}.next-calendar2-table-week tr:not(.next-calendar2-week-current) td.next-calendar2-cell.next-calendar2-cell-selected:not(.next-calendar2-cell-disabled) .next-calendar2-cell-inner,.next-calendar2-table-week tr:not(.next-calendar2-week-current) td.next-calendar2-cell.next-calendar2-cell-selected:not(.next-calendar2-cell-disabled):before{background-color:transparent;color:#ccc}.next-range-picker2-panel .next-calendar2-week-current .next-calendar2-cell-selected:not(.next-calendar2-cell-disabled):last-child .next-calendar2-cell-inner,.next-range-picker2-panel .next-calendar2-week-current .next-calendar2-cell-selected:not(.next-calendar2-cell-disabled):nth-child(2) .next-calendar2-cell-inner{background-color:#add9ff;color:#666}.next-range-picker2-panel .next-calendar2-week-current .next-calendar2-cell-selected:not(.next-calendar2-cell-disabled).next-calendar2-cell-week-range-begin:last-child .next-calendar2-cell-inner,.next-range-picker2-panel .next-calendar2-week-current .next-calendar2-cell-selected:not(.next-calendar2-cell-disabled).next-calendar2-cell-week-range-begin:nth-child(2) .next-calendar2-cell-inner,.next-range-picker2-panel .next-calendar2-week-current .next-calendar2-cell-selected:not(.next-calendar2-cell-disabled).next-calendar2-cell-week-range-end:last-child .next-calendar2-cell-inner,.next-range-picker2-panel .next-calendar2-week-current .next-calendar2-cell-selected:not(.next-calendar2-cell-disabled).next-calendar2-cell-week-range-end:nth-child(2) .next-calendar2-cell-inner{color:#fff;background:#209bfa}.next-icon-alibaba:before{content:"顬�"}.next-icon-ic_dashboard:before{content:"顭�"}.next-icon-ic_form:before{content:"顭�"}.next-icon-ic_formbeifen:before{content:"顭�"}.next-icon-ic_language:before{content:"顭�"}.next-icon-ic_logo:before{content:"顬�"}.next-icon-ic_tongzhi:before{content:"顫�"}.next-icon-ic_yusuanguanli:before{content:"顫�"}.next-icon-taobao:before{content:"顬�"}
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/resources/static/img/black_dot.png b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/img/black_dot.png
new file mode 100644
index 0000000..1b64e7d
--- /dev/null
+++ b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/img/black_dot.png
Binary files differ
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/resources/static/img/logo-2000-390.svg b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/img/logo-2000-390.svg
new file mode 100644
index 0000000..8264c1a
--- /dev/null
+++ b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/img/logo-2000-390.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2000 390.21"><defs><style>.cls-1{fill:#fff}.cls-2{fill:url(#鏈懡鍚嶇殑娓愬彉_7)}</style><linearGradient id="鏈懡鍚嶇殑娓愬彉_7" x1="816.73" y1="195.1" x2="1492.16" y2="195.1" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#4190ff"/><stop offset="1" stop-color="#1be1f6"/></linearGradient></defs><g id="鍥惧眰_2" data-name="鍥惧眰 2"><g id="鍥惧眰_1-2" data-name="鍥惧眰 1"><path class="cls-1" d="M1788 389.24h-175.45v-77.1H1788c7.13 0 17.72-1.53 26.06-5.83 8.08-4.17 16.35-10.47 16.35-32.72 0-21.89-8.25-28-16.31-32-7.22-3.59-17.1-5.59-27.1-5.59h-69.4c-5.4 0-33.74-.78-61.47-16.17-36.18-20.08-56.13-55.13-56.13-100.46 0-45.17 19.81-80.33 55.78-100.75a133.14 133.14 0 0 1 61.8-16.83h161.92v77.1h-161.76c-.77 0-13.5.64-24.5 7.14-7.5 4.44-16.12 11.39-16.12 33.34s8.58 28.58 16.05 32.83c9.44 5.37 20.87 6.65 24.48 6.69H1787c22.16 0 43.38 4.73 61.37 13.67 38.12 18.94 59.11 54.2 59.11 101 0 46.59-20.64 81.92-58.11 101.25-24.31 12.56-48.91 14.43-61.37 14.43zm-1498.84-3.85c-11.54 0-23.71-3.26-31.17-12.66L72.29 146.09l1 241.22H1l-1-347C0 23.94 9.41 11.27 24.9 5.87s33.65-1.38 43.85 11.47l184.74 228.57V2h72.29l1 346.76c0 16.4-9.41 29.08-24.9 34.48a38.48 38.48 0 0 1-12.72 2.15z"/><path class="cls-2" d="M937.33 390.21c-107.58 0-195.1-87.52-195.1-195.1S829.75 0 937.33 0a193.92 193.92 0 0 1 137.17 56.36l.16.15 52.64 52.64-54.52 54.52-52.56-52.56a118 118 0 1 0 .56 167.43l53.91-53.91 54.52 54.52-53.91 53.91a193.83 193.83 0 0 1-137.97 57.15z"/><path class="cls-2" d="M1379.86 390.21a194 194 0 0 1-137-56.17l-.38-.38-137.2-139.15L1241.9 57.14A193.83 193.83 0 0 1 1379.86 0C1487.44 0 1575 87.52 1575 195.1s-87.56 195.11-195.14 195.11zm-82.66-110.9a118 118 0 1 0-.76-167.67l-82.64 83.1z"/><path class="cls-1" d="M442.45 386.35L552.52 98.73a84.56 84.56 0 0 1 5.35-10.8 79.54 79.54 0 0 1 4.62 9.35l111.4 289.07h82.88L634.2 68.95A164.41 164.41 0 0 0 619 40.2C597.63 8.45 573.9 1.79 557.75 1.79c-29.44 0-49.78 21.48-61.67 39.5a172.83 172.83 0 0 0-15.37 29.34L359.64 386.35z"/><circle cx="1966.27" cy="356.47" r="33.73" fill="#1be1f6"/></g></g></svg>
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/resources/static/img/nacos.png b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/img/nacos.png
new file mode 100644
index 0000000..9d9fba8
--- /dev/null
+++ b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/img/nacos.png
Binary files differ
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/resources/static/index.html b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/index.html
new file mode 100644
index 0000000..8a75269
--- /dev/null
+++ b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/index.html
@@ -0,0 +1,61 @@
+<!--
+  ~ Copyright 1999-2018 Alibaba Group Holding Ltd.
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<!DOCTYPE html>
+
+<html lang="en">
+
+<head>
+	<meta charset="UTF-8">
+	<meta name="viewport" content="width=device-width,initial-scale=1">
+	<meta http-equiv="X-UA-Compatible" content="ie=edge">
+	<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
+  <meta http-equiv="Pragma" content="no-cache">
+  <meta http-equiv="Expires" content="0">
+	<title>Nacos</title>
+	<link rel="shortcut icon" href="console-ui/public/img/nacos-logo.png" type="image/x-icon">
+  <link rel="stylesheet" type="text/css" href="console-ui/public/css/bootstrap.css">
+	<link rel="stylesheet" type="text/css" href="console-ui/public/css/console1412.css">
+	<!-- 绗笁鏂筩ss寮�濮� -->
+	<link rel="stylesheet" type="text/css" href="console-ui/public/css/codemirror.css">
+	<link rel="stylesheet" type="text/css" href="console-ui/public/css/merge.css">
+	<link rel="stylesheet" type="text/css" href="console-ui/public/css/icon.css">
+	<link rel="stylesheet" type="text/css" href="console-ui/public/css/font-awesome.css">
+	<!-- 绗笁鏂筩ss缁撴潫 -->
+<link href="./css/main.css?9f68bc0e1a07ae7085fe" rel="stylesheet"></head>
+
+<body>
+	<div id="root" style="overflow:hidden"></div>
+	<div id="app"></div>
+	<div id="other"></div>
+
+	<!-- 绗笁鏂筳s寮�濮� -->
+	<script src="console-ui/public/js/jquery.js"></script>
+	<script src="console-ui/public/js/codemirror.js"></script>
+	<script src="console-ui/public/js/javascript.js"></script>
+	<script src="console-ui/public/js/xml.js"></script>
+	<script src="console-ui/public/js/codemirror.addone.fullscreen.js"></script>
+	<script src="console-ui/public/js/codemirror.addone.lint.js"></script>
+	<script src="console-ui/public/js/codemirror.lib.json-lint.js"></script>
+	<script src="console-ui/public/js/codemirror.addone.json-lint.js"></script>
+	<script src="console-ui/public/js/codemirror.lib.clike-lint.js"></script>
+	<script src="console-ui/public/js/diff_match_patch.js"></script>
+	<script src="console-ui/public/js/merge.js"></script>
+	<script src="console-ui/public/js/loader.js"></script>
+	<!-- 绗笁鏂筳s缁撴潫 -->
+<script type="text/javascript" src="./js/main.js?9f68bc0e1a07ae7085fe"></script></body>
+
+</html>
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/resources/static/js/main.js b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/js/main.js
new file mode 100644
index 0000000..526f50b
--- /dev/null
+++ b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/js/main.js
@@ -0,0 +1,330 @@
+!function(n){var a={};function r(e){if(a[e])return a[e].exports;var t=a[e]={i:e,l:!1,exports:{}};return n[e].call(t.exports,t,t.exports,r),t.l=!0,t.exports}r.m=n,r.c=a,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var a in t)r.d(n,a,function(e){return t[e]}.bind(null,a));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=443)}([function(e,t,n){"use strict";e.exports=n(450)},function(e,t,n){"use strict";n.d(t,"a",function(){return E}),n.d(t,"c",function(){return x}),n.d(t,"b",function(){return C});n(51);var t=n(25),u=n.n(t),s=n(72),r=n(89),d=n(61),c=n(31),t=n(106),f=n.n(t),t=n(65),p=n.n(t);function h(){var e=window.location.href,e=(localStorage.removeItem("token"),e.split("#")[0]);console.log("base_url",e),window.location="".concat(e,"#/login")}var l,m,a,o,i,g,y,v,_,b,w,M,n=window,k=(l={},{once:function(e,t){this.listen.call(this,e,t,!0)},listen:function(e,t){var n=2<arguments.length&&void 0!==arguments[2]&&arguments[2];e&&t&&(l[e]||(l[e]=[]),l[e].push({callback:t,once:n}))},listenAllTask:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];var a=Array.prototype.slice.call(t),r=a[0];r&&(this.listen.apply(this,Object(d.a)(a)),m[r]&&0<m[r].length&&(a=m[r].pop(),this.trigger.apply(a.self,a.argsList)))},trigger:function(){for(var n=this,e=arguments.length,t=new Array(e),a=0;a<e;a++)t[a]=arguments[a];var r,o=Array.prototype.slice.call(t),i=o.shift();l[i]?(r=[],l[i].forEach(function(e,t){"[object Function]"===Object.prototype.toString.call(e.callback)&&(e.callback.apply(n,o),e.once||r.push(e))}),l[i]=r):(m[i]||(m[i]=[]),m[i].push({argsList:Array.prototype.slice.call(t),self:n}))},remove:function(e,n){var a;e&&l[e]&&(n?(a=[],l[e].forEach(function(e,t){e.callback!==n&&a.push(e)}),l[e]=a.length?a:null):l[e]=null)}}),S=(a=0,o={visible:!(m={}),shape:"flower",tip:"loading..."},{changeLoadingAttr:function(e){"[object Object]"===Object.prototype.toString.call(e)&&(o=Object.assign({},a,e))},openLoading:function(){a++,k.trigger("nacosLoadingEvent",Object.assign(o,{visible:!0,spinning:!0}))},closeLoading:function(){--a<=0&&(a=0,k.trigger("nacosLoadingEvent",Object.assign(o,{visible:!1,spinning:!1})))},closeAllLoading:function(){a=0,k.trigger("nacosLoadingEvent",Object.assign(o,{visible:!1,spinning:!1}))},getURISource:function(e){return e}}),E=function(e){var e=new RegExp("(^|&)".concat(e,"=([^&]*)(&|$)"),"i"),t=[];if(1<(t=1===(t=(""!==i.location.hash?i.location.hash:i.location.href).split("?")).length?i.parent.location.hash.split("?"):t).length){t=t[1].match(e);if(null!=t)return decodeURIComponent(t[2])}return null},x=(y=(g=i=n).location.href.split("#")[0],function(e,t){var n,a;e&&(a={},"string"==typeof e&&(a=Object(r.a)({},e,t)),"[object Object]"===Object.prototype.toString.call(e)&&(a=e),t=[],e=(t=g.location.hash?g.location.hash.split("?"):t)[1]&&t[1].split("&")||[],n={},e.forEach(function(e){e=e.split("=");n[e[0]]=decodeURIComponent(e[1]||"")}),n=Object.assign({},n,a),e=Object.keys(n).map(function(e){return"".concat(e,"=").concat(encodeURIComponent(n[e]||""))})||[],t[1]=e.join("&"),a=t.join("?"),g.history.replaceState?g.history.replaceState(null,"",y+a):g.location.hash=a)}),C=(n.location.href.split("#")[0],v=[],_=[],b={},w=[],(t=[]).forEach(function(e){b[e.registerName]=e}),M=function(e){e=b[e];return e?(e.methodType=w[e.method],e):null},D.handleCustomService=T,D.handleMiddleWare=L,D.NacosRealUrlMapper=M,D.serviceList=t,D.serviceMap=b,D.middleWare=function(e){return(!(1<arguments.length&&void 0!==arguments[1])||arguments[1]?_:v).push(e),this},D);function L(){for(var n=this,e=arguments.length,t=new Array(e),a=0;a<e;a++)t[a]=arguments[a];var r=t[0],o=t.slice(1),i=o.pop()||[];return r=i&&0<i.length?i.reduce(function(e,t){return"function"==typeof t&&t.apply(n,[e].concat(Object(d.a)(o)))||e},r):r}function T(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];var a=t[0];if(a&&a.url&&0===a.url.indexOf("com.alibaba.")){var r,o,i=a.url,l=M(i);if(l&&l.url&&l.url.replace){if(f.a.is_preview&&l.is_mock&&a.success){i=null;try{i=JSON.parse(l.defaults)}catch(e){}return void a.success(i)}a.url=l.url.replace(/{([^\}]+)}/g,function(e,t){return a.$data[t]});try{l.is_param&&"object"===Object(s.a)(a.data)&&(a.data=Object.assign({},JSON.parse(l.params),a.data))}catch(e){}l.method&&!a.type&&(a.type=l.methodType),l.isJsonData&&"object"===Object(s.a)(a.data)&&(a.data=JSON.stringify(a.data),a.processData=!1,a.dataType="json",a.contentType="application/json");try{f.a.is_preview&&l.is_proxy&&(r=a.beforeSend,a.beforeSend=function(e){l.cookie&&e.setRequestHeader("tmpCookie",l.cookie),l.header&&e.setRequestHeader("tmpHeader",l.header),l.proxy&&e.setRequestHeader("tmpProxy",l.proxy),r&&r(e)})}catch(e){}l.autoLoading&&(o=a.complete,a.complete=function(){S.closeLoading(),"function"==typeof o&&o.apply(p.a,Array.prototype.slice.call(t))})}}return a}function D(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];var a=t[0],r=t.slice(1),a=L.apply(this,[a].concat(Object(d.a)(r),[v]));if(a=T.apply(this,[a].concat(Object(d.a)(r)))){a.type&&"post"===a.type.toLowerCase()&&a.data&&"[object Object]"===Object.prototype.toString.call(a.data)&&!a.data.sec_token&&(o="XSRF-TOKEN",i="",(document.cookie&&document.cookie.split(";")||[]).forEach(function(e){var e=e.split("=")||[],e=Object(c.a)(e,2),t=e[0],t=void 0===t?"":t,e=e[1],e=void 0===e?"":e;-1!==t.trim().indexOf(o)&&(i=e)}),(l=i.trim())&&(a.data.sec_token=l)),a=L.apply(this,[a].concat(Object(d.a)(r),[_]));var o,i,l={};try{l=JSON.parse(localStorage.token)}catch(e){console.log("Token Error",localStorage.token,e),h()}var r=l.accessToken,l=void 0===r?"":r,r=a.url.split("?"),r=Object(c.a)(r,2),s=r[0],r=r[1],r=r?r.split("&"):[];return r.push("accessToken=".concat(l)),p.a.ajax(Object.assign({},a,{type:a.type,url:[s,r.join("&")].join("?"),data:a.data||"",dataType:a.dataType||"json",beforeSend:function(e){a.beforeSend&&a.beforeSend(e)},headers:{Authorization:localStorage.getItem("token")}})).then(function(e){},function(e){var t=e||{},n=t.status,t=t.responseJSON,t=void 0===t?{}:t;return t.message&&u.a.error(t.message),[401,403].includes(n)&&["unknown user!","token invalid!","token expired!"].includes(t.message)&&h(),e})}}},function(e,t,n){"use strict";t.__esModule=!0;var n=n(460),n=(n=n)&&n.__esModule?n:{default:n};t.default=n.default||function(e){for(var t=1;t<arguments.length;t++){var n,a=arguments[t];for(n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n])}return e}},function(e,t,n){e.exports=n(497)()},function(e,t,n){"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";t.__esModule=!0;var a=d(n(2)),r=d(n(12)),o=d(n(8)),i=d(n(548)),l=d(n(571)),s=d(n(575)),u=d(n(578)),n=d(n(357));function d(e){return e&&e.__esModule?e:{default:e}}i.default.Item=o.default.config(l.default,{transform:function(e,t){var n;return"validateStatus"in e&&(t("validateStatus","validateState","Form.Item"),n=(t=e).validateStatus,t=(0,r.default)(t,["validateStatus"]),e=(0,a.default)({validateState:n},t)),e}}),i.default.Submit=s.default,i.default.Reset=u.default,i.default.Error=n.default,t.default=o.default.config(i.default,{transform:function(e,t){var n;return"direction"in e&&(t("direction","inline","Form"),n=(t=e).direction,t=(0,r.default)(t,["direction"]),"hoz"===n&&(e=(0,a.default)({inline:!0},t))),e}}),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var n=n(38),a=(n=n)&&n.__esModule?n:{default:n};t.default=function(e,t){if(e)return!t||"object"!==(void 0===t?"undefined":(0,a.default)(t))&&"function"!=typeof t?e:t;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}},function(e,t,n){"use strict";t.__esModule=!0;var a=i(n(490)),r=i(n(494)),o=i(n(38));function i(e){return e&&e.__esModule?e:{default:e}}t.default=function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+(void 0===t?"undefined":(0,o.default)(t)));e.prototype=(0,r.default)(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(a.default?(0,a.default)(e,t):e.__proto__=t)}},function(e,t,n){"use strict";t.__esModule=!0;var r=g(n(2)),o=g(n(4)),i=g(n(6)),a=g(n(7)),l=n(0),s=g(n(3)),u=n(30),d=g(n(200)),c=n(513),f=g(n(514)),p=g(n(207)),h=g(n(515)),m=g(n(155));function g(e){return e&&e.__esModule?e:{default:e}}function y(e){var t=void 0;try{(t=n(9))&&t.default&&t.default.isMoment&&(t=t.default)}catch(e){}t&&e&&t.locale(e.momentLocale)}function v(e){e&&m.default.locale(e.dateLocale||e.momentLocale)}var _,b=new h.default,s=(_=l.Component,(0,a.default)(w,_),w.prototype.getChildContext=function(){var e=this.props,t=e.prefix,n=e.locale,a=e.defaultPropsConfig,r=e.pure,o=e.warning,i=e.rtl,l=e.device,s=e.popupContainer,e=e.errorBoundary,u=this.context,d=u.nextPrefix,c=u.nextDefaultPropsConfig,f=u.nextLocale,p=u.nextPure,h=u.nextRtl,m=u.nextWarning,g=u.nextDevice,y=u.nextPopupContainer,u=u.nextErrorBoundary;return{nextPrefix:t||d,nextDefaultPropsConfig:a||c,nextLocale:n||f,nextPure:"boolean"==typeof r?r:p,nextRtl:"boolean"==typeof i?i:h,nextWarning:"boolean"==typeof o?o:m,nextDevice:l||g,nextPopupContainer:s||y,nextErrorBoundary:e||u}},w.getDerivedStateFromProps=function(e,t){return e.locale!==t.locale?(y(e.locale),v(e.locale),{locale:e.locale}):null},w.prototype.componentDidUpdate=function(){b.add(this,(0,r.default)({},b.get(this,{}),this.getChildContext()))},w.prototype.componentWillUnmount=function(){b.remove(this)},w.prototype.render=function(){return l.Children.only(this.props.children)},a=h=w,h.propTypes={prefix:s.default.string,locale:s.default.object,defaultPropsConfig:s.default.object,errorBoundary:s.default.oneOfType([s.default.bool,s.default.object]),pure:s.default.bool,warning:s.default.bool,rtl:s.default.bool,device:s.default.oneOf(["tablet","desktop","phone"]),children:s.default.any,popupContainer:s.default.any},h.defaultProps={warning:!0,errorBoundary:!1},h.contextTypes={nextPrefix:s.default.string,nextLocale:s.default.object,nextDefaultPropsConfig:s.default.object,nextPure:s.default.bool,nextRtl:s.default.bool,nextWarning:s.default.bool,nextDevice:s.default.oneOf(["tablet","desktop","phone"]),nextPopupContainer:s.default.any,nextErrorBoundary:s.default.oneOfType([s.default.bool,s.default.object])},h.childContextTypes={nextPrefix:s.default.string,nextLocale:s.default.object,nextDefaultPropsConfig:s.default.object,nextPure:s.default.bool,nextRtl:s.default.bool,nextWarning:s.default.bool,nextDevice:s.default.oneOf(["tablet","desktop","phone"]),nextPopupContainer:s.default.any,nextErrorBoundary:s.default.oneOfType([s.default.bool,s.default.object])},h.config=function(e,t){return(0,c.config)(e,t)},h.getContextProps=function(e,t){return(0,d.default)(e,b.root()||{},t)},h.clearCache=function(){b.clear()},h.initLocales=c.initLocales,h.setLanguage=c.setLanguage,h.setLocale=c.setLocale,h.setDirection=c.setDirection,h.getLanguage=c.getLanguage,h.getLocale=c.getLocale,h.getDirection=c.getDirection,h.Consumer=f.default,h.ErrorBoundary=p.default,h.getContext=function(){var e=b.root()||{};return{prefix:e.nextPrefix,locale:e.nextLocale,defaultPropsConfig:e.nextDefaultPropsConfig,pure:e.nextPure,rtl:e.nextRtl,warning:e.nextWarning,device:e.nextDevice,popupContainer:e.nextPopupContainer,errorBoundary:e.nextErrorBoundary}},a);function w(){(0,o.default)(this,w);for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];var a=(0,i.default)(this,_.call.apply(_,[this].concat(t)));return b.add(a,(0,r.default)({},b.get(a,{}),a.getChildContext())),y(a.props.locale),v(a.props.locale),a.state={locale:a.props.locale},a}s.displayName="ConfigProvider",t.default=(0,u.polyfill)(s),e.exports=t.default},function(e,t,fi){!function(di){var ci;//! moment.js
+//! version : 2.29.4
+//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
+//! license : MIT
+//! momentjs.com
+di.exports=function(){"use strict";var I,R;function c(){return I.apply(null,arguments)}function A(e){I=e}function i(e){return e instanceof Array||Object.prototype.toString.call(e)==="[object Array]"}function H(e){return e!=null&&Object.prototype.toString.call(e)==="[object Object]"}function s(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function F(e){if(Object.getOwnPropertyNames)return Object.getOwnPropertyNames(e).length===0;else{var t;for(t in e)if(s(e,t))return false;return true}}function l(e){return e===void 0}function u(e){return typeof e==="number"||Object.prototype.toString.call(e)==="[object Number]"}function z(e){return e instanceof Date||Object.prototype.toString.call(e)==="[object Date]"}function W(e,t){var n=[],a,r=e.length;for(a=0;a<r;++a)n.push(t(e[a],a));return n}function V(e,t){for(var n in t)if(s(t,n))e[n]=t[n];if(s(t,"toString"))e.toString=t.toString;if(s(t,"valueOf"))e.valueOf=t.valueOf;return e}function d(e,t,n,a){return Qn(e,t,n,a,true).utc()}function B(){return{empty:false,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:false,invalidEra:null,invalidMonth:null,invalidFormat:false,userInvalidated:false,iso:false,parsedDateParts:[],era:null,meridiem:null,rfc2822:false,weekdayMismatch:false}}function f(e){if(e._pf==null)e._pf=B();return e._pf}if(Array.prototype.some)R=Array.prototype.some;else R=function(e){var t=Object(this),n=t.length>>>0,a;for(a=0;a<n;a++)if(a in t&&e.call(this,t[a],a,t))return true;return false};function U(e){if(e._isValid==null){var t=f(e),n=R.call(t.parsedDateParts,function(e){return e!=null}),a=!isNaN(e._d.getTime())&&t.overflow<0&&!t.empty&&!t.invalidEra&&!t.invalidMonth&&!t.invalidWeekday&&!t.weekdayMismatch&&!t.nullInput&&!t.invalidFormat&&!t.userInvalidated&&(!t.meridiem||t.meridiem&&n);if(e._strict)a=a&&t.charsLeftOver===0&&t.unusedTokens.length===0&&t.bigHour===undefined;if(Object.isFrozen==null||!Object.isFrozen(e))e._isValid=a;else return a}return e._isValid}function K(e){var t=d(NaN);if(e!=null)V(f(t),e);else f(t).userInvalidated=true;return t}var G=c.momentProperties=[],q=false;function $(e,t){var n,a,r,o=G.length;if(!l(t._isAMomentObject))e._isAMomentObject=t._isAMomentObject;if(!l(t._i))e._i=t._i;if(!l(t._f))e._f=t._f;if(!l(t._l))e._l=t._l;if(!l(t._strict))e._strict=t._strict;if(!l(t._tzm))e._tzm=t._tzm;if(!l(t._isUTC))e._isUTC=t._isUTC;if(!l(t._offset))e._offset=t._offset;if(!l(t._pf))e._pf=f(t);if(!l(t._locale))e._locale=t._locale;if(o>0)for(n=0;n<o;n++){a=G[n];r=t[a];if(!l(r))e[a]=r}return e}function J(e){$(this,e);this._d=new Date(e._d!=null?e._d.getTime():NaN);if(!this.isValid())this._d=new Date(NaN);if(q===false){q=true;c.updateOffset(this);q=false}}function p(e){return e instanceof J||e!=null&&e._isAMomentObject!=null}function X(e){if(c.suppressDeprecationWarnings===false&&typeof console!=="undefined"&&console.warn)console.warn("Deprecation warning: "+e)}function e(o,i){var l=true;return V(function(){if(c.deprecationHandler!=null)c.deprecationHandler(null,o);if(l){var e=[],t,n,a,r=arguments.length;for(n=0;n<r;n++){t="";if(typeof arguments[n]==="object"){t+="\n["+n+"] ";for(a in arguments[0])if(s(arguments[0],a))t+=a+": "+arguments[0][a]+", ";t=t.slice(0,-2)}else t=arguments[n];e.push(t)}X(o+"\nArguments: "+Array.prototype.slice.call(e).join("")+"\n"+(new Error).stack);l=false}return i.apply(this,arguments)},i)}var Q={},Z;function ee(e,t){if(c.deprecationHandler!=null)c.deprecationHandler(e,t);if(!Q[e]){X(t);Q[e]=true}}function h(e){return typeof Function!=="undefined"&&e instanceof Function||Object.prototype.toString.call(e)==="[object Function]"}function te(e){var t,n;for(n in e)if(s(e,n)){t=e[n];if(h(t))this[n]=t;else this["_"+n]=t}this._config=e;this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)}function ne(e,t){var n=V({},e),a;for(a in t)if(s(t,a))if(H(e[a])&&H(t[a])){n[a]={};V(n[a],e[a]);V(n[a],t[a])}else if(t[a]!=null)n[a]=t[a];else delete n[a];for(a in e)if(s(e,a)&&!s(t,a)&&H(e[a]))n[a]=V({},n[a]);return n}function ae(e){if(e!=null)this.set(e)}if(c.suppressDeprecationWarnings=false,c.deprecationHandler=null,Object.keys)Z=Object.keys;else Z=function(e){var t,n=[];for(t in e)if(s(e,t))n.push(t);return n};var re={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"};function oe(e,t,n){var a=this._calendar[e]||this._calendar["sameElse"];return h(a)?a.call(t,n):a}function o(e,t,n){var a=""+Math.abs(e),r=t-a.length,o=e>=0;return(o?n?"+":"":"-")+Math.pow(10,Math.max(0,r)).toString().substr(1)+a}var ie=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,le=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,se={},ue={};function a(e,t,n,a){var r=a;if(typeof a==="string")r=function(){return this[a]()};if(e)ue[e]=r;if(t)ue[t[0]]=function(){return o(r.apply(this,arguments),t[1],t[2])};if(n)ue[n]=function(){return this.localeData().ordinal(r.apply(this,arguments),e)}}function de(e){if(e.match(/\[[\s\S]/))return e.replace(/^\[|\]$/g,"");return e.replace(/\\/g,"")}function ce(a){var r=a.match(ie),e,o;for(e=0,o=r.length;e<o;e++)if(ue[r[e]])r[e]=ue[r[e]];else r[e]=de(r[e]);return function(e){var t="",n;for(n=0;n<o;n++)t+=h(r[n])?r[n].call(e,a):r[n];return t}}function fe(e,t){if(!e.isValid())return e.localeData().invalidDate();t=pe(t,e.localeData());se[t]=se[t]||ce(t);return se[t](e)}function pe(e,t){var n=5;function a(e){return t.longDateFormat(e)||e}le.lastIndex=0;while(n>=0&&le.test(e)){e=e.replace(le,a);le.lastIndex=0;n-=1}return e}var he={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"};function me(e){var t=this._longDateFormat[e],n=this._longDateFormat[e.toUpperCase()];if(t||!n)return t;this._longDateFormat[e]=n.match(ie).map(function(e){if(e==="MMMM"||e==="MM"||e==="DD"||e==="dddd")return e.slice(1);return e}).join("");return this._longDateFormat[e]}var ge="Invalid date";function ye(){return this._invalidDate}var ve="%d",_e=/\d{1,2}/;function be(e){return this._ordinal.replace("%d",e)}var we={future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function Me(e,t,n,a){var r=this._relativeTime[n];return h(r)?r(e,t,n,a):r.replace(/%d/i,e)}function ke(e,t){var n=this._relativeTime[e>0?"future":"past"];return h(n)?n(t):n.replace(/%s/i,t)}var Se={};function t(e,t){var n=e.toLowerCase();Se[n]=Se[n+"s"]=Se[t]=e}function m(e){return typeof e==="string"?Se[e]||Se[e.toLowerCase()]:undefined}function Ee(e){var t={},n,a;for(a in e)if(s(e,a)){n=m(a);if(n)t[n]=e[a]}return t}var xe={};function n(e,t){xe[e]=t}function Ce(e){var t=[],n;for(n in e)if(s(e,n))t.push({unit:n,priority:xe[n]});t.sort(function(e,t){return e.priority-t.priority});return t}function Le(e){return e%4===0&&e%100!==0||e%400===0}function g(e){if(e<0)return Math.ceil(e)||0;else return Math.floor(e)}function y(e){var t=+e,n=0;if(t!==0&&isFinite(t))n=g(t);return n}function Te(t,n){return function(e){if(e!=null){Oe(this,t,e);c.updateOffset(this,n);return this}else return De(this,t)}}function De(e,t){return e.isValid()?e._d["get"+(e._isUTC?"UTC":"")+t]():NaN}function Oe(e,t,n){if(e.isValid()&&!isNaN(n))if(t==="FullYear"&&Le(e.year())&&e.month()===1&&e.date()===29){n=y(n);e._d["set"+(e._isUTC?"UTC":"")+t](n,e.month(),ot(n,e.month()))}else e._d["set"+(e._isUTC?"UTC":"")+t](n)}function Ne(e){e=m(e);if(h(this[e]))return this[e]();return this}function Pe(e,t){if(typeof e==="object"){e=Ee(e);var n=Ce(e),a,r=n.length;for(a=0;a<r;a++)this[n[a].unit](e[n[a].unit])}else{e=m(e);if(h(this[e]))return this[e](t)}return this}var je=/\d/,r=/\d\d/,Ye=/\d{3}/,Ie=/\d{4}/,Re=/[+-]?\d{6}/,v=/\d\d?/,Ae=/\d\d\d\d?/,He=/\d\d\d\d\d\d?/,Fe=/\d{1,3}/,ze=/\d{1,4}/,We=/[+-]?\d{1,6}/,Ve=/\d+/,Be=/[+-]?\d+/,Ue=/Z|[+-]\d\d:?\d\d/gi,Ke=/Z|[+-]\d\d(?::?\d\d)?/gi,Ge=/[+-]?\d+(\.\d{1,3})?/,qe=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,$e;function _(e,n,a){$e[e]=h(n)?n:function(e,t){return e&&a?a:n}}function Je(e,t){if(!s($e,e))return new RegExp(Xe(e));return $e[e](t._strict,t._locale)}function Xe(e){return b(e.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(e,t,n,a,r){return t||n||a||r}))}function b(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var $e={},Qe={};function w(e,n){var t,a=n,r;if(typeof e==="string")e=[e];if(u(n))a=function(e,t){t[n]=y(e)};r=e.length;for(t=0;t<r;t++)Qe[e[t]]=a}function Ze(e,r){w(e,function(e,t,n,a){n._w=n._w||{};r(e,n._w,n,a)})}function et(e,t,n){if(t!=null&&s(Qe,e))Qe[e](t,n._a,n,e)}var M=0,k=1,S=2,E=3,x=4,C=5,tt=6,nt=7,at=8,L;function rt(e,t){return(e%t+t)%t}if(Array.prototype.indexOf)L=Array.prototype.indexOf;else L=function(e){var t;for(t=0;t<this.length;++t)if(this[t]===e)return t;return-1};function ot(e,t){if(isNaN(e)||isNaN(t))return NaN;var n=rt(t,12);e+=(t-n)/12;return n===1?Le(e)?29:28:31-n%7%2}a("M",["MM",2],"Mo",function(){return this.month()+1}),a("MMM",0,0,function(e){return this.localeData().monthsShort(this,e)}),a("MMMM",0,0,function(e){return this.localeData().months(this,e)}),t("month","M"),n("month",8),_("M",v),_("MM",v,r),_("MMM",function(e,t){return t.monthsShortRegex(e)}),_("MMMM",function(e,t){return t.monthsRegex(e)}),w(["M","MM"],function(e,t){t[k]=y(e)-1}),w(["MMM","MMMM"],function(e,t,n,a){var r=n._locale.monthsParse(e,a,n._strict);if(r!=null)t[k]=r;else f(n).invalidMonth=e});var it="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),lt="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),st=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,ut=qe,dt=qe;function ct(e,t){if(!e)return i(this._months)?this._months:this._months["standalone"];return i(this._months)?this._months[e.month()]:this._months[(this._months.isFormat||st).test(t)?"format":"standalone"][e.month()]}function ft(e,t){if(!e)return i(this._monthsShort)?this._monthsShort:this._monthsShort["standalone"];return i(this._monthsShort)?this._monthsShort[e.month()]:this._monthsShort[st.test(t)?"format":"standalone"][e.month()]}function pt(e,t,n){var a,r,o,i=e.toLocaleLowerCase();if(!this._monthsParse){this._monthsParse=[];this._longMonthsParse=[];this._shortMonthsParse=[];for(a=0;a<12;++a){o=d([2e3,a]);this._shortMonthsParse[a]=this.monthsShort(o,"").toLocaleLowerCase();this._longMonthsParse[a]=this.months(o,"").toLocaleLowerCase()}}if(n)if(t==="MMM"){r=L.call(this._shortMonthsParse,i);return r!==-1?r:null}else{r=L.call(this._longMonthsParse,i);return r!==-1?r:null}else if(t==="MMM"){r=L.call(this._shortMonthsParse,i);if(r!==-1)return r;r=L.call(this._longMonthsParse,i);return r!==-1?r:null}else{r=L.call(this._longMonthsParse,i);if(r!==-1)return r;r=L.call(this._shortMonthsParse,i);return r!==-1?r:null}}function ht(e,t,n){var a,r,o;if(this._monthsParseExact)return pt.call(this,e,t,n);if(!this._monthsParse){this._monthsParse=[];this._longMonthsParse=[];this._shortMonthsParse=[]}for(a=0;a<12;a++){r=d([2e3,a]);if(n&&!this._longMonthsParse[a]){this._longMonthsParse[a]=new RegExp("^"+this.months(r,"").replace(".","")+"$","i");this._shortMonthsParse[a]=new RegExp("^"+this.monthsShort(r,"").replace(".","")+"$","i")}if(!n&&!this._monthsParse[a]){o="^"+this.months(r,"")+"|^"+this.monthsShort(r,"");this._monthsParse[a]=new RegExp(o.replace(".",""),"i")}if(n&&t==="MMMM"&&this._longMonthsParse[a].test(e))return a;else if(n&&t==="MMM"&&this._shortMonthsParse[a].test(e))return a;else if(!n&&this._monthsParse[a].test(e))return a}}function mt(e,t){var n;if(!e.isValid())return e;if(typeof t==="string")if(/^\d+$/.test(t))t=y(t);else{t=e.localeData().monthsParse(t);if(!u(t))return e}n=Math.min(e.date(),ot(e.year(),t));e._d["set"+(e._isUTC?"UTC":"")+"Month"](t,n);return e}function gt(e){if(e!=null){mt(this,e);c.updateOffset(this,true);return this}else return De(this,"Month")}function yt(){return ot(this.year(),this.month())}function vt(e){if(this._monthsParseExact){if(!s(this,"_monthsRegex"))bt.call(this);if(e)return this._monthsShortStrictRegex;else return this._monthsShortRegex}else{if(!s(this,"_monthsShortRegex"))this._monthsShortRegex=ut;return this._monthsShortStrictRegex&&e?this._monthsShortStrictRegex:this._monthsShortRegex}}function _t(e){if(this._monthsParseExact){if(!s(this,"_monthsRegex"))bt.call(this);if(e)return this._monthsStrictRegex;else return this._monthsRegex}else{if(!s(this,"_monthsRegex"))this._monthsRegex=dt;return this._monthsStrictRegex&&e?this._monthsStrictRegex:this._monthsRegex}}function bt(){function e(e,t){return t.length-e.length}var t=[],n=[],a=[],r,o;for(r=0;r<12;r++){o=d([2e3,r]);t.push(this.monthsShort(o,""));n.push(this.months(o,""));a.push(this.months(o,""));a.push(this.monthsShort(o,""))}t.sort(e);n.sort(e);a.sort(e);for(r=0;r<12;r++){t[r]=b(t[r]);n[r]=b(n[r])}for(r=0;r<24;r++)a[r]=b(a[r]);this._monthsRegex=new RegExp("^("+a.join("|")+")","i");this._monthsShortRegex=this._monthsRegex;this._monthsStrictRegex=new RegExp("^("+n.join("|")+")","i");this._monthsShortStrictRegex=new RegExp("^("+t.join("|")+")","i")}function wt(e){return Le(e)?366:365}a("Y",0,0,function(){var e=this.year();return e<=9999?o(e,4):"+"+e}),a(0,["YY",2],0,function(){return this.year()%100}),a(0,["YYYY",4],0,"year"),a(0,["YYYYY",5],0,"year"),a(0,["YYYYYY",6,true],0,"year"),t("year","y"),n("year",1),_("Y",Be),_("YY",v,r),_("YYYY",ze,Ie),_("YYYYY",We,Re),_("YYYYYY",We,Re),w(["YYYYY","YYYYYY"],M),w("YYYY",function(e,t){t[M]=e.length===2?c.parseTwoDigitYear(e):y(e)}),w("YY",function(e,t){t[M]=c.parseTwoDigitYear(e)}),w("Y",function(e,t){t[M]=parseInt(e,10)}),c.parseTwoDigitYear=function(e){return y(e)+(y(e)>68?1900:2e3)};var Mt=Te("FullYear",true);function kt(){return Le(this.year())}function St(e,t,n,a,r,o,i){var l;if(e<100&&e>=0){l=new Date(e+400,t,n,a,r,o,i);if(isFinite(l.getFullYear()))l.setFullYear(e)}else l=new Date(e,t,n,a,r,o,i);return l}function Et(e){var t,n;if(e<100&&e>=0){n=Array.prototype.slice.call(arguments);n[0]=e+400;t=new Date(Date.UTC.apply(null,n));if(isFinite(t.getUTCFullYear()))t.setUTCFullYear(e)}else t=new Date(Date.UTC.apply(null,arguments));return t}function xt(e,t,n){var a=7+t-n,r=(7+Et(e,0,a).getUTCDay()-t)%7;return-r+a-1}function Ct(e,t,n,a,r){var o=(7+n-a)%7,i=xt(e,a,r),l=1+7*(t-1)+o+i,s,u;if(l<=0){s=e-1;u=wt(s)+l}else if(l>wt(e)){s=e+1;u=l-wt(e)}else{s=e;u=l}return{year:s,dayOfYear:u}}function Lt(e,t,n){var a=xt(e.year(),t,n),r=Math.floor((e.dayOfYear()-a-1)/7)+1,o,i;if(r<1){i=e.year()-1;o=r+T(i,t,n)}else if(r>T(e.year(),t,n)){o=r-T(e.year(),t,n);i=e.year()+1}else{i=e.year();o=r}return{week:o,year:i}}function T(e,t,n){var a=xt(e,t,n),r=xt(e+1,t,n);return(wt(e)-a+r)/7}function Tt(e){return Lt(e,this._week.dow,this._week.doy).week}a("w",["ww",2],"wo","week"),a("W",["WW",2],"Wo","isoWeek"),t("week","w"),t("isoWeek","W"),n("week",5),n("isoWeek",5),_("w",v),_("ww",v,r),_("W",v),_("WW",v,r),Ze(["w","ww","W","WW"],function(e,t,n,a){t[a.substr(0,1)]=y(e)});var Dt={dow:0,doy:6};function Ot(){return this._week.dow}function Nt(){return this._week.doy}function Pt(e){var t=this.localeData().week(this);return e==null?t:this.add((e-t)*7,"d")}function jt(e){var t=Lt(this,1,4).week;return e==null?t:this.add((e-t)*7,"d")}function Yt(e,t){if(typeof e!=="string")return e;if(!isNaN(e))return parseInt(e,10);e=t.weekdaysParse(e);if(typeof e==="number")return e;return null}function It(e,t){if(typeof e==="string")return t.weekdaysParse(e)%7||7;return isNaN(e)?null:e}function Rt(e,t){return e.slice(t,7).concat(e.slice(0,t))}a("d",0,"do","day"),a("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),a("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),a("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),a("e",0,0,"weekday"),a("E",0,0,"isoWeekday"),t("day","d"),t("weekday","e"),t("isoWeekday","E"),n("day",11),n("weekday",11),n("isoWeekday",11),_("d",v),_("e",v),_("E",v),_("dd",function(e,t){return t.weekdaysMinRegex(e)}),_("ddd",function(e,t){return t.weekdaysShortRegex(e)}),_("dddd",function(e,t){return t.weekdaysRegex(e)}),Ze(["dd","ddd","dddd"],function(e,t,n,a){var r=n._locale.weekdaysParse(e,a,n._strict);if(r!=null)t.d=r;else f(n).invalidWeekday=e}),Ze(["d","e","E"],function(e,t,n,a){t[a]=y(e)});var At="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Ht="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Ft="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),zt=qe,Wt=qe,Vt=qe;function Bt(e,t){var n=i(this._weekdays)?this._weekdays:this._weekdays[e&&e!==true&&this._weekdays.isFormat.test(t)?"format":"standalone"];return e===true?Rt(n,this._week.dow):e?n[e.day()]:n}function Ut(e){return e===true?Rt(this._weekdaysShort,this._week.dow):e?this._weekdaysShort[e.day()]:this._weekdaysShort}function Kt(e){return e===true?Rt(this._weekdaysMin,this._week.dow):e?this._weekdaysMin[e.day()]:this._weekdaysMin}function Gt(e,t,n){var a,r,o,i=e.toLocaleLowerCase();if(!this._weekdaysParse){this._weekdaysParse=[];this._shortWeekdaysParse=[];this._minWeekdaysParse=[];for(a=0;a<7;++a){o=d([2e3,1]).day(a);this._minWeekdaysParse[a]=this.weekdaysMin(o,"").toLocaleLowerCase();this._shortWeekdaysParse[a]=this.weekdaysShort(o,"").toLocaleLowerCase();this._weekdaysParse[a]=this.weekdays(o,"").toLocaleLowerCase()}}if(n)if(t==="dddd"){r=L.call(this._weekdaysParse,i);return r!==-1?r:null}else if(t==="ddd"){r=L.call(this._shortWeekdaysParse,i);return r!==-1?r:null}else{r=L.call(this._minWeekdaysParse,i);return r!==-1?r:null}else if(t==="dddd"){r=L.call(this._weekdaysParse,i);if(r!==-1)return r;r=L.call(this._shortWeekdaysParse,i);if(r!==-1)return r;r=L.call(this._minWeekdaysParse,i);return r!==-1?r:null}else if(t==="ddd"){r=L.call(this._shortWeekdaysParse,i);if(r!==-1)return r;r=L.call(this._weekdaysParse,i);if(r!==-1)return r;r=L.call(this._minWeekdaysParse,i);return r!==-1?r:null}else{r=L.call(this._minWeekdaysParse,i);if(r!==-1)return r;r=L.call(this._weekdaysParse,i);if(r!==-1)return r;r=L.call(this._shortWeekdaysParse,i);return r!==-1?r:null}}function qt(e,t,n){var a,r,o;if(this._weekdaysParseExact)return Gt.call(this,e,t,n);if(!this._weekdaysParse){this._weekdaysParse=[];this._minWeekdaysParse=[];this._shortWeekdaysParse=[];this._fullWeekdaysParse=[]}for(a=0;a<7;a++){r=d([2e3,1]).day(a);if(n&&!this._fullWeekdaysParse[a]){this._fullWeekdaysParse[a]=new RegExp("^"+this.weekdays(r,"").replace(".","\\.?")+"$","i");this._shortWeekdaysParse[a]=new RegExp("^"+this.weekdaysShort(r,"").replace(".","\\.?")+"$","i");this._minWeekdaysParse[a]=new RegExp("^"+this.weekdaysMin(r,"").replace(".","\\.?")+"$","i")}if(!this._weekdaysParse[a]){o="^"+this.weekdays(r,"")+"|^"+this.weekdaysShort(r,"")+"|^"+this.weekdaysMin(r,"");this._weekdaysParse[a]=new RegExp(o.replace(".",""),"i")}if(n&&t==="dddd"&&this._fullWeekdaysParse[a].test(e))return a;else if(n&&t==="ddd"&&this._shortWeekdaysParse[a].test(e))return a;else if(n&&t==="dd"&&this._minWeekdaysParse[a].test(e))return a;else if(!n&&this._weekdaysParse[a].test(e))return a}}function $t(e){if(!this.isValid())return e!=null?this:NaN;var t=this._isUTC?this._d.getUTCDay():this._d.getDay();if(e!=null){e=Yt(e,this.localeData());return this.add(e-t,"d")}else return t}function Jt(e){if(!this.isValid())return e!=null?this:NaN;var t=(this.day()+7-this.localeData()._week.dow)%7;return e==null?t:this.add(e-t,"d")}function Xt(e){if(!this.isValid())return e!=null?this:NaN;if(e!=null){var t=It(e,this.localeData());return this.day(this.day()%7?t:t-7)}else return this.day()||7}function Qt(e){if(this._weekdaysParseExact){if(!s(this,"_weekdaysRegex"))tn.call(this);if(e)return this._weekdaysStrictRegex;else return this._weekdaysRegex}else{if(!s(this,"_weekdaysRegex"))this._weekdaysRegex=zt;return this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex}}function Zt(e){if(this._weekdaysParseExact){if(!s(this,"_weekdaysRegex"))tn.call(this);if(e)return this._weekdaysShortStrictRegex;else return this._weekdaysShortRegex}else{if(!s(this,"_weekdaysShortRegex"))this._weekdaysShortRegex=Wt;return this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex}}function en(e){if(this._weekdaysParseExact){if(!s(this,"_weekdaysRegex"))tn.call(this);if(e)return this._weekdaysMinStrictRegex;else return this._weekdaysMinRegex}else{if(!s(this,"_weekdaysMinRegex"))this._weekdaysMinRegex=Vt;return this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex}}function tn(){function e(e,t){return t.length-e.length}var t=[],n=[],a=[],r=[],o,i,l,s,u;for(o=0;o<7;o++){i=d([2e3,1]).day(o);l=b(this.weekdaysMin(i,""));s=b(this.weekdaysShort(i,""));u=b(this.weekdays(i,""));t.push(l);n.push(s);a.push(u);r.push(l);r.push(s);r.push(u)}t.sort(e);n.sort(e);a.sort(e);r.sort(e);this._weekdaysRegex=new RegExp("^("+r.join("|")+")","i");this._weekdaysShortRegex=this._weekdaysRegex;this._weekdaysMinRegex=this._weekdaysRegex;this._weekdaysStrictRegex=new RegExp("^("+a.join("|")+")","i");this._weekdaysShortStrictRegex=new RegExp("^("+n.join("|")+")","i");this._weekdaysMinStrictRegex=new RegExp("^("+t.join("|")+")","i")}function nn(){return this.hours()%12||12}function an(){return this.hours()||24}function rn(e,t){a(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function on(e,t){return t._meridiemParse}function ln(e){return(e+"").toLowerCase().charAt(0)==="p"}a("H",["HH",2],0,"hour"),a("h",["hh",2],0,nn),a("k",["kk",2],0,an),a("hmm",0,0,function(){return""+nn.apply(this)+o(this.minutes(),2)}),a("hmmss",0,0,function(){return""+nn.apply(this)+o(this.minutes(),2)+o(this.seconds(),2)}),a("Hmm",0,0,function(){return""+this.hours()+o(this.minutes(),2)}),a("Hmmss",0,0,function(){return""+this.hours()+o(this.minutes(),2)+o(this.seconds(),2)}),rn("a",true),rn("A",false),t("hour","h"),n("hour",13),_("a",on),_("A",on),_("H",v),_("h",v),_("k",v),_("HH",v,r),_("hh",v,r),_("kk",v,r),_("hmm",Ae),_("hmmss",He),_("Hmm",Ae),_("Hmmss",He),w(["H","HH"],E),w(["k","kk"],function(e,t,n){var a=y(e);t[E]=a===24?0:a}),w(["a","A"],function(e,t,n){n._isPm=n._locale.isPM(e);n._meridiem=e}),w(["h","hh"],function(e,t,n){t[E]=y(e);f(n).bigHour=true}),w("hmm",function(e,t,n){var a=e.length-2;t[E]=y(e.substr(0,a));t[x]=y(e.substr(a));f(n).bigHour=true}),w("hmmss",function(e,t,n){var a=e.length-4,r=e.length-2;t[E]=y(e.substr(0,a));t[x]=y(e.substr(a,2));t[C]=y(e.substr(r));f(n).bigHour=true}),w("Hmm",function(e,t,n){var a=e.length-2;t[E]=y(e.substr(0,a));t[x]=y(e.substr(a))}),w("Hmmss",function(e,t,n){var a=e.length-4,r=e.length-2;t[E]=y(e.substr(0,a));t[x]=y(e.substr(a,2));t[C]=y(e.substr(r))});var sn,un=Te("Hours",true);function dn(e,t,n){if(e>11)return n?"pm":"PM";else return n?"am":"AM"}var cn={calendar:re,longDateFormat:he,invalidDate:ge,ordinal:ve,dayOfMonthOrdinalParse:_e,relativeTime:we,months:it,monthsShort:lt,week:Dt,weekdays:At,weekdaysMin:Ft,weekdaysShort:Ht,meridiemParse:/[ap]\.?m?\.?/i},D={},fn={},pn;function hn(e,t){var n,a=Math.min(e.length,t.length);for(n=0;n<a;n+=1)if(e[n]!==t[n])return n;return a}function mn(e){return e?e.toLowerCase().replace("_","-"):e}function gn(e){var t=0,n,a,r,o;while(t<e.length){o=mn(e[t]).split("-");n=o.length;a=mn(e[t+1]);a=a?a.split("-"):null;while(n>0){r=vn(o.slice(0,n).join("-"));if(r)return r;if(a&&a.length>=n&&hn(o,a)>=n-1)break;n--}t++}return pn}function yn(e){return e.match("^[^/\\\\]*$")!=null}function vn(t){var e=null,n;if(D[t]===undefined&&typeof di!=="undefined"&&di&&di.exports&&yn(t))try{e=pn._abbr;n=ci;fi(517)("./"+t);_n(e)}catch(e){D[t]=null}return D[t]}function _n(e,t){var n;if(e){if(l(t))n=Mn(e);else n=bn(e,t);if(n)pn=n;else if(typeof console!=="undefined"&&console.warn)console.warn("Locale "+e+" not found. Did you forget to load it?")}return pn._abbr}function bn(e,t){if(t!==null){var n,a=cn;t.abbr=e;if(D[e]!=null){ee("defineLocaleOverride","use moment.updateLocale(localeName, config) to change "+"an existing locale. moment.defineLocale(localeName, "+"config) should only be used for creating a new locale "+"See http://momentjs.com/guides/#/warnings/define-locale/ for more info.");a=D[e]._config}else if(t.parentLocale!=null)if(D[t.parentLocale]!=null)a=D[t.parentLocale]._config;else{n=vn(t.parentLocale);if(n!=null)a=n._config;else{if(!fn[t.parentLocale])fn[t.parentLocale]=[];fn[t.parentLocale].push({name:e,config:t});return null}}D[e]=new ae(ne(a,t));if(fn[e])fn[e].forEach(function(e){bn(e.name,e.config)});_n(e);return D[e]}else{delete D[e];return null}}function wn(e,t){if(t!=null){var n,a,r=cn;if(D[e]!=null&&D[e].parentLocale!=null)D[e].set(ne(D[e]._config,t));else{a=vn(e);if(a!=null)r=a._config;t=ne(r,t);if(a==null)t.abbr=e;n=new ae(t);n.parentLocale=D[e];D[e]=n}_n(e)}else if(D[e]!=null)if(D[e].parentLocale!=null){D[e]=D[e].parentLocale;if(e===_n())_n(e)}else if(D[e]!=null)delete D[e];return D[e]}function Mn(e){var t;if(e&&e._locale&&e._locale._abbr)e=e._locale._abbr;if(!e)return pn;if(!i(e)){t=vn(e);if(t)return t;e=[e]}return gn(e)}function kn(){return Z(D)}function Sn(e){var t,n=e._a;if(n&&f(e).overflow===-2){t=n[k]<0||n[k]>11?k:n[S]<1||n[S]>ot(n[M],n[k])?S:n[E]<0||n[E]>24||n[E]===24&&(n[x]!==0||n[C]!==0||n[tt]!==0)?E:n[x]<0||n[x]>59?x:n[C]<0||n[C]>59?C:n[tt]<0||n[tt]>999?tt:-1;if(f(e)._overflowDayOfYear&&(t<M||t>S))t=S;if(f(e)._overflowWeeks&&t===-1)t=nt;if(f(e)._overflowWeekday&&t===-1)t=at;f(e).overflow=t}return e}var En=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,xn=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Cn=/Z|[+-]\d\d(?::?\d\d)?/,Ln=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,false],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,false],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,false],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,false],["YYYY",/\d{4}/,false]],Tn=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Dn=/^\/?Date\((-?\d+)/i,On=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,Nn={UT:0,GMT:0,EDT:-4*60,EST:-5*60,CDT:-5*60,CST:-6*60,MDT:-6*60,MST:-7*60,PDT:-7*60,PST:-8*60};function Pn(e){var t,n,a=e._i,r=En.exec(a)||xn.exec(a),o,i,l,s,u=Ln.length,d=Tn.length;if(r){f(e).iso=true;for(t=0,n=u;t<n;t++)if(Ln[t][1].exec(r[1])){i=Ln[t][0];o=Ln[t][2]!==false;break}if(i==null){e._isValid=false;return}if(r[3]){for(t=0,n=d;t<n;t++)if(Tn[t][1].exec(r[3])){l=(r[2]||" ")+Tn[t][0];break}if(l==null){e._isValid=false;return}}if(!o&&l!=null){e._isValid=false;return}if(r[4])if(Cn.exec(r[4]))s="Z";else{e._isValid=false;return}e._f=i+(l||"")+(s||"");Un(e)}else e._isValid=false}function jn(e,t,n,a,r,o){var i=[Yn(e),lt.indexOf(t),parseInt(n,10),parseInt(a,10),parseInt(r,10)];if(o)i.push(parseInt(o,10));return i}function Yn(e){var t=parseInt(e,10);if(t<=49)return 2e3+t;else if(t<=999)return 1900+t;return t}function In(e){return e.replace(/\([^()]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").replace(/^\s\s*/,"").replace(/\s\s*$/,"")}function Rn(e,t,n){if(e){var a=Ht.indexOf(e),r=new Date(t[0],t[1],t[2]).getDay();if(a!==r){f(n).weekdayMismatch=true;n._isValid=false;return false}}return true}function An(e,t,n){if(e)return Nn[e];else if(t)return 0;else{var a=parseInt(n,10),r=a%100,o=(a-r)/100;return o*60+r}}function Hn(e){var t=On.exec(In(e._i)),n;if(t){n=jn(t[4],t[3],t[2],t[5],t[6],t[7]);if(!Rn(t[1],n,e))return;e._a=n;e._tzm=An(t[8],t[9],t[10]);e._d=Et.apply(null,e._a);e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm);f(e).rfc2822=true}else e._isValid=false}function Fn(e){var t=Dn.exec(e._i);if(t!==null){e._d=new Date(+t[1]);return}Pn(e);if(e._isValid===false)delete e._isValid;else return;Hn(e);if(e._isValid===false)delete e._isValid;else return;if(e._strict)e._isValid=false;else c.createFromInputFallback(e)}function zn(e,t,n){if(e!=null)return e;if(t!=null)return t;return n}function Wn(e){var t=new Date(c.now());if(e._useUTC)return[t.getUTCFullYear(),t.getUTCMonth(),t.getUTCDate()];return[t.getFullYear(),t.getMonth(),t.getDate()]}function Vn(e){var t,n,a=[],r,o,i;if(e._d)return;r=Wn(e);if(e._w&&e._a[S]==null&&e._a[k]==null)Bn(e);if(e._dayOfYear!=null){i=zn(e._a[M],r[M]);if(e._dayOfYear>wt(i)||e._dayOfYear===0)f(e)._overflowDayOfYear=true;n=Et(i,0,e._dayOfYear);e._a[k]=n.getUTCMonth();e._a[S]=n.getUTCDate()}for(t=0;t<3&&e._a[t]==null;++t)e._a[t]=a[t]=r[t];for(;t<7;t++)e._a[t]=a[t]=e._a[t]==null?t===2?1:0:e._a[t];if(e._a[E]===24&&e._a[x]===0&&e._a[C]===0&&e._a[tt]===0){e._nextDay=true;e._a[E]=0}e._d=(e._useUTC?Et:St).apply(null,a);o=e._useUTC?e._d.getUTCDay():e._d.getDay();if(e._tzm!=null)e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm);if(e._nextDay)e._a[E]=24;if(e._w&&typeof e._w.d!=="undefined"&&e._w.d!==o)f(e).weekdayMismatch=true}function Bn(e){var t,n,a,r,o,i,l,s,u;t=e._w;if(t.GG!=null||t.W!=null||t.E!=null){o=1;i=4;n=zn(t.GG,e._a[M],Lt(O(),1,4).year);a=zn(t.W,1);r=zn(t.E,1);if(r<1||r>7)s=true}else{o=e._locale._week.dow;i=e._locale._week.doy;u=Lt(O(),o,i);n=zn(t.gg,e._a[M],u.year);a=zn(t.w,u.week);if(t.d!=null){r=t.d;if(r<0||r>6)s=true}else if(t.e!=null){r=t.e+o;if(t.e<0||t.e>6)s=true}else r=o}if(a<1||a>T(n,o,i))f(e)._overflowWeeks=true;else if(s!=null)f(e)._overflowWeekday=true;else{l=Ct(n,a,r,o,i);e._a[M]=l.year;e._dayOfYear=l.dayOfYear}}function Un(e){if(e._f===c.ISO_8601){Pn(e);return}if(e._f===c.RFC_2822){Hn(e);return}e._a=[];f(e).empty=true;var t=""+e._i,n,a,r,o,i,l=t.length,s=0,u,d;r=pe(e._f,e._locale).match(ie)||[];d=r.length;for(n=0;n<d;n++){o=r[n];a=(t.match(Je(o,e))||[])[0];if(a){i=t.substr(0,t.indexOf(a));if(i.length>0)f(e).unusedInput.push(i);t=t.slice(t.indexOf(a)+a.length);s+=a.length}if(ue[o]){if(a)f(e).empty=false;else f(e).unusedTokens.push(o);et(o,a,e)}else if(e._strict&&!a)f(e).unusedTokens.push(o)}f(e).charsLeftOver=l-s;if(t.length>0)f(e).unusedInput.push(t);if(e._a[E]<=12&&f(e).bigHour===true&&e._a[E]>0)f(e).bigHour=undefined;f(e).parsedDateParts=e._a.slice(0);f(e).meridiem=e._meridiem;e._a[E]=Kn(e._locale,e._a[E],e._meridiem);u=f(e).era;if(u!==null)e._a[M]=e._locale.erasConvertYear(u,e._a[M]);Vn(e);Sn(e)}function Kn(e,t,n){var a;if(n==null)return t;if(e.meridiemHour!=null)return e.meridiemHour(t,n);else if(e.isPM!=null){a=e.isPM(n);if(a&&t<12)t+=12;if(!a&&t===12)t=0;return t}else return t}function Gn(e){var t,n,a,r,o,i,l=false,s=e._f.length;if(s===0){f(e).invalidFormat=true;e._d=new Date(NaN);return}for(r=0;r<s;r++){o=0;i=false;t=$({},e);if(e._useUTC!=null)t._useUTC=e._useUTC;t._f=e._f[r];Un(t);if(U(t))i=true;o+=f(t).charsLeftOver;o+=f(t).unusedTokens.length*10;f(t).score=o;if(!l){if(a==null||o<a||i){a=o;n=t;if(i)l=true}}else if(o<a){a=o;n=t}}V(e,n||t)}function qn(e){if(e._d)return;var t=Ee(e._i),n=t.day===undefined?t.date:t.day;e._a=W([t.year,t.month,n,t.hour,t.minute,t.second,t.millisecond],function(e){return e&&parseInt(e,10)});Vn(e)}function $n(e){var t=new J(Sn(Jn(e)));if(t._nextDay){t.add(1,"d");t._nextDay=undefined}return t}function Jn(e){var t=e._i,n=e._f;e._locale=e._locale||Mn(e._l);if(t===null||n===undefined&&t==="")return K({nullInput:true});if(typeof t==="string")e._i=t=e._locale.preparse(t);if(p(t))return new J(Sn(t));else if(z(t))e._d=t;else if(i(n))Gn(e);else if(n)Un(e);else Xn(e);if(!U(e))e._d=null;return e}function Xn(e){var t=e._i;if(l(t))e._d=new Date(c.now());else if(z(t))e._d=new Date(t.valueOf());else if(typeof t==="string")Fn(e);else if(i(t)){e._a=W(t.slice(0),function(e){return parseInt(e,10)});Vn(e)}else if(H(t))qn(e);else if(u(t))e._d=new Date(t);else c.createFromInputFallback(e)}function Qn(e,t,n,a,r){var o={};if(t===true||t===false){a=t;t=undefined}if(n===true||n===false){a=n;n=undefined}if(H(e)&&F(e)||i(e)&&e.length===0)e=undefined;o._isAMomentObject=true;o._useUTC=o._isUTC=r;o._l=n;o._i=e;o._f=t;o._strict=a;return $n(o)}function O(e,t,n,a){return Qn(e,t,n,a,false)}c.createFromInputFallback=e("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), "+"which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are "+"discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(e){e._d=new Date(e._i+(e._useUTC?" UTC":""))}),c.ISO_8601=function(){},c.RFC_2822=function(){};var Zn=e("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var e=O.apply(null,arguments);if(this.isValid()&&e.isValid())return e<this?this:e;else return K()}),ea=e("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var e=O.apply(null,arguments);if(this.isValid()&&e.isValid())return e>this?this:e;else return K()});function ta(e,t){var n,a;if(t.length===1&&i(t[0]))t=t[0];if(!t.length)return O();n=t[0];for(a=1;a<t.length;++a)if(!t[a].isValid()||t[a][e](n))n=t[a];return n}function na(){var e=[].slice.call(arguments,0);return ta("isBefore",e)}function aa(){var e=[].slice.call(arguments,0);return ta("isAfter",e)}var ra=function(){return Date.now?Date.now():+new Date},oa=["year","quarter","month","week","day","hour","minute","second","millisecond"];function ia(e){var t,n=false,a,r=oa.length;for(t in e)if(s(e,t)&&!(L.call(oa,t)!==-1&&(e[t]==null||!isNaN(e[t]))))return false;for(a=0;a<r;++a)if(e[oa[a]]){if(n)return false;if(parseFloat(e[oa[a]])!==y(e[oa[a]]))n=true}return true}function la(){return this._isValid}function sa(){return N(NaN)}function ua(e){var t=Ee(e),n=t.year||0,a=t.quarter||0,r=t.month||0,o=t.week||t.isoWeek||0,i=t.day||0,l=t.hour||0,s=t.minute||0,u=t.second||0,d=t.millisecond||0;this._isValid=ia(t);this._milliseconds=+d+u*1e3+s*6e4+l*1e3*60*60;this._days=+i+o*7;this._months=+r+a*3+n*12;this._data={};this._locale=Mn();this._bubble()}function da(e){return e instanceof ua}function ca(e){if(e<0)return Math.round(-1*e)*-1;else return Math.round(e)}function fa(e,t,n){var a=Math.min(e.length,t.length),r=Math.abs(e.length-t.length),o=0,i;for(i=0;i<a;i++)if(n&&e[i]!==t[i]||!n&&y(e[i])!==y(t[i]))o++;return o+r}function pa(e,n){a(e,0,0,function(){var e=this.utcOffset(),t="+";if(e<0){e=-e;t="-"}return t+o(~~(e/60),2)+n+o(~~e%60,2)})}pa("Z",":"),pa("ZZ",""),_("Z",Ke),_("ZZ",Ke),w(["Z","ZZ"],function(e,t,n){n._useUTC=true;n._tzm=ma(Ke,e)});var ha=/([\+\-]|\d\d)/gi;function ma(e,t){var n=(t||"").match(e),a,r,o;if(n===null)return null;a=n[n.length-1]||[];r=(a+"").match(ha)||["-",0,0];o=+(r[1]*60)+y(r[2]);return o===0?0:r[0]==="+"?o:-o}function ga(e,t){var n,a;if(t._isUTC){n=t.clone();a=(p(e)||z(e)?e.valueOf():O(e).valueOf())-n.valueOf();n._d.setTime(n._d.valueOf()+a);c.updateOffset(n,false);return n}else return O(e).local()}function ya(e){return-Math.round(e._d.getTimezoneOffset())}function va(e,t,n){var a=this._offset||0,r;if(!this.isValid())return e!=null?this:NaN;if(e!=null){if(typeof e==="string"){e=ma(Ke,e);if(e===null)return this}else if(Math.abs(e)<16&&!n)e=e*60;if(!this._isUTC&&t)r=ya(this);this._offset=e;this._isUTC=true;if(r!=null)this.add(r,"m");if(a!==e)if(!t||this._changeInProgress)Ya(this,N(e-a,"m"),1,false);else if(!this._changeInProgress){this._changeInProgress=true;c.updateOffset(this,true);this._changeInProgress=null}return this}else return this._isUTC?a:ya(this)}function _a(e,t){if(e!=null){if(typeof e!=="string")e=-e;this.utcOffset(e,t);return this}else return-this.utcOffset()}function ba(e){return this.utcOffset(0,e)}function wa(e){if(this._isUTC){this.utcOffset(0,e);this._isUTC=false;if(e)this.subtract(ya(this),"m")}return this}function Ma(){if(this._tzm!=null)this.utcOffset(this._tzm,false,true);else if(typeof this._i==="string"){var e=ma(Ue,this._i);if(e!=null)this.utcOffset(e);else this.utcOffset(0,true)}return this}function ka(e){if(!this.isValid())return false;e=e?O(e).utcOffset():0;return(this.utcOffset()-e)%60===0}function Sa(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Ea(){if(!l(this._isDSTShifted))return this._isDSTShifted;var e={},t;$(e,this);e=Jn(e);if(e._a){t=e._isUTC?d(e._a):O(e._a);this._isDSTShifted=this.isValid()&&fa(e._a,t.toArray())>0}else this._isDSTShifted=false;return this._isDSTShifted}function xa(){return this.isValid()?!this._isUTC:false}function Ca(){return this.isValid()?this._isUTC:false}function La(){return this.isValid()?this._isUTC&&this._offset===0:false}c.updateOffset=function(){};var Ta=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,Da=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function N(e,t){var n=e,a=null,r,o,i;if(da(e))n={ms:e._milliseconds,d:e._days,M:e._months};else if(u(e)||!isNaN(+e)){n={};if(t)n[t]=+e;else n.milliseconds=+e}else if(a=Ta.exec(e)){r=a[1]==="-"?-1:1;n={y:0,d:y(a[S])*r,h:y(a[E])*r,m:y(a[x])*r,s:y(a[C])*r,ms:y(ca(a[tt]*1e3))*r}}else if(a=Da.exec(e)){r=a[1]==="-"?-1:1;n={y:Oa(a[2],r),M:Oa(a[3],r),w:Oa(a[4],r),d:Oa(a[5],r),h:Oa(a[6],r),m:Oa(a[7],r),s:Oa(a[8],r)}}else if(n==null)n={};else if(typeof n==="object"&&("from"in n||"to"in n)){i=Pa(O(n.from),O(n.to));n={};n.ms=i.milliseconds;n.M=i.months}o=new ua(n);if(da(e)&&s(e,"_locale"))o._locale=e._locale;if(da(e)&&s(e,"_isValid"))o._isValid=e._isValid;return o}function Oa(e,t){var n=e&&parseFloat(e.replace(",","."));return(isNaN(n)?0:n)*t}function Na(e,t){var n={};n.months=t.month()-e.month()+(t.year()-e.year())*12;if(e.clone().add(n.months,"M").isAfter(t))--n.months;n.milliseconds=+t-+e.clone().add(n.months,"M");return n}function Pa(e,t){var n;if(!(e.isValid()&&t.isValid()))return{milliseconds:0,months:0};t=ga(t,e);if(e.isBefore(t))n=Na(e,t);else{n=Na(t,e);n.milliseconds=-n.milliseconds;n.months=-n.months}return n}function ja(r,o){return function(e,t){var n,a;if(t!==null&&!isNaN(+t)){ee(o,"moment()."+o+"(period, number) is deprecated. Please use moment()."+o+"(number, period). "+"See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.");a=e;e=t;t=a}n=N(e,t);Ya(this,n,r);return this}}function Ya(e,t,n,a){var r=t._milliseconds,o=ca(t._days),i=ca(t._months);if(!e.isValid())return;a=a==null?true:a;if(i)mt(e,De(e,"Month")+i*n);if(o)Oe(e,"Date",De(e,"Date")+o*n);if(r)e._d.setTime(e._d.valueOf()+r*n);if(a)c.updateOffset(e,o||i)}N.fn=ua.prototype,N.invalid=sa;var Ia=ja(1,"add"),Ra=ja(-1,"subtract");function Aa(e){return typeof e==="string"||e instanceof String}function Ha(e){return p(e)||z(e)||Aa(e)||u(e)||za(e)||Fa(e)||e===null||e===undefined}function Fa(e){var t=H(e)&&!F(e),n=false,a=["years","year","y","months","month","M","days","day","d","dates","date","D","hours","hour","h","minutes","minute","m","seconds","second","s","milliseconds","millisecond","ms"],r,o,i=a.length;for(r=0;r<i;r+=1){o=a[r];n=n||s(e,o)}return t&&n}function za(t){var e=i(t),n=false;if(e)n=t.filter(function(e){return!u(e)&&Aa(t)}).length===0;return e&&n}function Wa(e){var t=H(e)&&!F(e),n=false,a=["sameDay","nextDay","lastDay","nextWeek","lastWeek","sameElse"],r,o;for(r=0;r<a.length;r+=1){o=a[r];n=n||s(e,o)}return t&&n}function Va(e,t){var n=e.diff(t,"days",true);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"}function Ba(e,t){if(arguments.length===1)if(!arguments[0]){e=undefined;t=undefined}else if(Ha(arguments[0])){e=arguments[0];t=undefined}else if(Wa(arguments[0])){t=arguments[0];e=undefined}var n=e||O(),a=ga(n,this).startOf("day"),r=c.calendarFormat(this,a)||"sameElse",o=t&&(h(t[r])?t[r].call(this,n):t[r]);return this.format(o||this.localeData().calendar(r,this,O(n)))}function Ua(){return new J(this)}function Ka(e,t){var n=p(e)?e:O(e);if(!(this.isValid()&&n.isValid()))return false;t=m(t)||"millisecond";if(t==="millisecond")return this.valueOf()>n.valueOf();else return n.valueOf()<this.clone().startOf(t).valueOf()}function Ga(e,t){var n=p(e)?e:O(e);if(!(this.isValid()&&n.isValid()))return false;t=m(t)||"millisecond";if(t==="millisecond")return this.valueOf()<n.valueOf();else return this.clone().endOf(t).valueOf()<n.valueOf()}function qa(e,t,n,a){var r=p(e)?e:O(e),o=p(t)?t:O(t);if(!(this.isValid()&&r.isValid()&&o.isValid()))return false;a=a||"()";return(a[0]==="("?this.isAfter(r,n):!this.isBefore(r,n))&&(a[1]===")"?this.isBefore(o,n):!this.isAfter(o,n))}function $a(e,t){var n=p(e)?e:O(e),a;if(!(this.isValid()&&n.isValid()))return false;t=m(t)||"millisecond";if(t==="millisecond")return this.valueOf()===n.valueOf();else{a=n.valueOf();return this.clone().startOf(t).valueOf()<=a&&a<=this.clone().endOf(t).valueOf()}}function Ja(e,t){return this.isSame(e,t)||this.isAfter(e,t)}function Xa(e,t){return this.isSame(e,t)||this.isBefore(e,t)}function Qa(e,t,n){var a,r,o;if(!this.isValid())return NaN;a=ga(e,this);if(!a.isValid())return NaN;r=(a.utcOffset()-this.utcOffset())*6e4;t=m(t);switch(t){case"year":o=Za(this,a)/12;break;case"month":o=Za(this,a);break;case"quarter":o=Za(this,a)/3;break;case"second":o=(this-a)/1e3;break;case"minute":o=(this-a)/6e4;break;case"hour":o=(this-a)/36e5;break;case"day":o=(this-a-r)/864e5;break;case"week":o=(this-a-r)/6048e5;break;default:o=this-a}return n?o:g(o)}function Za(e,t){if(e.date()<t.date())return-Za(t,e);var n=(t.year()-e.year())*12+(t.month()-e.month()),a=e.clone().add(n,"months"),r,o;if(t-a<0){r=e.clone().add(n-1,"months");o=(t-a)/(a-r)}else{r=e.clone().add(n+1,"months");o=(t-a)/(r-a)}return-(n+o)||0}function er(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")}function tr(e){if(!this.isValid())return null;var t=e!==true,n=t?this.clone().utc():this;if(n.year()<0||n.year()>9999)return fe(n,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ");if(h(Date.prototype.toISOString))if(t)return this.toDate().toISOString();else return new Date(this.valueOf()+this.utcOffset()*60*1e3).toISOString().replace("Z",fe(n,"Z"));return fe(n,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function nr(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var e="moment",t="",n,a,r,o;if(!this.isLocal()){e=this.utcOffset()===0?"moment.utc":"moment.parseZone";t="Z"}n="["+e+'("]';a=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY";r="-MM-DD[T]HH:mm:ss.SSS";o=t+'[")]';return this.format(n+a+r+o)}function ar(e){if(!e)e=this.isUtc()?c.defaultFormatUtc:c.defaultFormat;var t=fe(this,e);return this.localeData().postformat(t)}function rr(e,t){if(this.isValid()&&(p(e)&&e.isValid()||O(e).isValid()))return N({to:this,from:e}).locale(this.locale()).humanize(!t);else return this.localeData().invalidDate()}function or(e){return this.from(O(),e)}function ir(e,t){if(this.isValid()&&(p(e)&&e.isValid()||O(e).isValid()))return N({from:this,to:e}).locale(this.locale()).humanize(!t);else return this.localeData().invalidDate()}function lr(e){return this.to(O(),e)}function sr(e){var t;if(e===undefined)return this._locale._abbr;else{t=Mn(e);if(t!=null)this._locale=t;return this}}c.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",c.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var ur=e("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(e){if(e===undefined)return this.localeData();else return this.locale(e)});function dr(){return this._locale}var cr=1e3,fr=60*cr,pr=60*fr,hr=(365*400+97)*24*pr;function mr(e,t){return(e%t+t)%t}function gr(e,t,n){if(e<100&&e>=0)return new Date(e+400,t,n)-hr;else return new Date(e,t,n).valueOf()}function yr(e,t,n){if(e<100&&e>=0)return Date.UTC(e+400,t,n)-hr;else return Date.UTC(e,t,n)}function vr(e){var t,n;e=m(e);if(e===undefined||e==="millisecond"||!this.isValid())return this;n=this._isUTC?yr:gr;switch(e){case"year":t=n(this.year(),0,1);break;case"quarter":t=n(this.year(),this.month()-this.month()%3,1);break;case"month":t=n(this.year(),this.month(),1);break;case"week":t=n(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":t=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":t=n(this.year(),this.month(),this.date());break;case"hour":t=this._d.valueOf();t-=mr(t+(this._isUTC?0:this.utcOffset()*fr),pr);break;case"minute":t=this._d.valueOf();t-=mr(t,fr);break;case"second":t=this._d.valueOf();t-=mr(t,cr);break}this._d.setTime(t);c.updateOffset(this,true);return this}function _r(e){var t,n;e=m(e);if(e===undefined||e==="millisecond"||!this.isValid())return this;n=this._isUTC?yr:gr;switch(e){case"year":t=n(this.year()+1,0,1)-1;break;case"quarter":t=n(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":t=n(this.year(),this.month()+1,1)-1;break;case"week":t=n(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":t=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":t=n(this.year(),this.month(),this.date()+1)-1;break;case"hour":t=this._d.valueOf();t+=pr-mr(t+(this._isUTC?0:this.utcOffset()*fr),pr)-1;break;case"minute":t=this._d.valueOf();t+=fr-mr(t,fr)-1;break;case"second":t=this._d.valueOf();t+=cr-mr(t,cr)-1;break}this._d.setTime(t);c.updateOffset(this,true);return this}function br(){return this._d.valueOf()-(this._offset||0)*6e4}function wr(){return Math.floor(this.valueOf()/1e3)}function Mr(){return new Date(this.valueOf())}function kr(){var e=this;return[e.year(),e.month(),e.date(),e.hour(),e.minute(),e.second(),e.millisecond()]}function Sr(){var e=this;return{years:e.year(),months:e.month(),date:e.date(),hours:e.hours(),minutes:e.minutes(),seconds:e.seconds(),milliseconds:e.milliseconds()}}function Er(){return this.isValid()?this.toISOString():null}function xr(){return U(this)}function Cr(){return V({},f(this))}function Lr(){return f(this).overflow}function Tr(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function Dr(e,t){var n,a,r,o=this._eras||Mn("en")._eras;for(n=0,a=o.length;n<a;++n){switch(typeof o[n].since){case"string":r=c(o[n].since).startOf("day");o[n].since=r.valueOf();break}switch(typeof o[n].until){case"undefined":o[n].until=+Infinity;break;case"string":r=c(o[n].until).startOf("day").valueOf();o[n].until=r.valueOf();break}}return o}function Or(e,t,n){var a,r,o=this.eras(),i,l,s;e=e.toUpperCase();for(a=0,r=o.length;a<r;++a){i=o[a].name.toUpperCase();l=o[a].abbr.toUpperCase();s=o[a].narrow.toUpperCase();if(n)switch(t){case"N":case"NN":case"NNN":if(l===e)return o[a];break;case"NNNN":if(i===e)return o[a];break;case"NNNNN":if(s===e)return o[a];break}else if([i,l,s].indexOf(e)>=0)return o[a]}}function Nr(e,t){var n=e.since<=e.until?+1:-1;if(t===undefined)return c(e.since).year();else return c(e.since).year()+(t-e.offset)*n}function Pr(){var e,t,n,a=this.localeData().eras();for(e=0,t=a.length;e<t;++e){n=this.clone().startOf("day").valueOf();if(a[e].since<=n&&n<=a[e].until)return a[e].name;if(a[e].until<=n&&n<=a[e].since)return a[e].name}return""}function jr(){var e,t,n,a=this.localeData().eras();for(e=0,t=a.length;e<t;++e){n=this.clone().startOf("day").valueOf();if(a[e].since<=n&&n<=a[e].until)return a[e].narrow;if(a[e].until<=n&&n<=a[e].since)return a[e].narrow}return""}function Yr(){var e,t,n,a=this.localeData().eras();for(e=0,t=a.length;e<t;++e){n=this.clone().startOf("day").valueOf();if(a[e].since<=n&&n<=a[e].until)return a[e].abbr;if(a[e].until<=n&&n<=a[e].since)return a[e].abbr}return""}function Ir(){var e,t,n,a,r=this.localeData().eras();for(e=0,t=r.length;e<t;++e){n=r[e].since<=r[e].until?+1:-1;a=this.clone().startOf("day").valueOf();if(r[e].since<=a&&a<=r[e].until||r[e].until<=a&&a<=r[e].since)return(this.year()-c(r[e].since).year())*n+r[e].offset}return this.year()}function Rr(e){if(!s(this,"_erasNameRegex"))Br.call(this);return e?this._erasNameRegex:this._erasRegex}function Ar(e){if(!s(this,"_erasAbbrRegex"))Br.call(this);return e?this._erasAbbrRegex:this._erasRegex}function Hr(e){if(!s(this,"_erasNarrowRegex"))Br.call(this);return e?this._erasNarrowRegex:this._erasRegex}function Fr(e,t){return t.erasAbbrRegex(e)}function zr(e,t){return t.erasNameRegex(e)}function Wr(e,t){return t.erasNarrowRegex(e)}function Vr(e,t){return t._eraYearOrdinalRegex||Ve}function Br(){var e=[],t=[],n=[],a=[],r,o,i=this.eras();for(r=0,o=i.length;r<o;++r){t.push(b(i[r].name));e.push(b(i[r].abbr));n.push(b(i[r].narrow));a.push(b(i[r].name));a.push(b(i[r].abbr));a.push(b(i[r].narrow))}this._erasRegex=new RegExp("^("+a.join("|")+")","i");this._erasNameRegex=new RegExp("^("+t.join("|")+")","i");this._erasAbbrRegex=new RegExp("^("+e.join("|")+")","i");this._erasNarrowRegex=new RegExp("^("+n.join("|")+")","i")}function Ur(e,t){a(0,[e,e.length],0,t)}function Kr(e){return Qr.call(this,e,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function Gr(e){return Qr.call(this,e,this.isoWeek(),this.isoWeekday(),1,4)}function qr(){return T(this.year(),1,4)}function $r(){return T(this.isoWeekYear(),1,4)}function Jr(){var e=this.localeData()._week;return T(this.year(),e.dow,e.doy)}function Xr(){var e=this.localeData()._week;return T(this.weekYear(),e.dow,e.doy)}function Qr(e,t,n,a,r){var o;if(e==null)return Lt(this,a,r).year;else{o=T(e,a,r);if(t>o)t=o;return Zr.call(this,e,t,n,a,r)}}function Zr(e,t,n,a,r){var o=Ct(e,t,n,a,r),i=Et(o.year,0,o.dayOfYear);this.year(i.getUTCFullYear());this.month(i.getUTCMonth());this.date(i.getUTCDate());return this}function eo(e){return e==null?Math.ceil((this.month()+1)/3):this.month((e-1)*3+this.month()%3)}a("N",0,0,"eraAbbr"),a("NN",0,0,"eraAbbr"),a("NNN",0,0,"eraAbbr"),a("NNNN",0,0,"eraName"),a("NNNNN",0,0,"eraNarrow"),a("y",["y",1],"yo","eraYear"),a("y",["yy",2],0,"eraYear"),a("y",["yyy",3],0,"eraYear"),a("y",["yyyy",4],0,"eraYear"),_("N",Fr),_("NN",Fr),_("NNN",Fr),_("NNNN",zr),_("NNNNN",Wr),w(["N","NN","NNN","NNNN","NNNNN"],function(e,t,n,a){var r=n._locale.erasParse(e,a,n._strict);if(r)f(n).era=r;else f(n).invalidEra=e}),_("y",Ve),_("yy",Ve),_("yyy",Ve),_("yyyy",Ve),_("yo",Vr),w(["y","yy","yyy","yyyy"],M),w(["yo"],function(e,t,n,a){var r;if(n._locale._eraYearOrdinalRegex)r=e.match(n._locale._eraYearOrdinalRegex);if(n._locale.eraYearOrdinalParse)t[M]=n._locale.eraYearOrdinalParse(e,r);else t[M]=parseInt(e,10)}),a(0,["gg",2],0,function(){return this.weekYear()%100}),a(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Ur("gggg","weekYear"),Ur("ggggg","weekYear"),Ur("GGGG","isoWeekYear"),Ur("GGGGG","isoWeekYear"),t("weekYear","gg"),t("isoWeekYear","GG"),n("weekYear",1),n("isoWeekYear",1),_("G",Be),_("g",Be),_("GG",v,r),_("gg",v,r),_("GGGG",ze,Ie),_("gggg",ze,Ie),_("GGGGG",We,Re),_("ggggg",We,Re),Ze(["gggg","ggggg","GGGG","GGGGG"],function(e,t,n,a){t[a.substr(0,2)]=y(e)}),Ze(["gg","GG"],function(e,t,n,a){t[a]=c.parseTwoDigitYear(e)}),a("Q",0,"Qo","quarter"),t("quarter","Q"),n("quarter",7),_("Q",je),w("Q",function(e,t){t[k]=(y(e)-1)*3}),a("D",["DD",2],"Do","date"),t("date","D"),n("date",9),_("D",v),_("DD",v,r),_("Do",function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient}),w(["D","DD"],S),w("Do",function(e,t){t[S]=y(e.match(v)[0])});var to=Te("Date",true);function no(e){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return e==null?t:this.add(e-t,"d")}a("DDD",["DDDD",3],"DDDo","dayOfYear"),t("dayOfYear","DDD"),n("dayOfYear",4),_("DDD",Fe),_("DDDD",Ye),w(["DDD","DDDD"],function(e,t,n){n._dayOfYear=y(e)}),a("m",["mm",2],0,"minute"),t("minute","m"),n("minute",14),_("m",v),_("mm",v,r),w(["m","mm"],x);var ao=Te("Minutes",false),ro=(a("s",["ss",2],0,"second"),t("second","s"),n("second",15),_("s",v),_("ss",v,r),w(["s","ss"],C),Te("Seconds",false)),oo,io;for(a("S",0,0,function(){return~~(this.millisecond()/100)}),a(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),a(0,["SSS",3],0,"millisecond"),a(0,["SSSS",4],0,function(){return this.millisecond()*10}),a(0,["SSSSS",5],0,function(){return this.millisecond()*100}),a(0,["SSSSSS",6],0,function(){return this.millisecond()*1e3}),a(0,["SSSSSSS",7],0,function(){return this.millisecond()*1e4}),a(0,["SSSSSSSS",8],0,function(){return this.millisecond()*1e5}),a(0,["SSSSSSSSS",9],0,function(){return this.millisecond()*1e6}),t("millisecond","ms"),n("millisecond",16),_("S",Fe,je),_("SS",Fe,r),_("SSS",Fe,Ye),oo="SSSS";oo.length<=9;oo+="S")_(oo,Ve);function lo(e,t){t[tt]=y(("0."+e)*1e3)}for(oo="S";oo.length<=9;oo+="S")w(oo,lo);function so(){return this._isUTC?"UTC":""}function uo(){return this._isUTC?"Coordinated Universal Time":""}io=Te("Milliseconds",false),a("z",0,0,"zoneAbbr"),a("zz",0,0,"zoneName");var P=J.prototype;if(P.add=Ia,P.calendar=Ba,P.clone=Ua,P.diff=Qa,P.endOf=_r,P.format=ar,P.from=rr,P.fromNow=or,P.to=ir,P.toNow=lr,P.get=Ne,P.invalidAt=Lr,P.isAfter=Ka,P.isBefore=Ga,P.isBetween=qa,P.isSame=$a,P.isSameOrAfter=Ja,P.isSameOrBefore=Xa,P.isValid=xr,P.lang=ur,P.locale=sr,P.localeData=dr,P.max=ea,P.min=Zn,P.parsingFlags=Cr,P.set=Pe,P.startOf=vr,P.subtract=Ra,P.toArray=kr,P.toObject=Sr,P.toDate=Mr,P.toISOString=tr,P.inspect=nr,typeof Symbol!=="undefined"&&Symbol.for!=null)P[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"};function co(e){return O(e*1e3)}function fo(){return O.apply(null,arguments).parseZone()}function po(e){return e}P.toJSON=Er,P.toString=er,P.unix=wr,P.valueOf=br,P.creationData=Tr,P.eraName=Pr,P.eraNarrow=jr,P.eraAbbr=Yr,P.eraYear=Ir,P.year=Mt,P.isLeapYear=kt,P.weekYear=Kr,P.isoWeekYear=Gr,P.quarter=P.quarters=eo,P.month=gt,P.daysInMonth=yt,P.week=P.weeks=Pt,P.isoWeek=P.isoWeeks=jt,P.weeksInYear=Jr,P.weeksInWeekYear=Xr,P.isoWeeksInYear=qr,P.isoWeeksInISOWeekYear=$r,P.date=to,P.day=P.days=$t,P.weekday=Jt,P.isoWeekday=Xt,P.dayOfYear=no,P.hour=P.hours=un,P.minute=P.minutes=ao,P.second=P.seconds=ro,P.millisecond=P.milliseconds=io,P.utcOffset=va,P.utc=ba,P.local=wa,P.parseZone=Ma,P.hasAlignedHourOffset=ka,P.isDST=Sa,P.isLocal=xa,P.isUtcOffset=Ca,P.isUtc=La,P.isUTC=La,P.zoneAbbr=so,P.zoneName=uo,P.dates=e("dates accessor is deprecated. Use date instead.",to),P.months=e("months accessor is deprecated. Use month instead",gt),P.years=e("years accessor is deprecated. Use year instead",Mt),P.zone=e("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",_a),P.isDSTShifted=e("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",Ea);var j=ae.prototype;function ho(e,t,n,a){var r=Mn(),o=d().set(a,t);return r[n](o,e)}function mo(e,t,n){if(u(e)){t=e;e=undefined}e=e||"";if(t!=null)return ho(e,t,n,"month");var a,r=[];for(a=0;a<12;a++)r[a]=ho(e,a,n,"month");return r}function go(e,t,n,a){if(typeof e==="boolean"){if(u(t)){n=t;t=undefined}t=t||""}else{t=e;n=t;e=false;if(u(t)){n=t;t=undefined}t=t||""}var r=Mn(),o=e?r._week.dow:0,i,l=[];if(n!=null)return ho(t,(n+o)%7,a,"day");for(i=0;i<7;i++)l[i]=ho(t,(i+o)%7,a,"day");return l}function yo(e,t){return mo(e,t,"months")}function vo(e,t){return mo(e,t,"monthsShort")}function _o(e,t,n){return go(e,t,n,"weekdays")}function bo(e,t,n){return go(e,t,n,"weekdaysShort")}function wo(e,t,n){return go(e,t,n,"weekdaysMin")}j.calendar=oe,j.longDateFormat=me,j.invalidDate=ye,j.ordinal=be,j.preparse=po,j.postformat=po,j.relativeTime=Me,j.pastFuture=ke,j.set=te,j.eras=Dr,j.erasParse=Or,j.erasConvertYear=Nr,j.erasAbbrRegex=Ar,j.erasNameRegex=Rr,j.erasNarrowRegex=Hr,j.months=ct,j.monthsShort=ft,j.monthsParse=ht,j.monthsRegex=_t,j.monthsShortRegex=vt,j.week=Tt,j.firstDayOfYear=Nt,j.firstDayOfWeek=Ot,j.weekdays=Bt,j.weekdaysMin=Kt,j.weekdaysShort=Ut,j.weekdaysParse=qt,j.weekdaysRegex=Qt,j.weekdaysShortRegex=Zt,j.weekdaysMinRegex=en,j.isPM=ln,j.meridiem=dn,_n("en",{eras:[{since:"0001-01-01",until:+Infinity,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-Infinity,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10,n=y(e%100/10)===1?"th":t===1?"st":t===2?"nd":t===3?"rd":"th";return e+n}}),c.lang=e("moment.lang is deprecated. Use moment.locale instead.",_n),c.langData=e("moment.langData is deprecated. Use moment.localeData instead.",Mn);var Mo=Math.abs;function ko(){var e=this._data;this._milliseconds=Mo(this._milliseconds);this._days=Mo(this._days);this._months=Mo(this._months);e.milliseconds=Mo(e.milliseconds);e.seconds=Mo(e.seconds);e.minutes=Mo(e.minutes);e.hours=Mo(e.hours);e.months=Mo(e.months);e.years=Mo(e.years);return this}function So(e,t,n,a){var r=N(t,n);e._milliseconds+=a*r._milliseconds;e._days+=a*r._days;e._months+=a*r._months;return e._bubble()}function Eo(e,t){return So(this,e,t,1)}function xo(e,t){return So(this,e,t,-1)}function Co(e){if(e<0)return Math.floor(e);else return Math.ceil(e)}function Lo(){var e=this._milliseconds,t=this._days,n=this._months,a=this._data,r,o,i,l,s;if(!(e>=0&&t>=0&&n>=0||e<=0&&t<=0&&n<=0)){e+=Co(Do(n)+t)*864e5;t=0;n=0}a.milliseconds=e%1e3;r=g(e/1e3);a.seconds=r%60;o=g(r/60);a.minutes=o%60;i=g(o/60);a.hours=i%24;t+=g(i/24);s=g(To(t));n+=s;t-=Co(Do(s));l=g(n/12);n%=12;a.days=t;a.months=n;a.years=l;return this}function To(e){return e*4800/146097}function Do(e){return e*146097/4800}function Oo(e){if(!this.isValid())return NaN;var t,n,a=this._milliseconds;e=m(e);if(e==="month"||e==="quarter"||e==="year"){t=this._days+a/864e5;n=this._months+To(t);switch(e){case"month":return n;case"quarter":return n/3;case"year":return n/12}}else{t=this._days+Math.round(Do(this._months));switch(e){case"week":return t/7+a/6048e5;case"day":return t+a/864e5;case"hour":return t*24+a/36e5;case"minute":return t*1440+a/6e4;case"second":return t*86400+a/1e3;case"millisecond":return Math.floor(t*864e5)+a;default:throw new Error("Unknown unit "+e)}}}function No(){if(!this.isValid())return NaN;return this._milliseconds+this._days*864e5+this._months%12*2592e6+y(this._months/12)*31536e6}function Po(e){return function(){return this.as(e)}}var jo=Po("ms"),Yo=Po("s"),Io=Po("m"),Ro=Po("h"),Ao=Po("d"),Ho=Po("w"),Fo=Po("M"),zo=Po("Q"),Wo=Po("y");function Vo(){return N(this)}function Bo(e){e=m(e);return this.isValid()?this[e+"s"]():NaN}function Uo(e){return function(){return this.isValid()?this._data[e]:NaN}}var Ko=Uo("milliseconds"),Go=Uo("seconds"),qo=Uo("minutes"),$o=Uo("hours"),Jo=Uo("days"),Xo=Uo("months"),Qo=Uo("years");function Zo(){return g(this.days()/7)}var ei=Math.round,ti={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function ni(e,t,n,a,r){return r.relativeTime(t||1,!!n,e,a)}function ai(e,t,n,a){var r=N(e).abs(),o=ei(r.as("s")),i=ei(r.as("m")),l=ei(r.as("h")),s=ei(r.as("d")),u=ei(r.as("M")),d=ei(r.as("w")),c=ei(r.as("y")),f=o<=n.ss&&["s",o]||o<n.s&&["ss",o]||i<=1&&["m"]||i<n.m&&["mm",i]||l<=1&&["h"]||l<n.h&&["hh",l]||s<=1&&["d"]||s<n.d&&["dd",s];if(n.w!=null)f=f||d<=1&&["w"]||d<n.w&&["ww",d];f=f||u<=1&&["M"]||u<n.M&&["MM",u]||c<=1&&["y"]||["yy",c];f[2]=t;f[3]=+e>0;f[4]=a;return ni.apply(null,f)}function ri(e){if(e===undefined)return ei;if(typeof e==="function"){ei=e;return true}return false}function oi(e,t){if(ti[e]===undefined)return false;if(t===undefined)return ti[e];ti[e]=t;if(e==="s")ti.ss=t-1;return true}function ii(e,t){if(!this.isValid())return this.localeData().invalidDate();var n=false,a=ti,r,o;if(typeof e==="object"){t=e;e=false}if(typeof e==="boolean")n=e;if(typeof t==="object"){a=Object.assign({},ti,t);if(t.s!=null&&t.ss==null)a.ss=t.s-1}r=this.localeData();o=ai(this,!n,a,r);if(n)o=r.pastFuture(+this,o);return r.postformat(o)}var li=Math.abs;function si(e){return(e>0)-(e<0)||+e}function ui(){if(!this.isValid())return this.localeData().invalidDate();var e=li(this._milliseconds)/1e3,t=li(this._days),n=li(this._months),a,r,o,i,l=this.asSeconds(),s,u,d,c;if(!l)return"P0D";a=g(e/60);r=g(a/60);e%=60;a%=60;o=g(n/12);n%=12;i=e?e.toFixed(3).replace(/\.?0+$/,""):"";s=l<0?"-":"";u=si(this._months)!==si(l)?"-":"";d=si(this._days)!==si(l)?"-":"";c=si(this._milliseconds)!==si(l)?"-":"";return s+"P"+(o?u+o+"Y":"")+(n?u+n+"M":"")+(t?d+t+"D":"")+(r||a||e?"T":"")+(r?c+r+"H":"")+(a?c+a+"M":"")+(e?c+i+"S":"")}var Y=ua.prototype;return Y.isValid=la,Y.abs=ko,Y.add=Eo,Y.subtract=xo,Y.as=Oo,Y.asMilliseconds=jo,Y.asSeconds=Yo,Y.asMinutes=Io,Y.asHours=Ro,Y.asDays=Ao,Y.asWeeks=Ho,Y.asMonths=Fo,Y.asQuarters=zo,Y.asYears=Wo,Y.valueOf=No,Y._bubble=Lo,Y.clone=Vo,Y.get=Bo,Y.milliseconds=Ko,Y.seconds=Go,Y.minutes=qo,Y.hours=$o,Y.days=Jo,Y.weeks=Zo,Y.months=Xo,Y.years=Qo,Y.humanize=ii,Y.toISOString=ui,Y.toString=ui,Y.toJSON=ui,Y.locale=sr,Y.localeData=dr,Y.toIsoString=e("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",ui),Y.lang=ur,a("X",0,0,"unix"),a("x",0,0,"valueOf"),_("x",Be),_("X",Ge),w("X",function(e,t,n){n._d=new Date(parseFloat(e)*1e3)}),w("x",function(e,t,n){n._d=new Date(y(e))}),
+//! moment.js
+c.version="2.29.4",A(O),c.fn=P,c.min=na,c.max=aa,c.now=ra,c.utc=d,c.unix=co,c.months=yo,c.isDate=z,c.locale=_n,c.invalid=K,c.duration=N,c.isMoment=p,c.weekdays=_o,c.parseZone=fo,c.localeData=Mn,c.isDuration=da,c.monthsShort=vo,c.weekdaysMin=wo,c.defineLocale=bn,c.updateLocale=wn,c.locales=kn,c.weekdaysShort=bo,c.normalizeUnits=m,c.relativeTimeRounding=ri,c.relativeTimeThreshold=oi,c.calendarFormat=Va,c.prototype=P,c.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},c}()}.call(this,fi(516)(e))},function(e,t,n){"use strict";t.__esModule=!0;var a=u(n(2)),r=u(n(12)),o=u(n(8)),i=u(n(360)),l=u(n(581)),s=u(n(582)),n=u(n(362));function u(e){return e&&e.__esModule?e:{default:e}}i.default.Password=o.default.config(l.default,{exportNames:["getInputNode","focus"],transform:function(e,t){var n;return"hasLimitHint"in e&&(t("hasLimitHint","showLimitHint","Input"),n=(t=e).hasLimitHint,t=(0,r.default)(t,["hasLimitHint"]),e=(0,a.default)({showLimitHint:n},t)),e}}),i.default.TextArea=o.default.config(s.default,{exportNames:["getInputNode","focus"],transform:function(e,t){var n;return"hasLimitHint"in e&&(t("hasLimitHint","showLimitHint","Input"),n=(t=e).hasLimitHint,t=(0,r.default)(t,["hasLimitHint"]),e=(0,a.default)({showLimitHint:n},t)),e}}),i.default.Group=n.default,t.default=o.default.config(i.default,{exportNames:["getInputNode","focus"],transform:function(e,t){var n;return"hasLimitHint"in e&&(t("hasLimitHint","showLimitHint","Input"),n=(t=e).hasLimitHint,t=(0,r.default)(t,["hasLimitHint"]),e=(0,a.default)({showLimitHint:n},t)),e}}),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.pickAttrs=t.datejs=t.htmlId=t.KEYCODE=t.guid=t.focus=t.support=t.str=t.obj=t.log=t.func=t.events=t.env=t.dom=void 0;var a=y(n(201)),r=y(n(204)),o=y(n(499)),i=y(n(500)),l=y(n(203)),s=y(n(96)),u=y(n(202)),d=y(n(508)),c=y(n(509)),f=y(n(510)),p=g(n(511)),h=g(n(206)),m=g(n(155)),n=g(n(512));function g(e){return e&&e.__esModule?e:{default:e}}function y(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}t.dom=a,t.env=r,t.events=o,t.func=i,t.log=l,t.obj=s,t.str=u,t.support=d,t.focus=c,t.guid=p.default,t.KEYCODE=h.default,t.htmlId=f,t.datejs=m.default,t.pickAttrs=n.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=function(e,t){var n,a={};for(n in e)0<=t.indexOf(n)||Object.prototype.hasOwnProperty.call(e,n)&&(a[n]=e[n]);return a}},function(e,t,n){var a;
+/*!
+  Copyright (c) 2018 Jed Watson.
+  Licensed under the MIT License (MIT), see
+  http://jedwatson.github.io/classnames
+*/
+!function(){"use strict";var i={}.hasOwnProperty;function l(){for(var e=[],t=0;t<arguments.length;t++){var n=arguments[t];if(n){var a,r=typeof n;if("string"==r||"number"==r)e.push(n);else if(Array.isArray(n))!n.length||(a=l.apply(null,n))&&e.push(a);else if("object"==r)if(n.toString===Object.prototype.toString)for(var o in n)i.call(n,o)&&n[o]&&e.push(o);else e.push(n.toString())}}return e.join(" ")}e.exports?e.exports=l.default=l:void 0!==(a=function(){return l}.apply(t,[]))&&(e.exports=a)}()},function(e,t,n){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}n.d(t,"a",function(){return a})},function(e,t,n){"use strict";function a(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}function r(e,t,n){return t&&a(e.prototype,t),n&&a(e,n),e}n.d(t,"a",function(){return r})},function(e,t,n){"use strict";function r(e){return(r=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}n.d(t,"a",function(){return a});var o=n(72),i=n(22);function a(a){return function(){var e,t,n=r(a);return e=function(){if("undefined"!=typeof Reflect&&Reflect.construct&&!Reflect.construct.sham){if("function"==typeof Proxy)return 1;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),1}catch(e){}}}()?(e=r(this).constructor,Reflect.construct(n,arguments,e)):n.apply(this,arguments),n=this,!(t=e)||"object"!==Object(o.a)(t)&&"function"!=typeof t?Object(i.a)(n):t}}},function(e,t,n){"use strict";function a(e,t){return(a=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function r(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&a(e,t)}n.d(t,"a",function(){return r})},function(e,t,n){"use strict";t.__esModule=!0;var o=r(n(2)),i=r(n(12)),a=r(n(8)),l=r(n(576)),n=r(n(577));function r(e){return e&&e.__esModule?e:{default:e}}l.default.Group=n.default,t.default=a.default.config(l.default,{transform:function(e,t){var n,a,r;return"shape"in e&&(t("shape","text | warning | ghost","Button"),n=(t=e).shape,a=t.type,t=(0,i.default)(t,["shape","type"]),r=void 0,"ghost"===n&&(r={primary:"dark",secondary:"dark",normal:"light",dark:"dark",light:"light"}[a||l.default.defaultProps.type]),e=(0,o.default)({type:"light"===a||"dark"===a||"secondary"===a&&"warning"===n?"normal":a,ghost:r,text:"text"===n,warning:"warning"===n},t)),e}}),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var i=m(n(2)),l=m(n(12)),a=m(n(4)),r=m(n(6)),o=m(n(7)),s=m(n(0)),u=m(n(8)),d=n(11),c=m(n(358)),f=m(n(359)),p=m(n(164)),h=n(580);function m(e){return e&&e.__esModule?e:{default:e}}g=s.default.Component,(0,o.default)(y,g),y.prototype.render=function(){var e=this.props,t=e.v2,e=(0,l.default)(e,["v2"]);return t?s.default.createElement(f.default,e):s.default.createElement(c.default,e)};var g,n=y;function y(){return(0,a.default)(this,y),(0,r.default)(this,g.apply(this,arguments))}function v(r,o){var e,t;if("closable"in r&&(o("closable","closeable","Dialog"),t=(e=r).closable,e=(0,l.default)(e,["closable"]),r=(0,i.default)({closeable:t},e)),"v2"in r)return t=(0,i.default)({},r),"align"in r&&(delete t.align,o("align","centered","<Dialog v2 />")),"shouldUpdatePosition"in r&&(delete t.shouldUpdatePosition,d.log.warning("Warning: [ shouldUpdatePosition ] is deprecated at [ <Dialog v2 /> ]")),"minMargin"in r&&o("minMargin","top/bottom","<Dialog v2 />"),"isFullScreen"in r&&(r.overFlowScroll=!r.isFullScreen,delete t.isFullScreen,o("isFullScreen","overFlowScroll","<Dialog v2 />")),t;return["target","offset","beforeOpen","onOpen","afterOpen","beforePosition","onPosition","cache","safeNode","wrapperClassName","container"].forEach(function(e){var t,n,a;e in r&&(o(e,"overlayProps."+e,"Dialog"),t=(n=r).overlayProps,n=(0,l.default)(n,["overlayProps"]),a=(0,i.default)(((a={})[e]=r[e],a),t||{}),delete n[e],r=(0,i.default)({overlayProps:a},n))}),r}n.displayName="Dialog",n.Inner=p.default,n.show=function(e){return!1!==u.default.getContextProps(e,"Dialog").warning&&(e=v(e,d.log.deprecated)),(0,h.show)(e)},n.alert=function(e){return!1!==u.default.getContextProps(e,"Dialog").warning&&(e=v(e,d.log.deprecated)),(0,h.alert)(e)},n.confirm=function(e){return!1!==u.default.getContextProps(e,"Dialog").warning&&(e=v(e,d.log.deprecated)),(0,h.confirm)(e)},n.success=function(e){return(0,h.success)(e)},n.error=function(e){return(0,h.error)(e)},n.notice=function(e){return(0,h.notice)(e)},n.warning=function(e){return(0,h.warning)(e)},n.help=function(e){return(0,h.help)(e)},n.withContext=h.withContext,t.default=u.default.config(n,{transform:v}),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var i=v(n(2)),l=v(n(12)),a=v(n(8)),r=v(n(638)),o=v(n(643)),s=v(n(646)),u=v(n(647)),d=v(n(648)),c=v(n(649)),f=v(n(651)),p=v(n(652)),h=v(n(653)),m=v(n(656)),g=v(n(393)),y=v(n(394));function v(e){return e&&e.__esModule?e:{default:e}}var _=n(11).env.ieVersion,n=[s.default,f.default,u.default,d.default,c.default,o.default,h.default,m.default],b=n.reduce(function(e,t){return e=t(e)},r.default),n=(f.default._typeMark="lock",d.default._typeMark="expanded",s.default._typeMark="fixed",n.reduce(function(e,t){var n=!_;return e="lock"===t._typeMark?(n?(0,p.default):(0,f.default))(e):"expanded"===t._typeMark?n?(0,d.default)(e,!0):(0,d.default)(e):"fixed"===t._typeMark?n?(0,s.default)(e,!0):(0,s.default)(e):t(e)},r.default));b.Base=r.default,b.fixed=s.default,b.lock=f.default,b.selection=u.default,b.expanded=d.default,b.tree=o.default,b.virtual=c.default,b.list=h.default,b.sticky=m.default,b.GroupHeader=g.default,b.GroupFooter=y.default,b.StickyLock=a.default.config(n,{componentName:"Table"}),t.default=a.default.config(b,{componentName:"Table",transform:function(e,t){var n,a,r,o;return"expandedRowKeys"in e&&(t("expandedRowKeys","openRowKeys","Table"),o=(r=e).expandedRowKeys,r=(0,l.default)(r,["expandedRowKeys"]),e=(0,i.default)({openRowKeys:o},r)),"onExpandedChange"in e&&(t("onExpandedChange","onRowOpen","Table"),r=(o=e).onExpandedChange,o=(0,l.default)(o,["onExpandedChange"]),e=(0,i.default)({onRowOpen:r},o)),"isLoading"in e&&(t("isLoading","loading","Table"),o=(r=e).isLoading,r=(0,l.default)(r,["isLoading"]),e=(0,i.default)({loading:o},r)),"indentSize"in e&&(t("indentSize","indent","Table"),r=(o=e).indentSize,o=(0,l.default)(o,["indentSize"]),e=(0,i.default)({indent:r},o)),"optimization"in e&&(t("optimization","pure","Table"),o=(r=e).optimization,r=(0,l.default)(r,["optimization"]),e=(0,i.default)({pure:o},r)),"getRowClassName"in e&&(t("getRowClassName","getRowProps","Table"),n=(o=e).getRowClassName,a=o.getRowProps,r=(0,l.default)(o,["getRowClassName","getRowProps"]),e=n?(0,i.default)({getRowProps:function(){return(0,i.default)({className:n.apply(void 0,arguments)},a?a.apply(void 0,arguments):{})}},r):(0,i.default)({getRowProps:a},r)),"getRowProps"in e&&(t("getRowProps","rowProps","Table in 1.15.0"),r=(o=e).getRowProps,o=(0,l.default)(o,["getRowProps"]),e=(0,i.default)({rowProps:r},o)),"getCellProps"in e&&(t("getCellProps","cellProps","Table in 1.15.0"),o=(r=e).getCellProps,t=(0,l.default)(r,["getCellProps"]),e=(0,i.default)({cellProps:o},t)),e}}),e.exports=t.default},function(e,t,n){"use strict";n.d(t,"a",function(){return o});var a=n(89);function r(t,e){var n,a=Object.keys(t);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(t),e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),a.push.apply(a,n)),a}function o(t){for(var e=1;e<arguments.length;e++){var n=null!=arguments[e]?arguments[e]:{};e%2?r(Object(n),!0).forEach(function(e){Object(a.a)(t,e,n[e])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))})}return t}},function(e,t,n){"use strict";function a(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}n.d(t,"a",function(){return a})},function(e,t,n){"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(e){console.error(e)}}(),e.exports=n(451)},function(e,t,n){"use strict";t.__esModule=!0;var a=o(n(8)),r=o(n(518)),n=o(n(343));function o(e){return e&&e.__esModule?e:{default:e}}n.default.createFromIconfontCN=r.default,t.default=a.default.config(n.default),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var a=s(n(8)),r=s(n(156)),o=n(528),i=s(o),l=s(n(535));function s(e){return e&&e.__esModule?e:{default:e}}r.default.show=i.default.show,r.default.success=i.default.success,r.default.warning=i.default.warning,r.default.error=i.default.error,r.default.notice=i.default.notice,r.default.help=i.default.help,r.default.loading=i.default.loading,r.default.hide=i.default.hide,r.default.withContext=o.withContext;var u=a.default.config(r.default,{componentName:"Message"}),d=(t.default=u,!1);u.config=function(e){l.default.config(e),d||(u.show=l.default.open,u.open=l.default.open,u.hide=l.default.close,u.close=l.default.close,u.destory=l.default.destory,u.success=l.default.success,u.warning=l.default.warning,u.error=l.default.error,u.notice=l.default.notice,u.help=l.default.help,u.loading=l.default.loading,d=!0)},e.exports=t.default},function(e,t,n){"use strict";n(449)},function(e,t,n){"use strict";t.__esModule=!0;var a=c(n(2)),r=c(n(4)),o=c(n(6)),i=c(n(7)),l=n(0),s=c(n(549)),u=n(11),d=n(567);function c(e){return e&&e.__esModule?e:{default:e}}f=s.default,(0,i.default)(p,f),p.useField=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{};if(l.useState&&l.useMemo)return this.getUseField({useMemo:l.useMemo,useState:l.useState})(e);u.log.warning("need react version > 16.8.0")},p.prototype.validate=function(e,t){this.validateCallback(e,t)},p.prototype.reset=function(e){var t=1<arguments.length&&void 0!==arguments[1]&&arguments[1];!0===e?(u.log.deprecated("reset(true)","resetToDefault()","Field"),this.resetToDefault()):!0===t?(u.log.deprecated("reset(ns,true)","resetToDefault(ns)","Field"),this.resetToDefault(e)):this._reset(e,!1)};var f,n=p;function p(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},t=((0,r.default)(this,p),(0,a.default)({},t,{afterValidateRerender:d.scrollToFirstError,processErrorMessage:d.cloneAndAddKey})),e=(0,o.default)(this,f.call(this,e,t));return e.validate=e.validate.bind(e),e}t.default=n,e.exports=t.default},function(e,t,n){"use strict";n.d(t,"f",function(){return a}),n.d(t,"g",function(){return r}),n.d(t,"i",function(){return o}),n.d(t,"c",function(){return i}),n.d(t,"d",function(){return l}),n.d(t,"j",function(){return s}),n.d(t,"l",function(){return u}),n.d(t,"k",function(){return d}),n.d(t,"h",function(){return c}),n.d(t,"b",function(){return f}),n.d(t,"a",function(){return p}),n.d(t,"e",function(){return h});var a="docsite_language",r="LANGUAGE_SWITCH",o="__REDUX_DEVTOOLS_EXTENSION__",i="GET_STATE",l="GET_SUBSCRIBERS",s="REMOVE_SUBSCRIBERS",u="USER_LIST",d="ROLE_LIST",c="PERMISSIONS_LIST",f="GET_NAMESPACES",p="GET_CONFIGURATION",h=[10,20,30,50,100]},function(e,t,n){"use strict";t.__esModule=!0;var u=l(n(12)),a=l(n(8)),r=l(n(671)),o=l(n(677)),i=l(n(678)),n=l(n(679));function l(e){return e&&e.__esModule?e:{default:e}}function s(e,t){var n=e.shape,a=e.container,r=e.multiple,o=e.filterBy,i=e.overlay,l=e.safeNode,s=e.noFoundContent,e=(0,u.default)(e,["shape","container","multiple","filterBy","overlay","safeNode","noFoundContent"]);return"arrow-only"===n&&(t("shape=arrow-only","hasBorder=false","Select"),e.hasBorder=!1),a&&(t("container","popupContainer","Select"),e.popupContainer=a),r&&(t("multiple","mode=multiple","Select"),e.mode="multiple"),o&&(t("filterBy","filter","Select"),e.filter=o),i&&(t("overlay","popupContent","Select"),e.popupContent=i,e.autoWidth=!1),s&&(t("noFoundContent","notFoundContent","Select"),e.notFoundContent=s),l&&(t("safeNode","popupProps={safeNode}","Select"),e.popupProps={safeNode:l}),e}r.default.AutoComplete=a.default.config(o.default,{componentName:"Select"}),r.default.Option=i.default,r.default.OptionGroup=n.default,r.default.Combobox=a.default.config(r.default,{transform:function(e,t){t("Select.Combobox","<Select showSearch={true}/>","Select");t=s(e,t);return e.onInputUpdate&&(t.onSearch=e.onInputUpdate,t.showSearch=!0),t}}),t.default=a.default.config(r.default,{transform:s,exportNames:["focusInput","handleSearchClear"]}),e.exports=t.default},function(e,t,n){"use strict";function s(){var e=this.constructor.getDerivedStateFromProps(this.props,this.state);null!=e&&this.setState(e)}function u(t){this.setState(function(e){return null!=(e=this.constructor.getDerivedStateFromProps(t,e))?e:null}.bind(this))}function d(e,t){try{var n=this.props,a=this.state;this.props=e,this.state=t,this.__reactInternalSnapshotFlag=!0,this.__reactInternalSnapshot=this.getSnapshotBeforeUpdate(n,a)}finally{this.props=n,this.state=a}}function a(e){var t=e.prototype;if(!t||!t.isReactComponent)throw new Error("Can only polyfill class components");if("function"==typeof e.getDerivedStateFromProps||"function"==typeof t.getSnapshotBeforeUpdate){var n,a,r=null,o=null,i=null;if("function"==typeof t.componentWillMount?r="componentWillMount":"function"==typeof t.UNSAFE_componentWillMount&&(r="UNSAFE_componentWillMount"),"function"==typeof t.componentWillReceiveProps?o="componentWillReceiveProps":"function"==typeof t.UNSAFE_componentWillReceiveProps&&(o="UNSAFE_componentWillReceiveProps"),"function"==typeof t.componentWillUpdate?i="componentWillUpdate":"function"==typeof t.UNSAFE_componentWillUpdate&&(i="UNSAFE_componentWillUpdate"),null!==r||null!==o||null!==i)throw n=e.displayName||e.name,a="function"==typeof e.getDerivedStateFromProps?"getDerivedStateFromProps()":"getSnapshotBeforeUpdate()",Error("Unsafe legacy lifecycles will not be called for components using new component APIs.\n\n"+n+" uses "+a+" but also contains the following legacy lifecycles:"+(null!==r?"\n  "+r:"")+(null!==o?"\n  "+o:"")+(null!==i?"\n  "+i:"")+"\n\nThe above lifecycles should be removed. Learn more about this warning here:\nhttps://fb.me/react-async-component-lifecycle-hooks");if("function"==typeof e.getDerivedStateFromProps&&(t.componentWillMount=s,t.componentWillReceiveProps=u),"function"==typeof t.getSnapshotBeforeUpdate){if("function"!=typeof t.componentDidUpdate)throw new Error("Cannot polyfill getSnapshotBeforeUpdate() for components that do not define componentDidUpdate() on the prototype");t.componentWillUpdate=d;var l=t.componentDidUpdate;t.componentDidUpdate=function(e,t,n){n=this.__reactInternalSnapshotFlag?this.__reactInternalSnapshot:n;l.call(this,e,t,n)}}}return e}n.r(t),n.d(t,"polyfill",function(){return a}),d.__suppressDeprecationWarning=u.__suppressDeprecationWarning=s.__suppressDeprecationWarning=!0},function(e,t,n){"use strict";n.d(t,"a",function(){return r});var a=n(134);function r(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e)){var n=[],a=!0,r=!1,o=void 0;try{for(var i,l=e[Symbol.iterator]();!(a=(i=l.next()).done)&&(n.push(i.value),!t||n.length!==t);a=!0);}catch(e){r=!0,o=e}finally{try{a||null==l.return||l.return()}finally{if(r)throw o}}return n}}(e,t)||Object(a.a)(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}},function(e,t,n){"use strict";n(43),n(540)},function(e,t,n){"use strict";t.__esModule=!0;var v=s(n(2)),a=s(n(4)),r=s(n(6)),o=s(n(7)),_=s(n(0)),i=s(n(3)),b=s(n(13)),w=s(n(62)),l=s(n(8)),M=n(11);function s(e){return e&&e.__esModule?e:{default:e}}u=_.default.Component,(0,o.default)(k,u),k.prototype.render=function(){var e=this.props,t=e.tip,n=e.visible,a=e.children,r=e.className,o=e.style,i=e.indicator,l=e.color,s=e.prefix,u=e.fullScreen,d=e.disableScroll,c=e.onVisibleChange,f=e.tipAlign,p=e.size,h=e.inline,m=e.rtl,e=e.safeNode,g=null,y=s+"loading-dot",p=(g=i||(i=l,p=(0,b.default)(((l={})[s+"loading-fusion-reactor"]=!0,l[s+"loading-medium-fusion-reactor"]="medium"===p,l)),_.default.createElement("div",{className:p,dir:m?"rtl":void 0},_.default.createElement("span",{className:y,style:{backgroundColor:i}}),_.default.createElement("span",{className:y,style:{backgroundColor:i}}),_.default.createElement("span",{className:y,style:{backgroundColor:i}}),_.default.createElement("span",{className:y,style:{backgroundColor:i}}))),(0,b.default)(((l={})[s+"loading"]=!0,l[s+"open"]=n,l[s+"loading-inline"]=h,l[r]=r,l))),y=(0,b.default)(((m={})[s+"loading-tip"]=!0,m[s+"loading-tip-fullscreen"]=u,m[s+"loading-right-tip"]="right"===f,m)),i=M.obj.pickOthers(k.propTypes,this.props),l=(0,b.default)(((h={})[s+"loading-component"]=n,h[s+"loading-wrap"]=!0,h));return u?[a,_.default.createElement(w.default,(0,v.default)({key:"overlay",hasMask:!0,align:"cc cc",safeNode:e,disableScroll:d},i,{className:r,style:o,visible:n,onRequestClose:c}),_.default.createElement("div",{className:y},_.default.createElement("div",{className:s+"loading-indicator"},g),_.default.createElement("div",{className:s+"loading-tip-content"},t),_.default.createElement("div",{className:s+"loading-tip-placeholder"},t)))]:_.default.createElement("div",(0,v.default)({className:p,style:o},i),n?_.default.createElement("div",{className:y},_.default.createElement("div",{className:s+"loading-indicator"},g),_.default.createElement("div",{className:s+"loading-tip-content"},t),_.default.createElement("div",{className:s+"loading-tip-placeholder"},t)):null,_.default.createElement("div",{className:l},n?_.default.createElement("div",{className:s+"loading-masker"}):null,a))},o=n=k,n.propTypes=(0,v.default)({},l.default.propTypes,{prefix:i.default.string,tip:i.default.any,tipAlign:i.default.oneOf(["right","bottom"]),visible:i.default.bool,onVisibleChange:i.default.func,className:i.default.string,style:i.default.object,size:i.default.oneOf(["large","medium"]),indicator:i.default.any,color:i.default.string,fullScreen:i.default.bool,disableScroll:i.default.bool,safeNode:i.default.any,children:i.default.any,inline:i.default.bool,rtl:i.default.bool}),n.defaultProps={prefix:"next-",visible:!0,onVisibleChange:M.func.noop,animate:null,tipAlign:"bottom",size:"large",inline:!0,disableScroll:!1};var u,i=o;function k(){return(0,a.default)(this,k),(0,r.default)(this,u.apply(this,arguments))}i.displayName="Loading",t.default=l.default.config(i),e.exports=t.default},function(e,t,n){"use strict";n(51);var a=n(25),r=n.n(a),o=n(72),a=n(137),a=n.n(a),i=n(415),l=n.n(i),s=n(47),u="Request error, please try again later!";function d(){var e=window.location.href,e=(localStorage.removeItem("token"),e.split("#")[0]);window.location.href="".concat(e,"#/login")}t.a=((i=a.a.create()).interceptors.request.use(function(e){var t=e.url,n=e.params,a=e.data,r=e.method,o=e.headers;if(n||(e.params={}),!t.includes("auth/users/login")){n={};try{n=JSON.parse(localStorage.token)}catch(e){console.log(e),d()}var i=n.accessToken,i=void 0===i?"":i,n=n.username,n=void 0===n?"":n;e.params.accessToken=i,t.includes("auth")||(e.params.username=n),e.headers=Object.assign({},o,{accessToken:i})}return a&&Object(s.d)(a)&&["post","put"].includes(r)&&(e.data=l.a.stringify(a),o||(e.headers={}),e.headers["Content-Type"]="application/x-www-form-urlencoded"),e},function(e){return Promise.reject(e)}),i.interceptors.response.use(function(e){var t=e.data;t.success,t.resultCode,t.resultMessage;return e.data},function(e){var t,n,a;return e.response?(t=void 0===(t=(n=e.response).data)?{}:t,n=n.status,a="HTTP ERROR: ".concat(n),"string"==typeof t?a=t:"object"===Object(o.a)(t)&&(a=t.message),r.a.error(a),[401,403].includes(n)&&["unknown user!","token invalid!","token expired!","session expired!"].includes(a)&&d(),Promise.reject(e.response)):(r.a.error(u),Promise.reject(e))}),i)},function(e,t,n){"use strict";n(75),n(51),n(32),n(43),n(541)},function(e,t,n){"use strict";n(43),n(542)},function(M,e,t){"use strict";t.d(e,"a",function(){return a}),t.d(e,"b",function(){return B});var x=t(0),C=t.n(x),d=C.a.createContext(null);function s(){return n}var n=function(e){e()};var r={notify:function(){},get:function(){return[]}};function L(t,n){var o,i=r;function l(){e.onStateChange&&e.onStateChange()}function a(){var e,a,r;o||(o=n?n.addNestedSub(l):t.subscribe(l),e=s(),r=a=null,i={clear:function(){r=a=null},notify:function(){e(function(){for(var e=a;e;)e.callback(),e=e.next})},get:function(){for(var e=[],t=a;t;)e.push(t),t=t.next;return e},subscribe:function(e){var t=!0,n=r={callback:e,next:null,prev:r};return n.prev?n.prev.next=n:a=n,function(){t&&null!==a&&(t=!1,n.next?n.next.prev=n.prev:r=n.prev,n.prev?n.prev.next=n.next:a=n.next)}}})}var e={addNestedSub:function(e){return a(),i.subscribe(e)},notifyNestedSubs:function(){i.notify()},handleChangeWrapper:l,isSubscribed:function(){return Boolean(o)},trySubscribe:a,tryUnsubscribe:function(){o&&(o(),o=void 0,i.clear(),i=r)},getListeners:function(){return i}};return e}var o="undefined"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement?x.useLayoutEffect:x.useEffect;var a=function(e){var t=e.store,n=e.context,e=e.children,a=Object(x.useMemo)(function(){var e=L(t);return{store:t,subscription:e}},[t]),r=Object(x.useMemo)(function(){return t.getState()},[t]),n=(o(function(){var e=a.subscription;return e.onStateChange=e.notifyNestedSubs,e.trySubscribe(),r!==t.getState()&&e.notifyNestedSubs(),function(){e.tryUnsubscribe(),e.onStateChange=null}},[a,r]),n||d);return C.a.createElement(n.Provider,{value:a},e)},T=t(42),D=t(54),e=t(100),c=t.n(e),O=t(412),f=["getDisplayName","methodName","renderCountProp","shouldHandleStateChanges","storeKey","withRef","forwardRef","context"],N=["reactReduxForwardedRef"],P=[],j=[null,null];function Y(e,t){e=e[1];return[t.payload,e+1]}function I(e,t,n){o(function(){return e.apply(void 0,t)},n)}function R(e,t,n,a,r,o,i){e.current=a,t.current=r,n.current=!1,o.current&&(o.current=null,i())}function A(e,a,t,r,o,i,l,s,u,d){var c,f;if(e)return c=!1,f=null,e=function(){if(!c){var e,t,n=a.getState();try{e=r(n,o.current)}catch(e){f=t=e}t||(f=null),e===i.current?l.current||u():(i.current=e,s.current=e,l.current=!0,d({type:"STORE_UPDATED",payload:{error:t}}))}},t.onStateChange=e,t.trySubscribe(),e(),function(){if(c=!0,t.tryUnsubscribe(),t.onStateChange=null,f)throw f}}var H=function(){return[null,0]};function i(k,e){var e=e=void 0===e?{}:e,t=e.getDisplayName,r=void 0===t?function(e){return"ConnectAdvanced("+e+")"}:t,t=e.methodName,o=void 0===t?"connectAdvanced":t,t=e.renderCountProp,i=void 0===t?void 0:t,t=e.shouldHandleStateChanges,S=void 0===t||t,t=e.storeKey,l=void 0===t?"store":t,t=(e.withRef,e.forwardRef),s=void 0!==t&&t,t=e.context,t=void 0===t?d:t,u=Object(D.a)(e,f),E=t;return function(b){var e=b.displayName||b.name||"Component",t=r(e),w=Object(T.a)({},u,{getDisplayName:r,methodName:o,renderCountProp:i,shouldHandleStateChanges:S,storeKey:l,displayName:t,wrappedComponentName:e,WrappedComponent:b}),e=u.pure;var M=e?x.useMemo:function(e){return e()};function n(n){var e=Object(x.useMemo)(function(){var e=n.reactReduxForwardedRef,t=Object(D.a)(n,N);return[n.context,e,t]},[n]),t=e[0],a=e[1],r=e[2],o=Object(x.useMemo)(function(){return t&&t.Consumer&&Object(O.isContextConsumer)(C.a.createElement(t.Consumer,null))?t:E},[t,E]),i=Object(x.useContext)(o),l=Boolean(n.store)&&Boolean(n.store.getState)&&Boolean(n.store.dispatch),s=(Boolean(i)&&Boolean(i.store),(l?n:i).store),u=Object(x.useMemo)(function(){return k(s.dispatch,w)},[s]),e=Object(x.useMemo)(function(){if(!S)return j;var e=L(s,l?null:i.subscription),t=e.notifyNestedSubs.bind(e);return[e,t]},[s,l,i]),d=e[0],e=e[1],c=Object(x.useMemo)(function(){return l?i:Object(T.a)({},i,{subscription:d})},[l,i,d]),f=Object(x.useReducer)(Y,P,H),p=f[0][0],f=f[1];if(p&&p.error)throw p.error;var h=Object(x.useRef)(),m=Object(x.useRef)(r),g=Object(x.useRef)(),y=Object(x.useRef)(!1),v=M(function(){return g.current&&r===m.current?g.current:u(s.getState(),r)},[s,p,r]),_=(I(R,[m,h,y,r,v,g,e]),I(A,[S,s,d,u,m,h,y,g,e,f],[s,d,u]),Object(x.useMemo)(function(){return C.a.createElement(b,Object(T.a)({},v,{ref:a}))},[a,b,v]));return Object(x.useMemo)(function(){return S?C.a.createElement(o.Provider,{value:c},_):_},[o,_,c])}var a=e?C.a.memo(n):n;return a.WrappedComponent=b,a.displayName=n.displayName=t,s?((e=C.a.forwardRef(function(e,t){return C.a.createElement(a,Object(T.a)({},e,{reactReduxForwardedRef:t}))})).displayName=t,e.WrappedComponent=b,c()(e,b)):c()(a,b)}}function l(e,t){return e===t?0!==e||0!==t||1/e==1/t:e!=e&&t!=t}function m(e,t){if(!l(e,t)){if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),a=Object.keys(t);if(n.length!==a.length)return!1;for(var r=0;r<n.length;r++)if(!Object.prototype.hasOwnProperty.call(t,n[r])||!l(e[n[r]],t[n[r]]))return!1}return!0}function u(n,a){var e,r={};for(e in n)!function(e){var t=n[e];"function"==typeof t&&(r[e]=function(){return a(t.apply(void 0,arguments))})}(e);return r}function p(r){return function(e,t){var n=r(e,t);function a(){return n}return a.dependsOnOwnProps=!1,a}}function h(e){return null!==e.dependsOnOwnProps&&void 0!==e.dependsOnOwnProps?Boolean(e.dependsOnOwnProps):1!==e.length}function g(r){return function(e,t){t.displayName;var a=function(e,t){return a.dependsOnOwnProps?a.mapToProps(e,t):a.mapToProps(e)};return a.dependsOnOwnProps=!0,a.mapToProps=function(e,t){a.mapToProps=r,a.dependsOnOwnProps=h(r);var n=a(e,t);return"function"==typeof n&&(a.mapToProps=n,a.dependsOnOwnProps=h(n),n=a(e,t)),n},a}}var y=[function(e){return"function"==typeof e?g(e):void 0},function(e){return e?void 0:p(function(e){return{dispatch:e}})},function(t){return t&&"object"==typeof t?p(function(e){return u(t,e)}):void 0}];var v=[function(e){return"function"==typeof e?g(e):void 0},function(e){return e?void 0:p(function(){return{}})}];function _(e,t,n){return Object(T.a)({},n,e,t)}var b=[function(e){return"function"==typeof e?(l=e,function(e,t){t.displayName;var a,r=t.pure,o=t.areMergedPropsEqual,i=!1;return function(e,t,n){e=l(e,t,n);return i?r&&o(e,a)||(a=e):(i=!0,a=e),a}}):void 0;var l},function(e){return e?void 0:function(){return _}}];var k=["initMapStateToProps","initMapDispatchToProps","initMergeProps"];function S(n,a,r,o){return function(e,t){return r(n(e,t),a(o,t),t)}}function E(r,o,i,l,e){var s,u,d,c,f,p=e.areStatesEqual,h=e.areOwnPropsEqual,m=e.areStatePropsEqual,n=!1;function a(e,t){var n=!h(t,u),a=!p(e,s);return s=e,u=t,n&&a?(d=r(s,u),o.dependsOnOwnProps&&(c=o(l,u)),f=i(d,c,u)):n?(r.dependsOnOwnProps&&(d=r(s,u)),o.dependsOnOwnProps&&(c=o(l,u)),f=i(d,c,u)):a?(e=r(s,u),t=!m(e,d),d=e,f=t?i(d,c,u):f):f}return function(e,t){return n?a(e,t):(d=r(s=e,u=t),c=o(l,u),f=i(d,c,u),n=!0,f)}}function F(e,t){var n=t.initMapStateToProps,a=t.initMapDispatchToProps,r=t.initMergeProps,t=Object(D.a)(t,k),n=n(e,t),a=a(e,t),r=r(e,t);return(t.pure?E:S)(n,a,r,e,t)}var z=["pure","areStatesEqual","areOwnPropsEqual","areStatePropsEqual","areMergedPropsEqual"];function w(n,e,a){for(var t=e.length-1;0<=t;t--){var r=e[t](n);if(r)return r}return function(e,t){throw new Error("Invalid value of type "+typeof n+" for "+a+" argument when connecting component "+t.wrappedComponentName+".")}}function W(e,t){return e===t}function V(e){var e=void 0===e?{}:e,t=e.connectHOC,d=void 0===t?i:t,t=e.mapStateToPropsFactories,c=void 0===t?v:t,t=e.mapDispatchToPropsFactories,f=void 0===t?y:t,t=e.mergePropsFactories,p=void 0===t?b:t,t=e.selectorFactory,h=void 0===t?F:t;return function(e,t,n,a){var a=a=void 0===a?{}:a,r=a.pure,r=void 0===r||r,o=a.areStatesEqual,o=void 0===o?W:o,i=a.areOwnPropsEqual,i=void 0===i?m:i,l=a.areStatePropsEqual,l=void 0===l?m:l,s=a.areMergedPropsEqual,s=void 0===s?m:s,a=Object(D.a)(a,z),u=w(e,c,"mapStateToProps"),t=w(t,f,"mapDispatchToProps"),n=w(n,p,"mergeProps");return d(h,Object(T.a)({methodName:"connect",getDisplayName:function(e){return"Connect("+e+")"},shouldHandleStateChanges:Boolean(e),initMapStateToProps:u,initMapDispatchToProps:t,initMergeProps:n,pure:r,areStatesEqual:o,areOwnPropsEqual:i,areStatePropsEqual:l,areMergedPropsEqual:s},a))}}var B=V();e=t(23);t=e.unstable_batchedUpdates,n=t},function(e,t,n){"use strict";t.__esModule=!0;var a=i(n(468)),r=i(n(480)),o="function"==typeof r.default&&"symbol"==typeof a.default?function(e){return typeof e}:function(e){return e&&"function"==typeof r.default&&e.constructor===r.default&&e!==r.default.prototype?"symbol":typeof e};function i(e){return e&&e.__esModule?e:{default:e}}t.default="function"==typeof r.default&&"symbol"===o(a.default)?function(e){return void 0===e?"undefined":o(e)}:function(e){return e&&"function"==typeof r.default&&e.constructor===r.default&&e!==r.default.prototype?"symbol":void 0===e?"undefined":o(e)}},function(e,t,n){"use strict";n(66),n(545),n(32),n(547)},function(e,t,n){"use strict";n.d(t,"a",function(){return w}),n.d(t,"b",function(){return x}),n.d(t,"c",function(){return m}),n.d(t,"d",function(){return C}),n.d(t,"e",function(){return h}),n.d(t,"f",function(){return E}),n.d(t,"g",function(){return L});function a(e){var t=Object(o.a)();return t.displayName=e,t}var r=n(58),t=n(0),l=n.n(t),s=n(55),o=n(416),u=n(57),d=n(42),t=n(184),c=n.n(t),i=(n(189),n(54)),t=n(100),f=n.n(t),p=a("Router-History"),h=a("Router"),m=function(n){function e(e){var t=n.call(this,e)||this;return t.state={location:e.history.location},t._isMounted=!1,t._pendingLocation=null,e.staticContext||(t.unlisten=e.history.listen(function(e){t._pendingLocation=e})),t}Object(r.a)(e,n),e.computeRootMatch=function(e){return{path:"/",url:"/",params:{},isExact:"/"===e}};var t=e.prototype;return t.componentDidMount=function(){var t=this;this._isMounted=!0,this.unlisten&&this.unlisten(),this.props.staticContext||(this.unlisten=this.props.history.listen(function(e){t._isMounted&&t.setState({location:e})})),this._pendingLocation&&this.setState({location:this._pendingLocation})},t.componentWillUnmount=function(){this.unlisten&&(this.unlisten(),this._isMounted=!1,this._pendingLocation=null)},t.render=function(){return l.a.createElement(h.Provider,{value:{history:this.props.history,location:this.state.location,match:e.computeRootMatch(this.state.location.pathname),staticContext:this.props.staticContext}},l.a.createElement(p.Provider,{children:this.props.children||null,value:this.props.history}))},e}(l.a.Component),g=(l.a.Component,function(e){function t(){return e.apply(this,arguments)||this}Object(r.a)(t,e);var n=t.prototype;return n.componentDidMount=function(){this.props.onMount&&this.props.onMount.call(this,this)},n.componentDidUpdate=function(e){this.props.onUpdate&&this.props.onUpdate.call(this,this,e)},n.componentWillUnmount=function(){this.props.onUnmount&&this.props.onUnmount.call(this,this)},n.render=function(){return null},t}(l.a.Component));var y={},v=1e4,_=0;function b(e,t){return void 0===t&&(t={}),"/"===(e=void 0===e?"/":e)?e:function(e){if(y[e])return y[e];var t=c.a.compile(e);return _<v&&(y[e]=t,_++),t}(e)(t,{pretty:!0})}function w(e){var r=e.computedMatch,o=e.to,e=e.push,i=void 0!==e&&e;return l.a.createElement(h.Consumer,null,function(e){e||Object(u.a)(!1);var t=e.history,e=e.staticContext,n=i?t.push:t.replace,a=Object(s.c)(r?"string"==typeof o?b(o,r.params):Object(d.a)({},o,{pathname:b(o.pathname,r.params)}):o);return e?(n(a),null):l.a.createElement(g,{onMount:function(){n(a)},onUpdate:function(e,t){t=Object(s.c)(t.to);Object(s.f)(t,Object(d.a)({},a,{key:t.key}))||n(a)},to:o})})}var M={},k=1e4,S=0;function E(o,e){var e=e="string"!=typeof(e=void 0===e?{}:e)&&!Array.isArray(e)?e:{path:e},t=e.path,n=e.exact,i=void 0!==n&&n,n=e.strict,l=void 0!==n&&n,n=e.sensitive,s=void 0!==n&&n;return[].concat(t).reduce(function(e,t){if(!t&&""!==t)return null;if(e)return e;var e=function(e,t){var n=""+t.end+t.strict+t.sensitive;if((n=M[n]||(M[n]={}))[e])return n[e];var a=[],t={regexp:c()(e,a,t),keys:a};return S<k&&(n[e]=t,S++),t}(t,{end:i,strict:l,sensitive:s}),n=e.regexp,e=e.keys,n=n.exec(o);if(!n)return null;var a=n[0],r=n.slice(1),n=o===a;return i&&!n?null:{path:t,url:"/"===t&&""===a?"/":a,isExact:n,params:e.reduce(function(e,t,n){return e[t.name]=r[n],e},{})}},null)}var x=function(e){function t(){return e.apply(this,arguments)||this}return Object(r.a)(t,e),t.prototype.render=function(){var o=this;return l.a.createElement(h.Consumer,null,function(e){e||Object(u.a)(!1);var t,n=o.props.location||e.location,a=o.props.computedMatch||(o.props.path?E(n.pathname,o.props):e.match),e=Object(d.a)({},e,{location:n,match:a}),n=o.props,a=n.children,r=n.component,n=n.render;return Array.isArray(a)&&(t=a,0===l.a.Children.count(t))&&(a=null),l.a.createElement(h.Provider,{value:e},e.match?a?"function"==typeof a?a(e):a:r?l.a.createElement(r,e):n?n(e):null:"function"==typeof a?a(e):null)})},t}(l.a.Component);l.a.Component;var C=function(e){function t(){return e.apply(this,arguments)||this}return Object(r.a)(t,e),t.prototype.render=function(){var e=this;return l.a.createElement(h.Consumer,null,function(n){n||Object(u.a)(!1);var a,r,o=e.props.location||n.location;return l.a.Children.forEach(e.props.children,function(e){var t;null==r&&l.a.isValidElement(e)&&(t=(a=e).props.path||e.props.from,r=t?E(o.pathname,Object(d.a)({},e.props,{path:t})):n.match)}),r?l.a.cloneElement(a,{location:o,computedMatch:r}):null})},t}(l.a.Component);function L(a){function e(e){var t=e.wrappedComponentRef,n=Object(i.a)(e,["wrappedComponentRef"]);return l.a.createElement(h.Consumer,null,function(e){return e||Object(u.a)(!1),l.a.createElement(a,Object(d.a)({},n,e,{ref:t}))})}var t="withRouter("+(a.displayName||a.name)+")";return e.displayName=t,e.WrappedComponent=a,f()(e,a)}l.a.useContext},function(e,t,n){"use strict";t.__esModule=!0;var o=l(n(2)),i=l(n(12)),a=l(n(8)),r=l(n(572)),n=l(n(573));function l(e){return e&&e.__esModule?e:{default:e}}r={Row:a.default.config(r.default,{transform:function(e,t){var n,a,r;return"type"in e&&(t("type","fixed | wrap | gutter","Row"),n=(t=e).type,t=(0,i.default)(t,["type"]),a=void 0,r=void(-1<(n=Array.isArray(n)?n:[n]).indexOf("fixed")&&(a=!0)),-1<n.indexOf("wrap")&&(r=!0),e=(0,o.default)({fixed:a,wrap:r},t)),e}}),Col:a.default.config(n.default)};t.default=r,e.exports=t.default},function(e,t,n){"use strict";function a(){return(a=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n,a=arguments[t];for(n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n])}return e}).apply(this,arguments)}n.d(t,"a",function(){return a})},function(e,t,n){"use strict";n(445)},function(e,t,n){"use strict";t.__esModule=!0,t.default={momentLocale:"zh-cn",Timeline:{expand:"灞曞紑",fold:"鏀惰捣"},Balloon:{close:"鍏抽棴"},Card:{expand:"灞曞紑",fold:"鏀惰捣"},Calendar:{today:"浠婂ぉ",now:"姝ゅ埢",ok:"纭畾",clear:"娓呴櫎",month:"鏈�",year:"骞�",prevYear:"涓婁竴骞�",nextYear:"涓嬩竴骞�",prevMonth:"涓婁釜鏈�",nextMonth:"涓嬩釜鏈�",prevDecade:"涓婂崄骞�",nextDecade:"鍚庡崄骞�",yearSelectAriaLabel:"閫夋嫨骞翠唤",monthSelectAriaLabel:"閫夋嫨鏈堜唤"},DatePicker:{placeholder:"璇烽�夋嫨鏃ユ湡",datetimePlaceholder:"璇烽�夋嫨鏃ユ湡鍜屾椂闂�",monthPlaceholder:"璇烽�夋嫨鏈�",yearPlaceholder:"璇烽�夋嫨骞�",weekPlaceholder:"璇烽�夋嫨鍛�",now:"姝ゅ埢",selectTime:"閫夋嫨鏃堕棿",selectDate:"閫夋嫨鏃ユ湡",ok:"纭畾",clear:"娓呴櫎",startPlaceholder:"璧峰鏃ユ湡",endPlaceholder:"缁撴潫鏃ユ湡",hour:"鏃�",minute:"鍒�",second:"绉�"},Dialog:{close:"鍏抽棴",ok:"纭畾",cancel:"鍙栨秷"},Drawer:{close:"鍏抽棴"},Message:{closeAriaLabel:"鍏抽棴"},Pagination:{prev:"涓婁竴椤�",next:"涓嬩竴椤�",goTo:"鍒扮",page:"椤�",go:"纭畾",total:"绗瑊current}椤碉紝鍏眥total}椤�",labelPrev:"涓婁竴椤碉紝褰撳墠绗瑊current}椤�",labelNext:"涓嬩竴椤碉紝褰撳墠绗瑊current}椤�",inputAriaLabel:"璇疯緭鍏ヨ烦杞埌绗嚑椤�",selectAriaLabel:"璇烽�夋嫨姣忛〉鏄剧ず鍑犳潯",pageSize:"姣忛〉鏄剧ず锛�"},Input:{clear:"娓呴櫎"},List:{empty:"娌℃湁鏁版嵁"},Select:{selectPlaceholder:"璇烽�夋嫨",autoCompletePlaceholder:"璇疯緭鍏�",notFoundContent:"鏃犻�夐」",maxTagPlaceholder:"宸查�夋嫨 {selected}/{total} 椤�",selectAll:"鍏ㄩ��"},TreeSelect:{maxTagPlaceholder:"宸查�夋嫨 {selected}/{total} 椤�",shortMaxTagPlaceholder:"宸查�夋嫨 {selected} 椤�"},Table:{empty:"娌℃湁鏁版嵁",ok:"纭",reset:"閲嶇疆",asc:"鍗囧簭",desc:"闄嶅簭",expanded:"宸插睍寮�",folded:"宸叉姌鍙�",filter:"绛涢��",selectAll:"鍏ㄩ��"},TimePicker:{placeholder:"璇烽�夋嫨鏃堕棿",clear:"娓呴櫎",hour:"鏃�",minute:"鍒�",second:"绉�",ok:"纭畾"},Transfer:{items:"椤�",item:"椤�",moveAll:"绉诲姩鍏ㄩ儴",searchPlaceholder:"璇疯緭鍏�",moveToLeft:"鎾ら攢閫変腑鍏冪礌",moveToRight:"鎻愪氦閫変腑鍏冪礌"},Upload:{card:{cancel:"鍙栨秷",addPhoto:"涓婁紶鍥剧墖",download:"涓嬭浇",delete:"鍒犻櫎"},drag:{text:"鐐瑰嚮鎴栬�呮嫋鍔ㄦ枃浠跺埌铏氱嚎妗嗗唴涓婁紶",hint:"鏀寔 docx, xls, PDF, rar, zip, PNG, JPG 绛夌被鍨嬬殑鏂囦欢"},upload:{delete:"鍒犻櫎"}},Search:{buttonText:"鎼滅储"},Tag:{delete:"鍒犻櫎"},Rating:{description:"璇勫垎閫夐」"},Switch:{on:"宸叉墦寮�",off:"宸插叧闂�"},Tab:{closeAriaLabel:"鍏抽棴"},Form:{Validate:{default:"%s 鏍¢獙澶辫触",required:"%s 鏄繀濉瓧娈�",format:{number:"%s 涓嶆槸鍚堟硶鐨勬暟瀛�",email:"%s 涓嶆槸鍚堟硶鐨� email 鍦板潃",url:"%s 涓嶆槸鍚堟硶鐨� URL 鍦板潃",tel:"%s 涓嶆槸鍚堟硶鐨勭數璇濆彿鐮�"},number:{length:"%s 闀垮害蹇呴』鏄� %s",min:"%s 涓嶅緱灏忎簬 %s",max:"%s 涓嶅緱澶т簬 %s",minLength:"%s 瀛楁瀛楃闀垮害涓嶅緱灏戜簬 %s",maxLength:"%s 瀛楁瀛楃闀垮害涓嶅緱瓒呰繃 %s"},string:{length:"%s 闀垮害蹇呴』鏄� %s",min:"%s 涓嶅緱灏忎簬 %s",max:"%s 涓嶅緱澶т簬 %s",minLength:"%s 闀垮害涓嶅緱灏戜簬 %s",maxLength:"%s 闀垮害涓嶅緱瓒呰繃 %s"},array:{length:"%s 涓暟蹇呴』鏄� %s",minLength:"%s 涓暟涓嶅緱灏戜簬 %s",maxLength:"%s 涓暟涓嶅緱瓒呰繃 %s"},pattern:"%s 鏁板�� %s 涓嶅尮閰嶆鍒� %s"}}},e.exports=t.default},function(e,t,n){"use strict";n.d(t,"m",function(){return p}),n.d(t,"j",function(){return c}),n.d(t,"c",function(){return f}),n.d(t,"g",function(){return h}),n.d(t,"k",function(){return m}),n.d(t,"l",function(){return y}),n.d(t,"i",function(){return g}),n.d(t,"b",function(){return v}),n.d(t,"f",function(){return _}),n.d(t,"h",function(){return b}),n.d(t,"a",function(){return w}),n.d(t,"e",function(){return M});function a(e){return 200===e.code&&l.a.success(e.message),e}var r=n(21),o=n(31),i=(n(51),n(25)),l=n.n(i),s=n(34),u=n(28),d={users:{totalCount:0,pageNumber:1,pagesAvailable:1,pageItems:[]},roles:{totalCount:0,pageNumber:1,pagesAvailable:1,pageItems:[]},permissions:{totalCount:0,pageNumber:1,pagesAvailable:1,pageItems:[]}},c=function(e){return function(t){return s.a.get("v1/auth/users",{params:e}).then(function(e){return t({type:u.l,data:e})})}},f=function(e){var e=Object(o.a)(e,2),t=e[0],e=e[1];return s.a.post("v1/auth/users",{username:t,password:e}).then(a)},p=function(e){return s.a.get("v1/auth/users/search",{params:{username:e}}).then(a)},h=function(e){return s.a.delete("v1/auth/users",{params:{username:e}}).then(a)},m=function(e){var e=Object(o.a)(e,2),t=e[0],e=e[1];return s.a.put("v1/auth/users",{username:t,newPassword:e}).then(a)},g=function(e){return function(t){return s.a.get("v1/auth/roles",{params:e}).then(function(e){return t({type:u.k,data:e})})}},y=function(e){return s.a.get("v1/auth/roles/search",{params:{role:e}}).then(a)},v=function(e){var e=Object(o.a)(e,2),t=e[0],e=e[1];return s.a.post("v1/auth/roles",{role:t,username:e}).then(a)},_=function(e){return s.a.delete("v1/auth/roles",{params:e}).then(a)},b=function(e){return function(t){return s.a.get("v1/auth/permissions",{params:e}).then(function(e){return t({type:u.h,data:e})})}},w=function(e){var e=Object(o.a)(e,3),t=e[0],n=e[1],e=e[2];return s.a.post("v1/auth/permissions",{role:t,resource:n,action:e}).then(a)},M=function(e){return s.a.delete("v1/auth/permissions",{params:e}).then(a)};t.d=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:d,t=1<arguments.length?arguments[1]:void 0;switch(t.type){case u.l:return Object(r.a)(Object(r.a)({},e),{},{users:Object(r.a)({},t.data)});case u.k:return Object(r.a)(Object(r.a)({},e),{},{roles:Object(r.a)({},t.data)});case u.h:return Object(r.a)(Object(r.a)({},e),{},{permissions:Object(r.a)({},t.data)});default:return e}}},function(e,t,n){"use strict";t.__esModule=!0;var n=n(696),n=(n=n)&&n.__esModule?n:{default:n};t.default=n.default,e.exports=t.default},function(e,t,n){"use strict";n.d(t,"b",function(){return o}),n.d(t,"c",function(){return i}),n.d(t,"a",function(){return l}),n.d(t,"d",function(){return s});var a=n(72),r=n(31),o=function(e,t){e=e.split("?"),e=Object(r.a)(e,2)[1],e=(void 0===e?"":e).split("&").filter(function(e){return t===e.split("=")[0]}),e=Object(r.a)(e,1)[0],e=(void 0===e?"":e).split("="),e=Object(r.a)(e,2)[1];return void 0===e?"":e},i=function(e){try{if("object"===Object(a.a)(JSON.parse(e)))return!0}catch(e){}return!1},l=function(e,t){return[e,"?",Object.keys(t).map(function(e){return[e,t[e]].join("=")}).join("&")].join("")},s=function(e){return"[object Object]"===Object.prototype.toString.call(e)}},function(e,t,n){"use strict";n(32);var a=n(18),r=n.n(a),o=n(14),i=n(15),l=n(22),s=n(17),u=n(16),a=n(0),d=n.n(a),a=n(65),c=n.n(a),a=(n(35),n(19)),f=n.n(a),p=n(89),a=(n(26),n(8)),a=n.n(a),h=n(1),m=(n(633),(0,a.a.config)(((a=function(e){Object(s.a)(n,e);var t=Object(u.a)(n);function n(e){return Object(o.a)(this,n),(e=t.call(this,e))._namespace=Object(h.a)("namespace")||"",e.state={nownamespace:window.nownamespace||e._namespace||"",namespaceList:window.namespaceList||[]},e}return Object(i.a)(n,[{key:"componentDidMount",value:function(){}},{key:"getLink",value:function(e,t){var n=this;null===window[t]?Object(h.b)({url:"com.alibaba.nacos.service.getLink",data:{linkKey:e},success:function(e){200===e.code&&(window[t]=e.data,n.setState(Object(p.a)({},t,e.data)))}}):this.setState(Object(p.a)({},t,window[t]))}},{key:"changeNameSpace",value:function(e,t){localStorage.setItem("namespace",e),this.setnamespace(e||""),Object(h.c)({namespace:e||"",namespaceShowName:t}),window.nownamespace=e,window.namespaceShowName=t,this.calleeParent(!0),this.props.setNowNameSpace&&this.props.setNowNameSpace(t,e)}},{key:"calleeParent",value:function(){this.props.namespaceCallBack&&this.props.namespaceCallBack(0<arguments.length&&void 0!==arguments[0]&&arguments[0])}},{key:"getNameSpaces",value:function(){var t=this,e=this.props.locale,n=void 0===e?{}:e;window.namespaceList&&window.namespaceList.length?this.handleNameSpaces(window.namespaceList):Object(h.b)({type:"get",url:"v1/console/namespaces",success:function(e){200===e.code?t.handleNameSpaces(e.data):f.a.alert({title:n.notice,content:e.message})},error:function(){window.namespaceList=[],t.handleNameSpaces(window.namespaceList)}})}},{key:"handleNameSpaces",value:function(e){for(var t=Object(h.a)("namespace")||"",n=(window.namespaceList=e,window.nownamespace=t,""),a=0;a<e.length;a++)if(e[a].namespace===t){n=e[a].namespaceShowName;break}window.namespaceShowName=n,Object(h.c)("namespace",t||""),localStorage.setItem("namespace",t),this.props.setNowNameSpace&&this.props.setNowNameSpace(n,t),this.setState({nownamespace:t,namespaceList:e}),this.calleeParent()}},{key:"setnamespace",value:function(e){this.setState({nownamespace:e})}},{key:"rendernamespace",value:function(e){var a=this,r=this.state.nownamespace;return e.map(function(e,t){var n=e.namespace===r?{color:"#209BFA",paddingRight:10,border:"none",fontSize:14}:{color:"#666",paddingRight:10,border:"none",fontSize:14};return d.a.createElement("div",{key:t,style:{cursor:"pointer"}},0===t?"":d.a.createElement("span",{style:{marginRight:8,color:"#999"}},"|"),d.a.createElement("span",{style:n,onClick:a.changeNameSpace.bind(a,e.namespace,e.namespaceShowName),key:t},e.namespaceShowName))})}},{key:"render",value:function(){var e=this.state.namespaceList||[],t=this.props.title||"";return d.a.createElement("div",{className:e.length?"namespacewrapper":"",style:{display:"flex",flexWrap:"wrap",alignItems:"center",marginTop:8,marginBottom:16}},t?d.a.createElement("p",{style:{height:30,lineHeight:"30px",paddingTop:0,paddingBottom:0,borderLeft:"2px solid #09c",float:"left",margin:0,paddingLeft:10}},this.props.title):"",this.rendernamespace(e))}}]),n}(d.a.Component)).displayName="NameSpaceList",a=a))||a),g=n(69),a=(n(634),function(e){Object(s.a)(a,e);var n=Object(u.a)(a);function a(e){var t;return Object(o.a)(this,a),(t=n.call(this,e)).state={instanceData:[],currRegionId:"",url:e.url||"/diamond-ops/env/domain",left:e.left,right:e.right,regionWidth:700,hideRegionList:!1},t.currRegionId="",t.styles={title:{margin:0,lineHeight:"32px",display:"inline-block",textIndent:"8px",marginRight:"8px",borderLeft:"2px solid #88b7E0",fontSize:"16px"}},t.nameSpaceList=d.a.createRef(),t.mainRef=null,t.titleRef=null,t.regionRef=null,t.extraRef=null,t.resizer=null,t.timer=null,t.handleResize=t.handleResize.bind(Object(l.a)(t)),t.handleAliyunNav=t.handleAliyunNav.bind(Object(l.a)(t)),window.viewframeSetting||(window.viewframeSetting={}),t}return Object(i.a)(a,[{key:"componentDidMount",value:function(){var e=this.nameSpaceList.current;e&&e.getInstance().getNameSpaces()}},{key:"componentWillUnmount",value:function(){c()(window).unbind("resize",this.handleResize),window.postMessage({type:"CONSOLE_HIDE_REGION"},window.location),c()(".aliyun-console-regionbar").hide()}},{key:"UNSAFE_componentWillReceiveProps",value:function(e){this.setState({url:e.url,left:e.left,right:e.right})}},{key:"handleAliyunNav",value:function(){var e=this,t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},t=t&&t.data||{},n=t.type,a=t.payload;switch(n){case"TOPBAR_SIDEBAR_DID_MOUNT":this.handleRegionListStatus(),this.changeRegionBarRegionId(this.currRegionId),setTimeout(function(){e.changeRegionBarRegionId(e.currRegionId)},1e3);break;case"CONSOLE_REGION_CHANGE":this.changeTableData(a.toRegionId)}}},{key:"handleRegionListStatus",value:function(){var e=this,t=window.globalConfig&&window.globalConfig.isParentEdas();this.setState({hideRegionList:!t&&-1===window.location.search.indexOf("hideTopbar=")},function(){return e.setRegionWidth()})}},{key:"handleResize",value:function(){var e=this;clearTimeout(this.timer),this.timer=setTimeout(function(){e.setRegionWidth()},100)}},{key:"setRegionWidth",value:function(){try{var e=c()(this.mainRef).width(),t=c()(this.titleRef).width(),n=e-c()(this.extraRef).width()-t-50;this.setState({regionWidth:100<n?n:100})}catch(e){}}},{key:"getRegionList",value:function(){var e,t=this;window._regionList?this.handleRegionList(window._regionList):((e=this.nameSpaceList.current)&&e.getInstance().getNameSpaces(),Object(h.b)({url:this.state.url,data:{},success:function(e){e&&e.data&&(window._regionList=e.data,t.handleRegionList(e.data))}}))}},{key:"handleRegionList",value:function(){for(var e=this,t="",n=(0<arguments.length&&void 0!==arguments[0]?arguments[0]:{}).envGroups,a=[],r=0;r<n.length;r++)for(var o=n[r].envs||[],a=o,i=0;i<o.length;i++)o[i].active&&(t=o[i].serverId);this.currRegionId=t||a[0]&&a[0].serverId,Object(h.c)("serverId",this.currRegionId),this.setRegionBarRegionList(a,this.currRegionId),this.changeRegionBarRegionId(this.currRegionId),setTimeout(function(){e.changeRegionBarRegionId(e.currRegionId)},1e3);var l=this.nameSpaceList.current;l&&l.getInstance().getNameSpaces(),this.setState({currRegionId:t,instanceData:a})}},{key:"changeTableData",value:function(a){var e,r;Object(h.c)("serverId",a),this.state.currRegionId!==a&&(this.currRegionId=a,e=this.state.instanceData,r=!1,window.globalConfig.isParentEdas()&&(r=!0),e.forEach(function(e){var t,n;e.serverId===a&&(t=window.location.hash.split("?")[0],r?(Object(h.c)("serverId",e.serverId),n=window.location.href,window.location.href=n):(n=e.domain+window.location.search+t,-1===t.indexOf("serverId")&&(-1===t.indexOf("?")?n+="?serverId=".concat(a):n+="&serverId=".concat(a)),window.location.href="".concat(window.location.protocol,"//").concat(n)))}))}},{key:"setRegionBarRegionList",value:function(e,t){window.viewframeSetting&&(window.viewframeSetting.regionList=e,window.postMessage({type:"TOGGLE_REGIONBAR_STATUS",payload:{regionList:e,defaultRegionId:t}},window.location))}},{key:"changeRegionBarRegionId",value:function(e){window.viewframeSetting&&(window.viewframeSetting.defaultRegionId=e),window.postMessage({type:"SET_ACTIVE_REGION_ID",payload:{defaultRegionId:e}},window.location)}},{key:"render",value:function(){var n=this;return d.a.createElement("div",{style:{marginTop:this.state.left?0:-30}},d.a.createElement("div",{ref:function(e){return n.mainRef=e},className:"clearfix"},d.a.createElement("div",{style:{overflow:"hidden"}},d.a.createElement("div",{id:"left",style:{float:"left",display:"inline-block",marginRight:20}},d.a.createElement("div",{ref:function(e){return n.titleRef=e},style:{display:"inline-block",verticalAlign:"top"}},"string"==typeof this.state.left?d.a.createElement(g.a,{title:this.state.left}):this.state.left),this.state.hideRegionList?null:d.a.createElement("div",{ref:function(e){return n.regionRef=e},style:{width:this.state.regionWidth,display:"inline-block",lineHeight:"40px",marginLeft:20}},this.state.instanceData.map(function(e,t){return d.a.createElement(r.a,{key:e.serverId,type:n.state.currRegionId===e.serverId?"primary":"normal",style:{fontSize:"12px",marginRight:10,backgroundColor:n.state.currRegionId===e.serverId?"#546478":"#D9DEE4"},onClick:n.changeTableData.bind(n,e.serverId)}," ",e.name," ")}))),d.a.createElement("div",{ref:function(e){return n.extraRef=e},style:{float:"right",display:"inline-block",paddingTop:6}},"[object Function]"===Object.prototype.toString.call(this.state.right)?this.state.right():this.state.right)),this.props.namespaceCallBack&&d.a.createElement(m,{ref:this.nameSpaceList,namespaceCallBack:this.props.namespaceCallBack,setNowNameSpace:this.props.setNowNameSpace})))}}]),a}(d.a.Component));t.a=a},function(e,t,n){"use strict";n(543)},function(e,t,n){"use strict";t.__esModule=!0;var i=h(n(2)),l=h(n(12)),a=h(n(8)),r=h(n(373)),o=h(n(374)),s=h(n(169)),u=h(n(614)),d=h(n(622)),c=h(n(375)),f=h(n(623)),p=h(n(624)),n=h(n(625));function h(e){return e&&e.__esModule?e:{default:e}}r.default.SubMenu=o.default,r.default.Item=s.default,r.default.CheckboxItem=u.default,r.default.RadioItem=d.default,r.default.PopupItem=c.default,r.default.Group=f.default,r.default.Divider=p.default,r.default.create=n.default;t.default=a.default.config(r.default,{transform:function(e,t){var n,a,r,o;return"indentSize"in e&&(t("indentSize","inlineIndent","Menu"),n=(o=e).indentSize,o=(0,l.default)(o,["indentSize"]),e=(0,i.default)({inlineIndent:n},o)),"onDeselect"in e&&(t("onDeselect","onSelect","Menu"),e.onDeselect&&(a=(n=e).onDeselect,r=n.onSelect,o=(0,l.default)(n,["onDeselect","onSelect"]),e=(0,i.default)({onSelect:function(e,t,n){n.select||a(n.key),r&&r(e,t,n)}},o))),e}}),e.exports=t.default},function(e,t,n){"use strict";n(43),n(70),n(75),n(459)},function(e,t,n){"use strict";n(43),n(70),n(75),n(448)},function(e,t,n){"use strict";t.__esModule=!0;var a,g=c(n(2)),y=c(n(12)),r=c(n(4)),o=c(n(6)),i=c(n(7)),v=c(n(13)),_=c(n(0)),l=c(n(3)),s=n(30),u=n(11),b=c(n(24)),d=c(n(8)),n=c(n(44));function c(e){return e&&e.__esModule?e:{default:e}}f=_.default.Component,(0,i.default)(p,f),p.getDerivedStateFromProps=function(e,t){return"checked"in e&&e.checked!==t.checked?{checked:!!e.checked}:null},p.prototype.onChange=function(e){var t=!this.state.checked;"checked"in this.props||this.setState({checked:t}),this.props.onChange(t,e),this.props.onClick&&this.props.onClick(e)},p.prototype.onKeyDown=function(e){e.keyCode!==u.KEYCODE.ENTER&&e.keyCode!==u.KEYCODE.SPACE||this.onChange(e),this.props.onKeyDown&&this.props.onKeyDown(e)},p.prototype.render=function(){var e=this.props,t=e.prefix,n=e.className,a=e.disabled,r=e.readOnly,o=e.size,i=e.loading,l=e.autoWidth,s=e.checkedChildren,u=e.unCheckedChildren,d=e.rtl,c=e.isPreview,f=e.renderPreview,p=e.locale,e=(0,y.default)(e,["prefix","className","disabled","readOnly","size","loading","autoWidth","checkedChildren","unCheckedChildren","rtl","isPreview","renderPreview","locale"]),h=this.state.checked,m=h?"on":"off",s=h?s:u,u=o,u=("small"!==o&&"medium"!==o&&(u="medium"),(0,v.default)(((o={})[t+"switch"]=!0,o[t+"switch-loading"]=i,o[t+"switch-"+m]=!0,o[t+"switch-"+u]=!0,o[t+"switch-auto-width"]=l,o[n]=n,o))),l=void 0,l=a||r?{disabled:!0}:{onClick:this.onChange,tabIndex:0,onKeyDown:this.onKeyDown,disabled:!1};return c?(a=(0,v.default)(n,((o={})[t+"form-preview"]=!0,o)),"renderPreview"in this.props?_.default.createElement("div",(0,g.default)({className:a},e),f(h,this.props)):_.default.createElement("p",(0,g.default)({className:a},e),s||p[m])):_.default.createElement("div",(0,g.default)({role:"switch",dir:d?"rtl":void 0,tabIndex:"0"},e,{className:u},l,{"aria-checked":h}),_.default.createElement("div",{className:t+"switch-btn"},i&&_.default.createElement(b.default,{type:"loading",className:t+"switch-inner-icon"})),_.default.createElement("div",{className:t+"switch-children"},s))},a=i=p,i.contextTypes={prefix:l.default.string},i.propTypes={prefix:l.default.string,rtl:l.default.bool,pure:l.default.bool,className:l.default.string,style:l.default.object,checkedChildren:l.default.any,unCheckedChildren:l.default.any,onChange:l.default.func,checked:l.default.bool,defaultChecked:l.default.bool,disabled:l.default.bool,loading:l.default.bool,size:l.default.oneOf(["medium","small"]),onClick:l.default.func,onKeyDown:l.default.func,isPreview:l.default.bool,renderPreview:l.default.func,autoWidth:l.default.bool,locale:l.default.object},i.defaultProps={prefix:"next-",size:"medium",disabled:!1,defaultChecked:!1,isPreview:!1,loading:!1,readOnly:!1,autoWidth:!1,onChange:function(){},locale:n.default.Switch};var f,l=a;function p(e,t){(0,r.default)(this,p);t=(0,o.default)(this,f.call(this,e,t)),e=e.checked||e.defaultChecked;return t.onChange=t.onChange.bind(t),t.onKeyDown=t.onKeyDown.bind(t),t.state={checked:e},t}l.displayName="Switch",t.default=d.default.config((0,s.polyfill)(l)),e.exports=t.default},function(e,t,n){"use strict";function a(e,t){if(null==e)return{};for(var n,a={},r=Object.keys(e),o=0;o<r.length;o++)n=r[o],0<=t.indexOf(n)||(a[n]=e[n]);return a}n.d(t,"a",function(){return a})},function(e,t,n){"use strict";n.d(t,"a",function(){return l}),n.d(t,"b",function(){return c}),n.d(t,"d",function(){return p}),n.d(t,"c",function(){return O}),n.d(t,"f",function(){return i}),n.d(t,"e",function(){return D});var E=n(42);function s(e){return"/"===e.charAt(0)}function u(e,t){for(var n=t,a=n+1,r=e.length;a<r;n+=1,a+=1)e[n]=e[a];e.pop()}var d=function(e,t){void 0===t&&(t="");var n=e&&e.split("/")||[],a=t&&t.split("/")||[],r=e&&s(e),t=t&&s(t),r=r||t;if(e&&s(e)?a=n:n.length&&(a.pop(),a=a.concat(n)),!a.length)return"/";e=!!a.length&&("."===(t=a[a.length-1])||".."===t||""===t);for(var o=0,i=a.length;0<=i;i--){var l=a[i];"."===l?u(a,i):".."===l?(u(a,i),o++):o&&(u(a,i),o--)}if(!r)for(;o--;)a.unshift("..");return!r||""===a[0]||a[0]&&s(a[0])||a.unshift(""),n=a.join("/"),e&&"/"!==n.substr(-1)&&(n+="/"),n};function o(e){return e.valueOf?e.valueOf():Object.prototype.valueOf.call(e)}var a=function n(t,a){return t===a||null!=t&&null!=a&&(Array.isArray(t)?Array.isArray(a)&&t.length===a.length&&t.every(function(e,t){return n(e,a[t])}):("object"==typeof t||"object"==typeof a)&&(e=o(t),r=o(a),e!==t||r!==a?n(e,r):Object.keys(Object.assign({},t,a)).every(function(e){return n(t[e],a[e])})));var e,r},x=n(57);function C(e){return"/"===e.charAt(0)?e:"/"+e}function r(e){return"/"===e.charAt(0)?e.substr(1):e}function L(e,t){return a=t,0===(n=e).toLowerCase().indexOf(a.toLowerCase())&&-1!=="/?#".indexOf(n.charAt(a.length))?e.substr(t.length):e;var n,a}function T(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function D(e){var t=e.pathname,n=e.search,e=e.hash,t=t||"/";return n&&"?"!==n&&(t+="?"===n.charAt(0)?n:"?"+n),e&&"#"!==e&&(t+="#"===e.charAt(0)?e:"#"+e),t}function O(e,t,n,a){var r,o,i,l;"string"==typeof e?(i=o="",-1!==(l=(r=(r=e)||"/").indexOf("#"))&&(i=r.substr(l),r=r.substr(0,l)),-1!==(l=r.indexOf("?"))&&(o=r.substr(l),r=r.substr(0,l)),(l={pathname:r,search:"?"===o?"":o,hash:"#"===i?"":i}).state=t):(void 0===(l=Object(E.a)({},e)).pathname&&(l.pathname=""),l.search?"?"!==l.search.charAt(0)&&(l.search="?"+l.search):l.search="",l.hash?"#"!==l.hash.charAt(0)&&(l.hash="#"+l.hash):l.hash="",void 0!==t&&void 0===l.state&&(l.state=t));try{l.pathname=decodeURI(l.pathname)}catch(e){throw e instanceof URIError?new URIError('Pathname "'+l.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):e}return n&&(l.key=n),a?l.pathname?"/"!==l.pathname.charAt(0)&&(l.pathname=d(l.pathname,a.pathname)):l.pathname=a.pathname:l.pathname||(l.pathname="/"),l}function i(e,t){return e.pathname===t.pathname&&e.search===t.search&&e.hash===t.hash&&e.key===t.key&&a(e.state,t.state)}function N(){var r=null;var a=[];return{setPrompt:function(e){return r=e,function(){r===e&&(r=null)}},confirmTransitionTo:function(e,t,n,a){null!=r?"string"==typeof(e="function"==typeof r?r(e,t):r)?"function"==typeof n?n(e,a):a(!0):a(!1!==e):a(!0)},appendListener:function(e){var t=!0;function n(){t&&e.apply(void 0,arguments)}return a.push(n),function(){t=!1,a=a.filter(function(e){return e!==n})}},notifyListeners:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];a.forEach(function(e){return e.apply(void 0,t)})}}}var P=!("undefined"==typeof window||!window.document||!window.document.createElement);function j(e,t){t(window.confirm(e))}var Y="popstate",I="hashchange";function R(){try{return window.history.state||{}}catch(e){return{}}}function l(e){void 0===e&&(e={}),P||Object(x.a)(!1);var r=window.history,o=(-1===(n=window.navigator.userAgent).indexOf("Android 2.")&&-1===n.indexOf("Android 4.0")||-1===n.indexOf("Mobile Safari")||-1!==n.indexOf("Chrome")||-1!==n.indexOf("Windows Phone"))&&(window.history&&"pushState"in window.history),t=!(-1===window.navigator.userAgent.indexOf("Trident")),n=e,a=n.forceRefresh,i=void 0!==a&&a,a=n.getUserConfirmation,l=void 0===a?j:a,a=n.keyLength,s=void 0===a?6:a,u=e.basename?T(C(e.basename)):"";function d(e){var e=e||{},t=e.key,e=e.state,n=window.location,n=n.pathname+n.search+n.hash;return O(n=u?L(n,u):n,e,t)}function c(){return Math.random().toString(36).substr(2,s)}var f=N();function p(e){Object(E.a)(S,e),S.length=r.length,f.notifyListeners(S.location,S.action)}function h(e){void 0===e.state&&-1===navigator.userAgent.indexOf("CriOS")||y(d(e.state))}function m(){y(d(R()))}var g=!1;function y(n){g?(g=!1,p()):f.confirmTransitionTo(n,"POP",l,function(e){var t;e?p({action:"POP",location:n}):(e=n,t=S.location,-1===(t=v.indexOf(t.key))&&(t=0),e=v.indexOf(e.key),(t-=e=-1===e?0:e)&&(g=!0,b(t)))})}var n=d(R()),v=[n.key];function _(e){return u+D(e)}function b(e){r.go(e)}var w=0;function M(e){1===(w+=e)&&1===e?(window.addEventListener(Y,h),t&&window.addEventListener(I,m)):0===w&&(window.removeEventListener(Y,h),t&&window.removeEventListener(I,m))}var k=!1;var S={length:r.length,action:"POP",location:n,createHref:_,push:function(e,t){var a=O(e,t,c(),S.location);f.confirmTransitionTo(a,"PUSH",l,function(e){var t,n;e&&(e=_(a),t=a.key,n=a.state,o?(r.pushState({key:t,state:n},null,e),i?window.location.href=e:(t=v.indexOf(S.location.key),(n=v.slice(0,t+1)).push(a.key),v=n,p({action:"PUSH",location:a}))):window.location.href=e)})},replace:function(e,t){var a=O(e,t,c(),S.location);f.confirmTransitionTo(a,"REPLACE",l,function(e){var t,n;e&&(e=_(a),n=a.key,t=a.state,o?(r.replaceState({key:n,state:t},null,e),i?window.location.replace(e):(-1!==(n=v.indexOf(S.location.key))&&(v[n]=a.key),p({action:"REPLACE",location:a}))):window.location.replace(e))})},go:b,goBack:function(){b(-1)},goForward:function(){b(1)},block:function(e){var t=f.setPrompt(e=void 0===e?!1:e);return k||(M(1),k=!0),function(){return k&&(k=!1,M(-1)),t()}},listen:function(e){var t=f.appendListener(e);return M(1),function(){M(-1),t()}}};return S}var b="hashchange",w={hashbang:{encodePath:function(e){return"!"===e.charAt(0)?e:"!/"+r(e)},decodePath:function(e){return"!"===e.charAt(0)?e.substr(1):e}},noslash:{encodePath:r,decodePath:C},slash:{encodePath:C,decodePath:C}};function M(e){var t=e.indexOf("#");return-1===t?e:e.slice(0,t)}function k(){var e=window.location.href,t=e.indexOf("#");return-1===t?"":e.substring(t+1)}function S(e){window.location.replace(M(window.location.href)+"#"+e)}function c(e){void 0===e&&(e={}),P||Object(x.a)(!1);var t=window.history,n=(window.navigator.userAgent.indexOf("Firefox"),e),a=n.getUserConfirmation,r=void 0===a?j:a,a=n.hashType,n=void 0===a?"slash":a,o=e.basename?T(C(e.basename)):"",a=w[n],i=a.encodePath,l=a.decodePath;function s(){var e=l(k());return O(e=o?L(e,o):e)}var u=N();function d(e){Object(E.a)(_,e),_.length=t.length,u.notifyListeners(_.location,_.action)}var c=!1,f=null;function p(){var n,e,t=k(),a=i(t);t!==a?S(a):(t=s(),a=_.location,!c&&(e=t,(a=a).pathname===e.pathname&&a.search===e.search&&a.hash===e.hash)||f===D(t)||(f=null,n=t,c?(c=!1,d()):u.confirmTransitionTo(n,"POP",r,function(e){var t;e?d({action:"POP",location:n}):(e=n,t=_.location,-1===(t=h.lastIndexOf(D(t)))&&(t=0),e=h.lastIndexOf(D(e)),(t-=e=-1===e?0:e)&&(c=!0,m(t)))})))}var e=k(),n=i(e),a=(e!==n&&S(n),s()),h=[D(a)];function m(e){t.go(e)}var g=0;function y(e){1===(g+=e)&&1===e?window.addEventListener(b,p):0===g&&window.removeEventListener(b,p)}var v=!1;var _={length:t.length,action:"POP",location:a,createHref:function(e){var t=document.querySelector("base"),n="";return(n=t&&t.getAttribute("href")?M(window.location.href):n)+"#"+i(o+D(e))},push:function(e,t){var n=O(e,void 0,void 0,_.location);u.confirmTransitionTo(n,"PUSH",r,function(e){var t;e&&(e=D(n),t=i(o+e),k()!==t?(f=e,window.location.hash=t,t=h.lastIndexOf(D(_.location)),(t=h.slice(0,t+1)).push(e),h=t,d({action:"PUSH",location:n})):d())})},replace:function(e,t){var n=O(e,void 0,void 0,_.location);u.confirmTransitionTo(n,"REPLACE",r,function(e){var t;e&&(e=D(n),t=i(o+e),k()!==t&&(f=e,S(t)),-1!==(t=h.indexOf(D(_.location)))&&(h[t]=e),d({action:"REPLACE",location:n}))})},go:m,goBack:function(){m(-1)},goForward:function(){m(1)},block:function(e){var t=u.setPrompt(e=void 0===e?!1:e);return v||(y(1),v=!0),function(){return v&&(v=!1,y(-1)),t()}},listen:function(e){var t=u.appendListener(e);return y(1),function(){y(-1),t()}}};return _}function f(e,t,n){return Math.min(Math.max(e,t),n)}function p(e){var e=e=void 0===e?{}:e,a=e.getUserConfirmation,t=e.initialEntries,t=void 0===t?["/"]:t,n=e.initialIndex,e=e.keyLength,r=void 0===e?6:e,o=N();function i(e){Object(E.a)(u,e),u.length=u.entries.length,o.notifyListeners(u.location,u.action)}function l(){return Math.random().toString(36).substr(2,r)}e=f(void 0===n?0:n,0,t.length-1),n=t.map(function(e){return O(e,void 0,"string"!=typeof e&&e.key||l())});function s(e){var t=f(u.index+e,0,u.entries.length-1),n=u.entries[t];o.confirmTransitionTo(n,"POP",a,function(e){e?i({action:"POP",location:n,index:t}):i()})}var u={length:n.length,action:"POP",location:n[e],index:e,entries:n,createHref:D,push:function(e,t){var n=O(e,t,l(),u.location);o.confirmTransitionTo(n,"PUSH",a,function(e){var t;e&&(e=u.index+1,(t=u.entries.slice(0)).length>e?t.splice(e,t.length-e,n):t.push(n),i({action:"PUSH",location:n,index:e,entries:t}))})},replace:function(e,t){var n=O(e,t,l(),u.location);o.confirmTransitionTo(n,"REPLACE",a,function(e){e&&i({action:"REPLACE",location:u.entries[u.index]=n})})},go:s,goBack:function(){s(-1)},goForward:function(){s(1)},canGo:function(e){return 0<=(e=u.index+e)&&e<u.entries.length},block:function(e){return o.setPrompt(e=void 0===e?!1:e)},listen:function(e){return o.appendListener(e)}};return u}},function(e,t,n){"use strict";var r=n(363),a=Object.prototype.toString;function o(e){return"[object Array]"===a.call(e)}function i(e){return void 0===e}function l(e){return null!==e&&"object"==typeof e}function s(e){if("[object Object]"!==a.call(e))return!1;e=Object.getPrototypeOf(e);return null===e||e===Object.prototype}function u(e){return"[object Function]"===a.call(e)}function d(e,t){if(null!=e)if(o(e="object"!=typeof e?[e]:e))for(var n=0,a=e.length;n<a;n++)t.call(null,e[n],n,e);else for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.call(null,e[r],r,e)}e.exports={isArray:o,isArrayBuffer:function(e){return"[object ArrayBuffer]"===a.call(e)},isBuffer:function(e){return null!==e&&!i(e)&&null!==e.constructor&&!i(e.constructor)&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)},isFormData:function(e){return"undefined"!=typeof FormData&&e instanceof FormData},isArrayBufferView:function(e){return e="undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&e.buffer instanceof ArrayBuffer},isString:function(e){return"string"==typeof e},isNumber:function(e){return"number"==typeof e},isObject:l,isPlainObject:s,isUndefined:i,isDate:function(e){return"[object Date]"===a.call(e)},isFile:function(e){return"[object File]"===a.call(e)},isBlob:function(e){return"[object Blob]"===a.call(e)},isFunction:u,isStream:function(e){return l(e)&&u(e.pipe)},isURLSearchParams:function(e){return"undefined"!=typeof URLSearchParams&&e instanceof URLSearchParams},isStandardBrowserEnv:function(){return("undefined"==typeof navigator||"ReactNative"!==navigator.product&&"NativeScript"!==navigator.product&&"NS"!==navigator.product)&&("undefined"!=typeof window&&"undefined"!=typeof document)},forEach:d,merge:function n(){var a={};function e(e,t){s(a[t])&&s(e)?a[t]=n(a[t],e):s(e)?a[t]=n({},e):o(e)?a[t]=e.slice():a[t]=e}for(var t=0,r=arguments.length;t<r;t++)d(arguments[t],e);return a},extend:function(n,e,a){return d(e,function(e,t){n[t]=a&&"function"==typeof e?r(e,a):e}),n},trim:function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")},stripBOM:function(e){return e=65279===e.charCodeAt(0)?e.slice(1):e}}},function(e,t,n){"use strict";n.d(t,"a",function(){return o});var a=!0,r="Invariant failed";function o(e,t){if(!e){if(a)throw new Error(r);e="function"==typeof t?t():t;throw new Error(e?r+": "+e:r)}}},function(e,t,n){"use strict";function a(e,t){return(a=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function r(e,t){e.prototype=Object.create(t.prototype),a(e.prototype.constructor=e,t)}n.d(t,"a",function(){return r})},function(e,t,n){"use strict";n(43),n(175),n(75),n(80),n(36),n(662)},function(e,t,n){"use strict";t.__esModule=!0;var o=l(n(2)),i=l(n(12)),a=l(n(8)),r=l(n(686)),n=l(n(689));function l(e){return e&&e.__esModule?e:{default:e}}r.default.Item=n.default,r.default.TabPane=a.default.config(n.default,{transform:function(e,t){return t("Tab.TabPane","Tab.Item","Tab"),e}}),t.default=a.default.config(r.default,{transform:function(e,t){var n,a,r;return"type"in e&&(t("type","shape","Tab"),r=(n=e).type,n=(0,i.default)(n,["type"]),e=(0,o.default)({shape:r},n)),"resDirection"in e&&(n=(r=e).resDirection,r=(0,i.default)(r,["resDirection"]),a=void 0,"horizontal"===n?(t("resDirection=horizontal","excessMode=slide","Tab"),a="slide"):"vertical"===n&&(t("resDirection=vertical","excessMode=dropdown","Tab"),a="dropdown"),e=(0,o.default)({excessMode:a},r)),"tabBarExtraContent"in e&&(t("tabBarExtraContent","extra","Tab"),a=(n=e).tabBarExtraContent,r=(0,i.default)(n,["tabBarExtraContent"]),e=(0,o.default)({extra:a},r)),e}}),e.exports=t.default},function(e,t,n){"use strict";n.d(t,"a",function(){return o});var a=n(114);var r=n(134);function o(e){return function(e){if(Array.isArray(e))return Object(a.a)(e)}(e)||function(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||Object(r.a)(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}},function(e,t,n){"use strict";t.__esModule=!0;var a=y(n(2)),r=y(n(12)),o=y(n(4)),i=y(n(6)),l=y(n(7)),s=y(n(0)),u=y(n(8)),d=y(n(348)),c=y(n(531)),f=y(n(349)),p=y(n(350)),h=y(n(533)),m=y(n(534)),g=n(11);function y(e){return e&&e.__esModule?e:{default:e}}v=s.default.Component,(0,l.default)(_,v),_.prototype.saveRef=function(e){this.overlayRef=e},_.prototype.getContent=function(){return this.overlayRef?this.overlayRef.getContent():null},_.prototype.getContentNode=function(){return this.overlayRef?this.overlayRef.getContentNode():null},_.prototype.render=function(){var e=this.props,t=e.v2,e=(0,r.default)(e,["v2"]);return t?("needAdjust"in e&&(g.log.deprecated("needAdjust","needAdjust","Overlay v2"),e.autoAdjust=e.needAdjust,delete e.needAdjust),s.default.createElement(c.default,e)):s.default.createElement(d.default,(0,a.default)({},e,{ref:this.saveRef}))};var v,n=_;function _(e){(0,o.default)(this,_);e=(0,i.default)(this,v.call(this,e));return e.overlayRef=null,e.saveRef=e.saveRef.bind(e),e}n.displayName="Overlay";b=s.default.Component,(0,l.default)(w,b),w.prototype.saveRef=function(e){e&&(this.overlay=e.overlay)},w.prototype.render=function(){var e=this.props,t=e.v2,e=(0,r.default)(e,["v2"]);return t?("needAdjust"in e&&(g.log.deprecated("needAdjust","needAdjust","Popup v2"),e.autoAdjust=e.needAdjust,delete e.needAdjust),s.default.createElement(m.default,e)):s.default.createElement(h.default,(0,a.default)({},e,{ref:this.saveRef}))};var b,l=w;function w(e){(0,o.default)(this,w);e=(0,i.default)(this,b.call(this,e));return e.overlay=null,e.saveRef=e.saveRef.bind(e),e}l.displayName="Popup",n.Gateway=f.default,n.Position=p.default,n.Popup=u.default.config(l,{exportNames:["overlay"]}),t.default=u.default.config(n,{exportNames:["getContent","getContentNode"]}),e.exports=t.default},function(e,t,n){"use strict";n(43),n(109),n(126),n(80),n(32),n(158),n(52),n(632)},function(e,t,n){"use strict";n(32),n(36),n(59),n(693)},function(e,t){e.exports=jQuery},function(e,t,n){"use strict";n(544)},function(e,t,n){"use strict";t.__esModule=!0,t.setStickyStyle=t.fetchDataByPath=t.statics=void 0;var f=a(n(2)),o=a(n(38)),p=a(n(13));function a(e){return e&&e.__esModule?e:{default:e}}var r=["defaultProps","propTypes","contextTypes","childContextTypes","displayName","getDerivedStateFromProps"];t.statics=function(t,n){Object.keys(n).forEach(function(e){-1===r.indexOf(e)&&(t[e]=n[e])})},t.fetchDataByPath=function(e,t){if(!e||!t)return!1;var n=(t=t.toString()).split("."),a=void 0,t=void 0;if(n.length&&(0<=(t=n[0]).indexOf("[")?(t=t.match(/(.*)\[(.*)\]/))&&"object"===(0,o.default)(t[1])&&"object"===(0,o.default)(e[t[1]])&&(a=e[t[1]][t[2]]):a=e[n[0]],a))for(var r=1;r<n.length&&void 0!==(a=a[n[r]]);r++);return a},t.setStickyStyle=function(e,t,s){function u(e,a){return e.reduce(function(e,t,n){return n<a?e+r(t):e},0)}var d=3<arguments.length&&void 0!==arguments[3]?arguments[3]:[],c=arguments[4],o=t.length,r=(t.forEach(function(e,t){var n="left"===s&&t===o-1,a="right"===s&&0===t,r={position:"sticky"},t=d[t];-1<t&&(r[s]=t),e.className=(0,p.default)(e.className,((t={})[c+"table-fix-"+s]=!0,t[c+"table-fix-left-last"]=n,t[c+"table-fix-right-first"]=a,t)),e.style=(0,f.default)({},e.style,r),e.cellStyle=r}),function a(e){return 0<(Array.isArray(e&&e.children)&&e.children.length||0)?e.children.reduce(function(e,t,n){return e+a(t.children)},0):1});(function o(i,l){"right"===s&&i.reverse(),i.forEach(function(e,t){var n,a,r="right"===s?l-u(i,t):l+u(i,t);e.children&&(o(e.children,r),e=e,r=r,n=s,t=t===i.length-1,a={position:"sticky"},-1<(r=d[r])&&(a[n]=r),e.className=(0,p.default)(e.className,((r={})[c+"table-fix-"+n]=!0,r[c+"table-fix-left-last"]="left"===n&&t,r[c+"table-fix-right-first"]="right"===n&&t,r)),e.style=(0,f.default)({},e.style,a),e.cellStyle=a)}),"right"===s&&i.reverse()})(e,"left"===s?0:o-1)}},function(e,t,n){"use strict";n.d(t,"a",function(){return a}),n.d(t,"b",function(){return r}),n.d(t,"c",function(){return o});var a={labelCol:{fixedSpan:6},wrapperCol:{span:18}},r={true:"green",false:"red"},o={readOnly:!0}},function(e,t,n){"use strict";var a=n(14),r=n(15),o=n(17),i=n(16),l=n(21),s=n(0),u=n.n(s),s=n(37),d=n(40),c=(n(43),n(24)),f=n.n(c),c=(n(51),n(25)),p=n.n(c);function h(e){e=e,(t=document.createElement("textarea")).style.border="0",t.style.padding="0",t.style.margin="0",t.style.position="absolute",t.style.left="-999px",t.style.top="".concat(window.pageYOffset||document.documentElement.scrollTop,"px"),t.setAttribute("readonly",""),t.value=e;var t,e=t;document.body.appendChild(e),e.focus(),e.select(),e.setSelectionRange(0,e.value.length),document.execCommand("copy"),document.body.removeChild(e),p.a.success("Success copied!")}var m=Object(d.g)(((n=function(e){Object(o.a)(n,e);var t=Object(i.a)(n);function n(){return Object(a.a)(this,n),t.apply(this,arguments)}return Object(r.a)(n,[{key:"render",value:function(){var e=this.props,t=e.style,n=e.value,a=e.textNode,r=e.className,e=e.showIcon,o=void 0===e||e;return u.a.createElement("div",{className:r,onClick:function(){return o?"":h(n)},style:void 0===t?{}:t},a||n,o&&u.a.createElement(f.a,{title:"澶嶅埗",className:"copy-icon",size:"small",type:"copy",onClick:function(){return h(n)}}))}}]),n}(u.a.Component)).displayName="Copy",c=n))||c,s=(n=Object(s.b)(function(e){return Object(l.a)({},e.locale)}),Object(d.g)(c=n(c=function(e){Object(o.a)(n,e);var t=Object(i.a)(n);function n(){return Object(a.a)(this,n),t.apply(this,arguments)}return Object(r.a)(n,[{key:"getNameSpace",value:function(e,t,n){return n?u.a.createElement("span",{style:{display:"flex",alignItems:"center",marginLeft:16}},e.NameSpace.namespaceID,u.a.createElement(m,{style:{marginLeft:16,height:32,display:"flex",alignItems:"center",background:"rgb(239, 243, 248)",padding:"0px 8px",minWidth:220},value:t})):t}},{key:"render",value:function(){var e=this.props,t=e.title,n=e.desc,a=e.nameSpace,e=e.locale;return u.a.createElement("div",{style:{display:"flex",alignItems:"center",marginTop:8,marginBottom:8}},u.a.createElement("span",{style:{fontSize:28,height:40,fontWeight:500}},t),u.a.createElement("span",{style:{marginLeft:4}},n&&"undefined"!==n?this.getNameSpace(e,n,a):""))}}]),n}(u.a.Component))||c)||c);t.a=s},function(e,t,n){"use strict";n(446)},function(e,t,n){"use strict";t.__esModule=!0;var a=l(n(2)),r=l(n(12)),o=l(n(377)),i=l(n(619)),n=l(n(8));function l(e){return e&&e.__esModule?e:{default:e}}o.default.Group=n.default.config(i.default,{transform:function(e,t){var n;return"itemDirection"in e&&(t("itemDirection","direction","Checkbox"),n=(t=e).itemDirection,t=(0,r.default)(t,["itemDirection"]),e=(0,a.default)({direction:n},t)),e}}),t.default=o.default,e.exports=t.default},function(e,t,n){"use strict";function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}n.d(t,"a",function(){return a})},function(e,t){function n(){return e.exports=n=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n,a=arguments[t];for(n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n])}return e},e.exports.__esModule=!0,e.exports.default=e.exports,n.apply(this,arguments)}e.exports=n,e.exports.__esModule=!0,e.exports.default=e.exports},function(e,t,n){"use strict";t.__esModule=!0;var a=s(n(8)),r=n(11),o=s(n(176)),i=s(n(672)),l=s(n(673)),n=s(n(674));function s(e){return e&&e.__esModule?e:{default:e}}o=a.default.config(o.default,{transfrom:function(t,e){var n=t.shape,a=t.type;return"selectable"===n&&e("shape=selectable","Tag.Selectable","Tag"),"deletable"===n&&e("shape=deletable","Tag.Closeable","Tag"),"link"===n&&e("shape=link",'<Tag><a href="x">x</a></Tag>',"Tag"),"readonly"!==n&&"interactive"!==n||r.log.warning("Warning: [ shape="+n+" ] is deprecated at [ Tag ]"),"secondary"===a&&r.log.warning("Warning: [ type=secondary ] is deprecated at [ Tag ]"),["count","marked","value","onChange"].forEach(function(e){e in t&&r.log.warning("Warning: [ "+e+" ] is deprecated at [ Tag ]")}),("selected"in t||"defaultSelected"in t)&&r.log.warning("Warning: [ selected|defaultSelected  ] is deprecated at [ Tag ], use [ checked|defaultChecked ] at [ Tag.Selectable ] instead of it"),"closed"in t&&r.log.warning("Warning: [ closed  ] is deprecated at [ Tag ], use [ onClose ] at [ Tag.Closeable ] instead of it"),"onSelect"in t&&e("onSelect","<Tag.Selectable onChange/>","Tag"),"afterClose"in t&&r.log.warning("Warning: [ afterClose  ] is deprecated at [ Tag ], use [ afterClose ] at [ Tag.Closeable ] instead of it"),t}});o.Group=a.default.config(i.default),o.Selectable=a.default.config(l.default),o.Closable=a.default.config(n.default),o.Closeable=o.Closable,t.default=o,e.exports=t.default},function(e,t,n){"use strict";n(70),n(447)},function(e,t){e=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=e)},function(e,t){e=e.exports={version:"2.6.12"};"number"==typeof __e&&(__e=e)},function(e,t,n){e.exports=!n(108)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,t,n){"use strict";t.__esModule=!0;var a=o(n(344)),r=o(n(526)),n=o(n(527));function o(e){return e&&e.__esModule?e:{default:e}}a.default.Expand=r.default,a.default.OverlayAnimate=n.default,t.default=a.default,e.exports=t.default},function(e,t,n){"use strict";n(43),n(70),n(126),n(109),n(538)},function(e,t,n){"use strict";n.d(t,"a",function(){return r});function v(e,t){return"function"==typeof e?e(t):e}function _(e,t){return"string"==typeof e?Object(d.c)(e,null,null,t):e}function u(e){return e}var b=n(40),a=n(58),t=n(0),w=n.n(t),d=n(55),M=n(42),k=n(54),S=n(57),r=(w.a.Component,function(r){function e(){for(var e,t=arguments.length,n=new Array(t),a=0;a<t;a++)n[a]=arguments[a];return(e=r.call.apply(r,[this].concat(n))||this).history=Object(d.b)(e.props),e}return Object(a.a)(e,r),e.prototype.render=function(){return w.a.createElement(b.c,{history:this.history,children:this.props.children})},e}(w.a.Component)),c=w.a.forwardRef;function E(e){return e}var f=(c=void 0===c?u:c)(function(e,t){var n=e.innerRef,a=e.navigate,r=e.onClick,e=Object(k.a)(e,["innerRef","navigate","onClick"]),o=e.target,e=Object(M.a)({},e,{onClick:function(t){try{r&&r(t)}catch(e){throw t.preventDefault(),e}var e;t.defaultPrevented||0!==t.button||o&&"_self"!==o||((e=t).metaKey||e.altKey||e.ctrlKey||e.shiftKey)||(t.preventDefault(),a())}});return e.ref=u!==c&&t||n,w.a.createElement("a",e)}),x=c(function(e,t){var n=e.component,r=void 0===n?f:n,o=e.replace,i=e.to,l=e.innerRef,s=Object(k.a)(e,["component","replace","to","innerRef"]);return w.a.createElement(b.e.Consumer,null,function(n){n||Object(S.a)(!1);var a=n.history,e=_(v(i,n.location),n.location),e=e?a.createHref(e):"",e=Object(M.a)({},s,{href:e,navigate:function(){var e=v(i,n.location),t=Object(d.e)(n.location)===Object(d.e)(_(e));(o||t?a.replace:a.push)(e)}});return u!==c?e.ref=t||l:e.innerRef=l,w.a.createElement(r,e)})}),C=w.a.forwardRef;(C=void 0===C?E:C)(function(e,r){var t=e["aria-current"],o=void 0===t?"page":t,t=e.activeClassName,i=void 0===t?"active":t,l=e.activeStyle,s=e.className,u=e.exact,d=e.isActive,c=e.location,f=e.sensitive,p=e.strict,h=e.style,m=e.to,g=e.innerRef,y=Object(k.a)(e,["aria-current","activeClassName","activeStyle","className","exact","isActive","location","sensitive","strict","style","to","innerRef"]);return w.a.createElement(b.e.Consumer,null,function(e){e||Object(S.a)(!1);var e=c||e.location,t=_(v(m,e),e),n=t.pathname,n=n&&n.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1"),n=n?Object(b.f)(e.pathname,{path:n,exact:u,sensitive:f,strict:p}):null,e=!!(d?d(n,e):n),n="function"==typeof s?s(e):s,a="function"==typeof h?h(e):h,e=(e&&(n=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.filter(function(e){return e}).join(" ")}(n,i),a=Object(M.a)({},a,l)),Object(M.a)({"aria-current":e&&o||null,className:n,style:a,to:t},y));return E!==C?e.ref=r||g:e.innerRef=g,w.a.createElement(x,e)})})},function(e,t,n){"use strict";n.d(t,"b",function(){return l});var a=n(21),r=n(34),o=n(28),i={namespaces:[]},l=function(e){return function(n){return r.a.get("v1/console/namespaces",{params:e}).then(function(e){var t=e.code,e=e.data;n({type:o.b,data:200===t?e:[]})})}};t.a=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:i,t=1<arguments.length?arguments[1]:void 0;return t.type!==o.b?e:Object(a.a)(Object(a.a)({},e),{},{namespaces:t.data})}},function(e,t,n){"use strict";var i=n(21),a=n(14),r=n(15),o=n(17),l=n(16),s=n(0),u={codeLens:!0,selectOnLineNumbers:!0,roundedSelection:!1,readOnly:!1,lineNumbersMinChars:!0,theme:"vs-dark",wordWrapColumn:120,folding:!0,showFoldingControls:"always",wordWrap:"wordWrapColumn",cursorStyle:"line",automaticLayout:!0},n=(n(737),function(e){Object(o.a)(n,e);var t=Object(l.a)(n);function n(e){return Object(a.a)(this,n),(e=t.call(this,e)).nodeRef=s.createRef(),e.monacoEditor=null,e.state=void 0,e.props=void 0,e}return Object(r.a)(n,[{key:"componentWillReceiveProps",value:function(e){var t,n,a,r,o;this.monacoEditor&&(t=(o=this.props).value,n=void 0===(n=o.language)?"js":n,a=o.width,r=o.height,o=void 0===(o=o.options)?{}:o,(void 0===t?"":t)!==e.value&&this.monacoEditor.setValue(e.value||""),n!==e.language&&this.monacoEditor.editor.setModelLanguage(this.monacoEditor.getModel(),e.language),!this.monacoEditor||a===e.width&&r===e.height||this.monacoEditor.layout(),this.monacoEditor&&e.options&&o!==e.options&&this.monacoEditor.updateOptions(Object(i.a)(Object(i.a)({},u),e.options)))}},{key:"componentDidMount",value:function(){var e=this;window.monaco?this.initMoacoEditor():window.importEditor&&window.importEditor(function(){e.initMoacoEditor()})}},{key:"componentWillUnmount",value:function(){this.monacoEditor&&this.monacoEditor.dispose(),this.nodeRef=null}},{key:"initMoacoEditor",value:function(){var e=this.props,t=e.options,t=void 0===t?{}:t,n=e.language,n=void 0===n?"js":n,e=e.value,e=void 0===e?"":e;try{this.monacoEditor=window.monaco.editor.create(this.nodeRef&&this.nodeRef.current,Object(i.a)(Object(i.a)(Object(i.a)({},u),t),{},{language:n,value:e})),this.editorDidMount(this.monacoEditor)}catch(e){}}},{key:"editorDidMount",value:function(n){var a=this.props.onChange;n.onDidChangeModelContent(function(e){var t=n.getValue();"function"==typeof a&&a(t)})}},{key:"render",value:function(){var e=this.props,t=e.width,e=e.height;return s.createElement("div",{ref:this.nodeRef,style:{width:void 0===t?"100%":t,height:void 0===e?0:e}})}}]),n}(s.Component));n.displayName="MonacoEditor";t.a=n},function(e,t,n){var a=n(107),r=n(191),o=n(142),i=Object.defineProperty;t.f=n(78)?Object.defineProperty:function(e,t,n){if(a(e),t=o(t,!0),a(n),r)try{return i(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){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},function(e,t){e.exports=function(e){return e&&e.__esModule?e:{default:e}},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,t,n){"use strict";n(43),n(698)},function(e,t,n){"use strict";t.__esModule=!0;var a=l(n(2)),r=l(n(12)),o=l(n(380)),i=l(n(621)),n=l(n(8));function l(e){return e&&e.__esModule?e:{default:e}}o.default.Group=n.default.config(i.default,{transform:function(e,t){var n;return"itemDirection"in e&&(t("itemDirection","direction","Radio"),n=(t=e).itemDirection,t=(0,r.default)(t,["itemDirection"]),e=(0,a.default)({direction:n},t)),e}}),t.default=o.default,e.exports=t.default},function(e,t,n){"use strict";function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}n.d(t,"a",function(){return a})},function(e,t,n){"use strict";n(35);var a=n(19),o=n.n(a),a=(n(32),n(18)),i=n.n(a),r=n(14),l=n(15),s=n(17),u=n(16),a=(n(26),n(8)),a=n.n(a),d=(n(66),n(41)),d=n.n(d),c=n(0),f=n.n(c),p=(n(684),d.a.Row),h=d.a.Col,d=(0,a.a.config)(((c=function(e){Object(s.a)(n,e);var t=Object(u.a)(n);function n(e){return Object(r.a)(this,n),(e=t.call(this,e)).diffeditor=f.a.createRef(),e.state={dialogvisible:!1},e}return Object(l.a)(n,[{key:"openDialog",value:function(e,t){var n=this;this.setState({dialogvisible:!0}),setTimeout(function(){n.createDiffCodeMirror(e,t)})}},{key:"closeDialog",value:function(){this.setState({dialogvisible:!1})}},{key:"createDiffCodeMirror",value:function(e,t){var n=this.diffeditor.current;n.innerHTML="",this.diffeditor=window.CodeMirror.MergeView(n,{value:e||"",readOnly:!0,origLeft:null,orig:t||"",lineNumbers:!0,mode:this.mode,theme:"xq-light",highlightDifferences:!0,connect:"align",collapseIdentical:!1,revertButtons:"function"==typeof this.props.publishConfig})}},{key:"confirmPub",value:function(){this.closeDialog(),this.props.publishConfig(this.diffeditor.editor().getValue())}},{key:"render",value:function(){var e=this.props,t=e.locale,t=void 0===t?{}:t,n=e.title,a=e.currentArea,e=e.originalArea,r=f.a.createElement(i.a,{type:"primary",onClick:this.confirmPub.bind(this)},t.publish),r=f.a.createElement("div",null," ","function"==typeof this.props.publishConfig?r:f.a.createElement(i.a,{type:"primary",onClick:this.closeDialog.bind(this)},t.back));return f.a.createElement("div",null,f.a.createElement(o.a,{title:n,style:{width:"80%"},visible:this.state.dialogvisible,footer:r,onClose:this.closeDialog.bind(this)},f.a.createElement("div",{style:{height:400}},f.a.createElement("div",null,f.a.createElement(p,null,f.a.createElement(h,{style:{textAlign:"center"}},a),f.a.createElement(h,{style:{textAlign:"center"}},e))),f.a.createElement("div",{style:{clear:"both",height:480},ref:this.diffeditor}))))}}]),n}(f.a.Component)).displayName="DiffEditorDialog",n=c))||n;t.a=d},function(e,t,n){function m(e,t,n){var a,r,o,i=e&m.F,l=e&m.G,s=e&m.S,u=e&m.P,d=e&m.B,c=e&m.W,f=l?y:y[t]||(y[t]={}),p=f[w],h=l?g:s?g[t]:(g[t]||{})[w];for(a in n=l?t:n)(r=!i&&h&&void 0!==h[a])&&b(f,a)||(o=(r?h:n)[a],f[a]=l&&"function"!=typeof h[a]?n[a]:d&&r?v(o,g):c&&h[a]==o?function(a){function e(e,t,n){if(this instanceof a){switch(arguments.length){case 0:return new a;case 1:return new a(e);case 2:return new a(e,t)}return new a(e,t,n)}return a.apply(this,arguments)}return e[w]=a[w],e}(o):u&&"function"==typeof o?v(Function.call,o):o,u&&((f.virtual||(f.virtual={}))[a]=o,e&m.R&&p&&!p[a]&&_(p,a,o)))}var g=n(76),y=n(77),v=n(190),_=n(92),b=n(85),w="prototype";m.F=1,m.G=2,m.S=4,m.P=8,m.B=16,m.W=32,m.U=64,m.R=128,e.exports=m},function(e,t,n){var a=n(84),r=n(120);e.exports=n(78)?function(e,t,n){return a.f(e,t,r(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},function(e,t,n){var a=n(194),r=n(143);e.exports=function(e){return a(r(e))}},function(e,t,n){var a=n(146)("wks"),r=n(123),o=n(76).Symbol,i="function"==typeof o;(e.exports=function(e){return a[e]||(a[e]=i&&o[e]||(i?o:r)("Symbol."+e))}).store=a},function(e,t,n){"use strict";t.__esModule=!0;var l=a(n(2)),c=a(n(38));t.typeOf=o,t.isArrayLike=i,t.isPromise=function(e){return!!e&&("object"===(void 0===e?"undefined":(0,c.default)(e))||"function"==typeof e)&&"function"==typeof e.then},t.isPlainObject=u,t.shallowEqual=function(e,t,n){if(e!==t){if(!e||!t||(void 0===e?"undefined":(0,c.default)(e))+(void 0===t?"undefined":(0,c.default)(t))!=="objectobject")return!1;var a=Object.keys(e),r=Object.keys(t),o=a.length;if(o!==r.length)return!1;for(var i="function"==typeof n,l=0;l<o;l++){var s=a[l];if(!Object.prototype.hasOwnProperty.call(t,s))return!1;var u=e[s],d=t[s],s=i?n(u,d,s):void 0;if(!1===s||void 0===s&&u!==d)return!1}}return!0},t.each=function(e,t,n){var a=-1===n,r=e.length,o=a?r-1:0;if(i(e))for(;o<r&&0<=o&&!1!==t.call(e[o],e[o],o);a?o--:o++);else for(o in e)if(e.hasOwnProperty(o)&&!1===t.call(e[o],e[o],o))break;return e},t.pickOthers=function(e,t){var n,a={},r="Array"===o(e);for(n in t)d(n,e,r)||(a[n]=t[n]);return a},t.pickProps=function(e,t){var n,a={},r="Array"===o(e);for(n in t)d(n,e,r)&&(a[n]=t[n]);return a},t.pickAttrsWith=function(e,t){var n,a={};for(n in e)n.match(t)&&(a[n]=e[n]);return a},t.isNil=r,t.deepMerge=f,t.isFunctionComponent=function(e){return"Function"===o(e)&&e.prototype&&void 0===e.prototype.isReactComponent},t.isClassComponent=function(e){return"Function"===o(e)&&e.prototype&&void 0!==e.prototype.isReactComponent},t.isReactFragment=function(e){if(r(e))return!1;if(e.type)return e.type===s.default.Fragment;return e===s.default.Fragment},t.values=function(e){if(Object.values)return Object.values(e);var t,n=[];for(t in e)e.hasOwnProperty(t)&&n.push(e[t]);return n};var s=a(n(0));function a(e){return e&&e.__esModule?e:{default:e}}function o(e){return Object.prototype.toString.call(e).replace(/\[object\s|]/g,"")}function i(e){var t=!!e&&"length"in e&&e.length;return"Array"===o(e)||0===t||"number"==typeof t&&0<t&&t-1 in e}function u(e){if("Object"!==o(e))return!1;e=e.constructor;if("function"!=typeof e)return!1;e=e.prototype;return"Object"===o(e)&&!!e.hasOwnProperty("isPrototypeOf")}var d=function(e,t,n){return n?-1<t.indexOf(e):e in t};function r(e){return null==e}function f(e){for(var t=arguments.length,n=Array(1<t?t-1:0),a=1;a<t;a++)n[a-1]=arguments[a];if(!n.length)return e;var r,o=n.shift();if(u(e)||(e={}),u(e)&&u(o))for(var i in o)u(o[i])&&!s.default.isValidElement(o[i])?(e[i]||(0,l.default)(e,((r={})[i]={},r)),u(e[i])||(e[i]=o[i]),f(e[i],o[i])):(0,l.default)(e,((r={})[i]=o[i],r));return f.apply(void 0,[e].concat(n))}},function(e,t,n){"use strict";var a=n(86),o=(Object.defineProperty(t,"__esModule",{value:!0}),t.format=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];var a=1,r=t[0],o=t.length;return"function"!=typeof r?"string"!=typeof r?r:String(r).replace(l,function(e){if("%%"===e)return"%";if(o<=a)return e;switch(e){case"%s":return String(t[a++]);case"%d":return Number(t[a++]);case"%j":try{return JSON.stringify(t[a++])}catch(e){return"[Circular]"}default:return e}}):r(t.slice(1))},t.asyncMap=function(t,e,n,a){if(e.first)return s(u(t),n,a);function r(e){if(l.push(e),++i===o)return a(l)}var e=Object.keys(t),o=e.length,i=0,l=[];e.forEach(function(e){s(t[e],n,r)})},t.asyncMapPromise=function(e,t,n){return c.apply(this,arguments)},t.complementError=function(t){return function(e){return e&&e.message?(e.field=t.field,e):{message:e,field:t.field}}},t.processErrorResults=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:[],t=[],n={};for(var a=0;a<e.length;a++)!function(e){Array.isArray(e)?t=t.concat(e):t.push(e)}(e[a]);if(t.length)for(var r=0;r<t.length;r++){var o=t[r].field;o&&(n[o]=n[o]||[],n[o].push(t[r]))}else n=t=null;return{errors:t,fields:n}},a(n(160))),i=a(n(162)),l=/%[sdj%]/g;function s(n,a,r){var o=0,i=n.length;!function e(t){if(t&&t.length)r(t);else{if(t=o,o+=1,!(t<i))return r([]);a(n[t],e)}}([])}function u(n){var a=[];return Object.keys(n).forEach(function(t){Object.keys(n[t]).forEach(function(e){a.push(n[t][e])})}),a}function d(){return r.apply(this,arguments)}function r(){return(r=(0,i.default)(o.default.mark(function e(t,r){return o.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",t.reduce(function(){var n=(0,i.default)(o.default.mark(function e(t,n){var a;return o.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,t;case 3:a=e.sent,e.next=9;break;case 6:e.prev=6,e.t0=e.catch(0),a=e.t0;case 9:if(a&&a.length)return e.abrupt("return",a);e.next=11;break;case 11:return e.abrupt("return",r(n));case 12:case"end":return e.stop()}},e,null,[[0,6]])}));return function(e,t){return n.apply(this,arguments)}}(),Promise.resolve()));case 1:case"end":return e.stop()}},e)}))).apply(this,arguments)}function c(){return(c=(0,i.default)(o.default.mark(function e(t,n,a){var r;return o.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(n.first)return r=u(t),e.abrupt("return",d(r,a));e.next=3;break;case 3:return r=Object.values(t),e.abrupt("return",Promise.all(r.map(function(e){return d(e,a)})));case 5:case"end":return e.stop()}},e)}))).apply(this,arguments)}},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var v=d(n(2)),a=d(n(4)),r=d(n(6)),o=d(n(7)),i=n(0),_=d(i),l=n(23),s=d(n(3)),b=d(n(13)),u=n(11);function d(e){return e&&e.__esModule?e:{default:e}}var c,f=u.func.bindCtx,w=u.obj.pickOthers,o=(c=i.Component,(0,o.default)(M,c),M.prototype.componentDidMount=function(){this.itemNode=(0,l.findDOMNode)(this);var e=this.props,t=e.parentMode,n=e.root,e=e.menu;e?this.menuNode=(0,l.findDOMNode)(e):"popup"===t?this.menuNode=this.itemNode.parentNode:(this.menuNode=(0,l.findDOMNode)(n),t=(e=n.props).prefix,n=e.header,e=e.footer,(n||e)&&(this.menuNode=this.menuNode.querySelector("."+t+"menu-content"))),this.setFocus()},M.prototype.componentDidUpdate=function(){this.props.root.props.focusable&&this.setFocus()},M.prototype.focusable=function(){var e=this.props,t=e.root,n=e.type,e=e.disabled;return t.props.focusable&&("submenu"===n||!e)},M.prototype.getFocused=function(){var e=this.props,t=e._key;return e.root.state.focusedKey===t},M.prototype.setFocus=function(){var e;this.getFocused()&&(this.focusable()&&this.itemNode.focus({preventScroll:!0}),this.menuNode&&this.menuNode.scrollHeight>this.menuNode.clientHeight&&(this.menuNode.clientHeight+this.menuNode.scrollTop<(e=this.itemNode.offsetTop+this.itemNode.offsetHeight)?this.menuNode.scrollTop=e-this.menuNode.clientHeight:this.itemNode.offsetTop<this.menuNode.scrollTop&&(this.menuNode.scrollTop=this.itemNode.offsetTop)))},M.prototype.handleClick=function(e){e.stopPropagation();var t=this.props,n=t._key,a=t.root;t.disabled?e.preventDefault():(a.handleItemClick(n,this,e),this.props.onClick&&this.props.onClick(e))},M.prototype.handleKeyDown=function(e){var t=this.props,n=t._key,a=t.root,t=t.type;this.focusable()&&(a.handleItemKeyDown(n,t,this,e),e.keyCode===u.KEYCODE.ENTER&&"submenu"!==t&&this.handleClick(e)),this.props.onKeyDown&&this.props.onKeyDown(e)},M.prototype.getTitle=function(e){if("string"==typeof e)return e},M.prototype.render=function(){var e=this.props,t=e.inlineLevel,n=e.root,a=e.replaceClassName,r=e.groupIndent,o=e.component,i=e.disabled,l=e.className,s=e.children,u=e.needIndent,d=e.parentMode,e=e._key,c=w(Object.keys(M.propTypes),this.props),f=n.props,p=f.prefix,h=f.focusable,m=f.inlineIndent,g=f.itemClassName,f=f.rtl,y=this.getFocused(),h=a?l:(0,b.default)(((a={})[p+"menu-item"]=!0,a[p+"disabled"]=i,a[p+"focused"]=!h&&y,a[g]=!!g,a[l]=!!l,a)),g=(i&&(c["aria-disabled"]=!0,c["aria-hidden"]=!0),c.tabIndex=n.state.tabbableKey===e?"0":"-1","inline"===d&&1<t&&0<m&&u&&(c.style=(0,v.default)({},c.style||{},((y={})[f?"paddingRight":"paddingLeft"]=t*m-.4*(r||0)*m+"px",y))),o),l="menuitem";return"selectMode"in n.props&&(l="option"),_.default.createElement(g,(0,v.default)({role:l,title:this.getTitle(s)},c,{className:h,onClick:this.handleClick,onKeyDown:this.handleKeyDown}),_.default.createElement("div",{className:p+"menu-item-inner"},s))},i=n=M,n.propTypes={_key:s.default.string,level:s.default.number,inlineLevel:s.default.number,groupIndent:s.default.number,root:s.default.object,menu:s.default.any,parent:s.default.object,parentMode:s.default.oneOf(["inline","popup"]),type:s.default.oneOf(["submenu","item"]),component:s.default.string,disabled:s.default.bool,className:s.default.string,onClick:s.default.func,onKeyDown:s.default.func,needIndent:s.default.bool,replaceClassName:s.default.bool},n.defaultProps={component:"li",groupIndent:0,replaceClassName:!1,needIndent:!0},i);function M(e){(0,a.default)(this,M);e=(0,r.default)(this,c.call(this,e));return f(e,["handleClick","handleKeyDown"]),e}o.displayName="Item",t.default=o,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.uid=r,t.fileToObject=function(e){e.uid||(e.uid=r());return{lastModified:e.lastModified,lastModifiedDate:e.lastModifiedDate,name:e.filename||e.name,size:e.size,type:e.type,uid:e.uid,error:e.error,percent:0,originFileObj:e}},t.getFileItem=function(t,e){var n=void 0!==t.uid?"uid":"name";return e.filter(function(e){return e[n]===t[n]})[0]},t.removeFileItem=function(t,e){var n=void 0!==t.uid?"uid":"name",a=e.filter(function(e){return e[n]!==t[n]});return a.length!==e.length?a:null},t.previewFile=function(e,t){var n=new FileReader;n.onloadend=function(){return t(n.result)},n.readAsDataURL(e)};var a=+new Date;function r(){return(a++).toString(36)}t.errorCode={EXCEED_LIMIT:"EXCEED_LIMIT",BEFOREUPLOAD_REJECT:"BEFOREUPLOAD_REJECT",RESPONSE_FAIL:"RESPONSE_FAIL"}},function(e,t,n){"use strict";var a=n(189),r={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},c={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},o={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},i={};function f(e){return a.isMemo(e)?o:i[e.$$typeof]||r}i[a.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},i[a.Memo]=o;var p=Object.defineProperty,h=Object.getOwnPropertyNames,m=Object.getOwnPropertySymbols,g=Object.getOwnPropertyDescriptor,y=Object.getPrototypeOf,v=Object.prototype;e.exports=function e(t,n,a){if("string"!=typeof n){v&&(r=y(n))&&r!==v&&e(t,r,a);for(var r,o=h(n),i=(m&&(o=o.concat(m(n))),f(t)),l=f(n),s=0;s<o.length;++s){var u=o[s];if(!(c[u]||a&&a[u]||l&&l[u]||i&&i[u])){var d=g(n,u);try{p(t,u,d)}catch(e){}}}}return t}},function(e,t,n){"use strict";n.d(t,"b",function(){return s}),n.d(t,"c",function(){return l});var a=n(21),r=n(34),o=n(28),i={version:null,standaloneMode:"",functionMode:""},l=function(e){return r.a.post("v1/auth/users/login",e)},s=function(){return function(t){return r.a.get("v1/console/server/state").then(function(e){t({type:o.c,data:{version:e.version,standaloneMode:e.standalone_mode,functionMode:e.function_mode}})}).catch(function(){t({type:o.c,data:{version:null,functionMode:null}})})}};t.a=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:i,t=1<arguments.length?arguments[1]:void 0;return t.type!==o.c?e:Object(a.a)(Object(a.a)({},e),t.data)}},function(e,t,n){"use strict";t.__esModule=!0;var r=p(n(2)),o=p(n(12)),a=p(n(8)),i=p(n(628)),l=p(n(629)),s=p(n(381)),u=p(n(383)),d=p(n(630)),c=p(n(631)),f=p(n(382)),n=p(n(384));function p(e){return e&&e.__esModule?e:{default:e}}i.default.Header=l.default,i.default.Media=u.default,i.default.Divider=d.default,i.default.Content=c.default,i.default.Actions=n.default,i.default.BulletHeader=s.default,i.default.CollaspeContent=f.default,i.default.CollapseContent=f.default,t.default=a.default.config(i.default,{transform:function(e,t){var n,a;return"titlePrefixLine"in e&&(t("titlePrefixLine","showTitleBullet","Card"),a=(n=e).titlePrefixLine,n=(0,o.default)(n,["titlePrefixLine"]),e=(0,r.default)({showTitleBullet:a},n)),"titleBottomLine"in e&&(t("titleBottomLine","showHeadDivider","Card"),n=(a=e).titleBottomLine,a=(0,o.default)(a,["titleBottomLine"]),e=(0,r.default)({showHeadDivider:n},a)),"bodyHeight"in e&&(t("bodyHeight","contentHeight","Card"),a=(n=e).bodyHeight,t=(0,o.default)(n,["bodyHeight"]),e=(0,r.default)({contentHeight:a},t)),e}}),e.exports=t.default},function(e,t,n){"use strict";var a=n(14),r=n(15),o=n(17),i=n(16),l=n(21),s=n(0),u=n.n(s),s=n(37),n=(n(695),Object(s.b)(function(e){return Object(l.a)({},e.locale)})(((n=function(e){Object(o.a)(n,e);var t=Object(i.a)(n);function n(){return Object(a.a)(this,n),t.apply(this,arguments)}return Object(r.a)(n,[{key:"render",value:function(){var e=this.props,t=e.locale,t=void 0===t?{}:t,e=e.total;return u.a.createElement("div",{className:"query_result_wrapper"},t.ConfigurationManagement.queryResults,u.a.createElement("strong",{style:{fontWeight:"bold"}}," ",e," "),t.ConfigurationManagement.articleMeetRequirements)}}]),n}(u.a.Component)).displayName="QueryResult",s=n))||s);t.a=n},function(e,t,n){"use strict";n.d(t,"a",function(){return c});var a=n(21),r=n(414),r=n.n(r),o=n(44),o=n.n(o),i={enUS:{Header:{home:"HOME",docs:"DOCS",blog:"BLOG",community:"COMMUNITY",enterprise:"ENTERPRISE EDITION",languageSwitchButton:"涓�",logout:"logout",changePassword:"modify password",passwordRequired:"password should not be empty",usernameRequired:"username should not be empty"},Login:{login:"Login",internalSysTip1:"Internal system.",internalSysTip2:"Not exposed to the public network",submit:"Submit",pleaseInputUsername:"Please input username",pleaseInputPassword:"Please input password",invalidUsernameOrPassword:"invalid username or password",productDesc:"an easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications"},MainLayout:{nacosName:"NACOS",doesNotExist:"The page you visit does not exist",configurationManagementVirtual:"ConfigManagement",configurationManagement:"Configurations",configdetail:"Configuration Details",configsync:"Synchronize Configuration",configeditor:"Edit Configuration",newconfig:"Create Configuration",historyRollback:"Historical Versions",configRollback:"Configuration Rollback",historyDetail:"History Details",listeningToQuery:"Listening Query",serviceManagementVirtual:"ServiceManagement",serviceManagement:"Service List",subscriberList:"Subscribers",serviceDetail:"Service Details",namespace:"Namespace",clusterManagementVirtual:"ClusterManagement",clusterManagement:"Cluster Node List",authorityControl:"Authority Control",userList:"User List",roleManagement:"Role Management",privilegeManagement:"Privilege Management"},Password:{passwordNotConsistent:"The passwords are not consistent",passwordRequired:"password should not be empty",pleaseInputOldPassword:"Please input original password",pleaseInputNewPassword:"Please input new password",pleaseInputNewPasswordAgain:"Please input new password again",oldPassword:"Original password",newPassword:"New password",checkPassword:"Check password",changePassword:"modify password",invalidPassword:"Invalid original password",modifyPasswordFailed:"Modify password failed"},NameSpace:{public_tips:"public namespace ID is empty by default",namespace:"Namespaces",prompt:"Notice",namespaceDetails:"Namespace details",namespaceName:"Name",namespaceID:"ID",configuration:"Number of Configurations",description:"Description",removeNamespace:"Remove the namespace",confirmDelete:"Sure you want to delete the following namespaces?",configurationManagement:"Configurations",removeSuccess:"Remove the namespace success",deletedSuccessfully:"Deleted successfully",deletedFailure:"Delete failed",namespaceDelete:"Delete",details:"Details",edit:"Edit",namespacePublic:"public(to retain control)",pubNoData:"No results found.",namespaceAdd:"Create Namespace",namespaceNames:"Namespaces",namespaceNumber:"Namespace ID",namespaceOperation:"Actions",refresh:"Refresh"},ServiceList:{serviceList:"Service List",serviceName:"Service Name",serviceNamePlaceholder:"Enter Service Name",hiddenEmptyService:"Hidden Empty Service",query:"Search",pubNoData:"No results found.",columnServiceName:"Service Name",groupName:"Group Name",groupNamePlaceholder:"Enter Group Name",columnClusterCount:"Cluster Count",columnIpCount:"Instance Count",columnHealthyInstanceCount:"Healthy Instance Count",columnTriggerFlag:"Trigger Protection Threshold",operation:"Operation",detail:"Details",sampleCode:"Code Example",deleteAction:"Delete",prompt:"Confirm",promptDelete:"Do you want to delete the service?",create:"Create Service",subscriber:"Subscriber"},SubscriberList:{subscriberList:"Subscriber List",serviceName:"Service Name",serviceNamePlaceholder:"Enter Service Name",groupName:"Group Name",groupNamePlaceholder:"Enter Group Name",query:"Search",pubNoData:"No results found.",address:"Address",clientVersion:"Client Version",appName:"Application Name",searchServiceNamePrompt:"Service name required!"},ClusterNodeList:{clusterNodeList:"Node List",nodeIp:"NodeIp",nodeIpPlaceholder:"Please enter node Ip",query:"Search",pubNoData:"No results found.",nodeState:"NodeState",extendInfo:"NodeMetaData",operation:"Operation",leave:"Leave",confirm:"Confirm",confirmTxt:"Confirm that you want to go offline this cluster node?"},EditClusterDialog:{updateCluster:"Update Cluster",checkType:"Check Type",checkPort:"Check Port",useIpPortCheck:"Use port of IP",checkPath:"Check Path",checkHeaders:"Check Headers",metadata:"Metadata"},ServiceDetail:{serviceDetails:"Service Details",back:"Back",editCluster:"Edit Cluster",cluster:"Cluster",metadata:"Metadata",selector:"Selector",type:"Type",groupName:"Group Name",protectThreshold:"Protect Threshold",serviceName:"Service Name",editService:"Edit Service",InstanceFilter:{title:"Metadata Filter",addFilter:"Add Filter",clear:"Clear"}},EditServiceDialog:{createService:"Create Service",updateService:"Edit Service",serviceName:"Service Name",metadata:"Metadata",groupName:"Group Name",type:"Type",typeLabel:"Label",typeNone:"None",selector:"Selector",protectThreshold:"Protect Threshold",serviceNameRequired:"Please enter a service name",protectThresholdRequired:"Please enter a protect threshold"},InstanceFilter:{title:"Metadata Filter",addFilter:"Add Filter",clear:"Clear"},InstanceTable:{operation:"Operation",port:"Port",weight:"Weight",healthy:"Healthy",metadata:"Metadata",editor:"Edit",offline:"Offline",online:"Online",ephemeral:"Ephemeral"},EditInstanceDialog:{port:"Port",weight:"Weight",metadata:"Metadata",updateInstance:"Update Instance",whetherOnline:"Whether Online"},ListeningToQuery:{success:"Success",failure:"Failure",configuration:"Configuration",pubNoData:"No results found.",listenerQuery:"Listening Query",queryDimension:"Dimension",pleaseEnterTheDataId:"Enter Data ID",dataIdCanNotBeEmpty:"Data ID cannot be empty",pleaseInputGroup:"Enter Group",groupCanNotBeEmpty:"Group cannot be empty",pleaseInputIp:"Enter IP",query:"Search",articleMeetRequirements:"configuration items."},HistoryRollback:{details:"Details",rollback:"Roll Back",pubNoData:"No results found.",toConfigure:"Historical Versions (Configuration record is retained for 30 days.)",dataId:"Enter Data ID",dataIdCanNotBeEmpty:"Data ID cannot be empty",group:"Enter Group",groupCanNotBeEmpty:"Group cannot be empty",query:"Search",articleMeetRequirements:"configuration items.",lastUpdateTime:"Last Modified At",operator:"Operator",operation:"Operation",compare:"Compare",historyCompareTitle:"History Compare",historyCompareLastVersion:"Lasted Release Version",historyCompareSelectedVersion:"Selected Version"},HistoryDetail:{historyDetails:"History Details",update:"Update",insert:"Insert",deleteAction:"Delete",recipientFrom:"Collapse",moreAdvancedOptions:"Advanced Options",home:"Application",actionType:"Action Type",operator:"Operator",sourceIp:"Source IP",configureContent:"Configuration Content",back:"Back",namespace:"Namespace"},DashboardCard:{importantReminder0:"Important reminder",viewDetails1:"view details"},ConfigurationManagement:{exportBtn:"Export",questionnaire2:"questionnaire",ad:"a ACM front-end monitoring questionnaire, the time limit to receive Ali cloud voucher details shoved stamp: the",noLongerDisplay4:"no longer display",createConfiguration:"Create Configuration",removeConfiguration:"Delete Configuration",sureDelete:"Are you sure you want to delete the following configuration?",environment:"Region",configurationManagement:"Configurations",details:"Details",sampleCode:"Code Example",edit:"Edit",deleteAction:"Delete",more:"More",version:"Historical Versions",listenerQuery:"Configuration Listening Query",failedEntry:"Failed Entry",successfulEntry:"Successful Entry",unprocessedEntry:"Unprocessed Entry",pubNoData:"No results found.",configurationManagement8:"configuration management",queryResults:"Found",articleMeetRequirements:"configuration items",fuzzyd:"Add wildcard '*' for fuzzy query",defaultFuzzyd:"Default fuzzy query mode opened",fuzzyg:"Add wildcard '*' for fuzzy query",defaultFuzzyg:"Default fuzzy query mode opened",query:"Search",advancedQuery9:"Advanced Query",app1:"Enter App Name\n",tags:"Tags",pleaseEnterTag:"Enter Tag",configDetailLabel:"DetailSearch",configDetailH:"search config detail",application:"Application",operation:"Operation",export:"Export query results",newExport:"New version export query results",import:"Import",uploadBtn:"Upload File",importSucc:"The import was successful",importAbort:"Import abort",importSuccBegin:"The import was successful,with ",importSuccEnd:"configuration items imported",importFail:"Import failed",importFail403:"Unauthorized!",importDataValidationError:"No legitimate data was read, please check the imported data file.",metadataIllegal:"The imported metadata file is illegal",namespaceNotExist:"namespace does not exist",abortImport:"Abort import",skipImport:"Skip",overwriteImport:"Overwrite",importRemind:"File upload will be imported directly into the configuration, please be careful!",samePreparation:"Same preparation",targetNamespace:"Target namespace",conflictConfig:"Conflict-detected configuration items",importSuccEntries:"Successful entries: ",failureEntries:"Failure entries",unprocessedEntries:"Unprocessed entries",unrecognizedEntries:"Unrecognized entries",skippedEntries:"skipped entries",exportSelected:"Export selected configs",newExportSelected:"New version export selected configs",clone:"Clone",exportSelectedAlertTitle:"Export config",exportSelectedAlertContent:"please select the configuration to export",cloneSucc:"The clone was successful",cloneAbort:"Clone abort",cloneSuccBegin:"The clone was successful,with ",cloneSuccEntries:"Successful entries: ",cloneSuccEnd:"configuration items cloned",cloneFail:"Clone failed",getNamespaceFailed:"get the namespace failed",getNamespace403:"Without permission to access ${namespaceName} namespace!",startCloning:"Start Clone",cloningConfiguration:"Clone config",source:"Source ",configurationNumber:"Items",target:"Target",selectNamespace:"Select Namespace",selectedEntry:"| Selected Entry",cloneSelectedAlertTitle:"Clone config",cloneSelectedAlertContent:"please select the configuration to clone",delSelectedAlertTitle:"Delete config",delSelectedAlertContent:"please select the configuration to delete",delSuccessMsg:"delete successful",cloneEditableTitle:"Modify Data Id and Group (optional)",authFail:"Auth failed"},NewConfig:{newListingMain:"Create Configuration",newListing:"Create Configuration",publishFailed:"Publish failed. Make sure parameters are entered correctly.",publishFailed403:"Publish failed. No permission to create Configuration",doNotEnter:"Illegal characters not allowed",newConfig:"Data ID cannot be empty.",dataIdIsNotEmpty:"Data ID cannot exceed 255 characters in length",groupPlaceholder:"Enter your group name",moreAdvanced:"Group cannot be empty",groupNotEmpty:"Group ID cannot exceed 127 characters in length",annotation:"Notice: You are going to add configuration to a new group, please make sure that the version of Pandora which clients are using is higher than 3.4.0, otherwise this configuration may be unreadable to clients.",dataIdLength:"Collapse",collapse:"Advanced Options",tags:"Tags",pleaseEnterTag:"Enter Tag",groupIdCannotBeLonger:"Application",description:"Description",targetEnvironment:"Format",configurationFormat:"Configuration Content",configureContentsOf:"Press F1 to view in full screen",fullScreen:"Press Esc to exit",escExit:"Publish",release:"Back",confirmSyanx:"The configuration information may has a syntax error. Are you sure to submit?",dataIdExists:"Configuration already exists. Enter a new Data ID and Group name.",dataRequired:"Data cannot be empty, submission failed",namespace:"Namespace"},CloneDialog:{terminate:"Terminate",skip:"Skip",cover:"Cover",getNamespaceFailed:"get the namespace failed",selectedEntry:"| Selected Entry",homeApplication:"Home Application",tags:"tags",startCloning:"Start Clone",source:"Source ",configurationNumber:"Items",target:"Target",conflict:"Conflict",selectNamespace:"Select Namespace",configurationCloning:"Clone锛�"},DeleteDialog:{confManagement:"Configuration Management",determine:"OK",deletetitle:"Delete Configuration",deletedSuccessfully:"Configuration deleted",deleteFailed:"Deleting configuration failed"},DiffEditorDialog:{publish:"Publish",back:"Back"},ConfigEditor:{official:"Official",production:"Production",beta:"BETA",wrong:"Error",submitFailed:"Cannot be empty, submit failed",toedittitle:"Edit Configuration",newConfigEditor:"New Config Editor",toedit:"Edit Configuration",vdchart:"Illegal characters not allowed",recipientFrom:"Data ID cannot be empty",homeApplication:"Group name cannot be empty",collapse:"Collapse",groupNotEmpty:"Advanced Options",tags:"Tags",pleaseEnterTag:"Enter Tag",targetEnvironment:"Application",description:"Description",format:"Format",configcontent:"Configuration Content",escExit:"Press F1 to view in full screen",releaseBeta:"Press Esc to exit ",release:"Beta Publish",stopPublishBeta:"Stop Beta",betaPublish:"Beta Publish",betaSwitchPrompt:"Not checked by default.",publish:"Publish",back:"Back",codeValErrorPrompt:"Configuration information may have syntax errors. Are you sure to submit?",dialogTitle:"Content Comparison",dialogCurrentArea:"Current Value",dialogOriginalArea:"Original Value",publishFailed403:"Publish failed. No operation permission",namespace:"Namespace"},EditorNameSpace:{notice:"Notice",pleaseDo:"Illegal characters not allowed",publicSpace:"OK",confirmModify:"Edit Namespace",editNamespace:"Loading...",load:"Namespace",namespace:"Namespace cannot be empty",namespaceDesc:"Namespace description cannot be empty",description:"Description"},ExportDialog:{selectedEntry:"| Selected Entry",application:"Application",tags:"Tags",exportBtn:"Export",exportConfiguration:"Export ( ",source:"Source",items:"Items"},ImportDialog:{terminate:"Terminate",skip:"Skip",overwrite:"Overwrite",zipFileFormat:"Only upload. zip file format",uploadFile:"Upload File",importLabel:"Import ( ",target:"Target",conflict:"Conflict",beSureExerciseCaution:"Caution: data will be imported directly after uploading."},ShowCodeing:{sampleCode:"Sample Code",loading:"Loading..."},SuccessDialog:{title:"Configuration Management",determine:"OK",failure:"Failed"},ConfigSync:{error:"Error",syncConfigurationMain:"Synchronize Configuration",syncConfiguration:"Synchronize Configuration Successfully",advancedOptions:"Advanced Options",collapse:"Collapse",home:"Application锛�",region:"Region锛�",configuration:"Configuration Content锛�",target:"Target Region锛�",sync:"Synchronize",back:"Back"},NewNameSpace:{norepeat:"Duplicate namespace. Please enter a different name.",notice:"Notice",input:"Illegal characters not allowed",ok:"OK",cancel:"Cancel",newnamespce:"Create Namespace",loading:"Loading...",name:"Namespace",namespaceId:"Namespace ID(automatically generated if not filled)",namespaceIdTooLong:"The namespace ID length cannot exceed 128",namespacenotnull:"Namespace cannot be empty",namespacedescnotnull:"Namespace description cannot be empty",description:"Description",namespaceIdAlreadyExist:"namespaceId already exist",newnamespceFailedMessage:"namespaceId format is incorrect/namespaceId length greater than 128/namespaceId already exist"},NameSpaceList:{notice:"Notice"},ConfigDetail:{official:"Official",error:"Error",configurationDetails:"Configuration Details",collapse:"Collapse",more:"Advanced Options",home:"Application",tags:"Tags",description:"Description",betaRelease:"Beta Publish",configuration:"Configuration Content",back:"Back",versionComparison:"Version Comparison",dialogCurrentArea:"Current Version",dialogOriginalArea:"Previous Version",configComparison:"Config Comparison",dialogCurrentConfig:"Current Config",dialogComparedConfig:"Compared Config",configComparisonTitle:"Select Config",dataIdInput:"Please Enter Data Id",groupInput:"Please Enter Group",namespaceSelect:"Please Select namespace",configNotFind:"The Configuration is not found, Please select again",namespace:"Namespace"},ConfigRollback:{rollBack:"Roll Back",determine:"Are you sure you want to roll back",followingConfiguration:"the following configuration?",configurationRollback:"Configuration Rollback",collapse:"Collapse",more:"Advanced Options",home:"Application",actionType:"Action Type",configuration:"Configuration Content",back:"Back",rollbackSuccessful:"Rollback Successful",rollbackDelete:"Delete",update:"Update",insert:"Insert",additionalRollbackMessage:"This operation will delete the below config!",namespace:"Namespace"},UserManagement:{userManagement:"User Management",createUser:"Create user",resetPassword:"Edit",deleteUser:"Delete",deleteUserTip:"Do you want to delete this user?",username:"Username",password:"Password",operation:"Operation",refresh:"Refresh",query:"Search",defaultFuzzyd:"Default fuzzy query mode opened",fuzzyd:"Add wildcard '*' for fuzzy query"},NewUser:{createUser:"Create user",username:"Username",password:"Password",rePassword:"Repeat",usernamePlaceholder:"Please Enter Username",passwordPlaceholder:"Please Enter Password",rePasswordPlaceholder:"Please Enter Repeat Password",usernameError:"User name cannot be empty!",passwordError:"Password cannot be empty!",rePasswordError:"Repeat Password cannot be empty!",rePasswordError2:"Passwords are inconsistent!"},PasswordReset:{resetPassword:"Password Reset",username:"Username",password:"Password",rePassword:"Repeat",passwordPlaceholder:"Please Enter Password",rePasswordPlaceholder:"Please Enter Repeat Password",passwordError:"Password cannot be empty!",rePasswordError:"Repeat Password cannot be empty!",rePasswordError2:"Passwords are inconsistent!"},RolesManagement:{roleManagement:"Role management",bindingRoles:"Binding roles",role:"Role",username:"Username",operation:"Operation",deleteRole:"Delete",deleteRoleTip:"Do you want to delete this role?",refresh:"Refresh",defaultFuzzyd:"Default fuzzy query mode opened",fuzzyd:"Add wildcard '*' for fuzzy query",query:"Search"},NewRole:{bindingRoles:"Binding roles",username:"Username",role:"Role",usernamePlaceholder:"Please Enter Username",rolePlaceholder:"Please Enter Role",usernameError:"User name cannot be empty!",roleError:"Role cannot be empty!"},PermissionsManagement:{privilegeManagement:"Permissions Management",addPermission:"Add Permission",role:"Role",resource:"Resource",action:"Action",operation:"Operation",deletePermission:"Delete",deletePermissionTip:"Do you want to delete this permission?",readOnly:"read only",writeOnly:"write only",readWrite:"Read and write",refresh:"Refresh",defaultFuzzyd:"Default fuzzy query mode opened",fuzzyd:"Add wildcard '*' for fuzzy query",query:"Search"},NewPermissions:{addPermission:"Add Permission",role:"Role",resource:"Resource",action:"Action",resourcePlaceholder:"Please select resources",rolePlaceholder:"Please enter Role",actionPlaceholder:"Please select Action",resourceError:"Resource cannot be empty!",roleError:"Role cannot be empty!",actionError:"Action cannot be empty!",readOnly:"read only",writeOnly:"write only",readWrite:"Read and write"}},zhCN:{Header:{home:"棣栭〉",docs:"鏂囨。",blog:"鍗氬",community:"绀惧尯",enterprise:"Nacos浼佷笟鐗�",languageSwitchButton:"En",logout:"鐧诲嚭",changePassword:"淇敼瀵嗙爜"},Login:{login:"鐧诲綍",internalSysTip1:"鍐呴儴绯荤粺锛屼笉鍙毚闇插埌鍏綉",submit:"鎻愪氦",pleaseInputUsername:"璇疯緭鍏ョ敤鎴峰悕",pleaseInputPassword:"璇疯緭鍏ュ瘑鐮�",invalidUsernameOrPassword:"鐢ㄦ埛鍚嶆垨瀵嗙爜閿欒",passwordRequired:"瀵嗙爜涓嶈兘涓虹┖",usernameRequired:"鐢ㄦ埛鍚嶄笉鑳戒负绌�",productDesc:"涓�涓洿鏄撲簬鏋勫缓浜戝師鐢熷簲鐢ㄧ殑鍔ㄦ�佹湇鍔″彂鐜般�侀厤缃鐞嗗拰鏈嶅姟绠$悊骞冲彴"},MainLayout:{nacosName:"NACOS",doesNotExist:"鎮ㄨ闂殑椤甸潰涓嶅瓨鍦�",configurationManagementVirtual:"閰嶇疆绠$悊",configurationManagement:"閰嶇疆鍒楄〃",configdetail:"閰嶇疆璇︽儏",configsync:"鍚屾閰嶇疆",configeditor:"閰嶇疆缂栬緫",newconfig:"鏂板缓閰嶇疆",historyRollback:"鍘嗗彶鐗堟湰",configRollback:"閰嶇疆鍥炴粴",historyDetail:"鍘嗗彶璇︽儏",listeningToQuery:"鐩戝惉鏌ヨ",serviceManagementVirtual:"鏈嶅姟绠$悊",serviceManagement:"鏈嶅姟鍒楄〃",subscriberList:"璁㈤槄鑰呭垪琛�",serviceDetail:"鏈嶅姟璇︽儏",namespace:"鍛藉悕绌洪棿",clusterManagementVirtual:"闆嗙兢绠$悊",clusterManagement:"鑺傜偣鍒楄〃",authorityControl:"鏉冮檺鎺у埗",userList:"鐢ㄦ埛鍒楄〃",roleManagement:"瑙掕壊绠$悊",privilegeManagement:"鏉冮檺绠$悊"},Password:{passwordNotConsistent:"涓ゆ杈撳叆瀵嗙爜涓嶄竴鑷�",passwordRequired:"瀵嗙爜涓嶈兘涓虹┖",pleaseInputOldPassword:"璇疯緭鍏ュ師濮嬪瘑鐮�",pleaseInputNewPassword:"璇疯緭鍏ユ柊瀵嗙爜",pleaseInputNewPasswordAgain:"璇峰啀娆¤緭鍏ユ柊瀵嗙爜",oldPassword:"鍘熷瀵嗙爜",newPassword:"鏂板瘑鐮�",checkPassword:"鍐嶆杈撳叆",changePassword:"淇敼瀵嗙爜",invalidPassword:"鍘熷瀵嗙爜閿欒",modifyPasswordFailed:"淇敼瀵嗙爜澶辫触"},NameSpace:{public_tips:"public鍛藉悕绌洪棿ID榛樿绌�",namespace:"鍛藉悕绌洪棿",prompt:"鎻愮ず",namespaceDetails:"鍛藉悕绌洪棿璇︽儏",namespaceName:"鍛藉悕绌洪棿鍚嶇О",namespaceID:"鍛藉悕绌洪棿ID",configuration:"閰嶇疆鏁�",description:"鎻忚堪",removeNamespace:"鍒犻櫎鍛藉悕绌洪棿",confirmDelete:"纭畾瑕佸垹闄や互涓嬪懡鍚嶇┖闂村悧锛�",configurationManagement:"閰嶇疆鍒楄〃",removeSuccess:"鍒犻櫎鍛藉悕绌洪棿鎴愬姛",deletedSuccessfully:"鍒犻櫎鎴愬姛",deletedFailure:"鍒犻櫎澶辫触",namespaceDelete:"鍒犻櫎",details:"璇︽儏",edit:"缂栬緫",namespacePublic:"public(淇濈暀绌洪棿)",pubNoData:"娌℃湁鏁版嵁",namespaceAdd:"鏂板缓鍛藉悕绌洪棿",namespaceNames:"鍛藉悕绌洪棿鍚嶇О",namespaceNumber:"鍛藉悕绌洪棿ID",namespaceOperation:"鎿嶄綔",refresh:"鍒锋柊"},ServiceList:{serviceList:"鏈嶅姟鍒楄〃",serviceName:"鏈嶅姟鍚嶇О",serviceNamePlaceholder:"璇疯緭鍏ユ湇鍔″悕绉�",hiddenEmptyService:"闅愯棌绌烘湇鍔�",query:"鏌ヨ",pubNoData:"娌℃湁鏁版嵁",columnServiceName:"鏈嶅姟鍚�",groupName:"鍒嗙粍鍚嶇О",groupNamePlaceholder:"璇疯緭鍏ュ垎缁勫悕绉�",columnClusterCount:"闆嗙兢鏁扮洰",columnIpCount:"瀹炰緥鏁�",columnHealthyInstanceCount:"鍋ュ悍瀹炰緥鏁�",columnTriggerFlag:"瑙﹀彂淇濇姢闃堝��",operation:"鎿嶄綔",detail:"璇︽儏",sampleCode:"绀轰緥浠g爜",deleteAction:"鍒犻櫎",prompt:"鎻愮ず",promptDelete:"纭畾瑕佸垹闄ゅ綋鍓嶆湇鍔″悧锛�",create:"鍒涘缓鏈嶅姟",subscriber:"璁㈤槄鑰�"},SubscriberList:{subscriberList:"璁㈤槄鑰呭垪琛�",serviceName:"鏈嶅姟鍚嶇О",serviceNamePlaceholder:"璇疯緭鍏ユ湇鍔″悕绉�",groupName:"鍒嗙粍鍚嶇О",groupNamePlaceholder:"璇疯緭鍏ュ垎缁勫悕绉�",query:"鏌ヨ",pubNoData:"娌℃湁鏁版嵁",address:"鍦板潃",clientVersion:"瀹㈡埛绔増鏈�",appName:"搴旂敤鍚�",searchServiceNamePrompt:"璇疯緭鍏ユ湇鍔″悕绉帮紒"},ClusterNodeList:{clusterNodeList:"鑺傜偣鍒楄〃",nodeIp:"鑺傜偣Ip",nodeIpPlaceholder:"璇疯緭鍏ヨ妭鐐笽p",query:"鏌ヨ",pubNoData:"娌℃湁鏁版嵁",nodeState:"鑺傜偣鐘舵��",extendInfo:"鑺傜偣鍏冩暟鎹�",operation:"鎿嶄綔",leave:"涓嬬嚎",confirm:"纭",confirmTxt:"纭瑕佷笅绾挎闆嗙兢鑺傜偣?"},EditClusterDialog:{updateCluster:"鏇存柊闆嗙兢",checkType:"妫�鏌ョ被鍨�",checkPort:"妫�鏌ョ鍙�",useIpPortCheck:"浣跨敤IP绔彛妫�鏌�",checkPath:"妫�鏌ヨ矾寰�",checkHeaders:"妫�鏌ュご",metadata:"鍏冩暟鎹�"},ServiceDetail:{serviceDetails:"鏈嶅姟璇︽儏",back:"杩斿洖",editCluster:"闆嗙兢閰嶇疆",cluster:"闆嗙兢",metadata:"鍏冩暟鎹�",selector:"琛ㄨ揪寮�",type:"鏈嶅姟璺敱绫诲瀷",groupName:"鍒嗙粍",protectThreshold:"淇濇姢闃堝��",serviceName:"鏈嶅姟鍚�",editService:"缂栬緫鏈嶅姟",InstanceFilter:{title:"鍏冩暟鎹繃婊�",addFilter:"娣诲姞杩囨护",clear:"娓呯┖"}},EditServiceDialog:{createService:"鍒涘缓鏈嶅姟",updateService:"鏇存柊鏈嶅姟",serviceName:"鏈嶅姟鍚�",metadata:"鍏冩暟鎹�",groupName:"鍒嗙粍",type:"鏈嶅姟璺敱绫诲瀷",typeLabel:"鏍囩",typeNone:"榛樿",selector:"琛ㄨ揪寮�",protectThreshold:"淇濇姢闃堝��",serviceNameRequired:"璇疯緭鍏ユ湇鍔″悕",protectThresholdRequired:"璇疯緭鍏ヤ繚鎶ら槇鍊�"},InstanceFilter:{title:"鍏冩暟鎹繃婊�",addFilter:"娣诲姞杩囨护",clear:"娓呯┖"},InstanceTable:{operation:"鎿嶄綔",port:"绔彛",weight:"鏉冮噸",healthy:"鍋ュ悍鐘舵��",metadata:"鍏冩暟鎹�",editor:"缂栬緫",offline:"涓嬬嚎",online:"涓婄嚎",ephemeral:"涓存椂瀹炰緥"},EditInstanceDialog:{port:"绔彛",weight:"鏉冮噸",metadata:"鍏冩暟鎹�",updateInstance:"缂栬緫瀹炰緥",whetherOnline:"鏄惁涓婄嚎"},ListeningToQuery:{success:"鎴愬姛",failure:"澶辫触",configuration:"閰嶇疆",pubNoData:"娌℃湁鏁版嵁",listenerQuery:"鐩戝惉鏌ヨ",queryDimension:"鏌ヨ缁村害",pleaseEnterTheDataId:"璇疯緭鍏ata ID",dataIdCanNotBeEmpty:"Data ID涓嶈兘涓虹┖",pleaseInputGroup:"璇疯緭鍏roup",groupCanNotBeEmpty:"Group涓嶈兘涓虹┖",pleaseInputIp:"璇疯緭鍏P",query:"鏌ヨ",articleMeetRequirements:"鏉℃弧瓒宠姹傜殑閰嶇疆銆�"},HistoryRollback:{details:"璇︽儏",rollback:"鍥炴粴",pubNoData:"娌℃湁鏁版嵁",toConfigure:"鍘嗗彶鐗堟湰(淇濈暀30澶�)",dataId:"璇疯緭鍏ata ID",dataIdCanNotBeEmpty:"Data ID涓嶈兘涓虹┖",group:"璇疯緭鍏roup",groupCanNotBeEmpty:"Group涓嶈兘涓虹┖",query:"鏌ヨ",articleMeetRequirements:"鏉℃弧瓒宠姹傜殑閰嶇疆銆�",lastUpdateTime:"鏈�鍚庢洿鏂版椂闂�",operator:"鎿嶄綔浜�",operation:"鎿嶄綔",compare:"姣旇緝",historyCompareTitle:"鍘嗗彶鐗堟湰姣旇緝",historyCompareLastVersion:"鏈�鏂扮増鏈�",historyCompareSelectedVersion:"褰撳墠閫変腑鐗堟湰"},HistoryDetail:{historyDetails:"鍘嗗彶璇︽儏",update:"鏇存柊",insert:"鎻掑叆",deleteAction:"鍒犻櫎",recipientFrom:"鏀惰捣",moreAdvancedOptions:"鏇村楂樼骇閫夐」",home:"褰掑睘搴旂敤",actionType:"鎿嶄綔绫诲瀷",configureContent:"閰嶇疆鍐呭",operator:"鎿嶄綔浜�",sourceIp:"鏉ユ簮 IP",back:"杩斿洖",namespace:"鍛藉悕绌洪棿"},DashboardCard:{importantReminder0:"閲嶈鎻愰啋",viewDetails1:"鏌ョ湅璇︽儏"},ConfigurationManagement:{exportBtn:"瀵煎嚭",questionnaire2:"闂嵎璋冩煡",ad:"绛� ACM 鍓嶇鐩戞帶璋冩煡闂嵎锛岄檺鏃堕鍙栭樋閲屼簯浠i噾鍒竆t            璇︽儏鐚涙埑",noLongerDisplay4:"涓嶅啀鏄剧ず",createConfiguration:"鍒涘缓閰嶇疆",removeConfiguration:"鍒犻櫎閰嶇疆",sureDelete:"纭畾瑕佸垹闄や互涓嬮厤缃悧锛�",environment:"鍦板煙",configurationManagement:"閰嶇疆鍒楄〃",details:"璇︽儏",sampleCode:"绀轰緥浠g爜",edit:"缂栬緫",deleteAction:"鍒犻櫎",more:"鏇村",version:"鍘嗗彶鐗堟湰",listenerQuery:"鐩戝惉鏌ヨ",failedEntry:"澶辫触鐨勬潯鐩�",successfulEntry:"鎴愬姛鐨勬潯鐩�",unprocessedEntry:"鏈鐞嗙殑鏉$洰",pubNoData:"娌℃湁鏁版嵁",configurationManagement8:"閰嶇疆绠$悊",queryResults:"鏌ヨ鍒�",articleMeetRequirements:"鏉℃弧瓒宠姹傜殑閰嶇疆銆�",fuzzyd:"娣诲姞閫氶厤绗�'*'杩涜妯$硦鏌ヨ",defaultFuzzyd:"宸插紑鍚粯璁ゆā绯婃煡璇�",fuzzyg:"娣诲姞閫氶厤绗�'*'杩涜妯$硦鏌ヨ",defaultFuzzyg:"宸插紑鍚粯璁ゆā绯婃煡璇�",query:"鏌ヨ",advancedQuery9:"楂樼骇鏌ヨ",app1:"璇疯緭鍏ュ簲鐢ㄥ悕",tags:"鏍囩",pleaseEnterTag:"璇疯緭鍏ユ爣绛�",configDetailLabel:"閰嶇疆椤规悳绱�",configDetailH:"鎼滅储鍏蜂綋閰嶇疆椤�",application:"褰掑睘搴旂敤",operation:"鎿嶄綔",export:"瀵煎嚭鏌ヨ缁撴灉",newExport:"鏂扮増瀵煎嚭鏌ヨ缁撴灉",import:"瀵煎叆閰嶇疆",uploadBtn:"涓婁紶鏂囦欢",importSucc:"瀵煎叆鎴愬姛",importAbort:"瀵煎叆缁堟",importSuccBegin:"瀵煎叆鎴愬姛,瀵煎叆浜�",importSuccEnd:"椤归厤缃�",importFail:"瀵煎叆澶辫触",importFail403:"娌℃湁鏉冮檺!",importDataValidationError:"鏈鍙栧埌鍚堟硶鏁版嵁锛岃妫�鏌ュ鍏ョ殑鏁版嵁鏂囦欢銆�",metadataIllegal:"瀵煎叆鐨勫厓鏁版嵁鏂囦欢闈炴硶",namespaceNotExist:"namespace 涓嶅瓨鍦�",abortImport:"缁堟瀵煎叆",skipImport:"璺宠繃",overwriteImport:"瑕嗙洊",importRemind:"鏂囦欢涓婁紶鍚庡皢鐩存帴瀵煎叆閰嶇疆锛岃鍔″繀璋ㄦ厧鎿嶄綔锛�",samePreparation:"鐩稿悓閰嶇疆",targetNamespace:"鐩爣绌洪棿",conflictConfig:"妫�娴嬪埌鍐茬獊鐨勯厤缃」",importSuccEntries:"鎴愬姛瀵煎叆鏉$洰鏁�: ",failureEntries:"澶辫触鐨勬潯鐩�",unprocessedEntries:"鏈鐞嗙殑鏉$洰",unrecognizedEntries:"鏈瘑鍒殑鏉$洰",skippedEntries:"璺宠繃鐨勬潯鐩�",exportSelected:"瀵煎嚭閫変腑鐨勯厤缃�",newExportSelected:"鏂扮増瀵煎嚭閫変腑鐨勯厤缃�",clone:"鍏嬮殕",exportSelectedAlertTitle:"閰嶇疆瀵煎嚭",exportSelectedAlertContent:"璇烽�夋嫨瑕佸鍑虹殑閰嶇疆",cloneSucc:"鍏嬮殕鎴愬姛",cloneAbort:"鍏嬮殕缁堟",cloneSuccBegin:"鍏嬮殕鎴愬姛,鍏嬮殕浜�",cloneSuccEntries:"鎴愬姛鍏嬮殕鏉$洰鏁�: ",cloneSuccEnd:"椤归厤缃�",cloneFail:"鍏嬮殕澶辫触",getNamespaceFailed:"鑾峰彇鍛藉悕绌洪棿澶辫触",getNamespace403:"娌℃湁 ${namespaceName} 鍛藉悕绌洪棿鐨勮闂潈闄愶紒",startCloning:"寮�濮嬪厠闅�",cloningConfiguration:"鍏嬮殕閰嶇疆",source:"婧愮┖闂�",configurationNumber:"閰嶇疆鏁伴噺",target:"鐩爣绌洪棿",selectNamespace:"璇烽�夋嫨鍛藉悕绌洪棿",selectedEntry:"| 閫変腑鐨勬潯鐩�",cloneSelectedAlertTitle:"閰嶇疆鍏嬮殕",cloneSelectedAlertContent:"璇烽�夋嫨瑕佸厠闅嗙殑閰嶇疆",delSelectedAlertTitle:"閰嶇疆鍒犻櫎",delSelectedAlertContent:"璇烽�夋嫨瑕佸垹闄ょ殑閰嶇疆",delSuccessMsg:"鍒犻櫎鎴愬姛",cloneEditableTitle:"淇敼 Data Id 鍜� Group (鍙�夋搷浣�)",authFail:"鏉冮檺璁よ瘉澶辫触"},NewConfig:{newListingMain:"鏂板缓閰嶇疆",newListing:"鏂板缓閰嶇疆",publishFailed:"鍙戝竷澶辫触銆傝妫�鏌ュ弬鏁版槸鍚︽纭��",publishFailed403:"鍙戝竷澶辫触,璇锋鏌ユ槸鍚︽湁鏉冮檺鏂板閰嶇疆",doNotEnter:"涓嶅厑璁搁潪娉曞瓧绗�",newConfig:"Data ID 涓嶈兘涓虹┖",dataIdIsNotEmpty:"Data ID 闀垮害涓嶈兘瓒呰繃255瀛楃",groupPlaceholder:"璇疯緭鍏roup鍚嶇О",moreAdvanced:"Group涓嶈兘涓虹┖",groupNotEmpty:"Group ID闀垮害涓嶈兘瓒呰繃127瀛楃",annotation:"娉ㄦ偍姝e湪寰�涓�涓嚜瀹氫箟鍒嗙粍鏂板閰嶇疆锛岃纭繚瀹㈡埛绔娇鐢ㄧ殑Pandora鐗堟湰楂樹簬3.4.0锛屽惁鍒欏彲鑳借鍙栦笉鍒拌閰嶇疆銆�",dataIdLength:"鏀惰捣",collapse:"鏇村楂樼骇閫夐」",tags:"鏍囩",pleaseEnterTag:"璇疯緭鍏ユ爣绛�",groupIdCannotBeLonger:"褰掑睘搴旂敤",description:"鎻忚堪",targetEnvironment:"閰嶇疆鏍煎紡",configurationFormat:"閰嶇疆鍐呭",configureContentsOf:"鎸塅1鏄剧ず鍏ㄥ睆",fullScreen:"鎸塃sc閫�鍑哄叏灞�",escExit:"鍙戝竷",release:"杩斿洖",confirmSyanx:"閰嶇疆淇℃伅鍙兘鏈夎娉曢敊璇�, 纭畾鎻愪氦鍚�?",dataIdExists:"閰嶇疆宸插瓨鍦�, 璇曡瘯鍒殑dataid鍜実roup鐨勭粍鍚堝惂",dataRequired:"鏁版嵁涓嶈兘涓虹┖, 鎻愪氦澶辫触",namespace:"鍛藉悕绌洪棿"},CloneDialog:{terminate:"缁堟鍏嬮殕",skip:"璺宠繃",cover:"瑕嗙洊",getNamespaceFailed:"鑾峰彇鍛藉悕绌洪棿澶辫触",selectedEntry:"| 閫変腑鐨勬潯鐩�",homeApplication:"褰掑睘搴旂敤",tags:"鏍囩",startCloning:"寮�濮嬪厠闅�",source:"婧愮┖闂�",configurationNumber:"閰嶇疆鏁伴噺",target:"鐩爣绌洪棿",conflict:"鐩稿悓閰嶇疆",selectNamespace:"璇烽�夋嫨鍛藉悕绌洪棿",configurationCloning:"閰嶇疆鍏嬮殕锛�"},DeleteDialog:{confManagement:"閰嶇疆绠$悊",determine:"纭畾",deletetitle:"鍒犻櫎閰嶇疆",deletedSuccessfully:"鍒犻櫎閰嶇疆鎴愬姛",deleteFailed:"鍒犻櫎閰嶇疆澶辫触"},DiffEditorDialog:{publish:"纭鍙戝竷",back:"杩斿洖"},ConfigEditor:{official:"姝e紡",production:"姝e紡",beta:"BETA",wrong:"閿欒",submitFailed:"涓嶈兘涓虹┖, 鎻愪氦澶辫触",toedittitle:"缂栬緫閰嶇疆",toedit:"缂栬緫閰嶇疆",newConfigEditor:"鏂板缓閰嶇疆",vdchart:"璇峰嬁杈撳叆闈炴硶瀛楃",recipientFrom:"Data ID涓嶈兘涓虹┖",homeApplication:"Group涓嶈兘涓虹┖",collapse:"鏀惰捣",groupNotEmpty:"鏇村楂樼骇閫夐」",tags:"鏍囩",pleaseEnterTag:"璇疯緭鍏ユ爣绛�",targetEnvironment:"褰掑睘搴旂敤",description:"鎻忚堪",format:"閰嶇疆鏍煎紡",configcontent:"閰嶇疆鍐呭",escExit:"鎸塅1鏄剧ず鍏ㄥ睆",releaseBeta:"鎸塃sc閫�鍑哄叏灞�",release:"鍙戝竷Beta",stopPublishBeta:"鍋滄Beta",betaPublish:"Beta鍙戝竷",betaSwitchPrompt:"榛樿涓嶈鍕鹃�夈��",publish:"鍙戝竷",back:"杩斿洖",codeValErrorPrompt:"閰嶇疆淇℃伅鍙兘鏈夎娉曢敊璇�, 纭畾鎻愪氦鍚�?",dialogTitle:"鍐呭姣旇緝",dialogCurrentArea:"褰撳墠鍊�",dialogOriginalArea:"鍘熷鍊�",publishFailed403:"鍙戝竷澶辫触,璇锋鏌ユ槸鍚︽湁鏉冮檺",namespace:"鍛藉悕绌洪棿"},EditorNameSpace:{notice:"鎻愮ず",pleaseDo:"璇峰嬁杈撳叆闈炴硶瀛楃",publicSpace:"纭淇敼",confirmModify:"缂栬緫鍛藉悕绌洪棿",editNamespace:"鍔犺浇涓�...",load:"鍛藉悕绌洪棿鍚�",namespace:"鍛藉悕绌洪棿涓嶈兘涓虹┖",namespaceDesc:"鍛藉悕绌洪棿鎻忚堪涓嶈兘涓虹┖",description:"鎻忚堪"},ExportDialog:{selectedEntry:"| 閫変腑鐨勬潯鐩�",application:"褰掑睘搴旂敤",tags:"鏍囩",exportBtn:"瀵煎嚭",exportConfiguration:"瀵煎嚭閰嶇疆锛�",source:"婧愮┖闂�",items:"閰嶇疆鏁伴噺"},ImportDialog:{terminate:"缁堟瀵煎叆",skip:"璺宠繃",overwrite:"瑕嗙洊",zipFileFormat:"鍙兘涓婁紶.zip鏍煎紡鐨勬枃浠�",uploadFile:"涓婁紶鏂囦欢",importLabel:"瀵煎叆閰嶇疆 ( ",target:"鐩爣绌洪棿",conflict:"鐩稿悓閰嶇疆",beSureExerciseCaution:"鏂囦欢涓婁紶鍚庡皢鐩存帴瀵煎叆閰嶇疆锛岃鍔″繀璋ㄦ厧鎿嶄綔"},ShowCodeing:{sampleCode:"绀轰緥浠g爜",loading:"鍔犺浇涓�..."},SuccessDialog:{title:"閰嶇疆绠$悊",determine:"纭畾",failure:"澶辫触"},ConfigSync:{error:"閿欒",syncConfigurationMain:"鍚屾閰嶇疆",syncConfiguration:"鍚屾閰嶇疆鎴愬姛",advancedOptions:"鏇村楂樼骇閫夐」",collapse:"鏀惰捣",home:"褰掑睘搴旂敤",region:"鎵�灞炲湴鍩�",configuration:"閰嶇疆鍐呭",target:"鐩爣鍦板煙",sync:"鍚屾",back:"杩斿洖"},NewNameSpace:{norepeat:"鍛藉悕绌洪棿鍚嶇О涓嶈兘閲嶅",notice:"鎻愮ず",input:"璇峰嬁杈撳叆闈炴硶瀛楃",ok:"纭畾",cancel:"鍙栨秷",newnamespce:"鏂板缓鍛藉悕绌洪棿",loading:"鍔犺浇涓�...",name:"鍛藉悕绌洪棿鍚�",namespaceId:"鍛藉悕绌洪棿ID(涓嶅~鍒欒嚜鍔ㄧ敓鎴�)",namespaceIdTooLong:"鍛藉悕绌洪棿ID闀垮害涓嶈兘瓒呰繃128",namespacenotnull:"鍛藉悕绌洪棿涓嶈兘涓虹┖",namespacedescnotnull:"鍛藉悕绌洪棿鎻忚堪涓嶈兘涓虹┖",description:"鎻忚堪",namespaceIdAlreadyExist:"namespaceId宸插瓨鍦�",newnamespceFailedMessage:"namespaceId鏍煎紡涓嶆纭�/namespaceId闀垮害澶т簬128/namespaceId宸插瓨鍦�"},NameSpaceList:{notice:"鎻愮ず"},ConfigDetail:{official:"姝e紡",error:"閿欒",configurationDetails:"閰嶇疆璇︽儏",collapse:"鏀惰捣",more:"鏇村楂樼骇閫夐」",home:"褰掑睘搴旂敤",tags:"鏍囩",description:"鎻忚堪",betaRelease:"Beta鍙戝竷",configuration:"閰嶇疆鍐呭",back:"杩斿洖",versionComparison:"鐗堟湰瀵规瘮",dialogCurrentArea:"褰撳墠鐗堟湰",dialogOriginalArea:"涓婁竴鐗堟湰",configComparison:"閰嶇疆瀵规瘮",dialogCurrentConfig:"褰撳墠閰嶇疆",dialogComparedConfig:"琚瘮杈冮厤缃�",configComparisonTitle:"閫夋嫨閰嶇疆",dataIdInput:"璇疯緭鍏ata Id",groupInput:"璇疯緭鍏roup",namespaceSelect:"璇烽�夋嫨鍛藉悕绌洪棿",configNotFind:"鏈煡璇㈠埌鎸囧畾閰嶇疆,璇烽噸鏂伴�夋嫨",namespace:"鍛藉悕绌洪棿"},ConfigRollback:{rollBack:"鍥炴粴閰嶇疆",determine:"纭畾瑕�",followingConfiguration:"浠ヤ笅閰嶇疆鍚楋紵",configurationRollback:"閰嶇疆鍥炴粴",collapse:"鏀惰捣",more:"鏇村楂樼骇閫夐」",home:"褰掑睘搴旂敤",actionType:"鎿嶄綔绫诲瀷",configuration:"閰嶇疆鍐呭",back:"杩斿洖",rollbackSuccessful:"鍥炴粴鎴愬姛",rollbackDelete:"鍒犻櫎",update:"鏇存柊",insert:"鎻掑叆",additionalRollbackMessage:"姝ゆ搷浣滃皢鍒犻櫎浠ヤ笅閰嶇疆锛�",namespace:"鍛藉悕绌洪棿"},UserManagement:{userManagement:"鐢ㄦ埛绠$悊",createUser:"鍒涘缓鐢ㄦ埛",resetPassword:"淇敼",deleteUser:"鍒犻櫎",deleteUserTip:"鏄惁瑕佸垹闄よ鐢ㄦ埛锛�",username:"鐢ㄦ埛鍚�",password:"瀵嗙爜",operation:"鎿嶄綔",refresh:"鍒锋柊",query:"鏌ヨ",defaultFuzzyd:"宸插紑鍚粯璁ゆā绯婃煡璇�",fuzzyd:"娣诲姞閫氶厤绗�'*'杩涜妯$硦鏌ヨ"},NewUser:{createUser:"鍒涘缓鐢ㄦ埛",username:"鐢ㄦ埛鍚�",password:"瀵嗙爜",rePassword:"纭瀵嗙爜",usernamePlaceholder:"璇疯緭鍏ョ敤鎴峰悕",passwordPlaceholder:"璇疯緭鍏ュ瘑鐮�",rePasswordPlaceholder:"璇疯緭鍏ョ‘璁ゅ瘑鐮�",usernameError:"鐢ㄦ埛鍚嶄笉鑳戒负绌猴紒",passwordError:"瀵嗙爜涓嶈兘涓虹┖!",rePasswordError:"纭瀵嗙爜涓嶈兘涓虹┖!",rePasswordError2:"涓ゆ杈撳叆瀵嗙爜涓嶄竴鑷�!"},PasswordReset:{resetPassword:"瀵嗙爜閲嶇疆",username:"鐢ㄦ埛鍚�",password:"瀵嗙爜",rePassword:"纭瀵嗙爜",passwordError:"瀵嗙爜涓嶈兘涓虹┖锛�",passwordPlaceholder:"璇疯緭鍏ュ瘑鐮�",rePasswordPlaceholder:"璇疯緭鍏ョ‘璁ゅ瘑鐮�",rePasswordError:"纭瀵嗙爜涓嶈兘涓虹┖!",rePasswordError2:"涓ゆ杈撳叆瀵嗙爜涓嶄竴鑷�!"},RolesManagement:{roleManagement:"瑙掕壊绠$悊",bindingRoles:"缁戝畾瑙掕壊",role:"瑙掕壊鍚�",username:"鐢ㄦ埛鍚�",operation:"鎿嶄綔",deleteRole:"鍒犻櫎",deleteRoleTip:"鏄惁瑕佸垹闄よ瑙掕壊锛�",refresh:"鍒锋柊",defaultFuzzyd:"宸插紑鍚粯璁ゆā绯婃煡璇�",fuzzyd:"娣诲姞閫氶厤绗�'*'杩涜妯$硦鏌ヨ",query:"鏌ヨ"},NewRole:{bindingRoles:"缁戝畾瑙掕壊",username:"鐢ㄦ埛鍚�",role:"瑙掕壊鍚�",usernamePlaceholder:"璇疯緭鍏ョ敤鎴峰悕",rolePlaceholder:"璇疯緭鍏ヨ鑹插悕",usernameError:"鐢ㄦ埛鍚嶄笉鑳戒负绌猴紒",roleError:"瑙掕壊鍚嶄笉鑳戒负绌�!"},PermissionsManagement:{privilegeManagement:"鏉冮檺绠$悊",addPermission:"娣诲姞鏉冮檺",role:"瑙掕壊鍚�",resource:"璧勬簮",action:"鍔ㄤ綔",operation:"鎿嶄綔",deletePermission:"鍒犻櫎",deletePermissionTip:"鏄惁瑕佸垹闄よ鏉冮檺锛�",readOnly:"鍙",writeOnly:"鍙啓",readWrite:"璇诲啓",refresh:"鍒锋柊",defaultFuzzyd:"宸插紑鍚粯璁ゆā绯婃煡璇�",fuzzyd:"娣诲姞閫氶厤绗�'*'杩涜妯$硦鏌ヨ",query:"鏌ヨ"},NewPermissions:{addPermission:"娣诲姞鏉冮檺",role:"瑙掕壊鍚�",resource:"璧勬簮",action:"鍔ㄤ綔",resourcePlaceholder:"璇烽�夋嫨璧勬簮",rolePlaceholder:"璇疯緭鍏ヨ鑹插悕",actionPlaceholder:"璇烽�夋嫨鍔ㄤ綔",resourceError:"璧勬簮涓嶈兘涓虹┖锛�",roleError:"瑙掕壊鍚嶄笉鑳戒负绌�!",actionError:"鍔ㄤ綔涓嶈兘涓虹┖!",readOnly:"鍙",writeOnly:"鍙啓",readWrite:"璇诲啓"}}},l=n(28),s=Object.assign({},r.a,i.enUS),u=Object.assign({},o.a,i.zhCN),d={language:"en-us",locale:s},c=function(n){return function(e){var t="zh-CN"===n?"zh-CN":"en-US";localStorage.setItem(l.f,t),e({type:l.g,language:t,locale:"zh-CN"==t?u:s})}};t.b=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:d,t=1<arguments.length?arguments[1]:void 0;return t.type!==l.g?e:Object(a.a)(Object(a.a)({},e),t)}},function(e,t,n){"use strict";n(35);var a=n(19),r=n.n(a),a=(n(43),n(24)),o=n.n(a),a=(n(32),n(18)),i=n.n(a),l=n(14),s=n(15),u=n(17),d=n(16),a=(n(26),n(8)),a=n.n(a),c=(n(66),n(41)),c=n.n(c),f=n(0),p=n.n(f),h=(n(663),c.a.Row),m=c.a.Col,c=(0,a.a.config)(((f=function(e){Object(u.a)(n,e);var t=Object(d.a)(n);function n(e){return Object(l.a)(this,n),(e=t.call(this,e)).state={visible:!1,title:"",maintitle:"",content:"",isok:!0,dataId:"",group:""},e}return Object(s.a)(n,[{key:"componentDidMount",value:function(){this.initData()}},{key:"initData",value:function(){var e=this.props.locale;this.setState({title:(void 0===e?{}:e).title})}},{key:"openDialog",value:function(e){this.props.unpushtrace&&(e.title=""),this.setState({visible:!0,maintitle:e.maintitle,title:e.title,content:e.content,isok:e.isok,dataId:e.dataId,group:e.group,message:e.message})}},{key:"closeDialog",value:function(){this.setState({visible:!1})}},{key:"render",value:function(){var e=this.props.locale,e=void 0===e?{}:e,t=p.a.createElement("div",{style:{textAlign:"right"}},p.a.createElement(i.a,{type:"primary",onClick:this.closeDialog.bind(this)},e.determine));return p.a.createElement("div",null,p.a.createElement(r.a,{visible:this.state.visible,footer:t,style:{width:555},onCancel:this.closeDialog.bind(this),onClose:this.closeDialog.bind(this),title:this.state.maintitle||this.state.title},p.a.createElement("div",null,p.a.createElement(h,null,p.a.createElement(m,{span:"4",style:{paddingTop:16}},this.state.isok?p.a.createElement(o.a,{type:"success-filling",style:{color:"green"},size:"xl"}):p.a.createElement(o.a,{type:"delete-filling",style:{color:"red"},size:"xl"})),p.a.createElement(m,{span:"20"},p.a.createElement("div",null,this.state.isok?p.a.createElement("h3",null,this.state.title):p.a.createElement("h3",null,this.state.title," ",e.failure),p.a.createElement("p",null,p.a.createElement("span",{style:{color:"#999",marginRight:5}},"Data ID"),p.a.createElement("span",{style:{color:"#c7254e"}},this.state.dataId)),p.a.createElement("p",null,p.a.createElement("span",{style:{color:"#999",marginRight:5}},"Group"),p.a.createElement("span",{style:{color:"#c7254e"}},this.state.group)),this.state.isok?"":p.a.createElement("p",{style:{color:"red"}},this.state.message)))))))}}]),n}(p.a.Component)).displayName="SuccessDialog",n=f))||n;t.a=c},function(e,t){e.exports={server:"",PAGESIZE:15,TIMERDEFAULT:"5s",TIMEDURINT:2e3,is_preview:!1,projectName:"nacos",defaultLanguage:"zh-cn","en-us":{pageMenu:[{key:"home",text:"HOME",link:"https://nacos.io/en-us/index.html"},{key:"docs",text:"DOCS",link:"https://nacos.io/en-us/docs/quick-start.html"},{key:"blog",text:"BLOG",link:"https://nacos.io/en-us/blog"},{key:"community",text:"COMMUNITY",link:"https://nacos.io/en-us/community"},{key:"enterprise",text:"ENTERPRISE EDITION",link:"https://cn.aliyun.com/product/aliware/mse?spm=nacos-website.topbar.0.0.0"}],disclaimer:{title:"Vision",content:"By providing an easy-to-use service infrastructure such as dynamic service discovery, service configuration, service sharing and management and etc., Nacos help users better construct, deliver and manage their own service platform, reuse and composite business service faster and deliver value of business innovation more quickly so as to win market for users in the era of cloud native and in all cloud environments, such as private, mixed, or public clouds."},documentation:{title:"Documentation",list:[{text:"Overview",link:"/en-us/docs/what-is-nacos.html"},{text:"Quick start",link:"/en-us/docs/quick-start.html"},{text:"Developer guide",link:"/en-us/docs/contributing.html"}]},resources:{title:"Resources",list:[{text:"Community",link:"/en-us/community/index.html"}]},copyright:"@ 2018 The Nacos Authors | An Alibaba Middleware (Aliware) Project"},"zh-cn":{pageMenu:[{key:"home",text:"棣栭〉",link:"https://nacos.io/zh-cn/"},{key:"docs",text:"鏂囨。",link:"https://nacos.io/zh-cn/docs/what-is-nacos.html"},{key:"blog",text:"鍗氬",link:"https://nacos.io/zh-cn/blog/index.html"},{key:"community",text:"绀惧尯",link:"https://nacos.io/zh-cn/community/index.html"},{key:"enterprise",text:"Nacos浼佷笟鐗�",link:"https://cn.aliyun.com/product/aliware/mse?spm=nacos-website.topbar.0.0.0"}],disclaimer:{title:"鎰挎櫙",content:"Nacos 閫氳繃鎻愪緵绠�鍗曟槗鐢ㄧ殑鍔ㄦ�佹湇鍔″彂鐜般�佹湇鍔¢厤缃�佹湇鍔″叡浜笌绠$悊绛夋湇鍔″熀纭�璁炬柦锛屽府鍔╃敤鎴峰湪浜戝師鐢熸椂浠o紝鍦ㄧ鏈変簯銆佹贩鍚堜簯鎴栬�呭叕鏈変簯绛夋墍鏈変簯鐜涓紝鏇村ソ鐨勬瀯寤恒�佷氦浠樸�佺鐞嗚嚜宸辩殑寰湇鍔″钩鍙帮紝鏇村揩鐨勫鐢ㄥ拰缁勫悎涓氬姟鏈嶅姟锛屾洿蹇殑浜や粯鍟嗕笟鍒涙柊鐨勪环鍊硷紝浠庤�屼负鐢ㄦ埛璧㈠緱甯傚満銆�"},documentation:{title:"鏂囨。",list:[{text:"姒傝",link:"/zh-cn/docs/what-is-nacos.html"},{text:"蹇�熷紑濮�",link:"/zh-cn/docs/quick-start.html"},{text:"寮�鍙戣�呮寚鍗�",link:"/zh-cn/docs/contributing.html"}]},resources:{title:"璧勬簮",list:[{text:"绀惧尯",link:"/zh-cn/community/index.html"}]},copyright:"@ 2018 The Nacos Authors | An Alibaba Middleware (Aliware) Project"}}},function(e,t,n){var a=n(93);e.exports=function(e){if(a(e))return e;throw TypeError(e+" is not an object!")}},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t,n){"use strict";n(43),n(70),n(537)},function(e,t,n){var i=n(161).default;function l(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(l=function(e){return e?n:t})(e)}e.exports=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};if((t=l(t))&&t.has(e))return t.get(e);var n,a,r={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&((a=o?Object.getOwnPropertyDescriptor(e,n):null)&&(a.get||a.set)?Object.defineProperty(r,n,a):r[n]=e[n]);return r.default=e,t&&t.set(e,r),r},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,t){function n(e,t){var n,a,r,o,i,l,s,u,d;for(null==t&&(t=""),r="",i=e.length,l=null,o=a=0;o<i;){if("\\"===(n=e.charAt(o)))r+=e.slice(o,+(o+1)+1||9e9),o++;else if("("===n)if(o<i-2)if("(?:"===(u=e.slice(o,+(o+2)+1||9e9)))o+=2,r+=u;else if("(?<"===u)for(a++,o+=2,s="";o+1<i;){if(">"===(d=e.charAt(o+1))){r+="(",o++,0<s.length&&((l=null==l?{}:l)[s]=a);break}s+=d,o++}else r+=n,a++;else r+=n;else r+=n;o++}this.rawRegex=e,this.cleanedRegex=r,this.regex=new RegExp(this.cleanedRegex,"g"+t.replace("g","")),this.mapping=l}n.prototype.regex=null,n.prototype.rawRegex=null,n.prototype.cleanedRegex=null,n.prototype.mapping=null,n.prototype.exec=function(e){var t,n,a,r;if(this.regex.lastIndex=0,null==(n=this.regex.exec(e)))return null;if(null!=this.mapping)for(a in r=this.mapping)t=r[a],n[a]=n[t];return n},n.prototype.test=function(e){return this.regex.lastIndex=0,this.regex.test(e)},n.prototype.replace=function(e,t){return this.regex.lastIndex=0,e.replace(this.regex,t)},n.prototype.replaceAll=function(e,t,n){var a;for(null==n&&(n=0),a=this.regex.lastIndex=0;this.regex.test(e)&&(0===n||a<n);)this.regex.lastIndex=0,e=e.replace(this.regex,t),a++;return[e,a]},e.exports=n},function(e,t,s){var n,a={}.hasOwnProperty;function r(){}n=s(111),r.REGEX_LEFT_TRIM_BY_CHAR={},r.REGEX_RIGHT_TRIM_BY_CHAR={},r.REGEX_SPACES=/\s+/g,r.REGEX_DIGITS=/^\d+$/,r.REGEX_OCTAL=/[^0-7]/gi,r.REGEX_HEXADECIMAL=/[^a-f0-9]/gi,r.PATTERN_DATE=new n("^(?<year>[0-9][0-9][0-9][0-9])-(?<month>[0-9][0-9]?)-(?<day>[0-9][0-9]?)(?:(?:[Tt]|[ \t]+)(?<hour>[0-9][0-9]?):(?<minute>[0-9][0-9]):(?<second>[0-9][0-9])(?:.(?<fraction>[0-9]*))?(?:[ \t]*(?<tz>Z|(?<tz_sign>[-+])(?<tz_hour>[0-9][0-9]?)(?::(?<tz_minute>[0-9][0-9]))?))?)?$","i"),r.LOCAL_TIMEZONE_OFFSET=60*(new Date).getTimezoneOffset()*1e3,r.trim=function(e,t){var n,a;return null==(n=this.REGEX_LEFT_TRIM_BY_CHAR[t=null==t?"\\s":t])&&(this.REGEX_LEFT_TRIM_BY_CHAR[t]=n=new RegExp("^"+t+t+"*")),n.lastIndex=0,null==(a=this.REGEX_RIGHT_TRIM_BY_CHAR[t])&&(this.REGEX_RIGHT_TRIM_BY_CHAR[t]=a=new RegExp(t+""+t+"*$")),a.lastIndex=0,e.replace(n,"").replace(a,"")},r.ltrim=function(e,t){var n;return null==(n=this.REGEX_LEFT_TRIM_BY_CHAR[t=null==t?"\\s":t])&&(this.REGEX_LEFT_TRIM_BY_CHAR[t]=n=new RegExp("^"+t+t+"*")),n.lastIndex=0,e.replace(n,"")},r.rtrim=function(e,t){var n;return null==(n=this.REGEX_RIGHT_TRIM_BY_CHAR[t=null==t?"\\s":t])&&(this.REGEX_RIGHT_TRIM_BY_CHAR[t]=n=new RegExp(t+""+t+"*$")),n.lastIndex=0,e.replace(n,"")},r.isEmpty=function(e){return!e||""===e||"0"===e||e instanceof Array&&0===e.length||this.isEmptyObject(e)},r.isEmptyObject=function(t){var n;return t instanceof Object&&0===function(){var e=[];for(n in t)a.call(t,n)&&e.push(n);return e}().length},r.subStrCount=function(e,t,n,a){var r,o,i,l,s=0;for(e=""+e,t=""+t,null!=n&&(e=e.slice(n)),n=(e=null!=a?e.slice(0,a):e).length,l=t.length,r=o=0,i=n;0<=i?o<i:i<o;r=0<=i?++o:--o)t===e.slice(r,l)&&(s++,r+=l-1);return s},r.isDigits=function(e){return this.REGEX_DIGITS.lastIndex=0,this.REGEX_DIGITS.test(e)},r.octDec=function(e){return this.REGEX_OCTAL.lastIndex=0,parseInt((e+"").replace(this.REGEX_OCTAL,""),8)},r.hexDec=function(e){return this.REGEX_HEXADECIMAL.lastIndex=0,"0x"===((e=this.trim(e))+"").slice(0,2)&&(e=(e+"").slice(2)),parseInt((e+"").replace(this.REGEX_HEXADECIMAL,""),16)},r.utf8chr=function(e){var t=String.fromCharCode;return(e%=2097152)<128?t(e):e<2048?t(192|e>>6)+t(128|63&e):e<65536?t(224|e>>12)+t(128|e>>6&63)+t(128|63&e):t(240|e>>18)+t(128|e>>12&63)+t(128|e>>6&63)+t(128|63&e)},r.parseBoolean=function(e,t){var n;return null==t&&(t=!0),"string"==typeof e?(n=e.toLowerCase(),!(!t&&"no"===n)&&("0"!==n&&("false"!==n&&""!==n))):!!e},r.isNumeric=function(e){return this.REGEX_SPACES.lastIndex=0,"number"==typeof e||"string"==typeof e&&!isNaN(e)&&""!==e.replace(this.REGEX_SPACES,"")},r.stringToDate=function(e){var t,n,a,r,o,i,l,s,u;if(null==e||!e.length)return null;if(!(e=this.PATTERN_DATE.exec(e)))return null;if(u=parseInt(e.year,10),i=parseInt(e.month,10)-1,n=parseInt(e.day,10),null==e.hour)return t=new Date(Date.UTC(u,i,n));if(r=parseInt(e.hour,10),o=parseInt(e.minute,10),l=parseInt(e.second,10),null!=e.fraction){for(a=e.fraction.slice(0,3);a.length<3;)a+="0";a=parseInt(a,10)}else a=0;return null!=e.tz&&(s=6e4*(60*parseInt(e.tz_hour,10)+(null!=e.tz_minute?parseInt(e.tz_minute,10):0)),"-"===e.tz_sign&&(s*=-1)),t=new Date(Date.UTC(u,i,n,r,o,l,a)),s&&t.setTime(t.getTime()-s),t},r.strRepeat=function(e,t){for(var n="",a=0;a<t;)n+=e,a++;return n},r.getStringFromFile=function(e,n){var t,a,r,o,i,l;if(null==n&&(n=null),l=null,"undefined"!=typeof window&&null!==window)if(window.XMLHttpRequest)l=new XMLHttpRequest;else if(window.ActiveXObject)for(a=0,r=(i=["Msxml2.XMLHTTP.6.0","Msxml2.XMLHTTP.3.0","Msxml2.XMLHTTP","Microsoft.XMLHTTP"]).length;a<r;a++){o=i[a];try{l=new ActiveXObject(o)}catch(e){}}return null!=l?null!=n?(l.onreadystatechange=function(){if(4===l.readyState)return 200===l.status||0===l.status?n(l.responseText):n(null)},l.open("GET",e,!0),l.send(null)):(l.open("GET",e,!1),l.send(null),200===l.status||0===l.status?l.responseText:null):(t=s(666),null!=n?t.readFile(e,function(e,t){return n(e?null:String(t))}):null!=(t=t.readFileSync(e))?String(t):null)},e.exports=r},function(e,t,n){"use strict";t.__esModule=!0;var a=r(n(8)),n=r(n(613));function r(e){return e&&e.__esModule?e:{default:e}}t.default=a.default.config(n.default,{transform:function(e,t){return"triggerType"in e&&-1<(Array.isArray(e.triggerType)?[].concat(e.triggerType):[e.triggerType]).indexOf("focus")&&t("triggerType[focus]","triggerType[hover, click]","Balloon"),e}}),e.exports=t.default},function(e,t,n){"use strict";function a(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=new Array(t);n<t;n++)a[n]=e[n];return a}n.d(t,"a",function(){return a})},function(e,t){e.exports=function(e,t){if(null==e)return{};for(var n,a={},r=Object.keys(e),o=0;o<r.length;o++)n=r[o],0<=t.indexOf(n)||(a[n]=e[n]);return a},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,t,n){"use strict";n.d(t,"b",function(){return l}),n.d(t,"c",function(){return s});var a=n(21),r=n(34),o=n(28),i={configurations:[]},l=function(e){return function(t){return r.a.get("v1/cs/configs",{params:e}).then(function(e){return t({type:o.a,data:e})})}},s=function(e){return function(t){return r.a.get("v2/cs/config/searchDetail",{params:e}).then(function(e){return t({type:o.a,data:e})})}};t.a=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:i,t=1<arguments.length?arguments[1]:void 0;return t.type!==o.a?e:Object(a.a)(Object(a.a)({},e),{},{configurations:t.data})}},function(e,t,n){"use strict";t.__esModule=!0;var a=r(n(727)),n=r(n(406));function r(e){return e&&e.__esModule?e:{default:e}}a.default.Panel=n.default,t.default=a.default,e.exports=t.default},function(e,t,n){"use strict";n.d(t,"b",function(){return l}),n.d(t,"c",function(){return s});var a=n(21),r=n(34),o=n(28),i={subscribers:{}},l=function(e){return function(t){return r.a.get("v1/ns/service/subscribers",{params:e}).then(function(e){t({type:o.d,data:e})})}},s=function(){return function(e){return e({type:o.j})}};t.a=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:i,t=1<arguments.length?arguments[1]:void 0;switch(t.type){case o.d:return Object(a.a)(Object(a.a)({},e),t.data);case o.j:return Object(a.a)(Object(a.a)({},e),{},{subscribers:{}});default:return e}}},function(e,t,n){"use strict";function o(t,e){var n,a=Object.keys(t);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(t),e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),a.push.apply(a,n)),a}function i(a){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?o(Object(r),!0).forEach(function(e){var t,n;t=a,n=r[e=e],e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach(function(e){Object.defineProperty(a,e,Object.getOwnPropertyDescriptor(r,e))})}return a}function f(e){return"Minified Redux error #"+e+"; visit https://redux.js.org/Errors?code="+e+" for the full message or use the non-minified dev environment for full errors. "}n.d(t,"a",function(){return s}),n.d(t,"b",function(){return r}),n.d(t,"c",function(){return l}),n.d(t,"d",function(){return g});function a(){return Math.random().toString(36).substring(7).split("").join(".")}var p="function"==typeof Symbol&&Symbol.observable||"@@observable",h={INIT:"@@redux/INIT"+a(),REPLACE:"@@redux/REPLACE"+a(),PROBE_UNKNOWN_ACTION:function(){return"@@redux/PROBE_UNKNOWN_ACTION"+a()}};function m(e){if("object"==typeof e&&null!==e){for(var t=e;null!==Object.getPrototypeOf(t);)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t}}function g(e,t,n){if("function"==typeof t&&"function"==typeof n||"function"==typeof n&&"function"==typeof arguments[3])throw new Error(f(0));if("function"==typeof t&&void 0===n&&(n=t,t=void 0),void 0!==n){if("function"!=typeof n)throw new Error(f(1));return n(g)(e,t)}if("function"!=typeof e)throw new Error(f(2));var a=e,r=t,o=[],i=o,l=!1;function s(){i===o&&(i=o.slice())}function u(){if(l)throw new Error(f(3));return r}function d(t){if("function"!=typeof t)throw new Error(f(4));if(l)throw new Error(f(5));var n=!0;return s(),i.push(t),function(){if(n){if(l)throw new Error(f(6));n=!1,s();var e=i.indexOf(t);i.splice(e,1),o=null}}}function c(e){if(!m(e))throw new Error(f(7));if(void 0===e.type)throw new Error(f(8));if(l)throw new Error(f(9));try{l=!0,r=a(r,e)}finally{l=!1}for(var t=o=i,n=0;n<t.length;n++)(0,t[n])();return e}return c({type:h.INIT}),(n={dispatch:c,subscribe:d,getState:u,replaceReducer:function(e){if("function"!=typeof e)throw new Error(f(10));a=e,c({type:h.REPLACE})}})[p]=function(){var n=d,e={subscribe:function(e){if("object"!=typeof e||null===e)throw new Error(f(11));function t(){e.next&&e.next(u())}return t(),{unsubscribe:n(t)}}};return e[p]=function(){return this},e},n}function r(e){for(var t=Object.keys(e),s={},n=0;n<t.length;n++){var a=t[n];"function"==typeof e[a]&&(s[a]=e[a])}var u,r,d=Object.keys(s);try{r=s,Object.keys(r).forEach(function(e){e=r[e];if(void 0===e(void 0,{type:h.INIT}))throw new Error(f(12));if(void 0===e(void 0,{type:h.PROBE_UNKNOWN_ACTION()}))throw new Error(f(13))})}catch(e){u=e}return function(e,t){if(void 0===e&&(e={}),u)throw u;for(var n=!1,a={},r=0;r<d.length;r++){var o=d[r],i=s[o],l=e[o],i=i(l,t);if(void 0===i)throw t&&t.type,new Error(f(14));a[o]=i,n=n||i!==l}return(n=n||d.length!==Object.keys(e).length)?a:e}}function l(){for(var e=arguments.length,t=new 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))}})}function s(){for(var e=arguments.length,o=new Array(e),t=0;t<e;t++)o[t]=arguments[t];return function(r){return function(){var e=r.apply(void 0,arguments),t=function(){throw new Error(f(15))},n={getState:e.getState,dispatch:function(){return t.apply(void 0,arguments)}},a=o.map(function(e){return e(n)}),t=l.apply(void 0,a)(e.dispatch);return i(i({},e),{},{dispatch:t})}}}},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,n){var a=n(193),r=n(147);e.exports=Object.keys||function(e){return a(e,r)}},function(e,t){e.exports=!0},function(e,t){var n=0,a=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++n+a).toString(36))}},function(e,t){t.f={}.propertyIsEnumerable},function(e,t,n){"use strict";t.__esModule=!0,t.default=function(t,e){if(!t)return null;if("string"==typeof t)return document.getElementById(t);if("function"==typeof t)try{t=t(e)}catch(e){t=null}if(!t)return null;try{return(0,a.findDOMNode)(t)}catch(e){return t}};var a=n(23);e.exports=t.default},function(e,t,n){"use strict";n(70),n(536)},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var x=s(n(2)),C=s(n(38)),L=s(n(12)),o=s(n(4)),i=s(n(6)),a=s(n(7)),T=s(n(0)),r=s(n(3)),D=s(n(13)),O=s(n(128)),N=s(n(129)),l=n(11);function s(e){return e&&e.__esModule?e:{default:e}}function u(){}d=T.default.Component,(0,a.default)(c,d),c.prototype.componentDidMount=function(){l.events.on(window,"resize",this.setEmptyDomStyle)},c.prototype.componentDidUpdate=function(){this.setEmptyDomStyle()},c.prototype.componentWillUnmount=function(){l.events.off(window,"resize",this.setEmptyDomStyle)},c.prototype.render=function(){var o=this,e=this.props,i=e.prefix,t=e.className,n=e.children,a=e.component,l=e.colGroup,r=e.loading,s=e.emptyContent,u=e.components,d=e.getCellProps,c=e.primaryKey,f=e.getRowProps,p=e.dataSource,h=e.cellRef,m=e.columns,g=(e.rowRef,e.onRowClick,e.onRowMouseEnter,e.onRowMouseLeave,e.onBodyMouseOver,e.onBodyMouseOut,e.locale),y=e.pure,v=e.expandedIndexSimulate,_=e.tableEl,b=e.rtl,w=e.crossline,e=(e.tableWidth,(0,L.default)(e,["prefix","className","children","component","colGroup","loading","emptyContent","components","getCellProps","primaryKey","getRowProps","dataSource","cellRef","columns","rowRef","onRowClick","onRowMouseEnter","onRowMouseLeave","onBodyMouseOver","onBodyMouseOut","locale","pure","expandedIndexSimulate","tableEl","rtl","crossline","tableWidth"])),M=+(_&&_.clientWidth)-1||"100%",k=u.Row,S=void 0===k?O.default:k,k=u.Cell,E=void 0===k?N.default:k,u=r?T.default.createElement("span",null,"聽"):s||g.empty,k=T.default.createElement("tr",null,T.default.createElement("td",{colSpan:m.length},T.default.createElement("div",{ref:this.getEmptyNode,className:i+"table-empty",style:{position:"sticky",left:0,overflow:"hidden",width:M}},u))),r=("div"===a&&(k=T.default.createElement("table",{role:"table"},T.default.createElement("tbody",null,k))),p.length?k=p.map(function(e,t){var n={},a="object"===(void 0===e?"undefined":(0,C.default)(e))&&"__rowIndex"in e?e.__rowIndex:t,r=(n=(n=v?e.__expanded?{}:f(e,t/2):f(e,a))||{}).className,r=(0,D.default)(((t={first:0===t,last:t===p.length-1})[r]=r,t)),t=e.__expanded?"expanded":"";return T.default.createElement(S,(0,x.default)({key:(e[c]||(0===e[c]?0:a))+t},n,{ref:o.getRowRef.bind(o,t?a+"_expanded":a),colGroup:l,rtl:b,columns:m,primaryKey:c,record:e,rowIndex:a,__rowIndex:a,prefix:i,pure:y,cellRef:h,getCellProps:d,className:r,Cell:E,tableEl:_,onClick:o.onRowClick,locale:g,onMouseEnter:o.onRowMouseEnter,onMouseLeave:o.onRowMouseLeave}))}):this.setEmptyDomStyle(),w?{onMouseOver:this.onBodyMouseOver,onMouseOut:this.onBodyMouseOut}:{});return T.default.createElement(a,(0,x.default)({className:t},e,r),k,n)},a=n=c,n.propTypes={loading:r.default.bool,emptyContent:r.default.any,tableEl:r.default.any,prefix:r.default.string,pure:r.default.bool,components:r.default.object,getCellProps:r.default.func,cellRef:r.default.func,primaryKey:r.default.oneOfType([r.default.symbol,r.default.string]),getRowProps:r.default.func,rowRef:r.default.func,dataSource:r.default.array,children:r.default.any,className:r.default.string,component:r.default.string,colGroup:r.default.object,columns:r.default.array,onRowClick:r.default.func,onRowMouseEnter:r.default.func,onRowMouseLeave:r.default.func,onBodyMouseOver:r.default.func,onBodyMouseOut:r.default.func,locale:r.default.object,crossline:r.default.bool,tableWidth:r.default.number},n.defaultProps={loading:!1,prefix:"next-",components:{},getCellProps:u,cellRef:u,primaryKey:"id",getRowProps:u,rowRef:u,dataSource:[],component:"tbody",columns:[]};var d,r=a;function c(){var e,a;(0,o.default)(this,c);for(var t=arguments.length,n=Array(t),r=0;r<t;r++)n[r]=arguments[r];return(e=a=(0,i.default)(this,d.call.apply(d,[this].concat(n)))).getRowRef=function(e,t){a.props.rowRef(e,t)},a.onRowClick=function(e,t,n){a.props.onRowClick(e,t,n)},a.onRowMouseEnter=function(e,t,n){a.props.onRowMouseEnter(e,t,n)},a.onRowMouseLeave=function(e,t,n){a.props.onRowMouseLeave(e,t,n)},a.onBodyMouseOver=function(e){a.props.onBodyMouseOver(e)},a.onBodyMouseOut=function(e){a.props.onBodyMouseOut(e)},a.getEmptyNode=function(e){a.emptyNode=e},a.setEmptyDomStyle=function(){var e=a.props.tableEl,t=l.dom.getStyle(e,"borderLeftWidth"),e=e&&e.getBoundingClientRect().width;l.dom.setStyle(a.emptyNode,{width:e-t-1||"100%"})},(0,i.default)(a,e)}r.displayName="Body",t.default=r,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var S=u(n(2)),E=u(n(12)),o=u(n(4)),i=u(n(6)),a=u(n(7)),x=u(n(0)),l=n(23),r=u(n(3)),C=u(n(13)),s=n(11),L=n(67);function u(e){return e&&e.__esModule?e:{default:e}}function d(){}c=x.default.Component,(0,a.default)(f,c),f.prototype.shouldComponentUpdate=function(e){return!e.pure||!s.obj.shallowEqual(this.props,e)},f.prototype.onRowHover=function(e,t,n,a){var r=this.props,o=r.onMouseEnter,r=r.onMouseLeave,i=(0,l.findDOMNode)(this);n?(o(e,t,a),i&&s.dom.addClass(i,"hovered")):(r(e,t,a),i&&s.dom.removeClass(i,"hovered"))},f.prototype.renderCells=function(d,c){var f=this,e=this.props,p=e.Cell,h=e.columns,m=e.getCellProps,g=e.cellRef,y=e.prefix,v=e.primaryKey,_=e.__rowIndex,b=e.pure,w=e.locale,M=e.rtl,k=(c=void 0!==c?c:this.props.rowIndex,this.context.lockType);return h.map(function(e,t){var n,a=e.dataIndex,r=e.align,o=(e.alignHeader,e.width),i=(e.colSpan,e.style,e.cellStyle),l=e.__colIndex,s=(0,E.default)(e,["dataIndex","align","alignHeader","width","colSpan","style","cellStyle","__colIndex"]),u="__colIndex"in e?l:t,l=(0,L.fetchDataByPath)(d,a),t=m(c,u,a,d)||{};if(f.context.notRenderCellIndex){a=f.context.notRenderCellIndex.map(function(e){return e.toString()}).indexOf([c,u].toString());if(-1<a)return f.context.notRenderCellIndex.splice(a,1),null}(t.colSpan&&1<t.colSpan||t.rowSpan&&1<t.rowSpan)&&f._getNotRenderCellIndex(u,c,t.colSpan||1,t.rowSpan||1);a=t.className,e=(0,C.default)(((n={first:"right"!==k&&0===u,last:"left"!==k&&(u===h.length-1||u+t.colSpan===h.length)})[e.className]=e.className,n[a]=a,n)),a=(0,S.default)({},t.style,i);return x.default.createElement(p,(0,S.default)({key:_+"-"+u},s,t,{style:a,"data-next-table-col":u,"data-next-table-row":c,ref:function(e){return g(_,u,e)},prefix:y,pure:b,primaryKey:v,record:d,className:e,value:l,colIndex:u,rowIndex:c,align:r,locale:w,rtl:M,width:o}))})},f.prototype._getNotRenderCellIndex=function(e,t,n,a){for(var r=n,o=a,i=[],l=0;l<r;l++)for(var s=0;s<o;s++)i.push([t+s,e+l]);[].push.apply(this.context.notRenderCellIndex,i)},f.prototype.render=function(){var e,t=this.props,n=t.prefix,a=t.className,r=(t.onClick,t.onMouseEnter,t.onMouseLeave,t.columns,t.Cell,t.getCellProps,t.rowIndex,t.record),o=(t.__rowIndex,t.children),i=(t.primaryKey,t.cellRef,t.colGroup,t.pure,t.locale,t.expandedIndexSimulate,t.tableEl,t.rtl,t.wrapper),t=(0,E.default)(t,["prefix","className","onClick","onMouseEnter","onMouseLeave","columns","Cell","getCellProps","rowIndex","record","__rowIndex","children","primaryKey","cellRef","colGroup","pure","locale","expandedIndexSimulate","tableEl","rtl","wrapper"]),n=(0,C.default)(((e={})[n+"table-row"]=!0,e[a]=a,e));return i(x.default.createElement("tr",(0,S.default)({className:n,role:"row"},t,{onClick:this.onClick,onMouseEnter:this.onMouseEnter,onMouseLeave:this.onMouseLeave}),this.renderCells(r),o))},a=n=f,n.propTypes={prefix:r.default.string,pure:r.default.bool,primaryKey:r.default.oneOfType([r.default.symbol,r.default.string]),className:r.default.string,columns:r.default.array,record:r.default.any,Cell:r.default.func,rowIndex:r.default.number,getCellProps:r.default.func,onClick:r.default.func,onMouseEnter:r.default.func,onMouseLeave:r.default.func,children:r.default.any,cellRef:r.default.func,colGroup:r.default.object,locale:r.default.object,wrapper:r.default.func},n.defaultProps={prefix:"next-",primaryKey:"id",columns:[],record:{},getCellProps:d,onClick:d,onMouseEnter:d,onMouseLeave:d,cellRef:d,colGroup:{},wrapper:function(e){return e}},n.contextTypes={notRenderCellIndex:r.default.array,lockType:r.default.oneOf(["left","right"])};var c,n=a;function f(){var e,r;(0,o.default)(this,f);for(var t=arguments.length,n=Array(t),a=0;a<t;a++)n[a]=arguments[a];return(e=r=(0,i.default)(this,c.call.apply(c,[this].concat(n)))).onClick=function(e){var t=r.props,n=t.record,t=t.rowIndex;r.props.onClick(n,t,e)},r.onMouseEnter=function(e){var t=r.props,n=t.record,a=t.rowIndex,t=t.__rowIndex;r.onRowHover(n,t||a,!0,e)},r.onMouseLeave=function(e){var t=r.props,n=t.record,a=t.rowIndex,t=t.__rowIndex;r.onRowHover(n,t||a,!1,e)},(0,i.default)(r,e)}n.displayName="Row",t.default=n,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var _=l(n(2)),b=l(n(12)),a=l(n(4)),r=l(n(6)),o=l(n(7)),w=l(n(0)),i=l(n(3)),M=l(n(13)),k=n(11);function l(e){return e&&e.__esModule?e:{default:e}}s=w.default.Component,(0,o.default)(u,s),u.prototype.shouldComponentUpdate=function(e){return!e.pure||!k.obj.shallowEqual(this.props,e)},u.prototype.render=function(){var e=this.props,t=e.prefix,n=e.className,a=e.cell,r=e.value,o=(e.resizable,e.asyncResizable,e.colIndex,e.rowIndex),i=e.__colIndex,l=e.record,s=e.context,u=e.align,d=e.style,d=void 0===d?{}:d,c=e.component,f=e.children,p=(e.title,e.width,e.innerStyle),h=(e.primaryKey,e.__normalized,e.filterMode,e.filterMenuProps,e.filterProps,e.filters,e.sortable,e.sortDirections,e.lock,e.pure,e.locale,e.expandedIndexSimulate,e.rtl),m=e.isIconLeft,g=(e.type,e.htmlTitle),y=e.wordBreak,e=(0,b.default)(e,["prefix","className","cell","value","resizable","asyncResizable","colIndex","rowIndex","__colIndex","record","context","align","style","component","children","title","width","innerStyle","primaryKey","__normalized","filterMode","filterMenuProps","filterProps","filters","sortable","sortDirections","lock","pure","locale","expandedIndexSimulate","rtl","isIconLeft","type","htmlTitle","wordBreak"]),d=(0,_.default)({},d),v={value:r,index:o,record:l,context:s},r=(w.default.isValidElement(a)?a=w.default.cloneElement(a,v):"function"==typeof a&&(a=a(r,o,l,s)),u&&(d.textAlign=u,h&&(d.textAlign="left"===u?"right":"right"===u?"left":u)),(0,M.default)(((v={})[t+"table-cell"]=!0,v[t+"table-word-break-"+y]=!!y,v[n]=n,v)));return w.default.createElement(c,(0,_.default)({},(0,k.pickAttrs)(e),{className:r,style:d,role:"gridcell"}),w.default.createElement("div",{className:t+"table-cell-wrapper",ref:this.props.getCellDomRef,style:p,title:g,"data-next-table-col":i,"data-next-table-row":o},m?f:a,m?a:f))},o=n=u,n.propTypes={prefix:i.default.string,pure:i.default.bool,primaryKey:i.default.oneOfType([i.default.symbol,i.default.string]),className:i.default.string,record:i.default.any,value:i.default.any,isIconLeft:i.default.bool,colIndex:i.default.number,rowIndex:i.default.number,__colIndex:i.default.oneOfType([i.default.number,i.default.string]),title:i.default.any,width:i.default.oneOfType([i.default.number,i.default.string]),context:i.default.any,cell:i.default.oneOfType([i.default.element,i.default.node,i.default.func]),align:i.default.oneOf(["left","center","right"]),component:i.default.oneOf(["td","th","div"]),children:i.default.any,style:i.default.object,innerStyle:i.default.object,filterMode:i.default.oneOf(["single","multiple"]),filterMenuProps:i.default.object,filterProps:i.default.object,filters:i.default.array,sortable:i.default.bool,sortDirections:i.default.arrayOf(i.default.oneOf(["desc","asc","default"])),lock:i.default.any,type:i.default.oneOf(["header","body"]),resizable:i.default.bool,asyncResizable:i.default.bool,__normalized:i.default.bool},n.defaultProps={component:"td",type:"body",isIconLeft:!1,cell:function(e){return e},prefix:"next-"};var s,i=o;function u(){return(0,a.default)(this,u),(0,r.default)(this,s.apply(this,arguments))}i.displayName="Cell",t.default=i,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var l=f(n(2)),s=f(n(12)),a=f(n(4)),r=f(n(6)),o=f(n(7)),u=f(n(0)),i=n(23),d=f(n(3)),c=f(n(385));function f(e){return e&&e.__esModule?e:{default:e}}p=u.default.Component,(0,o.default)(h,p),h.prototype.componentDidMount=function(){this.context.getNode("header",(0,i.findDOMNode)(this))},h.prototype.render=function(){var e=this.props,t=e.prefix,n=e.className,a=e.colGroup,r=e.tableWidth,e=(0,s.default)(e,["prefix","className","colGroup","tableWidth"]),o=this.context,i=o.onFixedScrollSync,o=o.lockType;return u.default.createElement("div",{className:n,onScroll:i},u.default.createElement("div",{className:t+"table-header-inner",style:{overflow:"unset"}},u.default.createElement("table",{style:{width:r}},a,u.default.createElement(c.default,(0,l.default)({},e,{prefix:t})))),!o&&u.default.createElement("div",{className:t+"table-header-fixer",style:{position:"absolute",right:0}}))},o=n=h,n.propTypes={children:d.default.any,prefix:d.default.string,className:d.default.string,colGroup:d.default.any,tableWidth:d.default.number},n.contextTypes={getNode:d.default.func,onFixedScrollSync:d.default.func,lockType:d.default.oneOf(["left","right"])};var p,n=o;function h(){return(0,a.default)(this,h),(0,r.default)(this,p.apply(this,arguments))}n.displayName="FixedHeader",t.default=n,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var a=l(n(4)),r=l(n(6)),o=l(n(7)),i=l(n(0)),n=l(n(3));function l(e){return e&&e.__esModule?e:{default:e}}s=i.default.Component,(0,o.default)(u,s),u.prototype.render=function(){var e=this.props,t=e.children,n=e.wrapperContent,e=e.prefix;return i.default.createElement("div",{className:e+"table-inner"},t,n)},u.propTypes={children:n.default.any,prefix:n.default.string,colGroup:n.default.any,wrapperContent:n.default.any};var s,o=u;function u(){return(0,a.default)(this,u),(0,r.default)(this,s.apply(this,arguments))}o.displayName="FixedWrapper",t.default=o,e.exports=t.default},function(e,t,n){"use strict";n(43),n(75),n(80),n(683)},function(e,L,t){"use strict";t.r(L),function(e){var a="undefined"!=typeof Map?Map:(Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(e){e=r(this.__entries__,e),e=this.__entries__[e];return e&&e[1]},t.prototype.set=function(e,t){var n=r(this.__entries__,e);~n?this.__entries__[n][1]=t:this.__entries__.push([e,t])},t.prototype.delete=function(e){var t=this.__entries__,e=r(t,e);~e&&t.splice(e,1)},t.prototype.has=function(e){return!!~r(this.__entries__,e)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(e,t){void 0===t&&(t=null);for(var n=0,a=this.__entries__;n<a.length;n++){var r=a[n];e.call(t,r[1],r[0])}},t);function r(e,n){var a=-1;return e.some(function(e,t){return e[0]===n&&(a=t,!0)}),a}function t(){this.__entries__=[]}var n="undefined"!=typeof window&&"undefined"!=typeof document&&window.document===document,o=void 0!==e&&e.Math===Math?e:"undefined"!=typeof self&&self.Math===Math?self:"undefined"!=typeof window&&window.Math===Math?window:Function("return this")(),s="function"==typeof requestAnimationFrame?requestAnimationFrame.bind(o):function(e){return setTimeout(function(){return e(Date.now())},1e3/60)},u=2;var i=["top","right","bottom","left","width","height","size","weight"],l="undefined"!=typeof MutationObserver,d=(c.prototype.addObserver=function(e){~this.observers_.indexOf(e)||this.observers_.push(e),this.connected_||this.connect_()},c.prototype.removeObserver=function(e){var t=this.observers_,e=t.indexOf(e);~e&&t.splice(e,1),!t.length&&this.connected_&&this.disconnect_()},c.prototype.refresh=function(){this.updateObservers_()&&this.refresh()},c.prototype.updateObservers_=function(){var e=this.observers_.filter(function(e){return e.gatherActive(),e.hasActive()});return e.forEach(function(e){return e.broadcastActive()}),0<e.length},c.prototype.connect_=function(){n&&!this.connected_&&(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),l?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},c.prototype.disconnect_=function(){n&&this.connected_&&(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},c.prototype.onTransitionEnd_=function(e){var e=e.propertyName,t=void 0===e?"":e;i.some(function(e){return!!~t.indexOf(e)})&&this.refresh()},c.getInstance=function(){return this.instance_||(this.instance_=new c),this.instance_},c.instance_=null,c);function c(){function e(){o&&(o=!1,a()),i&&n()}function t(){s(e)}function n(){var e=Date.now();if(o){if(e-l<u)return;i=!0}else i=!(o=!0),setTimeout(t,r);l=e}var a,r,o,i,l;this.connected_=!1,this.mutationEventsAdded_=!1,this.mutationsObserver_=null,this.observers_=[],this.onTransitionEnd_=this.onTransitionEnd_.bind(this),this.refresh=(a=this.refresh.bind(this),i=o=!(r=20),l=0,n)}var f=function(e,t){for(var n=0,a=Object.keys(t);n<a.length;n++){var r=a[n];Object.defineProperty(e,r,{value:t[r],enumerable:!1,writable:!1,configurable:!0})}return e},p=function(e){return e&&e.ownerDocument&&e.ownerDocument.defaultView||o},h=b(0,0,0,0);function m(e){return parseFloat(e)||0}function g(n){for(var e=[],t=1;t<arguments.length;t++)e[t-1]=arguments[t];return e.reduce(function(e,t){return e+m(n["border-"+t+"-width"])},0)}function y(e){var t=e.clientWidth,n=e.clientHeight;if(!t&&!n)return h;var a=p(e).getComputedStyle(e),r=function(e){for(var t={},n=0,a=["top","right","bottom","left"];n<a.length;n++){var r=a[n],o=e["padding-"+r];t[r]=m(o)}return t}(a),o=r.left+r.right,i=r.top+r.bottom,l=m(a.width),s=m(a.height);return"border-box"===a.boxSizing&&(Math.round(l+o)!==t&&(l-=g(a,"left","right")+o),Math.round(s+i)!==n&&(s-=g(a,"top","bottom")+i)),e!==p(e).document.documentElement&&(a=Math.round(l+o)-t,e=Math.round(s+i)-n,1!==Math.abs(a)&&(l-=a),1!==Math.abs(e)&&(s-=e)),b(r.left,r.top,l,s)}var v="undefined"!=typeof SVGGraphicsElement?function(e){return e instanceof p(e).SVGGraphicsElement}:function(e){return e instanceof p(e).SVGElement&&"function"==typeof e.getBBox};function _(e){return n?v(e)?b(0,0,(t=(t=e).getBBox()).width,t.height):y(e):h;var t}function b(e,t,n,a){return{x:e,y:t,width:n,height:a}}M.prototype.isActive=function(){var e=_(this.target);return(this.contentRect_=e).width!==this.broadcastWidth||e.height!==this.broadcastHeight},M.prototype.broadcastRect=function(){var e=this.contentRect_;return this.broadcastWidth=e.width,this.broadcastHeight=e.height,e};var w=M;function M(e){this.broadcastWidth=0,this.broadcastHeight=0,this.contentRect_=b(0,0,0,0),this.target=e}var k=function(e,t){n=(t=t).x,a=t.y,o=t.width,t=t.height,r="undefined"!=typeof DOMRectReadOnly?DOMRectReadOnly:Object,r=Object.create(r.prototype),f(r,{x:n,y:a,width:o,height:t,top:a,right:n+o,bottom:t+a,left:n});var n,a,r,o=r;f(this,{target:e,contentRect:o})},S=(E.prototype.observe=function(e){if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");if("undefined"!=typeof Element&&Element instanceof Object){if(!(e instanceof p(e).Element))throw new TypeError('parameter 1 is not of type "Element".');var t=this.observations_;t.has(e)||(t.set(e,new w(e)),this.controller_.addObserver(this),this.controller_.refresh())}},E.prototype.unobserve=function(e){if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");if("undefined"!=typeof Element&&Element instanceof Object){if(!(e instanceof p(e).Element))throw new TypeError('parameter 1 is not of type "Element".');var t=this.observations_;t.has(e)&&(t.delete(e),t.size||this.controller_.removeObserver(this))}},E.prototype.disconnect=function(){this.clearActive(),this.observations_.clear(),this.controller_.removeObserver(this)},E.prototype.gatherActive=function(){var t=this;this.clearActive(),this.observations_.forEach(function(e){e.isActive()&&t.activeObservations_.push(e)})},E.prototype.broadcastActive=function(){var e,t;this.hasActive()&&(e=this.callbackCtx_,t=this.activeObservations_.map(function(e){return new k(e.target,e.broadcastRect())}),this.callback_.call(e,t,e),this.clearActive())},E.prototype.clearActive=function(){this.activeObservations_.splice(0)},E.prototype.hasActive=function(){return 0<this.activeObservations_.length},E);function E(e,t,n){if(this.activeObservations_=[],this.observations_=new a,"function"!=typeof e)throw new TypeError("The callback provided as parameter 1 is not a function.");this.callback_=e,this.controller_=t,this.callbackCtx_=n}var x=new("undefined"!=typeof WeakMap?WeakMap:a),C=function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var n=d.getInstance(),t=new S(t,n,this);x.set(this,t)},e=(["observe","unobserve","disconnect"].forEach(function(t){C.prototype[t]=function(){var e;return(e=x.get(this))[t].apply(e,arguments)}}),void 0!==o.ResizeObserver?o.ResizeObserver:C);L.default=e}.call(this,t(351))},function(e,t,n){"use strict";n.d(t,"a",function(){return r});var a=n(114);function r(e,t){if(e){if("string"==typeof e)return Object(a.a)(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Map"===(n="Object"===n&&e.constructor?e.constructor.name:n)||"Set"===n?Array.from(n):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Object(a.a)(e,t):void 0}}},function(e,t,n){"use strict";n(158);var a=n(113),f=n.n(a),a=(n(80),n(50)),p=n.n(a),i=n(31),l=n(14),s=n(15),u=n(17),d=n(16),a=(n(26),n(8)),a=n.n(a),r=n(21),o=n(0),h=n.n(o),o=n(40),c=n(37),m=n(106),g=n.n(m),m=n(104),y=n(136),v=n(45),o=(n(611),n=Object(c.b)(function(e){return Object(r.a)({},e.locale)},{changeLanguage:m.a}),c=a.a.config,Object(o.g)(a=n(a=c(((m=function(e){Object(u.a)(o,e);var r=Object(d.a)(o);function o(){var n;Object(l.a)(this,o);for(var e=arguments.length,t=new Array(e),a=0;a<e;a++)t[a]=arguments[a];return(n=r.call.apply(r,[this].concat(t))).state={passwordResetUser:""},n.switchLang=function(){var e=n.props,t=e.language;(0,e.changeLanguage)("en-US"===(void 0===t?"en-US":t)?"zh-CN":"en-US")},n.logout=function(){window.localStorage.clear(),n.props.history.push("/login")},n.changePassword=function(){n.setState({passwordResetUser:n.getUsername(),passwordResetUserVisible:!0})},n.getUsername=function(){var e=window.localStorage.getItem("token");if(e){e=e.split("."),e=Object(i.a)(e,2)[1],e=(void 0===e?"":e).replace("-","+").replace("_","/");try{return JSON.parse(decodeURIComponent(escape(window.atob(e)))).sub}catch(e){delete localStorage.token,location.reload()}}return""},n.indexAction=function(){n.props.history.push("/")},n}return Object(s.a)(o,[{key:"render",value:function(){var e=this,t=this.props,n=t.locale,n=void 0===n?{}:n,a=t.language,a=void 0===a?"en-us":a,t=t.location.pathname,r=n.home,o=n.docs,i=n.blog,l=n.community,s=n.enterprise,u=n.languageSwitchButton,d=this.state,c=d.passwordResetUser,c=void 0===c?"":c,d=d.passwordResetUserVisible,d=void 0!==d&&d,a="https://nacos.io/".concat(a.toLocaleLowerCase(),"/"),r=[{id:1,title:r,link:a},{id:2,title:o,link:"".concat(a,"docs/what-is-nacos.html")},{id:3,title:i,link:"".concat(a,"blog/index.html")},{id:4,title:l,link:"".concat(a,"community/index.html")},{id:5,title:s,link:"https://cn.aliyun.com/product/aliware/mse?spm=nacos-website.topbar.0.0.0"}];return h.a.createElement(h.a.Fragment,null,h.a.createElement("header",{className:"header-container header-container-primary"},h.a.createElement("div",{className:"header-body"},h.a.createElement("a",{href:"#",onClick:this.indexAction,rel:"noopener noreferrer"},h.a.createElement("img",{src:"img/logo-2000-390.svg",className:"logo",alt:g.a.name,title:g.a.name})),"/login"!==t&&h.a.createElement(f.a,{trigger:h.a.createElement("div",{className:"logout"},this.getUsername())},h.a.createElement(p.a,null,h.a.createElement(p.a.Item,{onClick:this.logout},n.logout),h.a.createElement(p.a.Item,{onClick:this.changePassword},n.changePassword))),h.a.createElement("span",{className:"language-switch language-switch-primary",onClick:this.switchLang},u),h.a.createElement("div",{className:"header-menu header-menu-open"},h.a.createElement("ul",null,r.map(function(e){return h.a.createElement("li",{key:e.id,className:"menu-item menu-item-primary"},h.a.createElement("a",{href:e.link,target:"_blank",rel:"noopener noreferrer"},e.title))}))))),h.a.createElement(y.a,{visible:d,username:c,onOk:function(e){return Object(v.k)(e).then(function(e){return e})},onCancel:function(){return e.setState({passwordResetUser:void 0,passwordResetUserVisible:!1})}}))}}]),o}(h.a.Component)).displayName="Header",a=m))||a)||a)||a);t.a=o},function(e,t,n){"use strict";n(35);var a=n(19),l=n.n(a),a=(n(36),n(10)),s=n.n(a),i=n(61),u=n(31),a=(n(49),n(27)),d=n.n(a),c=n(14),f=n(15),p=n(22),h=n(17),m=n(16),a=(n(26),n(8)),a=n.n(a),r=(n(39),n(5)),g=n.n(r),r=n(0),y=n.n(r),v=(n(159),g.a.Item),_={labelCol:{fixedSpan:4},wrapperCol:{span:19}},a=(0,a.a.config)(((r=function(e){Object(h.a)(o,e);var r=Object(m.a)(o);function o(){var e;Object(c.a)(this,o);for(var t=arguments.length,n=new Array(t),a=0;a<t;a++)n[a]=arguments[a];return(e=r.call.apply(r,[this].concat(n))).field=new d.a(Object(p.a)(e)),e}return Object(f.a)(o,[{key:"check",value:function(){var n=this,e=this.props.locale,a={password:e.passwordError,rePassword:e.rePasswordError},t=Object.keys(a).map(function(e){var t=n.field.getValue(e);return t||n.field.setError(e,a[e]),t});if(2!==t.filter(function(e){return e}).length)return null;var r=["password","rePassword"].map(function(e){return n.field.getValue(e)}),r=Object(u.a)(r,2);return r[0]!==r[1]?(this.field.setError("rePassword",e.rePasswordError2),null):[this.props.username].concat(Object(i.a)(t))}},{key:"render",value:function(){var t=this,e=this.props.locale,n=this.field.getError,a=this.props,r=a.username,o=a.onOk,i=a.onCancel,a=a.visible;return y.a.createElement(y.a.Fragment,null,y.a.createElement(l.a,{title:e.resetPassword,visible:a,onOk:function(){var e=t.check();e&&o(e).then(function(){return i()})},onClose:i,onCancel:i,afterClose:function(){return t.field.reset()}},y.a.createElement(g.a,Object.assign({style:{width:400}},_,{field:this.field}),y.a.createElement(v,{label:e.username,required:!0},y.a.createElement("p",null,r)),y.a.createElement(v,{label:e.password,required:!0,help:n("password")},y.a.createElement(s.a,{name:"password",htmlType:"password",placeholder:e.passwordPlaceholder})),y.a.createElement(v,{label:e.rePassword,required:!0,help:n("rePassword")},y.a.createElement(s.a,{name:"rePassword",htmlType:"password",placeholder:e.rePasswordPlaceholder})))))}}]),o}(y.a.Component)).displayName="PasswordReset",n=r))||n;t.a=a},function(e,t,n){e.exports=n(583)},function(e,t,n){"use strict";var a=n(417);function c(e){for(var t,n=e.length,a=0,r=n,o=!1,i=!1;a<n;){if(("="===(t=e[a])||":"===t)&&!i){r=a+1,o=!0;break}if((" "===t||"\t"===t||"\f"===t)&&!i){r=a+1;break}i="\\"===t&&!i,a++}for(;r<n;){if(" "!==(t=e[r])&&"\t"!==t&&"\f"!==t){if(o||"="!==t&&":"!==t)break;o=!0}r++}return l(e,0,a)&&l(e,r,n)}function l(e,t,n){if(n<=t)return!1;for(var a,r=0;r<e.length;)if("\\"===e[r++]){if(!function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:"";return"abfnrt\\\"'0! #:=u".includes(e)}(a=e[r++]))return!1;if("u"===a){if(null===e.slice(r,r+4).join("").match(/^[a-f0-9]{4}$/i))return!1;r+=4}}return!0}t.a={validateJson:function(e){try{return!!JSON.parse(e)}catch(e){return!1}},validateXml:function(e){try{var t;return"undefined"!=typeof DOMParser?0===((new window.DOMParser).parseFromString(e,"application/xml").getElementsByTagName("parsererror")||{}).length:void 0!==window.ActiveXObject?((t=new window.ActiveXObject("Microsoft.XMLDOM")).async="false",t.loadXML(e),t):void 0}catch(e){return!1}},validateYaml:function(e){try{return a.parse(e)}catch(e){return!1}},validateProperties:function(){for(var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:"",t=!0,n=!1,a=!0,r=!1,o=!1,i=!1,l=!1,s=[],u=0;u<e.length;u++){var d=e[u];if(!i||(i=!1,"\n"!==d)){if(a){if(" "===d||"\t"===d||"\f"===d)continue;if(!o&&("\r"===d||"\n"===d))continue;a=o=!1}if(t&&(t=!1,"#"===d||"!"===d))n=!0;else if("\n"!==d&&"\r"!==d)s.push(d),r="\\"===d&&!r;else if(n||0===s.length)a=!(n=!(t=!0)),s=[];else if(r)s.pop(),o=a=!(r=!1),"\r"===d&&(i=!0);else{if(!c(s))return!1;s=[],a=t=l=!0}}}return 0<s.length&&!n?c(s):l},validate:function(e){var t=e.content,e=e.type,n={json:this.validateJson,xml:this.validateXml,"text/html":this.validateXml,html:this.validateXml,properties:this.validateProperties,yaml:this.validateYaml};return!n[e]||n[e](t)}}},function(e,t,n){"use strict";t.__esModule=!0;var i=s(n(2)),l=s(n(12)),a=s(n(8)),r=s(n(680)),o=s(n(681)),n=s(n(178));function s(e){return e&&e.__esModule?e:{default:e}}r.default.Tooltip=a.default.config(o.default,{transform:function(e,t){var n;return"text"in e&&(t("text","children","Tooltip"),n=(t=e).text,t=(0,l.default)(t,["text"]),e=(0,i.default)({children:n},t)),e}}),r.default.Inner=n.default,t.default=a.default.config(r.default,{transform:function(e,t){var n,a,r,o;return e.alignment&&(t("alignment","alignEdge","Balloon"),n=(o=e).alignment,o=(0,l.default)(o,["alignment"]),e=(0,i.default)({alignEdge:"edge"===n},o)),e.onCloseClick&&(t("onCloseClick",'onVisibleChange(visible, [type = "closeClick"])',"Balloon"),a=(n=e).onCloseClick,r=n.onVisibleChange,o=(0,l.default)(n,["onCloseClick","onVisibleChange"]),e=(0,i.default)({onVisibleChange:function(e,t){"closeClick"===t&&a(),r&&r(e,t)}},o)),e}}),e.exports=t.default},function(e,t,n){"use strict";n(35);var a=n(19),f=n.n(a),a=(n(59),n(29)),p=n.n(a),h=n(21),a=(n(39),n(5)),m=n.n(a),a=(n(36),n(10)),g=n.n(a),a=(n(51),n(25)),l=n.n(a),r=n(14),o=n(15),i=n(22),s=n(17),u=n(16),a=(n(26),n(8)),a=n.n(a),d=n(0),y=n.n(d),c=n(1),v=n(68),_=n(83),a=(0,a.a.config)(((d=function(e){Object(s.a)(n,e);var t=Object(u.a)(n);function n(e){return Object(r.a)(this,n),(e=t.call(this,e)).getFormItemLayout=function(){return{labelCol:{span:6},wrapperCol:{span:14}}},e.state={isCreate:!1,editService:{},editServiceDialogVisible:!1,errors:{name:{},protectThreshold:{}},selectorTypes:[]},e.show=e.show.bind(Object(i.a)(e)),e}return Object(o.a)(n,[{key:"show",value:function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},t=e.metadata,t=void 0===t?{}:t,n=e.name;Object.keys(t).length&&(e.metadataText=JSON.stringify(t,null,"\t")),this.setState({editService:e,editServiceDialogVisible:!0,isCreate:!n}),this.getSelectorTypes()}},{key:"hide",value:function(){this.setState({editServiceDialogVisible:!1})}},{key:"validator",value:function(e){var t,n=this.props.locale,n=void 0===n?{}:n,a=Object.assign({},this.state.errors),r={name:n.serviceNameRequired,protectThreshold:n.protectThresholdRequired};for(t in 0===e.protectThreshold&&(e.protectThreshold="0"),e)if(!e[t])return a[t]={validateState:"error",help:r[t]},this.setState({errors:a}),!1;return!0}},{key:"onConfirm",value:function(){var t=this,n=this.state.isCreate,e=Object.assign({},this.state.editService),a=e.name,r=e.protectThreshold,o=e.groupName,i=e.metadataText,i=void 0===i?"":i,e=e.selector;this.validator({name:a,protectThreshold:r})&&(Object(c.b)({method:n?"POST":"PUT",url:"v1/ns/service",data:{serviceName:a,groupName:o||"DEFAULT_GROUP",protectThreshold:r,metadata:i,selector:JSON.stringify(e)},dataType:"text",beforeSend:function(){return t.setState({loading:!0})},success:function(e){"ok"!==e?l.a.error(e):n?t.props.queryServiceList():t.props.getServiceDetail()},error:function(e){return l.a.error(e.responseText||e.statusText)},complete:function(){return t.setState({loading:!1})}}),this.hide())}},{key:"onChangeCluster",value:function(t){var n=this,e=this.state.editService,e=void 0===e?{}:e,a=Object.assign({},this.state.errors);["name","protectThreshold"].forEach(function(e){t[e]&&(a[e]={},n.setState({errors:a}))}),this.setState({editService:Object.assign({},e,t)})}},{key:"getSelectorTypes",value:function(){var t=this;Object(c.b)({method:"GET",url:"v1/ns/service/selector/types",success:function(e){200!==e.code?l.a.error(e.message):t.setState({selectorTypes:e.data})}})}},{key:"render",value:function(){var t=this,e=this.props.locale,e=void 0===e?{}:e,n=this.state,a=n.isCreate,r=n.editService,o=n.editServiceDialogVisible,i=n.errors,n=n.selectorTypes,l=r.name,s=r.protectThreshold,u=r.groupName,d=r.metadataText,r=r.selector,c=void 0===r?{type:"none"}:r,r=this.getFormItemLayout();return y.a.createElement(f.a,{className:"service-detail-edit-dialog",title:a?e.createService:e.updateService,visible:o,onOk:function(){return t.onConfirm()},onCancel:function(){return t.hide()},onClose:function(){return t.hide()}},y.a.createElement(m.a,v.a,y.a.createElement(m.a.Item,Object.assign({required:a},r,{label:"".concat(e.serviceName)},i.name),a?y.a.createElement(g.a,{value:l,onChange:function(e){return t.onChangeCluster({name:e})}}):y.a.createElement("p",null,l)),y.a.createElement(m.a.Item,Object.assign({required:!0},r,{label:"".concat(e.protectThreshold)},i.protectThreshold),y.a.createElement(g.a,{value:s,onChange:function(e){return t.onChangeCluster({protectThreshold:e})}})),y.a.createElement(m.a.Item,Object.assign({},r,{label:"".concat(e.groupName)}),y.a.createElement(g.a,{defaultValue:u,placeholder:"DEFAULT_GROUP",readOnly:!a,onChange:function(e){return t.onChangeCluster({groupName:e})}})),y.a.createElement(m.a.Item,Object.assign({label:"".concat(e.metadata)},r),y.a.createElement(_.a,{language:"json",width:"100%",height:200,value:d,onChange:function(e){return t.onChangeCluster({metadataText:e})}})),y.a.createElement(m.a.Item,Object.assign({label:"".concat(e.type)},r),y.a.createElement(p.a,{className:"full-width",defaultValue:c.type,onChange:function(e){return t.onChangeCluster({selector:Object(h.a)(Object(h.a)({},c),{},{type:e})})}},n.map(function(e){return y.a.createElement(p.a.Option,{value:e},e)}))),"none"!==c.type&&y.a.createElement(m.a.Item,Object.assign({label:"".concat(e.selector)},r),y.a.createElement(g.a.TextArea,{value:c.expression,onChange:function(e){return t.onChangeCluster({selector:Object(h.a)(Object(h.a)({},c),{},{expression:e})})}}))))}}]),n}(y.a.Component)).displayName="EditServiceDialog",n=d))||n;t.a=a},,function(e,t,n){var r=n(93);e.exports=function(e,t){if(!r(e))return e;var n,a;if(t&&"function"==typeof(n=e.toString)&&!r(a=n.call(e))||"function"==typeof(n=e.valueOf)&&!r(a=n.call(e))||!t&&"function"==typeof(n=e.toString)&&!r(a=n.call(e)))return a;throw TypeError("Can't convert object to primitive value")}},function(e,t){e.exports=function(e){if(null==e)throw TypeError("Can't call method on  "+e);return e}},function(e,t){var n=Math.ceil,a=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(0<e?a:n)(e)}},function(e,t,n){var a=n(146)("keys"),r=n(123);e.exports=function(e){return a[e]||(a[e]=r(e))}},function(e,t,n){var a=n(77),r=n(76),o="__core-js_shared__",i=r[o]||(r[o]={});(e.exports=function(e,t){return i[e]||(i[e]=void 0!==t?t:{})})("versions",[]).push({version:a.version,mode:n(122)?"pure":"global",copyright:"漏 2020 Denis Pushkarev (zloirock.ru)"})},function(e,t){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(e,t){t.f=Object.getOwnPropertySymbols},function(e,t,n){var a=n(143);e.exports=function(e){return Object(a(e))}},function(e,t){e.exports={}},function(e,t,n){function a(){}var r=n(107),o=n(473),i=n(147),l=n(145)("IE_PROTO"),s="prototype",u=function(){var e=n(192)("iframe"),t=i.length;for(e.style.display="none",n(474).appendChild(e),e.src="javascript:",(e=e.contentWindow.document).open(),e.write("<script>document.F=Object<\/script>"),e.close(),u=e.F;t--;)delete u[s][i[t]];return u()};e.exports=Object.create||function(e,t){var n;return null!==e?(a[s]=r(e),n=new a,a[s]=null,n[l]=e):n=u(),void 0===t?n:o(n,t)}},function(e,t,n){var a=n(84).f,r=n(85),o=n(95)("toStringTag");e.exports=function(e,t,n){e&&!r(e=n?e:e.prototype,o)&&a(e,o,{configurable:!0,value:t})}},function(e,t,n){t.f=n(95)},function(e,t,n){var a=n(76),r=n(77),o=n(122),i=n(153),l=n(84).f;e.exports=function(e){var t=r.Symbol||(r.Symbol=!o&&a.Symbol||{});"_"==e.charAt(0)||e in t||l(t,e,{value:i.f(e)})}},function(e,t,n){"use strict";t.__esModule=!0;var a=d(n(205)),r=d(n(501)),o=d(n(502)),i=d(n(503)),l=d(n(504)),s=d(n(505)),u=d(n(506));function d(e){return e&&e.__esModule?e:{default:e}}n(507),a.default.extend(s.default),a.default.extend(l.default),a.default.extend(r.default),a.default.extend(o.default),a.default.extend(i.default),a.default.extend(u.default),a.default.locale("zh-cn");n=a.default;n.isSelf=a.default.isDayjs,a.default.localeData(),t.default=n,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var v=c(n(2)),o=c(n(4)),i=c(n(6)),a=c(n(7)),r=n(0),_=c(r),l=c(n(3)),s=n(30),b=c(n(13)),u=c(n(44)),w=c(n(24)),M=c(n(79)),d=c(n(8)),k=n(11);function c(e){return e&&e.__esModule?e:{default:e}}function f(){}p=r.Component,(0,a.default)(S,p),S.getDerivedStateFromProps=function(e){return"visible"in e?{visible:e.visible}:{}},S.prototype.render=function(){var e,t=this.props,n=t.prefix,a=(t.pure,t.className),r=t.style,o=t.type,i=t.shape,l=t.size,s=t.title,u=t.children,d=(t.defaultVisible,t.visible,t.iconType),c=t.closeable,f=(t.onClose,t.afterClose),p=t.animation,h=t.rtl,t=t.locale,m=(0,v.default)({},k.obj.pickOthers(Object.keys(S.propTypes),this.props)),g=this.state.visible,y=n+"message",o=(0,b.default)(((e={})[y]=!0,e[n+"message-"+o]=o,e[""+n+i]=i,e[""+n+l]=l,e[n+"title-content"]=!!s,e[n+"only-content"]=!s&&!!u,e[a]=a,e)),i=g?_.default.createElement("div",(0,v.default)({role:"alert",style:r},m,{className:o,dir:h?"rtl":void 0}),c?_.default.createElement("a",{role:"button","aria-label":t.closeAriaLabel,className:y+"-close",onClick:this.onClose},_.default.createElement(w.default,{type:"close"})):null,!1!==d?_.default.createElement(w.default,{className:y+"-symbol "+(!d&&y+"-symbol-icon"),type:d}):null,s?_.default.createElement("div",{className:y+"-title"},s):null,u?_.default.createElement("div",{className:y+"-content"},u):null):null;return p?_.default.createElement(M.default.Expand,{animationAppear:!1,afterLeave:f},i):i},r=n=S,n.propTypes={prefix:l.default.string,pure:l.default.bool,className:l.default.string,style:l.default.object,type:l.default.oneOf(["success","warning","error","notice","help","loading"]),shape:l.default.oneOf(["inline","addon","toast"]),size:l.default.oneOf(["medium","large"]),title:l.default.node,children:l.default.node,defaultVisible:l.default.bool,visible:l.default.bool,iconType:l.default.oneOfType([l.default.string,l.default.bool]),closeable:l.default.bool,onClose:l.default.func,afterClose:l.default.func,animation:l.default.bool,locale:l.default.object,rtl:l.default.bool},n.defaultProps={prefix:"next-",pure:!1,type:"success",shape:"inline",size:"medium",defaultVisible:!0,closeable:!1,onClose:f,afterClose:f,animation:!0,locale:u.default.Message};var p,a=r;function S(){var e,t;(0,o.default)(this,S);for(var n=arguments.length,a=Array(n),r=0;r<n;r++)a[r]=arguments[r];return(e=t=(0,i.default)(this,p.call.apply(p,[this].concat(a)))).state={visible:void 0===t.props.visible?t.props.defaultVisible:t.props.visible},t.onClose=function(){"visible"in t.props||t.setState({visible:!1}),t.props.onClose(!1)},(0,i.default)(t,e)}a.displayName="Message",t.default=d.default.config((0,s.polyfill)(a)),e.exports=t.default},function(e,t,n){"use strict";var a=i(n(519)),r=i(n(523)),o=i(n(347)),n=i(n(345));function i(e){return e&&e.__esModule?e:{default:e}}e.exports={Transition:n.default,TransitionGroup:o.default,ReplaceTransition:r.default,CSSTransition:a.default}},function(e,t,n){"use strict";n(75),n(539)},function(e,t,n){},function(e,t,n){n=n(550)();e.exports=n;try{regeneratorRuntime=n}catch(e){"object"==typeof globalThis?globalThis.regeneratorRuntime=n:Function("r","regeneratorRuntime = r")(n)}},function(t,e){function n(e){return t.exports=n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t.exports.__esModule=!0,t.exports.default=t.exports,n(e)}t.exports=n,t.exports.__esModule=!0,t.exports.default=t.exports},function(e,t){function s(e,t,n,a,r,o,i){try{var l=e[o](i),s=l.value}catch(e){return void n(e)}l.done?t(s):Promise.resolve(s).then(a,r)}e.exports=function(l){return function(){var e=this,i=arguments;return new Promise(function(t,n){var a=l.apply(e,i);function r(e){s(a,t,n,r,o,"next",e)}function o(e){s(a,t,n,r,o,"throw",e)}r(void 0)})}},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,t){e.exports=function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var u=m(n(2)),a=m(n(4)),r=m(n(6)),o=m(n(7)),i=n(0),d=m(i),l=m(n(3)),c=m(n(13)),s=m(n(18)),f=m(n(24)),p=m(n(44)),h=n(11);function m(e){return e&&e.__esModule?e:{default:e}}function g(){}var y,v=h.func.makeChain,_=h.obj.pickOthers,o=(y=i.Component,(0,o.default)(b,y),b.prototype.componentDidUpdate=function(){var e,t=this.props,n=t.maxHeight,a=t.height,n=void 0===a?n:a,a=t.v2;this.bodyNode&&a&&n&&"auto"!==n&&(t={},e=a=0,a=(a=this.headerNode?this.headerNode.getBoundingClientRect().height:a)+(e=this.footerNode?this.footerNode.getBoundingClientRect().height:e),t.minHeight=a,(e=n)&&"string"==typeof n&&(e.match(/calc|vh/)?(t.maxHeight="calc("+n+" - "+a+"px)",t.overflowY="auto"):e=parseInt(n)),"number"==typeof e&&a<e&&(t.maxHeight=e-a,t.overflowY="auto"),h.dom.setStyle(this.bodyNode,t))},b.prototype.getNode=function(e,t){this[e]=t},b.prototype.renderHeader=function(){var e=this.props,t=e.prefix,e=e.title;return e?(this.titleId=(0,h.guid)("dialog-title-"),d.default.createElement("div",{className:t+"dialog-header",id:this.titleId,ref:this.getNode.bind(this,"headerNode"),role:"heading","aria-level":"1"},e)):null},b.prototype.renderBody=function(){var e,t=this.props,n=t.prefix,a=t.children,t=t.footer;return a?d.default.createElement("div",{className:(0,c.default)(n+"dialog-body",((e={})[n+"dialog-body-no-footer"]=!1===t,e)),ref:this.getNode.bind(this,"bodyNode")},a):null},b.prototype.renderFooter=function(){var e,n=this,t=this.props,a=t.prefix,r=t.footer,o=t.footerAlign,i=t.footerActions,l=t.locale,t=t.height;if(!1===r)return null;o=(0,c.default)(((e={})[a+"dialog-footer"]=!0,e[a+"align-"+o]=!0,e[a+"dialog-footer-fixed-height"]=!!t,e)),t=!0!==r&&r?r:i.map(function(e){var t=n.props[e+"Props"],t=(0,u.default)({},t,{prefix:a,className:(0,c.default)(a+"dialog-btn",t.className),onClick:v(n.props["on"+(e[0].toUpperCase()+e.slice(1))],t.onClick),children:t.children||l[e]});return"ok"===e&&(t.type="primary"),d.default.createElement(s.default,(0,u.default)({key:e},t))});return d.default.createElement("div",{className:o,ref:this.getNode.bind(this,"footerNode")},t)},b.prototype.renderCloseLink=function(){var e=this.props,t=e.prefix,n=e.closeable,a=e.onClose,r=e.locale,e=e.closeIcon;return n?d.default.createElement("a",{role:"button","aria-label":r.close,className:t+"dialog-close",onClick:a},e||d.default.createElement(f.default,{className:t+"dialog-close-icon",type:"close"})):null},b.prototype.render=function(){var e=this.props,t=e.prefix,n=e.className,a=e.closeable,r=e.title,o=e.role,e=e.rtl,i=_(Object.keys(b.propTypes),this.props),t=(0,c.default)(((l={})[t+"dialog"]=!0,l[t+"closeable"]=a,l[n]=!!n,l)),a=this.renderHeader(),n=this.renderBody(),l=this.renderFooter(),s=this.renderCloseLink(),o={role:o,"aria-modal":"true"},r=(r&&(o["aria-labelledby"]=this.titleId),i.style&&i.style.width);return i.style=(0,u.default)({},i.style,h.obj.pickProps(["height","maxHeight","width"],this.props)),r&&(i.style.width=r),d.default.createElement("div",(0,u.default)({},o,{className:t},i,{dir:e?"rtl":void 0}),a,n,l,s)},i=n=b,n.propTypes={prefix:l.default.string,className:l.default.string,title:l.default.node,children:l.default.node,footer:l.default.oneOfType([l.default.bool,l.default.node]),footerAlign:l.default.oneOf(["left","center","right"]),footerActions:l.default.array,onOk:l.default.func,onCancel:l.default.func,okProps:l.default.object,cancelProps:l.default.object,closeable:l.default.bool,onClose:l.default.func,locale:l.default.object,role:l.default.string,rtl:l.default.bool,width:l.default.oneOfType([l.default.number,l.default.string]),height:l.default.oneOfType([l.default.number,l.default.string]),maxHeight:l.default.oneOfType([l.default.number,l.default.string]),v2:l.default.bool,closeIcon:l.default.node,pure:l.default.bool},n.defaultProps={prefix:"next-",footerAlign:"right",footerActions:["ok","cancel"],onOk:g,onCancel:g,okProps:{},cancelProps:{},closeable:!0,onClose:g,locale:p.default.Dialog,role:"dialog"},i);function b(){return(0,a.default)(this,b),(0,r.default)(this,y.apply(this,arguments))}o.displayName="Inner",t.default=o,e.exports=t.default},function(s,e,u){"use strict";!function(e){var r=u(56),o=u(588),a=u(365),t={"Content-Type":"application/x-www-form-urlencoded"};function i(e,t){!r.isUndefined(e)&&r.isUndefined(e["Content-Type"])&&(e["Content-Type"]=t)}var n,l={transitional:{silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},adapter:n="undefined"!=typeof XMLHttpRequest||void 0!==e&&"[object process]"===Object.prototype.toString.call(e)?u(366):n,transformRequest:[function(e,t){if(o(t,"Accept"),o(t,"Content-Type"),!(r.isFormData(e)||r.isArrayBuffer(e)||r.isBuffer(e)||r.isStream(e)||r.isFile(e)||r.isBlob(e))){if(r.isArrayBufferView(e))return e.buffer;if(r.isURLSearchParams(e))return i(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString();if(r.isObject(e)||t&&"application/json"===t["Content-Type"]){i(t,"application/json");var t=e,n=void 0,a=void 0;if(r.isString(t))try{return(n||JSON.parse)(t),r.trim(t)}catch(e){if("SyntaxError"!==e.name)throw e}return(a||JSON.stringify)(t)}}return e}],transformResponse:[function(e){var t=this.transitional,n=t&&t.silentJSONParsing,t=t&&t.forcedJSONParsing,n=!n&&"json"===this.responseType;if(n||t&&r.isString(e)&&e.length)try{return JSON.parse(e)}catch(e){if(n){if("SyntaxError"===e.name)throw a(e,this,"E_JSON_PARSE");throw e}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(e){return 200<=e&&e<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};r.forEach(["delete","get","head"],function(e){l.headers[e]={}}),r.forEach(["post","put","patch"],function(e){l.headers[e]=r.merge(t)}),s.exports=l}.call(this,u(354))},function(e,t,n){"use strict";var a,f=SyntaxError,r=Function,p=TypeError,o=function(e){try{return r('"use strict"; return ('+e+").constructor;")()}catch(e){}},h=Object.getOwnPropertyDescriptor;if(h)try{h({},"")}catch(e){h=null}function i(){throw new p}function m(e){var t,n;return"%AsyncFunction%"===e?t=o("async function () {}"):"%GeneratorFunction%"===e?t=o("function* () {}"):"%AsyncGeneratorFunction%"===e?t=o("async function* () {}"):"%AsyncGenerator%"===e?(n=m("%AsyncGeneratorFunction%"))&&(t=n.prototype):"%AsyncIteratorPrototype%"===e&&(n=m("%AsyncGenerator%"))&&(t=u(n.prototype)),y[e]=t}var l=h?function(){try{return i}catch(e){try{return h(arguments,"callee").get}catch(e){return i}}}():i,s=n(602)(),u=Object.getPrototypeOf||function(e){return e.__proto__},g={},d="undefined"==typeof Uint8Array?a:u(Uint8Array),y={"%AggregateError%":"undefined"==typeof AggregateError?a:AggregateError,"%Array%":Array,"%ArrayBuffer%":"undefined"==typeof ArrayBuffer?a:ArrayBuffer,"%ArrayIteratorPrototype%":s?u([][Symbol.iterator]()):a,"%AsyncFromSyncIteratorPrototype%":a,"%AsyncFunction%":g,"%AsyncGenerator%":g,"%AsyncGeneratorFunction%":g,"%AsyncIteratorPrototype%":g,"%Atomics%":"undefined"==typeof Atomics?a:Atomics,"%BigInt%":"undefined"==typeof BigInt?a:BigInt,"%Boolean%":Boolean,"%DataView%":"undefined"==typeof DataView?a:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":Error,"%eval%":eval,"%EvalError%":EvalError,"%Float32Array%":"undefined"==typeof Float32Array?a:Float32Array,"%Float64Array%":"undefined"==typeof Float64Array?a:Float64Array,"%FinalizationRegistry%":"undefined"==typeof FinalizationRegistry?a:FinalizationRegistry,"%Function%":r,"%GeneratorFunction%":g,"%Int8Array%":"undefined"==typeof Int8Array?a:Int8Array,"%Int16Array%":"undefined"==typeof Int16Array?a:Int16Array,"%Int32Array%":"undefined"==typeof Int32Array?a:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":s?u(u([][Symbol.iterator]())):a,"%JSON%":"object"==typeof JSON?JSON:a,"%Map%":"undefined"==typeof Map?a:Map,"%MapIteratorPrototype%":"undefined"!=typeof Map&&s?u((new Map)[Symbol.iterator]()):a,"%Math%":Math,"%Number%":Number,"%Object%":Object,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":"undefined"==typeof Promise?a:Promise,"%Proxy%":"undefined"==typeof Proxy?a:Proxy,"%RangeError%":RangeError,"%ReferenceError%":ReferenceError,"%Reflect%":"undefined"==typeof Reflect?a:Reflect,"%RegExp%":RegExp,"%Set%":"undefined"==typeof Set?a:Set,"%SetIteratorPrototype%":"undefined"!=typeof Set&&s?u((new Set)[Symbol.iterator]()):a,"%SharedArrayBuffer%":"undefined"==typeof SharedArrayBuffer?a:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":s?u(""[Symbol.iterator]()):a,"%Symbol%":s?Symbol:a,"%SyntaxError%":f,"%ThrowTypeError%":l,"%TypedArray%":d,"%TypeError%":p,"%Uint8Array%":"undefined"==typeof Uint8Array?a:Uint8Array,"%Uint8ClampedArray%":"undefined"==typeof Uint8ClampedArray?a:Uint8ClampedArray,"%Uint16Array%":"undefined"==typeof Uint16Array?a:Uint16Array,"%Uint32Array%":"undefined"==typeof Uint32Array?a:Uint32Array,"%URIError%":URIError,"%WeakMap%":"undefined"==typeof WeakMap?a:WeakMap,"%WeakRef%":"undefined"==typeof WeakRef?a:WeakRef,"%WeakSet%":"undefined"==typeof WeakSet?a:WeakSet},v={"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},s=n(167),_=n(605),b=s.call(Function.call,Array.prototype.concat),w=s.call(Function.apply,Array.prototype.splice),M=s.call(Function.call,String.prototype.replace),k=s.call(Function.call,String.prototype.slice),S=s.call(Function.call,RegExp.prototype.exec),E=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,x=/\\(\\)?/g;e.exports=function(e,t){if("string"!=typeof e||0===e.length)throw new p("intrinsic name must be a non-empty string");if(1<arguments.length&&"boolean"!=typeof t)throw new p('"allowMissing" argument must be a boolean');if(null===S(/^%?[^%]*%?$/g,e))throw new f("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var n=function(e){var t=k(e,0,1),n=k(e,-1);if("%"===t&&"%"!==n)throw new f("invalid intrinsic syntax, expected closing `%`");if("%"===n&&"%"!==t)throw new f("invalid intrinsic syntax, expected opening `%`");var r=[];return M(e,E,function(e,t,n,a){r[r.length]=n?M(a,x,"$1"):t||e}),r}(e),a=0<n.length?n[0]:"",r=function(e,t){var n,a=e;if(_(v,a)&&(a="%"+(n=v[a])[0]+"%"),_(y,a)){var r=y[a];if(void 0!==(r=r===g?m(a):r)||t)return{alias:n,name:a,value:r};throw new p("intrinsic "+e+" exists, but is not available. Please file an issue!")}throw new f("intrinsic "+e+" does not exist!")}("%"+a+"%",t),o=(r.name,r.value),i=!1,r=r.alias;r&&(a=r[0],w(n,b([0,1],r)));for(var l=1,s=!0;l<n.length;l+=1){var u=n[l],d=k(u,0,1),c=k(u,-1);if(('"'===d||"'"===d||"`"===d||'"'===c||"'"===c||"`"===c)&&d!==c)throw new f("property names with quotes must have matching quotes");if("constructor"!==u&&s||(i=!0),_(y,d="%"+(a+="."+u)+"%"))o=y[d];else if(null!=o){if(!(u in o)){if(t)return;throw new p("base intrinsic for "+e+" exists, but the property is not available.")}o=h&&l+1>=n.length?(s=!!(c=h(o,u)))&&"get"in c&&!("originalValue"in c.get)?c.get:o[u]:(s=_(o,u),o[u]),s&&!i&&(y[d]=o)}}return o}},function(e,t,n){"use strict";n=n(604);e.exports=Function.prototype.bind||n},function(e,t,n){"use strict";var a=String.prototype.replace,r=/%20/g,o="RFC1738",i="RFC3986";e.exports={default:i,formatters:{RFC1738:function(e){return a.call(e,r,"+")},RFC3986:function(e){return String(e)}},RFC1738:o,RFC3986:i}},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var d=s(n(2)),a=s(n(4)),r=s(n(6)),o=s(n(7)),c=n(0),f=s(c),i=s(n(3)),p=s(n(13)),h=s(n(24)),l=n(11),m=s(n(98));function s(e){return e&&e.__esModule?e:{default:e}}var u,g=l.func.bindCtx,y=l.obj.pickOthers,i=(u=c.Component,(0,o.default)(v,u),v.prototype.getSelected=function(){var e=this.props,t=e._key,n=e.root,e=e.selected,a=n.props.selectMode,n=n.state.selectedKeys;return e||!!a&&-1<n.indexOf(t)},v.prototype.handleSelect=function(e){var t=this.props,n=t._key,a=t.root,t=t.onSelect;t?t(!this.getSelected(),this,e):a.handleSelect(n,!this.getSelected(),this)},v.prototype.handleKeyDown=function(e){e.keyCode!==l.KEYCODE.SPACE||this.props.disabled||this.handleSelect(e),this.props.onKeyDown&&this.props.onKeyDown(e)},v.prototype.handleClick=function(e){this.handleSelect(e),this.props.onClick&&this.props.onClick(e)},v.prototype.renderSelectedIcon=function(e){var t=this.props,n=t.root,a=t.inlineIndent,r=t.needIndent,o=t.hasSelectedIcon,i=t.isSelectIconRight,t=t.type,n=n.props,l=n.prefix,s=n.hasSelectedIcon,u=n.isSelectIconRight,n=n.icons,d=n.select,l=(!(0,c.isValidElement)(n.select)&&n.select&&(d=f.default.createElement("span",null,n.select)),(0,p.default)(((n={})[l+"menu-icon-selected"]=!0,n[l+"menu-symbol-icon-selected"]=!d,n[l+"menu-icon-right"]=("isSelectIconRight"in this.props?i:u)&&"submenu"!==t,n)));return("hasSelectedIcon"in this.props?o:s)&&e?f.default.cloneElement(d||f.default.createElement(h.default,{type:"select"}),{style:r&&0<a?{left:a+"px"}:null,className:l}):null},v.prototype.render=function(){var e=this.props,t=e._key,n=e.root,a=e.className,r=e.disabled,o=e.helper,i=e.children,e=e.needIndent,l=n.props.prefix,s=y(Object.keys(v.propTypes),this.props),u=this.getSelected(),a=(0,d.default)({_key:t,root:n,disabled:r,type:"item",className:(0,p.default)(((t={})[l+"selected"]=u,t[a]=!!a,t)),onKeyDown:this.handleKeyDown,onClick:r?this.props.onClick:this.handleClick,needIndent:e},s),t=("title"in a||"string"!=typeof i||(a.title=i),{});return"selectMode"in n.props&&(t["aria-selected"]=u),f.default.createElement(m.default,a,this.renderSelectedIcon(u),f.default.createElement("span",(0,d.default)({className:l+"menu-item-text"},t),i),o?f.default.createElement("div",{className:l+"menu-item-helper"},o):null)},o=n=v,n.menuChildType="item",n.propTypes={_key:i.default.string,root:i.default.object,selected:i.default.bool,onSelect:i.default.func,inlineIndent:i.default.number,disabled:i.default.bool,helper:i.default.node,children:i.default.node,className:i.default.string,onKeyDown:i.default.func,onClick:i.default.func,needIndent:i.default.bool,hasSelectedIcon:i.default.bool,isSelectIconRight:i.default.bool,icons:i.default.object},n.defaultProps={disabled:!1,needIndent:!0,icons:{}},o);function v(e){(0,a.default)(this,v);e=(0,r.default)(this,u.call(this,e));return g(e,["handleKeyDown","handleClick"]),e}i.displayName="SelectableItem",t.default=i,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;t.getWidth=function(e){e=e&&"function"==typeof e.getBoundingClientRect&&e.getBoundingClientRect().width;return(e=e&&+e.toFixed(6))||0},t.normalizeToArray=function(e){return e?Array.isArray(e)?e:[e]:[]};var r=t.isSibling=function(e,t){var e=e.split("-").slice(0,-1),n=t.split("-").slice(0,-1);return e.length===n.length&&e.every(function(e,t){return e===n[t]})},a=(t.isAncestor=function(e,t){var n=e.split("-"),e=t.split("-");return n.length>e.length&&e.every(function(e,t){return e===n[t]})},t.isAvailablePos=function(e,t,n){var n=n[t],a=n.type,n=n.disabled;return r(e,t)&&("item"===a&&!n||"submenu"===a)});t.getFirstAvaliablelChildKey=function(t,n){var e=Object.keys(n).find(function(e){return a(t+"-0",e,n)});return e?n[e].key:null},t.getChildSelected=function(e){var t=e.selectMode,n=e.selectedKeys,a=e._k2n,e=e._key;if(!a)return!1;var r=(a[e]&&a[e].pos)+"-";return!!t&&n.some(function(e){return a[e]&&0===a[e].pos.indexOf(r)})}},function(e,t,n){"use strict";n(43),n(32),n(626)},function(e,t,n){var o=n(639),i=Object.prototype.hasOwnProperty;function l(e){return Array.isArray(e)?"array":typeof e}function s(e,t){var n,a=0,r=0;for(n in e)if(i.call(e,n)){if("style"===n){if(!o(e[n],t[n]))return!1}else if("children"!==n&&e[n]!==t[n])return!1;a++}for(n in t)i.call(t,n)&&r++;return a===r&&function e(t,n){var a=l(t);if(a!==l(n))return!1;switch(a){case"array":if(t.length!==n.length)return!1;for(var r=0;r<t.length;r++)if(!e(t[r],n[r]))return!1;return!0;case"object":return t&&n?t.type===n.type&&t.key===n.key&&t.ref===n.ref&&s(t.props,n.props):t===n;default:return t===n}}(e.children,t.children)}e.exports=s},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var a=l(n(4)),r=l(n(6)),o=l(n(7)),i=l(n(0)),n=l(n(3));function l(e){return e&&e.__esModule?e:{default:e}}s=i.default.Component,(0,o.default)(u,s),u.prototype.render=function(){return null},o=i=u,i.propTypes={dataIndex:n.default.string,cell:n.default.oneOfType([n.default.element,n.default.node,n.default.func]),title:n.default.oneOfType([n.default.element,n.default.node,n.default.func]),htmlTitle:n.default.string,sortable:n.default.bool,sortDirections:n.default.arrayOf(n.default.oneOf(["desc","asc","default"])),width:n.default.oneOfType([n.default.number,n.default.string]),align:n.default.oneOf(["left","center","right"]),alignHeader:n.default.oneOf(["left","center","right"]),filters:n.default.arrayOf(n.default.shape({label:n.default.string,value:n.default.oneOfType([n.default.node,n.default.string])})),filterMode:n.default.oneOf(["single","multiple"]),filterMenuProps:n.default.object,filterProps:n.default.object,lock:n.default.oneOfType([n.default.bool,n.default.string]),resizable:n.default.bool,asyncResizable:n.default.bool,colSpan:n.default.number,wordBreak:n.default.oneOf(["all","word"])},i.contextTypes={parent:n.default.any},i.defaultProps={cell:function(e){return e},filterMode:"multiple",filterMenuProps:{subMenuSelectable:!1},filterProps:{},resizable:!1,asyncResizable:!1},i._typeMark="column";var s,n=o;function u(){return(0,a.default)(this,u),(0,r.default)(this,s.apply(this,arguments))}n.displayName="Column",t.default=n,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var a=d(n(2)),r=d(n(4)),i=d(n(6)),o=d(n(7)),l=d(n(0)),s=d(n(3)),u=d(n(128));function d(e){return e&&e.__esModule?e:{default:e}}c=l.default.Component,(0,o.default)(f,c),f.prototype.render=function(){return l.default.createElement(u.default,(0,a.default)({},this.props,{onMouseEnter:this.onMouseEnter,onMouseLeave:this.onMouseLeave}))},o=n=f,n.propTypes=(0,a.default)({},u.default.propTypes),n.contextTypes={onRowMouseEnter:s.default.func,onRowMouseLeave:s.default.func},n.defaultProps=(0,a.default)({},u.default.defaultProps);var c,s=o;function f(){var e,o;(0,r.default)(this,f);for(var t=arguments.length,n=Array(t),a=0;a<t;a++)n[a]=arguments[a];return(e=o=(0,i.default)(this,c.call.apply(c,[this].concat(n)))).onMouseEnter=function(e,t,n){var a=o.context.onRowMouseEnter,r=o.props.onMouseEnter;a&&a(e,t,n),r(e,t,n)},o.onMouseLeave=function(e,t,n){var a=o.context.onRowMouseLeave,r=o.props.onMouseLeave;a&&a(e,t,n),r(e,t,n)},(0,i.default)(o,e)}s.displayName="LockRow",t.default=s,e.exports=t.default},function(e,t,n){"use strict";n(43),n(70),n(661)},function(e,t,n){"use strict";t.__esModule=!0;var g=c(n(12)),y=c(n(2)),a=c(n(4)),r=c(n(6)),o=c(n(7)),i=n(0),v=c(i),l=c(n(3)),_=c(n(13)),s=c(n(79)),u=c(n(24)),b=n(11),d=c(n(44)),n=c(n(8));function c(e){return e&&e.__esModule?e:{default:e}}var f,p=b.func.noop,h=b.func.bindCtx,m=/blue|green|orange|red|turquoise|yellow/,l=(f=i.Component,(0,o.default)(w,f),w.prototype.componentWillUnmount=function(){this.__destroyed=!0},w.prototype.handleClose=function(e){var t=this,n=this.props,a=n.animation,n=n.onClose,r=b.support.animation&&a;!1===n(e,this.tagNode)||this.__destroyed||this.setState({visible:!1},function(){r||t.props.afterClose(t.tagNode)})},w.prototype.handleBodyClick=function(e){var t=this.props,n=t.closable,a=t.closeArea,t=t.onClick,r=e.currentTarget;if(r&&(r===e.target||r.contains(e.target))&&(n&&"tag"===a&&this.handleClose("tag"),"function"==typeof t))return t(e)},w.prototype.handleTailClick=function(e){e&&e.preventDefault(),e&&e.stopPropagation(),this.handleClose("tail")},w.prototype.handleAnimationInit=function(e){this.props.afterAppear(e)},w.prototype.handleAnimationEnd=function(e){this.props.afterClose(e)},w.prototype.renderAnimatedTag=function(e,t){return v.default.createElement(s.default,{animation:t,afterAppear:this.handleAnimationInit,afterLeave:this.handleAnimationEnd},e)},w.prototype.renderTailNode=function(){var e=this.props,t=e.prefix,n=e.closable,e=e.locale;return n?v.default.createElement("span",{className:t+"tag-close-btn",onClick:this.handleTailClick,role:"button","aria-label":e.delete},v.default.createElement(u.default,{type:"close"})):null},w.prototype.isPresetColor=function(){var e=this.props.color;return!!e&&m.test(e)},w.prototype.getTagStyle=function(){var e=this.props,t=e.color,t=void 0===t?"":t,e=e.style,n=this.isPresetColor();return(0,y.default)({},t&&!n?{backgroundColor:t,borderColor:t,color:"#fff"}:null,e)},w.prototype.render=function(){var t=this,e=this.props,n=e.prefix,a=e.type,r=e.size,o=e.color,i=e._shape,l=e.closable,s=e.closeArea,u=e.className,d=e.children,c=e.animation,f=e.disabled,e=e.rtl,p=this.state.visible,h=this.isPresetColor(),m=b.obj.pickOthers(w.propTypes,this.props),m=(m.style,(0,g.default)(m,["style"])),r=(0,_.default)([n+"tag",n+"tag-"+(l?"closable":i),n+"tag-"+r],((i={})[n+"tag-level-"+a]=!o,i[n+"tag-closable"]=l,i[n+"tag-body-pointer"]=l&&"tag"===s,i[n+"tag-"+o]=o&&h&&"primary"===a,i[n+"tag-"+o+"-inverse"]=o&&h&&"normal"===a,i),u),l=this.renderTailNode(),s=p?v.default.createElement("div",(0,y.default)({className:r,onClick:this.handleBodyClick,onKeyDown:this.onKeyDown,tabIndex:f?"":"0",role:"button","aria-disabled":f,disabled:f,dir:e?"rtl":void 0,ref:function(e){return t.tagNode=e},style:this.getTagStyle()},m),v.default.createElement("span",{className:n+"tag-body"},d),l):null;return c&&b.support.animation?this.renderAnimatedTag(s,n+"tag-zoom"):s},o=i=w,i.propTypes={prefix:l.default.string,type:l.default.oneOf(["normal","primary"]),size:l.default.oneOf(["small","medium","large"]),color:l.default.string,animation:l.default.bool,closeArea:l.default.oneOf(["tag","tail"]),closable:l.default.bool,onClose:l.default.func,afterClose:l.default.func,afterAppear:l.default.func,className:l.default.any,children:l.default.node,onClick:l.default.func,_shape:l.default.oneOf(["default","closable","checkable"]),disabled:l.default.bool,rtl:l.default.bool,locale:l.default.object},i.defaultProps={prefix:"next-",type:"normal",size:"medium",closeArea:"tail",animation:!1,onClose:p,afterClose:p,afterAppear:p,onClick:p,_shape:"default",disabled:!1,rtl:!1,locale:d.default.Tag},o);function w(e){(0,a.default)(this,w);var o=(0,r.default)(this,f.call(this,e));return o.onKeyDown=function(e){var t=o.props,n=t.closable,a=t.closeArea,r=t.onClick,t=t.disabled;e.keyCode!==b.KEYCODE.SPACE||t||(e.preventDefault(),e.stopPropagation(),n?o.handleClose(a):"function"==typeof r&&r(e))},o.state={visible:!0},h(o,["handleBodyClick","handleTailClick","handleAnimationInit","handleAnimationEnd","renderTailNode"]),o}l.displayName="Tag",t.default=n.default.config(l),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var f=r(n(12)),p=r(n(38)),h=r(n(2)),a=(t.isSingle=function(e){return!e||"single"===e},t.isNull=l,t.escapeForReg=o,t.filter=function(e,t){e=o(""+e),e=new RegExp("("+e+")","ig");return e.test(""+t.value)||e.test(""+t.label)},t.loopMap=i,t.parseDataSourceFromChildren=function i(e){var l=1<arguments.length&&void 0!==arguments[1]?arguments[1]:0;var s=[];a.Children.forEach(e,function(e,t){var n,a,r,o;e&&(o=e.type,e=e.props,r=a=!(n={deep:l}),("function"==typeof o&&"next_select_option"===o._typeMark||"option"===o)&&(a=!0),("function"==typeof o&&"next_select_option_group"===o._typeMark||"optgroup"===o)&&(r=!0),(a||r)&&(a?(o="string"==typeof e.children,n.value="value"in e?e.value:"key"in e?e.key:o?e.children:""+t,n.label=e.label||e.children||""+n.value,"title"in e&&(n.title=e.title),!0===e.disabled&&(n.disabled=!0),(0,h.default)(n,e["data-extra"]||{})):r&&l<1&&(n.label=e.label||"Group",n.children=i(e.children,l+1)),s.push(n)))});return s},t.normalizeDataSource=function s(e){var u=1<arguments.length&&void 0!==arguments[1]?arguments[1]:0;var d=!(2<arguments.length&&void 0!==arguments[2])||arguments[2];var c=[];e.forEach(function(e,t){var n,a,r,o,i,l;(e=!/string|boolean|number/.test(void 0===e?"undefined":(0,p.default)(e))&&null!=e?e:{label:""+e,value:e})&&e.__isAddon||(n={deep:u},Array.isArray(e.children)&&u<1&&d?(n.label=e.label||e.value||"Group "+t,n.children=s(e.children,u+1)):(a=(l=e).value,r=l.label,o=l.disabled,i=l.title,l=(0,f.default)(l,["value","label","disabled","title"]),n.value=void 0!==a?a:""+t,n.label=r||""+n.value,"title"in e&&(n.title=i),!0===o&&(n.disabled=!0),(0,h.default)(n,l)),c.push(n))});return c},t.flattingDataSource=function t(e){var n=[];e.forEach(function(e){Array.isArray(e.children)?n.push.apply(n,t(e.children)):n.push(e)});return n},t.filterDataSource=function(e,t,n,a){if(!Array.isArray(e))return[];if(null==t)return[].concat(e);var r=!0,e=i(e,function(e){return t===""+e.value&&(r=!1),n(t,e)&&!e.__isAddon&&e});a&&t&&r&&e.unshift({value:t,label:t,__isAddon:!0});return e},t.getValueDataSource=function(e,t,n){if(l(e))return{};var a=[],r=[],o={},i=(0,h.default)({},t,n);return Array.isArray(e)?(e.forEach(function(e){e=s(e,i);r.push(e),o[""+e.value]=e,a.push(e.value)}),{value:a,valueDS:r,mapValueDS:o}):{value:(t=s(e,i)).value,valueDS:t,mapValueDS:((n={})[""+t.value]=t,n)}},t.valueToSelectKey=function(e){var t=void 0;t="object"===(void 0===e?"undefined":(0,p.default)(e))&&e.hasOwnProperty("value")?e.value:e;return""+t},n(0));function r(e){return e&&e.__esModule?e:{default:e}}function l(e){return null==e}function o(e){return e.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&")}function i(e,n){var a=[];return e.forEach(function(e){var t;e.children?(t=i(e.children,n),a.push((0,h.default)({},e,{children:t}))):(t=n(e))&&a.push(t)}),a}function s(e,t){return"object"===(void 0===e?"undefined":(0,p.default)(e))?e.hasOwnProperty("value")?e:(0,h.default)({value:""},e):t[""+e]||{value:e,label:e}}},function(e,t,n){"use strict";t.__esModule=!0;var a,y=u(n(2)),v=u(n(12)),r=u(n(4)),o=u(n(6)),i=u(n(7)),_=u(n(0)),l=u(n(3)),b=u(n(13)),w=n(11),M=u(n(24)),s=u(n(44)),k=n(179);function u(e){return e&&e.__esModule?e:{default:e}}var d,n=w.func.noop,l=(d=_.default.Component,(0,i.default)(S,d),S.prototype.render=function(){var e,t=this.props,n=t.prefix,a=t.closable,r=t.className,o=t.style,i=t.isTooltip,l=t.align,s=t.title,u=t.type,d=t.onClose,c=t.alignEdge,f=t.v2,p=t.children,h=t.rtl,m=t.locale,t=(0,v.default)(t,["prefix","closable","className","style","isTooltip","align","title","type","onClose","alignEdge","v2","children","rtl","locale"]),c=c||f?k.edgeMap:k.normalMap,f=n,g=a&&void 0!==s,a=a&&void 0===s,i=(0,b.default)(((e={})[""+(f+=i?"balloon-tooltip":"balloon")]=!0,e[f+"-"+u]=u,e[f+"-medium"]=!0,e[f+"-"+c[l].arrow]=c[l],e[f+"-closable"]=a,e[r]=r,e)),c=(0,b.default)(((u={})[n+"balloon-title"]=!0,u[f+"-closable"]=g,u)),l=_.default.createElement("a",{role:"button","aria-label":m.close,tabIndex:"0",className:f+"-close",onClick:d},_.default.createElement(M.default,{type:"close",size:"small"}));return _.default.createElement("div",(0,y.default)({role:"tooltip","aria-live":"polite",dir:h?"rtl":void 0,className:i,style:o},w.obj.pickOthers(Object.keys(S.propTypes),t)),_.default.createElement("div",{className:n+"balloon-arrow"},_.default.createElement("div",{className:n+"balloon-arrow-content"})),s&&_.default.createElement("div",{className:c},s,g&&l),_.default.createElement("div",{className:n+"balloon-content"},p),a&&l)},a=i=S,i.contextTypes={prefix:l.default.string},i.propTypes={prefix:l.default.string,rtl:l.default.bool,closable:l.default.bool,children:l.default.any,title:l.default.node,className:l.default.string,alignEdge:l.default.bool,onClose:l.default.func,style:l.default.any,align:l.default.string,type:l.default.string,isTooltip:l.default.bool,locale:l.default.object,pure:l.default.bool,v2:l.default.bool},i.defaultProps={prefix:"next-",closable:!0,onClose:n,locale:s.default.Balloon,align:"b",type:"normal",alignEdge:!1,pure:!1},a);function S(){return(0,r.default)(this,S),(0,o.default)(this,d.apply(this,arguments))}l.displayName="BalloonInner",t.default=l,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;t.normalMap={t:{align:"bc tc",rtlAlign:"bc tc",arrow:"bottom",trOrigin:"bottom",rtlTrOrigin:"bottom",offset:[0,-12]},r:{align:"cl cr",rtlAlign:"cr cl",arrow:"left",trOrigin:"left",rtlTrOrigin:"right",offset:[12,0]},b:{align:"tc bc",rtlAlign:"tc bc",arrow:"top",trOrigin:"top",rtlTrOrigin:"top",offset:[0,12]},l:{align:"cr cl",rtlAlign:"cl cr",arrow:"right",trOrigin:"right",rtlTrOrigin:"left",offset:[-12,0]},tl:{align:"br tc",rtlAlign:"bl tc",arrow:"bottom-right",trOrigin:"bottom right",rtlTrOrigin:"bottom left",offset:[20,-12]},tr:{align:"bl tc",rtlAlign:"br tc",arrow:"bottom-left",trOrigin:"bottom left",rtlTrOrigin:"bottom right",offset:[-20,-12]},rt:{align:"bl cr",rtlAlign:"br cl",arrow:"left-bottom",trOrigin:"bottom left",rtlTrOrigin:"bottom right",offset:[12,20]},rb:{align:"tl cr",rtlAlign:"tr cl",arrow:"left-top",trOrigin:"top left",rtlTrOrigin:"top right",offset:[12,-20]},bl:{align:"tr bc",rtlAlign:"tl bc",arrow:"top-right",trOrigin:"top right",rtlTrOrigin:"top left",offset:[20,12]},br:{align:"tl bc",rtlAlign:"tr bc",arrow:"top-left",trOrigin:"top left",rtlTrOrigin:"top right",offset:[-20,12]},lt:{align:"br cl",rtlAlign:"bl cr",arrow:"right-bottom",trOrigin:"bottom right",rtlTrOrigin:"bottom left",offset:[-12,20]},lb:{align:"tr cl",rtlAlign:"tl cr",arrow:"right-top",trOrigin:"top right",rtlTrOrigin:"top left",offset:[-12,-20]}},t.edgeMap={t:{align:"bc tc",rtlAlign:"bc tc",arrow:"bottom",trOrigin:"bottom",rtlTrOrigin:"bottom",offset:[0,-12]},r:{align:"cl cr",rtlAlign:"cr cl",arrow:"left",trOrigin:"left",rtlTrOrigin:"right",offset:[12,0]},b:{align:"tc bc",rtlAlign:"tc bc",arrow:"top",trOrigin:"top",rtlTrOrigin:"top",offset:[0,12]},l:{align:"cr cl",rtlAlign:"cl cr",arrow:"right",trOrigin:"right",rtlTrOrigin:"left",offset:[-12,0]},tl:{align:"bl tl",rtlAlign:"br tr",arrow:"bottom-left",trOrigin:"bottom left",rtlTrOrigin:"bottom right",offset:[0,-12]},tr:{align:"br tr",rtlAlign:"bl tl",arrow:"bottom-right",trOrigin:"bottom right",rtlTrOrigin:"bottom left",offset:[0,-12]},rt:{align:"tl tr",rtlAlign:"tr tl",arrow:"left-top",trOrigin:"top left",rtlTrOrigin:"top right",offset:[12,0]},rb:{align:"bl br",rtlAlign:"br bl",arrow:"left-bottom",trOrigin:"bottom left",rtlTrOrigin:"bottom right",offset:[12,0]},bl:{align:"tl bl",rtlAlign:"tr br",arrow:"top-left",trOrigin:"top left",rtlTrOrigin:"top right",offset:[0,12]},br:{align:"tr br",rtlAlign:"tl bl",arrow:"top-right",trOrigin:"top right",rtlTrOrigin:"top left",offset:[0,12]},lt:{align:"tr tl",rtlAlign:"tl tr",arrow:"right-top",trOrigin:"top right",rtlTrOrigin:"top left",offset:[-12,0]},lb:{align:"br bl",rtlAlign:"bl br",arrow:"right-bottom",trOrigin:"bottom right",rtlTrOrigin:"bottom left",offset:[-12,0]}}},function(e,t,n){"use strict";t.__esModule=!0;var a,L=f(n(2)),T=f(n(12)),r=f(n(4)),o=f(n(6)),i=f(n(7)),D=f(n(0)),l=f(n(3)),O=f(n(13)),s=n(30),N=n(11),P=f(n(24)),u=f(n(408)),j=f(n(728)),d=f(n(409)),Y=f(n(182)),c=n(99);function f(e){return e&&e.__esModule?e:{default:e}}var p,n=N.func.noop,l=(p=u.default,(0,i.default)(h,p),h.getDerivedStateFromProps=function(e,t){return"value"in e&&e.value!==t.value&&!t.uploading?{value:Array.isArray(e.value)?e.value:[]}:null},h.prototype.selectFiles=function(e){e=e.length?Array.prototype.slice.call(e):[e];this.onSelect(e)},h.prototype.uploadFiles=function(e){this.state.uploading=!0;e=e.filter(function(e){return"selected"===e.state&&(e.state="uploading",!0)}).map(function(e){return e.originFileObj});e.length&&this.uploaderRef.startUpload(e)},h.prototype.startUpload=function(){this.uploadFiles(this.state.value)},h.prototype.replaceFiles=function(e,t){var n=(0,c.getFileItem)(e,this.state.value);n&&(t.uid=e.uid,n.originFileObj=t)},h.prototype.isUploading=function(){return this.state.uploading},h.prototype.render=function(){var e=this.props,t=e.listType,n=e.prefix,a=e.dragable,r=e.shape,o=e.className,i=e.style,l=e.useDataURL,s=e.disabled,u=e.limit,d=e.closable,c=e.beforeUpload,f=e.readonly,p=e.onRemove,h=e.onCancel,m=e.onPreview,g=e.list,y=e.extraRender,v=e.progressProps,_=e.rtl,b=e.isPreview,w=e.renderPreview,M=e.name,k=e.fileKeyName,M=void 0===k?M:k,k=e.fileNameRender,S=e.actionRender,E=e.previewOnFileName,e=(0,T.default)(e,["listType","prefix","dragable","shape","className","style","useDataURL","disabled","limit","closable","beforeUpload","readonly","onRemove","onCancel","onPreview","list","extraRender","progressProps","rtl","isPreview","renderPreview","name","fileKeyName","fileNameRender","actionRender","previewOnFileName"]),f=(0,O.default)(((x={})[n+"upload"]=!0,x[n+"upload-dragable"]=a,x[n+"disabled"]=s,x[n+"readonly"]=f,x[o]=o,x)),x=this.state.value.length>=u,u=(0,O.default)(((u={})[n+"upload-inner"]=!0,u[n+"hidden"]=x,u)),C=this.props.children;if("card"===r&&(r=(0,O.default)(((r={})[n+"upload-card"]=!0,r[n+"disabled"]=s,r)),C=D.default.createElement("div",{className:r},D.default.createElement(P.default,{size:"large",type:"add",className:n+"upload-add-icon"}),D.default.createElement("div",{tabIndex:"0",role:"button",className:n+"upload-text"},C))),b)return"function"==typeof w?(b=(0,O.default)(((r={})[n+"form-preview"]=!0,r[o]=!!o,r)),D.default.createElement("div",{style:i,className:b},w(this.state.value,this.props))):t?D.default.createElement(Y.default,{isPreview:!0,listType:t,style:i,className:o,value:this.state.value}):null;n=s?N.func.prevent:p,r=N.obj.pickAttrsWith(this.props,"data-");return D.default.createElement("div",(0,L.default)({className:f,style:i},r),D.default.createElement(j.default,(0,L.default)({},e,{name:M,beforeUpload:c,dragable:a,disabled:s||x,className:u,onSelect:this.onSelect,onDrop:this.onDrop,onProgress:this.onProgress,onSuccess:this.onSuccess,onError:this.onError,ref:this.saveUploaderRef}),C),t||g?D.default.createElement(Y.default,{useDataURL:l,fileNameRender:k,actionRender:S,uploader:this,listType:t,value:this.state.value,closable:d,onRemove:n,progressProps:v,onCancel:h,onPreview:m,extraRender:y,rtl:_,previewOnFileName:E}):null)},i=u=h,u.displayName="Upload",u.propTypes=(0,L.default)({},d.default.propTypes,Y.default.propTypes,{prefix:l.default.string.isRequired,action:l.default.string,value:l.default.array,defaultValue:l.default.array,shape:l.default.oneOf(["card"]),listType:l.default.oneOf(["text","image","card"]),list:l.default.any,name:l.default.string,data:l.default.oneOfType([l.default.object,l.default.func]),formatter:l.default.func,limit:l.default.number,timeout:l.default.number,dragable:l.default.bool,closable:l.default.bool,useDataURL:l.default.bool,disabled:l.default.bool,onSelect:l.default.func,onProgress:l.default.func,onChange:l.default.func,onSuccess:l.default.func,afterSelect:l.default.func,onRemove:l.default.func,onError:l.default.func,beforeUpload:l.default.func,onDrop:l.default.func,className:l.default.string,style:l.default.object,children:l.default.node,autoUpload:l.default.bool,request:l.default.func,progressProps:l.default.object,rtl:l.default.bool,isPreview:l.default.bool,renderPreview:l.default.func,fileKeyName:l.default.string,fileNameRender:l.default.func,actionRender:l.default.func,previewOnFileName:l.default.bool}),u.defaultProps=(0,L.default)({},d.default.defaultProps,{prefix:"next-",limit:1/0,autoUpload:!0,closable:!0,onSelect:n,onProgress:n,onChange:n,onSuccess:n,onRemove:n,onError:n,onDrop:n,beforeUpload:n,afterSelect:n,previewOnFileName:!1}),a=function(){var u=this;this.onSelect=function(e){var t,n,a=u.props,r=a.autoUpload,o=a.afterSelect,i=a.onSelect,a=a.limit,l=u.state.value.length+e.length,s=a-u.state.value.length;s<=0||(t=e=e.map(function(e){e=(0,c.fileToObject)(e);return e.state="selected",e}),n=[],a<l&&(t=e.slice(0,s),n=e.slice(s)),a=u.state.value.concat(e),u.state.value=a,r&&u.uploadFiles(t),i(t,a),n.forEach(function(e){var t=new Error(c.errorCode.EXCEED_LIMIT);t.code=c.errorCode.EXCEED_LIMIT,u.onError(t,null,e)}),r||(t.forEach(function(t){var e=o(t);N.func.promiseCall(e,N.func.noop,function(e){u.onError(e,null,t)})}),u.onChange(a,t)))},this.onDrop=function(e){u.onSelect(e),u.props.onDrop(e)},this.replaceWithNewFile=function(e,t){for(var n=(0,c.fileToObject)(t),a=(n.state="selected",void 0!==e.uid?"uid":"name"),r=u.state.value,o=0;o<r.length;o++)if(r[o][a]===e[a]){r.splice(o,1,n);break}return u.uploadFiles([n]),n},this.onProgress=function(e,t){u.state.uploading=!0;var n=u.state.value,t=(0,c.getFileItem)(t,n);t&&((0,L.default)(t,{state:"uploading",percent:e.percent}),u.setState({value:n}),u.props.onProgress(n,t))},this.onSuccess=function(t,n){var e=u.props.formatter;e&&(t=e(t,n));try{"string"==typeof t&&(t=JSON.parse(t))}catch(e){return e.code=c.errorCode.RESPONSE_FAIL,u.onError(e,t,n)}if(!1===t.success)return(e=new Error(t.message||c.errorCode.RESPONSE_FAIL)).code=c.errorCode.RESPONSE_FAIL,u.onError(e,t,n);e=u.state.value,n=(0,c.getFileItem)(n,e);n&&((0,L.default)(n,{state:"done",response:t,url:t.url,downloadURL:t.downloadURL||t.url}),u.props.useDataURL||(n.imgURL=t.imgURL||t.url),u.updateUploadingState(),u.onChange(e,n),u.props.onSuccess(n,e))},this.onError=function(e,t,n){var a=u.state.value,n=(0,c.getFileItem)(n,a);n&&((0,L.default)(n,{state:"error",error:e,response:t}),u.updateUploadingState(),u.onChange(a,n),u.props.onError(n,a))},this.removeFile=function(e){e.state="removed",u.uploaderRef.abort(e);var t=u.state.value,e=(0,c.getFileItem)(e,t),n=t.indexOf(e);-1!==n&&(t.splice(n,1),u.onChange(t,e))},this.updateUploadingState=function(){u.state.value.some(function(e){return"uploading"===e.state})||(u.state.uploading=!1)},this.abort=function(e){var t=u.state.value,n=(0,c.getFileItem)(e,t),a=t.indexOf(n);-1!==a&&(t.splice(a,1),u.onChange(t,n)),u.uploaderRef.abort(e)},this.onChange=function(e,t){u.setState({value:e}),u.props.onChange(e,t)}},i);function h(e){(0,r.default)(this,h);var t=(0,o.default)(this,p.call(this,e)),n=(a.call(t),void 0),n="value"in e?e.value:e.defaultValue;return t.state={value:Array.isArray(n)?n:[],uploading:!1},t}t.default=(0,s.polyfill)(l),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var f=u(n(2)),o=u(n(4)),i=u(n(6)),a=u(n(7)),p=u(n(0)),r=u(n(3)),l=n(11),s=n(99);function u(e){return e&&e.__esModule?e:{default:e}}var d,n=l.func.noop,r=(d=p.default.Component,(0,a.default)(c,d),c.prototype.render=function(){var e=this.props,t=e.accept,n=e.multiple,a=e.capture,r=e.webkitdirectory,o=e.children,i=e.id,l=e.disabled,s=e.dragable,u=e.style,d=e.className,e=e.name,c={},s=(l||(c=(0,f.default)({onClick:this.onClick,onKeyDown:this.onKeyDown,tabIndex:"0"},s?{onDrop:this.onDrop,onDragOver:this.onDragOver,onDragLeave:this.props.onDragLeave}:{})),{});return r&&(s.webkitdirectory=""),a&&(s.capture=a),p.default.createElement("div",(0,f.default)({role:"application",style:u,className:d},c),p.default.createElement("input",(0,f.default)({},s,{type:"file",name:e,id:i,ref:this.saveFileRef,style:{display:"none"},accept:t,"aria-hidden":!0,multiple:n,onChange:this.onSelect,disabled:l})),o)},a=l=c,l.propTypes={id:r.default.string,style:r.default.object,className:r.default.string,disabled:r.default.bool,multiple:r.default.bool,webkitdirectory:r.default.bool,capture:r.default.string,dragable:r.default.bool,accept:r.default.string,onSelect:r.default.func,onDragOver:r.default.func,onDragLeave:r.default.func,onDrop:r.default.func,children:r.default.node,name:r.default.string},l.defaultProps={name:"file",multiple:!1,onSelect:n,onDragOver:n,onDragLeave:n,onDrop:n},a);function c(){var e,t;(0,o.default)(this,c);for(var n=arguments.length,a=Array(n),r=0;r<n;r++)a[r]=arguments[r];return(e=t=(0,i.default)(this,d.call.apply(d,[this].concat(a)))).onSelect=function(e){e=e.target.files,e=e.length?Array.prototype.slice.call(e):[e];e.forEach(function(e){e.uid=(0,s.uid)()}),t.props.onSelect(e)},t.onClick=function(){var e=t.fileRef;e&&(e.value="",e.click())},t.onKeyDown=function(e){"Enter"===e.key&&t.onClick()},t.onDrop=function(e){e.preventDefault();e=e.dataTransfer.files,e=Array.prototype.slice.call(e);t.props.onDrop(e)},t.onDragOver=function(e){e.preventDefault(),t.props.onDragOver(e)},t.saveFileRef=function(e){t.fileRef=e},(0,i.default)(t,e)}r.displayName="Selecter",t.default=r,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var g=p(n(2)),o=p(n(4)),i=p(n(6)),a=p(n(7)),r=n(0),y=p(r),l=p(n(3)),c=p(n(13)),s=p(n(8)),v=p(n(731)),_=p(n(24)),b=p(n(18)),w=n(11),u=p(n(44)),d=n(99),f=p(n(407)),M=(p(n(98)),p(n(181)));function p(e){return e&&e.__esModule?e:{default:e}}var h,k=9===w.env.ieVersion,a=(h=r.Component,(0,a.default)(m,h),m.prototype.componentDidUpdate=function(){var n=this,e=this.props,t=e.listType,a=e.useDataURL,e=e.value;"image"!==t&&"card"!==t||a&&e.forEach(function(t){"undefined"!=typeof document&&"undefined"!=typeof window&&window.FileReader&&window.File&&t.originFileObj instanceof File&&void 0===t.imgURL&&(t.imgURL="",d.previewFile)(t.originFileObj,function(e){t.imgURL=e,n.forceUpdate()})})},m.prototype.onPreview=function(e,t){var n;if(n=this.props.onPreview)return n(e,t)},m.prototype.getInfo=function(e){var t,n=this.props.prefix+"upload";return{prefixCls:n,downloadURL:e.downloadURL||e.url,imgURL:e.imgURL||e.url,size:this.sizeCaculator(e.size),itemCls:(0,c.default)(((t={})[n+"-list-item"]=!0,t[n+"-list-item-"+e.state]=e.state,t[n+"-list-item-error-with-msg"]="error"===e.state&&e.errorMsg,t)),alt:e.name||e.alt}},m.prototype.sizeCaculator=function(e){var t=parseFloat(e,10);if(isNaN(t)||t<1e-7)return 0;for(var n=["B","K","M","G","T","P"],a=0;1024<=t&&a<n.length;)a++,t/=1024;e=n[a];return""+(t=t.toFixed(2))+e},m.prototype.getTextList=function(e){var t=this,n=this.props,a=n.locale,r=n.extraRender,o=n.actionRender,i=n.progressProps,l=n.rtl,s=n.fileNameRender,n=n.previewOnFileName,u=this.getInfo(e),d=u.prefixCls,c=u.downloadURL,f=u.size,u=u.itemCls,p=function(){return"uploading"===e.state?t.handleCancel(e):t.handleClose(e)};return y.default.createElement("div",{className:u,key:e.uid||e.name},y.default.createElement("div",{className:d+"-list-item-name-wrap"},y.default.createElement("a",{onClick:n?this.onPreview.bind(this,e):w.func.noop,href:c,target:"_blank",style:{pointerEvents:c?"":"none"},className:d+"-list-item-name"},y.default.createElement("span",null,s(e)),!!f&&y.default.createElement("span",{className:d+"-list-item-size",dir:l?"rtl":void 0},"(",f,")"),y.default.createElement("span",{className:d+"-extra"},r(e)))),"uploading"===e.state?y.default.createElement("div",{className:d+"-list-item-progress"},y.default.createElement(v.default,(0,g.default)({size:"medium",percent:e.percent,textRender:w.func.noop,rtl:l},i))):null,"error"===e.state&&e.errorMsg?y.default.createElement("div",{className:d+"-list-item-error-msg"},e.errorMsg):null,y.default.createElement("span",{className:d+"-list-item-op"},o(e),this.props.closable?y.default.createElement(_.default,{type:"close",size:"large",role:"button","aria-label":a.upload.delete,tabIndex:"0",onClick:p,onKeyDown:function(e){e.keyCode===w.KEYCODE.ENTER&&p()}}):null))},m.prototype.getImageList=function(e){var t=this,n=this.props,a=n.extraRender,r=n.actionRender,o=n.progressProps,i=n.rtl,l=n.fileNameRender,n=n.previewOnFileName,s=this.getInfo(e),u=s.prefixCls,d=s.downloadURL,c=s.imgURL,f=s.size,p=s.itemCls,s=s.alt,h=null,m=function(){return"uploading"===e.state?t.handleCancel(e):t.handleClose(e)},h="uploading"===e.state||"selected"===e.state&&!c?y.default.createElement(_.default,{type:"picture"}):"error"===e.state?y.default.createElement(_.default,{type:"cry"}):y.default.createElement("img",{src:c,onError:this.onImageError.bind(this,e),tabIndex:"0",alt:s,onClick:this.onPreview.bind(this,e)});return y.default.createElement("div",{className:p,key:e.uid||e.name},y.default.createElement("div",{className:u+"-list-item-thumbnail"},h),y.default.createElement("span",{className:u+"-list-item-op"},r(e),this.props.closable?y.default.createElement(_.default,{type:"close",size:"large",tabIndex:"0",role:"button",onClick:m,onKeyDown:function(e){e.keyCode===w.KEYCODE.ENTER&&m()}}):null),y.default.createElement("a",{onClick:n?this.onPreview.bind(this,e):w.func.noop,href:d,target:"_blank",style:{pointerEvents:d?"":"none"},className:u+"-list-item-name"},y.default.createElement("span",null,l(e)),!!f&&y.default.createElement("span",{className:u+"-list-item-size",dir:i?"rtl":void 0},"(",f,")"),y.default.createElement("span",{className:u+"-extra"},a(e))),"uploading"===e.state?y.default.createElement("div",{className:u+"-list-item-progress"},y.default.createElement(v.default,(0,g.default)({size:"medium",percent:e.percent,textRender:w.func.noop},o))):null,"error"===e.state&&e.errorMsg?y.default.createElement("div",{className:u+"-list-item-error-msg"},e.errorMsg):null)},m.prototype.getPictureCardList=function(e,t){var n=this,a=this.props,r=a.locale,o=a.progressProps,i=a.fileNameRender,l=a.itemRender,a=a.showDownload,s=this.getInfo(e),u=s.prefixCls,d=s.downloadURL,c=s.imgURL,f=s.itemCls,s=s.alt,p=t?"":e.state,h=null,h="uploading"===p||"selected"===p&&!c?y.default.createElement("div",{className:u+"-list-item-handler"},y.default.createElement(_.default,{type:"picture"}),y.default.createElement(b.default,{text:!0,onClick:function(){return n.handleCancel(e)}},r.card.cancel)):"error"===p?y.default.createElement("div",{className:u+"-list-item-handler"},y.default.createElement(_.default,{type:"cry"})):y.default.createElement("img",{src:c,tabIndex:"0",alt:s,onError:this.onImageError.bind(this,e),onClick:this.onPreview.bind(this,e)}),m=function(){return n.handleClose(e)},c=null;return c="uploading"===p?[y.default.createElement("div",{className:u+"-list-item-thumbnail",key:"img"},h),y.default.createElement("div",{className:u+"-list-item-progress",key:"progress"},y.default.createElement(v.default,(0,g.default)({size:"medium",percent:e.percent,textRender:w.func.noop},o)))]:"function"==typeof l?l(e,{remove:m}):(s=(this.props.uploader||{props:{}}).props,[y.default.createElement("div",{className:u+"-list-item-thumbnail",key:"img"},h),y.default.createElement("span",{key:"tool",className:u+"-tool"},"error"!==p&&a&&d?y.default.createElement("a",{href:d,target:"_blank",className:u+"-tool-item "+u+"-tool-download-link"},y.default.createElement(_.default,{type:"download","aria-label":r.card.download,className:u+"-tool-download-icon"})):null,!this.props.reUpload||t||k?null:y.default.createElement(M.default,{className:u+"-tool-item "+u+"-tool-reupload",accept:s.accept,name:s.fileKeyName,onSelect:this.onSelect.bind(this,e)},y.default.createElement(_.default,{type:"edit",className:u+"-tool-reupload-icon"})),this.props.closable&&!t?y.default.createElement("span",{className:u+"-tool-item "+u+"-tool-close"},y.default.createElement(_.default,{type:"ashbin","aria-label":r.card.delete,tabIndex:"0",role:"button",onClick:m,onKeyDown:function(e){e.keyCode===w.KEYCODE.ENTER&&m()}})):null)]),y.default.createElement("div",{className:f,key:e.uid||e.name},y.default.createElement("div",{className:u+"-list-item-wrapper"},c),y.default.createElement("span",{className:u+"-list-item-name"},i(e)))},m.prototype.render=function(){var e,a,r=this,t=this.props,o=t.listType,n=t.children,i=t.prefix,l=t.rtl,s=t.className,t=t.isPreview,u=i+"upload",d=[],i=(d=t?(a=(0,c.default)(((e={})[i+"form-preview"]=!0,e[s]=!!s,e)),this.props.value.map(function(e){if(!e)return null;var t=e.downloadURL,n=(e.imgURL,e.name);return"text"===o?y.default.createElement("div",{className:a},y.default.createElement("a",{href:t,target:"_blank"},n)):"image"===o||"card"===o?r.getPictureCardList(e,!0):null})):this.props.value.map(function(e){return e?"text"===o?r.getTextList(e):"image"===o?r.getImageList(e):"card"===o?r.getPictureCardList(e):null:null}),l&&"card"===o&&Array.isArray(d)&&(d=d.reverse()),t&&"image"===o?"card":this.props.listType),t=(0,c.default)(((e={})[u+"-list"]=!0,e[u+"-list-"+i]=!0,e[u+"-ie9"]=k,e),s),i=w.obj.pickAttrsWith(this.props,"data-");return y.default.createElement("div",(0,g.default)({},i,{className:t,dir:l?"rtl":void 0}),l?n:d,l?d:n)},r=n=m,n.propTypes={prefix:l.default.string,locale:l.default.object,listType:l.default.oneOf(["text","image","card"]),value:l.default.array,closable:l.default.bool,onRemove:l.default.func,onCancel:l.default.func,onImageError:l.default.func,onPreview:l.default.func,previewOnFileName:l.default.bool,extraRender:l.default.func,actionRender:l.default.func,itemRender:l.default.func,progressProps:l.default.object,children:l.default.node,uploader:l.default.any,showDownload:l.default.bool,useDataURL:l.default.bool,rtl:l.default.bool,isPreview:l.default.bool,fileNameRender:l.default.func},n.defaultProps={prefix:"next-",listType:"text",value:[],locale:u.default.Upload,closable:!1,showDownload:!0,onRemove:w.func.noop,onCancel:w.func.noop,extraRender:w.func.noop,actionRender:w.func.noop,onImageError:w.func.noop,progressProps:{},fileNameRender:function(e){return e.name},previewOnFileName:!1},r);function m(){var e,r;(0,o.default)(this,m);for(var t=arguments.length,n=Array(t),a=0;a<t;a++)n[a]=arguments[a];return(e=r=(0,i.default)(this,h.call.apply(h,[this].concat(n)))).handleClose=function(e){var t=r.props,n=t.onRemove,a=t.uploader,t=n(e);w.func.promiseCall(t,function(){a&&a.removeFile(e)})},r.handleCancel=function(e){var t=r.props,n=t.onCancel,a=t.uploader,t=n(e);w.func.promiseCall(t,function(){a&&a.abort(e)})},r.onImageError=function(e,t){t.onerror=null,r.props.onImageError(t,e)},r.onSelect=function(e,t){var n=r.props.uploader;n&&t.length&&n.replaceWithNewFile(e,t[0])},(0,i.default)(r,e)}a.displayName="List",t.default=s.default.config(a,{componentName:"Upload",transform:f.default}),e.exports=t.default},function(i,e,t){"use strict";t.r(e);var n=t(73),oe=t.n(n),n=t(115),ie=t.n(n),n=t(413),a=t.n(n),le=t(0),se=t.n(le),ue=t(23),de=t(133);function ce(e,t,n,a,r){Object(le.useEffect)(function(){if(r)return(e=Array.isArray(e)?e:[e]).forEach(function(e){e&&e.addEventListener&&e.addEventListener(t,n,a||!1)}),function(){Array.isArray(e)&&e.forEach(function(e){e&&e.removeEventListener&&e.removeEventListener(t,n,a||!1)})}},[r])}function R(){for(var o=this,e=arguments.length,i=new Array(e),t=0;t<e;t++)i[t]=arguments[t];return 1===i.length?i[0]:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];for(var a=0,r=i.length;a<r;a++)i[a]&&i[a].apply&&i[a].apply(o,t)}}function A(t){return t?function(e){if("string"==typeof t)throw new Error("can not set ref string for "+t);"function"==typeof t?t(e):Object.prototype.hasOwnProperty.call(t,"current")&&(t.current=e)}:null}function fe(e,t){return e&&1===e.nodeType?window.getComputedStyle(e,null).getPropertyValue(t):null}var r=/margin|padding|width|height|max|min|offset|size|top|left/i;function pe(t,n,e){t&&("string"==typeof n?("number"==typeof e&&r.test(n)&&(e+="px"),t.style[n]=e):"object"==typeof n&&2===arguments.length&&Object.keys(n).forEach(function(e){return pe(t,e,n[e])}))}function x(e){if(e===document.documentElement)return{top:0,left:0};var e=e.getBoundingClientRect(),t=e.left;return{top:e.top,left:t}}function he(){var e=document.createElement("div"),t=(e.className+="just-to-get-scrollbar-size",pe(e,{position:"absolute",width:"100px",height:"100px",overflow:"scroll",top:"-9999px"}),document.body&&document.body.appendChild(e),e.offsetWidth-e.clientWidth);return document.body.removeChild(e),t}function me(e){var t=e.nodeName.toLowerCase(),n=parseInt(e.getAttribute("tabindex"),10),n=!isNaN(n)&&-1<n;return function(e){for(;e&&e!==document.body&&e!==document.documentElement;){if("none"===e.style.display||"hidden"===e.style.visibility)return;e=e.parentNode}return 1}(e)&&("input"===t?!e.disabled&&"hidden"!==e.type:-1<["select","textarea","button"].indexOf(t)?!e.disabled:"a"===t&&e.getAttribute("href")||n)}function ge(e){return e&&(e.nodeType?1===e.nodeType?e:document.body:e===window?document.body:Object(ue.findDOMNode)(e))}function ye(e){return"function"==typeof e?e():"string"==typeof e?document.getElementById(e):e}var f={tl:["bl","tl"],t:["bc","tc"],tr:["br","tr"],lt:["tr","tl"],l:["cr","cl"],lb:["br","bl"],bl:["tl","bl"],b:["tc","bc"],br:["tr","br"],rt:["tl","tr"],r:["cl","cr"],rb:["bl","br"]};function C(e,t){var n=t.targetInfo,a=t.containerInfo,r=t.overlayInfo,o=t.points,i=t.placementOffset,l=t.offset,t=t.rtl,s=n.left-a.left+a.scrollLeft,u=n.top-a.top+a.scrollTop;function d(e,t,n){var a=(t=void 0===t?!0:t)?1:-1;switch(e){case"l":s+=0;break;case"c":s+=a*n/2;break;case"r":s+=a*n}}function c(e,t,n){var a=(t=void 0===t?!0:t)?1:-1;switch(e){case"t":u+=0;break;case"c":u+=a*n/2;break;case"b":u+=a*n}}a=[].concat(o);if(e&&e in f&&(a=f[e]),t&&(a[0].match(/l/)?a[0]=a[0].replace("l","r"):a[0].match(/r/)&&(a[0]=a[0].replace("r","l")),a[1].match(/l/)?a[1]=a[1].replace("l","r"):a[1].match(/r/)&&(a[1]=a[1].replace("r","l"))),c(a[1][0],!0,n.height),d(a[1][1],!0,n.width),c(a[0][0],!1,r.height),d(a[0][1],!1,r.width),i&&1<=e.length)switch(e[0]){case"t":u-=i;break;case"b":u+=i;break;case"l":s-=i;break;case"r":s+=i}return{points:a,left:s+l[0],top:u+l[1]}}function L(e,t,n,a){var r,o,i,l,s=a.container,u=a.containerInfo,a=a.overlayInfo;return n!==s?(r=(s=x(n)).left,s=s.top,o=n.scrollWidth,i=n.scrollHeight,l=n.scrollTop,n=n.scrollLeft,s=t+u.top-s+l,l=e+u.left-r+n,s<0||l<0||s+a.height>i||l+a.width>o):t<0||e<0||t+a.height>u.height||e+a.width>u.width}function T(e,t,n,a){var r=a.overlayInfo,a=a.containerInfo,n=n.split("");return 1===n.length&&n.push(""),t<0&&(n=[n[0].replace("t","b"),n[1].replace("b","t")]),e<0&&(n=[n[0].replace("l","r"),n[1].replace("r","l")]),t+r.height>a.height&&(n=[n[0].replace("b","t"),n[1].replace("t","b")]),(n=e+r.width>a.width?[n[0].replace("r","l"),n[1].replace("l","r")]:n).join("")}function D(e,t,n){var a=n.overlayInfo,n=n.containerInfo;return(t=t<0?0:t)+a.height>n.height&&(t=n.height-a.height),{left:e=(e=e<0?0:e)+a.width>n.width?n.width-a.width:e,top:t}}function ve(e){var t=e.target,n=e.overlay,a=e.container,r=e.scrollNode,o=e.placement,i=e.placementOffset,i=void 0===i?0:i,l=e.points,l=void 0===l?["tl","bl"]:l,s=e.offset,s=void 0===s?[0,0]:s,u=e.position,u=void 0===u?"absolute":u,d=e.beforePosition,c=e.autoAdjust,c=void 0===c||c,f=e.autoHideScrollOverflow,f=void 0===f||f,e=e.rtl,p="offsetWidth"in(p=n)&&"offsetHeight"in p?{width:p.offsetWidth,height:p.offsetHeight}:{width:(p=p.getBoundingClientRect()).width,height:p.height},h=p.width,p=p.height;if("fixed"===u)return m={config:{placement:void 0,points:void 0},style:{position:u,left:s[0],top:s[1]}},d?d(m,{overlay:{node:n,width:h,height:p}}):m;var m=t.getBoundingClientRect(),g=m.width,y=m.height,v=m.left,_=m.top,m=x(a),b=m.left,m=m.top,w=a.scrollWidth,M=a.scrollHeight,k=a.scrollTop,S=a.scrollLeft,b={targetInfo:{width:g,height:y,left:v,top:_},containerInfo:{left:b,top:m,width:w,height:M,scrollTop:k,scrollLeft:S},overlayInfo:{width:h,height:p},points:l,placementOffset:i,offset:s,container:a,rtl:e},m=C(o,b),w=m.left,M=m.top,k=m.points,S=function(e){for(var t=e;t;){var n=fe(t,"overflow");if(null!=n&&n.match(/auto|scroll|hidden/))return t;t=t.parentNode}return document.documentElement}(a),E=(c&&o&&L(w,M,S,b)&&(o!==(l=T(w,M,o,b))&&(M=L(s=(i=C(l,b)).left,e=i.top,S,b)&&l!==(m=T(s,e,l,b))?(w=(c=D((a=C(o=m,b)).left,a.top,b)).left,c.top):(o=l,w=s,e)),w=(i=D(w,M,b)).left,M=i.top),{config:{placement:o,points:k},style:{position:u,left:Math.round(w),top:Math.round(M)}});return f&&o&&null!=r&&r.length&&r.forEach(function(e){var e=e.getBoundingClientRect(),t=e.top,n=e.left,a=e.width,e=e.height;E.style.display=_+y<t||t+e<_||v+g<n||n+a<v?"none":""}),d?d(E,{target:{node:t,width:g,height:y,left:v,top:_},overlay:{node:n,width:h,height:p}}):E}var _e=Object(le.createContext)({setVisibleOverlayToParent:function(){}}),be=["target","children","wrapperClassName","maskClassName","maskStyle","hasMask","canCloseByMask","maskRender","points","offset","fixed","visible","onRequestClose","onOpen","onClose","container","placement","placementOffset","disableScroll","canCloseByOutSideClick","canCloseByEsc","safeNode","beforePosition","onPosition","cache","autoAdjust","autoFocus","isAnimationEnd","rtl","wrapperStyle"],we=["setVisibleOverlayToParent"];function Me(e,t){var n,a="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(a)return(a=a.call(e)).next.bind(a);if(Array.isArray(e)||(a=function(e,t){if(e){if("string"==typeof e)return o(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Map"===(n="Object"===n&&e.constructor?e.constructor.name:n)||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?o(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length)return a&&(e=a),n=0,function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}};throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=new Array(t);n<t;n++)a[n]=e[n];return a}function ke(e){try{var t=window.getComputedStyle(e,"::-webkit-scrollbar");return!t||"none"!==t.getPropertyValue("display")}catch(e){}return!0}var Se=function(e){function t(){return e.apply(this,arguments)||this}return a()(t,e),t.prototype.render=function(){return this.props.children},t}(se.a.Component),H=se.a.forwardRef(function(e,I){function i(){return document.body}function l(e){D(re,e),null!=m&&m(e)}function s(){M.current=null,D(re,null),null!=g&&g()}var u=e.target,t=e.children,R=e.wrapperClassName,A=e.maskClassName,H=e.maskStyle,d=e.hasMask,n=e.canCloseByMask,c=void 0===n||n,n=e.maskRender,a=e.points,r=e.offset,f=e.fixed,p=e.visible,o=e.onRequestClose,h=void 0===o?function(){}:o,m=e.onOpen,g=e.onClose,o=e.container,y=void 0===o?i:o,F=e.placement,z=e.placementOffset,o=e.disableScroll,W=void 0!==o&&o,o=e.canCloseByOutSideClick,V=void 0===o||o,o=e.canCloseByEsc,B=void 0===o||o,v=e.safeNode,U=e.beforePosition,K=e.onPosition,o=e.cache,_=void 0!==o&&o,G=e.autoAdjust,o=e.autoFocus,b=void 0!==o&&o,o=e.isAnimationEnd,o=void 0===o||o,q=e.rtl,$=e.wrapperStyle,e=ie()(e,be),J=f?"fixed":"absolute",w=Object(le.useState)(p),X=w[0],Q=w[1],Z=Object(le.useState)(null)[1],M=Object(le.useRef)({position:J}),ee="string"==typeof y?function(){return document.getElementById(y)}:"function"!=typeof y?function(){return y}:y,w=Object(le.useState)(null),k=w[0],te=w[1],S=Object(le.useRef)(null),ne=Object(le.useRef)(u),E=Object(le.useRef)(null),ae=Object(le.useRef)(null),x=Object(le.useRef)(null),C=Object(le.useRef)([]),L=Object(le.useRef)(null),T=Object(le.useRef)(null),re=Object(le.useState)(Date.now().toString(36))[0],w=Object(le.useContext)(_e),D=w.setVisibleOverlayToParent,w=ie()(w,we),O=Object(le.useRef)(new Map),t=se.a.Children.only(t);if("string"==typeof t.ref)throw new Error("Can not set ref by string in Overlay, use function instead.");function N(){var e=E.current,t=ae.current,n=S.current;e&&t&&n&&(n=ve({target:n,overlay:e,container:t,scrollNode:C.current,points:a,offset:r,position:J,placement:F,placementOffset:z,beforePosition:U,autoAdjust:G,rtl:q}),function(e,t){if(e&&t){var n=Object.keys(e),a=Object.keys(t);if(a.length===n.length){for(var r=0;r<=n.length-1;r++){var o=n[r];if(!a.includes(o))return;if(t[o]!==e[o])return}return 1}}}(M.current,n.style)||(M.current=n.style,pe(e,n.style),"function"==typeof K&&K(n)))}var P=Object(le.useCallback)(function(e){var t,n,a,r=Object(ue.findDOMNode)(e),e=(E.current=r,I),o=r;if(e){if("string"==typeof e)throw new Error("can not set ref string for "+e);"function"==typeof e?e(o):Object.prototype.hasOwnProperty.call(e,"current")&&(e.current=o)}null!==r&&k?(e=function(e){for(var t=e;"static"===fe(t,"position");){if(!t||t===document.documentElement)return document.documentElement;t=t.parentNode}return t}(ge(k)),ae.current=e,o=ge("viewport"===u?d?x.current:i():ye(u)||i()),S.current=o,C.current=function(e,t){for(var n=[],a=e;a&&a!==t&&a!==document.body&&a!==document.documentElement;){var r,o,i,l=fe(a,"overflow");l&&l.match(/auto|scroll/)&&(r=(l=a).clientWidth,o=l.clientHeight,i=l.scrollWidth,o===l.scrollHeight&&r===i||n.push(a)),a=a.parentNode}return n}(o,e),pe(r,{position:f?"fixed":"absolute",top:-1e3,left:-1e3}),T.current=new de.default((t=N.bind(void 0),a=-(n=100),function(){var e=Date.now();n<e-a&&(t.apply(this,arguments),a=e)})),T.current.observe(e),T.current.observe(r),Z({}),b&&setTimeout(function(){n=[],(e=r).querySelectorAll("*").forEach(function(e){var t;me(e)&&(t=e.getAttribute("data-auto-focus")?"unshift":"push",n[t](e))}),me(e)&&n.unshift(e);var n,e=n;0<e.length&&e[0]&&(L.current=document.activeElement,e[0].focus())},100),_||l(r)):(_||s(),T.current&&(T.current.disconnect(),T.current=null))},[k]),j=(ce(document,"mousedown",function(e){for(var t=Me(O.current.entries());!(n=t()).done;){var n=ge(n.value[1]);if(n&&(n===e.target||n.contains(e.target)))return}if(p)if(d&&x.current===e.target)c&&h("maskClick",e);else{var a=Array.isArray(v)?v:[v];E.current&&a.push(function(){return E.current});for(var r=0;r<a.length;r++){var o=ge(ye(a[r]));if(o&&(o===e.target||o.contains(e.target)))return}V&&h("docClick",e)}},!1,!!(p&&E.current&&(V||d&&c))),ce(document,"keydown",function(e){p&&27===e.keyCode&&B&&!O.current.size&&h("esc",e)},!1,!!(p&&E.current&&B)),ce(C.current,"scroll",function(e){p&&N()},!1,!!(p&&E.current&&null!=(Y=C.current)&&Y.length)),Object(le.useEffect)(function(){var e,t;if(p&&W)return e=document.body.getAttribute("style"),pe(document.body,"overflow","hidden"),function(e){if("hidden"===fe(e,"overflow"))return!1;var t=e.parentNode;return t&&t.scrollHeight>t.clientHeight&&0<he()&&ke(t)&&ke(e)}(document.body)&&(t=he())&&pe(document.body,"padding-right","calc("+fe(document.body,"padding-right")+" + "+t+"px)"),function(){document.body.setAttribute("style",e||"")}},[p&&W]),Object(le.useEffect)(function(){!X&&p&&Q(!0)},[p]),E.current);if(Object(le.useEffect)(function(){_&&j&&(p?(N(),l(j)):s())},[p,_&&j]),Object(le.useEffect)(function(){var e;p&&j&&u&&S.current&&ne.current!==u&&((e=ge("viewport"===u?d?x.current:i():ye(u)||i()))&&S.current!==e&&(S.current=e,N()),ne.current=u)},[u]),Object(le.useEffect)(function(){p&&j&&N()},[r,F,z,a,G,q]),Object(le.useEffect)(function(){!p&&b&&L.current&&(L.current.focus(),L.current=null)},[!p&&b&&L.current]),Object(le.useEffect)(function(){!p||k&&ee()===k||te(ee())},[p,y]),!1===X||!k)return null;if(!p&&!_&&o)return null;var Y=t?se.a.createElement(Se,{ref:P},Object(le.cloneElement)(t,oe()({},e,{style:oe()({top:0,left:0},t.props.style,M.current)}))):null,P=oe()({},$),e=(_&&!p&&o&&(P.display="none"),se.a.createElement("div",{className:A,style:H,ref:x})),t=se.a.createElement("div",{className:R,style:P},d?n?n(e):e:null,Y);return se.a.createElement(_e.Provider,{value:oe()({},w,{setVisibleOverlayToParent:function(e,t){t?O.current.set(e,t):O.current.delete(e),D(e,t)}})},Object(ue.createPortal)(t,k))}),F=["overlay","triggerType","triggerClickKeyCode","children","defaultVisible","className","onVisibleChange","container","style","placement","canCloseByTrigger","delay","overlayProps","safeNode","followTrigger","target","disabled"],n=se.a.forwardRef(function(a,e){function t(){return document.body}function n(e,t,n){void 0===n&&(n="fromTrigger"),E||("visible"in a||(e||T.current)&&C(e),y(e,n,t))}function r(e){x&&!b||n(!x,e)}function o(e){(Array.isArray(p)?p:[p]).includes(e.keyCode)&&n(!x,e)}function i(t){return function(e){D.current&&x?(clearTimeout(D.current),D.current=null):O.current||x||(O.current=setTimeout(function(){n(!0,e,t),O.current=null},w))}}function l(t){return function(e){!D.current&&x&&(D.current=setTimeout(function(){n(!1,e,t),D.current=null},w)),O.current&&!x&&(clearTimeout(O.current),O.current=null)}}function s(e){n(!0,e)}function u(e){N.current?N.current=!1:n(!1,e)}function d(e){N.current=!0}var c=a.overlay,f=a.triggerType,f=void 0===f?"click":f,p=a.triggerClickKeyCode,h=a.children,m=a.defaultVisible,g=(a.className,a.onVisibleChange),y=void 0===g?function(){}:g,g=a.container,v=void 0===g?t:g,g=(a.style,a.placement),g=void 0===g?"bl":g,_=a.canCloseByTrigger,b=void 0===_||_,_=a.delay,w=void 0===_?200:_,_=a.overlayProps,M=void 0===_?{}:_,_=a.safeNode,k=a.followTrigger,k=void 0!==k&&k,I=a.target,S=a.disabled,E=void 0!==S&&S,S=ie()(a,F),m=Object(le.useState)(m||a.visible),x=m[0],C=m[1],L=Object(le.useRef)(null),T=Object(le.useRef)(null),D=Object(le.useRef)(null),O=Object(le.useRef)(null),N=Object(le.useRef)(!1),P=h&&se.a.Children.only(h),m=se.a.Children.only(c),j=(Object(le.useEffect)(function(){"visible"in a&&C(a.visible)},[a.visible]),{}),Y={},h=Array.isArray(_)?_:[_],c=(P&&!E&&(("string"==typeof f?[f]:f).forEach(function(e){var t;switch(e){case"click":j.onClick=R(r,null==(t=P.props)?void 0:t.onClick),j.onKeyDown=R(o,null==(t=P.props)?void 0:t.onKeyDown);break;case"hover":j.onMouseEnter=R(i("fromTrigger"),null==(t=P.props)?void 0:t.onMouseEnter),j.onMouseLeave=R(l("fromTrigger"),null==(t=P.props)?void 0:t.onMouseLeave),Y.onMouseEnter=R(i("overlay"),M.onMouseEnter),Y.onMouseLeave=R(l("overlay"),M.onMouseLeave);break;case"focus":j.onFocus=R(s,null==(t=P.props)?void 0:t.onFocus),j.onBlur=R(u,null==(t=P.props)?void 0:t.onBlur),Y.onMouseDown=R(d,M.onMouseDown)}}),h.push(function(){return Object(ue.findDOMNode)(L.current)})),I||(P?function(){return Object(ue.findDOMNode)(L.current)}:t)),_=k?function(){var e;return null==(e=Object(ue.findDOMNode)(L.current))?void 0:e.parentNode}:"string"==typeof v?function(){return document.getElementById(v)}:"function"!=typeof v?function(){return v}:function(){return v(Object(ue.findDOMNode)(L.current))};return se.a.createElement(se.a.Fragment,null,P&&se.a.createElement(Se,{ref:Object(le.useCallback)(function(e){return L.current=e},[])},se.a.cloneElement(P,j)),se.a.createElement(H,oe()({},S,Y,{placement:g,container:_,safeNode:h,visible:x,target:c,onRequestClose:function(e,t){n(!1,t,e)},ref:Object(le.useCallback)(R(A(T),A(e)),[])}),m))}),t=H;t.Popup=n,t.OverlayContext=_e,e.default=t},function(e,t,n){var f=n(612),m=(e.exports=b,e.exports.parse=p,e.exports.compile=function(e,t){return a(p(e,t),t)},e.exports.tokensToFunction=a,e.exports.tokensToRegExp=_,new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g"));function p(e,t){for(var n=[],a=0,r=0,o="",i=t&&t.delimiter||"/";null!=(c=m.exec(e));){var l,s,u,d,c,f=c[0],p=c[1],h=c.index;o+=e.slice(r,h),r=h+f.length,p?o+=p[1]:(h=e[r],f=c[2],p=c[3],l=c[4],s=c[5],u=c[6],d=c[7],h=(o&&(n.push(o),o=""),null!=f&&null!=h&&h!==f),c=c[2]||i,n.push({name:p||a++,prefix:f||"",delimiter:c,optional:"?"===u||"*"===u,repeat:"+"===u||"*"===u,partial:h,asterisk:!!d,pattern:(p=l||s)?p.replace(/([=!:$\/()])/g,"\\$1"):d?".*":"[^"+g(c)+"]+?"}))}return r<e.length&&(o+=e.substr(r)),o&&n.push(o),n}function h(e){return encodeURI(e).replace(/[\/?#]/g,function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})}function a(d,e){for(var c=new Array(d.length),t=0;t<d.length;t++)"object"==typeof d[t]&&(c[t]=new RegExp("^(?:"+d[t].pattern+")$",v(e)));return function(e,t){for(var n="",a=e||{},r=(t||{}).pretty?h:encodeURIComponent,o=0;o<d.length;o++){var i=d[o];if("string"==typeof i)n+=i;else{var l,s=a[i.name];if(null==s){if(i.optional){i.partial&&(n+=i.prefix);continue}throw new TypeError('Expected "'+i.name+'" to be defined')}if(f(s)){if(!i.repeat)throw new TypeError('Expected "'+i.name+'" to not repeat, but received `'+JSON.stringify(s)+"`");if(0===s.length){if(i.optional)continue;throw new TypeError('Expected "'+i.name+'" to not be empty')}for(var u=0;u<s.length;u++){if(l=r(s[u]),!c[o].test(l))throw new TypeError('Expected all "'+i.name+'" to match "'+i.pattern+'", but received `'+JSON.stringify(l)+"`");n+=(0===u?i.prefix:i.delimiter)+l}}else{if(l=i.asterisk?encodeURI(s).replace(/[?#]/g,function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}):r(s),!c[o].test(l))throw new TypeError('Expected "'+i.name+'" to match "'+i.pattern+'", but received "'+l+'"');n+=i.prefix+l}}}return n}}function g(e){return e.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}function y(e,t){return e.keys=t,e}function v(e){return e&&e.sensitive?"":"i"}function _(e,t,n){f(t)||(n=t||n,t=[]);for(var a=(n=n||{}).strict,r=!1!==n.end,o="",i=0;i<e.length;i++){var l,s,u=e[i];"string"==typeof u?o+=g(u):(l=g(u.prefix),s="(?:"+u.pattern+")",t.push(u),u.repeat&&(s+="(?:"+l+s+")*"),o+=s=u.optional?u.partial?l+"("+s+")?":"(?:"+l+"("+s+"))?":l+"("+s+")")}var d=g(n.delimiter||"/"),c=o.slice(-d.length)===d;return a||(o=(c?o.slice(0,-d.length):o)+"(?:"+d+"(?=$))?"),o+=r?"$":a&&c?"":"(?="+d+"|$)",y(new RegExp("^"+o,v(n)),t)}function b(e,t,n){if(f(t)||(n=t||n,t=[]),n=n||{},e instanceof RegExp){var a=e,r=t,o=a.source.match(/\((?!\?)/g);if(o)for(var i=0;i<o.length;i++)r.push({name:i,prefix:null,delimiter:null,optional:!1,repeat:!1,partial:!1,asterisk:!1,pattern:null});return y(a,r)}if(f(e)){for(var l=e,s=t,u=n,d=[],c=0;c<l.length;c++)d.push(b(l[c],s,u).source);return y(new RegExp("(?:"+d.join("|")+")",v(u)),s)}return a=t,_(p(e,t=n),a,t)}},function(e,t,n){"use strict";t.__esModule=!0;var g=c(n(2)),y=c(n(12)),a=c(n(4)),r=c(n(6)),o=c(n(7)),v=c(n(0)),l=n(23),i=c(n(3)),s=n(30),_=c(n(13)),b=c(n(18)),w=c(n(24)),M=c(n(50)),u=c(n(62)),d=c(n(8)),k=n(11);function c(e){return e&&e.__esModule?e:{default:e}}var f,S=u.default.Popup,o=(f=v.default.Component,(0,o.default)(E,f),E.getDerivedStateFromProps=function(e){var t={};return"visible"in e&&(t.visible=e.visible),"selectedKeys"in e&&(t.selectedKeys=e.selectedKeys),t},E.prototype.render=function(){var e=this.props,t=e.prefix,n=e.style,a=e.className,r=e.label,o=e.popupTriggerType,i=e.popupContainer,l=e.popupStyle,s=e.popupClassName,u=e.popupProps,d=e.followTrigger,c=e.selectMode,f=e.menuProps,p=e.children,e=(0,y.default)(e,["prefix","style","className","label","popupTriggerType","popupContainer","popupStyle","popupClassName","popupProps","followTrigger","selectMode","menuProps","children"]),h=this.state,m=(0,_.default)(((m={})[t+"menu-btn"]=!0,m[t+"expand"]=h.visible,m.opened=h.visible,m),a),a=(0,_.default)(((a={})[t+"menu-btn-popup"]=!0,a),s),s=v.default.createElement(b.default,(0,g.default)({style:n,className:m},k.obj.pickOthers(E.propTypes,e)),r," ",v.default.createElement(w.default,{type:"arrow-down",className:t+"menu-btn-arrow"}));return v.default.createElement(S,(0,g.default)({},u,{followTrigger:d,visible:h.visible,onVisibleChange:this.onPopupVisibleChange,trigger:s,triggerType:o,container:i,onOpen:this.onPopupOpen,style:l,className:a}),v.default.createElement("div",{className:t+"menu-btn-spacing-tb"},v.default.createElement(M.default,(0,g.default)({},f,{ref:this._menuRefHandler,selectedKeys:h.selectedKeys,selectMode:c,onSelect:this.selectMenu,onItemClick:this.clickMenuItem}),p)))},u=n=E,n.propTypes={prefix:i.default.string,label:i.default.node,autoWidth:i.default.bool,popupTriggerType:i.default.oneOf(["click","hover"]),popupContainer:i.default.any,visible:i.default.bool,defaultVisible:i.default.bool,onVisibleChange:i.default.func,popupStyle:i.default.object,popupClassName:i.default.string,popupProps:i.default.object,followTrigger:i.default.bool,defaultSelectedKeys:i.default.array,selectedKeys:i.default.array,selectMode:i.default.oneOf(["single","multiple"]),onItemClick:i.default.func,onSelect:i.default.func,menuProps:i.default.object,style:i.default.object,className:i.default.string,children:i.default.any},n.defaultProps={prefix:"next-",autoWidth:!0,popupTriggerType:"click",onVisibleChange:k.func.noop,onItemClick:k.func.noop,onSelect:k.func.noop,defaultSelectedKeys:[],menuProps:{}},u);function E(e,t){(0,a.default)(this,E);var i=(0,r.default)(this,f.call(this,e,t));return i.clickMenuItem=function(e){for(var t,n=arguments.length,a=Array(1<n?n-1:0),r=1;r<n;r++)a[r-1]=arguments[r];var o=i.props.selectMode;(t=i.props).onItemClick.apply(t,[e].concat(a)),"multiple"!==o&&i.onPopupVisibleChange(!1,"menuSelect")},i.selectMenu=function(e){for(var t,n=arguments.length,a=Array(1<n?n-1:0),r=1;r<n;r++)a[r-1]=arguments[r];"selectedKeys"in i.props||i.setState({selectedKeys:e}),(t=i.props).onSelect.apply(t,[e].concat(a))},i.onPopupOpen=function(){var e=(0,l.findDOMNode)(i);i.props.autoWidth&&e&&i.menu&&(i.menu.style.width=e.offsetWidth+"px")},i.onPopupVisibleChange=function(e,t){"visible"in i.props||i.setState({visible:e}),i.props.onVisibleChange(e,t)},i._menuRefHandler=function(e){i.menu=(0,l.findDOMNode)(e);var t=i.props.menuProps.ref;"function"==typeof t&&t(e)},i.state={selectedKeys:e.defaultSelectedKeys,visible:e.defaultVisible},i}o.displayName="MenuButton",o.Item=M.default.Item,o.Group=M.default.Group,o.Divider=M.default.Divider,t.default=d.default.config((0,s.polyfill)(o),{componentName:"MenuButton"}),e.exports=t.default},function(e,t,n){"use strict";
+/*
+object-assign
+(c) Sindre Sorhus
+@license MIT
+*/var s=Object.getOwnPropertySymbols,u=Object.prototype.hasOwnProperty,d=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(Object.assign){var e=new String("abc");if(e[5]="de","5"!==Object.getOwnPropertyNames(e)[0]){for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;var a,r=Object.getOwnPropertyNames(t).map(function(e){return t[e]});if("0123456789"===r.join(""))return a={},"abcdefghijklmnopqrst".split("").forEach(function(e){a[e]=e}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},a)).join("")?1:void 0}}}catch(e){}}()?Object.assign:function(e,t){for(var n,a=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),r=1;r<arguments.length;r++){for(var o in n=Object(arguments[r]))u.call(n,o)&&(a[o]=n[o]);if(s)for(var i=s(n),l=0;l<i.length;l++)d.call(n,i[l])&&(a[i[l]]=n[i[l]])}return a}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n,a=arguments[t];for(n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n])}return e},r=(t.routerReducer=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:o,t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},n=t.type,t=t.payload;return n!==r?e:a({},e,{locationBeforeTransitions:t})},t.LOCATION_CHANGE="@@router/LOCATION_CHANGE"),o={locationBeforeTransitions:null}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.CALL_HISTORY_METHOD="@@router/CALL_HISTORY_METHOD";function a(a){return function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return{type:"@@router/CALL_HISTORY_METHOD",payload:{method:a,args:t}}}}var r=t.push=a("push"),o=t.replace=a("replace"),i=t.go=a("go"),l=t.goBack=a("goBack"),s=t.goForward=a("goForward");t.routerActions={push:r,replace:o,go:i,goBack:l,goForward:s}},function(e,t,n){"use strict";e.exports=n(456)},function(e,t,n){var o=n(463);e.exports=function(a,r,e){if(o(a),void 0===r)return a;switch(e){case 1:return function(e){return a.call(r,e)};case 2:return function(e,t){return a.call(r,e,t)};case 3:return function(e,t,n){return a.call(r,e,t,n)}}return function(){return a.apply(r,arguments)}}},function(e,t,n){e.exports=!n(78)&&!n(108)(function(){return 7!=Object.defineProperty(n(192)("div"),"a",{get:function(){return 7}}).a})},function(e,t,n){var a=n(93),r=n(76).document,o=a(r)&&a(r.createElement);e.exports=function(e){return o?r.createElement(e):{}}},function(e,t,n){var i=n(85),l=n(94),s=n(465)(!1),u=n(145)("IE_PROTO");e.exports=function(e,t){var n,a=l(e),r=0,o=[];for(n in a)n!=u&&i(a,n)&&o.push(n);for(;t.length>r;)!i(a,n=t[r++])||~s(o,n)||o.push(n);return o}},function(e,t,n){var a=n(195);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==a(e)?e.split(""):Object(e)}},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t,n){"use strict";function y(){return this}var v=n(122),_=n(91),b=n(197),w=n(92),M=n(150),k=n(472),S=n(152),E=n(475),x=n(95)("iterator"),C=!([].keys&&"next"in[].keys()),L="values";e.exports=function(e,t,n,a,r,o,i){k(n,t,a);function l(e){if(!C&&e in f)return f[e];switch(e){case"keys":case L:return function(){return new n(this,e)}}return function(){return new n(this,e)}}var s,u,a=t+" Iterator",d=r==L,c=!1,f=e.prototype,p=f[x]||f["@@iterator"]||r&&f[r],h=p||l(r),m=r?d?l("entries"):h:void 0,g="Array"==t&&f.entries||p;if(g&&(g=E(g.call(new e)))!==Object.prototype&&g.next&&(S(g,a,!0),v||"function"==typeof g[x]||w(g,x,y)),d&&p&&p.name!==L&&(c=!0,h=function(){return p.call(this)}),v&&!i||!C&&!c&&f[x]||w(f,x,h),M[t]=h,M[a]=y,r)if(s={values:d?h:l(L),keys:o?h:l("keys"),entries:m},i)for(u in s)u in f||b(f,u,s[u]);else _(_.P+_.F*(C||c),t,s);return s}},function(e,t,n){e.exports=n(92)},function(e,t,n){var a=n(193),r=n(147).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return a(e,r)}},function(e,t,n){var a=n(124),r=n(120),o=n(94),i=n(142),l=n(85),s=n(191),u=Object.getOwnPropertyDescriptor;t.f=n(78)?u:function(e,t){if(e=o(e),t=i(t,!0),s)try{return u(e,t)}catch(e){}if(l(e,t))return r(!a.f.call(e,t),e[t])}},function(e,t,n){"use strict";t.__esModule=!0;var v=a(n(2));t.default=function(e,t,n){var a=e.prefix,r=e.locale,o=(e.defaultPropsConfig,e.pure),i=e.rtl,l=e.device,s=e.popupContainer,e=e.errorBoundary,u=t.nextPrefix,d=t.nextLocale,c=t.nextDefaultPropsConfig,f=t.nextPure,p=t.nextWarning,h=t.nextRtl,m=t.nextDevice,g=t.nextPopupContainer,t=t.nextErrorBoundary,a=a||u,u=void 0,y=n;switch(n){case"DatePicker2":y="DatePicker";break;case"Calendar2":y="Calendar";break;case"TimePicker2":y="TimePicker"}d&&(u=d[y])&&(u.momentLocale=d.momentLocale);n=void 0;r?n=b.obj.deepMerge({},_.default[y],u,r):u&&(n=b.obj.deepMerge({},_.default[y],u));d="boolean"==typeof o?o:f,r="boolean"==typeof i?i:h,u=(0,v.default)({},w(t),w(e));"open"in u||(u.open=!1);return{prefix:a,locale:n,pure:d,rtl:r,warning:p,defaultPropsConfig:c||{},device:l||m||void 0,popupContainer:s||g,errorBoundary:u}};var _=a(n(44)),b=n(11);function a(e){return e&&e.__esModule?e:{default:e}}var w=function(e){return null==e?{}:"boolean"==typeof e?{open:e}:(0,v.default)({open:!0},e)};e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.matches=t.hasDOM=void 0;var a=n(38),r=(a=a)&&a.__esModule?a:{default:a},o=(t.hasClass=s,t.addClass=u,t.removeClass=d,t.toggleClass=function(e,t){if(!l||!e)return!1;{var n;return e.classList?e.classList.toggle(t):(((n=s(e,t))?d:u)(e,t,!0),!n)}},t.getNodeHozWhitespace=function(e){var t=m(e,"paddingLeft"),n=m(e,"paddingRight"),a=m(e,"marginLeft"),e=m(e,"marginRight");return t+n+a+e},t.getStyle=m,t.setStyle=g,t.scrollbar=v,t.hasScroll=function(e){if("hidden"===m(e,"overflow"))return!1;var t=e.parentNode;return t&&t.scrollHeight>t.clientHeight&&0<v().width&&y(t)&&y(e)},t.getOffset=function(e){var t=e.getBoundingClientRect(),e=e.ownerDocument.defaultView;return{top:t.top+e.pageYOffset,left:t.left+e.pageXOffset}},t.getPixels=function(e){var t=document.defaultView;if("number"==typeof+e&&!isNaN(+e))return+e;if("string"==typeof e){var n=/(\d+)px/,a=/(\d+)vh/;if(Array.isArray(e.match(n)))return+e.match(n)[1]||0;if(Array.isArray(e.match(a)))return n=t.innerHeight/100,e.match(a)[1]*n||0}return 0},t.getClosest=function(e,t){if(l&&e){if(Element.prototype.closest)return e.closest(t);if(!document.documentElement.contains(e))return null;do{if(_(e,t))return e}while(null!==(e=e.parentElement))}return null},t.getMatches=_,t.saveRef=function(t){return t?function(e){if("string"==typeof t)throw new Error("can not set ref string for "+t);"function"==typeof t?t(e):Object.prototype.hasOwnProperty.call(t,"current")&&(t.current=e)}:null},n(202)),i=n(96);var l=t.hasDOM="undefined"!=typeof window&&!!window.document&&!!document.createElement;function s(e,t){return!(!l||!e)&&(e.classList?e.classList.contains(t):-1<e.className.indexOf(t))}function u(e,t,n){l&&e&&(e.classList?e.classList.add(t):!0!==n&&s(e,t)||(e.className+=" "+t))}function d(e,t,n){l&&e&&(e.classList?e.classList.remove(t):!0!==n&&!s(e,t)||(e.className=e.className.replace(t,"").replace(/\s+/g," ").trim()))}var c;t.matches=(c=null,l&&(a=document.body||document.head,c=a.matches?"matches":a.webkitMatchesSelector?"webkitMatchesSelector":a.msMatchesSelector?"msMatchesSelector":a.mozMatchesSelector?"mozMatchesSelector":null),function(e,t){return!(!l||!e)&&(!!c&&e[c](t))});var f=/margin|padding|width|height|max|min|offset|size|top/i,p={left:1,top:1,right:1,bottom:1};var h={cssFloat:1,styleFloat:1,float:1};function m(e,t){if(!l||!e)return null;var n=(n=e)&&1===n.nodeType?window.getComputedStyle(n,null):{};if(1===arguments.length)return n;if((0,i.isPlainObject)(n))return null;t=h[t]?"cssFloat"in e.style?"cssFloat":"styleFloat":t;var a=e,r=t,n=n.getPropertyValue((0,o.hyphenate)(t))||e.style[(0,o.camelcase)(t)];if(r=r.toLowerCase(),"auto"===n){if("height"===r)return a.offsetHeight||0;if("width"===r)return a.offsetWidth||0}return r in p||(p[r]=f.test(r)),p[r]?parseFloat(n)||0:n}function g(n,e,t){if(!l||!n)return!1;"object"===(void 0===e?"undefined":(0,r.default)(e))&&2===arguments.length?(0,i.each)(e,function(e,t){return g(n,t,e)}):(e=h[e]?"cssFloat"in n.style?"cssFloat":"styleFloat":e,"number"==typeof t&&f.test(e)&&(t+="px"),n.style[(0,o.camelcase)(e)]=t)}var y=function(e){try{var t=window.getComputedStyle(e,"::-webkit-scrollbar");return!t||"none"!==t.getPropertyValue("display")}catch(e){}return!0};function v(){var e=document.createElement("div"),t=(e.className+="just-to-get-scrollbar-size",g(e,{position:"absolute",width:"100px",height:"100px",overflow:"scroll",top:"-9999px"}),document.body&&document.body.appendChild(e),e.offsetWidth-e.clientWidth),n=e.offsetHeight-e.clientHeight;return document.body.removeChild(e),{width:t,height:n}}function _(e,t){return l&&e?Element.prototype.matches?e.matches(t):Element.prototype.msMatchesSelector?e.msMatchesSelector(t):Element.prototype.webkitMatchesSelector?e.webkitMatchesSelector(t):null:null}},function(e,t,n){"use strict";t.__esModule=!0,t.camelcase=function(e){return/-/.test(e)?e.toLowerCase().replace(/-([a-z])/g,function(e,t){return t.toUpperCase()}):e||""},t.hyphenate=function(e){var t=(0,r.typeOf)(e);return"String"===t?e.replace(/([A-Z])/g,function(e){return"-"+e.toLowerCase()}):((0,a.warning)("[ hyphenate(str: string): string ] Expected arguments[0] to be a string but get a "+t+".It will return an empty string without any processing."),"")},t.template=function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},n=(0,r.typeOf)(e);return"String"===n?e.replace(/\{[a-z]*\}/g,function(e){e=e.substring(1,e.length-1);return t[e]||""}):((0,a.warning)("[ template(tpl: string, object: object): string ] Expected arguments[0] to be a string but get a "+n+".It will return an empty string without any processing."),"")};var a=n(203),r=n(96)},function(e,t,n){"use strict";t.__esModule=!0,t.deprecated=function(e,t,n){if(!(0,a.isProduction)()&&"undefined"!=typeof console&&console.error)return console.error("Warning: [ "+e+" ] is deprecated at [ "+n+" ], use [ "+t+" ] instead of it.")},t.warning=function(e){if(!(0,a.isProduction)()&&"undefined"!=typeof console&&console.error)return console.error("Warning: "+e)};var a=n(204)},function(e,t,n){"use strict";t.__esModule=!0;var a=t.ieVersion="undefined"!=typeof document?document.documentMode:void 0,r=t.isProduction=function(){var e=!1;try{e=!0}catch(e){}return e};t.default={ieVersion:a,isProduction:r}},function(e,t,n){e.exports=function(){"use strict";var u=1e3,d=6e4,c=36e5,s="millisecond",p="second",h="minute",m="hour",g="day",y="week",v="month",f="quarter",_="year",b="date",w="Invalid Date",i=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,M=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,e={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_")},o=function(e,t,n){var a=String(e);return!a||a.length>=t?e:""+Array(t+1-a.length).join(n)+e},t={s:o,z:function(e){var t=-e.utcOffset(),n=Math.abs(t),a=Math.floor(n/60),r=n%60;return(t<=0?"+":"-")+o(a,2,"0")+":"+o(r,2,"0")},m:function e(t,n){if(t.date()<n.date())return-e(n,t);var a=12*(n.year()-t.year())+(n.month()-t.month()),r=t.clone().add(a,v),o=n-r<0,i=t.clone().add(a+(o?-1:1),v);return+(-(a+(n-r)/(o?r-i:i-r))||0)},a:function(e){return e<0?Math.ceil(e)||0:Math.floor(e)},p:function(e){return{M:v,y:_,w:y,d:g,D:b,h:m,m:h,s:p,ms:s,Q:f}[e]||String(e||"").toLowerCase().replace(/s$/,"")},u:function(e){return void 0===e}},k="en",S={},a=(S[k]=e,function(e){return e instanceof l}),r=function e(t,n,a){var r;if(!t)return k;if("string"==typeof t){var o=t.toLowerCase();S[o]&&(r=o),n&&(S[o]=n,r=o);var i=t.split("-");if(!r&&i.length>1)return e(i[0])}else{var l=t.name;S[l]=t,r=l}return!a&&r&&(k=r),r||!a&&k},E=function(e,t){if(a(e))return e.clone();var n="object"==typeof t?t:{};return n.date=e,n.args=arguments,new l(n)},x=t,l=(x.l=r,x.i=a,x.w=function(e,t){return E(e,{locale:t.$L,utc:t.$u,x:t.$x,$offset:t.$offset})},function(){function e(e){this.$L=r(e.locale,null,!0),this.parse(e)}var t=e.prototype;return t.parse=function(e){this.$d=function(e){var t=e.date,n=e.utc;if(null===t)return new Date(NaN);if(x.u(t))return new Date;if(t instanceof Date)return new Date(t);if("string"==typeof t&&!/Z$/i.test(t)){var a=t.match(i);if(a){var r=a[2]-1||0,o=(a[7]||"0").substring(0,3);return n?new Date(Date.UTC(a[1],r,a[3]||1,a[4]||0,a[5]||0,a[6]||0,o)):new Date(a[1],r,a[3]||1,a[4]||0,a[5]||0,a[6]||0,o)}}return new Date(t)}(e),this.$x=e.x||{},this.init()},t.init=function(){var e=this.$d;this.$y=e.getFullYear(),this.$M=e.getMonth(),this.$D=e.getDate(),this.$W=e.getDay(),this.$H=e.getHours(),this.$m=e.getMinutes(),this.$s=e.getSeconds(),this.$ms=e.getMilliseconds()},t.$utils=function(){return x},t.isValid=function(){return!(this.$d.toString()===w)},t.isSame=function(e,t){var n=E(e);return this.startOf(t)<=n&&n<=this.endOf(t)},t.isAfter=function(e,t){return E(e)<this.startOf(t)},t.isBefore=function(e,t){return this.endOf(t)<E(e)},t.$g=function(e,t,n){return x.u(e)?this[t]:this.set(n,e)},t.unix=function(){return Math.floor(this.valueOf()/1e3)},t.valueOf=function(){return this.$d.getTime()},t.startOf=function(e,t){var a=this,r=!!x.u(t)||t,n=x.p(e),o=function(e,t){var n=x.w(a.$u?Date.UTC(a.$y,t,e):new Date(a.$y,t,e),a);return r?n:n.endOf(g)},i=function(e,t){return x.w(a.toDate()[e].apply(a.toDate("s"),(r?[0,0,0,0]:[23,59,59,999]).slice(t)),a)},l=this.$W,s=this.$M,u=this.$D,d="set"+(this.$u?"UTC":"");switch(n){case _:return r?o(1,0):o(31,11);case v:return r?o(1,s):o(0,s+1);case y:var c=this.$locale().weekStart||0,f=(l<c?l+7:l)-c;return o(r?u-f:u+(6-f),s);case g:case b:return i(d+"Hours",0);case m:return i(d+"Minutes",1);case h:return i(d+"Seconds",2);case p:return i(d+"Milliseconds",3);default:return this.clone()}},t.endOf=function(e){return this.startOf(e,!1)},t.$set=function(e,t){var n,a=x.p(e),r="set"+(this.$u?"UTC":""),o=(n={},n[g]=r+"Date",n[b]=r+"Date",n[v]=r+"Month",n[_]=r+"FullYear",n[m]=r+"Hours",n[h]=r+"Minutes",n[p]=r+"Seconds",n[s]=r+"Milliseconds",n)[a],i=a===g?this.$D+(t-this.$W):t;if(a===v||a===_){var l=this.clone().set(b,1);l.$d[o](i),l.init(),this.$d=l.set(b,Math.min(this.$D,l.daysInMonth())).$d}else o&&this.$d[o](i);return this.init(),this},t.set=function(e,t){return this.clone().$set(e,t)},t.get=function(e){return this[x.p(e)]()},t.add=function(n,e){var t,a=this;n=Number(n);var r=x.p(e),o=function(e){var t=E(a);return x.w(t.date(t.date()+Math.round(e*n)),a)};if(r===v)return this.set(v,this.$M+n);if(r===_)return this.set(_,this.$y+n);if(r===g)return o(1);if(r===y)return o(7);var i=(t={},t[h]=d,t[m]=c,t[p]=u,t)[r]||1,l=this.$d.getTime()+n*i;return x.w(l,this)},t.subtract=function(e,t){return this.add(-1*e,t)},t.format=function(e){var r=this,t=this.$locale();if(!this.isValid())return t.invalidDate||w;var o=e||"YYYY-MM-DDTHH:mm:ssZ",n=x.z(this),a=this.$H,i=this.$m,l=this.$M,s=t.weekdays,u=t.months,d=function(e,t,n,a){return e&&(e[t]||e(r,o))||n[t].slice(0,a)},c=function(e){return x.s(a%12||12,e,"0")},f=t.meridiem||function(e,t,n){var a=e<12?"AM":"PM";return n?a.toLowerCase():a},p={YY:String(this.$y).slice(-2),YYYY:this.$y,M:l+1,MM:x.s(l+1,2,"0"),MMM:d(t.monthsShort,l,u,3),MMMM:d(u,l),D:this.$D,DD:x.s(this.$D,2,"0"),d:String(this.$W),dd:d(t.weekdaysMin,this.$W,s,2),ddd:d(t.weekdaysShort,this.$W,s,3),dddd:s[this.$W],H:String(a),HH:x.s(a,2,"0"),h:c(1),hh:c(2),a:f(a,i,!0),A:f(a,i,!1),m:String(i),mm:x.s(i,2,"0"),s:String(this.$s),ss:x.s(this.$s,2,"0"),SSS:x.s(this.$ms,3,"0"),Z:n};return o.replace(M,function(e,t){return t||p[e]||n.replace(":","")})},t.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},t.diff=function(e,t,n){var a,r=x.p(t),o=E(e),i=(o.utcOffset()-this.utcOffset())*d,l=this-o,s=x.m(this,o);return s=(a={},a[_]=s/12,a[v]=s,a[f]=s/3,a[y]=(l-i)/6048e5,a[g]=(l-i)/864e5,a[m]=l/c,a[h]=l/d,a[p]=l/u,a)[r]||l,n?s:x.a(s)},t.daysInMonth=function(){return this.endOf(v).$D},t.$locale=function(){return S[this.$L]},t.locale=function(e,t){if(!e)return this.$L;var n=this.clone(),a=r(e,t,!0);return a&&(n.$L=a),n},t.clone=function(){return x.w(this.$d,this)},t.toDate=function(){return new Date(this.valueOf())},t.toJSON=function(){return this.isValid()?this.toISOString():null},t.toISOString=function(){return this.$d.toISOString()},t.toString=function(){return this.$d.toUTCString()},e}()),n=l.prototype;return E.prototype=n,[["$ms",s],["$s",p],["$m",h],["$H",m],["$W",g],["$M",v],["$y",_],["$D",b]].forEach(function(t){n[t[1]]=function(e){return this.$g(e,t[0],t[1])}}),E.extend=function(e,t){return e.$i||(e(t,l,E),e.$i=!0),E},E.locale=r,E.isDayjs=a,E.unix=function(e){return E(1e3*e)},E.en=S[k],E.Ls=S,E.p={},E}()},function(e,t,n){"use strict";t.__esModule=!0,t.default={BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,PAGE_UP:33,PAGE_DOWN:34,ESCAPE:27,LEFT_ARROW:37,UP_ARROW:38,RIGHT_ARROW:39,DOWN_ARROW:40,CONTROL:17,OPTION:18,CMD:91,COMMAND:91,DELETE:8},e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var a=l(n(4)),r=l(n(6)),o=l(n(7)),i=l(n(0)),n=l(n(3));function l(e){return e&&e.__esModule?e:{default:e}}function s(){return""}s.propTypes={error:n.default.object,errorInfo:n.default.object};u=i.default.Component,(0,o.default)(d,u),d.prototype.componentDidCatch=function(e,t){this.setState({error:e,errorInfo:t});var n=this.props.afterCatch;"afterCatch"in this.props&&"function"==typeof n&&this.props.afterCatch(e,t)},d.prototype.render=function(){var e=this.props.fallbackUI;return this.state.errorInfo?i.default.createElement(void 0===e?s:e,{error:this.state.error,errorInfo:this.state.errorInfo}):this.props.children},d.propTypes={children:n.default.element,afterCatch:n.default.func,fallbackUI:n.default.func};var u,o=d;function d(e){(0,a.default)(this,d);e=(0,r.default)(this,u.call(this,e));return e.state={error:null,errorInfo:null},e}o.displayName="ErrorBoundary",t.default=o,e.exports=t.default},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(e){return/^nm$/i.test(e)},meridiem:function(e,t,n){if(e<12)return n?"vm":"VM";else return n?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[M么re om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",ss:"%d sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(e===1||e===8||e>=20?"ste":"de")},week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t={1:"佟",2:"佗",3:"伲",4:"伽",5:"佶",6:"佴",7:"侑",8:"侉",9:"侃",0:"贍"},n={"佟":"1","佗":"2","伲":"3","伽":"4","佶":"5","佴":"6","侑":"7","侉":"8","侃":"9","贍":"0"},l=function(e){return e===0?0:e===1?1:e===2?2:e%100>=3&&e%100<=10?3:e%100>=11?4:5},s={s:["兀賯賱 賲賳 孬丕賳賷丞","孬丕賳賷丞 賵丕丨丿丞",["孬丕賳賷鬲丕賳","孬丕賳賷鬲賷賳"],"%d 孬賵丕賳","%d 孬丕賳賷丞","%d 孬丕賳賷丞"],m:["兀賯賱 賲賳 丿賯賷賯丞","丿賯賷賯丞 賵丕丨丿丞",["丿賯賷賯鬲丕賳","丿賯賷賯鬲賷賳"],"%d 丿賯丕卅賯","%d 丿賯賷賯丞","%d 丿賯賷賯丞"],h:["兀賯賱 賲賳 爻丕毓丞","爻丕毓丞 賵丕丨丿丞",["爻丕毓鬲丕賳","爻丕毓鬲賷賳"],"%d 爻丕毓丕鬲","%d 爻丕毓丞","%d 爻丕毓丞"],d:["兀賯賱 賲賳 賷賵賲","賷賵賲 賵丕丨丿",["賷賵賲丕賳","賷賵賲賷賳"],"%d 兀賷丕賲","%d 賷賵賲賸丕","%d 賷賵賲"],M:["兀賯賱 賲賳 卮賴乇","卮賴乇 賵丕丨丿",["卮賴乇丕賳","卮賴乇賷賳"],"%d 兀卮賴乇","%d 卮賴乇丕","%d 卮賴乇"],y:["兀賯賱 賲賳 毓丕賲","毓丕賲 賵丕丨丿",["毓丕賲丕賳","毓丕賲賷賳"],"%d 兀毓賵丕賲","%d 毓丕賲賸丕","%d 毓丕賲"]},a=function(i){return function(e,t,n,a){var r=l(e),o=s[i][l(e)];if(r===2)o=o[t?0:1];return o.replace(/%d/i,e)}},r=["賷賳丕賷乇","賮亘乇丕賷乇","賲丕乇爻","兀亘乇賷賱","賲丕賷賵","賷賵賳賷賵","賷賵賱賷賵","兀睾爻胤爻","爻亘鬲賲亘乇","兀賰鬲賵亘乇","賳賵賮賲亘乇","丿賷爻賲亘乇"],o;e.defineLocale("ar",{months:r,monthsShort:r,weekdays:"丕賱兀丨丿_丕賱廿孬賳賷賳_丕賱孬賱丕孬丕亍_丕賱兀乇亘毓丕亍_丕賱禺賲賷爻_丕賱噩賲毓丞_丕賱爻亘鬲".split("_"),weekdaysShort:"兀丨丿_廿孬賳賷賳_孬賱丕孬丕亍_兀乇亘毓丕亍_禺賲賷爻_噩賲毓丞_爻亘鬲".split("_"),weekdaysMin:"丨_賳_孬_乇_禺_噩_爻".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/鈥廙/鈥廦YYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/氐|賲/,isPM:function(e){return"賲"===e},meridiem:function(e,t,n){if(e<12)return"氐";else return"賲"},calendar:{sameDay:"[丕賱賷賵賲 毓賳丿 丕賱爻丕毓丞] LT",nextDay:"[睾丿賸丕 毓賳丿 丕賱爻丕毓丞] LT",nextWeek:"dddd [毓賳丿 丕賱爻丕毓丞] LT",lastDay:"[兀賲爻 毓賳丿 丕賱爻丕毓丞] LT",lastWeek:"dddd [毓賳丿 丕賱爻丕毓丞] LT",sameElse:"L"},relativeTime:{future:"亘毓丿 %s",past:"賲賳匕 %s",s:a("s"),ss:a("s"),m:a("m"),mm:a("m"),h:a("h"),hh:a("h"),d:a("d"),dd:a("d"),M:a("M"),MM:a("M"),y:a("y"),yy:a("y")},preparse:function(e){return e.replace(/[佟佗伲伽佶佴侑侉侃贍]/g,function(e){return n[e]}).replace(/貙/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]}).replace(/,/g,"貙")},week:{dow:6,doy:12}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var l=function(e){return e===0?0:e===1?1:e===2?2:e%100>=3&&e%100<=10?3:e%100>=11?4:5},s={s:["兀賯賱 賲賳 孬丕賳賷丞","孬丕賳賷丞 賵丕丨丿丞",["孬丕賳賷鬲丕賳","孬丕賳賷鬲賷賳"],"%d 孬賵丕賳","%d 孬丕賳賷丞","%d 孬丕賳賷丞"],m:["兀賯賱 賲賳 丿賯賷賯丞","丿賯賷賯丞 賵丕丨丿丞",["丿賯賷賯鬲丕賳","丿賯賷賯鬲賷賳"],"%d 丿賯丕卅賯","%d 丿賯賷賯丞","%d 丿賯賷賯丞"],h:["兀賯賱 賲賳 爻丕毓丞","爻丕毓丞 賵丕丨丿丞",["爻丕毓鬲丕賳","爻丕毓鬲賷賳"],"%d 爻丕毓丕鬲","%d 爻丕毓丞","%d 爻丕毓丞"],d:["兀賯賱 賲賳 賷賵賲","賷賵賲 賵丕丨丿",["賷賵賲丕賳","賷賵賲賷賳"],"%d 兀賷丕賲","%d 賷賵賲賸丕","%d 賷賵賲"],M:["兀賯賱 賲賳 卮賴乇","卮賴乇 賵丕丨丿",["卮賴乇丕賳","卮賴乇賷賳"],"%d 兀卮賴乇","%d 卮賴乇丕","%d 卮賴乇"],y:["兀賯賱 賲賳 毓丕賲","毓丕賲 賵丕丨丿",["毓丕賲丕賳","毓丕賲賷賳"],"%d 兀毓賵丕賲","%d 毓丕賲賸丕","%d 毓丕賲"]},t=function(i){return function(e,t,n,a){var r=l(e),o=s[i][l(e)];if(r===2)o=o[t?0:1];return o.replace(/%d/i,e)}},n=["噩丕賳賮賷","賮賷賮乇賷","賲丕乇爻","兀賮乇賷賱","賲丕賷","噩賵丕賳","噩賵賷賱賷丞","兀賵鬲","爻亘鬲賲亘乇","兀賰鬲賵亘乇","賳賵賮賲亘乇","丿賷爻賲亘乇"],a;e.defineLocale("ar-dz",{months:n,monthsShort:n,weekdays:"丕賱兀丨丿_丕賱廿孬賳賷賳_丕賱孬賱丕孬丕亍_丕賱兀乇亘毓丕亍_丕賱禺賲賷爻_丕賱噩賲毓丞_丕賱爻亘鬲".split("_"),weekdaysShort:"兀丨丿_廿孬賳賷賳_孬賱丕孬丕亍_兀乇亘毓丕亍_禺賲賷爻_噩賲毓丞_爻亘鬲".split("_"),weekdaysMin:"丨_賳_孬_乇_禺_噩_爻".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/鈥廙/鈥廦YYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/氐|賲/,isPM:function(e){return"賲"===e},meridiem:function(e,t,n){if(e<12)return"氐";else return"賲"},calendar:{sameDay:"[丕賱賷賵賲 毓賳丿 丕賱爻丕毓丞] LT",nextDay:"[睾丿賸丕 毓賳丿 丕賱爻丕毓丞] LT",nextWeek:"dddd [毓賳丿 丕賱爻丕毓丞] LT",lastDay:"[兀賲爻 毓賳丿 丕賱爻丕毓丞] LT",lastWeek:"dddd [毓賳丿 丕賱爻丕毓丞] LT",sameElse:"L"},relativeTime:{future:"亘毓丿 %s",past:"賲賳匕 %s",s:t("s"),ss:t("s"),m:t("m"),mm:t("m"),h:t("h"),hh:t("h"),d:t("d"),dd:t("d"),M:t("M"),MM:t("M"),y:t("y"),yy:t("y")},postformat:function(e){return e.replace(/,/g,"貙")},week:{dow:0,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("ar-kw",{months:"賷賳丕賷乇_賮亘乇丕賷乇_賲丕乇爻_兀亘乇賷賱_賲丕賷_賷賵賳賷賵_賷賵賱賷賵夭_睾卮鬲_卮鬲賳亘乇_兀賰鬲賵亘乇_賳賵賳亘乇_丿噩賳亘乇".split("_"),monthsShort:"賷賳丕賷乇_賮亘乇丕賷乇_賲丕乇爻_兀亘乇賷賱_賲丕賷_賷賵賳賷賵_賷賵賱賷賵夭_睾卮鬲_卮鬲賳亘乇_兀賰鬲賵亘乇_賳賵賳亘乇_丿噩賳亘乇".split("_"),weekdays:"丕賱兀丨丿_丕賱廿鬲賳賷賳_丕賱孬賱丕孬丕亍_丕賱兀乇亘毓丕亍_丕賱禺賲賷爻_丕賱噩賲毓丞_丕賱爻亘鬲".split("_"),weekdaysShort:"丕丨丿_丕鬲賳賷賳_孬賱丕孬丕亍_丕乇亘毓丕亍_禺賲賷爻_噩賲毓丞_爻亘鬲".split("_"),weekdaysMin:"丨_賳_孬_乇_禺_噩_爻".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[丕賱賷賵賲 毓賱賶 丕賱爻丕毓丞] LT",nextDay:"[睾丿丕 毓賱賶 丕賱爻丕毓丞] LT",nextWeek:"dddd [毓賱賶 丕賱爻丕毓丞] LT",lastDay:"[兀賲爻 毓賱賶 丕賱爻丕毓丞] LT",lastWeek:"dddd [毓賱賶 丕賱爻丕毓丞] LT",sameElse:"L"},relativeTime:{future:"賮賷 %s",past:"賲賳匕 %s",s:"孬賵丕賳",ss:"%d 孬丕賳賷丞",m:"丿賯賷賯丞",mm:"%d 丿賯丕卅賯",h:"爻丕毓丞",hh:"%d 爻丕毓丕鬲",d:"賷賵賲",dd:"%d 兀賷丕賲",M:"卮賴乇",MM:"%d 兀卮賴乇",y:"爻賳丞",yy:"%d 爻賳賵丕鬲"},week:{dow:0,doy:12}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t={1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",0:"0"},l=function(e){return e===0?0:e===1?1:e===2?2:e%100>=3&&e%100<=10?3:e%100>=11?4:5},s={s:["兀賯賱 賲賳 孬丕賳賷丞","孬丕賳賷丞 賵丕丨丿丞",["孬丕賳賷鬲丕賳","孬丕賳賷鬲賷賳"],"%d 孬賵丕賳","%d 孬丕賳賷丞","%d 孬丕賳賷丞"],m:["兀賯賱 賲賳 丿賯賷賯丞","丿賯賷賯丞 賵丕丨丿丞",["丿賯賷賯鬲丕賳","丿賯賷賯鬲賷賳"],"%d 丿賯丕卅賯","%d 丿賯賷賯丞","%d 丿賯賷賯丞"],h:["兀賯賱 賲賳 爻丕毓丞","爻丕毓丞 賵丕丨丿丞",["爻丕毓鬲丕賳","爻丕毓鬲賷賳"],"%d 爻丕毓丕鬲","%d 爻丕毓丞","%d 爻丕毓丞"],d:["兀賯賱 賲賳 賷賵賲","賷賵賲 賵丕丨丿",["賷賵賲丕賳","賷賵賲賷賳"],"%d 兀賷丕賲","%d 賷賵賲賸丕","%d 賷賵賲"],M:["兀賯賱 賲賳 卮賴乇","卮賴乇 賵丕丨丿",["卮賴乇丕賳","卮賴乇賷賳"],"%d 兀卮賴乇","%d 卮賴乇丕","%d 卮賴乇"],y:["兀賯賱 賲賳 毓丕賲","毓丕賲 賵丕丨丿",["毓丕賲丕賳","毓丕賲賷賳"],"%d 兀毓賵丕賲","%d 毓丕賲賸丕","%d 毓丕賲"]},n=function(i){return function(e,t,n,a){var r=l(e),o=s[i][l(e)];if(r===2)o=o[t?0:1];return o.replace(/%d/i,e)}},a=["賷賳丕賷乇","賮亘乇丕賷乇","賲丕乇爻","兀亘乇賷賱","賲丕賷賵","賷賵賳賷賵","賷賵賱賷賵","兀睾爻胤爻","爻亘鬲賲亘乇","兀賰鬲賵亘乇","賳賵賮賲亘乇","丿賷爻賲亘乇"],r;e.defineLocale("ar-ly",{months:a,monthsShort:a,weekdays:"丕賱兀丨丿_丕賱廿孬賳賷賳_丕賱孬賱丕孬丕亍_丕賱兀乇亘毓丕亍_丕賱禺賲賷爻_丕賱噩賲毓丞_丕賱爻亘鬲".split("_"),weekdaysShort:"兀丨丿_廿孬賳賷賳_孬賱丕孬丕亍_兀乇亘毓丕亍_禺賲賷爻_噩賲毓丞_爻亘鬲".split("_"),weekdaysMin:"丨_賳_孬_乇_禺_噩_爻".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/鈥廙/鈥廦YYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/氐|賲/,isPM:function(e){return"賲"===e},meridiem:function(e,t,n){if(e<12)return"氐";else return"賲"},calendar:{sameDay:"[丕賱賷賵賲 毓賳丿 丕賱爻丕毓丞] LT",nextDay:"[睾丿賸丕 毓賳丿 丕賱爻丕毓丞] LT",nextWeek:"dddd [毓賳丿 丕賱爻丕毓丞] LT",lastDay:"[兀賲爻 毓賳丿 丕賱爻丕毓丞] LT",lastWeek:"dddd [毓賳丿 丕賱爻丕毓丞] LT",sameElse:"L"},relativeTime:{future:"亘毓丿 %s",past:"賲賳匕 %s",s:n("s"),ss:n("s"),m:n("m"),mm:n("m"),h:n("h"),hh:n("h"),d:n("d"),dd:n("d"),M:n("M"),MM:n("M"),y:n("y"),yy:n("y")},preparse:function(e){return e.replace(/貙/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]}).replace(/,/g,"貙")},week:{dow:6,doy:12}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("ar-ma",{months:"賷賳丕賷乇_賮亘乇丕賷乇_賲丕乇爻_兀亘乇賷賱_賲丕賷_賷賵賳賷賵_賷賵賱賷賵夭_睾卮鬲_卮鬲賳亘乇_兀賰鬲賵亘乇_賳賵賳亘乇_丿噩賳亘乇".split("_"),monthsShort:"賷賳丕賷乇_賮亘乇丕賷乇_賲丕乇爻_兀亘乇賷賱_賲丕賷_賷賵賳賷賵_賷賵賱賷賵夭_睾卮鬲_卮鬲賳亘乇_兀賰鬲賵亘乇_賳賵賳亘乇_丿噩賳亘乇".split("_"),weekdays:"丕賱兀丨丿_丕賱廿孬賳賷賳_丕賱孬賱丕孬丕亍_丕賱兀乇亘毓丕亍_丕賱禺賲賷爻_丕賱噩賲毓丞_丕賱爻亘鬲".split("_"),weekdaysShort:"丕丨丿_丕孬賳賷賳_孬賱丕孬丕亍_丕乇亘毓丕亍_禺賲賷爻_噩賲毓丞_爻亘鬲".split("_"),weekdaysMin:"丨_賳_孬_乇_禺_噩_爻".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[丕賱賷賵賲 毓賱賶 丕賱爻丕毓丞] LT",nextDay:"[睾丿丕 毓賱賶 丕賱爻丕毓丞] LT",nextWeek:"dddd [毓賱賶 丕賱爻丕毓丞] LT",lastDay:"[兀賲爻 毓賱賶 丕賱爻丕毓丞] LT",lastWeek:"dddd [毓賱賶 丕賱爻丕毓丞] LT",sameElse:"L"},relativeTime:{future:"賮賷 %s",past:"賲賳匕 %s",s:"孬賵丕賳",ss:"%d 孬丕賳賷丞",m:"丿賯賷賯丞",mm:"%d 丿賯丕卅賯",h:"爻丕毓丞",hh:"%d 爻丕毓丕鬲",d:"賷賵賲",dd:"%d 兀賷丕賲",M:"卮賴乇",MM:"%d 兀卮賴乇",y:"爻賳丞",yy:"%d 爻賳賵丕鬲"},week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t={1:"佟",2:"佗",3:"伲",4:"伽",5:"佶",6:"佴",7:"侑",8:"侉",9:"侃",0:"贍"},n={"佟":"1","佗":"2","伲":"3","伽":"4","佶":"5","佴":"6","侑":"7","侉":"8","侃":"9","贍":"0"},a;e.defineLocale("ar-sa",{months:"賷賳丕賷乇_賮亘乇丕賷乇_賲丕乇爻_兀亘乇賷賱_賲丕賷賵_賷賵賳賷賵_賷賵賱賷賵_兀睾爻胤爻_爻亘鬲賲亘乇_兀賰鬲賵亘乇_賳賵賮賲亘乇_丿賷爻賲亘乇".split("_"),monthsShort:"賷賳丕賷乇_賮亘乇丕賷乇_賲丕乇爻_兀亘乇賷賱_賲丕賷賵_賷賵賳賷賵_賷賵賱賷賵_兀睾爻胤爻_爻亘鬲賲亘乇_兀賰鬲賵亘乇_賳賵賮賲亘乇_丿賷爻賲亘乇".split("_"),weekdays:"丕賱兀丨丿_丕賱廿孬賳賷賳_丕賱孬賱丕孬丕亍_丕賱兀乇亘毓丕亍_丕賱禺賲賷爻_丕賱噩賲毓丞_丕賱爻亘鬲".split("_"),weekdaysShort:"兀丨丿_廿孬賳賷賳_孬賱丕孬丕亍_兀乇亘毓丕亍_禺賲賷爻_噩賲毓丞_爻亘鬲".split("_"),weekdaysMin:"丨_賳_孬_乇_禺_噩_爻".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/氐|賲/,isPM:function(e){return"賲"===e},meridiem:function(e,t,n){if(e<12)return"氐";else return"賲"},calendar:{sameDay:"[丕賱賷賵賲 毓賱賶 丕賱爻丕毓丞] LT",nextDay:"[睾丿丕 毓賱賶 丕賱爻丕毓丞] LT",nextWeek:"dddd [毓賱賶 丕賱爻丕毓丞] LT",lastDay:"[兀賲爻 毓賱賶 丕賱爻丕毓丞] LT",lastWeek:"dddd [毓賱賶 丕賱爻丕毓丞] LT",sameElse:"L"},relativeTime:{future:"賮賷 %s",past:"賲賳匕 %s",s:"孬賵丕賳",ss:"%d 孬丕賳賷丞",m:"丿賯賷賯丞",mm:"%d 丿賯丕卅賯",h:"爻丕毓丞",hh:"%d 爻丕毓丕鬲",d:"賷賵賲",dd:"%d 兀賷丕賲",M:"卮賴乇",MM:"%d 兀卮賴乇",y:"爻賳丞",yy:"%d 爻賳賵丕鬲"},preparse:function(e){return e.replace(/[佟佗伲伽佶佴侑侉侃贍]/g,function(e){return n[e]}).replace(/貙/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]}).replace(/,/g,"貙")},week:{dow:0,doy:6}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("ar-tn",{months:"噩丕賳賮賷_賮賷賮乇賷_賲丕乇爻_兀賮乇賷賱_賲丕賷_噩賵丕賳_噩賵賷賱賷丞_兀賵鬲_爻亘鬲賲亘乇_兀賰鬲賵亘乇_賳賵賮賲亘乇_丿賷爻賲亘乇".split("_"),monthsShort:"噩丕賳賮賷_賮賷賮乇賷_賲丕乇爻_兀賮乇賷賱_賲丕賷_噩賵丕賳_噩賵賷賱賷丞_兀賵鬲_爻亘鬲賲亘乇_兀賰鬲賵亘乇_賳賵賮賲亘乇_丿賷爻賲亘乇".split("_"),weekdays:"丕賱兀丨丿_丕賱廿孬賳賷賳_丕賱孬賱丕孬丕亍_丕賱兀乇亘毓丕亍_丕賱禺賲賷爻_丕賱噩賲毓丞_丕賱爻亘鬲".split("_"),weekdaysShort:"兀丨丿_廿孬賳賷賳_孬賱丕孬丕亍_兀乇亘毓丕亍_禺賲賷爻_噩賲毓丞_爻亘鬲".split("_"),weekdaysMin:"丨_賳_孬_乇_禺_噩_爻".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[丕賱賷賵賲 毓賱賶 丕賱爻丕毓丞] LT",nextDay:"[睾丿丕 毓賱賶 丕賱爻丕毓丞] LT",nextWeek:"dddd [毓賱賶 丕賱爻丕毓丞] LT",lastDay:"[兀賲爻 毓賱賶 丕賱爻丕毓丞] LT",lastWeek:"dddd [毓賱賶 丕賱爻丕毓丞] LT",sameElse:"L"},relativeTime:{future:"賮賷 %s",past:"賲賳匕 %s",s:"孬賵丕賳",ss:"%d 孬丕賳賷丞",m:"丿賯賷賯丞",mm:"%d 丿賯丕卅賯",h:"爻丕毓丞",hh:"%d 爻丕毓丕鬲",d:"賷賵賲",dd:"%d 兀賷丕賲",M:"卮賴乇",MM:"%d 兀卮賴乇",y:"爻賳丞",yy:"%d 爻賳賵丕鬲"},week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var r={1:"-inci",5:"-inci",8:"-inci",70:"-inci",80:"-inci",2:"-nci",7:"-nci",20:"-nci",50:"-nci",3:"-眉nc眉",4:"-眉nc眉",100:"-眉nc眉",6:"-nc谋",9:"-uncu",10:"-uncu",30:"-uncu",60:"-谋nc谋",90:"-谋nc谋"},t;e.defineLocale("az",{months:"yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr".split("_"),monthsShort:"yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek".split("_"),weekdays:"Bazar_Bazar ert蓹si_脟蓹r艧蓹nb蓹 ax艧am谋_脟蓹r艧蓹nb蓹_C眉m蓹 ax艧am谋_C眉m蓹_艦蓹nb蓹".split("_"),weekdaysShort:"Baz_BzE_脟Ax_脟蓹r_CAx_C眉m_艦蓹n".split("_"),weekdaysMin:"Bz_BE_脟A_脟蓹_CA_C眉_艦蓹".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug眉n saat] LT",nextDay:"[sabah saat] LT",nextWeek:"[g蓹l蓹n h蓹ft蓹] dddd [saat] LT",lastDay:"[d眉n蓹n] LT",lastWeek:"[ke莽蓹n h蓹ft蓹] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s 蓹vv蓹l",s:"bir ne莽蓹 saniy蓹",ss:"%d saniy蓹",m:"bir d蓹qiq蓹",mm:"%d d蓹qiq蓹",h:"bir saat",hh:"%d saat",d:"bir g眉n",dd:"%d g眉n",M:"bir ay",MM:"%d ay",y:"bir il",yy:"%d il"},meridiemParse:/gec蓹|s蓹h蓹r|g眉nd眉z|ax艧am/,isPM:function(e){return/^(g眉nd眉z|ax艧am)$/.test(e)},meridiem:function(e,t,n){if(e<4)return"gec蓹";else if(e<12)return"s蓹h蓹r";else if(e<17)return"g眉nd眉z";else return"ax艧am"},dayOfMonthOrdinalParse:/\d{1,2}-(谋nc谋|inci|nci|眉nc眉|nc谋|uncu)/,ordinal:function(e){if(e===0)return e+"-谋nc谋";var t=e%10,n=e%100-t,a=e>=100?100:null;return e+(r[t]||r[n]||r[a])},week:{dow:1,doy:7}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+function r(e,t){var n=e.split("_");return t%10===1&&t%100!==11?n[0]:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?n[1]:n[2]}function t(e,t,n){var a={ss:t?"褋械泻褍薪写邪_褋械泻褍薪写褘_褋械泻褍薪写":"褋械泻褍薪写褍_褋械泻褍薪写褘_褋械泻褍薪写",mm:t?"褏胁褨谢褨薪邪_褏胁褨谢褨薪褘_褏胁褨谢褨薪":"褏胁褨谢褨薪褍_褏胁褨谢褨薪褘_褏胁褨谢褨薪",hh:t?"谐邪写蟹褨薪邪_谐邪写蟹褨薪褘_谐邪写蟹褨薪":"谐邪写蟹褨薪褍_谐邪写蟹褨薪褘_谐邪写蟹褨薪",dd:"写蟹械薪褜_写薪褨_写蟹褢薪",MM:"屑械褋褟褑_屑械褋褟褑褘_屑械褋褟褑邪褳",yy:"谐芯写_谐邪写褘_谐邪写芯褳"};if(n==="m")return t?"褏胁褨谢褨薪邪":"褏胁褨谢褨薪褍";else if(n==="h")return t?"谐邪写蟹褨薪邪":"谐邪写蟹褨薪褍";else return e+" "+r(a[n],+e)}var n;e.defineLocale("be",{months:{format:"褋褌褍写蟹械薪褟_谢褞褌邪谐邪_褋邪泻邪胁褨泻邪_泻褉邪褋邪胁褨泻邪_褌褉邪褳薪褟_褔褝褉胁械薪褟_谢褨锌械薪褟_卸薪褨褳薪褟_胁械褉邪褋薪褟_泻邪褋褌褉褘褔薪褨泻邪_谢褨褋褌邪锌邪写邪_褋薪械卸薪褟".split("_"),standalone:"褋褌褍写蟹械薪褜_谢褞褌褘_褋邪泻邪胁褨泻_泻褉邪褋邪胁褨泻_褌褉邪胁械薪褜_褔褝褉胁械薪褜_谢褨锌械薪褜_卸薪褨胁械薪褜_胁械褉邪褋械薪褜_泻邪褋褌褉褘褔薪褨泻_谢褨褋褌邪锌邪写_褋薪械卸邪薪褜".split("_")},monthsShort:"褋褌褍写_谢褞褌_褋邪泻_泻褉邪褋_褌褉邪胁_褔褝褉胁_谢褨锌_卸薪褨胁_胁械褉_泻邪褋褌_谢褨褋褌_褋薪械卸".split("_"),weekdays:{format:"薪褟写蟹械谢褞_锌邪薪褟写蟹械谢邪泻_邪褳褌芯褉邪泻_褋械褉邪写褍_褔邪褑胁械褉_锌褟褌薪褨褑褍_褋褍斜芯褌褍".split("_"),standalone:"薪褟写蟹械谢褟_锌邪薪褟写蟹械谢邪泻_邪褳褌芯褉邪泻_褋械褉邪写邪_褔邪褑胁械褉_锌褟褌薪褨褑邪_褋褍斜芯褌邪".split("_"),isFormat:/\[ ?[校褍褳] ?(?:屑褨薪褍谢褍褞|薪邪褋褌褍锌薪褍褞)? ?\] ?dddd/},weekdaysShort:"薪写_锌薪_邪褌_褋褉_褔褑_锌褌_褋斜".split("_"),weekdaysMin:"薪写_锌薪_邪褌_褋褉_褔褑_锌褌_褋斜".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY 谐.",LLL:"D MMMM YYYY 谐., HH:mm",LLLL:"dddd, D MMMM YYYY 谐., HH:mm"},calendar:{sameDay:"[小褢薪薪褟 褳] LT",nextDay:"[袟邪褳褌褉邪 褳] LT",lastDay:"[校褔芯褉邪 褳] LT",nextWeek:function(){return"[校] dddd [褳] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[校 屑褨薪褍谢褍褞] dddd [褳] LT";case 1:case 2:case 4:return"[校 屑褨薪褍谢褘] dddd [褳] LT"}},sameElse:"L"},relativeTime:{future:"锌褉邪蟹 %s",past:"%s 褌邪屑褍",s:"薪械泻邪谢褜泻褨 褋械泻褍薪写",m:t,mm:t,h:t,hh:t,d:"写蟹械薪褜",dd:t,M:"屑械褋褟褑",MM:t,y:"谐芯写",yy:t},meridiemParse:/薪芯褔褘|褉邪薪褨褑褘|写薪褟|胁械褔邪褉邪/,isPM:function(e){return/^(写薪褟|胁械褔邪褉邪)$/.test(e)},meridiem:function(e,t,n){if(e<4)return"薪芯褔褘";else if(e<12)return"褉邪薪褨褑褘";else if(e<17)return"写薪褟";else return"胁械褔邪褉邪"},dayOfMonthOrdinalParse:/\d{1,2}-(褨|褘|谐邪)/,ordinal:function(e,t){switch(t){case"M":case"d":case"DDD":case"w":case"W":return(e%10===2||e%10===3)&&e%100!==12&&e%100!==13?e+"-褨":e+"-褘";case"D":return e+"-谐邪";default:return e}},week:{dow:1,doy:7}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("bg",{months:"褟薪褍邪褉懈_褎械胁褉褍邪褉懈_屑邪褉褌_邪锌褉懈谢_屑邪泄_褞薪懈_褞谢懈_邪胁谐褍褋褌_褋械锌褌械屑胁褉懈_芯泻褌芯屑胁褉懈_薪芯械屑胁褉懈_写械泻械屑胁褉懈".split("_"),monthsShort:"褟薪褍_褎械胁_屑邪褉_邪锌褉_屑邪泄_褞薪懈_褞谢懈_邪胁谐_褋械锌_芯泻褌_薪芯械_写械泻".split("_"),weekdays:"薪械写械谢褟_锌芯薪械写械谢薪懈泻_胁褌芯褉薪懈泻_褋褉褟写邪_褔械褌胁褗褉褌褗泻_锌械褌褗泻_褋褗斜芯褌邪".split("_"),weekdaysShort:"薪械写_锌芯薪_胁褌芯_褋褉褟_褔械褌_锌械褌_褋褗斜".split("_"),weekdaysMin:"薪写_锌薪_胁褌_褋褉_褔褌_锌褌_褋斜".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[袛薪械褋 胁] LT",nextDay:"[校褌褉械 胁] LT",nextWeek:"dddd [胁] LT",lastDay:"[袙褔械褉邪 胁] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[袦懈薪邪谢邪褌邪] dddd [胁] LT";case 1:case 2:case 4:case 5:return"[袦懈薪邪谢懈褟] dddd [胁] LT"}},sameElse:"L"},relativeTime:{future:"褋谢械写 %s",past:"锌褉械写懈 %s",s:"薪褟泻芯谢泻芯 褋械泻褍薪写懈",ss:"%d 褋械泻褍薪写懈",m:"屑懈薪褍褌邪",mm:"%d 屑懈薪褍褌懈",h:"褔邪褋",hh:"%d 褔邪褋邪",d:"写械薪",dd:"%d 写械薪邪",w:"褋械写屑懈褑邪",ww:"%d 褋械写屑懈褑懈",M:"屑械褋械褑",MM:"%d 屑械褋械褑邪",y:"谐芯写懈薪邪",yy:"%d 谐芯写懈薪懈"},dayOfMonthOrdinalParse:/\d{1,2}-(械胁|械薪|褌懈|胁懈|褉懈|屑懈)/,ordinal:function(e){var t=e%10,n=e%100;if(e===0)return e+"-械胁";else if(n===0)return e+"-械薪";else if(n>10&&n<20)return e+"-褌懈";else if(t===1)return e+"-胁懈";else if(t===2)return e+"-褉懈";else if(t===7||t===8)return e+"-屑懈";else return e+"-褌懈"},week:{dow:1,doy:7}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("bm",{months:"Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_M蓻kalo_Zuw蓻nkalo_Zuluyekalo_Utikalo_S蓻tanburukalo_蓴kut蓴burukalo_Nowanburukalo_Desanburukalo".split("_"),monthsShort:"Zan_Few_Mar_Awi_M蓻_Zuw_Zul_Uti_S蓻t_蓴ku_Now_Des".split("_"),weekdays:"Kari_Nt蓻n蓻n_Tarata_Araba_Alamisa_Juma_Sibiri".split("_"),weekdaysShort:"Kar_Nt蓻_Tar_Ara_Ala_Jum_Sib".split("_"),weekdaysMin:"Ka_Nt_Ta_Ar_Al_Ju_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"MMMM [tile] D [san] YYYY",LLL:"MMMM [tile] D [san] YYYY [l蓻r蓻] HH:mm",LLLL:"dddd MMMM [tile] D [san] YYYY [l蓻r蓻] HH:mm"},calendar:{sameDay:"[Bi l蓻r蓻] LT",nextDay:"[Sini l蓻r蓻] LT",nextWeek:"dddd [don l蓻r蓻] LT",lastDay:"[Kunu l蓻r蓻] LT",lastWeek:"dddd [t蓻m蓻nen l蓻r蓻] LT",sameElse:"L"},relativeTime:{future:"%s k蓴n蓴",past:"a b蓻 %s b蓴",s:"sanga dama dama",ss:"sekondi %d",m:"miniti kelen",mm:"miniti %d",h:"l蓻r蓻 kelen",hh:"l蓻r蓻 %d",d:"tile kelen",dd:"tile %d",M:"kalo kelen",MM:"kalo %d",y:"san kelen",yy:"san %d"},week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t={1:"唰�",2:"唰�",3:"唰�",4:"唰�",5:"唰�",6:"唰�",7:"唰�",8:"唰�",9:"唰�",0:"唰�"},n={"唰�":"1","唰�":"2","唰�":"3","唰�":"4","唰�":"5","唰�":"6","唰�":"7","唰�":"8","唰�":"9","唰�":"0"},a;e.defineLocale("bn",{months:"唳溹唳ㄠ唰熰唳班_唳唳唳班唰熰唳班_唳唳班唳歘唳忇Κ唰嵿Π唳苦Σ_唳_唳溹唳╛唳溹唳侧唳嘷唳嗋唳膏唳焈唳膏唳唳熰唳唳Π_唳呧唰嵿唰嬥Μ唳癬唳ㄠΝ唰囙Ξ唰嵿Μ唳癬唳∴唳膏唳唳Π".split("_"),monthsShort:"唳溹唳ㄠ_唳唳唳班_唳唳班唳歘唳忇Κ唰嵿Π唳苦Σ_唳_唳溹唳╛唳溹唳侧唳嘷唳嗋唳膏唳焈唳膏唳唳焈唳呧唰嵿唰媉唳ㄠΝ唰嘷唳∴唳膏".split("_"),weekdays:"唳班Μ唳苦Μ唳距Π_唳膏唳Μ唳距Π_唳唰嵿唳侧Μ唳距Π_唳唳оΜ唳距Π_唳唳灌Ω唰嵿Κ唳む唳唳癬唳多唳曕唳班Μ唳距Π_唳多Θ唳苦Μ唳距Π".split("_"),weekdaysShort:"唳班Μ唳縚唳膏唳甠唳唰嵿唳瞋唳唳唳唳灌Ω唰嵿Κ唳む_唳多唳曕唳癬唳多Θ唳�".split("_"),weekdaysMin:"唳班Μ唳縚唳膏唳甠唳唰嵿唳瞋唳唳唳唳筥唳多唳曕唳癬唳多Θ唳�".split("_"),longDateFormat:{LT:"A h:mm 唳膏Ξ唰�",LTS:"A h:mm:ss 唳膏Ξ唰�",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm 唳膏Ξ唰�",LLLL:"dddd, D MMMM YYYY, A h:mm 唳膏Ξ唰�"},calendar:{sameDay:"[唳嗋] LT",nextDay:"[唳嗋唳距Ξ唰�唳曕唳瞉 LT",nextWeek:"dddd, LT",lastDay:"[唳椸Δ唳曕唳瞉 LT",lastWeek:"[唳椸Δ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s 唳Π唰�",past:"%s 唳嗋唰�",s:"唳曕唰囙 唳膏唳曕唳ㄠ唳�",ss:"%d 唳膏唳曕唳ㄠ唳�",m:"唳忇 唳唳ㄠ唳�",mm:"%d 唳唳ㄠ唳�",h:"唳忇 唳樴Θ唰嵿唳�",hh:"%d 唳樴Θ唰嵿唳�",d:"唳忇 唳︵唳�",dd:"%d 唳︵唳�",M:"唳忇 唳唳�",MM:"%d 唳唳�",y:"唳忇 唳唳�",yy:"%d 唳唳�"},preparse:function(e){return e.replace(/[唰оЖ唰┼И唰К唰М唰Е]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/唳班唳唳膏唳距Σ|唳︵唳唳皘唳唳曕唳瞸唳班唳�/,meridiemHour:function(e,t){if(e===12)e=0;if(t==="唳班唳�"&&e>=4||t==="唳︵唳唳�"&&e<5||t==="唳唳曕唳�")return e+12;else return e},meridiem:function(e,t,n){if(e<4)return"唳班唳�";else if(e<10)return"唳膏唳距Σ";else if(e<17)return"唳︵唳唳�";else if(e<20)return"唳唳曕唳�";else return"唳班唳�"},week:{dow:0,doy:6}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t={1:"唰�",2:"唰�",3:"唰�",4:"唰�",5:"唰�",6:"唰�",7:"唰�",8:"唰�",9:"唰�",0:"唰�"},n={"唰�":"1","唰�":"2","唰�":"3","唰�":"4","唰�":"5","唰�":"6","唰�":"7","唰�":"8","唰�":"9","唰�":"0"},a;e.defineLocale("bn-bd",{months:"唳溹唳ㄠ唰熰唳班_唳唳唳班唰熰唳班_唳唳班唳歘唳忇Κ唰嵿Π唳苦Σ_唳_唳溹唳╛唳溹唳侧唳嘷唳嗋唳膏唳焈唳膏唳唳熰唳唳Π_唳呧唰嵿唰嬥Μ唳癬唳ㄠΝ唰囙Ξ唰嵿Μ唳癬唳∴唳膏唳唳Π".split("_"),monthsShort:"唳溹唳ㄠ_唳唳唳班_唳唳班唳歘唳忇Κ唰嵿Π唳苦Σ_唳_唳溹唳╛唳溹唳侧唳嘷唳嗋唳膏唳焈唳膏唳唳焈唳呧唰嵿唰媉唳ㄠΝ唰嘷唳∴唳膏".split("_"),weekdays:"唳班Μ唳苦Μ唳距Π_唳膏唳Μ唳距Π_唳唰嵿唳侧Μ唳距Π_唳唳оΜ唳距Π_唳唳灌Ω唰嵿Κ唳む唳唳癬唳多唳曕唳班Μ唳距Π_唳多Θ唳苦Μ唳距Π".split("_"),weekdaysShort:"唳班Μ唳縚唳膏唳甠唳唰嵿唳瞋唳唳唳唳灌Ω唰嵿Κ唳む_唳多唳曕唳癬唳多Θ唳�".split("_"),weekdaysMin:"唳班Μ唳縚唳膏唳甠唳唰嵿唳瞋唳唳唳唳筥唳多唳曕唳癬唳多Θ唳�".split("_"),longDateFormat:{LT:"A h:mm 唳膏Ξ唰�",LTS:"A h:mm:ss 唳膏Ξ唰�",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm 唳膏Ξ唰�",LLLL:"dddd, D MMMM YYYY, A h:mm 唳膏Ξ唰�"},calendar:{sameDay:"[唳嗋] LT",nextDay:"[唳嗋唳距Ξ唰�唳曕唳瞉 LT",nextWeek:"dddd, LT",lastDay:"[唳椸Δ唳曕唳瞉 LT",lastWeek:"[唳椸Δ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s 唳Π唰�",past:"%s 唳嗋唰�",s:"唳曕唰囙 唳膏唳曕唳ㄠ唳�",ss:"%d 唳膏唳曕唳ㄠ唳�",m:"唳忇 唳唳ㄠ唳�",mm:"%d 唳唳ㄠ唳�",h:"唳忇 唳樴Θ唰嵿唳�",hh:"%d 唳樴Θ唰嵿唳�",d:"唳忇 唳︵唳�",dd:"%d 唳︵唳�",M:"唳忇 唳唳�",MM:"%d 唳唳�",y:"唳忇 唳唳�",yy:"%d 唳唳�"},preparse:function(e){return e.replace(/[唰оЖ唰┼И唰К唰М唰Е]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/唳班唳唳唳皘唳膏唳距Σ|唳︵唳唳皘唳唳曕唳瞸唳膏Θ唰嵿Η唰嵿Ο唳緗唳班唳�/,meridiemHour:function(e,t){if(e===12)e=0;if(t==="唳班唳�")return e<4?e:e+12;else if(t==="唳唳�")return e;else if(t==="唳膏唳距Σ")return e;else if(t==="唳︵唳唳�")return e>=3?e:e+12;else if(t==="唳唳曕唳�")return e+12;else if(t==="唳膏Θ唰嵿Η唰嵿Ο唳�")return e+12},meridiem:function(e,t,n){if(e<4)return"唳班唳�";else if(e<6)return"唳唳�";else if(e<12)return"唳膏唳距Σ";else if(e<15)return"唳︵唳唳�";else if(e<18)return"唳唳曕唳�";else if(e<20)return"唳膏Θ唰嵿Η唰嵿Ο唳�";else return"唳班唳�"},week:{dow:0,doy:6}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t={1:"嗉�",2:"嗉�",3:"嗉�",4:"嗉�",5:"嗉�",6:"嗉�",7:"嗉�",8:"嗉�",9:"嗉�",0:"嗉�"},n={"嗉�":"1","嗉�":"2","嗉�":"3","嗉�":"4","嗉�":"5","嗉�":"6","嗉�":"7","嗉�":"8","嗉�":"9","嗉�":"0"},a;e.defineLocale("bo",{months:"嘟熰境嗉嬥綎嗉嬥綉嘟勦紜嘟斷郊_嘟熰境嗉嬥綎嗉嬥絺嘟夃讲嘟︵紜嘟擾嘟熰境嗉嬥綎嗉嬥絺嘟︵酱嘟樴紜嘟擾嘟熰境嗉嬥綎嗉嬥綎嘟炧讲嗉嬥綌_嘟熰境嗉嬥綎嗉嬥剑嗑斷紜嘟擾嘟熰境嗉嬥綎嗉嬥綉嗑侧酱嘟傕紜嘟擾嘟熰境嗉嬥綎嗉嬥綎嘟戉酱嘟撪紜嘟擾嘟熰境嗉嬥綎嗉嬥綎嘟⑧緬嗑编綉嗉嬥綌_嘟熰境嗉嬥綎嗉嬥綉嘟傕酱嗉嬥綌_嘟熰境嗉嬥綎嗉嬥綎嘟呧酱嗉嬥綌_嘟熰境嗉嬥綎嗉嬥綎嘟呧酱嗉嬥絺嘟呧讲嘟傕紜嘟擾嘟熰境嗉嬥綎嗉嬥綎嘟呧酱嗉嬥絺嘟夃讲嘟︵紜嘟�".split("_"),monthsShort:"嘟熰境嗉�1_嘟熰境嗉�2_嘟熰境嗉�3_嘟熰境嗉�4_嘟熰境嗉�5_嘟熰境嗉�6_嘟熰境嗉�7_嘟熰境嗉�8_嘟熰境嗉�9_嘟熰境嗉�10_嘟熰境嗉�11_嘟熰境嗉�12".split("_"),monthsShortRegex:/^(嘟熰境嗉媆d{1,2})/,monthsParseExact:true,weekdays:"嘟傕綗嘟犩紜嘟夃讲嗉嬥綐嗉媉嘟傕綗嘟犩紜嘟熰境嗉嬥綎嗉媉嘟傕綗嘟犩紜嘟樴讲嘟傕紜嘟戉綐嘟⑧紜_嘟傕綗嘟犩紜嘟`痉嘟傕紜嘟斷紜_嘟傕綗嘟犩紜嘟曕酱嘟⑧紜嘟栢酱_嘟傕綗嘟犩紜嘟斷紜嘟︵絼嘟︵紜_嘟傕綗嘟犩紜嘟︵兢嘟亨綋嗉嬥綌嗉�".split("_"),weekdaysShort:"嘟夃讲嗉嬥綐嗉媉嘟熰境嗉嬥綎嗉媉嘟樴讲嘟傕紜嘟戉綐嘟⑧紜_嘟`痉嘟傕紜嘟斷紜_嘟曕酱嘟⑧紜嘟栢酱_嘟斷紜嘟︵絼嘟︵紜_嘟︵兢嘟亨綋嗉嬥綌嗉�".split("_"),weekdaysMin:"嘟夃讲_嘟熰境_嘟樴讲嘟俖嘟`痉嘟俖嘟曕酱嘟嘟︵絼嘟嘟︵兢嘟亨綋".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[嘟戉讲嗉嬥舰嘟侧絼] LT",nextDay:"[嘟︵絼嗉嬥綁嘟侧綋] LT",nextWeek:"[嘟栢綉嘟脆綋嗉嬥綍嗑侧絺嗉嬥舰嗑椸胶嘟︵紜嘟榏, LT",lastDay:"[嘟佮紜嘟︵絼] LT",lastWeek:"[嘟栢綉嘟脆綋嗉嬥綍嗑侧絺嗉嬥綐嘟愢綘嗉嬥綐] dddd, LT",sameElse:"L"},relativeTime:{future:"%s 嘟`紜",past:"%s 嘟︵緮嘟撪紜嘟�",s:"嘟`綐嗉嬥溅嘟�",ss:"%d 嘟︵緪嘟⑧紜嘟嗋紞",m:"嘟︵緪嘟⑧紜嘟樴紜嘟傕絽嘟侧絺",mm:"%d 嘟︵緪嘟⑧紜嘟�",h:"嘟嗋酱嗉嬥綒嘟监綉嗉嬥絺嘟呧讲嘟�",hh:"%d 嘟嗋酱嗉嬥綒嘟监綉",d:"嘟夃讲嘟撪紜嘟傕絽嘟侧絺",dd:"%d 嘟夃讲嘟撪紜",M:"嘟熰境嗉嬥綎嗉嬥絺嘟呧讲嘟�",MM:"%d 嘟熰境嗉嬥綎",y:"嘟`郊嗉嬥絺嘟呧讲嘟�",yy:"%d 嘟`郊"},preparse:function(e){return e.replace(/[嗉∴饥嗉`激嗉ム鸡嗉о绩嗉┼紶]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/嘟樴綒嘟撪紜嘟樴郊|嘟炧郊嘟傕溅嗉嬥絸嘟嘟夃讲嘟撪紜嘟傕酱嘟剕嘟戉絺嘟监絼嗉嬥綉嘟倈嘟樴綒嘟撪紜嘟樴郊/,meridiemHour:function(e,t){if(e===12)e=0;if(t==="嘟樴綒嘟撪紜嘟樴郊"&&e>=4||t==="嘟夃讲嘟撪紜嘟傕酱嘟�"&&e<5||t==="嘟戉絺嘟监絼嗉嬥綉嘟�")return e+12;else return e},meridiem:function(e,t,n){if(e<4)return"嘟樴綒嘟撪紜嘟樴郊";else if(e<10)return"嘟炧郊嘟傕溅嗉嬥絸嘟�";else if(e<17)return"嘟夃讲嘟撪紜嘟傕酱嘟�";else if(e<20)return"嘟戉絺嘟监絼嗉嬥綉嘟�";else return"嘟樴綒嘟撪紜嘟樴郊"},week:{dow:0,doy:6}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+function t(e,t,n){var a={mm:"munutenn",MM:"miz",dd:"devezh"};return e+" "+r(a[n],e)}function n(e){switch(a(e)){case 1:case 3:case 4:case 5:case 9:return e+" bloaz";default:return e+" vloaz"}}function a(e){if(e>9)return a(e%10);return e}function r(e,t){if(t===2)return o(e);return e}function o(e){var t={m:"v",b:"v",d:"z"};if(t[e.charAt(0)]===undefined)return e;return t[e.charAt(0)]+e.substring(1)}var i=[/^gen/i,/^c[始\']hwe/i,/^meu/i,/^ebr/i,/^mae/i,/^(mez|eve)/i,/^gou/i,/^eos/i,/^gwe/i,/^her/i,/^du/i,/^ker/i],l=/^(genver|c[始\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu|gen|c[始\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,s=/^(genver|c[始\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu)/i,u=/^(gen|c[始\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,d=[/^sul/i,/^lun/i,/^meurzh/i,/^merc[始\']her/i,/^yaou/i,/^gwener/i,/^sadorn/i],c=[/^Sul/i,/^Lun/i,/^Meu/i,/^Mer/i,/^Yao/i,/^Gwe/i,/^Sad/i],f=[/^Su/i,/^Lu/i,/^Me([^r]|$)/i,/^Mer/i,/^Ya/i,/^Gw/i,/^Sa/i],p;e.defineLocale("br",{months:"Genver_C始hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_C始hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Merc始her_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),weekdaysParse:f,fullWeekdaysParse:d,shortWeekdaysParse:c,minWeekdaysParse:f,monthsRegex:l,monthsShortRegex:l,monthsStrictRegex:s,monthsShortStrictRegex:u,monthsParse:i,longMonthsParse:i,shortMonthsParse:i,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY HH:mm",LLLL:"dddd, D [a viz] MMMM YYYY HH:mm"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warc始hoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Dec始h da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s 始zo",s:"un nebeud segondenno霉",ss:"%d eilenn",m:"ur vunutenn",mm:t,h:"un eur",hh:"%d eur",d:"un devezh",dd:t,M:"ur miz",MM:t,y:"ur bloaz",yy:n},dayOfMonthOrdinalParse:/\d{1,2}(a帽|vet)/,ordinal:function(e){var t=e===1?"a帽":"vet";return e+t},week:{dow:1,doy:4},meridiemParse:/a.m.|g.m./,isPM:function(e){return e==="g.m."},meridiem:function(e,t,n){return e<12?"a.m.":"g.m."}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+function t(e,t,n){var a=e+" ";switch(n){case"ss":if(e===1)a+="sekunda";else if(e===2||e===3||e===4)a+="sekunde";else a+="sekundi";return a;case"m":return t?"jedna minuta":"jedne minute";case"mm":if(e===1)a+="minuta";else if(e===2||e===3||e===4)a+="minute";else a+="minuta";return a;case"h":return t?"jedan sat":"jednog sata";case"hh":if(e===1)a+="sat";else if(e===2||e===3||e===4)a+="sata";else a+="sati";return a;case"dd":if(e===1)a+="dan";else a+="dana";return a;case"MM":if(e===1)a+="mjesec";else if(e===2||e===3||e===4)a+="mjeseca";else a+="mjeseci";return a;case"yy":if(e===1)a+="godina";else if(e===2||e===3||e===4)a+="godine";else a+="godina";return a}}var n;e.defineLocale("bs",{months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),monthsParseExact:true,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_膷etvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._膷et._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_膷e_pe_su".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju膷er u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[pro拧lu] dddd [u] LT";case 6:return"[pro拧le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[pro拧li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:t,m:t,mm:t,h:t,hh:t,d:"dan",dd:t,M:"mjesec",MM:t,y:"godinu",yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("ca",{months:{standalone:"gener_febrer_mar莽_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),format:"de gener_de febrer_de mar莽_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._mar莽_abr._maig_juny_jul._ag._set._oct._nov._des.".split("_"),monthsParseExact:true,weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dt_dc_dj_dv_ds".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a les] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a les] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:function(){return"[avui a "+(this.hours()!==1?"les":"la")+"] LT"},nextDay:function(){return"[dem脿 a "+(this.hours()!==1?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(this.hours()!==1?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(this.hours()!==1?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(this.hours()!==1?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"d'aqu铆 %s",past:"fa %s",s:"uns segons",ss:"%d segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|猫|a)/,ordinal:function(e,t){var n=e===1?"r":e===2?"n":e===3?"r":e===4?"t":"猫";if(t==="w"||t==="W")n="a";return e+n},week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t={format:"leden_煤nor_b艡ezen_duben_kv臎ten_膷erven_膷ervenec_srpen_z谩艡铆_艡铆jen_listopad_prosinec".split("_"),standalone:"ledna_煤nora_b艡ezna_dubna_kv臎tna_膷ervna_膷ervence_srpna_z谩艡铆_艡铆jna_listopadu_prosince".split("_")},n="led_煤no_b艡e_dub_kv臎_膷vn_膷vc_srp_z谩艡_艡铆j_lis_pro".split("_"),a=[/^led/i,/^煤no/i,/^b艡e/i,/^dub/i,/^kv臎/i,/^(膷vn|膷erven$|膷ervna)/i,/^(膷vc|膷ervenec|膷ervence)/i,/^srp/i,/^z谩艡/i,/^艡铆j/i,/^lis/i,/^pro/i],r=/^(leden|煤nor|b艡ezen|duben|kv臎ten|膷ervenec|膷ervence|膷erven|膷ervna|srpen|z谩艡铆|艡铆jen|listopad|prosinec|led|煤no|b艡e|dub|kv臎|膷vn|膷vc|srp|z谩艡|艡铆j|lis|pro)/i,o;function i(e){return e>1&&e<5&&~~(e/10)!==1}function l(e,t,n,a){var r=e+" ";switch(n){case"s":return t||a?"p谩r sekund":"p谩r sekundami";case"ss":if(t||a)return r+(i(e)?"sekundy":"sekund");else return r+"sekundami";case"m":return t?"minuta":a?"minutu":"minutou";case"mm":if(t||a)return r+(i(e)?"minuty":"minut");else return r+"minutami";case"h":return t?"hodina":a?"hodinu":"hodinou";case"hh":if(t||a)return r+(i(e)?"hodiny":"hodin");else return r+"hodinami";case"d":return t||a?"den":"dnem";case"dd":if(t||a)return r+(i(e)?"dny":"dn铆");else return r+"dny";case"M":return t||a?"m臎s铆c":"m臎s铆cem";case"MM":if(t||a)return r+(i(e)?"m臎s铆ce":"m臎s铆c暖");else return r+"m臎s铆ci";case"y":return t||a?"rok":"rokem";case"yy":if(t||a)return r+(i(e)?"roky":"let");else return r+"lety"}}e.defineLocale("cs",{months:t,monthsShort:n,monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(leden|ledna|煤nora|煤nor|b艡ezen|b艡ezna|duben|dubna|kv臎ten|kv臎tna|膷ervenec|膷ervence|膷erven|膷ervna|srpen|srpna|z谩艡铆|艡铆jen|艡铆jna|listopadu|listopad|prosinec|prosince)/i,monthsShortStrictRegex:/^(led|煤no|b艡e|dub|kv臎|膷vn|膷vc|srp|z谩艡|艡铆j|lis|pro)/i,monthsParse:a,longMonthsParse:a,shortMonthsParse:a,weekdays:"ned臎le_pond臎l铆_煤ter媒_st艡eda_膷tvrtek_p谩tek_sobota".split("_"),weekdaysShort:"ne_po_煤t_st_膷t_p谩_so".split("_"),weekdaysMin:"ne_po_煤t_st_膷t_p谩_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm",l:"D. M. YYYY"},calendar:{sameDay:"[dnes v] LT",nextDay:"[z铆tra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v ned臎li v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve st艡edu v] LT";case 4:return"[ve 膷tvrtek v] LT";case 5:return"[v p谩tek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[v膷era v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou ned臎li v] LT";case 1:case 2:return"[minul茅] dddd [v] LT";case 3:return"[minulou st艡edu v] LT";case 4:case 5:return"[minul媒] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"p艡ed %s",s:l,ss:l,m:l,mm:l,h:l,hh:l,d:l,dd:l,M:l,MM:l,y:l,yy:l},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("cv",{months:"泻討褉谢邪褔_薪邪褉討褋_锌褍褕_邪泻邪_屑邪泄_耀訔褉褌屑械_褍褌討_耀褍褉谢邪_邪胁討薪_褞锌邪_褔映泻_褉邪褕褌邪胁".split("_"),monthsShort:"泻討褉_薪邪褉_锌褍褕_邪泻邪_屑邪泄_耀訔褉_褍褌討_耀褍褉_邪胁薪_褞锌邪_褔映泻_褉邪褕".split("_"),weekdays:"胁褘褉褋邪褉薪懈泻褍薪_褌褍薪褌懈泻褍薪_褘褌谢邪褉懈泻褍薪_褞薪泻褍薪_泻訔耀薪械褉薪懈泻褍薪_褝褉薪械泻褍薪_褕討屑邪褌泻褍薪".split("_"),weekdaysShort:"胁褘褉_褌褍薪_褘褌谢_褞薪_泻訔耀_褝褉薪_褕討屑".split("_"),weekdaysMin:"胁褉_褌薪_褘褌_褞薪_泻耀_褝褉_褕屑".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"YYYY [耀褍谢褏懈] MMMM [褍泄討褏訔薪] D[-屑訔褕訔]",LLL:"YYYY [耀褍谢褏懈] MMMM [褍泄討褏訔薪] D[-屑訔褕訔], HH:mm",LLLL:"dddd, YYYY [耀褍谢褏懈] MMMM [褍泄討褏訔薪] D[-屑訔褕訔], HH:mm"},calendar:{sameDay:"[袩邪褟薪] LT [褋械褏械褌褉械]",nextDay:"[蝎褉邪薪] LT [褋械褏械褌褉械]",lastDay:"[訓薪械褉] LT [褋械褏械褌褉械]",nextWeek:"[要懈褌械褋] dddd LT [褋械褏械褌褉械]",lastWeek:"[袠褉褌薪訔] dddd LT [褋械褏械褌褉械]",sameElse:"L"},relativeTime:{future:function(e){var t=/褋械褏械褌$/i.exec(e)?"褉械薪":/耀褍谢$/i.exec(e)?"褌邪薪":"褉邪薪";return e+t},past:"%s 泻邪褟谢谢邪",s:"锌訔褉-懈泻 耀械泻泻褍薪褌",ss:"%d 耀械泻泻褍薪褌",m:"锌訔褉 屑懈薪褍褌",mm:"%d 屑懈薪褍褌",h:"锌訔褉 褋械褏械褌",hh:"%d 褋械褏械褌",d:"锌訔褉 泻褍薪",dd:"%d 泻褍薪",M:"锌訔褉 褍泄討褏",MM:"%d 褍泄討褏",y:"锌訔褉 耀褍谢",yy:"%d 耀褍谢"},dayOfMonthOrdinalParse:/\d{1,2}-屑訔褕/,ordinal:"%d-屑訔褕",week:{dow:1,doy:7}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("cy",{months:"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),monthsShort:"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),weekdays:"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),weekdaysShort:"Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),weekdaysMin:"Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Heddiw am] LT",nextDay:"[Yfory am] LT",nextWeek:"dddd [am] LT",lastDay:"[Ddoe am] LT",lastWeek:"dddd [diwethaf am] LT",sameElse:"L"},relativeTime:{future:"mewn %s",past:"%s yn 么l",s:"ychydig eiliadau",ss:"%d eiliad",m:"munud",mm:"%d munud",h:"awr",hh:"%d awr",d:"diwrnod",dd:"%d diwrnod",M:"mis",MM:"%d mis",y:"blwyddyn",yy:"%d flynedd"},dayOfMonthOrdinalParse:/\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,ordinal:function(e){var t=e,n="",a=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed","eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"];if(t>20)if(t===40||t===50||t===60||t===80||t===100)n="fed";else n="ain";else if(t>0)n=a[t];return e+n},week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"s酶ndag_mandag_tirsdag_onsdag_torsdag_fredag_l酶rdag".split("_"),weekdaysShort:"s酶n_man_tir_ons_tor_fre_l酶r".split("_"),weekdaysMin:"s酶_ma_ti_on_to_fr_l酶".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd [d.] D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"p氓 dddd [kl.] LT",lastDay:"[i g氓r kl.] LT",lastWeek:"[i] dddd[s kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"f氓 sekunder",ss:"%d sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en m氓ned",MM:"%d m氓neder",y:"et 氓r",yy:"%d 氓r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+function t(e,t,n,a){var r={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return t?r[n][0]:r[n][1]}var n;e.defineLocale("de",{months:"Januar_Februar_M盲rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M盲rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:true,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:t,mm:"%d Minuten",h:t,hh:"%d Stunden",d:t,dd:t,w:t,ww:"%d Wochen",M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+function t(e,t,n,a){var r={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return t?r[n][0]:r[n][1]}var n;e.defineLocale("de-at",{months:"J盲nner_Februar_M盲rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"J盲n._Feb._M盲rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:true,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:t,mm:"%d Minuten",h:t,hh:"%d Stunden",d:t,dd:t,w:t,ww:"%d Wochen",M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+function t(e,t,n,a){var r={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return t?r[n][0]:r[n][1]}var n;e.defineLocale("de-ch",{months:"Januar_Februar_M盲rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M盲rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:true,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:t,mm:"%d Minuten",h:t,hh:"%d Stunden",d:t,dd:t,w:t,ww:"%d Wochen",M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t=["迻蕃迋蕺迖蕈迌蕞","迠蕃迍薨迌蕺迖蕈迌蕞","迚蕨迌蕤迼蕺","迖蕲迺薨迌蕞迧蕺","迚蕲","迻瞢迋薨","迻蕺迧蕈迖蕤","迖薤迬蕈迱薨迵蕺","迱蕃迺薨迵蕃迚薨迍蕈迌蕺","迖蕻迒薨迵薤迍蕈迌蕺","迋蕻迗蕃迚薨迍蕈迌蕺","迲蕤迱蕃迚薨迍蕈迌蕺"],n=["迖蕨迡蕤迖薨迣蕈","迉薤迚蕈","迖蕈迋薨迬蕨迌蕈","迍蕺迡蕈","迍蕺迌蕨迱薨迠蕈迣蕤","迉蕺迒蕺迌蕺","迉蕻迋蕤迉蕤迌蕺"],a;e.defineLocale("dv",{months:t,monthsShort:t,weekdays:n,weekdaysShort:n,weekdaysMin:"迖蕨迡蕤_迉薤迚蕈_迖蕈迋薨_迍蕺迡蕈_迍蕺迌蕨_迉蕺迒蕺_迉蕻迋蕤".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/M/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/迚迒|迚迠/,isPM:function(e){return"迚迠"===e},meridiem:function(e,t,n){if(e<12)return"迚迒";else return"迚迠"},calendar:{sameDay:"[迚蕤迖蕈迡蕺] LT",nextDay:"[迚蕨迡蕈迚蕨] LT",nextWeek:"dddd LT",lastDay:"[迖蕤迖薨迶蕃] LT",lastWeek:"[迠蕨迖蕤迣蕺迗蕤] dddd LT",sameElse:"L"},relativeTime:{future:"迣蕃迌蕲迬蕈迖蕤 %s",past:"迒蕺迌蕤迋薨 %s",s:"迱蕤迒蕺迋薨迣蕺迒蕻迏蕃迖薨",ss:"d% 迱蕤迒蕺迋薨迣蕺",m:"迚蕤迋蕤迵蕃迖薨",mm:"迚蕤迋蕤迵蕺 %d",h:"迬蕈迲蕤迖蕤迌蕃迖薨",hh:"迬蕈迲蕤迖蕤迌蕺 %d",d:"迡蕺迗蕈迉蕃迖薨",dd:"迡蕺迗蕈迱薨 %d",M:"迚蕈迉蕃迖薨",MM:"迚蕈迱薨 %d",y:"迖蕈迉蕈迌蕃迖薨",yy:"迖蕈迉蕈迌蕺 %d"},preparse:function(e){return e.replace(/貙/g,",")},postformat:function(e){return e.replace(/,/g,"貙")},week:{dow:7,doy:12}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+function r(e){return typeof Function!=="undefined"&&e instanceof Function||Object.prototype.toString.call(e)==="[object Function]"}var t;e.defineLocale("el",{monthsNominativeEl:"螜伪谓慰蠀维蟻喂慰蟼_桅蔚尾蟻慰蠀维蟻喂慰蟼_螠维蟻蟿喂慰蟼_螒蟺蟻委位喂慰蟼_螠维喂慰蟼_螜慰蠉谓喂慰蟼_螜慰蠉位喂慰蟼_螒蠉纬慰蠀蟽蟿慰蟼_危蔚蟺蟿苇渭尾蟻喂慰蟼_螣魏蟿蠋尾蟻喂慰蟼_螡慰苇渭尾蟻喂慰蟼_螖蔚魏苇渭尾蟻喂慰蟼".split("_"),monthsGenitiveEl:"螜伪谓慰蠀伪蟻委慰蠀_桅蔚尾蟻慰蠀伪蟻委慰蠀_螠伪蟻蟿委慰蠀_螒蟺蟻喂位委慰蠀_螠伪螑慰蠀_螜慰蠀谓委慰蠀_螜慰蠀位委慰蠀_螒蠀纬慰蠉蟽蟿慰蠀_危蔚蟺蟿蔚渭尾蟻委慰蠀_螣魏蟿蠅尾蟻委慰蠀_螡慰蔚渭尾蟻委慰蠀_螖蔚魏蔚渭尾蟻委慰蠀".split("_"),months:function(e,t){if(!e)return this._monthsNominativeEl;else if(typeof t==="string"&&/D/.test(t.substring(0,t.indexOf("MMMM"))))return this._monthsGenitiveEl[e.month()];else return this._monthsNominativeEl[e.month()]},monthsShort:"螜伪谓_桅蔚尾_螠伪蟻_螒蟺蟻_螠伪蠆_螜慰蠀谓_螜慰蠀位_螒蠀纬_危蔚蟺_螣魏蟿_螡慰蔚_螖蔚魏".split("_"),weekdays:"螝蠀蟻喂伪魏萎_螖蔚蠀蟿苇蟻伪_韦蟻委蟿畏_韦蔚蟿维蟻蟿畏_螤苇渭蟺蟿畏_螤伪蟻伪蟽魏蔚蠀萎_危维尾尾伪蟿慰".split("_"),weekdaysShort:"螝蠀蟻_螖蔚蠀_韦蟻喂_韦蔚蟿_螤蔚渭_螤伪蟻_危伪尾".split("_"),weekdaysMin:"螝蠀_螖蔚_韦蟻_韦蔚_螤蔚_螤伪_危伪".split("_"),meridiem:function(e,t,n){if(e>11)return n?"渭渭":"螠螠";else return n?"蟺渭":"螤螠"},isPM:function(e){return(e+"").toLowerCase()[0]==="渭"},meridiemParse:/[螤螠]\.?螠?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendarEl:{sameDay:"[危萎渭蔚蟻伪 {}] LT",nextDay:"[螒蠉蟻喂慰 {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[围胃蔚蟼 {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[蟿慰 蟺蟻慰畏纬慰蠉渭蔚谓慰] dddd [{}] LT";default:return"[蟿畏谓 蟺蟻慰畏纬慰蠉渭蔚谓畏] dddd [{}] LT"}},sameElse:"L"},calendar:function(e,t){var n=this._calendarEl[e],a=t&&t.hours();if(r(n))n=n.apply(t);return n.replace("{}",a%12===1?"蟽蟿畏":"蟽蟿喂蟼")},relativeTime:{future:"蟽蔚 %s",past:"%s 蟺蟻喂谓",s:"位委纬伪 未蔚蠀蟿蔚蟻蠈位蔚蟺蟿伪",ss:"%d 未蔚蠀蟿蔚蟻蠈位蔚蟺蟿伪",m:"苇谓伪 位蔚蟺蟿蠈",mm:"%d 位蔚蟺蟿维",h:"渭委伪 蠋蟻伪",hh:"%d 蠋蟻蔚蟼",d:"渭委伪 渭苇蟻伪",dd:"%d 渭苇蟻蔚蟼",M:"苇谓伪蟼 渭萎谓伪蟼",MM:"%d 渭萎谓蔚蟼",y:"苇谓伪蟼 蠂蟻蠈谓慰蟼",yy:"%d 蠂蟻蠈谓喂伪"},dayOfMonthOrdinalParse:/\d{1,2}畏/,ordinal:"%d畏",week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10,n=~~(e%100/10)===1?"th":t===1?"st":t===2?"nd":t===3?"rd":"th";return e+n},week:{dow:0,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10,n=~~(e%100/10)===1?"th":t===1?"st":t===2?"nd":t===3?"rd":"th";return e+n}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10,n=~~(e%100/10)===1?"th":t===1?"st":t===2?"nd":t===3?"rd":"th";return e+n},week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("en-ie",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10,n=~~(e%100/10)===1?"th":t===1?"st":t===2?"nd":t===3?"rd":"th";return e+n},week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("en-il",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10,n=~~(e%100/10)===1?"th":t===1?"st":t===2?"nd":t===3?"rd":"th";return e+n}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("en-in",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10,n=~~(e%100/10)===1?"th":t===1?"st":t===2?"nd":t===3?"rd":"th";return e+n},week:{dow:0,doy:6}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("en-nz",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10,n=~~(e%100/10)===1?"th":t===1?"st":t===2?"nd":t===3?"rd":"th";return e+n},week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("en-sg",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10,n=~~(e%100/10)===1?"th":t===1?"st":t===2?"nd":t===3?"rd":"th";return e+n},week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_a怒gusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mart_apr_maj_jun_jul_a怒g_sept_okt_nov_dec".split("_"),weekdays:"diman膲o_lundo_mardo_merkredo_牡a怒do_vendredo_sabato".split("_"),weekdaysShort:"dim_lun_mard_merk_牡a怒_ven_sab".split("_"),weekdaysMin:"di_lu_ma_me_牡a_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"[la] D[-an de] MMMM, YYYY",LLL:"[la] D[-an de] MMMM, YYYY HH:mm",LLLL:"dddd[n], [la] D[-an de] MMMM, YYYY HH:mm",llll:"ddd, [la] D[-an de] MMM, YYYY HH:mm"},meridiemParse:/[ap]\.t\.m/i,isPM:function(e){return e.charAt(0).toLowerCase()==="p"},meridiem:function(e,t,n){if(e>11)return n?"p.t.m.":"P.T.M.";else return n?"a.t.m.":"A.T.M."},calendar:{sameDay:"[Hodia怒 je] LT",nextDay:"[Morga怒 je] LT",nextWeek:"dddd[n je] LT",lastDay:"[Hiera怒 je] LT",lastWeek:"[pasintan] dddd[n je] LT",sameElse:"L"},relativeTime:{future:"post %s",past:"anta怒 %s",s:"kelkaj sekundoj",ss:"%d sekundoj",m:"unu minuto",mm:"%d minutoj",h:"unu horo",hh:"%d horoj",d:"unu tago",dd:"%d tagoj",M:"unu monato",MM:"%d monatoj",y:"unu jaro",yy:"%d jaroj"},dayOfMonthOrdinalParse:/\d{1,2}a/,ordinal:"%da",week:{dow:1,doy:7}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var n="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),a="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),t=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],r=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,o;e.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,t){if(!e)return n;else if(/-MMM-/.test(t))return a[e.month()];else return n[e.month()]},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:t,longMonthsParse:t,shortMonthsParse:t,weekdays:"domingo_lunes_martes_mi茅rcoles_jueves_viernes_s谩bado".split("_"),weekdaysShort:"dom._lun._mar._mi茅._jue._vie._s谩b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s谩".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(this.hours()!==1?"s":"")+"] LT"},nextDay:function(){return"[ma帽ana a la"+(this.hours()!==1?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(this.hours()!==1?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(this.hours()!==1?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(this.hours()!==1?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d铆a",dd:"%d d铆as",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un a帽o",yy:"%d a帽os"},dayOfMonthOrdinalParse:/\d{1,2}潞/,ordinal:"%d潞",week:{dow:1,doy:4},invalidDate:"Fecha inv谩lida"})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var n="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),a="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),t=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],r=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,o;e.defineLocale("es-do",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,t){if(!e)return n;else if(/-MMM-/.test(t))return a[e.month()];else return n[e.month()]},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:t,longMonthsParse:t,shortMonthsParse:t,weekdays:"domingo_lunes_martes_mi茅rcoles_jueves_viernes_s谩bado".split("_"),weekdaysShort:"dom._lun._mar._mi茅._jue._vie._s谩b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s谩".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(this.hours()!==1?"s":"")+"] LT"},nextDay:function(){return"[ma帽ana a la"+(this.hours()!==1?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(this.hours()!==1?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(this.hours()!==1?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(this.hours()!==1?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d铆a",dd:"%d d铆as",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un a帽o",yy:"%d a帽os"},dayOfMonthOrdinalParse:/\d{1,2}潞/,ordinal:"%d潞",week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var n="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),a="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),t=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],r=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,o;e.defineLocale("es-mx",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,t){if(!e)return n;else if(/-MMM-/.test(t))return a[e.month()];else return n[e.month()]},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:t,longMonthsParse:t,shortMonthsParse:t,weekdays:"domingo_lunes_martes_mi茅rcoles_jueves_viernes_s谩bado".split("_"),weekdaysShort:"dom._lun._mar._mi茅._jue._vie._s谩b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s谩".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(this.hours()!==1?"s":"")+"] LT"},nextDay:function(){return"[ma帽ana a la"+(this.hours()!==1?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(this.hours()!==1?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(this.hours()!==1?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(this.hours()!==1?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d铆a",dd:"%d d铆as",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un a帽o",yy:"%d a帽os"},dayOfMonthOrdinalParse:/\d{1,2}潞/,ordinal:"%d潞",week:{dow:0,doy:4},invalidDate:"Fecha inv谩lida"})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var n="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),a="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),t=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],r=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,o;e.defineLocale("es-us",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,t){if(!e)return n;else if(/-MMM-/.test(t))return a[e.month()];else return n[e.month()]},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:t,longMonthsParse:t,shortMonthsParse:t,weekdays:"domingo_lunes_martes_mi茅rcoles_jueves_viernes_s谩bado".split("_"),weekdaysShort:"dom._lun._mar._mi茅._jue._vie._s谩b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s谩".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"MM/DD/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(this.hours()!==1?"s":"")+"] LT"},nextDay:function(){return"[ma帽ana a la"+(this.hours()!==1?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(this.hours()!==1?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(this.hours()!==1?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(this.hours()!==1?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d铆a",dd:"%d d铆as",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un a帽o",yy:"%d a帽os"},dayOfMonthOrdinalParse:/\d{1,2}潞/,ordinal:"%d潞",week:{dow:0,doy:6}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+function t(e,t,n,a){var r={s:["m玫ne sekundi","m玫ni sekund","paar sekundit"],ss:[e+"sekundi",e+"sekundit"],m:["眉he minuti","眉ks minut"],mm:[e+" minuti",e+" minutit"],h:["眉he tunni","tund aega","眉ks tund"],hh:[e+" tunni",e+" tundi"],d:["眉he p盲eva","眉ks p盲ev"],M:["kuu aja","kuu aega","眉ks kuu"],MM:[e+" kuu",e+" kuud"],y:["眉he aasta","aasta","眉ks aasta"],yy:[e+" aasta",e+" aastat"]};if(t)return r[n][2]?r[n][2]:r[n][1];return a?r[n][0]:r[n][1]}var n;e.defineLocale("et",{months:"jaanuar_veebruar_m盲rts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_m盲rts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),weekdays:"p眉hap盲ev_esmasp盲ev_teisip盲ev_kolmap盲ev_neljap盲ev_reede_laup盲ev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[T盲na,] LT",nextDay:"[Homme,] LT",nextWeek:"[J盲rgmine] dddd LT",lastDay:"[Eile,] LT",lastWeek:"[Eelmine] dddd LT",sameElse:"L"},relativeTime:{future:"%s p盲rast",past:"%s tagasi",s:t,ss:t,m:t,mm:t,h:t,hh:t,d:t,dd:"%d p盲eva",M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),monthsParseExact:true,weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] HH:mm",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] HH:mm",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] HH:mm",llll:"ddd, YYYY[ko] MMM D[a] HH:mm"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",ss:"%d segundo",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t={1:"郾",2:"鄄",3:"鄢",4:"鄞",5:"鄣",6:"鄱",7:"鄯",8:"鄹",9:"酃",0:"郯"},n={"郾":"1","鄄":"2","鄢":"3","鄞":"4","鄣":"5","鄱":"6","鄯":"7","鄹":"8","酃":"9","郯":"0"},a;e.defineLocale("fa",{months:"跇丕賳賵蹖賴_賮賵乇蹖賴_賲丕乇爻_丌賵乇蹖賱_賲賴_跇賵卅賳_跇賵卅蹖賴_丕賵鬲_爻倬鬲丕賲亘乇_丕讴鬲亘乇_賳賵丕賲亘乇_丿爻丕賲亘乇".split("_"),monthsShort:"跇丕賳賵蹖賴_賮賵乇蹖賴_賲丕乇爻_丌賵乇蹖賱_賲賴_跇賵卅賳_跇賵卅蹖賴_丕賵鬲_爻倬鬲丕賲亘乇_丕讴鬲亘乇_賳賵丕賲亘乇_丿爻丕賲亘乇".split("_"),weekdays:"蹖讴鈥屫促嗀ㄙ嘷丿賵卮賳亘賴_爻賴鈥屫促嗀ㄙ嘷趩賴丕乇卮賳亘賴_倬賳噩鈥屫促嗀ㄙ嘷噩賲毓賴_卮賳亘賴".split("_"),weekdaysShort:"蹖讴鈥屫促嗀ㄙ嘷丿賵卮賳亘賴_爻賴鈥屫促嗀ㄙ嘷趩賴丕乇卮賳亘賴_倬賳噩鈥屫促嗀ㄙ嘷噩賲毓賴_卮賳亘賴".split("_"),weekdaysMin:"蹖_丿_爻_趩_倬_噩_卮".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/賯亘賱 丕夭 馗賴乇|亘毓丿 丕夭 馗賴乇/,isPM:function(e){return/亘毓丿 丕夭 馗賴乇/.test(e)},meridiem:function(e,t,n){if(e<12)return"賯亘賱 丕夭 馗賴乇";else return"亘毓丿 丕夭 馗賴乇"},calendar:{sameDay:"[丕賲乇賵夭 爻丕毓鬲] LT",nextDay:"[賮乇丿丕 爻丕毓鬲] LT",nextWeek:"dddd [爻丕毓鬲] LT",lastDay:"[丿蹖乇賵夭 爻丕毓鬲] LT",lastWeek:"dddd [倬蹖卮] [爻丕毓鬲] LT",sameElse:"L"},relativeTime:{future:"丿乇 %s",past:"%s 倬蹖卮",s:"趩賳丿 孬丕賳蹖賴",ss:"%d 孬丕賳蹖賴",m:"蹖讴 丿賯蹖賯賴",mm:"%d 丿賯蹖賯賴",h:"蹖讴 爻丕毓鬲",hh:"%d 爻丕毓鬲",d:"蹖讴 乇賵夭",dd:"%d 乇賵夭",M:"蹖讴 賲丕賴",MM:"%d 賲丕賴",y:"蹖讴 爻丕賱",yy:"%d 爻丕賱"},preparse:function(e){return e.replace(/[郯-酃]/g,function(e){return n[e]}).replace(/貙/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]}).replace(/,/g,"貙")},dayOfMonthOrdinalParse:/\d{1,2}賲/,ordinal:"%d賲",week:{dow:6,doy:12}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var n="nolla yksi kaksi kolme nelj盲 viisi kuusi seitsem盲n kahdeksan yhdeks盲n".split(" "),a=["nolla","yhden","kahden","kolmen","nelj盲n","viiden","kuuden",n[7],n[8],n[9]],t;function r(e,t,n,a){var r="";switch(n){case"s":return a?"muutaman sekunnin":"muutama sekunti";case"ss":r=a?"sekunnin":"sekuntia";break;case"m":return a?"minuutin":"minuutti";case"mm":r=a?"minuutin":"minuuttia";break;case"h":return a?"tunnin":"tunti";case"hh":r=a?"tunnin":"tuntia";break;case"d":return a?"p盲iv盲n":"p盲iv盲";case"dd":r=a?"p盲iv盲n":"p盲iv盲盲";break;case"M":return a?"kuukauden":"kuukausi";case"MM":r=a?"kuukauden":"kuukautta";break;case"y":return a?"vuoden":"vuosi";case"yy":r=a?"vuoden":"vuotta";break}r=o(e,a)+" "+r;return r}function o(e,t){return e<10?t?a[e]:n[e]:e}e.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kes盲kuu_hein盲kuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kes盲_hein盲_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] HH.mm",llll:"ddd, Do MMM YYYY, [klo] HH.mm"},calendar:{sameDay:"[t盲n盲盲n] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s p盲盲st盲",past:"%s sitten",s:r,ss:r,m:r,mm:r,h:r,hh:r,d:r,dd:r,M:r,MM:r,y:r,yy:r},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("fil",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",ss:"%d segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(e){return e},week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("fo",{months:"januar_februar_mars_apr铆l_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_m谩nadagur_t媒sdagur_mikudagur_h贸sdagur_fr铆ggjadagur_leygardagur".split("_"),weekdaysShort:"sun_m谩n_t媒s_mik_h贸s_fr铆_ley".split("_"),weekdaysMin:"su_m谩_t媒_mi_h贸_fr_le".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D. MMMM, YYYY HH:mm"},calendar:{sameDay:"[脥 dag kl.] LT",nextDay:"[脥 morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[脥 gj谩r kl.] LT",lastWeek:"[s铆冒stu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s s铆冒ani",s:"f谩 sekund",ss:"%d sekundir",m:"ein minuttur",mm:"%d minuttir",h:"ein t铆mi",hh:"%d t铆mar",d:"ein dagur",dd:"%d dagar",M:"ein m谩na冒ur",MM:"%d m谩na冒ir",y:"eitt 谩r",yy:"%d 谩r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t=/^(janvier|f茅vrier|mars|avril|mai|juin|juillet|ao没t|septembre|octobre|novembre|d茅cembre)/i,n=/(janv\.?|f茅vr\.?|mars|avr\.?|mai|juin|juil\.?|ao没t|sept\.?|oct\.?|nov\.?|d茅c\.?)/i,a=/(janv\.?|f茅vr\.?|mars|avr\.?|mai|juin|juil\.?|ao没t|sept\.?|oct\.?|nov\.?|d茅c\.?|janvier|f茅vrier|mars|avril|mai|juin|juillet|ao没t|septembre|octobre|novembre|d茅cembre)/i,r=[/^janv/i,/^f茅vr/i,/^mars/i,/^avr/i,/^mai/i,/^juin/i,/^juil/i,/^ao没t/i,/^sept/i,/^oct/i,/^nov/i,/^d茅c/i],o;e.defineLocale("fr",{months:"janvier_f茅vrier_mars_avril_mai_juin_juillet_ao没t_septembre_octobre_novembre_d茅cembre".split("_"),monthsShort:"janv._f茅vr._mars_avr._mai_juin_juil._ao没t_sept._oct._nov._d茅c.".split("_"),monthsRegex:a,monthsShortRegex:a,monthsStrictRegex:t,monthsShortStrictRegex:n,monthsParse:r,longMonthsParse:r,shortMonthsParse:r,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd鈥檋ui 脿] LT",nextDay:"[Demain 脿] LT",nextWeek:"dddd [脿] LT",lastDay:"[Hier 脿] LT",lastWeek:"dddd [dernier 脿] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",w:"une semaine",ww:"%d semaines",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|)/,ordinal:function(e,t){switch(t){case"D":return e+(e===1?"er":"");default:case"M":case"Q":case"DDD":case"d":return e+(e===1?"er":"e");case"w":case"W":return e+(e===1?"re":"e")}},week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("fr-ca",{months:"janvier_f茅vrier_mars_avril_mai_juin_juillet_ao没t_septembre_octobre_novembre_d茅cembre".split("_"),monthsShort:"janv._f茅vr._mars_avr._mai_juin_juil._ao没t_sept._oct._nov._d茅c.".split("_"),monthsParseExact:true,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd鈥檋ui 脿] LT",nextDay:"[Demain 脿] LT",nextWeek:"dddd [脿] LT",lastDay:"[Hier 脿] LT",lastWeek:"dddd [dernier 脿] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(e,t){switch(t){default:case"M":case"Q":case"D":case"DDD":case"d":return e+(e===1?"er":"e");case"w":case"W":return e+(e===1?"re":"e")}}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("fr-ch",{months:"janvier_f茅vrier_mars_avril_mai_juin_juillet_ao没t_septembre_octobre_novembre_d茅cembre".split("_"),monthsShort:"janv._f茅vr._mars_avr._mai_juin_juil._ao没t_sept._oct._nov._d茅c.".split("_"),monthsParseExact:true,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd鈥檋ui 脿] LT",nextDay:"[Demain 脿] LT",nextWeek:"dddd [脿] LT",lastDay:"[Hier 脿] LT",lastWeek:"dddd [dernier 脿] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(e,t){switch(t){default:case"M":case"Q":case"D":case"DDD":case"d":return e+(e===1?"er":"e");case"w":case"W":return e+(e===1?"re":"e")}},week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var n="jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.".split("_"),a="jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),t;e.defineLocale("fy",{months:"jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber".split("_"),monthsShort:function(e,t){if(!e)return n;else if(/-MMM-/.test(t))return a[e.month()];else return n[e.month()]},monthsParseExact:true,weekdays:"snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon".split("_"),weekdaysShort:"si._mo._ti._wo._to._fr._so.".split("_"),weekdaysMin:"Si_Mo_Ti_Wo_To_Fr_So".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[hjoed om] LT",nextDay:"[moarn om] LT",nextWeek:"dddd [om] LT",lastDay:"[juster om] LT",lastWeek:"[么fr没ne] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oer %s",past:"%s lyn",s:"in pear sekonden",ss:"%d sekonden",m:"ien min煤t",mm:"%d minuten",h:"ien oere",hh:"%d oeren",d:"ien dei",dd:"%d dagen",M:"ien moanne",MM:"%d moannen",y:"ien jier",yy:"%d jierren"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(e===1||e===8||e>=20?"ste":"de")},week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t,n,a,r,o,i;e.defineLocale("ga",{months:["Ean谩ir","Feabhra","M谩rta","Aibre谩n","Bealtaine","Meitheamh","I煤il","L煤nasa","Me谩n F贸mhair","Deireadh F贸mhair","Samhain","Nollaig"],monthsShort:["Ean","Feabh","M谩rt","Aib","Beal","Meith","I煤il","L煤n","M.F.","D.F.","Samh","Noll"],monthsParseExact:true,weekdays:["D茅 Domhnaigh","D茅 Luain","D茅 M谩irt","D茅 C茅adaoin","D茅ardaoin","D茅 hAoine","D茅 Sathairn"],weekdaysShort:["Domh","Luan","M谩irt","C茅ad","D茅ar","Aoine","Sath"],weekdaysMin:["Do","Lu","M谩","C茅","D茅","A","Sa"],longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Inniu ag] LT",nextDay:"[Am谩rach ag] LT",nextWeek:"dddd [ag] LT",lastDay:"[Inn茅 ag] LT",lastWeek:"dddd [seo caite] [ag] LT",sameElse:"L"},relativeTime:{future:"i %s",past:"%s 贸 shin",s:"c煤pla soicind",ss:"%d soicind",m:"n贸im茅ad",mm:"%d n贸im茅ad",h:"uair an chloig",hh:"%d uair an chloig",d:"l谩",dd:"%d l谩",M:"m铆",MM:"%d m铆onna",y:"bliain",yy:"%d bliain"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(e){var t=e===1?"d":e%10===2?"na":"mh";return e+t},week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t,n,a,r,o,i;e.defineLocale("gd",{months:["Am Faoilleach","An Gearran","Am M脿rt","An Giblean","An C猫itean","An t-脪gmhios","An t-Iuchar","An L霉nastal","An t-Sultain","An D脿mhair","An t-Samhain","An D霉bhlachd"],monthsShort:["Faoi","Gear","M脿rt","Gibl","C猫it","脪gmh","Iuch","L霉n","Sult","D脿mh","Samh","D霉bh"],monthsParseExact:true,weekdays:["Did貌mhnaich","Diluain","Dim脿irt","Diciadain","Diardaoin","Dihaoine","Disathairne"],weekdaysShort:["Did","Dil","Dim","Dic","Dia","Dih","Dis"],weekdaysMin:["D貌","Lu","M脿","Ci","Ar","Ha","Sa"],longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[An-diugh aig] LT",nextDay:"[A-m脿ireach aig] LT",nextWeek:"dddd [aig] LT",lastDay:"[An-d猫 aig] LT",lastWeek:"dddd [seo chaidh] [aig] LT",sameElse:"L"},relativeTime:{future:"ann an %s",past:"bho chionn %s",s:"beagan diogan",ss:"%d diogan",m:"mionaid",mm:"%d mionaidean",h:"uair",hh:"%d uairean",d:"latha",dd:"%d latha",M:"m矛os",MM:"%d m矛osan",y:"bliadhna",yy:"%d bliadhna"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(e){var t=e===1?"d":e%10===2?"na":"mh";return e+t},week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("gl",{months:"xaneiro_febreiro_marzo_abril_maio_xu帽o_xullo_agosto_setembro_outubro_novembro_decembro".split("_"),monthsShort:"xan._feb._mar._abr._mai._xu帽._xul._ago._set._out._nov._dec.".split("_"),monthsParseExact:true,weekdays:"domingo_luns_martes_m茅rcores_xoves_venres_s谩bado".split("_"),weekdaysShort:"dom._lun._mar._m茅r._xov._ven._s谩b.".split("_"),weekdaysMin:"do_lu_ma_m茅_xo_ve_s谩".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoxe "+(this.hours()!==1?"谩s":"谩")+"] LT"},nextDay:function(){return"[ma帽谩 "+(this.hours()!==1?"谩s":"谩")+"] LT"},nextWeek:function(){return"dddd ["+(this.hours()!==1?"谩s":"a")+"] LT"},lastDay:function(){return"[onte "+(this.hours()!==1?"谩":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(this.hours()!==1?"谩s":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(e){if(e.indexOf("un")===0)return"n"+e;return"en "+e},past:"hai %s",s:"uns segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un d铆a",dd:"%d d铆as",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}潞/,ordinal:"%d潞",week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+function t(e,t,n,a){var r={s:["啶ム啶∴く啶� 啶膏啶曕啶∴ぞ啶傕え啷�","啶ム啶∴ 啶膏啶曕啶�"],ss:[e+" 啶膏啶曕啶∴ぞ啶傕え啷�",e+" 啶膏啶曕啶�"],m:["啶忇啶� 啶た啶`啶距え","啶忇 啶た啶ㄠ啶�"],mm:[e+" 啶た啶`啶距啶ㄠ",e+" 啶た啶`啶距"],h:["啶忇啶� 啶掂ぐ啶距え","啶忇 啶掂ぐ"],hh:[e+" 啶掂ぐ啶距啶ㄠ",e+" 啶掂ぐ啶距"],d:["啶忇啶� 啶︵た啶膏ぞ啶�","啶忇 啶︵啶�"],dd:[e+" 啶︵た啶膏ぞ啶傕え啷�",e+" 啶︵啶�"],M:["啶忇啶� 啶啶灌く啶ㄠ啶ぞ啶�","啶忇 啶啶灌く啶ㄠ"],MM:[e+" 啶啶灌く啶ㄠ啶ぞ啶ㄠ",e+" 啶啶灌く啶ㄠ"],y:["啶忇啶� 啶掂ぐ啷嵿じ啶距え","啶忇 啶掂ぐ啷嵿じ"],yy:[e+" 啶掂ぐ啷嵿じ啶距啶ㄠ",e+" 啶掂ぐ啷嵿じ啶距"]};return a?r[n][0]:r[n][1]}var n;e.defineLocale("gom-deva",{months:{standalone:"啶溹ぞ啶ㄠ啶掂ぞ啶班_啶啶啶班啶掂ぞ啶班_啶ぞ啶班啶歘啶忇お啷嵿ぐ啷�啶瞋啶_啶溹啶╛啶溹啶侧く_啶戉啶膏啶焈啶膏お啷嵿啷囙啶ぐ_啶戉啷嵿啷嬥が啶癬啶ㄠ啶掂啶灌啶傕が啶癬啶∴た啶膏啶傕が啶�".split("_"),format:"啶溹ぞ啶ㄠ啶掂ぞ啶班啶氞啶ぞ_啶啶啶班啶掂ぞ啶班啶氞啶ぞ_啶ぞ啶班啶氞ぞ啶氞啶ぞ_啶忇お啷嵿ぐ啷�啶侧ぞ啶氞啶ぞ_啶啶ぞ啶氞啶ぞ_啶溹啶ㄠぞ啶氞啶ぞ_啶溹啶侧く啶距啷嵿く啶綺啶戉啶膏啶熰ぞ啶氞啶ぞ_啶膏お啷嵿啷囙啶ぐ啶距啷嵿く啶綺啶戉啷嵿啷嬥が啶班ぞ啶氞啶ぞ_啶ㄠ啶掂啶灌啶傕が啶班ぞ啶氞啶ぞ_啶∴た啶膏啶傕が啶班ぞ啶氞啶ぞ".split("_"),isFormat:/MMMM(\s)+D[oD]?/},monthsShort:"啶溹ぞ啶ㄠ._啶啶啶班._啶ぞ啶班啶歘啶忇お啷嵿ぐ啷�._啶_啶溹啶╛啶溹啶�._啶戉._啶膏お啷嵿啷囙._啶戉啷嵿啷�._啶ㄠ啶掂啶灌啶�._啶∴た啶膏啶�.".split("_"),monthsParseExact:true,weekdays:"啶嗋く啶むぞ啶癬啶膏啶ぞ啶癬啶啶椸こ啶距ぐ_啶啶оさ啶距ぐ_啶た啶班啶膏啶むぞ啶癬啶膏啶曕啶班ぞ啶癬啶多啶ㄠさ啶距ぐ".split("_"),weekdaysShort:"啶嗋く啶�._啶膏啶�._啶啶椸こ._啶啶�._啶啶班啶膏啶�._啶膏啶曕啶�._啶多啶�.".split("_"),weekdaysMin:"啶哶啶膏_啶_啶_啶啶班_啶膏_啶多".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"A h:mm [啶掂ぞ啶溹い啶距]",LTS:"A h:mm:ss [啶掂ぞ啶溹い啶距]",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY A h:mm [啶掂ぞ啶溹い啶距]",LLLL:"dddd, MMMM Do, YYYY, A h:mm [啶掂ぞ啶溹い啶距]",llll:"ddd, D MMM YYYY, A h:mm [啶掂ぞ啶溹い啶距]"},calendar:{sameDay:"[啶嗋く啶淽 LT",nextDay:"[啶ぞ啶侧啶ぞ啶俔 LT",nextWeek:"[啶啶∴げ啷媇 dddd[,] LT",lastDay:"[啶曕ぞ啶瞉 LT",lastWeek:"[啶ぞ啶熰げ啷媇 dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s",past:"%s 啶嗋う啷�啶�",s:t,ss:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}(啶掂啶�)/,ordinal:function(e,t){switch(t){case"D":return e+"啶掂啶�";default:case"M":case"Q":case"DDD":case"d":case"w":case"W":return e}},week:{dow:0,doy:3},meridiemParse:/啶班ぞ啶む|啶膏啶距こ啷�啶倈啶︵え啶ぞ啶班ぞ啶倈啶膏ぞ啶傕啷�/,meridiemHour:function(e,t){if(e===12)e=0;if(t==="啶班ぞ啶む")return e<4?e:e+12;else if(t==="啶膏啶距こ啷�啶�")return e;else if(t==="啶︵え啶ぞ啶班ぞ啶�")return e>12?e:e+12;else if(t==="啶膏ぞ啶傕啷�")return e+12},meridiem:function(e,t,n){if(e<4)return"啶班ぞ啶む";else if(e<12)return"啶膏啶距こ啷�啶�";else if(e<16)return"啶︵え啶ぞ啶班ぞ啶�";else if(e<20)return"啶膏ぞ啶傕啷�";else return"啶班ぞ啶む"}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+function t(e,t,n,a){var r={s:["thoddea sekondamni","thodde sekond"],ss:[e+" sekondamni",e+" sekond"],m:["eka mintan","ek minut"],mm:[e+" mintamni",e+" mintam"],h:["eka voran","ek vor"],hh:[e+" voramni",e+" voram"],d:["eka disan","ek dis"],dd:[e+" disamni",e+" dis"],M:["eka mhoinean","ek mhoino"],MM:[e+" mhoineamni",e+" mhoine"],y:["eka vorsan","ek voros"],yy:[e+" vorsamni",e+" vorsam"]};return a?r[n][0]:r[n][1]}var n;e.defineLocale("gom-latn",{months:{standalone:"Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr".split("_"),format:"Janerachea_Febrerachea_Marsachea_Abrilachea_Maiachea_Junachea_Julaiachea_Agostachea_Setembrachea_Otubrachea_Novembrachea_Dezembrachea".split("_"),isFormat:/MMMM(\s)+D[oD]?/},monthsShort:"Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.".split("_"),monthsParseExact:true,weekdays:"Aitar_Somar_Mongllar_Budhvar_Birestar_Sukrar_Son'var".split("_"),weekdaysShort:"Ait._Som._Mon._Bud._Bre._Suk._Son.".split("_"),weekdaysMin:"Ai_Sm_Mo_Bu_Br_Su_Sn".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"A h:mm [vazta]",LTS:"A h:mm:ss [vazta]",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY A h:mm [vazta]",LLLL:"dddd, MMMM Do, YYYY, A h:mm [vazta]",llll:"ddd, D MMM YYYY, A h:mm [vazta]"},calendar:{sameDay:"[Aiz] LT",nextDay:"[Faleam] LT",nextWeek:"[Fuddlo] dddd[,] LT",lastDay:"[Kal] LT",lastWeek:"[Fattlo] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s",past:"%s adim",s:t,ss:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}(er)/,ordinal:function(e,t){switch(t){case"D":return e+"er";default:case"M":case"Q":case"DDD":case"d":case"w":case"W":return e}},week:{dow:0,doy:3},meridiemParse:/rati|sokallim|donparam|sanje/,meridiemHour:function(e,t){if(e===12)e=0;if(t==="rati")return e<4?e:e+12;else if(t==="sokallim")return e;else if(t==="donparam")return e>12?e:e+12;else if(t==="sanje")return e+12},meridiem:function(e,t,n){if(e<4)return"rati";else if(e<12)return"sokallim";else if(e<16)return"donparam";else if(e<20)return"sanje";else return"rati"}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t={1:"喃�",2:"喃�",3:"喃�",4:"喃�",5:"喃�",6:"喃�",7:"喃�",8:"喃�",9:"喃�",0:"喃�"},n={"喃�":"1","喃�":"2","喃�":"3","喃�":"4","喃�":"5","喃�":"6","喃�":"7","喃�":"8","喃�":"9","喃�":"0"},a;e.defineLocale("gu",{months:"嗒溹嗒ㄠ珝嗒珌嗒嗋喃�_嗒珖嗒珝嗒班珌嗒嗋喃�_嗒嗒班珝嗒歘嗒忇喃嵿嗒苦_嗒珖_嗒溹珎嗒╛嗒溹珌嗒侧嗒坃嗒戉獥嗒膏珝嗒焈嗒膏喃嵿獰喃囙喃嵿嗒癬嗒戉獣喃嵿獰喃嵿嗒癬嗒ㄠ喃囙喃嵿嗒癬嗒∴嗒膏珖嗒珝嗒".split("_"),monthsShort:"嗒溹嗒ㄠ珝嗒珌._嗒珖嗒珝嗒班珌._嗒嗒班珝嗒歘嗒忇喃嵿嗒�._嗒珖_嗒溹珎嗒╛嗒溹珌嗒侧._嗒戉獥._嗒膏喃嵿獰喃�._嗒戉獣喃嵿獰喃�._嗒ㄠ喃�._嗒∴嗒膏珖.".split("_"),monthsParseExact:true,weekdays:"嗒班嗒苦嗒距_嗒膏珛嗒嗒距_嗒獋嗒椸嗒掂嗒癬嗒珌嗒о珝嗒掂嗒癬嗒椸珌嗒班珌嗒掂嗒癬嗒多珌嗒曕珝嗒班嗒距_嗒多嗒苦嗒距".split("_"),weekdaysShort:"嗒班嗒縚嗒膏珛嗒甠嗒獋嗒椸_嗒珌嗒о珝_嗒椸珌嗒班珌_嗒多珌嗒曕珝嗒癬嗒多嗒�".split("_"),weekdaysMin:"嗒癬嗒膏珛_嗒獋_嗒珌_嗒椸珌_嗒多珌_嗒�".split("_"),longDateFormat:{LT:"A h:mm 嗒掂嗒椸珝嗒珖",LTS:"A h:mm:ss 嗒掂嗒椸珝嗒珖",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm 嗒掂嗒椸珝嗒珖",LLLL:"dddd, D MMMM YYYY, A h:mm 嗒掂嗒椸珝嗒珖"},calendar:{sameDay:"[嗒嗋獪] LT",nextDay:"[嗒曕嗒侧珖] LT",nextWeek:"dddd, LT",lastDay:"[嗒椸獓嗒曕嗒侧珖] LT",lastWeek:"[嗒嗒涏嗒綸 dddd, LT",sameElse:"L"},relativeTime:{future:"%s 嗒",past:"%s 嗒喃囙嗒�",s:"嗒呧喃佮獣 嗒喃�",ss:"%d 嗒膏珖嗒曕獋嗒�",m:"嗒忇獣 嗒嗒ㄠ嗒�",mm:"%d 嗒嗒ㄠ嗒�",h:"嗒忇獣 嗒曕嗒距獣",hh:"%d 嗒曕嗒距獣",d:"嗒忇獣 嗒︵嗒掂",dd:"%d 嗒︵嗒掂",M:"嗒忇獣 嗒嗒苦喃�",MM:"%d 嗒嗒苦喃�",y:"嗒忇獣 嗒掂喃嵿",yy:"%d 嗒掂喃嵿"},preparse:function(e){return e.replace(/[喃о喃┼喃喃喃]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/嗒班嗒嗒喃嬥|嗒膏嗒距|嗒膏嗒傕獪/,meridiemHour:function(e,t){if(e===12)e=0;if(t==="嗒班嗒�")return e<4?e:e+12;else if(t==="嗒膏嗒距")return e;else if(t==="嗒喃嬥")return e>=10?e:e+12;else if(t==="嗒膏嗒傕獪")return e+12},meridiem:function(e,t,n){if(e<4)return"嗒班嗒�";else if(e<10)return"嗒膏嗒距";else if(e<17)return"嗒喃嬥";else if(e<20)return"嗒膏嗒傕獪";else return"嗒班嗒�"},week:{dow:0,doy:6}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("he",{months:"讬谞讜讗专_驻讘专讜讗专_诪专抓_讗驻专讬诇_诪讗讬_讬讜谞讬_讬讜诇讬_讗讜讙讜住讟_住驻讟诪讘专_讗讜拽讟讜讘专_谞讜讘诪讘专_讚爪诪讘专".split("_"),monthsShort:"讬谞讜壮_驻讘专壮_诪专抓_讗驻专壮_诪讗讬_讬讜谞讬_讬讜诇讬_讗讜讙壮_住驻讟壮_讗讜拽壮_谞讜讘壮_讚爪诪壮".split("_"),weekdays:"专讗砖讜谉_砖谞讬_砖诇讬砖讬_专讘讬注讬_讞诪讬砖讬_砖讬砖讬_砖讘转".split("_"),weekdaysShort:"讗壮_讘壮_讙壮_讚壮_讛壮_讜壮_砖壮".split("_"),weekdaysMin:"讗_讘_讙_讚_讛_讜_砖".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [讘]MMMM YYYY",LLL:"D [讘]MMMM YYYY HH:mm",LLLL:"dddd, D [讘]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[讛讬讜诐 讘志]LT",nextDay:"[诪讞专 讘志]LT",nextWeek:"dddd [讘砖注讛] LT",lastDay:"[讗转诪讜诇 讘志]LT",lastWeek:"[讘讬讜诐] dddd [讛讗讞专讜谉 讘砖注讛] LT",sameElse:"L"},relativeTime:{future:"讘注讜讚 %s",past:"诇驻谞讬 %s",s:"诪住驻专 砖谞讬讜转",ss:"%d 砖谞讬讜转",m:"讚拽讛",mm:"%d 讚拽讜转",h:"砖注讛",hh:function(e){if(e===2)return"砖注转讬讬诐";return e+" 砖注讜转"},d:"讬讜诐",dd:function(e){if(e===2)return"讬讜诪讬讬诐";return e+" 讬诪讬诐"},M:"讞讜讚砖",MM:function(e){if(e===2)return"讞讜讚砖讬讬诐";return e+" 讞讜讚砖讬诐"},y:"砖谞讛",yy:function(e){if(e===2)return"砖谞转讬讬诐";else if(e%10===0&&e!==10)return e+" 砖谞讛";return e+" 砖谞讬诐"}},meridiemParse:/讗讞讛"爪|诇驻谞讛"爪|讗讞专讬 讛爪讛专讬讬诐|诇驻谞讬 讛爪讛专讬讬诐|诇驻谞讜转 讘讜拽专|讘讘讜拽专|讘注专讘/i,isPM:function(e){return/^(讗讞讛"爪|讗讞专讬 讛爪讛专讬讬诐|讘注专讘)$/.test(e)},meridiem:function(e,t,n){if(e<5)return"诇驻谞讜转 讘讜拽专";else if(e<10)return"讘讘讜拽专";else if(e<12)return n?'诇驻谞讛"爪':"诇驻谞讬 讛爪讛专讬讬诐";else if(e<18)return n?'讗讞讛"爪':"讗讞专讬 讛爪讛专讬讬诐";else return"讘注专讘"}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t={1:"啷�",2:"啷�",3:"啷�",4:"啷�",5:"啷�",6:"啷�",7:"啷�",8:"啷�",9:"啷�",0:"啷�"},n={"啷�":"1","啷�":"2","啷�":"3","啷�":"4","啷�":"5","啷�":"6","啷�":"7","啷�":"8","啷�":"9","啷�":"0"},a=[/^啶溹え/i,/^啶ぜ啶皘啶ぐ/i,/^啶ぞ啶班啶�/i,/^啶呧お啷嵿ぐ啷�/i,/^啶/i,/^啶溹啶�/i,/^啶溹啶�/i,/^啶呧/i,/^啶膏た啶む|啶膏た啶�/i,/^啶呧啷嵿啷�/i,/^啶ㄠさ|啶ㄠさ啶�/i,/^啶︵た啶膏|啶︵た啶�/i],r=[/^啶溹え/i,/^啶ぜ啶�/i,/^啶ぞ啶班啶�/i,/^啶呧お啷嵿ぐ啷�/i,/^啶/i,/^啶溹啶�/i,/^啶溹啶�/i,/^啶呧/i,/^啶膏た啶�/i,/^啶呧啷嵿啷�/i,/^啶ㄠさ/i,/^啶︵た啶�/i],o;e.defineLocale("hi",{months:{format:"啶溹え啶掂ぐ啷�_啶ぜ啶班さ啶班_啶ぞ啶班啶歘啶呧お啷嵿ぐ啷堗げ_啶_啶溹啶╛啶溹啶侧ぞ啶坃啶呧啶膏啶啶膏た啶むぎ啷嵿が啶癬啶呧啷嵿啷傕が啶癬啶ㄠさ啶啶ぐ_啶︵た啶膏ぎ啷嵿が啶�".split("_"),standalone:"啶溹え啶掂ぐ啷�_啶ぐ啶掂ぐ啷�_啶ぞ啶班啶歘啶呧お啷嵿ぐ啷堗げ_啶_啶溹啶╛啶溹啶侧ぞ啶坃啶呧啶膏啶啶膏た啶む啶ぐ_啶呧啷嵿啷傕が啶癬啶ㄠさ啶傕が啶癬啶︵た啶膏啶ぐ".split("_")},monthsShort:"啶溹え._啶ぜ啶�._啶ぞ啶班啶歘啶呧お啷嵿ぐ啷�._啶_啶溹啶╛啶溹啶�._啶呧._啶膏た啶�._啶呧啷嵿啷�._啶ㄠさ._啶︵た啶�.".split("_"),weekdays:"啶班さ啶苦さ啶距ぐ_啶膏啶さ啶距ぐ_啶啶椸げ啶掂ぞ啶癬啶啶оさ啶距ぐ_啶椸啶班啶掂ぞ啶癬啶多啶曕啶班さ啶距ぐ_啶多え啶苦さ啶距ぐ".split("_"),weekdaysShort:"啶班さ啶縚啶膏啶甠啶啶椸げ_啶啶啶椸啶班_啶多啶曕啶癬啶多え啶�".split("_"),weekdaysMin:"啶癬啶膏_啶_啶_啶椸_啶多_啶�".split("_"),longDateFormat:{LT:"A h:mm 啶啷�",LTS:"A h:mm:ss 啶啷�",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm 啶啷�",LLLL:"dddd, D MMMM YYYY, A h:mm 啶啷�"},monthsParse:a,longMonthsParse:a,shortMonthsParse:r,monthsRegex:/^(啶溹え啶掂ぐ啷�|啶溹え\.?|啶ぜ啶班さ啶班|啶ぐ啶掂ぐ啷�|啶ぜ啶癨.?|啶ぞ啶班啶�?|啶呧お啷嵿ぐ啷堗げ|啶呧お啷嵿ぐ啷圽.?|啶?|啶溹啶�?|啶溹啶侧ぞ啶坾啶溹啶瞈.?|啶呧啶膏啶啶呧\.?|啶膏た啶むぎ啷嵿が啶皘啶膏た啶む啶ぐ|啶膏た啶.?|啶呧啷嵿啷傕が啶皘啶呧啷嵿啷俓.?|啶ㄠさ啶啶ぐ|啶ㄠさ啶傕が啶皘啶ㄠさ\.?|啶︵た啶膏ぎ啷嵿が啶皘啶︵た啶膏啶ぐ|啶︵た啶竆.?)/i,monthsShortRegex:/^(啶溹え啶掂ぐ啷�|啶溹え\.?|啶ぜ啶班さ啶班|啶ぐ啶掂ぐ啷�|啶ぜ啶癨.?|啶ぞ啶班啶�?|啶呧お啷嵿ぐ啷堗げ|啶呧お啷嵿ぐ啷圽.?|啶?|啶溹啶�?|啶溹啶侧ぞ啶坾啶溹啶瞈.?|啶呧啶膏啶啶呧\.?|啶膏た啶むぎ啷嵿が啶皘啶膏た啶む啶ぐ|啶膏た啶.?|啶呧啷嵿啷傕が啶皘啶呧啷嵿啷俓.?|啶ㄠさ啶啶ぐ|啶ㄠさ啶傕が啶皘啶ㄠさ\.?|啶︵た啶膏ぎ啷嵿が啶皘啶︵た啶膏啶ぐ|啶︵た啶竆.?)/i,monthsStrictRegex:/^(啶溹え啶掂ぐ啷�?|啶ぜ啶班さ啶班|啶ぐ啶掂ぐ啷�?|啶ぞ啶班啶�?|啶呧お啷嵿ぐ啷堗げ?|啶?|啶溹啶�?|啶溹啶侧ぞ啶�?|啶呧啶膏啶�?|啶膏た啶むぎ啷嵿が啶皘啶膏た啶む啶ぐ|啶膏た啶�?\.?|啶呧啷嵿啷傕が啶皘啶呧啷嵿啷俓.?|啶ㄠさ啶啶ぐ|啶ㄠさ啶傕が啶�?|啶︵た啶膏ぎ啷嵿が啶皘啶︵た啶膏啶ぐ?)/i,monthsShortStrictRegex:/^(啶溹え\.?|啶ぜ啶癨.?|啶ぞ啶班啶�?|啶呧お啷嵿ぐ啷圽.?|啶?|啶溹啶�?|啶溹啶瞈.?|啶呧\.?|啶膏た啶.?|啶呧啷嵿啷俓.?|啶ㄠさ\.?|啶︵た啶竆.?)/i,calendar:{sameDay:"[啶嗋] LT",nextDay:"[啶曕げ] LT",nextWeek:"dddd, LT",lastDay:"[啶曕げ] LT",lastWeek:"[啶た啶涏げ啷嘳 dddd, LT",sameElse:"L"},relativeTime:{future:"%s 啶啶�",past:"%s 啶す啶侧",s:"啶曕啶� 啶灌 啶曕啶粪ぃ",ss:"%d 啶膏啶曕啶�",m:"啶忇 啶た啶ㄠ",mm:"%d 啶た啶ㄠ",h:"啶忇 啶樴啶熰ぞ",hh:"%d 啶樴啶熰",d:"啶忇 啶︵た啶�",dd:"%d 啶︵た啶�",M:"啶忇 啶す啷�啶ㄠ",MM:"%d 啶す啷�啶ㄠ",y:"啶忇 啶掂ぐ啷嵿し",yy:"%d 啶掂ぐ啷嵿し"},preparse:function(e){return e.replace(/[啷оエ啷┼オ啷ガ啷ギ啷ウ]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/啶班ぞ啶啶膏啶す|啶︵啶す啶皘啶多ぞ啶�/,meridiemHour:function(e,t){if(e===12)e=0;if(t==="啶班ぞ啶�")return e<4?e:e+12;else if(t==="啶膏啶す")return e;else if(t==="啶︵啶す啶�")return e>=10?e:e+12;else if(t==="啶多ぞ啶�")return e+12},meridiem:function(e,t,n){if(e<4)return"啶班ぞ啶�";else if(e<10)return"啶膏啶す";else if(e<17)return"啶︵啶す啶�";else if(e<20)return"啶多ぞ啶�";else return"啶班ぞ啶�"},week:{dow:0,doy:6}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+function t(e,t,n){var a=e+" ";switch(n){case"ss":if(e===1)a+="sekunda";else if(e===2||e===3||e===4)a+="sekunde";else a+="sekundi";return a;case"m":return t?"jedna minuta":"jedne minute";case"mm":if(e===1)a+="minuta";else if(e===2||e===3||e===4)a+="minute";else a+="minuta";return a;case"h":return t?"jedan sat":"jednog sata";case"hh":if(e===1)a+="sat";else if(e===2||e===3||e===4)a+="sata";else a+="sati";return a;case"dd":if(e===1)a+="dan";else a+="dana";return a;case"MM":if(e===1)a+="mjesec";else if(e===2||e===3||e===4)a+="mjeseca";else a+="mjeseci";return a;case"yy":if(e===1)a+="godina";else if(e===2||e===3||e===4)a+="godine";else a+="godina";return a}}var n;e.defineLocale("hr",{months:{format:"sije膷nja_velja膷e_o啪ujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca".split("_"),standalone:"sije膷anj_velja膷a_o啪ujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_")},monthsShort:"sij._velj._o啪u._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),monthsParseExact:true,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_膷etvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._膷et._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_膷e_pe_su".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"Do MMMM YYYY",LLL:"Do MMMM YYYY H:mm",LLLL:"dddd, Do MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju膷er u] LT",lastWeek:function(){switch(this.day()){case 0:return"[pro拧lu] [nedjelju] [u] LT";case 3:return"[pro拧lu] [srijedu] [u] LT";case 6:return"[pro拧le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[pro拧li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:t,m:t,mm:t,h:t,hh:t,d:"dan",dd:t,M:"mjesec",MM:t,y:"godinu",yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t="vas谩rnap h茅tf艖n kedden szerd谩n cs眉t枚rt枚k枚n p茅nteken szombaton".split(" "),n;function a(e,t,n,a){var r=e;switch(n){case"s":return a||t?"n茅h谩ny m谩sodperc":"n茅h谩ny m谩sodperce";case"ss":return r+(a||t)?" m谩sodperc":" m谩sodperce";case"m":return"egy"+(a||t?" perc":" perce");case"mm":return r+(a||t?" perc":" perce");case"h":return"egy"+(a||t?" 贸ra":" 贸r谩ja");case"hh":return r+(a||t?" 贸ra":" 贸r谩ja");case"d":return"egy"+(a||t?" nap":" napja");case"dd":return r+(a||t?" nap":" napja");case"M":return"egy"+(a||t?" h贸nap":" h贸napja");case"MM":return r+(a||t?" h贸nap":" h贸napja");case"y":return"egy"+(a||t?" 茅v":" 茅ve");case"yy":return r+(a||t?" 茅v":" 茅ve")}return""}function r(e){return(e?"":"[m煤lt] ")+"["+t[this.day()]+"] LT[-kor]"}e.defineLocale("hu",{months:"janu谩r_febru谩r_m谩rcius_谩prilis_m谩jus_j煤nius_j煤lius_augusztus_szeptember_okt贸ber_november_december".split("_"),monthsShort:"jan._feb._m谩rc._谩pr._m谩j._j煤n._j煤l._aug._szept._okt._nov._dec.".split("_"),monthsParseExact:true,weekdays:"vas谩rnap_h茅tf艖_kedd_szerda_cs眉t枚rt枚k_p茅ntek_szombat".split("_"),weekdaysShort:"vas_h茅t_kedd_sze_cs眉t_p茅n_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D. H:mm",LLLL:"YYYY. MMMM D., dddd H:mm"},meridiemParse:/de|du/i,isPM:function(e){return e.charAt(1).toLowerCase()==="u"},meridiem:function(e,t,n){if(e<12)return n===true?"de":"DE";else return n===true?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return r.call(this,true)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return r.call(this,false)},sameElse:"L"},relativeTime:{future:"%s m煤lva",past:"%s",s:a,ss:a,m:a,mm:a,h:a,hh:a,d:a,dd:a,M:a,MM:a,y:a,yy:a},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("hy-am",{months:{format:"瞻崭謧斩站铡謤斋_謨榨湛謤站铡謤斋_沾铡謤湛斋_铡蘸謤斋宅斋_沾铡盏斋战斋_瞻崭謧斩斋战斋_瞻崭謧宅斋战斋_謪眨崭战湛崭战斋_战榨蘸湛榨沾闸榨謤斋_瞻崭寨湛榨沾闸榨謤斋_斩崭盏榨沾闸榨謤斋_栅榨寨湛榨沾闸榨謤斋".split("_"),standalone:"瞻崭謧斩站铡謤_謨榨湛謤站铡謤_沾铡謤湛_铡蘸謤斋宅_沾铡盏斋战_瞻崭謧斩斋战_瞻崭謧宅斋战_謪眨崭战湛崭战_战榨蘸湛榨沾闸榨謤_瞻崭寨湛榨沾闸榨謤_斩崭盏榨沾闸榨謤_栅榨寨湛榨沾闸榨謤".split("_")},monthsShort:"瞻斩站_謨湛謤_沾謤湛_铡蘸謤_沾盏战_瞻斩战_瞻宅战_謪眨战_战蘸湛_瞻寨湛_斩沾闸_栅寨湛".split("_"),weekdays:"寨斋謤铡寨斋_榨謤寨崭謧辗铡闸诈斋_榨謤榨謩辗铡闸诈斋_展崭謤榨謩辗铡闸诈斋_瞻斋斩眨辗铡闸诈斋_崭謧謤闸铡诈_辗铡闸铡诈".split("_"),weekdaysShort:"寨謤寨_榨謤寨_榨謤謩_展謤謩_瞻斩眨_崭謧謤闸_辗闸诈".split("_"),weekdaysMin:"寨謤寨_榨謤寨_榨謤謩_展謤謩_瞻斩眨_崭謧謤闸_辗闸诈".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY 诈.",LLL:"D MMMM YYYY 诈., HH:mm",LLLL:"dddd, D MMMM YYYY 诈., HH:mm"},calendar:{sameDay:"[铡盏战謪謤] LT",nextDay:"[站铡詹炸] LT",lastDay:"[榨謤榨寨] LT",nextWeek:function(){return"dddd [謪謤炸 摘铡沾炸] LT"},lastWeek:function(){return"[铡斩謥铡债] dddd [謪謤炸 摘铡沾炸] LT"},sameElse:"L"},relativeTime:{future:"%s 瞻榨湛崭",past:"%s 铡占铡栈",s:"沾斋 謩铡斩斋 站铡盏謤寨盏铡斩",ss:"%d 站铡盏謤寨盏铡斩",m:"謤崭蘸榨",mm:"%d 謤崭蘸榨",h:"摘铡沾",hh:"%d 摘铡沾",d:"謪謤",dd:"%d 謪謤",M:"铡沾斋战",MM:"%d 铡沾斋战",y:"湛铡謤斋",yy:"%d 湛铡謤斋"},meridiemParse:/眨斋辗榨謤站铡|铡占铡站崭湛站铡|謥榨謤榨寨站铡|榨謤榨寨崭盏铡斩/,isPM:function(e){return/^(謥榨謤榨寨站铡|榨謤榨寨崭盏铡斩)$/.test(e)},meridiem:function(e){if(e<4)return"眨斋辗榨謤站铡";else if(e<12)return"铡占铡站崭湛站铡";else if(e<17)return"謥榨謤榨寨站铡";else return"榨謤榨寨崭盏铡斩"},dayOfMonthOrdinalParse:/\d{1,2}|\d{1,2}-(斋斩|謤栅)/,ordinal:function(e,t){switch(t){case"DDD":case"w":case"W":case"DDDo":if(e===1)return e+"-斋斩";return e+"-謤栅";default:return e}},week:{dow:1,doy:7}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(e,t){if(e===12)e=0;if(t==="pagi")return e;else if(t==="siang")return e>=11?e:e+12;else if(t==="sore"||t==="malam")return e+12},meridiem:function(e,t,n){if(e<11)return"pagi";else if(e<15)return"siang";else if(e<19)return"sore";else return"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",ss:"%d detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:0,doy:6}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+function o(e){if(e%100===11)return true;else if(e%10===1)return false;return true}function t(e,t,n,a){var r=e+" ";switch(n){case"s":return t||a?"nokkrar sek煤ndur":"nokkrum sek煤ndum";case"ss":if(o(e))return r+(t||a?"sek煤ndur":"sek煤ndum");return r+"sek煤nda";case"m":return t?"m铆n煤ta":"m铆n煤tu";case"mm":if(o(e))return r+(t||a?"m铆n煤tur":"m铆n煤tum");else if(t)return r+"m铆n煤ta";return r+"m铆n煤tu";case"hh":if(o(e))return r+(t||a?"klukkustundir":"klukkustundum");return r+"klukkustund";case"d":if(t)return"dagur";return a?"dag":"degi";case"dd":if(o(e)){if(t)return r+"dagar";return r+(a?"daga":"d枚gum")}else if(t)return r+"dagur";return r+(a?"dag":"degi");case"M":if(t)return"m谩nu冒ur";return a?"m谩nu冒":"m谩nu冒i";case"MM":if(o(e)){if(t)return r+"m谩nu冒ir";return r+(a?"m谩nu冒i":"m谩nu冒um")}else if(t)return r+"m谩nu冒ur";return r+(a?"m谩nu冒":"m谩nu冒i");case"y":return t||a?"谩r":"谩ri";case"yy":if(o(e))return r+(t||a?"谩r":"谩rum");return r+(t||a?"谩r":"谩ri")}}var n;e.defineLocale("is",{months:"jan煤ar_febr煤ar_mars_apr铆l_ma铆_j煤n铆_j煤l铆_谩g煤st_september_okt贸ber_n贸vember_desember".split("_"),monthsShort:"jan_feb_mar_apr_ma铆_j煤n_j煤l_谩g煤_sep_okt_n贸v_des".split("_"),weekdays:"sunnudagur_m谩nudagur_镁ri冒judagur_mi冒vikudagur_fimmtudagur_f枚studagur_laugardagur".split("_"),weekdaysShort:"sun_m谩n_镁ri_mi冒_fim_f枚s_lau".split("_"),weekdaysMin:"Su_M谩_脼r_Mi_Fi_F枚_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd, D. MMMM YYYY [kl.] H:mm"},calendar:{sameDay:"[铆 dag kl.] LT",nextDay:"[谩 morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[铆 g忙r kl.] LT",lastWeek:"[s铆冒asta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s s铆冒an",s:t,ss:t,m:t,mm:t,h:"klukkustund",hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_luned矛_marted矛_mercoled矛_gioved矛_venerd矛_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:function(){return"[Oggi a"+(this.hours()>1?"lle ":this.hours()===0?" ":"ll'")+"]LT"},nextDay:function(){return"[Domani a"+(this.hours()>1?"lle ":this.hours()===0?" ":"ll'")+"]LT"},nextWeek:function(){return"dddd [a"+(this.hours()>1?"lle ":this.hours()===0?" ":"ll'")+"]LT"},lastDay:function(){return"[Ieri a"+(this.hours()>1?"lle ":this.hours()===0?" ":"ll'")+"]LT"},lastWeek:function(){switch(this.day()){case 0:return"[La scorsa] dddd [a"+(this.hours()>1?"lle ":this.hours()===0?" ":"ll'")+"]LT";default:return"[Lo scorso] dddd [a"+(this.hours()>1?"lle ":this.hours()===0?" ":"ll'")+"]LT"}},sameElse:"L"},relativeTime:{future:"tra %s",past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",w:"una settimana",ww:"%d settimane",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}潞/,ordinal:"%d潞",week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("it-ch",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_luned矛_marted矛_mercoled矛_gioved矛_venerd矛_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(e){return(/^[0-9].+$/.test(e)?"tra":"in")+" "+e},past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}潞/,ordinal:"%d潞",week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("ja",{eras:[{since:"2019-05-01",offset:1,name:"浠ゅ拰",narrow:"銒�",abbr:"R"},{since:"1989-01-08",until:"2019-04-30",offset:1,name:"骞虫垚",narrow:"銔�",abbr:"H"},{since:"1926-12-25",until:"1989-01-07",offset:1,name:"鏄拰",narrow:"銔�",abbr:"S"},{since:"1912-07-30",until:"1926-12-24",offset:1,name:"澶ф",narrow:"銔�",abbr:"T"},{since:"1873-01-01",until:"1912-07-29",offset:6,name:"鏄庢不",narrow:"銔�",abbr:"M"},{since:"0001-01-01",until:"1873-12-31",offset:1,name:"瑗挎殾",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-Infinity,offset:1,name:"绱�鍏冨墠",narrow:"BC",abbr:"BC"}],eraYearOrdinalRegex:/(鍏億\d+)骞�/,eraYearOrdinalParse:function(e,t){return t[1]==="鍏�"?1:parseInt(t[1]||e,10)},months:"1鏈坃2鏈坃3鏈坃4鏈坃5鏈坃6鏈坃7鏈坃8鏈坃9鏈坃10鏈坃11鏈坃12鏈�".split("_"),monthsShort:"1鏈坃2鏈坃3鏈坃4鏈坃5鏈坃6鏈坃7鏈坃8鏈坃9鏈坃10鏈坃11鏈坃12鏈�".split("_"),weekdays:"鏃ユ洔鏃鏈堟洔鏃鐏洔鏃姘存洔鏃鏈ㄦ洔鏃閲戞洔鏃鍦熸洔鏃�".split("_"),weekdaysShort:"鏃鏈坃鐏玙姘確鏈╛閲慱鍦�".split("_"),weekdaysMin:"鏃鏈坃鐏玙姘確鏈╛閲慱鍦�".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY骞碝鏈圖鏃�",LLL:"YYYY骞碝鏈圖鏃� HH:mm",LLLL:"YYYY骞碝鏈圖鏃� dddd HH:mm",l:"YYYY/MM/DD",ll:"YYYY骞碝鏈圖鏃�",lll:"YYYY骞碝鏈圖鏃� HH:mm",llll:"YYYY骞碝鏈圖鏃�(ddd) HH:mm"},meridiemParse:/鍗堝墠|鍗堝緦/i,isPM:function(e){return e==="鍗堝緦"},meridiem:function(e,t,n){if(e<12)return"鍗堝墠";else return"鍗堝緦"},calendar:{sameDay:"[浠婃棩] LT",nextDay:"[鏄庢棩] LT",nextWeek:function(e){if(e.week()!==this.week())return"[鏉ラ�盷dddd LT";else return"dddd LT"},lastDay:"[鏄ㄦ棩] LT",lastWeek:function(e){if(this.week()!==e.week())return"[鍏堥�盷dddd LT";else return"dddd LT"},sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}鏃�/,ordinal:function(e,t){switch(t){case"y":return e===1?"鍏冨勾":e+"骞�";case"d":case"D":case"DDD":return e+"鏃�";default:return e}},relativeTime:{future:"%s寰�",past:"%s鍓�",s:"鏁扮",ss:"%d绉�",m:"1鍒�",mm:"%d鍒�",h:"1鏅傞枔",hh:"%d鏅傞枔",d:"1鏃�",dd:"%d鏃�",M:"1銉舵湀",MM:"%d銉舵湀",y:"1骞�",yy:"%d骞�"}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("jv",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des".split("_"),weekdays:"Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu".split("_"),weekdaysShort:"Min_Sen_Sel_Reb_Kem_Jem_Sep".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sp".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/enjing|siyang|sonten|ndalu/,meridiemHour:function(e,t){if(e===12)e=0;if(t==="enjing")return e;else if(t==="siyang")return e>=11?e:e+12;else if(t==="sonten"||t==="ndalu")return e+12},meridiem:function(e,t,n){if(e<11)return"enjing";else if(e<15)return"siyang";else if(e<19)return"sonten";else return"ndalu"},calendar:{sameDay:"[Dinten puniko pukul] LT",nextDay:"[Mbenjang pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kala wingi pukul] LT",lastWeek:"dddd [kepengker pukul] LT",sameElse:"L"},relativeTime:{future:"wonten ing %s",past:"%s ingkang kepengker",s:"sawetawis detik",ss:"%d detik",m:"setunggal menit",mm:"%d menit",h:"setunggal jam",hh:"%d jam",d:"sedinten",dd:"%d dinten",M:"sewulan",MM:"%d wulan",y:"setaun",yy:"%d taun"},week:{dow:1,doy:7}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("ka",{months:"醿樶儛醿溼儠醿愥儬醿榑醿椺償醿戓償醿犪儠醿愥儦醿榑醿涐儛醿犪儮醿榑醿愥優醿犪儤醿氠儤_醿涐儛醿樶儭醿榑醿樶儠醿溼儤醿♂儤_醿樶儠醿氠儤醿♂儤_醿愥儝醿曖儤醿♂儮醿漘醿♂償醿メ儮醿斸儧醿戓償醿犪儤_醿濁儱醿⑨儩醿涐儜醿斸儬醿榑醿溼儩醿斸儧醿戓償醿犪儤_醿撫償醿欋償醿涐儜醿斸儬醿�".split("_"),monthsShort:"醿樶儛醿淿醿椺償醿慱醿涐儛醿燺醿愥優醿燺醿涐儛醿榑醿樶儠醿淿醿樶儠醿歘醿愥儝醿昣醿♂償醿醿濁儱醿醿溼儩醿擾醿撫償醿�".split("_"),weekdays:{standalone:"醿欋儠醿樶儬醿恄醿濁儬醿ㄡ儛醿戓儛醿椺儤_醿♂儛醿涐儴醿愥儜醿愥儣醿榑醿濁儣醿儴醿愥儜醿愥儣醿榑醿儯醿椺儴醿愥儜醿愥儣醿榑醿炨儛醿犪儛醿♂儥醿斸儠醿榑醿ㄡ儛醿戓儛醿椺儤".split("_"),format:"醿欋儠醿樶儬醿愥儭_醿濁儬醿ㄡ儛醿戓儛醿椺儭_醿♂儛醿涐儴醿愥儜醿愥儣醿醿濁儣醿儴醿愥儜醿愥儣醿醿儯醿椺儴醿愥儜醿愥儣醿醿炨儛醿犪儛醿♂儥醿斸儠醿醿ㄡ儛醿戓儛醿椺儭".split("_"),isFormat:/(醿儤醿溼儛|醿ㄡ償醿涐儞醿斸儝)/},weekdaysShort:"醿欋儠醿榑醿濁儬醿╛醿♂儛醿沖醿濁儣醿甠醿儯醿梍醿炨儛醿燺醿ㄡ儛醿�".split("_"),weekdaysMin:"醿欋儠_醿濁儬_醿♂儛_醿濁儣_醿儯_醿炨儛_醿ㄡ儛".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[醿撫儲醿斸儭] LT[-醿栣償]",nextDay:"[醿儠醿愥儦] LT[-醿栣償]",lastDay:"[醿掅儯醿ㄡ儤醿淽 LT[-醿栣償]",nextWeek:"[醿ㄡ償醿涐儞醿斸儝] dddd LT[-醿栣償]",lastWeek:"[醿儤醿溼儛] dddd LT-醿栣償",sameElse:"L"},relativeTime:{future:function(e){return e.replace(/(醿儛醿泑醿儯醿梶醿♂儛醿愥儣|醿償醿殀醿撫儲|醿椺儠)(醿榺醿�)/,function(e,t,n){return n==="醿�"?t+"醿ㄡ儤":t+n+"醿ㄡ儤"})},past:function(e){if(/(醿儛醿涐儤|醿儯醿椺儤|醿♂儛醿愥儣醿榺醿撫儲醿攟醿椺儠醿�)/.test(e))return e.replace(/(醿榺醿�)$/,"醿樶儭 醿儤醿�");if(/醿償醿氠儤/.test(e))return e.replace(/醿償醿氠儤$/,"醿儦醿樶儭 醿儤醿�");return e},s:"醿犪儛醿涐儞醿斸儨醿樶儧醿� 醿儛醿涐儤",ss:"%d 醿儛醿涐儤",m:"醿儯醿椺儤",mm:"%d 醿儯醿椺儤",h:"醿♂儛醿愥儣醿�",hh:"%d 醿♂儛醿愥儣醿�",d:"醿撫儲醿�",dd:"%d 醿撫儲醿�",M:"醿椺儠醿�",MM:"%d 醿椺儠醿�",y:"醿償醿氠儤",yy:"%d 醿償醿氠儤"},dayOfMonthOrdinalParse:/0|1-醿氠儤|醿涐償-\d{1,2}|\d{1,2}-醿�/,ordinal:function(e){if(e===0)return e;if(e===1)return e+"-醿氠儤";if(e<20||e<=100&&e%20===0||e%100===0)return"醿涐償-"+e;return e+"-醿�"},week:{dow:1,doy:7}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var a={0:"-褕褨",1:"-褕褨",2:"-褕褨",3:"-褕褨",4:"-褕褨",5:"-褕褨",6:"-褕褘",7:"-褕褨",8:"-褕褨",9:"-褕褘",10:"-褕褘",20:"-褕褘",30:"-褕褘",40:"-褕褘",50:"-褕褨",60:"-褕褘",70:"-褕褨",80:"-褕褨",90:"-褕褘",100:"-褕褨"},t;e.defineLocale("kk",{months:"覜邪遥褌邪褉_邪覜锌邪薪_薪邪褍褉褘蟹_褋訖褍褨褉_屑邪屑褘褉_屑邪褍褋褘屑_褕褨谢写械_褌邪屑褘蟹_覜褘褉泻爷泄械泻_覜邪蟹邪薪_覜邪褉邪褕邪_卸械谢褌芯覜褋邪薪".split("_"),monthsShort:"覜邪遥_邪覜锌_薪邪褍_褋訖褍_屑邪屑_屑邪褍_褕褨谢_褌邪屑_覜褘褉_覜邪蟹_覜邪褉_卸械谢".split("_"),weekdays:"卸械泻褋械薪斜褨_写爷泄褋械薪斜褨_褋械泄褋械薪斜褨_褋訖褉褋械薪斜褨_斜械泄褋械薪斜褨_卸冶屑邪_褋械薪斜褨".split("_"),weekdaysShort:"卸械泻_写爷泄_褋械泄_褋訖褉_斜械泄_卸冶屑_褋械薪".split("_"),weekdaysMin:"卸泻_写泄_褋泄_褋褉_斜泄_卸屑_褋薪".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[袘爷谐褨薪 褋邪覔邪褌] LT",nextDay:"[袝褉褌械遥 褋邪覔邪褌] LT",nextWeek:"dddd [褋邪覔邪褌] LT",lastDay:"[袣械褕械 褋邪覔邪褌] LT",lastWeek:"[莹褌泻械薪 邪锌褌邪薪褘遥] dddd [褋邪覔邪褌] LT",sameElse:"L"},relativeTime:{future:"%s 褨褕褨薪写械",past:"%s 斜冶褉褘薪",s:"斜褨褉薪械褕械 褋械泻褍薪写",ss:"%d 褋械泻褍薪写",m:"斜褨褉 屑懈薪褍褌",mm:"%d 屑懈薪褍褌",h:"斜褨褉 褋邪覔邪褌",hh:"%d 褋邪覔邪褌",d:"斜褨褉 泻爷薪",dd:"%d 泻爷薪",M:"斜褨褉 邪泄",MM:"%d 邪泄",y:"斜褨褉 卸褘谢",yy:"%d 卸褘谢"},dayOfMonthOrdinalParse:/\d{1,2}-(褕褨|褕褘)/,ordinal:function(e){var t=e%10,n=e>=100?100:null;return e+(a[e]||a[t]||a[n])},week:{dow:1,doy:7}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t={1:"釤�",2:"釤�",3:"釤�",4:"釤�",5:"釤�",6:"釤�",7:"釤�",8:"釤�",9:"釤�",0:"釤�"},n={"釤�":"1","釤�":"2","釤�":"3","釤�":"4","釤�":"5","釤�":"6","釤�":"7","釤�":"8","釤�":"9","釤�":"0"},a;e.defineLocale("km",{months:"釣樶瀫釣氠灦_釣�釣会灅釤掅灄釤坃釣樶灨釣撫灦_釣樶焷釣熱灦_釣п灍釣椺灦_釣樶灧釣愥灮釣撫灦_釣�釣�釤掅瀫釣娽灦_釣熱灨釣犪灦_釣�釣夅煉釣夅灦_釣忈灮釣涐灦_釣溼灧釣呩煉釣嗎灧釣�釣禵釣掅煉釣撫灱".split("_"),monthsShort:"釣樶瀫釣氠灦_釣�釣会灅釤掅灄釤坃釣樶灨釣撫灦_釣樶焷釣熱灦_釣п灍釣椺灦_釣樶灧釣愥灮釣撫灦_釣�釣�釤掅瀫釣娽灦_釣熱灨釣犪灦_釣�釣夅煉釣夅灦_釣忈灮釣涐灦_釣溼灧釣呩煉釣嗎灧釣�釣禵釣掅煉釣撫灱".split("_"),weekdays:"釣⑨灦釣戓灧釣忈煉釣檁釣呩煇釣撫煉釣慱釣⑨瀯釤掅瀭釣夺灇_釣栣灮釣抇釣栣煉釣氠灎釣熱煉釣斸瀼釣丰煃_釣熱灮釣�釤掅灇_釣熱焻釣氠煃".split("_"),weekdaysShort:"釣⑨灦_釣卂釣釣朹釣栣煉釣歘釣熱灮_釣�".split("_"),weekdaysMin:"釣⑨灦_釣卂釣釣朹釣栣煉釣歘釣熱灮_釣�".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/釣栣煉釣氠灩釣�|釣涐煉釣勧灦釣�/,isPM:function(e){return e==="釣涐煉釣勧灦釣�"},meridiem:function(e,t,n){if(e<12)return"釣栣煉釣氠灩釣�";else return"釣涐煉釣勧灦釣�"},calendar:{sameDay:"[釣愥煉釣勧焹釣撫焷釤� 釣樶焿釤勧瀯] LT",nextDay:"[釣熱煉釣⑨焸釣� 釣樶焿釤勧瀯] LT",nextWeek:"dddd [釣樶焿釤勧瀯] LT",lastDay:"[釣樶煉釣熱灧釣涐灅釣丰瀴 釣樶焿釤勧瀯] LT",lastWeek:"dddd [釣熱灁釤掅瀼釣夺灎釤嶀灅釣会灀] [釣樶焿釤勧瀯] LT",sameElse:"L"},relativeTime:{future:"%s釣戓焵釣�",past:"%s釣樶灮釣�",s:"釣斸焿釣会灀釤掅灅釣夺灀釣溼灧釣撫灦釣戓灨",ss:"%d 釣溼灧釣撫灦釣戓灨",m:"釣樶灲釣欋灀釣夺瀾釣�",mm:"%d 釣撫灦釣戓灨",h:"釣樶灲釣欋灅釤夅焺釣�",hh:"%d 釣樶焿釤勧瀯",d:"釣樶灲釣欋瀽釤掅瀯釤�",dd:"%d 釣愥煉釣勧焹",M:"釣樶灲釣欋瀬釤�",MM:"%d 釣佱焸",y:"釣樶灲釣欋瀱釤掅灀釣夺焼",yy:"%d 釣嗎煉釣撫灦釤�"},dayOfMonthOrdinalParse:/釣戓灨\d{1,2}/,ordinal:"釣戓灨%d",preparse:function(e){return e.replace(/[釤♂煝釤a煠釤メ煢釤п煥釤┽煚]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t={1:"喑�",2:"喑�",3:"喑�",4:"喑�",5:"喑�",6:"喑�",7:"喑�",8:"喑�",9:"喑�",0:"喑�"},n={"喑�":"1","喑�":"2","喑�":"3","喑�":"4","喑�":"5","喑�":"6","喑�":"7","喑�":"8","喑�":"9","喑�":"0"},a;e.defineLocale("kn",{months:"嗖溹波嗖掂舶嗖縚嗖硢嗖硩嗖班驳嗖班部_嗖簿嗖班硩嗖氞硩_嗖忇勃喑嵿舶嗖苦膊喑峗嗖硢喑昣嗖溹硞嗖ㄠ硩_嗖溹硜嗖侧硢喑朹嗖嗋矖嗖膏硩嗖熰硩_嗖膏硢嗖硩嗖熰硢嗖傕铂嗖班硩_嗖呧矔喑嵿矡喑嗋硞喑曕铂嗖班硩_嗖ㄠ驳喑嗋矀嗖舶喑峗嗖∴部嗖膏硢嗖傕铂嗖班硩".split("_"),monthsShort:"嗖溹波_嗖硢嗖硩嗖癬嗖簿嗖班硩嗖氞硩_嗖忇勃喑嵿舶嗖苦膊喑峗嗖硢喑昣嗖溹硞嗖ㄠ硩_嗖溹硜嗖侧硢喑朹嗖嗋矖嗖膏硩嗖熰硩_嗖膏硢嗖硩嗖熰硢嗖俖嗖呧矔喑嵿矡喑嗋硞喑昣嗖ㄠ驳喑嗋矀_嗖∴部嗖膏硢嗖�".split("_"),monthsParseExact:true,weekdays:"嗖簿嗖ㄠ硜嗖掂簿嗖癬嗖膏硢喑傕硶嗖驳嗖距舶_嗖矀嗖椸渤嗖掂簿嗖癬嗖硜嗖о驳嗖距舶_嗖椸硜嗖班硜嗖掂簿嗖癬嗖多硜嗖曕硩嗖班驳嗖距舶_嗖多波嗖苦驳嗖距舶".split("_"),weekdaysShort:"嗖簿嗖ㄠ硜_嗖膏硢喑傕硶嗖甠嗖矀嗖椸渤_嗖硜嗖嗖椸硜嗖班硜_嗖多硜嗖曕硩嗖癬嗖多波嗖�".split("_"),weekdaysMin:"嗖簿_嗖膏硢喑傕硶_嗖矀_嗖硜_嗖椸硜_嗖多硜_嗖�".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[嗖囙矀嗖︵硜] LT",nextDay:"[嗖ㄠ簿嗖赤硢] LT",nextWeek:"dddd, LT",lastDay:"[嗖ㄠ部嗖ㄠ硩嗖ㄠ硢] LT",lastWeek:"[嗖曕硢喑傕波喑嗋帛] dddd, LT",sameElse:"L"},relativeTime:{future:"%s 嗖ㄠ矀嗖む舶",past:"%s 嗖灌部嗖傕拨喑�",s:"嗖曕硢嗖侧驳喑� 嗖曕硩嗖粪玻嗖椸渤喑�",ss:"%d 嗖膏硢嗖曕硢嗖傕病喑佮矖嗖赤硜",m:"嗖掄矀嗖︵硜 嗖ㄠ部嗖部嗖�",mm:"%d 嗖ㄠ部嗖部嗖�",h:"嗖掄矀嗖︵硜 嗖椸矀嗖熰硢",hh:"%d 嗖椸矀嗖熰硢",d:"嗖掄矀嗖︵硜 嗖︵部嗖�",dd:"%d 嗖︵部嗖�",M:"嗖掄矀嗖︵硜 嗖む部嗖傕矖嗖赤硜",MM:"%d 嗖む部嗖傕矖嗖赤硜",y:"嗖掄矀嗖︵硜 嗖掂舶喑嵿卜",yy:"%d 嗖掂舶喑嵿卜"},preparse:function(e){return e.replace(/[喑о敞喑┼唱喑超喑钞喑肠]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/嗖班簿嗖む硩嗖班部|嗖硢嗖赤部嗖椸硩嗖椸硢|嗖钵喑嵿帛嗖距补喑嵿波|嗖膏矀嗖溹硢/,meridiemHour:function(e,t){if(e===12)e=0;if(t==="嗖班簿嗖む硩嗖班部")return e<4?e:e+12;else if(t==="嗖硢嗖赤部嗖椸硩嗖椸硢")return e;else if(t==="嗖钵喑嵿帛嗖距补喑嵿波")return e>=10?e:e+12;else if(t==="嗖膏矀嗖溹硢")return e+12},meridiem:function(e,t,n){if(e<4)return"嗖班簿嗖む硩嗖班部";else if(e<10)return"嗖硢嗖赤部嗖椸硩嗖椸硢";else if(e<17)return"嗖钵喑嵿帛嗖距补喑嵿波";else if(e<20)return"嗖膏矀嗖溹硢";else return"嗖班簿嗖む硩嗖班部"},dayOfMonthOrdinalParse:/\d{1,2}(嗖ㄠ硢喑�)/,ordinal:function(e){return e+"嗖ㄠ硢喑�"},week:{dow:0,doy:6}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("ko",{months:"1鞗擾2鞗擾3鞗擾4鞗擾5鞗擾6鞗擾7鞗擾8鞗擾9鞗擾10鞗擾11鞗擾12鞗�".split("_"),monthsShort:"1鞗擾2鞗擾3鞗擾4鞗擾5鞗擾6鞗擾7鞗擾8鞗擾9鞗擾10鞗擾11鞗擾12鞗�".split("_"),weekdays:"鞚检殧鞚糭鞗旍殧鞚糭頇旍殧鞚糭靾橃殧鞚糭氇╈殧鞚糭旮堨殧鞚糭韱犾殧鞚�".split("_"),weekdaysShort:"鞚糭鞗擾頇擾靾榑氇旮坃韱�".split("_"),weekdaysMin:"鞚糭鞗擾頇擾靾榑氇旮坃韱�".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY雲� MMMM D鞚�",LLL:"YYYY雲� MMMM D鞚� A h:mm",LLLL:"YYYY雲� MMMM D鞚� dddd A h:mm",l:"YYYY.MM.DD.",ll:"YYYY雲� MMMM D鞚�",lll:"YYYY雲� MMMM D鞚� A h:mm",llll:"YYYY雲� MMMM D鞚� dddd A h:mm"},calendar:{sameDay:"鞓る姌 LT",nextDay:"雮挫澕 LT",nextWeek:"dddd LT",lastDay:"鞏挫牅 LT",lastWeek:"歆�雮滌< dddd LT",sameElse:"L"},relativeTime:{future:"%s 頉�",past:"%s 鞝�",s:"氇� 齑�",ss:"%d齑�",m:"1攵�",mm:"%d攵�",h:"頃� 鞁滉皠",hh:"%d鞁滉皠",d:"頃橂(",dd:"%d鞚�",M:"頃� 雼�",MM:"%d雼�",y:"鞚� 雲�",yy:"%d雲�"},dayOfMonthOrdinalParse:/\d{1,2}(鞚紎鞗攟欤�)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"鞚�";case"M":return e+"鞗�";case"w":case"W":return e+"欤�";default:return e}},meridiemParse:/鞓れ爠|鞓ろ泟/,isPM:function(e){return e==="鞓ろ泟"},meridiem:function(e,t,n){return e<12?"鞓れ爠":"鞓ろ泟"}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t={1:"佟",2:"佗",3:"伲",4:"伽",5:"佶",6:"佴",7:"侑",8:"侉",9:"侃",0:"贍"},n={"佟":"1","佗":"2","伲":"3","伽":"4","佶":"5","佴":"6","侑":"7","侉":"8","侃":"9","贍":"0"},a=["讴丕賳賵賳蹖 丿賵賵蹠賲","卮賵亘丕鬲","卅丕夭丕乇","賳蹖爻丕賳","卅丕蹖丕乇","丨賵夭蹠蹖乇丕賳","鬲蹠賲賲賵夭","卅丕亘","卅蹠蹖賱賵賵賱","鬲卮乇蹖賳蹖 蹖蹠賰蹠賲","鬲卮乇蹖賳蹖 丿賵賵蹠賲","賰丕賳賵賳蹖 蹖蹠讴蹠賲"],r;e.defineLocale("ku",{months:a,monthsShort:a,weekdays:"蹖賴鈥屬冐促団�屬呝呝団�宊丿賵賵卮賴鈥屬呝呝団�宊爻蹘卮賴鈥屬呝呝団�宊趩賵丕乇卮賴鈥屬呝呝団�宊倬蹘賳噩卮賴鈥屬呝呝団�宊賴賴鈥屰屬嗃宊卮賴鈥屬呝呝団��".split("_"),weekdaysShort:"蹖賴鈥屬冐促団�屬卂丿賵賵卮賴鈥屬卂爻蹘卮賴鈥屬卂趩賵丕乇卮賴鈥屬卂倬蹘賳噩卮賴鈥屬卂賴賴鈥屰屬嗃宊卮賴鈥屬呝呝団��".split("_"),weekdaysMin:"蹖_丿_爻_趩_倬_賴_卮".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/卅蹘賵丕乇賴鈥寍亘賴鈥屰屫з嗃�/,isPM:function(e){return/卅蹘賵丕乇賴鈥�/.test(e)},meridiem:function(e,t,n){if(e<12)return"亘賴鈥屰屫з嗃�";else return"卅蹘賵丕乇賴鈥�"},calendar:{sameDay:"[卅賴鈥屬呚臂� 賰丕鬲跇賲蹘乇] LT",nextDay:"[亘賴鈥屰屫з嗃� 賰丕鬲跇賲蹘乇] LT",nextWeek:"dddd [賰丕鬲跇賲蹘乇] LT",lastDay:"[丿賵蹘賳蹘 賰丕鬲跇賲蹘乇] LT",lastWeek:"dddd [賰丕鬲跇賲蹘乇] LT",sameElse:"L"},relativeTime:{future:"賱賴鈥� %s",past:"%s",s:"趩賴鈥屬嗀� 趩乇賰賴鈥屰屬団�屬�",ss:"趩乇賰賴鈥� %d",m:"蹖賴鈥屬� 禺賵賱賴鈥屬�",mm:"%d 禺賵賱賴鈥屬�",h:"蹖賴鈥屬� 賰丕鬲跇賲蹘乇",hh:"%d 賰丕鬲跇賲蹘乇",d:"蹖賴鈥屬� 跁蹎跇",dd:"%d 跁蹎跇",M:"蹖賴鈥屬� 賲丕賳诏",MM:"%d 賲丕賳诏",y:"蹖賴鈥屬� 爻丕诘",yy:"%d 爻丕诘"},preparse:function(e){return e.replace(/[佟佗伲伽佶佴侑侉侃贍]/g,function(e){return n[e]}).replace(/貙/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]}).replace(/,/g,"貙")},week:{dow:6,doy:12}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var a={0:"-褔爷",1:"-褔懈",2:"-褔懈",3:"-褔爷",4:"-褔爷",5:"-褔懈",6:"-褔褘",7:"-褔懈",8:"-褔懈",9:"-褔褍",10:"-褔褍",20:"-褔褘",30:"-褔褍",40:"-褔褘",50:"-褔爷",60:"-褔褘",70:"-褔懈",80:"-褔懈",90:"-褔褍",100:"-褔爷"},t;e.defineLocale("ky",{months:"褟薪胁邪褉褜_褎械胁褉邪谢褜_屑邪褉褌_邪锌褉械谢褜_屑邪泄_懈褞薪褜_懈褞谢褜_邪胁谐褍褋褌_褋械薪褌褟斜褉褜_芯泻褌褟斜褉褜_薪芯褟斜褉褜_写械泻邪斜褉褜".split("_"),monthsShort:"褟薪胁_褎械胁_屑邪褉褌_邪锌褉_屑邪泄_懈褞薪褜_懈褞谢褜_邪胁谐_褋械薪_芯泻褌_薪芯褟_写械泻".split("_"),weekdays:"袞械泻褕械屑斜懈_袛爷泄褕萤屑斜爷_楔械泄褕械屑斜懈_楔邪褉褕械屑斜懈_袘械泄褕械屑斜懈_袞褍屑邪_袠褕械屑斜懈".split("_"),weekdaysShort:"袞械泻_袛爷泄_楔械泄_楔邪褉_袘械泄_袞褍屑_袠褕械".split("_"),weekdaysMin:"袞泻_袛泄_楔泄_楔褉_袘泄_袞屑_袠褕".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[袘爷谐爷薪 褋邪邪褌] LT",nextDay:"[协褉褌械遥 褋邪邪褌] LT",nextWeek:"dddd [褋邪邪褌] LT",lastDay:"[袣械褔褝褝 褋邪邪褌] LT",lastWeek:"[莹褌泻萤薪 邪锌褌邪薪褘薪] dddd [泻爷薪爷] [褋邪邪褌] LT",sameElse:"L"},relativeTime:{future:"%s 懈褔懈薪写械",past:"%s 屑褍褉褍薪",s:"斜懈褉薪械褔械 褋械泻褍薪写",ss:"%d 褋械泻褍薪写",m:"斜懈褉 屑爷薪萤褌",mm:"%d 屑爷薪萤褌",h:"斜懈褉 褋邪邪褌",hh:"%d 褋邪邪褌",d:"斜懈褉 泻爷薪",dd:"%d 泻爷薪",M:"斜懈褉 邪泄",MM:"%d 邪泄",y:"斜懈褉 卸褘谢",yy:"%d 卸褘谢"},dayOfMonthOrdinalParse:/\d{1,2}-(褔懈|褔褘|褔爷|褔褍)/,ordinal:function(e){var t=e%10,n=e>=100?100:null;return e+(a[e]||a[t]||a[n])},week:{dow:1,doy:7}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+function t(e,t,n,a){var r={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return t?r[n][0]:r[n][1]}function n(e){var t=e.substr(0,e.indexOf(" "));if(r(t))return"a "+e;return"an "+e}function a(e){var t=e.substr(0,e.indexOf(" "));if(r(t))return"viru "+e;return"virun "+e}function r(e){e=parseInt(e,10);if(isNaN(e))return false;if(e<0)return true;else if(e<10){if(4<=e&&e<=7)return true;return false}else if(e<100){var t=e%10,n=e/10;if(t===0)return r(n);return r(t)}else if(e<1e4){while(e>=10)e=e/10;return r(e)}else{e=e/1e3;return r(e)}}var o;e.defineLocale("lb",{months:"Januar_Februar_M盲erz_Abr毛ll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:true,weekdays:"Sonndeg_M茅indeg_D毛nschdeg_M毛ttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._M茅._D毛._M毛._Do._Fr._Sa.".split("_"),weekdaysMin:"So_M茅_D毛_M毛_Do_Fr_Sa".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm [Auer]",LLLL:"dddd, D. MMMM YYYY H:mm [Auer]"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[G毛schter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:n,past:a,s:"e puer Sekonnen",ss:"%d Sekonnen",m:t,mm:"%d Minutten",h:t,hh:"%d Stonnen",d:t,dd:"%d Deeg",M:t,MM:"%d M茅int",y:t,yy:"%d Joer"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("lo",{months:"嗪∴罕嗪囙簛嗪簷_嗪佮焊嗪∴簽嗪瞋嗪∴旱嗪權翰_嗷�嗪∴邯嗪瞋嗪炧憾嗪斷邯嗪班簽嗪瞋嗪∴捍嗪栢焊嗪權翰_嗪佮粛嗪ム喊嗪佮夯嗪擾嗪捍嗪囙韩嗪瞋嗪佮罕嗪權簫嗪瞋嗪曕焊嗪ム翰_嗪炧喊嗪堗捍嗪乢嗪椸罕嗪權骇嗪�".split("_"),monthsShort:"嗪∴罕嗪囙簛嗪簷_嗪佮焊嗪∴簽嗪瞋嗪∴旱嗪權翰_嗷�嗪∴邯嗪瞋嗪炧憾嗪斷邯嗪班簽嗪瞋嗪∴捍嗪栢焊嗪權翰_嗪佮粛嗪ム喊嗪佮夯嗪擾嗪捍嗪囙韩嗪瞋嗪佮罕嗪權簫嗪瞋嗪曕焊嗪ム翰_嗪炧喊嗪堗捍嗪乢嗪椸罕嗪權骇嗪�".split("_"),weekdays:"嗪翰嗪椸捍嗪擾嗪堗罕嗪檁嗪罕嗪囙簞嗪侧簷_嗪炧焊嗪擾嗪炧喊嗪罕嗪擾嗪焊嗪乢嗷�嗪夯嗪�".split("_"),weekdaysShort:"嗪椸捍嗪擾嗪堗罕嗪檁嗪罕嗪囙簞嗪侧簷_嗪炧焊嗪擾嗪炧喊嗪罕嗪擾嗪焊嗪乢嗷�嗪夯嗪�".split("_"),weekdaysMin:"嗪梍嗪坃嗪簞_嗪瀇嗪炧韩_嗪簛_嗪�".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"嗪о罕嗪檇ddd D MMMM YYYY HH:mm"},meridiemParse:/嗪曕涵嗪權粈嗪娻夯嗷夃翰|嗪曕涵嗪權粊嗪ム簢/,isPM:function(e){return e==="嗪曕涵嗪權粊嗪ム簢"},meridiem:function(e,t,n){if(e<12)return"嗪曕涵嗪權粈嗪娻夯嗷夃翰";else return"嗪曕涵嗪權粊嗪ム簢"},calendar:{sameDay:"[嗪∴悍嗷夃簷嗪掂粔嗷�嗪о亥嗪瞉 LT",nextDay:"[嗪∴悍嗷夃涵嗪粪粓嗪權粈嗪о亥嗪瞉 LT",nextWeek:"[嗪о罕嗪橾dddd[嗷溹粔嗪侧粈嗪о亥嗪瞉 LT",lastDay:"[嗪∴悍嗷夃骇嗪侧簷嗪權旱嗷夃粈嗪о亥嗪瞉 LT",lastWeek:"[嗪о罕嗪橾dddd[嗷佮亥嗷夃骇嗪權旱嗷夃粈嗪о亥嗪瞉 LT",sameElse:"L"},relativeTime:{future:"嗪旱嗪� %s",past:"%s嗪溹粓嗪侧簷嗪∴翰",s:"嗪氞粛嗷堗粈嗪椸夯嗷堗翰嗷冟簲嗪о捍嗪權翰嗪椸旱",ss:"%d 嗪о捍嗪權翰嗪椸旱",m:"1 嗪權翰嗪椸旱",mm:"%d 嗪權翰嗪椸旱",h:"1 嗪娻夯嗷堗骇嗷傕骸嗪�",hh:"%d 嗪娻夯嗷堗骇嗷傕骸嗪�",d:"1 嗪∴悍嗷�",dd:"%d 嗪∴悍嗷�",M:"1 嗷�嗪斷悍嗪簷",MM:"%d 嗷�嗪斷悍嗪簷",y:"1 嗪涏旱",yy:"%d 嗪涏旱"},dayOfMonthOrdinalParse:/(嗪椸旱嗷�)\d{1,2}/,ordinal:function(e){return"嗪椸旱嗷�"+e}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t={ss:"sekund臈_sekund啪i懦_sekundes",m:"minut臈_minut臈s_minut臋",mm:"minut臈s_minu膷i懦_minutes",h:"valanda_valandos_valand膮",hh:"valandos_valand懦_valandas",d:"diena_dienos_dien膮",dd:"dienos_dien懦_dienas",M:"m臈nuo_m臈nesio_m臈nes寞",MM:"m臈nesiai_m臈nesi懦_m臈nesius",y:"metai_met懦_metus",yy:"metai_met懦_metus"},n;function a(e,t,n,a){if(t)return"kelios sekund臈s";else return a?"keli懦 sekund啪i懦":"kelias sekundes"}function o(e,t,n,a){return t?l(n)[0]:a?l(n)[1]:l(n)[2]}function i(e){return e%10===0||e>10&&e<20}function l(e){return t[e].split("_")}function r(e,t,n,a){var r=e+" ";if(e===1)return r+o(e,t,n[0],a);else if(t)return r+(i(e)?l(n)[1]:l(n)[0]);else if(a)return r+l(n)[1];else return r+(i(e)?l(n)[1]:l(n)[2])}e.defineLocale("lt",{months:{format:"sausio_vasario_kovo_baland啪io_gegu啪臈s_bir啪elio_liepos_rugpj奴膷io_rugs臈jo_spalio_lapkri膷io_gruod啪io".split("_"),standalone:"sausis_vasaris_kovas_balandis_gegu啪臈_bir啪elis_liepa_rugpj奴tis_rugs臈jis_spalis_lapkritis_gruodis".split("_"),isFormat:/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/},monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:{format:"sekmadien寞_pirmadien寞_antradien寞_tre膷iadien寞_ketvirtadien寞_penktadien寞_拧e拧tadien寞".split("_"),standalone:"sekmadienis_pirmadienis_antradienis_tre膷iadienis_ketvirtadienis_penktadienis_拧e拧tadienis".split("_"),isFormat:/dddd HH:mm/},weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_艩e拧".split("_"),weekdaysMin:"S_P_A_T_K_Pn_艩".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},calendar:{sameDay:"[艩iandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Pra臈jus寞] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prie拧 %s",s:a,ss:r,m:o,mm:r,h:o,hh:r,d:o,dd:r,M:o,MM:r,y:o,yy:r},dayOfMonthOrdinalParse:/\d{1,2}-oji/,ordinal:function(e){return e+"-oji"},week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var a={ss:"sekundes_sekund膿m_sekunde_sekundes".split("_"),m:"min奴tes_min奴t膿m_min奴te_min奴tes".split("_"),mm:"min奴tes_min奴t膿m_min奴te_min奴tes".split("_"),h:"stundas_stund膩m_stunda_stundas".split("_"),hh:"stundas_stund膩m_stunda_stundas".split("_"),d:"dienas_dien膩m_diena_dienas".split("_"),dd:"dienas_dien膩m_diena_dienas".split("_"),M:"m膿ne拧a_m膿ne拧iem_m膿nesis_m膿ne拧i".split("_"),MM:"m膿ne拧a_m膿ne拧iem_m膿nesis_m膿ne拧i".split("_"),y:"gada_gadiem_gads_gadi".split("_"),yy:"gada_gadiem_gads_gadi".split("_")},t;function r(e,t,n){if(n)return t%10===1&&t%100!==11?e[2]:e[3];else return t%10===1&&t%100!==11?e[0]:e[1]}function n(e,t,n){return e+" "+r(a[n],e,t)}function o(e,t,n){return r(a[n],e,t)}function i(e,t){return t?"da啪as sekundes":"da啪膩m sekund膿m"}e.defineLocale("lv",{months:"janv膩ris_febru膩ris_marts_apr墨lis_maijs_j奴nijs_j奴lijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_j奴n_j奴l_aug_sep_okt_nov_dec".split("_"),weekdays:"sv膿tdiena_pirmdiena_otrdiena_tre拧diena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},calendar:{sameDay:"[艩odien pulksten] LT",nextDay:"[R墨t pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pag膩ju拧膩] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"p膿c %s",past:"pirms %s",s:i,ss:n,m:o,mm:n,h:o,hh:n,d:o,dd:n,M:o,MM:n,y:o,yy:n},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var r={words:{ss:["sekund","sekunda","sekundi"],m:["jedan minut","jednog minuta"],mm:["minut","minuta","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mjesec","mjeseca","mjeseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(e,t){return e===1?t[0]:e>=2&&e<=4?t[1]:t[2]},translate:function(e,t,n){var a=r.words[n];if(n.length===1)return t?a[0]:a[1];else return e+" "+r.correctGrammaticalCase(e,a)}},t;e.defineLocale("me",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:true,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_膷etvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._膷et._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_膷e_pe_su".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sjutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju膷e u] LT",lastWeek:function(){var e=["[pro拧le] [nedjelje] [u] LT","[pro拧log] [ponedjeljka] [u] LT","[pro拧log] [utorka] [u] LT","[pro拧le] [srijede] [u] LT","[pro拧log] [膷etvrtka] [u] LT","[pro拧log] [petka] [u] LT","[pro拧le] [subote] [u] LT"];return e[this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"nekoliko sekundi",ss:r.translate,m:r.translate,mm:r.translate,h:r.translate,hh:r.translate,d:"dan",dd:r.translate,M:"mjesec",MM:r.translate,y:"godinu",yy:r.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("mi",{months:"Kohi-t膩te_Hui-tanguru_Pout奴-te-rangi_Paenga-wh膩wh膩_Haratua_Pipiri_H艒ngoingoi_Here-turi-k艒k膩_Mahuru_Whiringa-膩-nuku_Whiringa-膩-rangi_Hakihea".split("_"),monthsShort:"Kohi_Hui_Pou_Pae_Hara_Pipi_H艒ngoi_Here_Mahu_Whi-nu_Whi-ra_Haki".split("_"),monthsRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,weekdays:"R膩tapu_Mane_T奴rei_Wenerei_T膩ite_Paraire_H膩tarei".split("_"),weekdaysShort:"Ta_Ma_T奴_We_T膩i_Pa_H膩".split("_"),weekdaysMin:"Ta_Ma_T奴_We_T膩i_Pa_H膩".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [i] HH:mm",LLLL:"dddd, D MMMM YYYY [i] HH:mm"},calendar:{sameDay:"[i teie mahana, i] LT",nextDay:"[apopo i] LT",nextWeek:"dddd [i] LT",lastDay:"[inanahi i] LT",lastWeek:"dddd [whakamutunga i] LT",sameElse:"L"},relativeTime:{future:"i roto i %s",past:"%s i mua",s:"te h膿kona ruarua",ss:"%d h膿kona",m:"he meneti",mm:"%d meneti",h:"te haora",hh:"%d haora",d:"he ra",dd:"%d ra",M:"he marama",MM:"%d marama",y:"he tau",yy:"%d tau"},dayOfMonthOrdinalParse:/\d{1,2}潞/,ordinal:"%d潞",week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("mk",{months:"褬邪薪褍邪褉懈_褎械胁褉褍邪褉懈_屑邪褉褌_邪锌褉懈谢_屑邪褬_褬褍薪懈_褬褍谢懈_邪胁谐褍褋褌_褋械锌褌械屑胁褉懈_芯泻褌芯屑胁褉懈_薪芯械屑胁褉懈_写械泻械屑胁褉懈".split("_"),monthsShort:"褬邪薪_褎械胁_屑邪褉_邪锌褉_屑邪褬_褬褍薪_褬褍谢_邪胁谐_褋械锌_芯泻褌_薪芯械_写械泻".split("_"),weekdays:"薪械写械谢邪_锌芯薪械写械谢薪懈泻_胁褌芯褉薪懈泻_褋褉械写邪_褔械褌胁褉褌芯泻_锌械褌芯泻_褋邪斜芯褌邪".split("_"),weekdaysShort:"薪械写_锌芯薪_胁褌芯_褋褉械_褔械褌_锌械褌_褋邪斜".split("_"),weekdaysMin:"薪e_锌o_胁褌_褋褉_褔械_锌械_褋a".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[袛械薪械褋 胁芯] LT",nextDay:"[校褌褉械 胁芯] LT",nextWeek:"[袙芯] dddd [胁芯] LT",lastDay:"[袙褔械褉邪 胁芯] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[袠蟹屑懈薪邪褌邪褌邪] dddd [胁芯] LT";case 1:case 2:case 4:case 5:return"[袠蟹屑懈薪邪褌懈芯褌] dddd [胁芯] LT"}},sameElse:"L"},relativeTime:{future:"蟹邪 %s",past:"锌褉械写 %s",s:"薪械泻芯谢泻褍 褋械泻褍薪写懈",ss:"%d 褋械泻褍薪写懈",m:"械写薪邪 屑懈薪褍褌邪",mm:"%d 屑懈薪褍褌懈",h:"械写械薪 褔邪褋",hh:"%d 褔邪褋邪",d:"械写械薪 写械薪",dd:"%d 写械薪邪",M:"械写械薪 屑械褋械褑",MM:"%d 屑械褋械褑懈",y:"械写薪邪 谐芯写懈薪邪",yy:"%d 谐芯写懈薪懈"},dayOfMonthOrdinalParse:/\d{1,2}-(械胁|械薪|褌懈|胁懈|褉懈|屑懈)/,ordinal:function(e){var t=e%10,n=e%100;if(e===0)return e+"-械胁";else if(n===0)return e+"-械薪";else if(n>10&&n<20)return e+"-褌懈";else if(t===1)return e+"-胁懈";else if(t===2)return e+"-褉懈";else if(t===7||t===8)return e+"-屑懈";else return e+"-褌懈"},week:{dow:1,doy:7}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("ml",{months:"啻溹川嗟佮吹啻班纯_啻祮啻祶啻班祦啻掂窗啻縚啻淳嗟监礆嗟嵿礆嗟峗啻忇椽嗟嵿窗啻苦到_啻祰啻祶_啻溹祩嗟篲啻溹祩啻侧祱_啻撪礂啻膏祶啻编祶啻编祶_啻膏祮啻祶啻编祶啻编磦啻导_啻掄磿嗟嵿礋嗟嬥船嗟糭啻ㄠ吹啻傕船嗟糭啻∴纯啻膏磦啻导".split("_"),monthsShort:"啻溹川嗟�._啻祮啻祶啻班祦._啻淳嗟�._啻忇椽嗟嵿窗啻�._啻祰啻祶_啻溹祩嗟篲啻溹祩啻侧祱._啻撪礂._啻膏祮啻祶啻编祶啻�._啻掄磿嗟嵿礋嗟�._啻ㄠ吹啻�._啻∴纯啻膏磦.".split("_"),monthsParseExact:true,weekdays:"啻炧淳啻幢啻距创嗟嵿礆_啻む纯啻權祶啻曕闯啻距创嗟嵿礆_啻氞祳啻掂祶啻掂淳啻脆祶啻歘啻祦啻о川啻距创嗟嵿礆_啻掂祶啻淳啻脆淳啻脆祶啻歘啻掂祮啻赤祶啻赤纯啻淳啻脆祶啻歘啻多川啻苦疮啻距创嗟嵿礆".split("_"),weekdaysShort:"啻炧淳啻导_啻む纯啻權祶啻曕稻_啻氞祳啻掂祶啻礯啻祦啻о祷_啻掂祶啻淳啻脆磦_啻掂祮啻赤祶啻赤纯_啻多川啻�".split("_"),weekdaysMin:"啻炧淳_啻む纯_啻氞祳_啻祦_啻掂祶啻淳_啻掂祮_啻�".split("_"),longDateFormat:{LT:"A h:mm -啻ㄠ祦",LTS:"A h:mm:ss -啻ㄠ祦",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm -啻ㄠ祦",LLLL:"dddd, D MMMM YYYY, A h:mm -啻ㄠ祦"},calendar:{sameDay:"[啻囙川嗟嵿川嗟峕 LT",nextDay:"[啻ㄠ淳啻赤祮] LT",nextWeek:"dddd, LT",lastDay:"[啻囙川嗟嵿川啻侧祮] LT",lastWeek:"[啻曕创啻苦礊嗟嵿礊] dddd, LT",sameElse:"L"},relativeTime:{future:"%s 啻曕创啻苦礊嗟嵿礊嗟�",past:"%s 啻祦嗟秽椽嗟�",s:"啻呧到啻� 啻ㄠ纯啻纯啻粪礄嗟嵿礄嗟�",ss:"%d 啻膏祮啻曕祶啻曕祷啻∴祶",m:"啻掄窗嗟� 啻纯啻ㄠ纯啻编祶啻编祶",mm:"%d 啻纯啻ㄠ纯啻编祶啻编祶",h:"啻掄窗嗟� 啻矗啻苦磿嗟嵿磿嗟傕导",hh:"%d 啻矗啻苦磿嗟嵿磿嗟傕导",d:"啻掄窗嗟� 啻︵纯啻掂锤啻�",dd:"%d 啻︵纯啻掂锤啻�",M:"啻掄窗嗟� 啻淳啻膏磦",MM:"%d 啻淳啻膏磦",y:"啻掄窗嗟� 啻掂导啻粪磦",yy:"%d 啻掂导啻粪磦"},meridiemParse:/啻班淳啻む祶啻班纯|啻班淳啻掂纯啻侧祮|啻夃礆嗟嵿礆 啻曕创啻苦礊嗟嵿礊嗟峾啻掂祱啻曕祦啻ㄠ祶啻ㄠ祰啻班磦|啻班淳啻む祶啻班纯/i,meridiemHour:function(e,t){if(e===12)e=0;if(t==="啻班淳啻む祶啻班纯"&&e>=4||t==="啻夃礆嗟嵿礆 啻曕创啻苦礊嗟嵿礊嗟�"||t==="啻掂祱啻曕祦啻ㄠ祶啻ㄠ祰啻班磦")return e+12;else return e},meridiem:function(e,t,n){if(e<4)return"啻班淳啻む祶啻班纯";else if(e<12)return"啻班淳啻掂纯啻侧祮";else if(e<17)return"啻夃礆嗟嵿礆 啻曕创啻苦礊嗟嵿礊嗟�";else if(e<20)return"啻掂祱啻曕祦啻ㄠ祶啻ㄠ祰啻班磦";else return"啻班淳啻む祶啻班纯"}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+function t(e,t,n,a){switch(n){case"s":return t?"褏褝写褏褝薪 褋械泻褍薪写":"褏褝写褏褝薪 褋械泻褍薪写褘薪";case"ss":return e+(t?" 褋械泻褍薪写":" 褋械泻褍薪写褘薪");case"m":case"mm":return e+(t?" 屑懈薪褍褌":" 屑懈薪褍褌褘薪");case"h":case"hh":return e+(t?" 褑邪谐":" 褑邪谐懈泄薪");case"d":case"dd":return e+(t?" 萤写萤褉":" 萤写褉懈泄薪");case"M":case"MM":return e+(t?" 褋邪褉":" 褋邪褉褘薪");case"y":case"yy":return e+(t?" 卸懈谢":" 卸懈谢懈泄薪");default:return e}}var n;e.defineLocale("mn",{months:"袧褝谐写爷谐褝褝褉 褋邪褉_啸芯褢褉写褍谐邪邪褉 褋邪褉_袚褍褉邪胁写褍谐邪邪褉 褋邪褉_袛萤褉萤胁写爷谐褝褝褉 褋邪褉_孝邪胁写褍谐邪邪褉 褋邪褉_袟褍褉谐邪写褍谐邪邪褉 褋邪褉_袛芯谢写褍谐邪邪褉 褋邪褉_袧邪泄屑写褍谐邪邪褉 褋邪褉_袝褋写爷谐褝褝褉 褋邪褉_袗褉邪胁写褍谐邪邪褉 褋邪褉_袗褉胁邪薪 薪褝谐写爷谐褝褝褉 褋邪褉_袗褉胁邪薪 褏芯褢褉写褍谐邪邪褉 褋邪褉".split("_"),monthsShort:"1 褋邪褉_2 褋邪褉_3 褋邪褉_4 褋邪褉_5 褋邪褉_6 褋邪褉_7 褋邪褉_8 褋邪褉_9 褋邪褉_10 褋邪褉_11 褋邪褉_12 褋邪褉".split("_"),monthsParseExact:true,weekdays:"袧褟屑_袛邪胁邪邪_袦褟谐屑邪褉_袥褏邪谐胁邪_袩爷褉褝胁_袘邪邪褋邪薪_袘褟屑斜邪".split("_"),weekdaysShort:"袧褟屑_袛邪胁_袦褟谐_袥褏邪_袩爷褉_袘邪邪_袘褟屑".split("_"),weekdaysMin:"袧褟_袛邪_袦褟_袥褏_袩爷_袘邪_袘褟".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY 芯薪褘 MMMM褘薪 D",LLL:"YYYY 芯薪褘 MMMM褘薪 D HH:mm",LLLL:"dddd, YYYY 芯薪褘 MMMM褘薪 D HH:mm"},meridiemParse:/耶莹|耶啸/i,isPM:function(e){return e==="耶啸"},meridiem:function(e,t,n){if(e<12)return"耶莹";else return"耶啸"},calendar:{sameDay:"[莹薪萤萤写萤褉] LT",nextDay:"[袦邪褉谐邪邪褕] LT",nextWeek:"[袠褉褝褏] dddd LT",lastDay:"[莹褔懈谐写萤褉] LT",lastWeek:"[莹薪谐萤褉褋萤薪] dddd LT",sameElse:"L"},relativeTime:{future:"%s 写邪褉邪邪",past:"%s 萤屑薪萤",s:t,ss:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2} 萤写萤褉/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+" 萤写萤褉";default:return e}}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t={1:"啷�",2:"啷�",3:"啷�",4:"啷�",5:"啷�",6:"啷�",7:"啷�",8:"啷�",9:"啷�",0:"啷�"},n={"啷�":"1","啷�":"2","啷�":"3","啷�":"4","啷�":"5","啷�":"6","啷�":"7","啷�":"8","啷�":"9","啷�":"0"},a;function r(e,t,n,a){var r="";if(t)switch(n){case"s":r="啶曕ぞ啶灌 啶膏啶曕啶�";break;case"ss":r="%d 啶膏啶曕啶�";break;case"m":r="啶忇 啶た啶ㄠた啶�";break;case"mm":r="%d 啶た啶ㄠた啶熰";break;case"h":r="啶忇 啶むぞ啶�";break;case"hh":r="%d 啶むぞ啶�";break;case"d":r="啶忇 啶︵た啶掂じ";break;case"dd":r="%d 啶︵た啶掂じ";break;case"M":r="啶忇 啶す啶苦え啶�";break;case"MM":r="%d 啶す啶苦え啷�";break;case"y":r="啶忇 啶掂ぐ啷嵿し";break;case"yy":r="%d 啶掂ぐ啷嵿し啷�";break}else switch(n){case"s":r="啶曕ぞ啶灌 啶膏啶曕啶︵ぞ啶�";break;case"ss":r="%d 啶膏啶曕啶︵ぞ啶�";break;case"m":r="啶忇啶� 啶た啶ㄠた啶熰ぞ";break;case"mm":r="%d 啶た啶ㄠた啶熰ぞ啶�";break;case"h":r="啶忇啶� 啶むぞ啶膏ぞ";break;case"hh":r="%d 啶むぞ啶膏ぞ啶�";break;case"d":r="啶忇啶� 啶︵た啶掂じ啶�";break;case"dd":r="%d 啶︵た啶掂じ啶距";break;case"M":r="啶忇啶� 啶す啶苦え啷嵿く啶�";break;case"MM":r="%d 啶す啶苦え啷嵿く啶距";break;case"y":r="啶忇啶� 啶掂ぐ啷嵿し啶�";break;case"yy":r="%d 啶掂ぐ啷嵿し啶距";break}return r.replace(/%d/i,e)}e.defineLocale("mr",{months:"啶溹ぞ啶ㄠ啶掂ぞ啶班_啶啶啶班啶掂ぞ啶班_啶ぞ啶班啶歘啶忇お啷嵿ぐ啶苦げ_啶_啶溹啶╛啶溹啶侧_啶戉啶膏啶焈啶膏お啷嵿啷囙啶ぐ_啶戉啷嵿啷嬥が啶癬啶ㄠ啶掂啶灌啶傕が啶癬啶∴た啶膏啶傕が啶�".split("_"),monthsShort:"啶溹ぞ啶ㄠ._啶啶啶班._啶ぞ啶班啶�._啶忇お啷嵿ぐ啶�._啶._啶溹啶�._啶溹啶侧._啶戉._啶膏お啷嵿啷囙._啶戉啷嵿啷�._啶ㄠ啶掂啶灌啶�._啶∴た啶膏啶�.".split("_"),monthsParseExact:true,weekdays:"啶班さ啶苦さ啶距ぐ_啶膏啶さ啶距ぐ_啶啶椸こ啶掂ぞ啶癬啶啶оさ啶距ぐ_啶椸啶班啶掂ぞ啶癬啶多啶曕啶班さ啶距ぐ_啶多え啶苦さ啶距ぐ".split("_"),weekdaysShort:"啶班さ啶縚啶膏啶甠啶啶椸こ_啶啶啶椸啶班_啶多啶曕啶癬啶多え啶�".split("_"),weekdaysMin:"啶癬啶膏_啶_啶_啶椸_啶多_啶�".split("_"),longDateFormat:{LT:"A h:mm 啶掂ぞ啶溹い啶�",LTS:"A h:mm:ss 啶掂ぞ啶溹い啶�",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm 啶掂ぞ啶溹い啶�",LLLL:"dddd, D MMMM YYYY, A h:mm 啶掂ぞ啶溹い啶�"},calendar:{sameDay:"[啶嗋] LT",nextDay:"[啶夃う啷嵿く啶綸 LT",nextWeek:"dddd, LT",lastDay:"[啶曕ぞ啶瞉 LT",lastWeek:"[啶ぞ啶椸啶瞉 dddd, LT",sameElse:"L"},relativeTime:{future:"%s啶ぇ啷嵿く啷�",past:"%s啶啶班啶掂",s:r,ss:r,m:r,mm:r,h:r,hh:r,d:r,dd:r,M:r,MM:r,y:r,yy:r},preparse:function(e){return e.replace(/[啷оエ啷┼オ啷ガ啷ギ啷ウ]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/啶す啶距啷噟啶膏啶距こ啷�|啶︵啶ぞ啶班|啶膏ぞ啶啶曕ぞ啶赤|啶班ぞ啶む啶班/,meridiemHour:function(e,t){if(e===12)e=0;if(t==="啶す啶距啷�"||t==="啶膏啶距こ啷�")return e;else if(t==="啶︵啶ぞ啶班"||t==="啶膏ぞ啶啶曕ぞ啶赤"||t==="啶班ぞ啶む啶班")return e>=12?e:e+12},meridiem:function(e,t,n){if(e>=0&&e<6)return"啶す啶距啷�";else if(e<12)return"啶膏啶距こ啷�";else if(e<17)return"啶︵啶ぞ啶班";else if(e<20)return"啶膏ぞ啶啶曕ぞ啶赤";else return"啶班ぞ啶む啶班"},week:{dow:0,doy:6}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("ms",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(e,t){if(e===12)e=0;if(t==="pagi")return e;else if(t==="tengahari")return e>=11?e:e+12;else if(t==="petang"||t==="malam")return e+12},meridiem:function(e,t,n){if(e<11)return"pagi";else if(e<15)return"tengahari";else if(e<19)return"petang";else return"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(e,t){if(e===12)e=0;if(t==="pagi")return e;else if(t==="tengahari")return e>=11?e:e+12;else if(t==="petang"||t==="malam")return e+12},meridiem:function(e,t,n){if(e<11)return"pagi";else if(e<15)return"tengahari";else if(e<19)return"petang";else return"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("mt",{months:"Jannar_Frar_Marzu_April_Mejju_臓unju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Di膵embru".split("_"),monthsShort:"Jan_Fra_Mar_Apr_Mej_臓un_Lul_Aww_Set_Ott_Nov_Di膵".split("_"),weekdays:"Il-摩add_It-Tnejn_It-Tlieta_L-Erbg魔a_Il-摩amis_Il-臓img魔a_Is-Sibt".split("_"),weekdaysShort:"摩ad_Tne_Tli_Erb_摩am_臓im_Sib".split("_"),weekdaysMin:"摩a_Tn_Tl_Er_摩a_臓i_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Illum fil-]LT",nextDay:"[G魔ada fil-]LT",nextWeek:"dddd [fil-]LT",lastDay:"[Il-biera魔 fil-]LT",lastWeek:"dddd [li g魔adda] [fil-]LT",sameElse:"L"},relativeTime:{future:"f鈥� %s",past:"%s ilu",s:"ftit sekondi",ss:"%d sekondi",m:"minuta",mm:"%d minuti",h:"sieg魔a",hh:"%d sieg魔at",d:"摹urnata",dd:"%d 摹ranet",M:"xahar",MM:"%d xhur",y:"sena",yy:"%d sni"},dayOfMonthOrdinalParse:/\d{1,2}潞/,ordinal:"%d潞",week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t={1:"醽�",2:"醽�",3:"醽�",4:"醽�",5:"醽�",6:"醽�",7:"醽�",8:"醽�",9:"醽�",0:"醽�"},n={"醽�":"1","醽�":"2","醽�":"3","醽�":"4","醽�":"5","醽�":"6","醽�":"7","醽�":"8","醽�":"9","醽�":"0"},a;e.defineLocale("my",{months:"醼囜�斸�横�斸�濁��涐�甠醼栣�贬�栣�贬��横�濁��涐�甠醼欋�愥�篲醼п�曖�坚�甠醼欋�盻醼囜�结�斸�篲醼囜�搬�溼���勧�篲醼炨�坚�傖��愥�篲醼呩��醼横�愥�勧�横�樶�琠醼♂�贬���醼横�愥���樶�琠醼斸���濁�勧�横�樶�琠醼掅��囜�勧�横�樶��".split("_"),monthsShort:"醼囜�斸�篲醼栣�盻醼欋�愥�篲醼曖�坚�甠醼欋�盻醼囜�结�斸�篲醼溼���勧�篲醼炨�糭醼呩��醼篲醼♂�贬���醼篲醼斸��痏醼掅��".split("_"),weekdays:"醼愥�斸�勧�横�贯�傖�斸�结�盻醼愥�斸�勧�横�贯�溼�琠醼♂�勧�横�贯�傖�玙醼椺��掅�贯�撫�熱�搬�竉醼�醼坚��炨�曖�愥�贬�竉醼炨�贬���醼坚�琠醼呩�斸��".split("_"),weekdaysShort:"醼斸�结�盻醼溼�琠醼傖�玙醼熱�搬�竉醼�醼坚�琠醼炨�贬�琠醼斸��".split("_"),weekdaysMin:"醼斸�结�盻醼溼�琠醼傖�玙醼熱�搬�竉醼�醼坚�琠醼炨�贬�琠醼斸��".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[醼氠�斸��.] LT [醼欋�踞�琞",nextDay:"[醼欋�斸��醼横�栣�坚�斸�篯 LT [醼欋�踞�琞",nextWeek:"dddd LT [醼欋�踞�琞",lastDay:"[醼欋�斸��.醼�] LT [醼欋�踞�琞",lastWeek:"[醼曖�坚��羔�佱�册�丰�炨�贬�琞 dddd LT [醼欋�踞�琞",sameElse:"L"},relativeTime:{future:"醼溼��欋�娽�横�� %s 醼欋�踞��",past:"醼溼�结�斸�横�佱�册�丰�炨�贬�� %s 醼�",s:"醼呩��醼贯��醼斸��.醼♂�斸�娽�横�羔�勧�氠��",ss:"%d 醼呩��醼贯��醼斸�丰��",m:"醼愥�呩�横�欋��斸�呩��",mm:"%d 醼欋��斸�呩��",h:"醼愥�呩�横�斸��涐��",hh:"%d 醼斸��涐��",d:"醼愥�呩�横�涐��醼�",dd:"%d 醼涐��醼�",M:"醼愥�呩�横��",MM:"%d 醼�",y:"醼愥�呩�横�斸�踞�呩��",yy:"%d 醼斸�踞�呩��"},preparse:function(e){return e.replace(/[醽佱亗醽冡亜醽呩亞醽囜亪醽夅亐]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:true,weekdays:"s酶ndag_mandag_tirsdag_onsdag_torsdag_fredag_l酶rdag".split("_"),weekdaysShort:"s酶._ma._ti._on._to._fr._l酶.".split("_"),weekdaysMin:"s酶_ma_ti_on_to_fr_l酶".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i g氓r kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",ss:"%d sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",w:"en uke",ww:"%d uker",M:"en m氓ned",MM:"%d m氓neder",y:"ett 氓r",yy:"%d 氓r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t={1:"啷�",2:"啷�",3:"啷�",4:"啷�",5:"啷�",6:"啷�",7:"啷�",8:"啷�",9:"啷�",0:"啷�"},n={"啷�":"1","啷�":"2","啷�":"3","啷�":"4","啷�":"5","啷�":"6","啷�":"7","啷�":"8","啷�":"9","啷�":"0"},a;e.defineLocale("ne",{months:"啶溹え啶掂ぐ啷�_啶啶啶班啶掂ぐ啷�_啶ぞ啶班啶歘啶呧お啷嵿ぐ啶苦げ_啶_啶溹啶╛啶溹啶侧ぞ啶坃啶呧啶粪啶焈啶膏啶啶熰啶啶ぐ_啶呧啷嵿啷嬥が啶癬啶ㄠ啶啶啶ぐ_啶∴た啶膏啶啶ぐ".split("_"),monthsShort:"啶溹え._啶啶啶班._啶ぞ啶班啶歘啶呧お啷嵿ぐ啶�._啶_啶溹啶╛啶溹啶侧ぞ啶�._啶呧._啶膏啶啶�._啶呧啷嵿啷�._啶ㄠ啶._啶∴た啶膏.".split("_"),monthsParseExact:true,weekdays:"啶嗋啶むが啶距ぐ_啶膏啶が啶距ぐ_啶啷嵿啶侧が啶距ぐ_啶啶оが啶距ぐ_啶た啶灌た啶ぞ啶癬啶多啶曕啶班が啶距ぐ_啶多え啶苦が啶距ぐ".split("_"),weekdaysShort:"啶嗋啶�._啶膏啶�._啶啷嵿啶�._啶啶�._啶た啶灌た._啶多啶曕啶�._啶多え啶�.".split("_"),weekdaysMin:"啶�._啶膏._啶._啶._啶た._啶多._啶�.".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"A啶曕 h:mm 啶啷�",LTS:"A啶曕 h:mm:ss 啶啷�",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A啶曕 h:mm 啶啷�",LLLL:"dddd, D MMMM YYYY, A啶曕 h:mm 啶啷�"},preparse:function(e){return e.replace(/[啷оエ啷┼オ啷ガ啷ギ啷ウ]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/啶班ぞ啶むた|啶た啶灌ぞ啶▅啶︵た啶夃啶膏|啶膏ぞ啶佮/,meridiemHour:function(e,t){if(e===12)e=0;if(t==="啶班ぞ啶むた")return e<4?e:e+12;else if(t==="啶た啶灌ぞ啶�")return e;else if(t==="啶︵た啶夃啶膏")return e>=10?e:e+12;else if(t==="啶膏ぞ啶佮")return e+12},meridiem:function(e,t,n){if(e<3)return"啶班ぞ啶むた";else if(e<12)return"啶た啶灌ぞ啶�";else if(e<16)return"啶︵た啶夃啶膏";else if(e<20)return"啶膏ぞ啶佮";else return"啶班ぞ啶むた"},calendar:{sameDay:"[啶嗋] LT",nextDay:"[啶啶侧た] LT",nextWeek:"[啶嗋啶佮う啷媇 dddd[,] LT",lastDay:"[啶灌た啶溹] LT",lastWeek:"[啶椸啶曕] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s啶ぞ",past:"%s 啶呧啶距ぁ啶�",s:"啶曕啶灌 啶曕啶粪ぃ",ss:"%d 啶膏啶曕啶`啶�",m:"啶忇 啶た啶ㄠ啶�",mm:"%d 啶た啶ㄠ啶�",h:"啶忇 啶樴ぃ啷嵿啶�",hh:"%d 啶樴ぃ啷嵿啶�",d:"啶忇 啶︵た啶�",dd:"%d 啶︵た啶�",M:"啶忇 啶す啶苦え啶�",MM:"%d 啶す啶苦え啶�",y:"啶忇 啶ぐ啷嵿し",yy:"%d 啶ぐ啷嵿し"},week:{dow:0,doy:6}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var n="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),a="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),t=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],r=/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,o;e.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(e,t){if(!e)return n;else if(/-MMM-/.test(t))return a[e.month()];else return n[e.month()]},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:t,longMonthsParse:t,shortMonthsParse:t,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"茅茅n minuut",mm:"%d minuten",h:"茅茅n uur",hh:"%d uur",d:"茅茅n dag",dd:"%d dagen",w:"茅茅n week",ww:"%d weken",M:"茅茅n maand",MM:"%d maanden",y:"茅茅n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(e===1||e===8||e>=20?"ste":"de")},week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var n="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),a="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),t=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],r=/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,o;e.defineLocale("nl-be",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(e,t){if(!e)return n;else if(/-MMM-/.test(t))return a[e.month()];else return n[e.month()]},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:t,longMonthsParse:t,shortMonthsParse:t,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"茅茅n minuut",mm:"%d minuten",h:"茅茅n uur",hh:"%d uur",d:"茅茅n dag",dd:"%d dagen",M:"茅茅n maand",MM:"%d maanden",y:"茅茅n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(e===1||e===8||e>=20?"ste":"de")},week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:true,weekdays:"sundag_m氓ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"su._m氓._ty._on._to._fr._lau.".split("_"),weekdaysMin:"su_m氓_ty_on_to_fr_la".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I g氓r klokka] LT",lastWeek:"[F酶reg氓ande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s sidan",s:"nokre sekund",ss:"%d sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",w:"ei veke",ww:"%d veker",M:"ein m氓nad",MM:"%d m氓nader",y:"eit 氓r",yy:"%d 氓r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("oc-lnc",{months:{standalone:"geni猫r_febri猫r_mar莽_abril_mai_junh_julhet_agost_setembre_oct貌bre_novembre_decembre".split("_"),format:"de geni猫r_de febri猫r_de mar莽_d'abril_de mai_de junh_de julhet_d'agost_de setembre_d'oct貌bre_de novembre_de decembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._mar莽_abr._mai_junh_julh._ago._set._oct._nov._dec.".split("_"),monthsParseExact:true,weekdays:"dimenge_diluns_dimars_dim猫cres_dij貌us_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dm._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dm_dc_dj_dv_ds".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:"[u猫i a] LT",nextDay:"[deman a] LT",nextWeek:"dddd [a] LT",lastDay:"[i猫r a] LT",lastWeek:"dddd [passat a] LT",sameElse:"L"},relativeTime:{future:"d'aqu铆 %s",past:"fa %s",s:"unas segondas",ss:"%d segondas",m:"una minuta",mm:"%d minutas",h:"una ora",hh:"%d oras",d:"un jorn",dd:"%d jorns",M:"un mes",MM:"%d meses",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|猫|a)/,ordinal:function(e,t){var n=e===1?"r":e===2?"n":e===3?"r":e===4?"t":"猫";if(t==="w"||t==="W")n="a";return e+n},week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t={1:"喋�",2:"喋�",3:"喋�",4:"喋�",5:"喋�",6:"喋�",7:"喋�",8:"喋�",9:"喋�",0:"喋�"},n={"喋�":"1","喋�":"2","喋�":"3","喋�":"4","喋�":"5","喋�":"6","喋�":"7","喋�":"8","喋�":"9","喋�":"0"},a;e.defineLocale("pa-in",{months:"啜溹è啜掂ò喋�_啜啜班ǖ啜班﹢_啜ň啜班_啜呧í喋嵿ò喋堗ú_啜▓_啜溹﹤啜╛啜溹﹣啜侧ň啜坃啜呧啜膏à_啜膏à喋班ì啜癬啜呧〞啜む﹤啜ò_啜ㄠǖ喋班ì啜癬啜︵ǜ喋班ì啜�".split("_"),monthsShort:"啜溹è啜掂ò喋�_啜啜班ǖ啜班﹢_啜ň啜班_啜呧í喋嵿ò喋堗ú_啜▓_啜溹﹤啜╛啜溹﹣啜侧ň啜坃啜呧啜膏à_啜膏à喋班ì啜癬啜呧〞啜む﹤啜ò_啜ㄠǖ喋班ì啜癬啜︵ǜ喋班ì啜�".split("_"),weekdays:"啜愢à啜掂ň啜癬啜膏啜ǖ啜距ò_啜┌啜椸ú啜掂ň啜癬啜﹣啜оǖ啜距ò_啜掂﹢啜班ǖ啜距ò_啜膏喋佮┍啜曕ò啜掂ň啜癬啜膏啜ㄠ﹢啜氞ò啜掂ň啜�".split("_"),weekdaysShort:"啜愢à_啜膏啜甠啜┌啜椸ú_啜﹣啜啜掂﹢啜癬啜膏喋佮〞啜癬啜膏啜ㄠ﹢".split("_"),weekdaysMin:"啜愢à_啜膏啜甠啜┌啜椸ú_啜﹣啜啜掂﹢啜癬啜膏喋佮〞啜癬啜膏啜ㄠ﹢".split("_"),longDateFormat:{LT:"A h:mm 啜掂喋�",LTS:"A h:mm:ss 啜掂喋�",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm 啜掂喋�",LLLL:"dddd, D MMMM YYYY, A h:mm 啜掂喋�"},calendar:{sameDay:"[啜呧] LT",nextDay:"[啜曕ú] LT",nextWeek:"[啜呧啜侧ň] dddd, LT",lastDay:"[啜曕ú] LT",lastWeek:"[啜啜涏ú喋嘳 dddd, LT",sameElse:"L"},relativeTime:{future:"%s 啜掂喋编",past:"%s 啜啜涏ú喋�",s:"啜曕﹣啜� 啜膏〞啜苦┌啜�",ss:"%d 啜膏〞啜苦┌啜�",m:"啜囙〞 啜喋班",mm:"%d 啜喋班",h:"啜囙┍啜� 啜樴┌啜熰ň",hh:"%d 啜樴┌啜熰﹪",d:"啜囙┍啜� 啜︵啜�",dd:"%d 啜︵啜�",M:"啜囙┍啜� 啜ü喋�啜ㄠň",MM:"%d 啜ü喋�啜ㄠ﹪",y:"啜囙┍啜� 啜膏ň啜�",yy:"%d 啜膏ň啜�"},preparse:function(e){return e.replace(/[喋о┄喋┼┆喋┈喋┊喋│]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/啜班ň啜啜膏ǖ喋囙ò|啜︵﹣啜ü啜苦ò|啜膏啜距ó/,meridiemHour:function(e,t){if(e===12)e=0;if(t==="啜班ň啜�")return e<4?e:e+12;else if(t==="啜膏ǖ喋囙ò")return e;else if(t==="啜︵﹣啜ü啜苦ò")return e>=10?e:e+12;else if(t==="啜膏啜距ó")return e+12},meridiem:function(e,t,n){if(e<4)return"啜班ň啜�";else if(e<10)return"啜膏ǖ喋囙ò";else if(e<17)return"啜︵﹣啜ü啜苦ò";else if(e<20)return"啜膏啜距ó";else return"啜班ň啜�"},week:{dow:0,doy:6}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var n="stycze艅_luty_marzec_kwiecie艅_maj_czerwiec_lipiec_sierpie艅_wrzesie艅_pa藕dziernik_listopad_grudzie艅".split("_"),a="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrze艣nia_pa藕dziernika_listopada_grudnia".split("_"),t=[/^sty/i,/^lut/i,/^mar/i,/^kwi/i,/^maj/i,/^cze/i,/^lip/i,/^sie/i,/^wrz/i,/^pa藕/i,/^lis/i,/^gru/i],r;function o(e){return e%10<5&&e%10>1&&~~(e/10)%10!==1}function i(e,t,n){var a=e+" ";switch(n){case"ss":return a+(o(e)?"sekundy":"sekund");case"m":return t?"minuta":"minut臋";case"mm":return a+(o(e)?"minuty":"minut");case"h":return t?"godzina":"godzin臋";case"hh":return a+(o(e)?"godziny":"godzin");case"ww":return a+(o(e)?"tygodnie":"tygodni");case"MM":return a+(o(e)?"miesi膮ce":"miesi臋cy");case"yy":return a+(o(e)?"lata":"lat")}}e.defineLocale("pl",{months:function(e,t){if(!e)return n;else if(/D MMMM/.test(t))return a[e.month()];else return n[e.month()]},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_pa藕_lis_gru".split("_"),monthsParse:t,longMonthsParse:t,shortMonthsParse:t,weekdays:"niedziela_poniedzia艂ek_wtorek_艣roda_czwartek_pi膮tek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_艣r_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_艢r_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Dzi艣 o] LT",nextDay:"[Jutro o] LT",nextWeek:function(){switch(this.day()){case 0:return"[W niedziel臋 o] LT";case 2:return"[We wtorek o] LT";case 3:return"[W 艣rod臋 o] LT";case 6:return"[W sobot臋 o] LT";default:return"[W] dddd [o] LT"}},lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zesz艂膮 niedziel臋 o] LT";case 3:return"[W zesz艂膮 艣rod臋 o] LT";case 6:return"[W zesz艂膮 sobot臋 o] LT";default:return"[W zesz艂y] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",ss:i,m:i,mm:i,h:i,hh:i,d:"1 dzie艅",dd:"%d dni",w:"tydzie艅",ww:i,M:"miesi膮c",MM:i,y:"rok",yy:i},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("pt",{months:"janeiro_fevereiro_mar莽o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"Domingo_Segunda-feira_Ter莽a-feira_Quarta-feira_Quinta-feira_Sexta-feira_S谩bado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_S谩b".split("_"),weekdaysMin:"Do_2陋_3陋_4陋_5陋_6陋_S谩".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY HH:mm"},calendar:{sameDay:"[Hoje 脿s] LT",nextDay:"[Amanh茫 脿s] LT",nextWeek:"dddd [脿s] LT",lastDay:"[Ontem 脿s] LT",lastWeek:function(){return this.day()===0||this.day()===6?"[脷ltimo] dddd [脿s] LT":"[脷ltima] dddd [脿s] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"h谩 %s",s:"segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",w:"uma semana",ww:"%d semanas",M:"um m锚s",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}潞/,ordinal:"%d潞",week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("pt-br",{months:"janeiro_fevereiro_mar莽o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_ter莽a-feira_quarta-feira_quinta-feira_sexta-feira_s谩bado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_s谩b".split("_"),weekdaysMin:"do_2陋_3陋_4陋_5陋_6陋_s谩".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [脿s] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [脿s] HH:mm"},calendar:{sameDay:"[Hoje 脿s] LT",nextDay:"[Amanh茫 脿s] LT",nextWeek:"dddd [脿s] LT",lastDay:"[Ontem 脿s] LT",lastWeek:function(){return this.day()===0||this.day()===6?"[脷ltimo] dddd [脿s] LT":"[脷ltima] dddd [脿s] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"h谩 %s",s:"poucos segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um m锚s",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}潞/,ordinal:"%d潞",invalidDate:"Data inv谩lida"})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+function t(e,t,n){var a={ss:"secunde",mm:"minute",hh:"ore",dd:"zile",ww:"s膬pt膬m芒ni",MM:"luni",yy:"ani"},r=" ";if(e%100>=20||e>=100&&e%100===0)r=" de ";return e+r+a[n]}var n;e.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._feb._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),monthsParseExact:true,weekdays:"duminic膬_luni_mar葲i_miercuri_joi_vineri_s芒mb膬t膬".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_S芒m".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_S芒".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[m芒ine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s 卯n urm膬",s:"c芒teva secunde",ss:t,m:"un minut",mm:t,h:"o or膬",hh:t,d:"o zi",dd:t,w:"o s膬pt膬m芒n膬",ww:t,M:"o lun膬",MM:t,y:"un an",yy:t},week:{dow:1,doy:7}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+function r(e,t){var n=e.split("_");return t%10===1&&t%100!==11?n[0]:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?n[1]:n[2]}function t(e,t,n){var a={ss:t?"褋械泻褍薪写邪_褋械泻褍薪写褘_褋械泻褍薪写":"褋械泻褍薪写褍_褋械泻褍薪写褘_褋械泻褍薪写",mm:t?"屑懈薪褍褌邪_屑懈薪褍褌褘_屑懈薪褍褌":"屑懈薪褍褌褍_屑懈薪褍褌褘_屑懈薪褍褌",hh:"褔邪褋_褔邪褋邪_褔邪褋芯胁",dd:"写械薪褜_写薪褟_写薪械泄",ww:"薪械写械谢褟_薪械写械谢懈_薪械写械谢褜",MM:"屑械褋褟褑_屑械褋褟褑邪_屑械褋褟褑械胁",yy:"谐芯写_谐芯写邪_谢械褌"};if(n==="m")return t?"屑懈薪褍褌邪":"屑懈薪褍褌褍";else return e+" "+r(a[n],+e)}var n=[/^褟薪胁/i,/^褎械胁/i,/^屑邪褉/i,/^邪锌褉/i,/^屑邪[泄褟]/i,/^懈褞薪/i,/^懈褞谢/i,/^邪胁谐/i,/^褋械薪/i,/^芯泻褌/i,/^薪芯褟/i,/^写械泻/i],a;e.defineLocale("ru",{months:{format:"褟薪胁邪褉褟_褎械胁褉邪谢褟_屑邪褉褌邪_邪锌褉械谢褟_屑邪褟_懈褞薪褟_懈褞谢褟_邪胁谐褍褋褌邪_褋械薪褌褟斜褉褟_芯泻褌褟斜褉褟_薪芯褟斜褉褟_写械泻邪斜褉褟".split("_"),standalone:"褟薪胁邪褉褜_褎械胁褉邪谢褜_屑邪褉褌_邪锌褉械谢褜_屑邪泄_懈褞薪褜_懈褞谢褜_邪胁谐褍褋褌_褋械薪褌褟斜褉褜_芯泻褌褟斜褉褜_薪芯褟斜褉褜_写械泻邪斜褉褜".split("_")},monthsShort:{format:"褟薪胁._褎械胁褉._屑邪褉._邪锌褉._屑邪褟_懈褞薪褟_懈褞谢褟_邪胁谐._褋械薪褌._芯泻褌._薪芯褟斜._写械泻.".split("_"),standalone:"褟薪胁._褎械胁褉._屑邪褉褌_邪锌褉._屑邪泄_懈褞薪褜_懈褞谢褜_邪胁谐._褋械薪褌._芯泻褌._薪芯褟斜._写械泻.".split("_")},weekdays:{standalone:"胁芯褋泻褉械褋械薪褜械_锌芯薪械写械谢褜薪懈泻_胁褌芯褉薪懈泻_褋褉械写邪_褔械褌胁械褉谐_锌褟褌薪懈褑邪_褋褍斜斜芯褌邪".split("_"),format:"胁芯褋泻褉械褋械薪褜械_锌芯薪械写械谢褜薪懈泻_胁褌芯褉薪懈泻_褋褉械写褍_褔械褌胁械褉谐_锌褟褌薪懈褑褍_褋褍斜斜芯褌褍".split("_"),isFormat:/\[ ?[袙胁] ?(?:锌褉芯褕谢褍褞|褋谢械写褍褞褖褍褞|褝褌褍)? ?] ?dddd/},weekdaysShort:"胁褋_锌薪_胁褌_褋褉_褔褌_锌褌_褋斜".split("_"),weekdaysMin:"胁褋_锌薪_胁褌_褋褉_褔褌_锌褌_褋斜".split("_"),monthsParse:n,longMonthsParse:n,shortMonthsParse:n,monthsRegex:/^(褟薪胁邪褉[褜褟]|褟薪胁\.?|褎械胁褉邪谢[褜褟]|褎械胁褉?\.?|屑邪褉褌邪?|屑邪褉\.?|邪锌褉械谢[褜褟]|邪锌褉\.?|屑邪[泄褟]|懈褞薪[褜褟]|懈褞薪\.?|懈褞谢[褜褟]|懈褞谢\.?|邪胁谐褍褋褌邪?|邪胁谐\.?|褋械薪褌褟斜褉[褜褟]|褋械薪褌?\.?|芯泻褌褟斜褉[褜褟]|芯泻褌\.?|薪芯褟斜褉[褜褟]|薪芯褟斜?\.?|写械泻邪斜褉[褜褟]|写械泻\.?)/i,monthsShortRegex:/^(褟薪胁邪褉[褜褟]|褟薪胁\.?|褎械胁褉邪谢[褜褟]|褎械胁褉?\.?|屑邪褉褌邪?|屑邪褉\.?|邪锌褉械谢[褜褟]|邪锌褉\.?|屑邪[泄褟]|懈褞薪[褜褟]|懈褞薪\.?|懈褞谢[褜褟]|懈褞谢\.?|邪胁谐褍褋褌邪?|邪胁谐\.?|褋械薪褌褟斜褉[褜褟]|褋械薪褌?\.?|芯泻褌褟斜褉[褜褟]|芯泻褌\.?|薪芯褟斜褉[褜褟]|薪芯褟斜?\.?|写械泻邪斜褉[褜褟]|写械泻\.?)/i,monthsStrictRegex:/^(褟薪胁邪褉[褟褜]|褎械胁褉邪谢[褟褜]|屑邪褉褌邪?|邪锌褉械谢[褟褜]|屑邪[褟泄]|懈褞薪[褟褜]|懈褞谢[褟褜]|邪胁谐褍褋褌邪?|褋械薪褌褟斜褉[褟褜]|芯泻褌褟斜褉[褟褜]|薪芯褟斜褉[褟褜]|写械泻邪斜褉[褟褜])/i,monthsShortStrictRegex:/^(褟薪胁\.|褎械胁褉?\.|屑邪褉[褌.]|邪锌褉\.|屑邪[褟泄]|懈褞薪[褜褟.]|懈褞谢[褜褟.]|邪胁谐\.|褋械薪褌?\.|芯泻褌\.|薪芯褟斜?\.|写械泻\.)/i,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY 谐.",LLL:"D MMMM YYYY 谐., H:mm",LLLL:"dddd, D MMMM YYYY 谐., H:mm"},calendar:{sameDay:"[小械谐芯写薪褟, 胁] LT",nextDay:"[袟邪胁褌褉邪, 胁] LT",lastDay:"[袙褔械褉邪, 胁] LT",nextWeek:function(e){if(e.week()!==this.week())switch(this.day()){case 0:return"[袙 褋谢械写褍褞褖械械] dddd, [胁] LT";case 1:case 2:case 4:return"[袙 褋谢械写褍褞褖懈泄] dddd, [胁] LT";case 3:case 5:case 6:return"[袙 褋谢械写褍褞褖褍褞] dddd, [胁] LT"}else if(this.day()===2)return"[袙芯] dddd, [胁] LT";else return"[袙] dddd, [胁] LT"},lastWeek:function(e){if(e.week()!==this.week())switch(this.day()){case 0:return"[袙 锌褉芯褕谢芯械] dddd, [胁] LT";case 1:case 2:case 4:return"[袙 锌褉芯褕谢褘泄] dddd, [胁] LT";case 3:case 5:case 6:return"[袙 锌褉芯褕谢褍褞] dddd, [胁] LT"}else if(this.day()===2)return"[袙芯] dddd, [胁] LT";else return"[袙] dddd, [胁] LT"},sameElse:"L"},relativeTime:{future:"褔械褉械蟹 %s",past:"%s 薪邪蟹邪写",s:"薪械褋泻芯谢褜泻芯 褋械泻褍薪写",ss:t,m:t,mm:t,h:"褔邪褋",hh:t,d:"写械薪褜",dd:t,w:"薪械写械谢褟",ww:t,M:"屑械褋褟褑",MM:t,y:"谐芯写",yy:t},meridiemParse:/薪芯褔懈|褍褌褉邪|写薪褟|胁械褔械褉邪/i,isPM:function(e){return/^(写薪褟|胁械褔械褉邪)$/.test(e)},meridiem:function(e,t,n){if(e<4)return"薪芯褔懈";else if(e<12)return"褍褌褉邪";else if(e<17)return"写薪褟";else return"胁械褔械褉邪"},dayOfMonthOrdinalParse:/\d{1,2}-(泄|谐芯|褟)/,ordinal:function(e,t){switch(t){case"M":case"d":case"DDD":return e+"-泄";case"D":return e+"-谐芯";case"w":case"W":return e+"-褟";default:return e}},week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t=["噩賳賵乇賷","賮賷亘乇賵乇賷","賲丕乇趩","丕倬乇賷賱","賲卅賷","噩賵賳","噩賵賱丕亍賽","丌诏爻俳","爻賷倬俳賲亘乇","丌讵俳賵亘乇","賳賵賲亘乇","趭爻賲亘乇"],n=["丌趩乇","爻賵賲乇","丕诒丕乇賵","丕乇亘毓","禺賲賷爻","噩賲毓","趪賳趪乇"],a;e.defineLocale("sd",{months:t,monthsShort:t,weekdays:n,weekdaysShort:n,weekdaysMin:n,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd貙 D MMMM YYYY HH:mm"},meridiemParse:/氐亘丨|卮丕賲/,isPM:function(e){return"卮丕賲"===e},meridiem:function(e,t,n){if(e<12)return"氐亘丨";return"卮丕賲"},calendar:{sameDay:"[丕趧] LT",nextDay:"[爻趢丕诨賷] LT",nextWeek:"dddd [丕诔賷賳 賴賮鬲賷 鬲賷] LT",lastDay:"[讵丕賱賴賴] LT",lastWeek:"[诏夭乇賷賱 賴賮鬲賷] dddd [鬲賷] LT",sameElse:"L"},relativeTime:{future:"%s 倬賵亍",past:"%s 丕诔",s:"趩賳丿 爻賷讵賳趭",ss:"%d 爻賷讵賳趭",m:"賴讵 賲賳俳",mm:"%d 賲賳俳",h:"賴讵 讵賱丕讵",hh:"%d 讵賱丕讵",d:"賴讵 趶賷賳賴賳",dd:"%d 趶賷賳賴賳",M:"賴讵 賲賴賷賳賵",MM:"%d 賲賴賷賳丕",y:"賴讵 爻丕賱",yy:"%d 爻丕賱"},preparse:function(e){return e.replace(/貙/g,",")},postformat:function(e){return e.replace(/,/g,"貙")},week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("se",{months:"o膽膽ajagem谩nnu_guovvam谩nnu_njuk膷am谩nnu_cuo艐om谩nnu_miessem谩nnu_geassem谩nnu_suoidnem谩nnu_borgem谩nnu_膷ak膷am谩nnu_golggotm谩nnu_sk谩bmam谩nnu_juovlam谩nnu".split("_"),monthsShort:"o膽膽j_guov_njuk_cuo_mies_geas_suoi_borg_膷ak膷_golg_sk谩b_juov".split("_"),weekdays:"sotnabeaivi_vuoss谩rga_ma艐艐eb谩rga_gaskavahkku_duorastat_bearjadat_l谩vvardat".split("_"),weekdaysShort:"sotn_vuos_ma艐_gask_duor_bear_l谩v".split("_"),weekdaysMin:"s_v_m_g_d_b_L".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"MMMM D. [b.] YYYY",LLL:"MMMM D. [b.] YYYY [ti.] HH:mm",LLLL:"dddd, MMMM D. [b.] YYYY [ti.] HH:mm"},calendar:{sameDay:"[otne ti] LT",nextDay:"[ihttin ti] LT",nextWeek:"dddd [ti] LT",lastDay:"[ikte ti] LT",lastWeek:"[ovddit] dddd [ti] LT",sameElse:"L"},relativeTime:{future:"%s gea啪es",past:"ma艐it %s",s:"moadde sekunddat",ss:"%d sekunddat",m:"okta minuhta",mm:"%d minuhtat",h:"okta diimmu",hh:"%d diimmut",d:"okta beaivi",dd:"%d beaivvit",M:"okta m谩nnu",MM:"%d m谩nut",y:"okta jahki",yy:"%d jagit"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("si",{months:"喽⑧侗喾�喾忇痘喾抇喽脆窓喽多痘喾�喾忇痘喾抇喽膏窂喽秽穵喽窋_喽呧洞喾娾�嵿痘喾氞督喾奯喽膏窅喽亨窉_喽⑧窎喽编窉_喽⑧窎喽洁窉_喽呧稖喾澿穬喾娻董喾擾喾冟窅喽脆穵喽窅喽膏穵喽多痘喾奯喽斷稓喾娻董喾澿抖喽秽穵_喽编窚喾�喾愢陡喾娻抖喽秽穵_喽窓喾冟窅喽膏穵喽多痘喾�".split("_"),monthsShort:"喽⑧侗_喽脆窓喽禵喽膏窂喽秽穵_喽呧洞喾奯喽膏窅喽亨窉_喽⑧窎喽编窉_喽⑧窎喽洁窉_喽呧稖喾漘喾冟窅喽脆穵_喽斷稓喾奯喽编窚喾�喾恄喽窓喾冟窅".split("_"),weekdays:"喽夃痘喾掄动喾廮喾冟冻喾斷动喾廮喽呧稛喾勦痘喾斷穩喾忇动喾廮喽多动喾忇动喾廮喽多穵鈥嵿痘喾勦穬喾娻洞喽窉喽编穵喽窂_喾冟窉喽氞窋喽秽窂喽窂_喾冟窓喽编穬喾斷痘喾忇动喾�".split("_"),weekdaysShort:"喽夃痘喾抇喾冟冻喾擾喽呧稛_喽多动喾廮喽多穵鈥嵿痘喾刜喾冟窉喽氞窋_喾冟窓喽�".split("_"),weekdaysMin:"喽塤喾僟喽卂喽禵喽多穵鈥嵿痘_喾冟窉_喾冟窓".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"a h:mm",LTS:"a h:mm:ss",L:"YYYY/MM/DD",LL:"YYYY MMMM D",LLL:"YYYY MMMM D, a h:mm",LLLL:"YYYY MMMM D [喾�喾愢侗喾抅 dddd, a h:mm:ss"},calendar:{sameDay:"[喽呧动] LT[喽",nextDay:"[喾勦窓喽 LT[喽",nextWeek:"dddd LT[喽",lastDay:"[喽娻逗喾歖 LT[喽",lastWeek:"[喽脆穬喾斷稖喾掄逗] dddd LT[喽",sameElse:"L"},relativeTime:{future:"%s喽氞窉喽编穵",past:"%s喽氞锭 喽脆窓喽�",s:"喽董喾娻洞喽� 喽氞窉喾勦窉喽脆逗",ss:"喽董喾娻洞喽� %d",m:"喽膏窉喽编窉喽穵喽窋喾�",mm:"喽膏窉喽编窉喽穵喽窋 %d",h:"喽脆窅喽�",hh:"喽脆窅喽� %d",d:"喽窉喽编逗",dd:"喽窉喽� %d",M:"喽膏窂喾冟逗",MM:"喽膏窂喾� %d",y:"喾�喾冟痘",yy:"喾�喾冟痘 %d"},dayOfMonthOrdinalParse:/\d{1,2} 喾�喾愢侗喾�/,ordinal:function(e){return e+" 喾�喾愢侗喾�"},meridiemParse:/喽脆窓喽� 喾�喽秽窋|喽脆穬喾� 喾�喽秽窋|喽脆窓.喾�|喽�.喾�./,isPM:function(e){return e==="喽�.喾�."||e==="喽脆穬喾� 喾�喽秽窋"},meridiem:function(e,t,n){if(e>11)return n?"喽�.喾�.":"喽脆穬喾� 喾�喽秽窋";else return n?"喽脆窓.喾�.":"喽脆窓喽� 喾�喽秽窋"}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t="janu谩r_febru谩r_marec_apr铆l_m谩j_j煤n_j煤l_august_september_okt贸ber_november_december".split("_"),n="jan_feb_mar_apr_m谩j_j煤n_j煤l_aug_sep_okt_nov_dec".split("_"),a;function o(e){return e>1&&e<5}function r(e,t,n,a){var r=e+" ";switch(n){case"s":return t||a?"p谩r sek煤nd":"p谩r sekundami";case"ss":if(t||a)return r+(o(e)?"sekundy":"sek煤nd");else return r+"sekundami";case"m":return t?"min煤ta":a?"min煤tu":"min煤tou";case"mm":if(t||a)return r+(o(e)?"min煤ty":"min煤t");else return r+"min煤tami";case"h":return t?"hodina":a?"hodinu":"hodinou";case"hh":if(t||a)return r+(o(e)?"hodiny":"hod铆n");else return r+"hodinami";case"d":return t||a?"de艌":"d艌om";case"dd":if(t||a)return r+(o(e)?"dni":"dn铆");else return r+"d艌ami";case"M":return t||a?"mesiac":"mesiacom";case"MM":if(t||a)return r+(o(e)?"mesiace":"mesiacov");else return r+"mesiacmi";case"y":return t||a?"rok":"rokom";case"yy":if(t||a)return r+(o(e)?"roky":"rokov");else return r+"rokmi"}}e.defineLocale("sk",{months:t,monthsShort:n,weekdays:"nede木a_pondelok_utorok_streda_拧tvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_拧t_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_拧t_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nede木u o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo 拧tvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[v膷era o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minul煤 nede木u o] LT";case 1:case 2:return"[minul媒] dddd [o] LT";case 3:return"[minul煤 stredu o] LT";case 4:case 5:return"[minul媒] dddd [o] LT";case 6:return"[minul煤 sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:r,ss:r,m:r,mm:r,h:r,hh:r,d:r,dd:r,M:r,MM:r,y:r,yy:r},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+function t(e,t,n,a){var r=e+" ";switch(n){case"s":return t||a?"nekaj sekund":"nekaj sekundami";case"ss":if(e===1)r+=t?"sekundo":"sekundi";else if(e===2)r+=t||a?"sekundi":"sekundah";else if(e<5)r+=t||a?"sekunde":"sekundah";else r+="sekund";return r;case"m":return t?"ena minuta":"eno minuto";case"mm":if(e===1)r+=t?"minuta":"minuto";else if(e===2)r+=t||a?"minuti":"minutama";else if(e<5)r+=t||a?"minute":"minutami";else r+=t||a?"minut":"minutami";return r;case"h":return t?"ena ura":"eno uro";case"hh":if(e===1)r+=t?"ura":"uro";else if(e===2)r+=t||a?"uri":"urama";else if(e<5)r+=t||a?"ure":"urami";else r+=t||a?"ur":"urami";return r;case"d":return t||a?"en dan":"enim dnem";case"dd":if(e===1)r+=t||a?"dan":"dnem";else if(e===2)r+=t||a?"dni":"dnevoma";else r+=t||a?"dni":"dnevi";return r;case"M":return t||a?"en mesec":"enim mesecem";case"MM":if(e===1)r+=t||a?"mesec":"mesecem";else if(e===2)r+=t||a?"meseca":"mesecema";else if(e<5)r+=t||a?"mesece":"meseci";else r+=t||a?"mesecev":"meseci";return r;case"y":return t||a?"eno leto":"enim letom";case"yy":if(e===1)r+=t||a?"leto":"letom";else if(e===2)r+=t||a?"leti":"letoma";else if(e<5)r+=t||a?"leta":"leti";else r+=t||a?"let":"leti";return r}}var n;e.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),monthsParseExact:true,weekdays:"nedelja_ponedeljek_torek_sreda_膷etrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._膷et._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_膷e_pe_so".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[v膷eraj ob] LT",lastWeek:function(){switch(this.day()){case 0:return"[prej拧njo] [nedeljo] [ob] LT";case 3:return"[prej拧njo] [sredo] [ob] LT";case 6:return"[prej拧njo] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[prej拧nji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"膷ez %s",past:"pred %s",s:t,ss:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_N毛ntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_N毛n_Dhj".split("_"),weekdays:"E Diel_E H毛n毛_E Mart毛_E M毛rkur毛_E Enjte_E Premte_E Shtun毛".split("_"),weekdaysShort:"Die_H毛n_Mar_M毛r_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_M毛_E_P_Sh".split("_"),weekdaysParseExact:true,meridiemParse:/PD|MD/,isPM:function(e){return e.charAt(0)==="M"},meridiem:function(e,t,n){return e<12?"PD":"MD"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Sot n毛] LT",nextDay:"[Nes毛r n毛] LT",nextWeek:"dddd [n毛] LT",lastDay:"[Dje n毛] LT",lastWeek:"dddd [e kaluar n毛] LT",sameElse:"L"},relativeTime:{future:"n毛 %s",past:"%s m毛 par毛",s:"disa sekonda",ss:"%d sekonda",m:"nj毛 minut毛",mm:"%d minuta",h:"nj毛 or毛",hh:"%d or毛",d:"nj毛 dit毛",dd:"%d dit毛",M:"nj毛 muaj",MM:"%d muaj",y:"nj毛 vit",yy:"%d vite"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var i={words:{ss:["sekunda","sekunde","sekundi"],m:["jedan minut","jednog minuta"],mm:["minut","minuta","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],d:["jedan dan","jednog dana"],dd:["dan","dana","dana"],M:["jedan mesec","jednog meseca"],MM:["mesec","meseca","meseci"],y:["jednu godinu","jedne godine"],yy:["godinu","godine","godina"]},correctGrammaticalCase:function(e,t){if(e%10>=1&&e%10<=4&&(e%100<10||e%100>=20))return e%10===1?t[0]:t[1];return t[2]},translate:function(e,t,n,a){var r=i.words[n],o;if(n.length===1){if(n==="y"&&t)return"jedna godina";return a||t?r[0]:r[1]}o=i.correctGrammaticalCase(e,r);if(n==="yy"&&t&&o==="godinu")return e+" godina";return e+" "+o}},t;e.defineLocale("sr",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:true,weekdays:"nedelja_ponedeljak_utorak_sreda_膷etvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sre._膷et._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_膷e_pe_su".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D. M. YYYY.",LL:"D. MMMM YYYY.",LLL:"D. MMMM YYYY. H:mm",LLLL:"dddd, D. MMMM YYYY. H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju膷e u] LT",lastWeek:function(){var e=["[pro拧le] [nedelje] [u] LT","[pro拧log] [ponedeljka] [u] LT","[pro拧log] [utorka] [u] LT","[pro拧le] [srede] [u] LT","[pro拧log] [膷etvrtka] [u] LT","[pro拧log] [petka] [u] LT","[pro拧le] [subote] [u] LT"];return e[this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",ss:i.translate,m:i.translate,mm:i.translate,h:i.translate,hh:i.translate,d:i.translate,dd:i.translate,M:i.translate,MM:i.translate,y:i.translate,yy:i.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var i={words:{ss:["褋械泻褍薪写邪","褋械泻褍薪写械","褋械泻褍薪写懈"],m:["褬械写邪薪 屑懈薪褍褌","褬械写薪芯谐 屑懈薪褍褌邪"],mm:["屑懈薪褍褌","屑懈薪褍褌邪","屑懈薪褍褌邪"],h:["褬械写邪薪 褋邪褌","褬械写薪芯谐 褋邪褌邪"],hh:["褋邪褌","褋邪褌邪","褋邪褌懈"],d:["褬械写邪薪 写邪薪","褬械写薪芯谐 写邪薪邪"],dd:["写邪薪","写邪薪邪","写邪薪邪"],M:["褬械写邪薪 屑械褋械褑","褬械写薪芯谐 屑械褋械褑邪"],MM:["屑械褋械褑","屑械褋械褑邪","屑械褋械褑懈"],y:["褬械写薪褍 谐芯写懈薪褍","褬械写薪械 谐芯写懈薪械"],yy:["谐芯写懈薪褍","谐芯写懈薪械","谐芯写懈薪邪"]},correctGrammaticalCase:function(e,t){if(e%10>=1&&e%10<=4&&(e%100<10||e%100>=20))return e%10===1?t[0]:t[1];return t[2]},translate:function(e,t,n,a){var r=i.words[n],o;if(n.length===1){if(n==="y"&&t)return"褬械写薪邪 谐芯写懈薪邪";return a||t?r[0]:r[1]}o=i.correctGrammaticalCase(e,r);if(n==="yy"&&t&&o==="谐芯写懈薪褍")return e+" 谐芯写懈薪邪";return e+" "+o}},t;e.defineLocale("sr-cyrl",{months:"褬邪薪褍邪褉_褎械斜褉褍邪褉_屑邪褉褌_邪锌褉懈谢_屑邪褬_褬褍薪_褬褍谢_邪胁谐褍褋褌_褋械锌褌械屑斜邪褉_芯泻褌芯斜邪褉_薪芯胁械屑斜邪褉_写械褑械屑斜邪褉".split("_"),monthsShort:"褬邪薪._褎械斜._屑邪褉._邪锌褉._屑邪褬_褬褍薪_褬褍谢_邪胁谐._褋械锌._芯泻褌._薪芯胁._写械褑.".split("_"),monthsParseExact:true,weekdays:"薪械写械褭邪_锌芯薪械写械褭邪泻_褍褌芯褉邪泻_褋褉械写邪_褔械褌胁褉褌邪泻_锌械褌邪泻_褋褍斜芯褌邪".split("_"),weekdaysShort:"薪械写._锌芯薪._褍褌芯._褋褉械._褔械褌._锌械褌._褋褍斜.".split("_"),weekdaysMin:"薪械_锌芯_褍褌_褋褉_褔械_锌械_褋褍".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D. M. YYYY.",LL:"D. MMMM YYYY.",LLL:"D. MMMM YYYY. H:mm",LLLL:"dddd, D. MMMM YYYY. H:mm"},calendar:{sameDay:"[写邪薪邪褋 褍] LT",nextDay:"[褋褍褌褉邪 褍] LT",nextWeek:function(){switch(this.day()){case 0:return"[褍] [薪械写械褭褍] [褍] LT";case 3:return"[褍] [褋褉械写褍] [褍] LT";case 6:return"[褍] [褋褍斜芯褌褍] [褍] LT";case 1:case 2:case 4:case 5:return"[褍] dddd [褍] LT"}},lastDay:"[褬褍褔械 褍] LT",lastWeek:function(){var e=["[锌褉芯褕谢械] [薪械写械褭械] [褍] LT","[锌褉芯褕谢芯谐] [锌芯薪械写械褭泻邪] [褍] LT","[锌褉芯褕谢芯谐] [褍褌芯褉泻邪] [褍] LT","[锌褉芯褕谢械] [褋褉械写械] [褍] LT","[锌褉芯褕谢芯谐] [褔械褌胁褉褌泻邪] [褍] LT","[锌褉芯褕谢芯谐] [锌械褌泻邪] [褍] LT","[锌褉芯褕谢械] [褋褍斜芯褌械] [褍] LT"];return e[this.day()]},sameElse:"L"},relativeTime:{future:"蟹邪 %s",past:"锌褉械 %s",s:"薪械泻芯谢懈泻芯 褋械泻褍薪写懈",ss:i.translate,m:i.translate,mm:i.translate,h:i.translate,hh:i.translate,d:i.translate,dd:i.translate,M:i.translate,MM:i.translate,y:i.translate,yy:i.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("ss",{months:"Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split("_"),monthsShort:"Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo".split("_"),weekdays:"Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo".split("_"),weekdaysShort:"Lis_Umb_Lsb_Les_Lsi_Lsh_Umg".split("_"),weekdaysMin:"Li_Us_Lb_Lt_Ls_Lh_Ug".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Namuhla nga] LT",nextDay:"[Kusasa nga] LT",nextWeek:"dddd [nga] LT",lastDay:"[Itolo nga] LT",lastWeek:"dddd [leliphelile] [nga] LT",sameElse:"L"},relativeTime:{future:"nga %s",past:"wenteka nga %s",s:"emizuzwana lomcane",ss:"%d mzuzwana",m:"umzuzu",mm:"%d emizuzu",h:"lihora",hh:"%d emahora",d:"lilanga",dd:"%d emalanga",M:"inyanga",MM:"%d tinyanga",y:"umnyaka",yy:"%d iminyaka"},meridiemParse:/ekuseni|emini|entsambama|ebusuku/,meridiem:function(e,t,n){if(e<11)return"ekuseni";else if(e<15)return"emini";else if(e<19)return"entsambama";else return"ebusuku"},meridiemHour:function(e,t){if(e===12)e=0;if(t==="ekuseni")return e;else if(t==="emini")return e>=11?e:e+12;else if(t==="entsambama"||t==="ebusuku"){if(e===0)return 0;return e+12}},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:"%d",week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"s枚ndag_m氓ndag_tisdag_onsdag_torsdag_fredag_l枚rdag".split("_"),weekdaysShort:"s枚n_m氓n_tis_ons_tor_fre_l枚r".split("_"),weekdaysMin:"s枚_m氓_ti_on_to_fr_l枚".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Ig氓r] LT",nextWeek:"[P氓] dddd LT",lastWeek:"[I] dddd[s] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"f枚r %s sedan",s:"n氓gra sekunder",ss:"%d sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en m氓nad",MM:"%d m氓nader",y:"ett 氓r",yy:"%d 氓r"},dayOfMonthOrdinalParse:/\d{1,2}(\:e|\:a)/,ordinal:function(e){var t=e%10,n=~~(e%100/10)===1?":e":t===1?":a":t===2?":a":t===3?":e":":e";return e+n},week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("sw",{months:"Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des".split("_"),weekdays:"Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi".split("_"),weekdaysShort:"Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos".split("_"),weekdaysMin:"J2_J3_J4_J5_Al_Ij_J1".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"hh:mm A",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[leo saa] LT",nextDay:"[kesho saa] LT",nextWeek:"[wiki ijayo] dddd [saat] LT",lastDay:"[jana] LT",lastWeek:"[wiki iliyopita] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s baadaye",past:"tokea %s",s:"hivi punde",ss:"sekunde %d",m:"dakika moja",mm:"dakika %d",h:"saa limoja",hh:"masaa %d",d:"siku moja",dd:"siku %d",M:"mwezi mmoja",MM:"miezi %d",y:"mwaka mmoja",yy:"miaka %d"},week:{dow:1,doy:7}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t={1:"喁�",2:"喁�",3:"喁�",4:"喁�",5:"喁�",6:"喁�",7:"喁�",8:"喁�",9:"喁�",0:"喁�"},n={"喁�":"1","喁�":"2","喁�":"3","喁�":"4","喁�":"5","喁�":"6","喁�":"7","喁�":"8","喁�":"9","喁�":"0"},a;e.defineLocale("ta",{months:"喈溹喈掂喈縚喈喈瘝喈班喈班_喈喈班瘝喈氞瘝_喈忇喁嵿喈侧瘝_喈瘒_喈溹瘋喈┼瘝_喈溹瘋喈侧瘓_喈嗋畷喈膏瘝喈熰瘝_喈氞瘑喈瘝喈熰瘑喈瘝喈喁峗喈呧畷喁嵿疅喁囙喈喁峗喈ㄠ喈瘝喈喁峗喈熰喈氞喁嵿喈班瘝".split("_"),monthsShort:"喈溹喈掂喈縚喈喈瘝喈班喈班_喈喈班瘝喈氞瘝_喈忇喁嵿喈侧瘝_喈瘒_喈溹瘋喈┼瘝_喈溹瘋喈侧瘓_喈嗋畷喈膏瘝喈熰瘝_喈氞瘑喈瘝喈熰瘑喈瘝喈喁峗喈呧畷喁嵿疅喁囙喈喁峗喈ㄠ喈瘝喈喁峗喈熰喈氞喁嵿喈班瘝".split("_"),weekdays:"喈炧喈喈编瘝喈编瘉喈曕瘝喈曕喈脆喁坃喈む喈權瘝喈曕疅喁嵿畷喈苦喈瘓_喈氞瘑喈掂瘝喈掂喈瘝喈曕喈脆喁坃喈瘉喈む喁嵿畷喈苦喈瘓_喈掂喈喈脆畷喁嵿畷喈苦喈瘓_喈掂瘑喈赤瘝喈赤喈曕瘝喈曕喈脆喁坃喈氞喈苦畷喁嵿畷喈苦喈瘓".split("_"),weekdaysShort:"喈炧喈喈编瘉_喈む喈權瘝喈曕喁峗喈氞瘑喈掂瘝喈掂喈瘝_喈瘉喈む喁峗喈掂喈喈脆喁峗喈掂瘑喈赤瘝喈赤_喈氞喈�".split("_"),weekdaysMin:"喈炧_喈む_喈氞瘑_喈瘉_喈掂_喈掂瘑_喈�".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, HH:mm",LLLL:"dddd, D MMMM YYYY, HH:mm"},calendar:{sameDay:"[喈囙喁嵿喁乚 LT",nextDay:"[喈ㄠ喈赤瘓] LT",nextWeek:"dddd, LT",lastDay:"[喈ㄠ瘒喈编瘝喈编瘉] LT",lastWeek:"[喈曕疅喈ㄠ瘝喈� 喈掂喈班喁峕 dddd, LT",sameElse:"L"},relativeTime:{future:"%s 喈囙喁�",past:"%s 喈瘉喈┼瘝",s:"喈掄喁� 喈氞喈� 喈掂喈ㄠ喈熰喈曕喁�",ss:"%d 喈掂喈ㄠ喈熰喈曕喁�",m:"喈掄喁� 喈ㄠ喈喈熰喁�",mm:"%d 喈ㄠ喈喈熰畽喁嵿畷喈赤瘝",h:"喈掄喁� 喈喈� 喈ㄠ瘒喈班喁�",hh:"%d 喈喈� 喈ㄠ瘒喈班喁�",d:"喈掄喁� 喈ㄠ喈赤瘝",dd:"%d 喈ㄠ喈熰瘝喈曕喁�",M:"喈掄喁� 喈喈む喁�",MM:"%d 喈喈む畽喁嵿畷喈赤瘝",y:"喈掄喁� 喈掂喁佮疅喈瘝",yy:"%d 喈嗋喁嵿疅喁佮畷喈赤瘝"},dayOfMonthOrdinalParse:/\d{1,2}喈掂喁�/,ordinal:function(e){return e+"喈掂喁�"},preparse:function(e){return e.replace(/[喁о喁┼喁喁喁]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/喈喈喁峾喈掂瘓喈曕喁坾喈曕喈侧瘓|喈ㄠ喁嵿喈曕喁峾喈庎喁嵿喈距疅喁亅喈喈侧瘓/,meridiem:function(e,t,n){if(e<2)return" 喈喈喁�";else if(e<6)return" 喈掂瘓喈曕喁�";else if(e<10)return" 喈曕喈侧瘓";else if(e<14)return" 喈ㄠ喁嵿喈曕喁�";else if(e<18)return" 喈庎喁嵿喈距疅喁�";else if(e<22)return" 喈喈侧瘓";else return" 喈喈喁�"},meridiemHour:function(e,t){if(e===12)e=0;if(t==="喈喈喁�")return e<2?e:e+12;else if(t==="喈掂瘓喈曕喁�"||t==="喈曕喈侧瘓")return e;else if(t==="喈ㄠ喁嵿喈曕喁�")return e>=10?e:e+12;else return e+12},week:{dow:0,doy:6}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("te",{months:"喟溹皑喟掂鞍喟縚喟翱喟睄喟班暗喟班翱_喟熬喟班睄喟氞翱_喟忇蔼啾嵿鞍喟苦安啾峗喟眹_喟溹眰喟ㄠ睄_喟溹眮喟侧眻_喟嗋皸喟膏睄喟熰眮_喟膏眴喟睄喟熰眴喟傕艾喟班睄_喟呧皶啾嵿盁啾嬥艾喟班睄_喟ㄠ暗喟傕艾喟班睄_喟∴翱喟膏眴喟傕艾喟班睄".split("_"),monthsShort:"喟溹皑._喟翱喟睄喟�._喟熬喟班睄喟氞翱_喟忇蔼啾嵿鞍喟�._喟眹_喟溹眰喟ㄠ睄_喟溹眮喟侧眻_喟嗋皸._喟膏眴喟睄._喟呧皶啾嵿盁啾�._喟ㄠ暗._喟∴翱喟膏眴.".split("_"),monthsParseExact:true,weekdays:"喟嗋唉喟苦暗喟距鞍喟俖喟膏眿喟暗喟距鞍喟俖喟皞喟椸俺喟掂熬喟班皞_喟眮喟о暗喟距鞍喟俖喟椸眮喟班眮喟掂熬喟班皞_喟多眮喟曕睄喟班暗喟距鞍喟俖喟多皑喟苦暗喟距鞍喟�".split("_"),weekdaysShort:"喟嗋唉喟縚喟膏眿喟甠喟皞喟椸俺_喟眮喟喟椸眮喟班眮_喟多眮喟曕睄喟癬喟多皑喟�".split("_"),weekdaysMin:"喟哶喟膏眿_喟皞_喟眮_喟椸眮_喟多眮_喟�".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[喟ㄠ眹喟∴眮] LT",nextDay:"[喟班眹喟眮] LT",nextWeek:"dddd, LT",lastDay:"[喟ㄠ翱喟ㄠ睄喟╙ LT",lastWeek:"[喟椸挨] dddd, LT",sameElse:"L"},relativeTime:{future:"%s 喟侧眿",past:"%s 喟曕睄喟班翱喟む皞",s:"喟曕眾喟ㄠ睄喟ㄠ翱 喟曕睄喟粪埃喟距安啾�",ss:"%d 喟膏眴喟曕皑啾嵿安啾�",m:"喟掄皶 喟ㄠ翱喟翱喟粪皞",mm:"%d 喟ㄠ翱喟翱喟粪熬喟侧眮",h:"喟掄皶 喟椸皞喟�",hh:"%d 喟椸皞喟熰安啾�",d:"喟掄皶 喟班眿喟溹眮",dd:"%d 喟班眿喟溹眮喟侧眮",M:"喟掄皶 喟ㄠ眴喟�",MM:"%d 喟ㄠ眴喟侧安啾�",y:"喟掄皶 喟膏皞喟掂挨啾嵿案喟班皞",yy:"%d 喟膏皞喟掂挨啾嵿案喟班熬喟侧眮"},dayOfMonthOrdinalParse:/\d{1,2}喟�/,ordinal:"%d喟�",meridiemParse:/喟班熬喟む睄喟班翱|喟夃唉喟皞|喟哀啾嵿隘喟距肮啾嵿皑喟倈喟膏熬喟皞喟む睄喟班皞/,meridiemHour:function(e,t){if(e===12)e=0;if(t==="喟班熬喟む睄喟班翱")return e<4?e:e+12;else if(t==="喟夃唉喟皞")return e;else if(t==="喟哀啾嵿隘喟距肮啾嵿皑喟�")return e>=10?e:e+12;else if(t==="喟膏熬喟皞喟む睄喟班皞")return e+12},meridiem:function(e,t,n){if(e<4)return"喟班熬喟む睄喟班翱";else if(e<10)return"喟夃唉喟皞";else if(e<17)return"喟哀啾嵿隘喟距肮啾嵿皑喟�";else if(e<20)return"喟膏熬喟皞喟む睄喟班皞";else return"喟班熬喟む睄喟班翱"},week:{dow:0,doy:6}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("tet",{months:"Janeiru_Fevereiru_Marsu_Abril_Maiu_Ju帽u_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu".split("_"),weekdaysShort:"Dom_Seg_Ters_Kua_Kint_Sest_Sab".split("_"),weekdaysMin:"Do_Seg_Te_Ku_Ki_Ses_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Ohin iha] LT",nextDay:"[Aban iha] LT",nextWeek:"dddd [iha] LT",lastDay:"[Horiseik iha] LT",lastWeek:"dddd [semana kotuk] [iha] LT",sameElse:"L"},relativeTime:{future:"iha %s",past:"%s liuba",s:"segundu balun",ss:"segundu %d",m:"minutu ida",mm:"minutu %d",h:"oras ida",hh:"oras %d",d:"loron ida",dd:"loron %d",M:"fulan ida",MM:"fulan %d",y:"tinan ida",yy:"tinan %d"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10,n=~~(e%100/10)===1?"th":t===1?"st":t===2?"nd":t===3?"rd":"th";return e+n},week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var a={0:"-褍屑",1:"-褍屑",2:"-褞屑",3:"-褞屑",4:"-褍屑",5:"-褍屑",6:"-褍屑",7:"-褍屑",8:"-褍屑",9:"-褍屑",10:"-褍屑",12:"-褍屑",13:"-褍屑",20:"-褍屑",30:"-褞屑",40:"-褍屑",50:"-褍屑",60:"-褍屑",70:"-褍屑",80:"-褍屑",90:"-褍屑",100:"-褍屑"},t;e.defineLocale("tg",{months:{format:"褟薪胁邪褉懈_褎械胁褉邪谢懈_屑邪褉褌懈_邪锌褉械谢懈_屑邪泄懈_懈褞薪懈_懈褞谢懈_邪胁谐褍褋褌懈_褋械薪褌褟斜褉懈_芯泻褌褟斜褉懈_薪芯褟斜褉懈_写械泻邪斜褉懈".split("_"),standalone:"褟薪胁邪褉_褎械胁褉邪谢_屑邪褉褌_邪锌褉械谢_屑邪泄_懈褞薪_懈褞谢_邪胁谐褍褋褌_褋械薪褌褟斜褉_芯泻褌褟斜褉_薪芯褟斜褉_写械泻邪斜褉".split("_")},monthsShort:"褟薪胁_褎械胁_屑邪褉_邪锌褉_屑邪泄_懈褞薪_懈褞谢_邪胁谐_褋械薪_芯泻褌_薪芯褟_写械泻".split("_"),weekdays:"褟泻褕邪薪斜械_写褍褕邪薪斜械_褋械褕邪薪斜械_褔芯褉褕邪薪斜械_锌邪薪曳褕邪薪斜械_曳褍屑褗邪_褕邪薪斜械".split("_"),weekdaysShort:"褟褕斜_写褕斜_褋褕斜_褔褕斜_锌褕斜_曳褍屑_褕薪斜".split("_"),weekdaysMin:"褟褕_写褕_褋褕_褔褕_锌褕_曳屑_褕斜".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[袠屑褉盈蟹 褋芯邪褌懈] LT",nextDay:"[肖邪褉写芯 褋芯邪褌懈] LT",lastDay:"[袛懈褉盈蟹 褋芯邪褌懈] LT",nextWeek:"dddd[懈] [页邪褎褌邪懈 芯褟薪写邪 褋芯邪褌懈] LT",lastWeek:"dddd[懈] [页邪褎褌邪懈 谐褍蟹邪褕褌邪 褋芯邪褌懈] LT",sameElse:"L"},relativeTime:{future:"斜邪褗写懈 %s",past:"%s 锌械褕",s:"褟泻褔邪薪写 褋芯薪懈褟",m:"褟泻 写邪覜懈覜邪",mm:"%d 写邪覜懈覜邪",h:"褟泻 褋芯邪褌",hh:"%d 褋芯邪褌",d:"褟泻 褉盈蟹",dd:"%d 褉盈蟹",M:"褟泻 屑芯页",MM:"%d 屑芯页",y:"褟泻 褋芯谢",yy:"%d 褋芯谢"},meridiemParse:/褕邪斜|褋褍斜页|褉盈蟹|斜械谐芯页/,meridiemHour:function(e,t){if(e===12)e=0;if(t==="褕邪斜")return e<4?e:e+12;else if(t==="褋褍斜页")return e;else if(t==="褉盈蟹")return e>=11?e:e+12;else if(t==="斜械谐芯页")return e+12},meridiem:function(e,t,n){if(e<4)return"褕邪斜";else if(e<11)return"褋褍斜页";else if(e<16)return"褉盈蟹";else if(e<19)return"斜械谐芯页";else return"褕邪斜"},dayOfMonthOrdinalParse:/\d{1,2}-(褍屑|褞屑)/,ordinal:function(e){var t=e%10,n=e>=100?100:null;return e+(a[e]||a[t]||a[n])},week:{dow:1,doy:7}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("th",{months:"喔∴竵喔`覆喔勦浮_喔佮父喔∴笭喔侧笧喔编笝喔樴箤_喔∴傅喔權覆喔勦浮_喙�喔∴俯喔侧涪喔檁喔炧袱喔┼笭喔侧竸喔喔∴复喔栢父喔權覆喔⑧笝_喔佮福喔佮笌喔侧竸喔喔复喔囙斧喔侧竸喔喔佮副喔權涪喔侧涪喔檁喔曕父喔ム覆喔勦浮_喔炧袱喔ㄠ笀喔脆竵喔侧涪喔檁喔樴副喔權抚喔侧竸喔�".split("_"),monthsShort:"喔�.喔�._喔�.喔�._喔∴傅.喔�._喙�喔�.喔�._喔�.喔�._喔∴复.喔�._喔�.喔�._喔�.喔�._喔�.喔�._喔�.喔�._喔�.喔�._喔�.喔�.".split("_"),monthsParseExact:true,weekdays:"喔覆喔椸复喔曕涪喙宊喔堗副喔權笚喔`箤_喔副喔囙竸喔侧福_喔炧父喔榑喔炧袱喔副喔笟喔斷傅_喔ㄠ父喔佮福喙宊喙�喔覆喔`箤".split("_"),weekdaysShort:"喔覆喔椸复喔曕涪喙宊喔堗副喔權笚喔`箤_喔副喔囙竸喔侧福_喔炧父喔榑喔炧袱喔副喔猒喔ㄠ父喔佮福喙宊喙�喔覆喔`箤".split("_"),weekdaysMin:"喔覆._喔�._喔�._喔�._喔炧袱._喔�._喔�.".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY 喙�喔о弗喔� H:mm",LLLL:"喔о副喔檇ddd喔椸傅喙� D MMMM YYYY 喙�喔о弗喔� H:mm"},meridiemParse:/喔佮箞喔笝喙�喔椸傅喙堗涪喔噟喔弗喔编竾喙�喔椸傅喙堗涪喔�/,isPM:function(e){return e==="喔弗喔编竾喙�喔椸傅喙堗涪喔�"},meridiem:function(e,t,n){if(e<12)return"喔佮箞喔笝喙�喔椸傅喙堗涪喔�";else return"喔弗喔编竾喙�喔椸傅喙堗涪喔�"},calendar:{sameDay:"[喔о副喔權笝喔掂箟 喙�喔о弗喔瞉 LT",nextDay:"[喔炧福喔膏箞喔囙笝喔掂箟 喙�喔о弗喔瞉 LT",nextWeek:"dddd[喔笝喙夃覆 喙�喔о弗喔瞉 LT",lastDay:"[喙�喔∴阜喙堗腑喔о覆喔權笝喔掂箟 喙�喔о弗喔瞉 LT",lastWeek:"[喔о副喔橾dddd[喔椸傅喙堗箒喔ム箟喔� 喙�喔о弗喔瞉 LT",sameElse:"L"},relativeTime:{future:"喔傅喔� %s",past:"%s喔椸傅喙堗箒喔ム箟喔�",s:"喙勦浮喙堗竵喔掂箞喔о复喔權覆喔椸傅",ss:"%d 喔о复喔權覆喔椸傅",m:"1 喔權覆喔椸傅",mm:"%d 喔權覆喔椸傅",h:"1 喔娻副喙堗抚喙傕浮喔�",hh:"%d 喔娻副喙堗抚喙傕浮喔�",d:"1 喔о副喔�",dd:"%d 喔о副喔�",w:"1 喔副喔涏笖喔侧斧喙�",ww:"%d 喔副喔涏笖喔侧斧喙�",M:"1 喙�喔斷阜喔笝",MM:"%d 喙�喔斷阜喔笝",y:"1 喔涏傅",yy:"%d 喔涏傅"}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var o={1:"'inji",5:"'inji",8:"'inji",70:"'inji",80:"'inji",2:"'nji",7:"'nji",20:"'nji",50:"'nji",3:"'眉nji",4:"'眉nji",100:"'眉nji",6:"'njy",9:"'unjy",10:"'unjy",30:"'unjy",60:"'ynjy",90:"'ynjy"},t;e.defineLocale("tk",{months:"脻anwar_Fewral_Mart_Aprel_Ma媒_I媒un_I媒ul_Awgust_Sent媒abr_Okt媒abr_No媒abr_Dekabr".split("_"),monthsShort:"脻an_Few_Mar_Apr_Ma媒_I媒n_I媒l_Awg_Sen_Okt_No媒_Dek".split("_"),weekdays:"脻ek艧enbe_Du艧enbe_Si艧enbe_脟ar艧enbe_Pen艧enbe_Anna_艦enbe".split("_"),weekdaysShort:"脻ek_Du艧_Si艧_脟ar_Pen_Ann_艦en".split("_"),weekdaysMin:"脻k_D艧_S艧_脟r_Pn_An_艦n".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug眉n sagat] LT",nextDay:"[ertir sagat] LT",nextWeek:"[indiki] dddd [sagat] LT",lastDay:"[d眉媒n] LT",lastWeek:"[ge莽en] dddd [sagat] LT",sameElse:"L"},relativeTime:{future:"%s so艌",past:"%s 枚艌",s:"birn盲莽e sekunt",m:"bir minut",mm:"%d minut",h:"bir sagat",hh:"%d sagat",d:"bir g眉n",dd:"%d g眉n",M:"bir a媒",MM:"%d a媒",y:"bir 媒yl",yy:"%d 媒yl"},ordinal:function(e,t){switch(t){case"d":case"D":case"Do":case"DD":return e;default:if(e===0)return e+"'unjy";var n=e%10,a=e%100-n,r=e>=100?100:null;return e+(o[n]||o[a]||o[r])}},week:{dow:1,doy:7}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",ss:"%d segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(e){return e},week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var o="pagh_wa鈥檁cha鈥檁wej_loS_vagh_jav_Soch_chorgh_Hut".split("_"),t;function n(e){var t=e;t=e.indexOf("jaj")!==-1?t.slice(0,-3)+"leS":e.indexOf("jar")!==-1?t.slice(0,-3)+"waQ":e.indexOf("DIS")!==-1?t.slice(0,-3)+"nem":t+" pIq";return t}function a(e){var t=e;t=e.indexOf("jaj")!==-1?t.slice(0,-3)+"Hu鈥�":e.indexOf("jar")!==-1?t.slice(0,-3)+"wen":e.indexOf("DIS")!==-1?t.slice(0,-3)+"ben":t+" ret";return t}function r(e,t,n,a){var r=i(e);switch(n){case"ss":return r+" lup";case"mm":return r+" tup";case"hh":return r+" rep";case"dd":return r+" jaj";case"MM":return r+" jar";case"yy":return r+" DIS"}}function i(e){var t=Math.floor(e%1e3/100),n=Math.floor(e%100/10),a=e%10,r="";if(t>0)r+=o[t]+"vatlh";if(n>0)r+=(r!==""?" ":"")+o[n]+"maH";if(a>0)r+=(r!==""?" ":"")+o[a];return r===""?"pagh":r}e.defineLocale("tlh",{months:"tera鈥� jar wa鈥檁tera鈥� jar cha鈥檁tera鈥� jar wej_tera鈥� jar loS_tera鈥� jar vagh_tera鈥� jar jav_tera鈥� jar Soch_tera鈥� jar chorgh_tera鈥� jar Hut_tera鈥� jar wa鈥檓aH_tera鈥� jar wa鈥檓aH wa鈥檁tera鈥� jar wa鈥檓aH cha鈥�".split("_"),monthsShort:"jar wa鈥檁jar cha鈥檁jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa鈥檓aH_jar wa鈥檓aH wa鈥檁jar wa鈥檓aH cha鈥�".split("_"),monthsParseExact:true,weekdays:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysShort:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysMin:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[DaHjaj] LT",nextDay:"[wa鈥檒eS] LT",nextWeek:"LLL",lastDay:"[wa鈥橦u鈥橾 LT",lastWeek:"LLL",sameElse:"L"},relativeTime:{future:n,past:a,s:"puS lup",ss:r,m:"wa鈥� tup",mm:r,h:"wa鈥� rep",hh:r,d:"wa鈥� jaj",dd:r,M:"wa鈥� jar",MM:r,y:"wa鈥� DIS",yy:r},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var o={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'眉nc眉",4:"'眉nc眉",100:"'眉nc眉",6:"'nc谋",9:"'uncu",10:"'uncu",30:"'uncu",60:"'谋nc谋",90:"'谋nc谋"},t;e.defineLocale("tr",{months:"Ocak_艦ubat_Mart_Nisan_May谋s_Haziran_Temmuz_A臒ustos_Eyl眉l_Ekim_Kas谋m_Aral谋k".split("_"),monthsShort:"Oca_艦ub_Mar_Nis_May_Haz_Tem_A臒u_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Sal谋_脟ar艧amba_Per艧embe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pzt_Sal_脟ar_Per_Cum_Cmt".split("_"),weekdaysMin:"Pz_Pt_Sa_脟a_Pe_Cu_Ct".split("_"),meridiem:function(e,t,n){if(e<12)return n?"枚枚":"脰脰";else return n?"枚s":"脰S"},meridiemParse:/枚枚|脰脰|枚s|脰S/,isPM:function(e){return e==="枚s"||e==="脰S"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug眉n saat] LT",nextDay:"[yar谋n saat] LT",nextWeek:"[gelecek] dddd [saat] LT",lastDay:"[d眉n] LT",lastWeek:"[ge莽en] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s 枚nce",s:"birka莽 saniye",ss:"%d saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir g眉n",dd:"%d g眉n",w:"bir hafta",ww:"%d hafta",M:"bir ay",MM:"%d ay",y:"bir y谋l",yy:"%d y谋l"},ordinal:function(e,t){switch(t){case"d":case"D":case"Do":case"DD":return e;default:if(e===0)return e+"'谋nc谋";var n=e%10,a=e%100-n,r=e>=100?100:null;return e+(o[n]||o[a]||o[r])}},week:{dow:1,doy:7}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;function n(e,t,n,a){var r={s:["viensas secunds","'iensas secunds"],ss:[e+" secunds",""+e+" secunds"],m:["'n m铆ut","'iens m铆ut"],mm:[e+" m铆uts",""+e+" m铆uts"],h:["'n 镁ora","'iensa 镁ora"],hh:[e+" 镁oras",""+e+" 镁oras"],d:["'n ziua","'iensa ziua"],dd:[e+" ziuas",""+e+" ziuas"],M:["'n mes","'iens mes"],MM:[e+" mesen",""+e+" mesen"],y:["'n ar","'iens ar"],yy:[e+" ars",""+e+" ars"]};return a?r[n][0]:t?r[n][0]:r[n][1]}e.defineLocale("tzl",{months:"Januar_Fevraglh_Mar莽_Avr茂u_Mai_G眉n_Julia_Guscht_Setemvar_Listop盲ts_Noemvar_Zecemvar".split("_"),monthsShort:"Jan_Fev_Mar_Avr_Mai_G眉n_Jul_Gus_Set_Lis_Noe_Zec".split("_"),weekdays:"S煤ladi_L煤ne莽i_Maitzi_M谩rcuri_Xh煤adi_Vi茅ner莽i_S谩turi".split("_"),weekdaysShort:"S煤l_L煤n_Mai_M谩r_Xh煤_Vi茅_S谩t".split("_"),weekdaysMin:"S煤_L煤_Ma_M谩_Xh_Vi_S谩".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"D. MMMM [dallas] YYYY",LLL:"D. MMMM [dallas] YYYY HH.mm",LLLL:"dddd, [li] D. MMMM [dallas] YYYY HH.mm"},meridiemParse:/d\'o|d\'a/i,isPM:function(e){return"d'o"===e.toLowerCase()},meridiem:function(e,t,n){if(e>11)return n?"d'o":"D'O";else return n?"d'a":"D'A"},calendar:{sameDay:"[oxhi 脿] LT",nextDay:"[dem脿 脿] LT",nextWeek:"dddd [脿] LT",lastDay:"[ieiri 脿] LT",lastWeek:"[s眉r el] dddd [lasteu 脿] LT",sameElse:"L"},relativeTime:{future:"osprei %s",past:"ja%s",s:n,ss:n,m:n,mm:n,h:n,hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("tzm",{months:"獾夆祻獾忊窗獾⑩禂_獯扁禃獯扳耽獾昣獾庘窗獾曗禋_獾夆幢獾斺祲獾擾獾庘窗獾⑩耽獾揰獾⑩祿獾忊耽獾揰獾⑩祿獾嶁耽獾撯担_獾栤祿獾涒禍_獾涒祿獾溾窗獾忊幢獾夆禂_獯解禑獾撯幢獾昣獾忊祿獾♀窗獾忊幢獾夆禂_獯封祿獾娾祻獯扁祲獾�".split("_"),monthsShort:"獾夆祻獾忊窗獾⑩禂_獯扁禃獯扳耽獾昣獾庘窗獾曗禋_獾夆幢獾斺祲獾擾獾庘窗獾⑩耽獾揰獾⑩祿獾忊耽獾揰獾⑩祿獾嶁耽獾撯担_獾栤祿獾涒禍_獾涒祿獾溾窗獾忊幢獾夆禂_獯解禑獾撯幢獾昣獾忊祿獾♀窗獾忊幢獾夆禂_獯封祿獾娾祻獯扁祲獾�".split("_"),weekdays:"獯扳禉獯扳祹獯扳禉_獯扳耽獾忊窗獾檁獯扳禉獾夆祻獯扳禉_獯扳唇獾斺窗獾檁獯扳唇獾♀窗獾檁獯扳禉獾夆祹獾♀窗獾檁獯扳禉獾夆垂獾⑩窗獾�".split("_"),weekdaysShort:"獯扳禉獯扳祹獯扳禉_獯扳耽獾忊窗獾檁獯扳禉獾夆祻獯扳禉_獯扳唇獾斺窗獾檁獯扳唇獾♀窗獾檁獯扳禉獾夆祹獾♀窗獾檁獯扳禉獾夆垂獾⑩窗獾�".split("_"),weekdaysMin:"獯扳禉獯扳祹獯扳禉_獯扳耽獾忊窗獾檁獯扳禉獾夆祻獯扳禉_獯扳唇獾斺窗獾檁獯扳唇獾♀窗獾檁獯扳禉獾夆祹獾♀窗獾檁獯扳禉獾夆垂獾⑩窗獾�".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[獯扳禉獯封祬 獯碷 LT",nextDay:"[獯扳禉獯解窗 獯碷 LT",nextWeek:"dddd [獯碷 LT",lastDay:"[獯扳禋獯扳祻獾� 獯碷 LT",lastWeek:"dddd [獯碷 LT",sameElse:"L"},relativeTime:{future:"獯封窗獯封祬 獾� 獾⑩窗獾� %s",past:"獾⑩窗獾� %s",s:"獾夆祹獾夆唇",ss:"%d 獾夆祹獾夆唇",m:"獾庘祲獾忊祿獯�",mm:"%d 獾庘祲獾忊祿獯�",h:"獾欌窗獾勨窗",hh:"%d 獾溾窗獾欌禉獯扳祫獾夆祻",d:"獯扳禉獾�",dd:"%d o獾欌禉獯扳祻",M:"獯扳耽o獾撯禂",MM:"%d 獾夆耽獾⑩祲獾斺祻",y:"獯扳禉獯斥窗獾�",yy:"%d 獾夆禉獯斥窗獾欌祻"},week:{dow:6,doy:12}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("tzm-latn",{months:"innayr_br摔ayr摔_mar摔s摔_ibrir_mayyw_ywnyw_ywlywz_桑w拧t_拧wtanbir_kt摔wbr摔_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_br摔ayr摔_mar摔s摔_ibrir_mayyw_ywnyw_ywlywz_桑w拧t_拧wtanbir_kt摔wbr摔_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asi岣峺as".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asi岣峺as".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asi岣峺as".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",ss:"%d imik",m:"minu岣�",mm:"%d minu岣�",h:"sa蓻a",hh:"%d tassa蓻in",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("ug-cn",{months:"賷丕賳蹕丕乇_賮蹛蹕乇丕賱_賲丕乇鬲_卅丕倬乇蹛賱_賲丕賷_卅賶賷蹏賳_卅賶賷蹏賱_卅丕蹕睾蹏爻鬲_爻蹛賳鬲蹠亘賶乇_卅蹎賰鬲蹠亘賶乇_賳賵賷丕亘賶乇_丿蹛賰丕亘賶乇".split("_"),monthsShort:"賷丕賳蹕丕乇_賮蹛蹕乇丕賱_賲丕乇鬲_卅丕倬乇蹛賱_賲丕賷_卅賶賷蹏賳_卅賶賷蹏賱_卅丕蹕睾蹏爻鬲_爻蹛賳鬲蹠亘賶乇_卅蹎賰鬲蹠亘賶乇_賳賵賷丕亘賶乇_丿蹛賰丕亘賶乇".split("_"),weekdays:"賷蹠賰卮蹠賳亘蹠_丿蹐卮蹠賳亘蹠_爻蹠賷卮蹠賳亘蹠_趩丕乇卮蹠賳亘蹠_倬蹠賷卮蹠賳亘蹠_噩蹐賲蹠_卮蹠賳亘蹠".split("_"),weekdaysShort:"賷蹠_丿蹐_爻蹠_趩丕_倬蹠_噩蹐_卮蹠".split("_"),weekdaysMin:"賷蹠_丿蹐_爻蹠_趩丕_倬蹠_噩蹐_卮蹠".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY-賷賶賱賶M-卅丕賷賳賶诃D-賰蹐賳賶",LLL:"YYYY-賷賶賱賶M-卅丕賷賳賶诃D-賰蹐賳賶貙 HH:mm",LLLL:"dddd貙 YYYY-賷賶賱賶M-卅丕賷賳賶诃D-賰蹐賳賶貙 HH:mm"},meridiemParse:/賷蹛乇賶賲 賰蹛趩蹠|爻蹠诰蹠乇|趩蹐卮鬲賶賳 亘蹏乇蹏賳|趩蹐卮|趩蹐卮鬲賶賳 賰蹛賷賶賳|賰蹠趩/,meridiemHour:function(e,t){if(e===12)e=0;if(t==="賷蹛乇賶賲 賰蹛趩蹠"||t==="爻蹠诰蹠乇"||t==="趩蹐卮鬲賶賳 亘蹏乇蹏賳")return e;else if(t==="趩蹐卮鬲賶賳 賰蹛賷賶賳"||t==="賰蹠趩")return e+12;else return e>=11?e:e+12},meridiem:function(e,t,n){var a=e*100+t;if(a<600)return"賷蹛乇賶賲 賰蹛趩蹠";else if(a<900)return"爻蹠诰蹠乇";else if(a<1130)return"趩蹐卮鬲賶賳 亘蹏乇蹏賳";else if(a<1230)return"趩蹐卮";else if(a<1800)return"趩蹐卮鬲賶賳 賰蹛賷賶賳";else return"賰蹠趩"},calendar:{sameDay:"[亘蹐诏蹐賳 爻丕卅蹠鬲] LT",nextDay:"[卅蹠鬲蹠 爻丕卅蹠鬲] LT",nextWeek:"[賰蹛賱蹠乇賰賶] dddd [爻丕卅蹠鬲] LT",lastDay:"[鬲蹎賳蹐诏蹐賳] LT",lastWeek:"[卅丕賱丿賶賳賯賶] dddd [爻丕卅蹠鬲] LT",sameElse:"L"},relativeTime:{future:"%s 賰蹛賷賶賳",past:"%s 亘蹏乇蹏賳",s:"賳蹠趩趩蹠 爻蹛賰賵賳鬲",ss:"%d 爻蹛賰賵賳鬲",m:"亘賶乇 賲賶賳蹏鬲",mm:"%d 賲賶賳蹏鬲",h:"亘賶乇 爻丕卅蹠鬲",hh:"%d 爻丕卅蹠鬲",d:"亘賶乇 賰蹐賳",dd:"%d 賰蹐賳",M:"亘賶乇 卅丕賷",MM:"%d 卅丕賷",y:"亘賶乇 賷賶賱",yy:"%d 賷賶賱"},dayOfMonthOrdinalParse:/\d{1,2}(-賰蹐賳賶|-卅丕賷|-诰蹠倬鬲蹠)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"-賰蹐賳賶";case"w":case"W":return e+"-诰蹠倬鬲蹠";default:return e}},preparse:function(e){return e.replace(/貙/g,",")},postformat:function(e){return e.replace(/,/g,"貙")},week:{dow:1,doy:7}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+function r(e,t){var n=e.split("_");return t%10===1&&t%100!==11?n[0]:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?n[1]:n[2]}function t(e,t,n){var a={ss:t?"褋械泻褍薪写邪_褋械泻褍薪写懈_褋械泻褍薪写":"褋械泻褍薪写褍_褋械泻褍薪写懈_褋械泻褍薪写",mm:t?"褏胁懈谢懈薪邪_褏胁懈谢懈薪懈_褏胁懈谢懈薪":"褏胁懈谢懈薪褍_褏胁懈谢懈薪懈_褏胁懈谢懈薪",hh:t?"谐芯写懈薪邪_谐芯写懈薪懈_谐芯写懈薪":"谐芯写懈薪褍_谐芯写懈薪懈_谐芯写懈薪",dd:"写械薪褜_写薪褨_写薪褨胁",MM:"屑褨褋褟褑褜_屑褨褋褟褑褨_屑褨褋褟褑褨胁",yy:"褉褨泻_褉芯泻懈_褉芯泻褨胁"};if(n==="m")return t?"褏胁懈谢懈薪邪":"褏胁懈谢懈薪褍";else if(n==="h")return t?"谐芯写懈薪邪":"谐芯写懈薪褍";else return e+" "+r(a[n],+e)}function n(e,t){var n={nominative:"薪械写褨谢褟_锌芯薪械写褨谢芯泻_胁褨胁褌芯褉芯泻_褋械褉械写邪_褔械褌胁械褉_锌鈥櫻徰傂叫秆喲廮褋褍斜芯褌邪".split("_"),accusative:"薪械写褨谢褞_锌芯薪械写褨谢芯泻_胁褨胁褌芯褉芯泻_褋械褉械写褍_褔械褌胁械褉_锌鈥櫻徰傂叫秆喲巁褋褍斜芯褌褍".split("_"),genitive:"薪械写褨谢褨_锌芯薪械写褨谢泻邪_胁褨胁褌芯褉泻邪_褋械褉械写懈_褔械褌胁械褉谐邪_锌鈥櫻徰傂叫秆喲朹褋褍斜芯褌懈".split("_")},a;if(e===true)return n["nominative"].slice(1,7).concat(n["nominative"].slice(0,1));if(!e)return n["nominative"];a=/(\[[袙胁校褍]\]) ?dddd/.test(t)?"accusative":/\[?(?:屑懈薪褍谢芯褩|薪邪褋褌褍锌薪芯褩)? ?\] ?dddd/.test(t)?"genitive":"nominative";return n[a][e.day()]}function a(e){return function(){return e+"芯"+(this.hours()===11?"斜":"")+"] LT"}}var o;e.defineLocale("uk",{months:{format:"褋褨褔薪褟_谢褞褌芯谐芯_斜械褉械蟹薪褟_泻胁褨褌薪褟_褌褉邪胁薪褟_褔械褉胁薪褟_谢懈锌薪褟_褋械褉锌薪褟_胁械褉械褋薪褟_卸芯胁褌薪褟_谢懈褋褌芯锌邪写邪_谐褉褍写薪褟".split("_"),standalone:"褋褨褔械薪褜_谢褞褌懈泄_斜械褉械蟹械薪褜_泻胁褨褌械薪褜_褌褉邪胁械薪褜_褔械褉胁械薪褜_谢懈锌械薪褜_褋械褉锌械薪褜_胁械褉械褋械薪褜_卸芯胁褌械薪褜_谢懈褋褌芯锌邪写_谐褉褍写械薪褜".split("_")},monthsShort:"褋褨褔_谢褞褌_斜械褉_泻胁褨褌_褌褉邪胁_褔械褉胁_谢懈锌_褋械褉锌_胁械褉_卸芯胁褌_谢懈褋褌_谐褉褍写".split("_"),weekdays:n,weekdaysShort:"薪写_锌薪_胁褌_褋褉_褔褌_锌褌_褋斜".split("_"),weekdaysMin:"薪写_锌薪_胁褌_褋褉_褔褌_锌褌_褋斜".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY 褉.",LLL:"D MMMM YYYY 褉., HH:mm",LLLL:"dddd, D MMMM YYYY 褉., HH:mm"},calendar:{sameDay:a("[小褜芯谐芯写薪褨 "),nextDay:a("[袟邪胁褌褉邪 "),lastDay:a("[袙褔芯褉邪 "),nextWeek:a("[校] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return a("[袦懈薪褍谢芯褩] dddd [").call(this);case 1:case 2:case 4:return a("[袦懈薪褍谢芯谐芯] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"蟹邪 %s",past:"%s 褌芯屑褍",s:"写械泻褨谢褜泻邪 褋械泻褍薪写",ss:t,m:t,mm:t,h:"谐芯写懈薪褍",hh:t,d:"写械薪褜",dd:t,M:"屑褨褋褟褑褜",MM:t,y:"褉褨泻",yy:t},meridiemParse:/薪芯褔褨|褉邪薪泻褍|写薪褟|胁械褔芯褉邪/,isPM:function(e){return/^(写薪褟|胁械褔芯褉邪)$/.test(e)},meridiem:function(e,t,n){if(e<4)return"薪芯褔褨";else if(e<12)return"褉邪薪泻褍";else if(e<17)return"写薪褟";else return"胁械褔芯褉邪"},dayOfMonthOrdinalParse:/\d{1,2}-(泄|谐芯)/,ordinal:function(e,t){switch(t){case"M":case"d":case"DDD":case"w":case"W":return e+"-泄";case"D":return e+"-谐芯";default:return e}},week:{dow:1,doy:7}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t=["噩賳賵乇蹖","賮乇賵乇蹖","賲丕乇趩","丕倬乇蹖賱","賲卅蹖","噩賵賳","噩賵賱丕卅蹖","丕诏爻鬲","爻鬲賲亘乇","丕讴鬲賵亘乇","賳賵賲亘乇","丿爻賲亘乇"],n=["丕鬲賵丕乇","倬蹖乇","賲賳诏賱","亘丿诰","噩賲毓乇丕鬲","噩賲毓蹃","蹃賮鬲蹃"],a;e.defineLocale("ur",{months:t,monthsShort:t,weekdays:n,weekdaysShort:n,weekdaysMin:n,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd貙 D MMMM YYYY HH:mm"},meridiemParse:/氐亘丨|卮丕賲/,isPM:function(e){return"卮丕賲"===e},meridiem:function(e,t,n){if(e<12)return"氐亘丨";return"卮丕賲"},calendar:{sameDay:"[丌噩 亘賵賯鬲] LT",nextDay:"[讴賱 亘賵賯鬲] LT",nextWeek:"dddd [亘賵賯鬲] LT",lastDay:"[诏匕卮鬲蹃 乇賵夭 亘賵賯鬲] LT",lastWeek:"[诏匕卮鬲蹃] dddd [亘賵賯鬲] LT",sameElse:"L"},relativeTime:{future:"%s 亘毓丿",past:"%s 賯亘賱",s:"趩賳丿 爻蹖讴賳趫",ss:"%d 爻蹖讴賳趫",m:"丕蹖讴 賲賳俟",mm:"%d 賲賳俟",h:"丕蹖讴 诏诰賳俟蹃",hh:"%d 诏诰賳俟蹝",d:"丕蹖讴 丿賳",dd:"%d 丿賳",M:"丕蹖讴 賲丕蹃",MM:"%d 賲丕蹃",y:"丕蹖讴 爻丕賱",yy:"%d 爻丕賱"},preparse:function(e){return e.replace(/貙/g,",")},postformat:function(e){return e.replace(/,/g,"貙")},week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("uz",{months:"褟薪胁邪褉_褎械胁褉邪谢_屑邪褉褌_邪锌褉械谢_屑邪泄_懈褞薪_懈褞谢_邪胁谐褍褋褌_褋械薪褌褟斜褉_芯泻褌褟斜褉_薪芯褟斜褉_写械泻邪斜褉".split("_"),monthsShort:"褟薪胁_褎械胁_屑邪褉_邪锌褉_屑邪泄_懈褞薪_懈褞谢_邪胁谐_褋械薪_芯泻褌_薪芯褟_写械泻".split("_"),weekdays:"携泻褕邪薪斜邪_袛褍褕邪薪斜邪_小械褕邪薪斜邪_效芯褉褕邪薪斜邪_袩邪泄褕邪薪斜邪_袞褍屑邪_楔邪薪斜邪".split("_"),weekdaysShort:"携泻褕_袛褍褕_小械褕_效芯褉_袩邪泄_袞褍屑_楔邪薪".split("_"),weekdaysMin:"携泻_袛褍_小械_效芯_袩邪_袞褍_楔邪".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[袘褍谐褍薪 褋芯邪褌] LT [写邪]",nextDay:"[协褉褌邪谐邪] LT [写邪]",nextWeek:"dddd [泻褍薪懈 褋芯邪褌] LT [写邪]",lastDay:"[袣械褔邪 褋芯邪褌] LT [写邪]",lastWeek:"[校褌谐邪薪] dddd [泻褍薪懈 褋芯邪褌] LT [写邪]",sameElse:"L"},relativeTime:{future:"携泻懈薪 %s 懈褔懈写邪",past:"袘懈褉 薪械褔邪 %s 芯谢写懈薪",s:"褎褍褉褋邪褌",ss:"%d 褎褍褉褋邪褌",m:"斜懈褉 写邪泻懈泻邪",mm:"%d 写邪泻懈泻邪",h:"斜懈褉 褋芯邪褌",hh:"%d 褋芯邪褌",d:"斜懈褉 泻褍薪",dd:"%d 泻褍薪",M:"斜懈褉 芯泄",MM:"%d 芯泄",y:"斜懈褉 泄懈谢",yy:"%d 泄懈谢"},week:{dow:1,doy:7}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("uz-latn",{months:"Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr".split("_"),monthsShort:"Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek".split("_"),weekdays:"Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba".split("_"),weekdaysShort:"Yak_Dush_Sesh_Chor_Pay_Jum_Shan".split("_"),weekdaysMin:"Ya_Du_Se_Cho_Pa_Ju_Sha".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[Bugun soat] LT [da]",nextDay:"[Ertaga] LT [da]",nextWeek:"dddd [kuni soat] LT [da]",lastDay:"[Kecha soat] LT [da]",lastWeek:"[O'tgan] dddd [kuni soat] LT [da]",sameElse:"L"},relativeTime:{future:"Yaqin %s ichida",past:"Bir necha %s oldin",s:"soniya",ss:"%d soniya",m:"bir daqiqa",mm:"%d daqiqa",h:"bir soat",hh:"%d soat",d:"bir kun",dd:"%d kun",M:"bir oy",MM:"%d oy",y:"bir yil",yy:"%d yil"},week:{dow:1,doy:7}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("vi",{months:"th谩ng 1_th谩ng 2_th谩ng 3_th谩ng 4_th谩ng 5_th谩ng 6_th谩ng 7_th谩ng 8_th谩ng 9_th谩ng 10_th谩ng 11_th谩ng 12".split("_"),monthsShort:"Thg 01_Thg 02_Thg 03_Thg 04_Thg 05_Thg 06_Thg 07_Thg 08_Thg 09_Thg 10_Thg 11_Thg 12".split("_"),monthsParseExact:true,weekdays:"ch峄� nh岷璽_th峄� hai_th峄� ba_th峄� t瓢_th峄� n膬m_th峄� s谩u_th峄� b岷".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysParseExact:true,meridiemParse:/sa|ch/i,isPM:function(e){return/^ch$/i.test(e)},meridiem:function(e,t,n){if(e<12)return n?"sa":"SA";else return n?"ch":"CH"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [n膬m] YYYY",LLL:"D MMMM [n膬m] YYYY HH:mm",LLLL:"dddd, D MMMM [n膬m] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[H么m nay l煤c] LT",nextDay:"[Ng脿y mai l煤c] LT",nextWeek:"dddd [tu岷 t峄沬 l煤c] LT",lastDay:"[H么m qua l煤c] LT",lastWeek:"dddd [tu岷 tr瓢峄沜 l煤c] LT",sameElse:"L"},relativeTime:{future:"%s t峄沬",past:"%s tr瓢峄沜",s:"v脿i gi芒y",ss:"%d gi芒y",m:"m峄檛 ph煤t",mm:"%d ph煤t",h:"m峄檛 gi峄�",hh:"%d gi峄�",d:"m峄檛 ng脿y",dd:"%d ng脿y",w:"m峄檛 tu岷",ww:"%d tu岷",M:"m峄檛 th谩ng",MM:"%d th谩ng",y:"m峄檛 n膬m",yy:"%d n膬m"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(e){return e},week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("x-pseudo",{months:"J~谩帽煤谩~r媒_F~茅br煤~谩r媒_~M谩rc~h_脕p~r铆l_~M谩媒_~J煤帽茅~_J煤l~媒_脕煤~g煤st~_S茅p~t茅mb~茅r_脫~ct贸b~茅r_脩~贸v茅m~b茅r_~D茅c茅~mb茅r".split("_"),monthsShort:"J~谩帽_~F茅b_~M谩r_~脕pr_~M谩媒_~J煤帽_~J煤l_~脕煤g_~S茅p_~脫ct_~脩贸v_~D茅c".split("_"),monthsParseExact:true,weekdays:"S~煤帽d谩~媒_M贸~帽d谩媒~_T煤茅~sd谩媒~_W茅d~帽茅sd~谩媒_T~h煤rs~d谩媒_~Fr铆d~谩媒_S~谩t煤r~d谩媒".split("_"),weekdaysShort:"S~煤帽_~M贸帽_~T煤茅_~W茅d_~Th煤_~Fr铆_~S谩t".split("_"),weekdaysMin:"S~煤_M贸~_T煤_~W茅_T~h_Fr~_S谩".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[T~贸d谩~媒 谩t] LT",nextDay:"[T~贸m贸~rr贸~w 谩t] LT",nextWeek:"dddd [谩t] LT",lastDay:"[脻~茅st~茅rd谩~媒 谩t] LT",lastWeek:"[L~谩st] dddd [谩t] LT",sameElse:"L"},relativeTime:{future:"铆~帽 %s",past:"%s 谩~g贸",s:"谩 ~f茅w ~s茅c贸~帽ds",ss:"%d s~茅c贸帽~ds",m:"谩 ~m铆帽~煤t茅",mm:"%d m~铆帽煤~t茅s",h:"谩~帽 h贸~煤r",hh:"%d h~贸煤rs",d:"谩 ~d谩媒",dd:"%d d~谩媒s",M:"谩 ~m贸帽~th",MM:"%d m~贸帽t~hs",y:"谩 ~媒茅谩r",yy:"%d 媒~茅谩rs"},dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10,n=~~(e%100/10)===1?"th":t===1?"st":t===2?"nd":t===3?"rd":"th";return e+n},week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("yo",{months:"S岷固乺岷固乢E虁re虁le虁_岷竢岷固�na虁_I虁gbe虂_E虁bibi_O虁ku虁du_Ag岷筸o_O虁gu虂n_Owewe_峄屘�wa虁ra虁_Be虂lu虂_峄屘�p岷固�虁".split("_"),monthsShort:"S岷固乺_E虁rl_岷竢n_I虁gb_E虁bi_O虁ku虁_Ag岷筥O虁gu虂_Owe_峄屘�wa虁_Be虂l_峄屘�p岷固�虁".split("_"),weekdays:"A虁i虁ku虂_Aje虂_I虁s岷固乬un_峄宩峄嵦乺u虂_峄宩峄嵦乥峄峗岷竧i虁_A虁ba虂m岷固乼a".split("_"),weekdaysShort:"A虁i虁k_Aje虂_I虁s岷固乢峄宩r_峄宩b_岷竧i虁_A虁ba虂".split("_"),weekdaysMin:"A虁i虁_Aj_I虁s_峄宺_峄宐_岷竧_A虁b".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[O虁ni虁 ni] LT",nextDay:"[峄屘�la ni] LT",nextWeek:"dddd [峄宻岷固� to虂n'b峄峕 [ni] LT",lastDay:"[A虁na ni] LT",lastWeek:"dddd [峄宻岷固� to虂l峄嵦乚 [ni] LT",sameElse:"L"},relativeTime:{future:"ni虂 %s",past:"%s k峄峧a虂",s:"i虁s岷筳u虂 aaya虂 die",ss:"aaya虂 %d",m:"i虁s岷筳u虂 kan",mm:"i虁s岷筳u虂 %d",h:"wa虂kati kan",hh:"wa虂kati %d",d:"峄峧峄嵦� kan",dd:"峄峧峄嵦� %d",M:"osu虁 kan",MM:"osu虁 %d",y:"峄峝u虂n kan",yy:"峄峝u虂n %d"},dayOfMonthOrdinalParse:/峄峧峄嵦乗s\d{1,2}/,ordinal:"峄峧峄嵦� %d",week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("zh-cn",{months:"涓�鏈坃浜屾湀_涓夋湀_鍥涙湀_浜旀湀_鍏湀_涓冩湀_鍏湀_涔濇湀_鍗佹湀_鍗佷竴鏈坃鍗佷簩鏈�".split("_"),monthsShort:"1鏈坃2鏈坃3鏈坃4鏈坃5鏈坃6鏈坃7鏈坃8鏈坃9鏈坃10鏈坃11鏈坃12鏈�".split("_"),weekdays:"鏄熸湡鏃鏄熸湡涓�_鏄熸湡浜宊鏄熸湡涓塤鏄熸湡鍥沖鏄熸湡浜擾鏄熸湡鍏�".split("_"),weekdaysShort:"鍛ㄦ棩_鍛ㄤ竴_鍛ㄤ簩_鍛ㄤ笁_鍛ㄥ洓_鍛ㄤ簲_鍛ㄥ叚".split("_"),weekdaysMin:"鏃涓�_浜宊涓塤鍥沖浜擾鍏�".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY骞碝鏈圖鏃�",LLL:"YYYY骞碝鏈圖鏃h鐐筸m鍒�",LLLL:"YYYY骞碝鏈圖鏃dddAh鐐筸m鍒�",l:"YYYY/M/D",ll:"YYYY骞碝鏈圖鏃�",lll:"YYYY骞碝鏈圖鏃� HH:mm",llll:"YYYY骞碝鏈圖鏃ddd HH:mm"},meridiemParse:/鍑屾櫒|鏃╀笂|涓婂崍|涓崍|涓嬪崍|鏅氫笂/,meridiemHour:function(e,t){if(e===12)e=0;if(t==="鍑屾櫒"||t==="鏃╀笂"||t==="涓婂崍")return e;else if(t==="涓嬪崍"||t==="鏅氫笂")return e+12;else return e>=11?e:e+12},meridiem:function(e,t,n){var a=e*100+t;if(a<600)return"鍑屾櫒";else if(a<900)return"鏃╀笂";else if(a<1130)return"涓婂崍";else if(a<1230)return"涓崍";else if(a<1800)return"涓嬪崍";else return"鏅氫笂"},calendar:{sameDay:"[浠婂ぉ]LT",nextDay:"[鏄庡ぉ]LT",nextWeek:function(e){if(e.week()!==this.week())return"[涓媇dddLT";else return"[鏈琞dddLT"},lastDay:"[鏄ㄥぉ]LT",lastWeek:function(e){if(this.week()!==e.week())return"[涓奭dddLT";else return"[鏈琞dddLT"},sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(鏃鏈坾鍛�)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"鏃�";case"M":return e+"鏈�";case"w":case"W":return e+"鍛�";default:return e}},relativeTime:{future:"%s鍚�",past:"%s鍓�",s:"鍑犵",ss:"%d 绉�",m:"1 鍒嗛挓",mm:"%d 鍒嗛挓",h:"1 灏忔椂",hh:"%d 灏忔椂",d:"1 澶�",dd:"%d 澶�",w:"1 鍛�",ww:"%d 鍛�",M:"1 涓湀",MM:"%d 涓湀",y:"1 骞�",yy:"%d 骞�"},week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("zh-hk",{months:"涓�鏈坃浜屾湀_涓夋湀_鍥涙湀_浜旀湀_鍏湀_涓冩湀_鍏湀_涔濇湀_鍗佹湀_鍗佷竴鏈坃鍗佷簩鏈�".split("_"),monthsShort:"1鏈坃2鏈坃3鏈坃4鏈坃5鏈坃6鏈坃7鏈坃8鏈坃9鏈坃10鏈坃11鏈坃12鏈�".split("_"),weekdays:"鏄熸湡鏃鏄熸湡涓�_鏄熸湡浜宊鏄熸湡涓塤鏄熸湡鍥沖鏄熸湡浜擾鏄熸湡鍏�".split("_"),weekdaysShort:"閫辨棩_閫变竴_閫变簩_閫变笁_閫卞洓_閫变簲_閫卞叚".split("_"),weekdaysMin:"鏃涓�_浜宊涓塤鍥沖浜擾鍏�".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY骞碝鏈圖鏃�",LLL:"YYYY骞碝鏈圖鏃� HH:mm",LLLL:"YYYY骞碝鏈圖鏃ddd HH:mm",l:"YYYY/M/D",ll:"YYYY骞碝鏈圖鏃�",lll:"YYYY骞碝鏈圖鏃� HH:mm",llll:"YYYY骞碝鏈圖鏃ddd HH:mm"},meridiemParse:/鍑屾櫒|鏃╀笂|涓婂崍|涓崍|涓嬪崍|鏅氫笂/,meridiemHour:function(e,t){if(e===12)e=0;if(t==="鍑屾櫒"||t==="鏃╀笂"||t==="涓婂崍")return e;else if(t==="涓崍")return e>=11?e:e+12;else if(t==="涓嬪崍"||t==="鏅氫笂")return e+12},meridiem:function(e,t,n){var a=e*100+t;if(a<600)return"鍑屾櫒";else if(a<900)return"鏃╀笂";else if(a<1200)return"涓婂崍";else if(a===1200)return"涓崍";else if(a<1800)return"涓嬪崍";else return"鏅氫笂"},calendar:{sameDay:"[浠婂ぉ]LT",nextDay:"[鏄庡ぉ]LT",nextWeek:"[涓媇ddddLT",lastDay:"[鏄ㄥぉ]LT",lastWeek:"[涓奭ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(鏃鏈坾閫�)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"鏃�";case"M":return e+"鏈�";case"w":case"W":return e+"閫�";default:return e}},relativeTime:{future:"%s寰�",past:"%s鍓�",s:"骞剧",ss:"%d 绉�",m:"1 鍒嗛悩",mm:"%d 鍒嗛悩",h:"1 灏忔檪",hh:"%d 灏忔檪",d:"1 澶�",dd:"%d 澶�",M:"1 鍊嬫湀",MM:"%d 鍊嬫湀",y:"1 骞�",yy:"%d 骞�"}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("zh-mo",{months:"涓�鏈坃浜屾湀_涓夋湀_鍥涙湀_浜旀湀_鍏湀_涓冩湀_鍏湀_涔濇湀_鍗佹湀_鍗佷竴鏈坃鍗佷簩鏈�".split("_"),monthsShort:"1鏈坃2鏈坃3鏈坃4鏈坃5鏈坃6鏈坃7鏈坃8鏈坃9鏈坃10鏈坃11鏈坃12鏈�".split("_"),weekdays:"鏄熸湡鏃鏄熸湡涓�_鏄熸湡浜宊鏄熸湡涓塤鏄熸湡鍥沖鏄熸湡浜擾鏄熸湡鍏�".split("_"),weekdaysShort:"閫辨棩_閫变竴_閫变簩_閫变笁_閫卞洓_閫变簲_閫卞叚".split("_"),weekdaysMin:"鏃涓�_浜宊涓塤鍥沖浜擾鍏�".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"YYYY骞碝鏈圖鏃�",LLL:"YYYY骞碝鏈圖鏃� HH:mm",LLLL:"YYYY骞碝鏈圖鏃ddd HH:mm",l:"D/M/YYYY",ll:"YYYY骞碝鏈圖鏃�",lll:"YYYY骞碝鏈圖鏃� HH:mm",llll:"YYYY骞碝鏈圖鏃ddd HH:mm"},meridiemParse:/鍑屾櫒|鏃╀笂|涓婂崍|涓崍|涓嬪崍|鏅氫笂/,meridiemHour:function(e,t){if(e===12)e=0;if(t==="鍑屾櫒"||t==="鏃╀笂"||t==="涓婂崍")return e;else if(t==="涓崍")return e>=11?e:e+12;else if(t==="涓嬪崍"||t==="鏅氫笂")return e+12},meridiem:function(e,t,n){var a=e*100+t;if(a<600)return"鍑屾櫒";else if(a<900)return"鏃╀笂";else if(a<1130)return"涓婂崍";else if(a<1230)return"涓崍";else if(a<1800)return"涓嬪崍";else return"鏅氫笂"},calendar:{sameDay:"[浠婂ぉ] LT",nextDay:"[鏄庡ぉ] LT",nextWeek:"[涓媇dddd LT",lastDay:"[鏄ㄥぉ] LT",lastWeek:"[涓奭dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(鏃鏈坾閫�)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"鏃�";case"M":return e+"鏈�";case"w":case"W":return e+"閫�";default:return e}},relativeTime:{future:"%s鍏�",past:"%s鍓�",s:"骞剧",ss:"%d 绉�",m:"1 鍒嗛悩",mm:"%d 鍒嗛悩",h:"1 灏忔檪",hh:"%d 灏忔檪",d:"1 澶�",dd:"%d 澶�",M:"1 鍊嬫湀",MM:"%d 鍊嬫湀",y:"1 骞�",yy:"%d 骞�"}})}(n(9))},function(e,t,n){!function(e){"use strict";
+//! moment.js locale configuration
+var t;e.defineLocale("zh-tw",{months:"涓�鏈坃浜屾湀_涓夋湀_鍥涙湀_浜旀湀_鍏湀_涓冩湀_鍏湀_涔濇湀_鍗佹湀_鍗佷竴鏈坃鍗佷簩鏈�".split("_"),monthsShort:"1鏈坃2鏈坃3鏈坃4鏈坃5鏈坃6鏈坃7鏈坃8鏈坃9鏈坃10鏈坃11鏈坃12鏈�".split("_"),weekdays:"鏄熸湡鏃鏄熸湡涓�_鏄熸湡浜宊鏄熸湡涓塤鏄熸湡鍥沖鏄熸湡浜擾鏄熸湡鍏�".split("_"),weekdaysShort:"閫辨棩_閫变竴_閫变簩_閫变笁_閫卞洓_閫变簲_閫卞叚".split("_"),weekdaysMin:"鏃涓�_浜宊涓塤鍥沖浜擾鍏�".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY骞碝鏈圖鏃�",LLL:"YYYY骞碝鏈圖鏃� HH:mm",LLLL:"YYYY骞碝鏈圖鏃ddd HH:mm",l:"YYYY/M/D",ll:"YYYY骞碝鏈圖鏃�",lll:"YYYY骞碝鏈圖鏃� HH:mm",llll:"YYYY骞碝鏈圖鏃ddd HH:mm"},meridiemParse:/鍑屾櫒|鏃╀笂|涓婂崍|涓崍|涓嬪崍|鏅氫笂/,meridiemHour:function(e,t){if(e===12)e=0;if(t==="鍑屾櫒"||t==="鏃╀笂"||t==="涓婂崍")return e;else if(t==="涓崍")return e>=11?e:e+12;else if(t==="涓嬪崍"||t==="鏅氫笂")return e+12},meridiem:function(e,t,n){var a=e*100+t;if(a<600)return"鍑屾櫒";else if(a<900)return"鏃╀笂";else if(a<1130)return"涓婂崍";else if(a<1230)return"涓崍";else if(a<1800)return"涓嬪崍";else return"鏅氫笂"},calendar:{sameDay:"[浠婂ぉ] LT",nextDay:"[鏄庡ぉ] LT",nextWeek:"[涓媇dddd LT",lastDay:"[鏄ㄥぉ] LT",lastWeek:"[涓奭dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(鏃鏈坾閫�)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"鏃�";case"M":return e+"鏈�";case"w":case"W":return e+"閫�";default:return e}},relativeTime:{future:"%s寰�",past:"%s鍓�",s:"骞剧",ss:"%d 绉�",m:"1 鍒嗛悩",mm:"%d 鍒嗛悩",h:"1 灏忔檪",hh:"%d 灏忔檪",d:"1 澶�",dd:"%d 澶�",M:"1 鍊嬫湀",MM:"%d 鍊嬫湀",y:"1 骞�",yy:"%d 骞�"}})}(n(9))},function(e,t,n){"use strict";t.__esModule=!0;var u=p(n(2)),a=p(n(4)),r=p(n(6)),o=p(n(7)),i=n(0),d=p(i),l=p(n(3)),c=p(n(13)),s=p(n(8)),f=n(11);function p(e){return e&&e.__esModule?e:{default:e}}h=i.Component,(0,o.default)(m,h),m.prototype.render=function(){var e,t=this.props,n=t.prefix,a=t.type,r=t.size,o=t.className,i=t.rtl,l=t.style,t=t.children,s=f.obj.pickOthers((0,u.default)({},m.propTypes),this.props),n=(0,c.default)(((e={})[n+"icon"]=!0,e[n+"icon-"+a]=!!a,e[""+n+r]=!!r&&"string"==typeof r,e[o]=!!o,e)),o=(i&&-1!==["arrow-left","arrow-right","arrow-double-left","arrow-double-right","switch","sorting","descending","ascending"].indexOf(a)&&(s.dir="rtl"),"number"==typeof r?{width:r,height:r,lineHeight:r+"px",fontSize:r}:{});return d.default.createElement("i",(0,u.default)({},s,{style:(0,u.default)({},o,l),className:n}),t)},i=n=m,n.propTypes=(0,u.default)({},s.default.propTypes,{type:l.default.string,children:l.default.node,size:l.default.oneOfType([l.default.oneOf(["xxs","xs","small","medium","large","xl","xxl","xxxl","inherit"]),l.default.number]),className:l.default.string,style:l.default.object}),n.defaultProps={prefix:"next-",size:"medium"},n._typeMark="icon";var h,o=i;function m(){return(0,a.default)(this,m),(0,r.default)(this,h.apply(this,arguments))}o.displayName="Icon",t.default=o,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var g=s(n(2)),y=s(n(12)),a=s(n(38)),r=s(n(4)),o=s(n(6)),i=s(n(7)),v=n(0),_=s(v),l=s(n(3)),b=n(157),w=s(n(525));function s(e){return e&&e.__esModule?e:{default:e}}function u(){}function M(e){return _.default.Children.toArray(e.children)[0]||null}d=v.Component,(0,i.default)(c,d),c.prototype.normalizeNames=function(e){return"string"==typeof e?{appear:e+"-appear",appearActive:e+"-appear-active",enter:e+"-enter",enterActive:e+"-enter-active",leave:e+"-leave",leaveActive:e+"-leave-active"}:"object"===(void 0===e?"undefined":(0,a.default)(e))?{appear:e.appear,appearActive:e.appear+"-active",enter:""+e.enter,enterActive:e.enter+"-active",leave:""+e.leave,leaveActive:e.leave+"-active"}:void 0},c.prototype.render=function(){var t=this,e=this.props,n=e.animation,a=e.children,r=e.animationAppear,o=e.singleMode,i=e.component,l=e.beforeAppear,s=e.onAppear,u=e.afterAppear,d=e.beforeEnter,c=e.onEnter,f=e.afterEnter,p=e.beforeLeave,h=e.onLeave,m=e.afterLeave,e=(0,y.default)(e,["animation","children","animationAppear","singleMode","component","beforeAppear","onAppear","afterAppear","beforeEnter","onEnter","afterEnter","beforeLeave","onLeave","afterLeave"]),a=v.Children.map(a,function(e){return _.default.createElement(w.default,{key:e.key,names:t.normalizeNames(n),onAppear:l,onAppearing:s,onAppeared:u,onEnter:d,onEntering:c,onEntered:f,onExit:p,onExiting:h,onExited:m},e)});return _.default.createElement(b.TransitionGroup,(0,g.default)({appear:r,component:o?M:i},e),a)},i=n=c,n.propTypes={animation:l.default.oneOfType([l.default.string,l.default.object]),animationAppear:l.default.bool,component:l.default.any,singleMode:l.default.bool,children:l.default.oneOfType([l.default.element,l.default.arrayOf(l.default.element)]),beforeAppear:l.default.func,onAppear:l.default.func,afterAppear:l.default.func,beforeEnter:l.default.func,onEnter:l.default.func,afterEnter:l.default.func,beforeLeave:l.default.func,onLeave:l.default.func,afterLeave:l.default.func},n.defaultProps={animationAppear:!0,component:"div",singleMode:!0,beforeAppear:u,onAppear:u,afterAppear:u,beforeEnter:u,onEnter:u,afterEnter:u,beforeLeave:u,onLeave:u,afterLeave:u};var d,l=i;function c(){return(0,r.default)(this,c),(0,o.default)(this,d.apply(this,arguments))}l.displayName="Animate",t.default=l,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=t.EXITING=t.ENTERED=t.ENTERING=t.EXITED=t.UNMOUNTED=void 0;var a=function(e){{if(e&&e.__esModule)return e;var t,n={};if(null!=e)for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&((t=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,a):{}).get||t.set?Object.defineProperty(n,a,t):n[a]=e[a]);return n.default=e,n}}(n(3)),o=l(n(0)),i=l(n(23)),r=n(30);n(346);function l(e){return e&&e.__esModule?e:{default:e}}var s="unmounted",u=(t.UNMOUNTED=s,"exited"),d=(t.EXITED=u,"entering"),c=(t.ENTERING=d,"entered"),f=(t.ENTERED=c,"exiting"),n=(t.EXITING=f,function(r){var e;function t(e,t){var n,a=r.call(this,e,t)||this,t=t.transitionGroup,t=t&&!t.isMounting?e.enter:e.appear;return a.appearStatus=null,e.in?t?(n=u,a.appearStatus=d):n=c:n=e.unmountOnExit||e.mountOnEnter?s:u,a.state={status:n},a.nextCallback=null,a}e=r,(n=t).prototype=Object.create(e.prototype),(n.prototype.constructor=n).__proto__=e;var n=t.prototype;return n.getChildContext=function(){return{transitionGroup:null}},t.getDerivedStateFromProps=function(e,t){return e.in&&t.status===s?{status:u}:null},n.componentDidMount=function(){this.updateStatus(!0,this.appearStatus)},n.componentDidUpdate=function(e){var t=null;e!==this.props&&(e=this.state.status,this.props.in?e!==d&&e!==c&&(t=d):e!==d&&e!==c||(t=f)),this.updateStatus(!1,t)},n.componentWillUnmount=function(){this.cancelNextCallback()},n.getTimeouts=function(){var e,t,n=this.props.timeout,a=e=t=n;return null!=n&&"number"!=typeof n&&(a=n.exit,e=n.enter,t=void 0!==n.appear?n.appear:e),{exit:a,enter:e,appear:t}},n.updateStatus=function(e,t){var n;void 0===e&&(e=!1),null!==t?(this.cancelNextCallback(),n=i.default.findDOMNode(this),t===d?this.performEnter(n,e):this.performExit(n)):this.props.unmountOnExit&&this.state.status===u&&this.setState({status:s})},n.performEnter=function(e,t){var n=this,a=this.props.enter,r=this.context.transitionGroup?this.context.transitionGroup.isMounting:t,o=this.getTimeouts(),i=r?o.appear:o.enter;t||a?(this.props.onEnter(e,r),this.safeSetState({status:d},function(){n.props.onEntering(e,r),n.onTransitionEnd(e,i,function(){n.safeSetState({status:c},function(){n.props.onEntered(e,r)})})})):this.safeSetState({status:c},function(){n.props.onEntered(e)})},n.performExit=function(e){var t=this,n=this.props.exit,a=this.getTimeouts();n?(this.props.onExit(e),this.safeSetState({status:f},function(){t.props.onExiting(e),t.onTransitionEnd(e,a.exit,function(){t.safeSetState({status:u},function(){t.props.onExited(e)})})})):this.safeSetState({status:u},function(){t.props.onExited(e)})},n.cancelNextCallback=function(){null!==this.nextCallback&&(this.nextCallback.cancel(),this.nextCallback=null)},n.safeSetState=function(e,t){t=this.setNextCallback(t),this.setState(e,t)},n.setNextCallback=function(t){var n=this,a=!0;return this.nextCallback=function(e){a&&(a=!1,n.nextCallback=null,t(e))},this.nextCallback.cancel=function(){a=!1},this.nextCallback},n.onTransitionEnd=function(e,t,n){this.setNextCallback(n);n=null==t&&!this.props.addEndListener;!e||n?setTimeout(this.nextCallback,0):(this.props.addEndListener&&this.props.addEndListener(e,this.nextCallback),null!=t&&setTimeout(this.nextCallback,t))},n.render=function(){var e=this.state.status;if(e===s)return null;var t=this.props,n=t.children,t=function(e,t){if(null==e)return{};for(var n,a={},r=Object.keys(e),o=0;o<r.length;o++)n=r[o],0<=t.indexOf(n)||(a[n]=e[n]);return a}(t,["children"]);if(delete t.in,delete t.mountOnEnter,delete t.unmountOnExit,delete t.appear,delete t.enter,delete t.exit,delete t.timeout,delete t.addEndListener,delete t.onEnter,delete t.onEntering,delete t.onEntered,delete t.onExit,delete t.onExiting,delete t.onExited,"function"==typeof n)return n(e,t);e=o.default.Children.only(n);return o.default.cloneElement(e,t)},t}(o.default.Component));function p(){}n.contextTypes={transitionGroup:a.object},n.childContextTypes={transitionGroup:function(){}},n.propTypes={},n.defaultProps={in:!1,mountOnEnter:!1,unmountOnExit:!1,appear:!1,enter:!0,exit:!0,onEnter:p,onEntering:p,onEntered:p,onExit:p,onExiting:p,onExited:p},n.UNMOUNTED=0,n.EXITED=1,n.ENTERING=2,n.ENTERED=3,n.EXITING=4;a=(0,r.polyfill)(n);t.default=a},function(e,t,n){"use strict";t.__esModule=!0,t.classNamesShape=t.timeoutsShape=void 0;(n=n(3))&&n.__esModule;t.timeoutsShape=null;t.classNamesShape=null},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var a=l(n(3)),r=l(n(0)),o=n(30),i=n(524);function l(e){return e&&e.__esModule?e:{default:e}}function s(){return(s=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n,a=arguments[t];for(n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n])}return e}).apply(this,arguments)}function u(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}var d=Object.values||function(t){return Object.keys(t).map(function(e){return t[e]})},n=function(n){var e;function t(e,t){e=n.call(this,e,t)||this,t=e.handleExited.bind(u(u(e)));return e.state={handleExited:t,firstRender:!0},e}e=n,(a=t).prototype=Object.create(e.prototype),(a.prototype.constructor=a).__proto__=e;var a=t.prototype;return a.getChildContext=function(){return{transitionGroup:{isMounting:!this.appeared}}},a.componentDidMount=function(){this.appeared=!0,this.mounted=!0},a.componentWillUnmount=function(){this.mounted=!1},t.getDerivedStateFromProps=function(e,t){var n=t.children,a=t.handleExited;return{children:t.firstRender?(0,i.getInitialChildMapping)(e,a):(0,i.getNextChildMapping)(e,n,a),firstRender:!1}},a.handleExited=function(t,e){var n=(0,i.getChildMapping)(this.props.children);t.key in n||(t.props.onExited&&t.props.onExited(e),this.mounted&&this.setState(function(e){e=s({},e.children);return delete e[t.key],{children:e}}))},a.render=function(){var e=this.props,t=e.component,n=e.childFactory,e=function(e,t){if(null==e)return{};for(var n,a={},r=Object.keys(e),o=0;o<r.length;o++)n=r[o],0<=t.indexOf(n)||(a[n]=e[n]);return a}(e,["component","childFactory"]),n=d(this.state.children).map(n);return delete e.appear,delete e.enter,delete e.exit,null===t?n:r.default.createElement(t,e,n)},t}(r.default.Component),a=(n.childContextTypes={transitionGroup:a.default.object.isRequired},n.propTypes={},n.defaultProps={component:"div",childFactory:function(e){return e}},(0,o.polyfill)(n));t.default=a,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var a,L=p(n(2)),r=p(n(4)),o=p(n(6)),i=p(n(7)),T=n(0),D=p(T),l=n(23),s=p(n(3)),O=p(n(13)),u=n(30),d=n(11),c=p(n(529)),N=p(n(349)),P=p(n(350)),f=p(n(125));function p(e){return e&&e.__esModule?e:{default:e}}function h(e,t){for(var n=window.getComputedStyle(e),a="",r=0;r<b.length&&!(a=n.getPropertyValue(b[r]+t));r++);return a}var m,g=d.focus.saveLastFocusNode,y=d.focus.getFocusNodeList,v=d.focus.backLastFocusNode,j=d.func.makeChain,n=d.func.noop,_=d.func.bindCtx,b=["-webkit-","-moz-","-o-","ms-",""],w=[],s=(m=T.Component,(0,i.default)(M,m),M.getDerivedStateFromProps=function(e,t){var n=!t.visible&&e.visible,a=t.visible&&!e.visible,r={willOpen:n,willClose:a};return n?e.beforeOpen&&e.beforeOpen():a&&e.beforeClose&&e.beforeClose(),!e.animation&&!1!==e.animation||(r.animation=e.animation),!1!==e.animation&&d.support.animation?n?(r.visible=!0,r.status="mounting"):a&&(r.status="leaving"):"visible"in e&&e.visible!==t.visible&&(r.visible=e.visible),r},M.prototype.componentDidMount=function(){this.state.willOpen?this.beforeOpen():this.state.willClose&&this.beforeClose(),this.state.visible&&(this.doAnimation(!0,!1),this._isMounted=!0),this.addDocumentEvents(),c.default.addOverlay(this)},M.prototype.componentDidUpdate=function(e){this.state.willOpen?this.beforeOpen():this.state.willClose&&this.beforeClose(),!this._isMounted&&this.props.visible&&(this._isMounted=!0),this.props.align!==e.align&&(this.lastAlign=e.align);var t=!e.visible&&this.props.visible,e=e.visible&&!this.props.visible;(t||e)&&this.doAnimation(t,e)},M.prototype.componentWillUnmount=function(){this._isDestroyed=!0,this._isMounted=!1,c.default.removeOverlay(this),this.removeDocumentEvents(),this.focusTimeout&&clearTimeout(this.focusTimeout),this._animation&&(this._animation.off(),this._animation=null),this.beforeClose()},M.prototype.doAnimation=function(e,t){var n=this;this.state.animation&&d.support.animation?(e?this.onEntering():t&&this.onLeaving(),this.addAnimationEvents()):(e?setTimeout(function(){n.props.onOpen(),d.dom.addClass(n.getWrapperNode(),"opened"),c.default.addOverlay(n),n.props.afterOpen()}):t&&(this.props.onClose(),d.dom.removeClass(this.getWrapperNode(),"opened"),c.default.removeOverlay(this),this.props.afterClose()),this.setFocusNode())},M.prototype.getAnimation=function(e){return!1!==e.animation&&(e.animation||this.getAnimationByAlign(e.align))},M.prototype.getAnimationByAlign=function(e){switch(e[0]){case"t":return{in:"expandInDown fadeInDownSmall",out:"expandOutUp fadeOutUpSmall"};case"b":return{in:"fadeInUp",out:"fadeOutDown"};default:return{in:"expandInDown fadeInDownSmall",out:"expandOutUp fadeOutUpSmall"}}},M.prototype.addAnimationEvents=function(){var n=this;setTimeout(function(){var e,t=n.getContentNode();t&&(e=(0,d.guid)(),n._animation=d.events.on(t,d.support.animation.end,n.handleAnimateEnd.bind(n,e)),(t=(parseFloat(h(t,"animation-delay"))||0)+(parseFloat(h(t,"animation-duration"))||0))&&(n.timeoutMap[e]=setTimeout(function(){n.handleAnimateEnd(e)},1e3*t+200)))})},M.prototype.handlePosition=function(e){e=e.align.join(" ");"animation"in this.props||!this.props.needAdjust||this.lastAlign===e||this.setState({animation:this.getAnimationByAlign(e)}),"mounting"===this.state.status&&this.setState({status:"entering"}),this.lastAlign=e},M.prototype.handleAnimateEnd=function(e){this.timeoutMap[e]&&clearTimeout(this.timeoutMap[e]),delete this.timeoutMap[e],this._animation&&(this._animation.off(),this._animation=null),this._isMounted&&("leaving"===this.state.status?(this.setState({visible:!1,status:"none"}),this.onLeaved()):"entering"!==this.state.status&&"mounting"!==this.state.status||(this.setState({status:"none"}),this.onEntered()))},M.prototype.onEntering=function(){var t=this;this._isDestroyed||setTimeout(function(){var e=t.getWrapperNode();d.dom.addClass(e,"opened"),t.props.onOpen()})},M.prototype.onLeaving=function(){var e=this.getWrapperNode();d.dom.removeClass(e,"opened"),this.props.onClose()},M.prototype.onEntered=function(){c.default.addOverlay(this),this.setFocusNode(),this.props.afterOpen()},M.prototype.onLeaved=function(){c.default.removeOverlay(this),this.setFocusNode(),this.props.afterClose()},M.prototype.beforeOpen=function(){var t,e,n,a,r;this.props.disableScroll&&(a=this.props,r=(0,f.default)(a.target),r=(a=(t=(0,f.default)(a.container,r)||document.body).style).overflow,a=a.paddingRight,0===(e=w.find(function(e){return e.containerNode===t})||{containerNode:t,count:0}).count&&"hidden"!==r?(n={overflow:"hidden"},e.overflow=r,d.dom.hasScroll(t)&&(e.paddingRight=a,n.paddingRight=d.dom.getStyle(t,"paddingRight")+d.dom.scrollbar().width+"px"),d.dom.setStyle(t,n),w.push(e),e.count++):e.count&&e.count++,this._containerNode=t)},M.prototype.beforeClose=function(){var e,t,n,a,r=this;this.props.disableScroll&&(-1!==(e=w.findIndex(function(e){return e.containerNode===r._containerNode}))&&(a=(t=w[e]).overflow,n=t.paddingRight,1===t.count&&this._containerNode&&"hidden"===this._containerNode.style.overflow&&(a={overflow:a},void 0!==n&&(a.paddingRight=n),d.dom.setStyle(this._containerNode,a)),t.count--,0===t.count&&w.splice(e,1)),this._containerNode=void 0)},M.prototype.setFocusNode=function(){var t=this;this.props.autoFocus&&(this.state.visible&&!this._hasFocused?(g(),this.focusTimeout=setTimeout(function(){var e=t.getContentNode();e&&((e=y(e)).length&&e[0].focus(),t._hasFocused=!0)},100)):!this.state.visible&&this._hasFocused&&(v(),this._hasFocused=!1))},M.prototype.getContent=function(){return this.contentRef},M.prototype.getContentNode=function(){try{return(0,l.findDOMNode)(this.contentRef)}catch(e){return null}},M.prototype.getWrapperNode=function(){return this.gatewayRef?this.gatewayRef.getChildNode():null},M.prototype.addDocumentEvents=function(){var e=this.props.useCapture;this.props.canCloseByEsc&&(this._keydownEvents=d.events.on(document,"keydown",this.handleDocumentKeyDown,e)),this.props.canCloseByOutSideClick&&(this._clickEvents=d.events.on(document,"click",this.handleDocumentClick,e),this._touchEvents=d.events.on(document,"touchend",this.handleDocumentClick,e))},M.prototype.removeDocumentEvents=function(){var t=this;["_keydownEvents","_clickEvents","_touchEvents"].forEach(function(e){t[e]&&(t[e].off(),t[e]=null)})},M.prototype.handleDocumentKeyDown=function(e){this.state.visible&&e.keyCode===d.KEYCODE.ESC&&c.default.isCurrentOverlay(this)&&this.props.onRequestClose("keyboard",e)},M.prototype.isInShadowDOM=function(e){return!!e.getRootNode&&11===e.getRootNode().nodeType},M.prototype.getEventPath=function(e){return e.path||e.composedPath&&e.composedPath()||this.composedPath(e.target)},M.prototype.composedPath=function(e){for(var t=[];e;){if(t.push(e),"HTML"===e.tagName)return t.push(document),t.push(window),t;e=e.parentElement}},M.prototype.matchInShadowDOM=function(e,t){return!!this.isInShadowDOM(e)&&(e===(t=this.getEventPath(t))[0]||e.contains(t[0]))},M.prototype.handleDocumentClick=function(e){var t=this;if(this.state.visible){var n=this.props.safeNode,a=Array.isArray(n)?[].concat(n):[n];a.unshift(function(){return t.getWrapperNode()});for(var r=0;r<a.length;r++){var o=(0,f.default)(a[r],this.props);if(o&&(o===e.target||o.contains(e.target)||this.matchInShadowDOM(o,e)||e.target!==document&&!document.documentElement.contains(e.target)))return}this.props.onRequestClose("docClick",e)}},M.prototype.handleMaskClick=function(e){e.currentTarget===e.target&&this.props.canCloseByMask&&this.props.onRequestClose("maskClick",e)},M.prototype.getInstance=function(){return this},M.prototype.render=function(){var e=this.props,t=e.prefix,n=e.className,a=e.style,r=e.children,o=e.target,i=e.align,l=e.offset,s=e.container,u=e.hasMask,d=e.needAdjust,c=e.autoFit,f=e.beforePosition,p=e.onPosition,h=e.wrapperStyle,m=e.rtl,g=e.shouldUpdatePosition,y=e.cache,v=e.wrapperClassName,_=e.onMaskMouseEnter,b=e.onMaskMouseLeave,w=e.maskClass,M=e.isChildrenInMask,e=e.pinFollowBaseElementWhenFixed,k=this.state,S=k.visible,E=k.status,k=k.animation;if(r=S||y&&this._isMounted?r:null){var x=T.Children.only(r),k=("function"!=typeof x.type||x.type.prototype instanceof T.Component||(x=D.default.createElement("div",{role:"none"},x)),(0,O.default)(((C={})[t+"overlay-inner"]=!0,C[k.in]="entering"===E||"mounting"===E,C[k.out]="leaving"===E,C[x.props.className]=!!x.props.className,C[n]=!!n,C)));if("string"==typeof x.ref)throw new Error("Can not set ref by string in Overlay, use function instead.");r=D.default.cloneElement(x,{className:k,style:(0,L.default)({},x.props.style,a),ref:j(this.saveContentRef,x.ref),"aria-hidden":!S&&y&&this._isMounted,onClick:j(this.props.onClick,x.props.onClick),onTouchEnd:j(this.props.onTouchEnd,x.props.onTouchEnd)}),i&&(n="leaving"!==E&&g,r=D.default.createElement(P.default,{children:r,target:o,align:i,offset:l,autoFit:c,container:s,needAdjust:d,pinFollowBaseElementWhenFixed:e,beforePosition:f,onPosition:j(this.handlePosition,p),shouldUpdatePosition:n,rtl:m}));var C=(0,O.default)([t+"overlay-wrapper",v]),k=(0,L.default)({},{display:S?"":"none"},h),y=(0,O.default)(((a={})[t+"overlay-backdrop"]=!0,a[w]=!!w,a));r=D.default.createElement("div",{className:C,style:k,dir:m?"rtl":void 0},u?D.default.createElement("div",{className:y,onClick:this.handleMaskClick,onMouseEnter:_,onMouseLeave:b,dir:m?"rtl":void 0},M&&r):null,!M&&r)}return D.default.createElement(N.default,(0,L.default)({container:s,target:o,children:r},{ref:this.saveGatewayRef}))},a=i=M,i.propTypes={prefix:s.default.string,pure:s.default.bool,rtl:s.default.bool,className:s.default.string,style:s.default.object,children:s.default.any,visible:s.default.bool,onRequestClose:s.default.func,target:s.default.any,align:s.default.string,offset:s.default.array,container:s.default.any,hasMask:s.default.bool,canCloseByEsc:s.default.bool,canCloseByOutSideClick:s.default.bool,canCloseByMask:s.default.bool,beforeOpen:s.default.func,onOpen:s.default.func,afterOpen:s.default.func,beforeClose:s.default.func,onClose:s.default.func,afterClose:s.default.func,beforePosition:s.default.func,onPosition:s.default.func,shouldUpdatePosition:s.default.bool,autoFocus:s.default.bool,needAdjust:s.default.bool,disableScroll:s.default.bool,useCapture:s.default.bool,cache:s.default.bool,safeNode:s.default.any,wrapperClassName:s.default.string,wrapperStyle:s.default.object,animation:s.default.oneOfType([s.default.object,s.default.bool]),onMaskMouseEnter:s.default.func,onMaskMouseLeave:s.default.func,onClick:s.default.func,maskClass:s.default.string,isChildrenInMask:s.default.bool,pinFollowBaseElementWhenFixed:s.default.bool,v2:s.default.bool,points:s.default.array},i.defaultProps={prefix:"next-",pure:!1,visible:!1,onRequestClose:n,target:P.default.VIEWPORT,align:"tl bl",offset:[0,0],hasMask:!1,canCloseByEsc:!0,canCloseByOutSideClick:!0,canCloseByMask:!0,beforeOpen:n,onOpen:n,afterOpen:n,beforeClose:n,onClose:n,afterClose:n,beforePosition:n,onPosition:n,onMaskMouseEnter:n,onMaskMouseLeave:n,shouldUpdatePosition:!1,autoFocus:!1,needAdjust:!0,disableScroll:!1,cache:!1,isChildrenInMask:!1,onTouchEnd:function(e){e.stopPropagation()},onClick:function(e){return e.stopPropagation()},maskClass:"",useCapture:!0},a);function M(e){(0,r.default)(this,M);var t=(0,o.default)(this,m.call(this,e));return t.saveContentRef=function(e){t.contentRef=e},t.saveGatewayRef=function(e){t.gatewayRef=e},t.lastAlign=e.align,_(t,["handlePosition","handleAnimateEnd","handleDocumentKeyDown","handleDocumentClick","handleMaskClick","beforeOpen","beforeClose"]),t.state={visible:!1,status:"none",animation:t.getAnimation(e),willOpen:!1,willClose:!1},t.timeoutMap={},t}s.displayName="Overlay",t.default=(0,u.polyfill)(s),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var a=p(n(4)),r=p(n(6)),o=p(n(7)),i=n(0),l=p(i),s=n(23),u=p(n(3)),d=n(30),c=n(11),f=p(n(125));function p(e){return e&&e.__esModule?e:{default:e}}var h,m=c.func.makeChain,o=(h=i.Component,(0,o.default)(g,h),g.prototype.componentDidMount=function(){this.updateContainer()},g.prototype.componentDidUpdate=function(){this.updateContainer()},g.prototype.getChildNode=function(){try{return(0,s.findDOMNode)(this.child)}catch(e){return null}},g.prototype.render=function(){var e=this.state.containerNode;if(!e)return null;var t=this.props.children,t=t?i.Children.only(t):null;if(!t)return null;if("string"==typeof t.ref)throw new Error("Can not set ref by string in Gateway, use function instead.");return t=l.default.cloneElement(t,{ref:m(this.saveChildRef,t.ref)}),(0,s.createPortal)(t,e)},c=n=g,n.propTypes={children:u.default.node,container:u.default.any,target:u.default.any},n.defaultProps={container:function(){return document.body}},c);function g(e){(0,a.default)(this,g);var n=(0,r.default)(this,h.call(this,e));return n.updateContainer=function(){t=n.props,e=(0,f.default)(t.target);var e,t=(0,f.default)(t.container,e);t!==n.state.containerNode&&n.setState({containerNode:t})},n.saveChildRef=function(e){n.child=e},n.state={containerNode:null},n}o.displayName="Gateway",t.default=(0,d.polyfill)(o),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var a,r=h(n(4)),o=h(n(6)),i=h(n(7)),l=n(0),s=n(23),u=h(n(3)),d=h(n(133)),c=n(11),f=h(n(530)),p=h(n(125));function h(e){return e&&e.__esModule?e:{default:e}}var m,n=c.func.noop,g=c.func.bindCtx,y=c.dom.getStyle,v=f.default.place,u=(m=l.Component,(0,i.default)(_,m),_.prototype.componentDidMount=function(){this.setPosition(),this.props.needListenResize&&(c.events.on(window,"resize",this.handleResize),this.observe())},_.prototype.componentDidUpdate=function(e){var t=this.props;("align"in t&&t.align!==e.align||t.shouldUpdatePosition)&&(this.shouldUpdatePosition=!0),this.shouldUpdatePosition&&(clearTimeout(this.resizeTimeout),this.setPosition(),this.shouldUpdatePosition=!1)},_.prototype.componentWillUnmount=function(){this.props.needListenResize&&(c.events.off(window,"resize",this.handleResize),this.unobserve()),clearTimeout(this.resizeTimeout)},_.prototype.setPosition=function(){var e=this.props,t=e.align,n=e.offset,a=e.beforePosition,r=e.onPosition,o=e.needAdjust,i=e.container,l=e.rtl,s=e.pinFollowBaseElementWhenFixed,e=e.autoFit,a=(a(),this.getContentNode()),u=this.getTargetNode();a&&u&&(u=v({pinElement:a,baseElement:u,pinFollowBaseElementWhenFixed:s,align:t,offset:n,autoFit:e,container:i,needAdjust:o,isRtl:l}),s=y(a,"top"),t=y(a,"left"),r({align:u.split(" "),top:s,left:t},a))},_.prototype.getContentNode=function(){try{return(0,s.findDOMNode)(this)}catch(e){return null}},_.prototype.getTargetNode=function(){var e=this.props.target;return e===f.default.VIEWPORT?f.default.VIEWPORT:(0,p.default)(e,this.props)},_.prototype.handleResize=function(){var e=this;clearTimeout(this.resizeTimeout),this.resizeTimeout=setTimeout(function(){e.setPosition()},200)},_.prototype.render=function(){return l.Children.only(this.props.children)},a=i=_,i.VIEWPORT=f.default.VIEWPORT,i.propTypes={children:u.default.node,target:u.default.any,container:u.default.any,align:u.default.oneOfType([u.default.string,u.default.bool]),offset:u.default.array,beforePosition:u.default.func,onPosition:u.default.func,needAdjust:u.default.bool,autoFit:u.default.bool,needListenResize:u.default.bool,shouldUpdatePosition:u.default.bool,rtl:u.default.bool,pinFollowBaseElementWhenFixed:u.default.bool},i.defaultProps={align:"tl bl",offset:[0,0],beforePosition:n,onPosition:n,needAdjust:!0,autoFit:!1,needListenResize:!0,shouldUpdatePosition:!1,rtl:!1},a);function _(e){(0,r.default)(this,_);var t=(0,o.default)(this,m.call(this,e));return t.observe=function(){var e=t.getContentNode();e&&t.resizeObserver.observe(e)},t.unobserve=function(){t.resizeObserver.disconnect()},g(t,["handleResize"]),t.resizeObserver=new d.default(t.handleResize),t}u.displayName="Position",t.default=u,e.exports=t.default},function(e,t){var n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t){e.exports=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,t){function a(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}e.exports=function(e,t,n){return t&&a(e.prototype,t),n&&a(e,n),Object.defineProperty(e,"prototype",{writable:!1}),e},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,t){var n,a,e=e.exports={};function r(){throw new Error("setTimeout has not been defined")}function o(){throw new Error("clearTimeout has not been defined")}try{n="function"==typeof setTimeout?setTimeout:r}catch(e){n=r}try{a="function"==typeof clearTimeout?clearTimeout:o}catch(e){a=o}function i(t){if(n===setTimeout)return setTimeout(t,0);if((n===r||!n)&&setTimeout)return(n=setTimeout)(t,0);try{return n(t,0)}catch(e){try{return n.call(null,t,0)}catch(e){return n.call(this,t,0)}}}var l,s=[],u=!1,d=-1;function c(){u&&l&&(u=!1,l.length?s=l.concat(s):d=-1,s.length&&f())}function f(){if(!u){for(var e=i(c),t=(u=!0,s.length);t;){for(l=s,s=[];++d<t;)l&&l[d].run();d=-1,t=s.length}l=null,u=!1,!function(t){if(a===clearTimeout)return clearTimeout(t);if((a===o||!a)&&clearTimeout)return(a=clearTimeout)(t);try{a(t)}catch(e){try{return a.call(null,t)}catch(e){return a.call(this,t)}}}(e)}}function p(e,t){this.fun=e,this.array=t}function h(){}e.nextTick=function(e){var t=new Array(arguments.length-1);if(1<arguments.length)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];s.push(new p(e,t)),1!==s.length||u||i(f)},p.prototype.run=function(){this.fun.apply(null,this.array)},e.title="browser",e.browser=!0,e.env={},e.argv=[],e.version="",e.versions={},e.on=h,e.addListener=h,e.once=h,e.off=h,e.removeListener=h,e.removeAllListeners=h,e.emit=h,e.prependListener=h,e.prependOnceListener=h,e.listeners=function(e){return[]},e.binding=function(e){throw new Error("process.binding is not supported")},e.cwd=function(){return"/"},e.chdir=function(e){throw new Error("process.chdir is not supported")},e.umask=function(){return 0}},function(e,t,n){"use strict";t.__esModule=!0;var a=y(n(4)),r=y(n(6)),o=y(n(7)),d=y(n(2)),i=y(n(38)),l=n(0),c=y(l),s=y(n(3)),f=y(n(13)),u=y(n(8)),p=y(n(568)),h=n(11),m=n(356),g=y(m),n=y(n(570));function y(e){return e&&e.__esModule?e:{default:e}}function v(e,t,n){var a=c.default.Children.toArray(e);return e?a.map(function(e){return M(e)?v(e.props.children,t,n):c.default.isValidElement(e)&&-1<["function","object"].indexOf((0,i.default)(e.type))&&-1<["form_item","responsive_grid_cell"].indexOf(e.type._typeMark)?c.default.cloneElement(e,{style:(0,d.default)({},(0,m.getGridChildProps)(e.props,t,n),e.props.style||{})}):e}):null}var _,b=h.env.ieVersion,w=h.obj.pickOthers,M=h.obj.isReactFragment,o=(_=l.Component,(0,o.default)(k,_),k.prototype.render=function(){var e=this.props,t=e.prefix,n=e.component,a=e.style,r=e.className,o=e.children,i=e.device,l=e.rows,s=e.columns,u=e.gap,l={rows:l,columns:s,gap:u,device:i,rowSpan:e.rowSpan,colSpan:e.colSpan,component:e.component,dense:e.dense},s=w(Object.keys(k.propTypes),this.props),e=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{};return(0,d.default)({},(0,g.default)((0,d.default)({display:"grid"},arguments[1])),e)}(a,l),l=(0,f.default)(((a={})[t+"responsive-grid"]=!0,a[t+"responsive-grid-ie"]=b,a),r);return b?c.default.createElement(p.default,(0,d.default)({},this.props,{direction:"row",wrap:!0,spacing:u,children:v(o,i,u)})):c.default.createElement(n,(0,d.default)({style:e,className:l},s),v(o,i,u))},l=h=k,h._typeMark="responsive_grid",h.propTypes={prefix:s.default.string,className:s.default.any,device:s.default.oneOf(["phone","tablet","desktop"]),rows:s.default.oneOfType([s.default.number,s.default.string]),columns:s.default.oneOfType([s.default.number,s.default.string]),gap:s.default.oneOfType([s.default.arrayOf(s.default.number),s.default.number]),component:s.default.elementType,dense:s.default.bool,style:s.default.object},h.defaultProps={prefix:"next-",component:"div",device:"desktop",dense:!1},l);function k(){return(0,a.default)(this,k),(0,r.default)(this,_.apply(this,arguments))}o.displayName="ResponsiveGrid",o.Cell=n.default,t.default=u.default.config(o),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.getGridChildProps=t.filterHelperStyle=t.filterOuterStyle=t.filterInnerStyle=t.getSpacingHelperMargin=t.getSpacingMargin=t.getChildMargin=t.getMargin=void 0;var u=a(n(38)),M=a(n(2)),k=n(569);function a(e){return e&&e.__esModule?e:{default:e}}function S(n){var e=(t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{isNegative:!1,half:!1}).isNegative,t=t.half;if(!n)return{};var a={},r=(e?-1:1)*(t?.5:1),o=void 0;return["marginTop","marginRight","marginBottom","marginLeft"].forEach(function(e,t){if(Array.isArray(n))switch(n.length){case 1:o=r*(n[0]||0);break;case 2:o=r*(n[t]||n[t-2]||0);break;case 3:o=r*(2===t?n[2]:n[t]||n[t-2]||0);break;default:o=r*(n[t]||0)}else o=r*n;a[e]=o}),a}function E(e){return isNaN(e)&&"string"!=typeof e?e:"repeat("+e+", minmax(0,1fr))"}function x(e,t,n){var a=void 0===(a=e.row)?"initial":a,r=void 0===(r=e.col)?"initial":r,o=void 0===(o=e.rowSpan)?1:o,i=void 0===(e=e.colSpan)?1:e,l=12,s="object"===(void 0===i?"undefined":(0,u.default)(i))&&"desktop"in i?i.desktop:i,e=(["tablet","phone"].forEach(function(e){if(e===t)if("object"===(void 0===i?"undefined":(0,u.default)(i))&&t in i)s=i[t];else switch(e){case"tablet":l=8,s=5<i?8:2<i?4:2;break;case"phone":l=4,s=2<i?4:2}}),n),n=(Array.isArray(n)&&(e=n[1]),!d||1===o&&1===i?{}:{display:"inline-block",width:e?"calc("+s/l*100+"% - "+e+"px)":s/l*100+"%"});return(0,k.filterUndefinedValue)((0,M.default)({gridRowStart:a,gridRowEnd:"span "+o,gridColumnStart:r,gridColumnEnd:"span "+s},n))}function C(e){var t=e.alignSelf,e=e.flex;return(0,k.filterUndefinedValue)((0,M.default)({alignSelf:t},function(e){if(!Array.isArray(e))return{flex:e};var n=["flexGrow","flexShrink","flexBasis"],a={};return e.forEach(function(e,t){a[n[t]]=e}),a}(e)))}var d=n(11).env.ieVersion,r=["margin","marginTop","marginLeft","marginRight","marginBottom"],o=["flexDirection","flexWrap","alignContent","alignItems","display"];t.default=function(e){var t=e.device,n=e.display,a=e.gap,r=e.direction,o=e.dense,i=e.rowSpan,l=e.colSpan,s=e.row,u=e.col,d=e.rows,c=e.columns,f=e.justify,p=e.align,h=e.alignSelf,m=e.wrap,g=e.flex,y=e.padding,v=e.margin,_=(0,M.default)({},function(n){if(!Array.isArray(n))return{padding:n};var a={},r=void 0;return["paddingTop","paddingRight","paddingBottom","paddingLeft"].forEach(function(e,t){switch(n.length){case 1:r=n[0]||0;break;case 2:r=n[t]||n[t-2]||0;break;case 3:r=2===t?n[2]:n[t]||n[t-2]||0;break;default:r=n[t]||0}a[e]=r}),a}(y)),b="auto";switch(t){case"phone":b=4;break;case"tablet":b=8;break;case"desktop":b=12}var w=isNaN(c)&&"string"!=typeof c?b:c;switch(n){case"grid":_=(0,M.default)({},function(e){if(!Array.isArray(e))return{gap:e};var n=["rowGap","columnGap"],a={};return e.forEach(function(e,t){a[n[t]]=e}),a}(a),{gridTemplateRows:E(d),gridTemplateColumns:E(w),gridAutoFlow:""+(r||"")+(o&&" dense")},x({row:s,rowSpan:i,col:u,colSpan:l},t),_);break;case"flex":_=(0,M.default)({msFlexDirection:r,flexDirection:r,msFlexWrap:m?"wrap":"none",flexWrap:m?"wrap":"nowrap",msFlexPack:f,justifyContent:f,msFlexAlign:p,alignItems:p},S(v),C({alignSelf:h,flex:g}),_)}return(0,k.filterUndefinedValue)(_)},t.getMargin=S,t.getChildMargin=function(e){return S(e,{half:!0})},t.getSpacingMargin=function(e){return S(e,{half:!0})},t.getSpacingHelperMargin=function(e){return S(e,{isNegative:!0,half:!0})},t.filterInnerStyle=function(t){var n={};return o.forEach(function(e){n[e]=t[e]}),(0,k.filterUndefinedValue)(n)},t.filterOuterStyle=function(t){var n={};return[].concat(o).forEach(function(e){n[e]=t[e]}),(0,k.filterUndefinedValue)((0,k.stripObject)(t,n))},t.filterHelperStyle=function(t){var n={};return r.forEach(function(e){n[e]=t[e]}),(0,k.filterUndefinedValue)((0,M.default)({},n,{overflow:"hidden"}))},t.getGridChildProps=x},function(e,t,n){"use strict";t.__esModule=!0;var a,c=s(n(2)),f=s(n(12)),o=s(n(4)),i=s(n(6)),r=s(n(7)),p=s(n(0)),l=s(n(3)),h=s(n(13)),n=s(n(8));function s(e){return e&&e.__esModule?e:{default:e}}u=p.default.Component,(0,r.default)(d,u),d.prototype.render=function(){var e=this.props,t=e.children,n=e.name,a=e.prefix,r=e.style,o=e.className,i=e.field,e=(0,f.default)(e,["children","name","prefix","style","className","field"]);if(t&&"function"!=typeof t)return p.default.createElement("div",{className:a+"form-item-help"},t);i=this.context._formField||i;if(!i||!n)return null;var l,s="string"==typeof n,u=s?[n]:n,d=[],u=(u.length&&(l=i.getErrors(u),Object.keys(l).forEach(function(e){l[e]&&d.push(l[e])})),null);if(!(u="function"==typeof t?t(d,s?i.getState(n):void 0):this.itemRender(d)))return null;s=(0,h.default)(((t={})[a+"form-item-help"]=!0,t[o]=o,t));return p.default.createElement("div",(0,c.default)({},e,{className:s,style:r}),u)},a=r=d,r.propTypes={name:l.default.oneOfType([l.default.string,l.default.array]),field:l.default.object,style:l.default.object,className:l.default.string,children:l.default.oneOfType([l.default.node,l.default.func]),prefix:l.default.string},r.defaultProps={prefix:"next-"},r.contextTypes={_formField:l.default.object},r._typeMark="form_error";var u,l=a;function d(){var e,t;(0,o.default)(this,d);for(var n=arguments.length,a=Array(n),r=0;r<n;r++)a[r]=arguments[r];return(e=t=(0,i.default)(this,u.call.apply(u,[this].concat(a)))).itemRender=function(e){return e.length?e:null},(0,i.default)(t,e)}l.displayName="Error",t.default=n.default.config(l),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var g=d(n(12)),v=d(n(2)),a=d(n(4)),r=d(n(6)),o=d(n(7)),i=n(0),_=d(i),l=d(n(3)),y=d(n(62)),s=d(n(44)),u=n(11),b=d(n(164));function d(e){return e&&e.__esModule?e:{default:e}}function w(){}var c=u.focus.limitTabRange,f=u.func.bindCtx,M=u.obj.pickOthers,p=u.dom.getStyle,h=u.dom.setStyle;function m(e,t){var n=p(e,"boxSizing");return u.env.ieVersion&&-1!==["width","height"].indexOf(t)&&"border-box"===n?parseFloat(e.getBoundingClientRect()[t].toFixed(1)):p(e,t)}k=i.Component,(0,o.default)(S,k),S.prototype.componentDidMount=function(){u.events.on(document,"keydown",this.onKeyDown),this.useCSSToPosition()||this.adjustPosition()},S.prototype.componentWillUnmount=function(){u.events.off(document,"keydown",this.onKeyDown)},S.prototype.useCSSToPosition=function(){var e=this.props,t=e.align,e=e.isFullScreen;return"cc cc"===t&&e},S.prototype.onKeyDown=function(e){var t=this.getInnerNode();t&&c(t,e)},S.prototype.beforePosition=function(){var e,t;this.props.visible&&this.overlay&&((e=this.getInner())&&(t=this.getInnerNode(),this._lastDialogHeight!==m(t,"height")&&this.revertSize(e.bodyNode)))},S.prototype.adjustPosition=function(){var e,t,n,a,r;this.props.visible&&this.overlay&&((e=this.getInner())&&(t=this.getInnerNode(),(n=p(t,"top"))<(a=this.props.minMargin)&&h(t,"top",(n=a)+"px"),a=m(t,"height"),(r=window.innerHeight||document.documentElement.clientHeight)<a+2*n-1||this.props.height?this.adjustSize(e,t,Math.min(a,r-2*n)):this.revertSize(e.bodyNode),this._lastDialogHeight=a))},S.prototype.adjustSize=function(e,n,t){var a=e.headerNode,r=e.bodyNode,a=[a,e.footerNode].map(function(e){return e?m(e,"height"):0}),e=t-a[0]-a[1]-["padding-top","padding-bottom"].reduce(function(e,t){return e+p(n,t)},0);e<0&&(e=1),r&&(this.dialogBodyStyleMaxHeight=r.style.maxHeight,this.dialogBodyStyleOverflowY=r.style.overflowY,h(r,{"max-height":e+"px","overflow-y":"auto"}))},S.prototype.revertSize=function(e){h(e,{"max-height":this.dialogBodyStyleMaxHeight,"overflow-y":this.dialogBodyStyleOverflowY})},S.prototype.mapcloseableToConfig=function(r){return["esc","close","mask"].reduce(function(e,t){var n=t.charAt(0).toUpperCase()+t.substr(1),a="boolean"==typeof r?r:-1<r.split(",").indexOf(t);return"esc"===t||"mask"===t?e["canCloseBy"+n]=a:e["canCloseBy"+n+"Click"]=a,e},{})},S.prototype.getOverlayRef=function(e){this.overlay=e},S.prototype.getInner=function(){return this.overlay.getInstance().getContent()},S.prototype.getInnerNode=function(){return this.overlay.getInstance().getContentNode()},S.prototype.renderInner=function(e){var t=this.props,n=t.prefix,a=t.className,r=t.title,o=t.children,i=t.footer,l=t.footerAlign,s=t.footerActions,u=t.onOk,d=t.onCancel,c=t.okProps,f=t.cancelProps,p=t.onClose,h=t.locale,m=t.visible,g=t.rtl,t=t.height,y=M(Object.keys(S.propTypes),this.props);return _.default.createElement(b.default,(0,v.default)({prefix:n,className:a,title:r,footer:i,footerAlign:l,footerActions:s,onOk:m?u:w,onCancel:m?d:w,okProps:c,cancelProps:f,locale:h,closeable:e,rtl:g,onClose:p.bind(this,"closeClick"),height:t},y),o)},S.prototype.render=function(){var e=this.props,t=e.prefix,n=e.visible,a=e.hasMask,r=e.animation,o=e.autoFocus,i=e.closeable,l=e.closeMode,s=e.onClose,u=e.afterClose,d=e.shouldUpdatePosition,c=e.align,f=e.popupContainer,p=e.cache,h=e.overlayProps,e=e.rtl,m=this.useCSSToPosition(),l="closeMode"in this.props?Array.isArray(l)?l.join(","):l:i,i=this.mapcloseableToConfig(l),l=i.canCloseByCloseClick,i=(0,g.default)(i,["canCloseByCloseClick"]),f=(0,v.default)({disableScroll:!0,container:f,cache:p},h,{prefix:t,visible:n,animation:r,hasMask:a,autoFocus:o,afterClose:u},i,{canCloseByOutSideClick:!1,align:!m&&c,onRequestClose:s,needAdjust:!1,ref:this.getOverlayRef,rtl:e,maskClass:m?t+"dialog-container":"",isChildrenInMask:m&&a}),p=(m||(f.beforePosition=this.beforePosition,f.onPosition=this.adjustPosition,f.shouldUpdatePosition=d),this.renderInner(l));return _.default.createElement(y.default,f,m&&!a?_.default.createElement("div",{className:t+"dialog-container",dir:e?"rtl":void 0},p):p)},i=n=S,n.propTypes={prefix:l.default.string,pure:l.default.bool,rtl:l.default.bool,className:l.default.string,visible:l.default.bool,title:l.default.node,children:l.default.node,footer:l.default.oneOfType([l.default.bool,l.default.node]),footerAlign:l.default.oneOf(["left","center","right"]),footerActions:l.default.array,onOk:l.default.func,onCancel:l.default.func,okProps:l.default.object,cancelProps:l.default.object,closeMode:l.default.oneOfType([l.default.arrayOf(l.default.oneOf(["close","mask","esc"])),l.default.oneOf(["close","mask","esc"])]),cache:l.default.bool,afterClose:l.default.func,hasMask:l.default.bool,animation:l.default.oneOfType([l.default.object,l.default.bool]),autoFocus:l.default.bool,overlayProps:l.default.object,locale:l.default.object,popupContainer:l.default.any,height:l.default.oneOfType([l.default.string,l.default.number]),v2:l.default.bool,width:l.default.oneOfType([l.default.string,l.default.number]),top:l.default.number,bottom:l.default.number,closeIcon:l.default.node,centered:l.default.bool,overflowScroll:l.default.bool,closeable:l.default.oneOfType([l.default.string,l.default.bool]),onClose:l.default.func,align:l.default.oneOfType([l.default.string,l.default.bool]),isFullScreen:l.default.bool,shouldUpdatePosition:l.default.bool,minMargin:l.default.number},n.defaultProps={prefix:"next-",pure:!1,visible:!1,footerAlign:"right",footerActions:["ok","cancel"],onOk:w,onCancel:w,cache:!1,okProps:{},cancelProps:{},closeable:"esc,close",onClose:w,afterClose:w,centered:!1,hasMask:!0,animation:{in:"fadeInUp",out:"fadeOutUp"},autoFocus:!1,align:"cc cc",isFullScreen:!1,overflowScroll:!0,shouldUpdatePosition:!1,minMargin:40,bottom:40,overlayProps:{},locale:s.default.Dialog};var k,o=i;function S(e,t){(0,a.default)(this,S);e=(0,r.default)(this,k.call(this,e,t));return f(e,["onKeyDown","beforePosition","adjustPosition","getOverlayRef"]),e}o.displayName="Dialog",t.default=o,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var oe=r(n(2)),ie=r(n(12)),le=n(0),se=r(le),ue=r(n(23)),de=r(n(13)),a=r(n(183)),ce=r(n(164)),fe=r(n(79)),pe=r(n(44)),he=n(11),me=r(n(579));function r(e){return e&&e.__esModule?e:{default:e}}var ge=a.default.OverlayContext,ye=he.func.noop;t.default=function(e){if(!le.useState||!le.useRef||!le.useEffect)return he.log.warning("need react version > 16.8.0"),null;function t(e){j.current=e,ne({})}function a(e,t){N(te,null),"function"==typeof S&&S(e,t)}function n(e){27===e.keyCode&&Y&&!P.current.size&&a("esc",e)}function r(){j.current||(t(!0),he.dom.setStyle(D.current,"display","none"),me.default.unlock(document.body,ee.current),s&&O.current&&(O.current.focus(),O.current=null),I())}var o=e.prefix,o=void 0===o?"next-":o,i=e.afterClose,I=void 0===i?ye:i,i=e.hasMask,l=void 0===i||i,i=e.autoFocus,s=void 0!==i&&i,i=e.className,R=e.title,A=e.children,H=e.footer,F=e.footerAlign,z=e.footerActions,u=e.onOk,u=void 0===u?ye:u,d=e.onCancel,W=e.okProps,V=e.cancelProps,c=e.locale,c=void 0===c?pe.default.Dialog:c,B=e.rtl,f=e.visible,p=e.closeMode,p=void 0===p?["close","esc"]:p,U=e.closeIcon,h=e.animation,h=void 0===h?{in:"fadeInUp",out:"fadeOutUp"}:h,m=e.cache,K=e.wrapperStyle,g=e.popupContainer,y=void 0===g?document.body:g,g=e.dialogRender,v=e.centered,_=e.top,_=void 0===_?v?40:100:_,b=e.bottom,b=void 0===b?40:b,w=e.width,w=void 0===w?520:w,G=e.height,M=e.isFullScreen,k=e.overflowScroll,M=void 0===k?!M:k,k=e.minMargin,S=e.onClose,q=e.style,E=(0,ie.default)(e,["prefix","afterClose","hasMask","autoFocus","className","title","children","footer","footerAlign","footerActions","onOk","onCancel","okProps","cancelProps","locale","rtl","visible","closeMode","closeIcon","animation","cache","wrapperStyle","popupContainer","dialogRender","centered","top","bottom","width","height","isFullScreen","overflowScroll","minMargin","onClose","style"]),x=("isFullScreen"in e&&he.log.deprecated("isFullScreen","overflowScroll","Dialog v2"),"minMargin"in e&&he.log.deprecated("minMargin","top/bottom","Dialog v2"),(0,le.useState)(f||!1)),$=x[0],J=x[1],x=(0,le.useState)(f),C=x[0],X=x[1],Q="string"==typeof y?function(){return document.getElementById(y)}:"function"!=typeof y?function(){return y}:y,x=(0,le.useState)(Q()),L=x[0],Z=x[1],T=(0,le.useRef)(null),D=(0,le.useRef)(null),O=(0,le.useRef)(null),ee=(0,le.useRef)(null),te=(0,le.useState)((0,he.guid)())[0],x=(0,le.useContext)(ge),N=x.setVisibleOverlayToParent,x=(0,ie.default)(x,["setVisibleOverlayToParent"]),P=(0,le.useRef)(new Map),j=(0,le.useRef)(!1),ne=(0,le.useState)()[1],Y=!1,ae=!1,re=!1;(Array.isArray(p)?p:[p]).forEach(function(e){switch(e){case"esc":Y=!0;break;case"mask":ae=!0;break;case"close":re=!0}}),(0,le.useEffect)(function(){"visible"in e&&X(f)},[f]),(0,le.useEffect)(function(){var e;C&&l&&(e={overflow:"hidden"},he.dom.hasScroll(document.body)&&he.dom.scrollbar().width&&(e.paddingRight=he.dom.getStyle(document.body,"paddingRight")+he.dom.scrollbar().width+"px"),ee.current=me.default.lock(document.body,e))},[C&&l]),(0,le.useEffect)(function(){if(C&&Y)return document.body.addEventListener("keydown",n,!1),function(){document.body.removeEventListener("keydown",n,!1)}},[C&&Y]),(0,le.useEffect)(function(){!$&&C&&J(!0)},[C]),(0,le.useEffect)(function(){L||setTimeout(function(){Z(Q())})},[L]);if((0,le.useEffect)(function(){return function(){r()}},[]),!1===$||!L)return null;if(!C&&!m&&j.current)return null;m=(0,de.default)(((p={})[o+"overlay-wrapper"]=!0,p.opened=C,p)),i=(0,de.default)(((p={})[o+"dialog-v2"]=!0,p[i]=!!i,p)),p={},k=void(v?_||b||!k?(_&&(p.marginTop=_),b&&(p.marginBottom=b)):(p.marginTop=k,p.marginBottom=k):(_&&(p.top=_),b&&(p.paddingBottom=b))),M&&(k="calc(100vh - "+(_+b)+"px)"),M={appear:300,enter:300,exit:250},_=se.default.createElement(fe.default.OverlayAnimate,{visible:C,animation:h,timeout:M,onEnter:function(){t(!1),he.dom.setStyle(D.current,"display","")},onEntered:function(){var e;s&&T.current&&T.current.bodyNode&&(0<(e=he.focus.getFocusNodeList(T.current.bodyNode)).length&&e[0]&&(O.current=document.activeElement,e[0].focus())),N(te,D.current)},onExited:r},se.default.createElement(ce.default,(0,oe.default)({},E,{style:v?(0,oe.default)({},p,q):q,v2:!0,ref:T,prefix:o,className:i,title:R,footer:H,footerAlign:F,footerActions:z,onOk:C?u:ye,onCancel:C?function(e){"function"==typeof d?d(e):a("cancelBtn",e)}:ye,okProps:W,cancelProps:V,locale:c,closeable:re,rtl:B,onClose:function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return a.apply(void 0,["closeClick"].concat(t))},closeIcon:U,height:G,maxHeight:k,width:w}),A)),"function"==typeof g&&(_=g(_)),E=(0,de.default)(((b={})[o+"overlay-inner"]=!0,b[o+"dialog-wrapper"]=!0,b[o+"dialog-centered"]=v,b));return se.default.createElement(ge.Provider,{value:(0,oe.default)({},x,{setVisibleOverlayToParent:function(e,t){t?P.current.set(e,t):P.current.delete(e),N(e,t)}})},ue.default.createPortal(se.default.createElement("div",{className:m,style:K,ref:D},l?se.default.createElement(fe.default.OverlayAnimate,{visible:C,animation:!!h&&{in:"fadeIn",out:"fadeOut"},timeout:M,unmountOnExit:!0},se.default.createElement("div",{className:o+"overlay-backdrop"})):null,se.default.createElement("div",{className:E,onClick:function(e){if(ae){if("click"===e.type&&T.current){var t=ue.default.findDOMNode(T.current);if(t&&t.contains(e.target))return}a("maskClick",e)}}},v?_:se.default.createElement("div",{style:p,className:o+"dialog-inner-wrapper"},_))),L))},e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var T=s(n(2)),a=s(n(4)),r=s(n(6)),o=s(n(7)),p=n(0),D=s(p),i=s(n(3)),O=s(n(13)),h=s(n(24)),N=n(11),l=s(n(361)),P=s(n(362));function s(e){return e&&e.__esModule?e:{default:e}}function m(e){e.preventDefault()}u=l.default,(0,o.default)(j,u),j.prototype.getValueLength=function(e){var e=""+e,t=this.props.getValueLength(e);return t="number"!=typeof t?e.length:t},j.prototype.renderControl=function(){var e=this,t=this.props,n=t.hasClear,a=t.readOnly,r=t.state,o=t.prefix,i=t.hint,l=t.extra,s=t.locale,u=t.disabled,t=t.hoverShowClear,d=this.renderLength(),c=null,f=("success"===r?c=D.default.createElement(h.default,{type:"success-filling",className:o+"input-success-icon"}):"loading"===r?c=D.default.createElement(h.default,{type:"loading",className:o+"input-loading-icon"}):"warning"===r&&(c=D.default.createElement(h.default,{type:"warning",className:o+"input-warning-icon"})),null),a=n&&!a&&!!(""+this.state.value)&&!u;return(i||a)&&(u=null,u=i?"string"==typeof i?D.default.createElement(h.default,{type:i,className:o+"input-hint"}):(0,p.isValidElement)(i)?(0,p.cloneElement)(i,{className:(0,O.default)(i.props.className,o+"input-hint")}):i:(t=(0,O.default)(((a={})[o+"input-hint"]=!0,a[o+"input-clear-icon"]=!0,a[o+"input-hover-show"]=t,a)),D.default.createElement(h.default,{type:"delete-filling",role:"button",tabIndex:"0",className:t,"aria-label":s.clear,onClick:this.onClear.bind(this),onMouseDown:m,onKeyDown:this.handleKeyDownFromClear})),f=D.default.createElement("span",{className:o+"input-hint-wrap"},n&&i?D.default.createElement(h.default,{type:"delete-filling",role:"button",tabIndex:"0",className:o+"input-clear "+o+"input-clear-icon","aria-label":s.clear,onClick:this.onClear.bind(this),onMouseDown:m,onKeyDown:this.handleKeyDownFromClear}):null,u)),(f="loading"===r?null:f)||d||c||l?D.default.createElement("span",{onClick:function(){return e.focus()},className:o+"input-control"},f,d,c,l):null},j.prototype.renderLabel=function(){var e=this.props,t=e.label,n=e.prefix,e=e.id;return t?D.default.createElement("label",{className:n+"input-label",htmlFor:e},t):null},j.prototype.renderInner=function(e,t){return e?D.default.createElement("span",{className:t},e):null},j.prototype.onClear=function(e){this.props.disabled||("value"in this.props||this.setState({value:""}),this.props.onChange("",e,"clear"),this.focus())},j.prototype.render=function(){var e=this.props,t=e.size,n=e.htmlType,a=e.htmlSize,r=e.autoComplete,o=e.autoFocus,i=e.disabled,l=e.style,s=e.innerBefore,u=e.innerAfter,d=e.innerBeforeClassName,c=e.innerAfterClassName,f=e.className,p=e.hasBorder,h=e.prefix,m=e.isPreview,g=e.renderPreview,y=e.addonBefore,v=e.addonAfter,_=e.addonTextBefore,b=e.addonTextAfter,w=e.inputRender,M=e.rtl,e=e.composition,k=y||v||_||b,p=(0,O.default)(this.getClass(),((S={})[""+h+t]=!0,S[h+"hidden"]="hidden"===this.props.htmlType,S[h+"noborder"]=!p||"file"===this.props.htmlType,S[h+"input-group-auto-width"]=k,S[h+"disabled"]=i,S[f]=!!f&&!k,S)),S=h+"input-inner",d=(0,O.default)(((E={})[S]=!0,E[h+"before"]=!0,E[d]=d,E)),S=(0,O.default)(((E={})[S]=!0,E[h+"after"]=!0,E[h+"input-inner-text"]="string"==typeof u,E[c]=c,E)),E=(0,O.default)(((c={})[h+"form-preview"]=!0,c[f]=!!f,c)),c=this.getProps(),x=N.obj.pickAttrsWith(this.props,"data-"),C=N.obj.pickOthers((0,T.default)({},x,j.propTypes),this.props);if(m)return m=c.value,L=this.props.label,"function"==typeof g?D.default.createElement("div",(0,T.default)({},C,{className:E}),g(m,this.props)):D.default.createElement("div",(0,T.default)({},C,{className:E}),y||_,L,s,m,u,v||b);var g={},E=(e&&(g.onCompositionStart=this.handleCompositionStart,g.onCompositionEnd=this.handleCompositionEnd),D.default.createElement("input",(0,T.default)({},C,c,g,{height:"100%",type:n,size:a,autoFocus:o,autoComplete:r,onKeyDown:this.handleKeyDown,ref:this.saveRef}))),L=D.default.createElement("span",(0,T.default)({},x,{dir:M?"rtl":void 0,className:p,style:k?void 0:l}),this.renderLabel(),this.renderInner(s,d),w(E),this.renderInner(u,S),this.renderControl()),e=(0,O.default)(((m={})[h+"input-group-text"]=!0,m[""+h+t]=!!t,m[h+"disabled"]=i,m)),c=(0,O.default)(((C={})[e]=_,C)),n=(0,O.default)(((g={})[e]=b,g));return k?D.default.createElement(P.default,(0,T.default)({},x,{prefix:h,className:f,style:l,disabled:i,addonBefore:y||_,addonBeforeClassName:c,addonAfter:v||b,addonAfterClassName:n}),L):L},o=n=j,n.getDerivedStateFromProps=l.default.getDerivedStateFromProps,n.propTypes=(0,T.default)({},l.default.propTypes,{label:i.default.node,hasClear:i.default.bool,hasBorder:i.default.bool,state:i.default.oneOf(["error","loading","success","warning"]),onPressEnter:i.default.func,onClear:i.default.func,htmlType:i.default.string,htmlSize:i.default.string,hint:i.default.oneOfType([i.default.string,i.default.node]),innerBefore:i.default.node,innerAfter:i.default.node,addonBefore:i.default.node,addonAfter:i.default.node,addonTextBefore:i.default.node,addonTextAfter:i.default.node,autoComplete:i.default.string,autoFocus:i.default.bool,inputRender:i.default.func,extra:i.default.node,innerBeforeClassName:i.default.string,innerAfterClassName:i.default.string,isPreview:i.default.bool,renderPreview:i.default.func,hoverShowClear:i.default.bool}),n.defaultProps=(0,T.default)({},l.default.defaultProps,{autoComplete:"off",hasBorder:!0,isPreview:!1,hoverShowClear:!1,onPressEnter:N.func.noop,inputRender:function(e){return e}});var u,i=o;function j(e){(0,a.default)(this,j);var t=(0,r.default)(this,u.call(this,e)),n=(t.handleKeyDown=function(e){13===e.keyCode&&t.props.onPressEnter(e),t.onKeyDown(e)},t.handleKeyDownFromClear=function(e){13===e.keyCode&&t.onClear(e)},void 0),n="value"in e?e.value:e.defaultValue;return t.state={value:void 0===n?"":n},t}t.default=i,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var a,r=h(n(2)),o=h(n(4)),i=h(n(6)),l=h(n(7)),s=h(n(0)),u=h(n(3)),d=h(n(13)),c=n(30),f=h(n(8)),p=n(11),n=h(n(44));function h(e){return e&&e.__esModule?e:{default:e}}m=s.default.Component,(0,l.default)(g,m),g.getDerivedStateFromProps=function(e,t){return"value"in e&&e.value!==t.value&&!t.composition?{value:null==(t=e.value)?"":t}:null},g.prototype.ieHack=function(e){return e},g.prototype.onChange=function(e){"stopPropagation"in e?e.stopPropagation():"cancelBubble"in e&&e.cancelBubble();var t=e.target.value;this.props.trim&&(t=t.trim()),t=this.ieHack(t),"value"in this.props&&!this.state.composition||this.setState({value:t}),this.state.composition||(t&&"number"===this.props.htmlType&&(t=Number(t)),this.props.onChange(t,e))},g.prototype.onKeyDown=function(e){var t=e.target.value,n=this.props.maxLength,t=0<n&&t?this.getValueLength(t):0,a={};this.props.trim&&32===e.keyCode&&(a.beTrimed=!0),0<n&&(n+1<t||(t===n||t===n+1)&&8!==e.keyCode&&46!==e.keyCode)&&(a.overMaxLength=!0),this.props.onKeyDown(e,a)},g.prototype.onFocus=function(e){this.setState({focus:!0}),this.props.onFocus(e)},g.prototype.onBlur=function(e){this.setState({focus:!1}),this.props.onBlur(e)},g.prototype.renderLength=function(){var e,t=this.props,n=t.maxLength,a=t.showLimitHint,r=t.prefix,t=t.rtl,o=0<n&&this.state.value?this.getValueLength(this.state.value):0,r=(0,d.default)(((e={})[r+"input-len"]=!0,e[r+"error"]=n<o,e));return n&&a?s.default.createElement("span",{className:r},t?n+"/"+o:o+"/"+n):null},g.prototype.renderControl=function(){var e=this,t=this.renderLength();return t?s.default.createElement("span",{onClick:function(){return e.focus()},className:this.props.prefix+"input-control"},t):null},g.prototype.getClass=function(){var e,t=this.props,n=t.disabled,a=t.state,t=t.prefix;return(0,d.default)(((e={})[t+"input"]=!0,e[t+"disabled"]=!!n,e[t+"error"]="error"===a,e[t+"warning"]="warning"===a,e[t+"focus"]=this.state.focus,e))},g.prototype.getProps=function(){var e=this.props,t=e.placeholder,n=e.inputStyle,a=e.disabled,r=e.readOnly,o=e.cutString,i=e.maxLength,l=e.name,s=e.onCompositionStart,e=e.onCompositionEnd,n={style:n,placeholder:t,disabled:a,readOnly:r,name:l,maxLength:o?i:void 0,value:this.state.value,onChange:this.onChange.bind(this),onBlur:this.onBlur.bind(this),onFocus:this.onFocus.bind(this),onCompositionStart:s,onCompositionEnd:e};return a&&(n["aria-disabled"]=a),n},g.prototype.getInputNode=function(){return this.inputRef},g.prototype.focus=function(e,t){this.inputRef.focus(),"number"==typeof e&&(this.inputRef.selectionStart=e),"number"==typeof t&&(this.inputRef.selectionEnd=t)},a=l=g,l.propTypes=(0,r.default)({},f.default.propTypes,{value:u.default.oneOfType([u.default.string,u.default.number]),defaultValue:u.default.oneOfType([u.default.string,u.default.number]),onChange:u.default.func,onKeyDown:u.default.func,disabled:u.default.bool,maxLength:u.default.number,showLimitHint:u.default.bool,cutString:u.default.bool,readOnly:u.default.bool,trim:u.default.bool,placeholder:u.default.string,onFocus:u.default.func,onBlur:u.default.func,getValueLength:u.default.func,inputStyle:u.default.object,className:u.default.string,style:u.default.object,htmlType:u.default.string,name:u.default.string,rtl:u.default.bool,state:u.default.oneOf(["error","loading","success","warning"]),locale:u.default.object,isPreview:u.default.bool,renderPreview:u.default.func,size:u.default.oneOf(["small","medium","large"]),composition:u.default.bool,onCompositionStart:u.default.func,onCompositionEnd:u.default.func}),l.defaultProps={disabled:!1,prefix:"next-",size:"medium",maxLength:null,showLimitHint:!1,cutString:!0,readOnly:!1,isPreview:!1,trim:!1,composition:!1,onFocus:p.func.noop,onBlur:p.func.noop,onChange:p.func.noop,onKeyDown:p.func.noop,getValueLength:p.func.noop,onCompositionStart:p.func.noop,onCompositionEnd:p.func.noop,locale:n.default.Input};var m,r=a;function g(){var e,n;(0,o.default)(this,g);for(var t=arguments.length,a=Array(t),r=0;r<t;r++)a[r]=arguments[r];return(e=n=(0,i.default)(this,m.call.apply(m,[this].concat(a)))).handleCompositionStart=function(e){n.setState({composition:!0}),n.props.onCompositionStart(e)},n.handleCompositionEnd=function(e){n.setState({composition:!1}),n.props.onCompositionEnd(e);var t=e.target.value;n.props.onChange(t,e)},n.saveRef=function(e){n.inputRef=e},(0,i.default)(n,e)}r.displayName="Base",t.default=(0,c.polyfill)(r),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var a,p=s(n(2)),h=s(n(12)),r=s(n(4)),o=s(n(6)),i=s(n(7)),m=s(n(0)),l=s(n(3)),g=s(n(13)),n=s(n(8));function s(e){return e&&e.__esModule?e:{default:e}}u=m.default.Component,(0,i.default)(d,u),d.prototype.render=function(){var e,t=this.props,n=t.className,a=t.style,r=t.children,o=t.prefix,i=t.addonBefore,l=t.addonAfter,s=t.addonBeforeClassName,u=t.addonAfterClassName,d=t.rtl,c=t.disabled,t=(0,h.default)(t,["className","style","children","prefix","addonBefore","addonAfter","addonBeforeClassName","addonAfterClassName","rtl","disabled"]),n=(0,g.default)(((f={})[o+"input-group"]=!0,f[o+"disabled"]=c,f[n]=!!n,f)),f=o+"input-group-addon",s=(0,g.default)(f,((e={})[o+"before"]=!0,e[s]=s,e)),f=(0,g.default)(f,((e={})[o+"after"]=!0,e[u]=u,e)),o=i?m.default.createElement("span",{className:s},i):null,u=l?m.default.createElement("span",{className:f},l):null;return m.default.createElement("span",(0,p.default)({},t,{disabled:c,dir:d?"rtl":void 0,className:n,style:a}),o,r,u)},a=i=d,i.propTypes={prefix:l.default.string,className:l.default.string,style:l.default.object,children:l.default.node,addonBefore:l.default.node,addonBeforeClassName:l.default.string,addonAfter:l.default.node,addonAfterClassName:l.default.string,rtl:l.default.bool},i.defaultProps={prefix:"next-"};var u,l=a;function d(){return(0,r.default)(this,d),(0,o.default)(this,u.apply(this,arguments))}l.displayName="Group",t.default=n.default.config(l),e.exports=t.default},function(e,t,n){"use strict";e.exports=function(n,a){return function(){for(var e=new Array(arguments.length),t=0;t<e.length;t++)e[t]=arguments[t];return n.apply(a,e)}}},function(e,t,n){"use strict";var r=n(56);function o(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}e.exports=function(e,t,n){var a;return!t||(n=n?n(t):r.isURLSearchParams(t)?t.toString():(a=[],r.forEach(t,function(e,t){null!=e&&(r.isArray(e)?t+="[]":e=[e],r.forEach(e,function(e){r.isDate(e)?e=e.toISOString():r.isObject(e)&&(e=JSON.stringify(e)),a.push(o(t)+"="+o(e))}))}),a.join("&")))&&(-1!==(t=e.indexOf("#"))&&(e=e.slice(0,t)),e+=(-1===e.indexOf("?")?"?":"&")+n),e}},function(e,t,n){"use strict";e.exports=function(e,t,n,a,r){return e.config=t,n&&(e.code=n),e.request=a,e.response=r,e.isAxiosError=!0,e.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code}},e}},function(e,t,n){"use strict";var d=n(56),c=n(589),f=n(590),p=n(364),h=n(591),m=n(594),g=n(595),y=n(367);e.exports=function(u){return new Promise(function(t,n){var e,a=u.data,r=u.headers,o=u.responseType,i=(d.isFormData(a)&&delete r["Content-Type"],new XMLHttpRequest),l=(u.auth&&(l=u.auth.username||"",e=u.auth.password?unescape(encodeURIComponent(u.auth.password)):"",r.Authorization="Basic "+btoa(l+":"+e)),h(u.baseURL,u.url));function s(){var e;i&&(e="getAllResponseHeaders"in i?m(i.getAllResponseHeaders()):null,e={data:o&&"text"!==o&&"json"!==o?i.response:i.responseText,status:i.status,statusText:i.statusText,headers:e,config:u,request:i},c(t,n,e),i=null)}i.open(u.method.toUpperCase(),p(l,u.params,u.paramsSerializer),!0),i.timeout=u.timeout,"onloadend"in i?i.onloadend=s:i.onreadystatechange=function(){i&&4===i.readyState&&(0!==i.status||i.responseURL&&0===i.responseURL.indexOf("file:"))&&setTimeout(s)},i.onabort=function(){i&&(n(y("Request aborted",u,"ECONNABORTED",i)),i=null)},i.onerror=function(){n(y("Network Error",u,null,i)),i=null},i.ontimeout=function(){var e="timeout of "+u.timeout+"ms exceeded";u.timeoutErrorMessage&&(e=u.timeoutErrorMessage),n(y(e,u,u.transitional&&u.transitional.clarifyTimeoutError?"ETIMEDOUT":"ECONNABORTED",i)),i=null},d.isStandardBrowserEnv()&&(e=(u.withCredentials||g(l))&&u.xsrfCookieName?f.read(u.xsrfCookieName):void 0)&&(r[u.xsrfHeaderName]=e),"setRequestHeader"in i&&d.forEach(r,function(e,t){void 0===a&&"content-type"===t.toLowerCase()?delete r[t]:i.setRequestHeader(t,e)}),d.isUndefined(u.withCredentials)||(i.withCredentials=!!u.withCredentials),o&&"json"!==o&&(i.responseType=u.responseType),"function"==typeof u.onDownloadProgress&&i.addEventListener("progress",u.onDownloadProgress),"function"==typeof u.onUploadProgress&&i.upload&&i.upload.addEventListener("progress",u.onUploadProgress),u.cancelToken&&u.cancelToken.promise.then(function(e){i&&(i.abort(),n(e),i=null)}),a=a||null,i.send(a)})}},function(e,t,n){"use strict";var o=n(365);e.exports=function(e,t,n,a,r){e=new Error(e);return o(e,t,n,a,r)}},function(e,t,n){"use strict";e.exports=function(e){return!(!e||!e.__CANCEL__)}},function(e,t,n){"use strict";var d=n(56);e.exports=function(t,n){n=n||{};var a={},e=["url","method","data"],r=["headers","auth","proxy","params"],o=["baseURL","transformRequest","transformResponse","paramsSerializer","timeout","timeoutMessage","withCredentials","adapter","responseType","xsrfCookieName","xsrfHeaderName","onUploadProgress","onDownloadProgress","decompress","maxContentLength","maxBodyLength","maxRedirects","transport","httpAgent","httpsAgent","cancelToken","socketPath","responseEncoding"],i=["validateStatus"];function l(e,t){return d.isPlainObject(e)&&d.isPlainObject(t)?d.merge(e,t):d.isPlainObject(t)?d.merge({},t):d.isArray(t)?t.slice():t}function s(e){d.isUndefined(n[e])?d.isUndefined(t[e])||(a[e]=l(void 0,t[e])):a[e]=l(t[e],n[e])}d.forEach(e,function(e){d.isUndefined(n[e])||(a[e]=l(void 0,n[e]))}),d.forEach(r,s),d.forEach(o,function(e){d.isUndefined(n[e])?d.isUndefined(t[e])||(a[e]=l(void 0,t[e])):a[e]=l(void 0,n[e])}),d.forEach(i,function(e){e in n?a[e]=l(t[e],n[e]):e in t&&(a[e]=l(void 0,t[e]))});var u=e.concat(r).concat(o).concat(i),e=Object.keys(t).concat(Object.keys(n)).filter(function(e){return-1===u.indexOf(e)});return d.forEach(e,s),a}},function(e,t,n){"use strict";function a(e){this.message=e}a.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},a.prototype.__CANCEL__=!0,e.exports=a},function(e,t,n){"use strict";function N(e,t){a.apply(e,I(t)?t:[t])}function P(e,t,n,a,r,o,i,l,s,u,d,c,f,p,h,m){for(var g=e,y=m,v=0,_=!1;void 0!==(y=y.get(H))&&!_;){var b=y.get(e);if(v+=1,void 0!==b){if(b===v)throw new RangeError("Cyclic object value");_=!0}void 0===y.get(H)&&(v=0)}if("function"==typeof l?g=l(t,g):g instanceof Date?g=d(g):"comma"===n&&I(g)&&(g=Y.maybeMap(g,function(e){return e instanceof Date?d(e):e})),null===g){if(r)return i&&!p?i(t,A.encoder,h,"key",c):t;g=""}if("string"==typeof(w=g)||"number"==typeof w||"boolean"==typeof w||"symbol"==typeof w||"bigint"==typeof w||Y.isBuffer(g)){if(i){var w=p?t:i(t,A.encoder,h,"key",c);if("comma"===n&&p){for(var M=R.call(String(g),","),k="",S=0;S<M.length;++S)k+=(0===S?"":",")+f(i(M[S],A.encoder,h,"value",c));return[f(w)+(a&&I(g)&&1===M.length?"[]":"")+"="+k]}return[f(w)+"="+f(i(g,A.encoder,h,"value",c))]}return[f(t)+"="+f(String(g))]}var E=[];if(void 0!==g)for(var x,x="comma"===n&&I(g)?[{value:0<g.length?g.join(",")||null:void 0}]:I(l)?l:(w=Object.keys(g),s?w.sort(s):w),C=a&&I(g)&&1===g.length?t+"[]":t,L=0;L<x.length;++L){var T,D=x[L],O="object"==typeof D&&void 0!==D.value?D.value:g[D];o&&null===O||(D=I(g)?"function"==typeof n?n(C,D):C:C+(u?"."+D:"["+D+"]"),m.set(e,v),(T=j()).set(H,m),N(E,P(O,D,n,a,r,o,i,l,s,u,d,c,f,p,h,T)))}return E}var j=n(601),Y=n(372),c=n(168),f=Object.prototype.hasOwnProperty,p={brackets:function(e){return e+"[]"},comma:"comma",indices:function(e,t){return e+"["+t+"]"},repeat:function(e){return e}},I=Array.isArray,R=String.prototype.split,a=Array.prototype.push,r=Date.prototype.toISOString,n=c.default,A={addQueryPrefix:!1,allowDots:!1,charset:"utf-8",charsetSentinel:!1,delimiter:"&",encode:!0,encoder:Y.encode,encodeValuesOnly:!1,format:n,formatter:c.formatters[n],indices:!1,serializeDate:function(e){return r.call(e)},skipNulls:!1,strictNullHandling:!1},H={};e.exports=function(e,t){var n=e,a=function(e){if(!e)return A;if(null!==e.encoder&&void 0!==e.encoder&&"function"!=typeof e.encoder)throw new TypeError("Encoder has to be a function.");var t=e.charset||A.charset;if(void 0!==e.charset&&"utf-8"!==e.charset&&"iso-8859-1"!==e.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var n=c.default;if(void 0!==e.format){if(!f.call(c.formatters,e.format))throw new TypeError("Unknown format option provided.");n=e.format}var a=c.formatters[n],r=A.filter;return"function"!=typeof e.filter&&!I(e.filter)||(r=e.filter),{addQueryPrefix:("boolean"==typeof e.addQueryPrefix?e:A).addQueryPrefix,allowDots:void 0===e.allowDots?A.allowDots:!!e.allowDots,charset:t,charsetSentinel:("boolean"==typeof e.charsetSentinel?e:A).charsetSentinel,delimiter:(void 0===e.delimiter?A:e).delimiter,encode:("boolean"==typeof e.encode?e:A).encode,encoder:("function"==typeof e.encoder?e:A).encoder,encodeValuesOnly:("boolean"==typeof e.encodeValuesOnly?e:A).encodeValuesOnly,filter:r,format:n,formatter:a,serializeDate:("function"==typeof e.serializeDate?e:A).serializeDate,skipNulls:("boolean"==typeof e.skipNulls?e:A).skipNulls,sort:"function"==typeof e.sort?e.sort:null,strictNullHandling:("boolean"==typeof e.strictNullHandling?e:A).strictNullHandling}}(t),r=("function"==typeof a.filter?n=(0,a.filter)("",n):I(a.filter)&&(l=a.filter),[]);if("object"!=typeof n||null===n)return"";var e=t&&t.arrayFormat in p?t.arrayFormat:!(t&&"indices"in t)||t.indices?"indices":"repeat",o=p[e];if(t&&"commaRoundTrip"in t&&"boolean"!=typeof t.commaRoundTrip)throw new TypeError("`commaRoundTrip` must be a boolean, or absent");var i="comma"===o&&t&&t.commaRoundTrip,l=l||Object.keys(n);a.sort&&l.sort(a.sort);for(var s=j(),u=0;u<l.length;++u){var d=l[u];a.skipNulls&&null===n[d]||N(r,P(n[d],d,o,i,a.strictNullHandling,a.skipNulls,a.encode?a.encoder:null,a.filter,a.sort,a.allowDots,a.serializeDate,a.format,a.formatter,a.encodeValuesOnly,a.charset,s))}e=r.join(a.delimiter),t=!0===a.addQueryPrefix?"?":"";return a.charsetSentinel&&("iso-8859-1"===a.charset?t+="utf8=%26%2310003%3B&":t+="utf8=%E2%9C%93&"),0<e.length?t+e:""}},function(e,t,n){"use strict";function l(e,t){for(var n=t&&t.plainObjects?Object.create(null):{},a=0;a<e.length;++a)void 0!==e[a]&&(n[a]=e[a]);return n}var u=n(168),s=Object.prototype.hasOwnProperty,m=Array.isArray,d=function(){for(var e=[],t=0;t<256;++t)e.push("%"+((t<16?"0":"")+t.toString(16)).toUpperCase());return e}();e.exports={arrayToObject:l,assign:function(e,n){return Object.keys(n).reduce(function(e,t){return e[t]=n[t],e},e)},combine:function(e,t){return[].concat(e,t)},compact:function(e){for(var t=[{obj:{o:e},prop:"o"}],n=[],a=0;a<t.length;++a)for(var r=t[a],o=r.obj[r.prop],i=Object.keys(o),l=0;l<i.length;++l){var s=i[l],u=o[s];"object"==typeof u&&null!==u&&-1===n.indexOf(u)&&(t.push({obj:o,prop:s}),n.push(u))}for(var d=t;1<d.length;){var c=d.pop(),f=c.obj[c.prop];if(m(f)){for(var p=[],h=0;h<f.length;++h)void 0!==f[h]&&p.push(f[h]);c.obj[c.prop]=p}}return e},decode:function(t,e,n){t=t.replace(/\+/g," ");if("iso-8859-1"===n)return t.replace(/%[0-9a-f]{2}/gi,unescape);try{return decodeURIComponent(t)}catch(e){return t}},encode:function(e,t,n,a,r){if(0===e.length)return e;var o=e;if("symbol"==typeof e?o=Symbol.prototype.toString.call(e):"string"!=typeof e&&(o=String(e)),"iso-8859-1"===n)return escape(o).replace(/%u[0-9a-f]{4}/gi,function(e){return"%26%23"+parseInt(e.slice(2),16)+"%3B"});for(var i="",l=0;l<o.length;++l){var s=o.charCodeAt(l);45===s||46===s||95===s||126===s||48<=s&&s<=57||65<=s&&s<=90||97<=s&&s<=122||r===u.RFC1738&&(40===s||41===s)?i+=o.charAt(l):s<128?i+=d[s]:s<2048?i+=d[192|s>>6]+d[128|63&s]:s<55296||57344<=s?i+=d[224|s>>12]+d[128|s>>6&63]+d[128|63&s]:(l+=1,s=65536+((1023&s)<<10|1023&o.charCodeAt(l)),i+=d[240|s>>18]+d[128|s>>12&63]+d[128|s>>6&63]+d[128|63&s])}return i},isBuffer:function(e){return!(!e||"object"!=typeof e)&&!!(e.constructor&&e.constructor.isBuffer&&e.constructor.isBuffer(e))},isRegExp:function(e){return"[object RegExp]"===Object.prototype.toString.call(e)},maybeMap:function(e,t){if(m(e)){for(var n=[],a=0;a<e.length;a+=1)n.push(t(e[a]));return n}return t(e)},merge:function a(r,o,i){if(!o)return r;if("object"!=typeof o){if(m(r))r.push(o);else{if(!r||"object"!=typeof r)return[r,o];(i&&(i.plainObjects||i.allowPrototypes)||!s.call(Object.prototype,o))&&(r[o]=!0)}return r}if(!r||"object"!=typeof r)return[r].concat(o);var e=r;return m(r)&&!m(o)&&(e=l(r,i)),m(r)&&m(o)?(o.forEach(function(e,t){var n;s.call(r,t)?(n=r[t])&&"object"==typeof n&&e&&"object"==typeof e?r[t]=a(n,e,i):r.push(e):r[t]=e}),r):Object.keys(o).reduce(function(e,t){var n=o[t];return s.call(e,t)?e[t]=a(e[t],n,i):e[t]=n,e},e)}}},function(e,t,n){"use strict";t.__esModule=!0;var h=u(n(2)),c=u(n(4)),f=u(n(6)),a=u(n(7)),g=u(n(38)),y=n(0),m=u(y),r=n(23),o=u(n(3)),v=u(n(13)),i=n(30),l=u(n(374)),s=u(n(8)),p=n(11),_=n(170);function u(e){return e&&e.__esModule?e:{default:e}}function d(){}function b(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:"",a=arguments[3],n=(0,v.default)(((r={})[n+"menu-more"]=!0,r)),r={};return t?(r.visibility="hidden",r.display="inline-block"):e&&0===e.length&&(r.display="none",r.visibility="unset"),a&&"function"==typeof a?(t=a(e),a=(0,v.default)(n,t.props&&t.props.className),m.default.isValidElement(t)?m.default.cloneElement(t,{style:r,className:a}):t):m.default.createElement(l.default,{label:"路路路",noIcon:!0,className:n,style:r},e)}function w(e){var t=e.children,f=e.root,p=e.mode,n=e.lastVisibleIndex,a=e.hozInLine,r=e.prefix,e=e.renderMore,h={},m={};return{newChildren:function l(e,s){var u=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{index:0},d=3<arguments.length&&void 0!==arguments[3]?arguments[3]:1,c=[];return y.Children.map(e,function(e){if(e&&("function"==typeof e.type||"object"===(0,g.default)(e.type))&&"menuChildType"in e.type){var t=void 0,n=void 0,a={root:f};if(-1<["item","submenu","group"].indexOf(e.type.menuChildType)){var n=s+"-"+u.index++,r="string"==typeof e.key?e.key:n;if(-1<c.indexOf(r))return;c.push(r);var o=n.split("-").length-1;h[r]=m[n]={key:r,pos:n,mode:e.props.mode,type:e.type.menuChildType,disabled:e.props.disabled,label:e.props.label||e.props.children},a.level=o,a.inlineLevel=d,a._key=r,a.groupIndent="group"===e.type.menuChildType?1:0}var i="popup"===(e.props.mode||p)?1:d+1;switch(e.type.menuChildType){case"submenu":t=(0,y.cloneElement)(e,a,l(e.props.children,n,void 0,i));break;case"group":t=(0,y.cloneElement)(e,a,l(e.props.children,s,u,a.level));break;case"item":case"divider":t=(0,y.cloneElement)(e,a);break;default:t=e}return t}return e})}(a?C({children:t,lastVisibleIndex:n,prefix:r,renderMore:e}):t,"0"),_k2n:h,_p2n:m}}var M,k=p.func.bindCtx,S=p.obj.pickOthers,E=p.obj.isNil,x="menuitem-overflowed",C=function(e){var a=e.children,r=e.lastVisibleIndex,o=e.prefix,i=e.renderMore,l=[];return m.default.Children.forEach(a,function(e,n){var t;e&&(t=[],r<n&&(e=m.default.cloneElement(e,{key:e.key||"more-"+n,style:{display:"none"},className:(e&&e.className||"")+" "+x})),n===r+1&&(t=a.slice(r+1).map(function(e,t){return m.default.cloneElement(e,{key:e.key||"more-"+n+"-"+t})}),l.push(b(t,!1,o,i))),l.push(e))}),l.push(b([],!0,o,i)),l},s=(M=y.Component,(0,a.default)(L,M),L.getDerivedStateFromProps=function(e,t){var n={},a=("openKeys"in e?n.openKeys=(0,_.normalizeToArray)(e.openKeys):"mode"in e&&"popup"===e.mode&&"inline"===t.lastMode&&(n.openKeys=[]),"selectedKeys"in e&&(n.selectedKeys=(0,_.normalizeToArray)(e.selectedKeys)),"focusedKey"in e&&(n.focusedKey=e.focusedKey),n.lastMode=e.mode,w((0,h.default)({root:t.root,lastVisibleIndex:t.lastVisibleIndex},e))),r=a.newChildren,o=a._k2n,a=a._p2n;return n.newChildren=r,n._k2n=o,n._p2n=a,e.focusable&&(t.tabbableKey in o?t.focusedKey&&(n.tabbableKey=t.focusedKey):n.tabbableKey=(0,_.getFirstAvaliablelChildKey)("0",a)),n},L.prototype.componentDidMount=function(){this.menuNode=(0,r.findDOMNode)(this),this.adjustChildrenWidth(),this.props.hozInLine&&p.events.on(window,"resize",this.adjustChildrenWidth)},L.prototype.componentDidUpdate=function(e,t){t.lastVisibleIndex!==this.state.lastVisibleIndex&&this.adjustChildrenWidth()},L.prototype.componentWillUnmount=function(){p.events.off(window,"resize",this.adjustChildrenWidth)},L.prototype.adjustChildrenWidth=function(){var n,a,t,r,o,i,e=this.props,l=e.direction,s=e.prefix,u=e.header,d=e.footer,e=e.hozInLine;"hoz"===l&&e&&(this.menuNode||this.menuContent)&&(l=[],i=void 0,i=u||d?(l=this.menuContent.children,(0,_.getWidth)(this.menuNode)-(0,_.getWidth)(this.menuHeader)-(0,_.getWidth)(this.menuFooter)):(l=this.menuNode.children,(0,_.getWidth)(this.menuNode)),l.length<2||(n=0,a=-1,t="",(u=(e=[].slice.call(l).filter(function(e){return e.className.split(" ").indexOf(s+"menu-more")<0||(t=e,!1)})).filter(function(e){return 0<=e.className.split(" ").indexOf(x)})).forEach(function(e){p.dom.setStyle(e,"display","inline-block")}),p.dom.setStyle(t,"display","inline-block"),r=(0,_.getWidth)(t),this.menuItemSizes=e.map(function(e){return(0,_.getWidth)(e)}),o=this.menuItemSizes.length,u.forEach(function(e){p.dom.setStyle(e,"display","none")}),this.menuItemSizes.forEach(function(e,t){n+=e,(o-1<=t&&n<=i||n+r<=i)&&a++}),o-1<=a&&p.dom.setStyle(t,"display","none"),this.setState((0,h.default)({lastVisibleIndex:a},this.getUpdateChildren()))))},L.prototype.onBlur=function(e){this.setState({focusedKey:void 0}),this.props.onBlur&&this.props.onBlur(e)},L.prototype.getInitOpenKeys=function(e,t,n){var a=void 0,r=e.openKeys,o=e.defaultOpenKeys,i=e.defaultOpenAll,l=e.mode,e=e.openMode,a=r||(i&&"inline"===l&&"multiple"===e?Object.keys(t).filter(function(e){return"submenu"===t[e].type}):o);return(0,_.normalizeToArray)(a)},L.prototype.handleOpen=function(t,e,n,a){var r=void 0,o=this.props,i=o.mode,o=o.openMode,l=this.state,s=l.openKeys,u=l._k2n,l=s.indexOf(t);e&&-1===l?"inline"===i?"single"===o?(r=s.filter(function(e){return u[e]&&!(0,_.isSibling)(u[t].pos,u[e].pos)})).push(t):r=s.concat(t):(r=s.filter(function(e){return u[e]&&(0,_.isAncestor)(u[t].pos,u[e].pos)})).push(t):!e&&-1<l&&("inline"===i?r=[].concat(s.slice(0,l),s.slice(l+1)):"docClick"===n?this.popupNodes.concat(this.menuNode).some(function(e){return e.contains(a.target)})||(r=[]):r=s.filter(function(e){return e!==t&&u[e]&&!(0,_.isAncestor)(u[e].pos,u[t].pos)})),r&&(E(this.props.openKeys)&&this.setState((0,h.default)({openKeys:r},this.getUpdateChildren())),this.props.onOpen(r,{key:t,open:e}))},L.prototype.getPath=function(e,t,n){for(var a=[],r=[],o=t[e].pos.split("-"),i=1;i<o.length-1;i++){var l=n[o.slice(0,i+1).join("-")];a.push(l.key),r.push(l.label)}return{keyPath:a,labelPath:r}},L.prototype.handleSelect=function(e,t,n){var a,r,o,i=this.state,l=i._k2n,i=i._p2n,s=l[e].pos.split("-").length-1;this.props.shallowSelect&&1<s||(s=void 0,a=this.props.selectMode,o=(r=this.state.selectedKeys).indexOf(e),t&&-1===o?"single"===a?s=[e]:"multiple"===a&&(s=r.concat(e)):!t&&-1<o&&"multiple"===a&&(s=[].concat(r.slice(0,o),r.slice(o+1))),s&&(E(this.props.selectedKeys)&&this.setState({selectedKeys:s}),this.props.onSelect(s,n,(0,h.default)({key:e,select:t,label:l[e].label},this.getPath(e,l,i)))))},L.prototype.handleItemClick=function(e,t,n){var a=this.state._k2n;this.props.focusable&&(E(this.props.focusedKey)&&this.setState({focusedKey:e}),this.props.onItemFocus(e,t,n)),"item"===t.props.type&&("popup"===t.props.parentMode&&this.state.openKeys.length&&(E(this.props.openKeys)&&this.setState({openKeys:[]}),this.props.onOpen([],{key:this.state.openKeys.sort(function(e,t){return a[t].pos.split("-").length-a[e].pos.split("-").length})[0],open:!1})),this.props.onItemClick(e,t,n))},L.prototype.getAvailableKey=function(t,e){var n,a,r=this.state._p2n,o=Object.keys(r).filter(function(e){return(0,_.isAvailablePos)(t,e,r)});return 1<o.length?(n=o.indexOf(t),a=void 0,a=e?0===n?o.length-1:n-1:n===o.length-1?0:n+1,r[o[a]].key):null},L.prototype.getParentKey=function(e){return this.state._p2n[e.slice(0,e.length-2)].key},L.prototype.handleItemKeyDown=function(e,t,n,a){-1<[p.KEYCODE.UP,p.KEYCODE.DOWN,p.KEYCODE.RIGHT,p.KEYCODE.LEFT,p.KEYCODE.ENTER,p.KEYCODE.ESC,p.KEYCODE.SPACE].indexOf(a.keyCode)&&(a.preventDefault(),a.stopPropagation());var r=this.state.focusedKey,o=this.state,i=o._p2n,o=o._k2n,l=this.props.direction,s=o[e].pos,u=s.split("-").length-1;switch(a.keyCode){case p.KEYCODE.UP:var d=this.getAvailableKey(s,!0);d&&(r=d);break;case p.KEYCODE.DOWN:var d=void 0;(d="hoz"===l&&1==u&&"submenu"===t?(this.handleOpen(e,!0),(0,_.getFirstAvaliablelChildKey)(s,i)):this.getAvailableKey(s,!1))&&(r=d);break;case p.KEYCODE.RIGHT:var d=void 0;"hoz"===l&&1==u?d=this.getAvailableKey(s,!1):"submenu"===t&&(this.handleOpen(e,!0),d=(0,_.getFirstAvaliablelChildKey)(s,i)),d&&(r=d);break;case p.KEYCODE.ENTER:"submenu"===t&&(this.handleOpen(e,!0),(d=(0,_.getFirstAvaliablelChildKey)(s,i))&&(r=d));break;case p.KEYCODE.LEFT:"hoz"===l&&1==u?(d=this.getAvailableKey(s,!0))&&(r=d):1<u&&(d=this.getParentKey(s),this.handleOpen(d,!1),r=d);break;case p.KEYCODE.ESC:1<u&&(d=this.getParentKey(s),this.handleOpen(d,!1),r=d);break;case p.KEYCODE.TAB:r=null}r!==this.state.focusedKey&&(E(this.props.focusedKey)&&this.setState({focusedKey:r}),this.props.onItemKeyDown(r,n,a),this.props.onItemFocus(r,a))},L.prototype.render=function(){var e=this.props,t=e.prefix,n=e.className,a=e.direction,r=e.hozAlign,o=e.header,i=e.footer,l=e.embeddable,s=e.selectMode,u=e.hozInLine,d=e.rtl,e=e.flatenContent,c=this.state.newChildren,f=S(Object.keys(L.propTypes),this.props),l=(0,v.default)(((p={})[t+"menu"]=!0,p[t+"ver"]="ver"===a,p[t+"hoz"]="hoz"===a,p[t+"menu-embeddable"]=l,p[t+"menu-nowrap"]=u,p[t+"menu-selectable-"+s]=s,p[n]=!!n,p)),u="hoz"===a?"menubar":"menu",n=void 0,p=("selectMode"in this.props&&(u="listbox",n=!("multiple"!==s)),o?m.default.createElement("li",{className:t+"menu-header",ref:this.menuHeaderRef},o):null),a=e||!o&&!i?c:m.default.createElement("ul",{className:t+"menu-content",ref:this.menuContentRef},c),s=i?m.default.createElement("li",{className:t+"menu-footer",ref:this.menuFooterRef},i):null,e="right"===r&&!!o;return d&&(f.dir="rtl"),m.default.createElement("ul",(0,h.default)({role:u,onBlur:this.onBlur,className:l,onKeyDown:this.handleEnter,"aria-multiselectable":n},f),p,e?m.default.createElement("div",{className:t+"menu-hoz-right"},a,s):null,e?null:a,e?null:s)},a=n=L,n.isNextMenu=!0,n.propTypes=(0,h.default)({},s.default.propTypes,{prefix:o.default.string,pure:o.default.bool,rtl:o.default.bool,className:o.default.string,children:o.default.node,onItemClick:o.default.func,openKeys:o.default.oneOfType([o.default.string,o.default.array]),defaultOpenKeys:o.default.oneOfType([o.default.string,o.default.array]),defaultOpenAll:o.default.bool,onOpen:o.default.func,mode:o.default.oneOf(["inline","popup"]),triggerType:o.default.oneOf(["click","hover"]),openMode:o.default.oneOf(["single","multiple"]),inlineIndent:o.default.number,inlineArrowDirection:o.default.oneOf(["down","right"]),popupAutoWidth:o.default.bool,popupAlign:o.default.oneOf(["follow","outside"]),popupProps:o.default.oneOfType([o.default.object,o.default.func]),popupClassName:o.default.string,popupStyle:o.default.object,selectedKeys:o.default.oneOfType([o.default.string,o.default.array]),defaultSelectedKeys:o.default.oneOfType([o.default.string,o.default.array]),onSelect:o.default.func,selectMode:o.default.oneOf(["single","multiple"]),shallowSelect:o.default.bool,hasSelectedIcon:o.default.bool,labelToggleChecked:o.default.bool,isSelectIconRight:o.default.bool,direction:o.default.oneOf(["ver","hoz"]),hozAlign:o.default.oneOf(["left","right"]),hozInLine:o.default.bool,renderMore:o.default.func,header:o.default.node,footer:o.default.node,autoFocus:o.default.bool,focusedKey:o.default.oneOfType([o.default.string,o.default.number,o.default.object]),focusable:o.default.bool,onItemFocus:o.default.func,onBlur:o.default.func,embeddable:o.default.bool,onItemKeyDown:o.default.func,expandAnimation:o.default.bool,itemClassName:o.default.string,icons:o.default.object,flatenContent:o.default.bool}),n.defaultProps={prefix:"next-",pure:!1,defaultOpenKeys:[],defaultOpenAll:!1,onOpen:d,mode:"inline",triggerType:"click",openMode:"multiple",inlineIndent:20,inlineArrowDirection:"down",popupAutoWidth:!1,popupAlign:"follow",popupProps:{},defaultSelectedKeys:[],onSelect:d,shallowSelect:!1,hasSelectedIcon:!0,isSelectIconRight:!1,labelToggleChecked:!0,direction:"ver",hozAlign:"left",hozInLine:!1,autoFocus:!1,focusable:!0,embeddable:!1,onItemFocus:d,onItemKeyDown:d,onItemClick:d,expandAnimation:!0,icons:{}},a);function L(e){(0,c.default)(this,L);var n=(0,f.default)(this,M.call(this,e)),t=(n.getUpdateChildren=function(){var e=n.state,t=e.root,e=e.lastVisibleIndex;return w((0,h.default)({root:t,lastVisibleIndex:e},n.props))},n.menuContentRef=function(e){n.menuContent=e},n.menuHeaderRef=function(e){n.menuHeader=e},n.menuFooterRef=function(e){n.menuFooter=e},n.props),a=(t.prefix,t.children,t.selectedKeys),r=t.defaultSelectedKeys,o=t.focusedKey,i=t.focusable,l=t.autoFocus,t=(t.hozInLine,t.renderMore,n.state={lastVisibleIndex:void 0},w((0,h.default)({root:n},n.props))),s=t.newChildren,u=t._k2n,t=t._p2n,d=i?(0,_.getFirstAvaliablelChildKey)("0",t):void 0;return n.state={root:n,lastVisibleIndex:void 0,newChildren:s,_k2n:u,_p2n:t,tabbableKey:d,openKeys:n.getInitOpenKeys(e,u,t),selectedKeys:(0,_.normalizeToArray)(a||r),focusedKey:E(n.props.focusedKey)?i&&l?d:null:o},k(n,["handleOpen","handleSelect","handleItemClick","handleItemKeyDown","onBlur","adjustChildrenWidth"]),n.popupNodes=[],n}s.displayName="Menu",t.default=(0,i.polyfill)(s),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var u=p(n(12)),w=p(n(2)),o=p(n(38)),a=p(n(4)),r=p(n(6)),i=p(n(7)),l=n(0),M=p(l),s=n(23),d=p(n(3)),k=p(n(13)),c=p(n(79)),S=p(n(24)),E=n(11),x=p(n(98)),C=p(n(169)),f=p(n(375)),L=n(170);function p(e){return e&&e.__esModule?e:{default:e}}var h,T=c.default.Expand,m=E.func.bindCtx,i=(h=l.Component,(0,i.default)(D,h),D.prototype.componentDidMount=function(){this.itemNode=(0,s.findDOMNode)(this)},D.prototype.afterLeave=function(){var e=this.props,t=e.focused;e.root.props.focusable&&t&&this.itemNode.focus()},D.prototype.getOpen=function(){var e=this.props,t=e._key;return-1<e.root.state.openKeys.indexOf(t)},D.prototype.handleMouseEnter=function(e){this.handleOpen(!0),this.props.onMouseEnter&&this.props.onMouseEnter(e)},D.prototype.handleMouseLeave=function(e){this.handleOpen(!1),this.props.onMouseLeave&&this.props.onMouseLeave(e)},D.prototype.handleClick=function(e){var t=this.props,n=t.root,t=t.selectable,n=(n.props.selectMode&&t&&e.stopPropagation(),this.getOpen());this.handleOpen(!n)},D.prototype.handleOpen=function(e,t,n){var a=this.props,r=a._key;a.root.handleOpen(r,e,t,n)},D.prototype.passParentToChildren=function(e){var t=this,n=this.props,a=n.mode,r=n.root;return l.Children.map(e,function(e){return"function"!=typeof e&&"object"!==(void 0===e?"undefined":(0,o.default)(e))?e:(0,l.cloneElement)(e,{parent:t,parentMode:a||r.props.mode})})},D.prototype.renderInline=function(){var e,t=this.props,n=t._key,a=t.level,r=t.inlineLevel,o=t.root,i=t.className,l=t.selectable,s=t.label,u=t.children,d=t.noIcon,c=t.subMenuContentClassName,f=t.triggerType,t=t.parentMode,p=o.props,h=p.prefix,m=p.selectMode,g=p.triggerType,y=p.inlineArrowDirection,v=p.expandAnimation,p=p.rtl,f=f||g,g=this.getOpen(),_=o.state,b=_.selectedKeys,_=_._k2n,_=(0,L.getChildSelected)({_key:n,_k2n:_,selectMode:m,selectedKeys:b}),b=E.obj.pickOthers(Object.keys(D.propTypes),this.props),i={className:(0,k.default)(((e={})[h+"menu-sub-menu-wrapper"]=!0,e[i]=!!i,e))},n={"aria-expanded":g,_key:n,level:a,role:"listitem",inlineLevel:r,root:o,type:"submenu",component:"div",parentMode:t,className:(0,k.default)(((e={})[h+"opened"]=g,e[h+"child-selected"]=_,e))},r=("string"==typeof s&&(n.title=s),{type:"right"===y?"arrow-right":"arrow-down",className:(0,k.default)(((a={})[h+"menu-icon-arrow"]=!0,a[h+"menu-icon-arrow-down"]="down"===y,a[h+"menu-icon-arrow-right"]="right"===y,a[h+"open"]=g,a))}),t=!!m&&l,_=(t?C:x).default,y=("hover"===f?(i.onMouseEnter=this.handleMouseEnter,i.onMouseLeave=this.handleMouseLeave):t?r.onClick=this.handleClick:n.onClick=this.handleClick,(0,k.default)(((e={})[h+"menu-sub-menu"]=!0,e[c]=!!c,e))),a="menu",m="menuitem",l=("selectMode"in o.props&&(a="listbox",m="option"),g?M.default.createElement("ul",{role:a,dir:p?"rtl":void 0,className:y},this.passParentToChildren(u)):null);return M.default.createElement("li",(0,w.default)({role:m},b,i),M.default.createElement(_,n,M.default.createElement("span",{className:h+"menu-item-text"},s),d?null:M.default.createElement(S.default,r)),v?M.default.createElement(T,{animationAppear:!1,afterLeave:this.afterLeave},l):l)},D.prototype.renderPopup=function(){var e,t=this.props,n=t.children,a=t.subMenuContentClassName,r=t.noIcon,t=(0,u.default)(t,["children","subMenuContentClassName","noIcon"]),o=this.props.root.props,i=o.prefix,l=o.popupClassName,s=o.popupStyle,o=o.rtl,i=(0,k.default)(((e={})[i+"menu"]=!0,e[i+"ver"]=!0,e[l]=!!l,e[a]=!!a,e));return t.rtl=o,M.default.createElement(f.default,(0,w.default)({},t,{noIcon:r,hasSubMenu:!0}),M.default.createElement("ul",{role:"menu",dir:o?"rtl":void 0,className:i,style:s},this.passParentToChildren(n)))},D.prototype.render=function(){var e=this.props,t=e.mode,e=e.root;return"popup"===(t||e.props.mode)?this.renderPopup():this.renderInline()},c=n=D,n.menuChildType="submenu",n.propTypes={_key:d.default.string,root:d.default.object,level:d.default.number,inlineLevel:d.default.number,groupIndent:d.default.number,label:d.default.node,selectable:d.default.bool,mode:d.default.oneOf(["inline","popup"]),noIcon:d.default.bool,children:d.default.node,onMouseEnter:d.default.func,onMouseLeave:d.default.func,subMenuContentClassName:d.default.string,triggerType:d.default.oneOf(["click","hover"]),align:d.default.oneOf(["outside","follow"]),parentMode:d.default.oneOf(["inline","popup"]),parent:d.default.any},n.defaultProps={groupIndent:0,noIcon:!1,selectable:!1},c);function D(e){(0,a.default)(this,D);e=(0,r.default)(this,h.call(this,e));return m(e,["handleMouseEnter","handleMouseLeave","handleClick","handleOpen","afterLeave"]),e}i.displayName="SubMenu",t.default=i,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var d=u(n(12)),h=u(n(2)),a=u(n(4)),r=u(n(6)),o=u(n(7)),i=n(0),m=u(i),g=n(23),l=u(n(3)),y=u(n(13)),v=u(n(24)),s=u(n(62)),_=n(11),b=u(n(98)),w=u(n(169)),M=n(170);function u(e){return e&&e.__esModule?e:{default:e}}var c,f=_.func.bindCtx,p=_.dom.setStyle,k=s.default.Popup,i=(c=i.Component,(0,o.default)(S,c),S.prototype.getPopup=function(e){this.popup=e},S.prototype.getOpen=function(){var e=this.props,t=e._key;return-1<e.root.state.openKeys.indexOf(t)},S.prototype.getPopupProps=function(){var e=this.props.root.props.popupProps;return e="function"==typeof e?e(this.props):e},S.prototype.handleOpen=function(e,t,n){var a=this.props,r=a._key,a=(a.root.handleOpen(r,e,t,n),this.popupProps);a.onVisibleChange&&a.onVisibleChange(e,t,n)},S.prototype.handlePopupOpen=function(){var e=this.props,t=e.root,n=e.level,a=e.align,e=e.autoWidth,r=t.props,o=r.popupAutoWidth,i=r.popupAlign,r=r.direction,a=a||i,i="autoWidth"in this.props?e:o;try{var l,s=(0,g.findDOMNode)(this),u=s.parentNode,d=(this.popupNode=this.popup.getInstance().overlay.getInstance().getContentNode(),t.popupNodes.push(this.popupNode),!i||(l="hoz"===r&&1===n?s:u).offsetWidth>this.popupNode.offsetWidth&&p(this.popupNode,"width",l.offsetWidth+"px"),"outside"!==a||"hoz"===r&&1===n||(p(this.popupNode,"height",u.offsetHeight+"px"),this.popupNode.firstElementChild&&p(this.popupNode.firstElementChild,"overflow-y","auto")),this.popupProps);d.onOpen&&d.onOpen()}catch(e){return null}},S.prototype.handlePopupClose=function(){var e=this.props.root.popupNodes,t=e.indexOf(this.popupNode),e=(-1<t&&e.splice(t,1),this.popupProps);e.onClose&&e.onClose()},S.prototype.renderItem=function(e,t,n){var a=this.props,r=a._key,o=a.root,i=a.level,l=a.inlineLevel,s=a.label,a=a.className,u=o.props,d=u.prefix,u=u.selectMode,e=(e?w:b).default,c=this.getOpen(),f=o.state,p=f.selectedKeys,f=f._k2n,f=(0,M.getChildSelected)({_key:r,_k2n:f,selectMode:u,selectedKeys:p}),u={"aria-haspopup":!0,"aria-expanded":c,_key:r,root:o,level:i,inlineLevel:l,type:"submenu"};return u.className=(0,y.default)(((p={})[d+"opened"]=c,p[d+"child-selected"]=f,p[a]=!!a,p)),m.default.createElement(e,(0,h.default)({},u,n),m.default.createElement("span",{className:d+"menu-item-text"},s),t)},S.prototype.renderPopup=function(e,t,n,a){var r=this,o=this.props,i=o.root,l=o.level,s=o.selectable,o=o.className,i=i.props.direction,u=(this.popupProps=this.getPopupProps(),this.getOpen()),i=("hoz"===i&&1===l&&s&&(n.target=function(){return(0,g.findDOMNode)(r)}),n.className),l=(0,d.default)(n,["className"]),s=(0,y.default)(o,i);return m.default.createElement(k,(0,h.default)({ref:this.getPopup},l,this.popupProps,{canCloseByEsc:!1,trigger:e,triggerType:t,visible:u,pinFollowBaseElementWhenFixed:!0,onVisibleChange:this.handleOpen,onOpen:this.handlePopupOpen,onClose:this.handlePopupClose}),m.default.createElement("div",{className:s},a))},S.prototype.render=function(){var e=this,t=this.props,n=t.root,a=t.level,r=t.hasSubMenu,o=t.selectable,i=t.children,l=t.triggerType,s=t.align,u=t.noIcon,t=(t.rtl,_.obj.pickOthers(Object.keys(S.propTypes),this.props)),d=n.props,c=d.prefix,f=d.selectMode,p=d.direction,h=d.popupAlign,d=d.triggerType,s=s||h,h=l||(r?d:"hover"),l=Array.isArray(i)?i[0]:i,r=f&&o,d=r&&"click"===h,i=this.getOpen(),f={},o=void 0,o="hoz"===p&&1===a?(f.align="tl bl",f.className=c+"menu-spacing-tb",{type:"arrow-down",className:(0,y.default)(((p={})[c+"menu-hoz-icon-arrow"]=!0,p[c+"open"]=i,p))}):("outside"===s?(f.target=function(){return(0,g.findDOMNode)(n)},f.align="tl tr",f.className=c+"menu-spacing-lr "+c+"menu-outside"):(d&&(f.target=function(){return(0,g.findDOMNode)(e)}),f.align="tl tr",f.className=c+"menu-spacing-lr"),{type:"arrow-right",className:c+"menu-icon-arrow "+c+"menu-symbol-popupfold"}),a=m.default.createElement(v.default,o),i=d?a:this.renderItem(r,u?null:a,t),p=this.renderPopup(i,h,f,l);return d?this.renderItem(r,p,t):p},s=n=S,n.menuChildType="submenu",n.propTypes={_key:l.default.string,root:l.default.object,level:l.default.number,hasSubMenu:l.default.bool,noIcon:l.default.bool,rtl:l.default.bool,selectable:l.default.bool,label:l.default.node,children:l.default.node,className:l.default.string,triggerType:l.default.oneOf(["click","hover"]),align:l.default.oneOf(["outside","follow"]),autoWidth:l.default.bool},n.defaultProps={selectable:!1,noIcon:!1},s);function S(e){(0,a.default)(this,S);e=(0,r.default)(this,c.call(this,e));return f(e,["handleOpen","handlePopupOpen","handlePopupClose","getPopup"]),e}i.displayName="PopupItem",t.default=i,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var d=h(n(2)),a=h(n(4)),r=h(n(6)),o=h(n(7)),i=n(0),c=h(i),l=h(n(3)),s=h(n(71)),u=h(n(88)),f=n(11),p=h(n(98));function h(e){return e&&e.__esModule?e:{default:e}}var m,g=f.func.bindCtx,y=f.obj.pickOthers,o=(m=i.Component,(0,o.default)(v,m),v.prototype.stopPropagation=function(e){e.stopPropagation()},v.prototype.handleCheck=function(e){var t=this.props,n=t.checkType,a=t.checked,t=t.onChange;"radio"===n&&a||t(!a,e)},v.prototype.handleKeyDown=function(e){e.keyCode!==f.KEYCODE.SPACE||this.props.checkDisabled||this.handleCheck(e),this.props.onKeyDown&&this.props.onKeyDown(e)},v.prototype.handleClick=function(e){this.handleCheck(e),this.props.onClick&&this.props.onClick(e)},v.prototype.renderCheck=function(){var e=this.props,t=e.root,n=e.checked,a=e.indeterminate,r=e.disabled,o=e.checkType,i=e.checkDisabled,e=e.onChange,t=t.props.labelToggleChecked,l=("radio"===o?u:s).default,n={tabIndex:"-1",checked:n,disabled:r||i};return"checkbox"===o&&(n.indeterminate=a),t||(n.onChange=e,n.onClick=this.stopPropagation),c.default.createElement(l,(0,d.default)({"aria-labelledby":this.id},n))},v.prototype.render=function(){var e=this.props,t=e._key,n=e.root,a=e.checked,r=e.disabled,o=e.onClick,i=e.helper,e=e.children,l=n.props,s=l.prefix,l=l.labelToggleChecked,u=y(Object.keys(v.propTypes),this.props),t=(0,d.default)({_key:t,root:n,disabled:r,type:"item",onClick:o,onKeyDown:this.handleKeyDown},u),n=(l&&!r&&(t.onClick=this.handleClick),void 0);return c.default.createElement(p.default,(0,d.default)({"aria-checked":a,title:n="string"==typeof e?e:n},t),this.renderCheck(),c.default.createElement("span",{className:s+"menu-item-text",id:this.id},e),i?c.default.createElement("div",{className:s+"menu-item-helper"},i):null)},i=n=v,n.propTypes={_key:l.default.string,root:l.default.object,disabled:l.default.bool,inlineIndent:l.default.number,checked:l.default.bool,indeterminate:l.default.bool,onChange:l.default.func,checkType:l.default.oneOf(["checkbox","radio"]),checkDisabled:l.default.bool,helper:l.default.node,children:l.default.node,onKeyDown:l.default.func,onClick:l.default.func,id:l.default.string},n.defaultProps={disabled:!1,checked:!1,indeterminate:!1,checkType:"checkbox",checkDisabled:!1,onChange:{}},i);function v(e){(0,a.default)(this,v);var t=(0,r.default)(this,m.call(this,e));return g(t,["stopPropagation","handleKeyDown","handleClick"]),t.id=f.htmlId.escapeForId("checkable-item-"+(e.id||e._key)),t}o.displayName="CheckableItem",t.default=o,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var _=f(n(2)),b=f(n(12)),o=f(n(4)),a=f(n(378)),i=f(n(6)),r=f(n(7)),w=f(n(0)),l=f(n(3)),M=f(n(13)),s=n(30),u=f(n(379)),d=f(n(8)),k=f(n(24)),c=f(n(618)),S=n(11);function f(e){return e&&e.__esModule?e:{default:e}}n=S.func.noop;function p(e,t){return-1<e.indexOf(t)}h=u.default,(0,r.default)(E,h),E.getDerivedStateFromProps=function(e){var t=e.context,n={};return t.__group__?"selectedValue"in t&&(n.checked=p(t.selectedValue,e.value)):"checked"in e&&(n.checked=e.checked),"indeterminate"in e&&(n.indeterminate=e.indeterminate),n},E.prototype.shouldComponentUpdate=function(e,t,n){var a=S.obj.shallowEqual;return!a(this.props,e)||!a(this.state,t)||!a(this.context,n)},E.prototype.onChange=function(e){var t=this.props,n=t.context,t=t.value,a=e.target.checked;this.disabled||(n.__group__?n.onChange(t,e):("checked"in this.props||this.setState({checked:a}),"indeterminate"in this.props||this.setState({indeterminate:!1}),this.props.onChange(a,e)))},E.prototype.render=function(){var e=this.props,t=e.id,n=e.className,a=e.children,r=e.style,o=e.label,i=e.onMouseEnter,l=e.onMouseLeave,s=e.rtl,u=e.isPreview,d=e.renderPreview,c=e.context,f=e.value,p=e.name,e=(0,b.default)(e,["id","className","children","style","label","onMouseEnter","onMouseLeave","rtl","isPreview","renderPreview","context","value","name"]),h=!!this.state.checked,m=this.disabled,g=!!this.state.indeterminate,c=c.prefix||this.props.prefix,y=S.obj.pickOthers(E.propTypes,e),y=S.obj.pickAttrsWith(y,"data-"),e=(e.title&&(y.title=e.title),w.default.createElement("input",(0,_.default)({},S.obj.pickOthers(E.propTypes,e),{id:t,value:f,name:p,disabled:m,checked:h,type:"checkbox",onChange:this.onChange,"aria-checked":g?"mixed":h,className:c+"checkbox-input"}))),p=(m||(e=this.getStateElement(e)),(0,M.default)(((f={})[c+"checkbox-wrapper"]=!0,f[n]=!!n,f.checked=h,f.disabled=m,f.indeterminate=g,f[this.getStateClassName()]=!0,f))),v=c+"checkbox-label",m=g?"semi-select":"select";if(u)return f=(0,M.default)(n,c+"form-preview"),"renderPreview"in this.props?w.default.createElement("div",(0,_.default)({id:t,dir:s?"rtl":void 0},y,{className:f}),d(h,this.props)):w.default.createElement("p",(0,_.default)({id:t,dir:s?"rtl":void 0},y,{className:f}),h&&(a||o||this.state.value));n=(0,M.default)(((u={zoomIn:g})[c+"checkbox-semi-select-icon"]=g,u[c+"checkbox-select-icon"]=!g,u));return w.default.createElement("label",(0,_.default)({},y,{className:p,style:r,dir:s?"rtl":void 0,onMouseEnter:i,onMouseLeave:l}),w.default.createElement("span",{className:c+"checkbox"},w.default.createElement("span",{className:c+"checkbox-inner"},w.default.createElement(k.default,{type:m,size:"xs",className:n})),e),[o,a].map(function(e,t){return-1===[void 0,null].indexOf(e)?w.default.createElement("span",{key:t,className:v},e):null}))},(0,a.default)(E,[{key:"disabled",get:function(){var e=this.props,t=e.context;return e.disabled||"disabled"in t&&t.disabled}}]),r=u=E,u.displayName="Checkbox",u.propTypes=(0,_.default)({},d.default.propTypes,{prefix:l.default.string,rtl:l.default.bool,className:l.default.string,id:l.default.string,style:l.default.object,checked:l.default.bool,defaultChecked:l.default.bool,disabled:l.default.bool,label:l.default.node,indeterminate:l.default.bool,defaultIndeterminate:l.default.bool,onChange:l.default.func,onMouseEnter:l.default.func,onMouseLeave:l.default.func,value:l.default.oneOfType([l.default.string,l.default.number]),name:l.default.string,isPreview:l.default.bool,renderPreview:l.default.func}),u.defaultProps={defaultChecked:!1,defaultIndeterminate:!1,onChange:n,onMouseEnter:n,onMouseLeave:n,prefix:"next-",isPreview:!1};var h,a=r;function E(e){(0,o.default)(this,E);var t=(0,i.default)(this,h.call(this,e)),n=e.context,a=void 0,r=void 0,a="checked"in e?e.checked:e.defaultChecked,r="indeterminate"in e?e.indeterminate:e.defaultIndeterminate;return n.__group__&&(a=p(n.selectedValue,e.value)),t.state={checked:a,indeterminate:r},t.onChange=t.onChange.bind(t),t}t.default=d.default.config((0,c.default)((0,s.polyfill)(a))),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var n=n(615),r=(n=n)&&n.__esModule?n:{default:n};function a(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),(0,r.default)(e,a.key,a)}}t.default=function(e,t,n){return t&&a(e.prototype,t),n&&a(e,n),e}},function(e,t,n){"use strict";t.__esModule=!0;var a=u(n(4)),r=u(n(6)),o=u(n(7)),i=n(0),l=u(i),s=u(n(13));function u(e){return e&&e.__esModule?e:{default:e}}var d,c=n(11).func.makeChain,n=(d=i.Component,(0,o.default)(f,d),f.prototype.getStateElement=function(e){var t=this.props,n=t.onFocus,t=t.onBlur;return l.default.cloneElement(e,{onFocus:c(this._onUIFocus,n),onBlur:c(this._onUIBlur,t)})},f.prototype.getStateClassName=function(){var e=this.state.focused;return(0,s.default)({focused:e})},f.prototype.resetUIState=function(){this.setState({focused:!1})},f.prototype._onUIFocus=function(){this.setState({focused:!0})},f.prototype._onUIBlur=function(){this.setState({focused:!1})},f);function f(e){(0,a.default)(this,f);var t=(0,r.default)(this,d.call(this,e));return t.state={},["_onUIFocus","_onUIBlur"].forEach(function(e){t[e]=t[e].bind(t)}),t}n.displayName="UIState",t.default=n,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var b=f(n(2)),w=f(n(12)),r=f(n(4)),a=f(n(378)),o=f(n(6)),i=f(n(7)),M=f(n(0)),l=f(n(3)),k=f(n(13)),s=n(30),u=f(n(379)),d=f(n(8)),c=f(n(620)),S=n(11);function f(e){return e&&e.__esModule?e:{default:e}}var p,E=S.func.makeChain,n=S.func.noop,a=(p=u.default,(0,i.default)(x,p),x.getDerivedStateFromProps=function(e){var t=e.context;return t.__group__&&"selectedValue"in t?{checked:t.selectedValue===e.value}:"checked"in e?{checked:e.checked}:null},x.prototype.shouldComponentUpdate=function(e,t,n){var a=S.obj.shallowEqual;return!a(this.props,e)||!a(this.state,t)||!a(this.context,n)},x.prototype.componentDidUpdate=function(){this.disabled&&this.resetUIState()},x.prototype.onChange=function(e){var t=e.target.checked,n=this.props,a=n.context,n=n.value;a.__group__?a.onChange(n,e):this.state.checked!==t&&("checked"in this.props||this.setState({checked:t}),this.props.onChange(t,e))},x.prototype.render=function(){var e=this.props,t=e.id,n=e.className,a=e.children,r=e.style,o=e.label,i=e.onMouseEnter,l=e.onMouseLeave,s=e.tabIndex,u=e.rtl,d=e.name,c=e.isPreview,f=e.renderPreview,p=e.value,h=e.context,e=(0,w.default)(e,["id","className","children","style","label","onMouseEnter","onMouseLeave","tabIndex","rtl","name","isPreview","renderPreview","value","context"]),m=!!this.state.checked,g=this.disabled,y=h.isButton,h=h.prefix||this.props.prefix,e=S.obj.pickOthers(x.propTypes,e),v=S.obj.pickAttrsWith(e,"data-");if(c)return c=(0,k.default)(n,h+"form-preview"),"renderPreview"in this.props?M.default.createElement("div",(0,b.default)({id:t,dir:u?"rtl":"ltr"},e,{className:c}),f(m,this.props)):M.default.createElement("p",(0,b.default)({id:t,dir:u?"rtl":"ltr"},e,{className:c}),m&&(a||o||p));var f=M.default.createElement("input",(0,b.default)({},S.obj.pickOthers(v,e),{name:d,id:t,tabIndex:s,disabled:g,checked:m,type:"radio",onChange:this.onChange,"aria-checked":m,className:h+"radio-input"})),p=(g||(f=this.getStateElement(f)),(0,k.default)(((c={})[h+"radio"]=!0,c.checked=m,c.disabled=g,c[this.getStateClassName()]=!0,c))),d=(0,k.default)(((e={})[h+"radio-inner"]=!0,e.press=m,e.unpress=!m,e)),s=(0,k.default)(((t={})[h+"radio-wrapper"]=!0,t[n]=!!n,t.checked=m,t.disabled=g,t[this.getStateClassName()]=!0,t)),_=h+"radio-label",c=y?M.default.createElement("span",{className:h+"radio-single-input"},f):M.default.createElement("span",{className:p},M.default.createElement("span",{className:d}),f);return M.default.createElement("label",(0,b.default)({},v,{dir:u?"rtl":"ltr",style:r,"aria-checked":m,"aria-disabled":g,className:s,onMouseEnter:g?i:E(this._onUIMouseEnter,i),onMouseLeave:g?l:E(this._onUIMouseLeave,l)}),c,[a,o].map(function(e,t){return void 0!==e?M.default.createElement("span",{key:t,className:_},e):null}))},(0,a.default)(x,[{key:"disabled",get:function(){var e=this.props,t=e.context;return e.disabled||t.__group__&&"disabled"in t&&t.disabled}}]),i=u=x,u.displayName="Radio",u.propTypes=(0,b.default)({},d.default.propTypes,{className:l.default.string,id:l.default.string,style:l.default.object,checked:l.default.bool,defaultChecked:l.default.bool,label:l.default.node,onChange:l.default.func,onMouseEnter:l.default.func,onMouseLeave:l.default.func,disabled:l.default.bool,value:l.default.oneOfType([l.default.string,l.default.number,l.default.bool]),name:l.default.string,isPreview:l.default.bool,renderPreview:l.default.func}),u.defaultProps={onChange:n,onMouseLeave:n,onMouseEnter:n,tabIndex:0,prefix:"next-",isPreview:!1},u.contextTypes={onChange:l.default.func,__group__:l.default.bool,isButton:l.default.bool,selectedValue:l.default.oneOfType([l.default.string,l.default.number,l.default.bool]),disabled:l.default.bool},i);function x(e){(0,r.default)(this,x);var t=(0,o.default)(this,p.call(this,e)),n=e.context,a=void 0,a=n.__group__?n.selectedValue===e.value:"checked"in e?e.checked:e.defaultChecked;return t.state={checked:a},t.onChange=t.onChange.bind(t),t}t.default=d.default.config((0,c.default)((0,s.polyfill)(a))),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var a=d(n(4)),r=d(n(6)),o=d(n(7)),i=n(0),l=d(i),s=d(n(3)),u=d(n(13)),n=d(n(8));function d(e){return e&&e.__esModule?e:{default:e}}c=i.Component,(0,o.default)(f,c),f.prototype.render=function(){var e=this.props,t=e.prefix,n=e.title,a=e.subTitle,r=e.extra,e=e.showTitleBullet;if(!n)return null;var e=(0,u.default)(((o={})[t+"card-head"]=!0,o[t+"card-head-show-bullet"]=e,o)),o=r?l.default.createElement("div",{className:t+"card-extra"},r):null;return l.default.createElement("div",{className:e},l.default.createElement("div",{className:t+"card-head-main"},l.default.createElement("div",{className:t+"card-title"},n,a?l.default.createElement("span",{className:t+"card-subtitle"},a):null),o))},o=i=f,i.propTypes={prefix:s.default.string,title:s.default.node,subTitle:s.default.node,showTitleBullet:s.default.bool,extra:s.default.node},i.defaultProps={prefix:"next-",showTitleBullet:!0};var c,s=o;function f(){return(0,a.default)(this,f),(0,r.default)(this,c.apply(this,arguments))}s.displayName="CardBulletHeader",t.default=n.default.config(s,{componentName:"Card"}),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var a=p(n(4)),r=p(n(6)),o=p(n(7)),i=n(0),l=p(i),s=p(n(23)),u=p(n(3)),d=p(n(24)),c=p(n(18)),f=p(n(8)),n=p(n(44));function p(e){return e&&e.__esModule?e:{default:e}}h=i.Component,(0,o.default)(m,h),m.prototype.componentDidMount=function(){this._setNeedMore(),this._setContentHeight()},m.prototype.componentDidUpdate=function(){this._setContentHeight()},m.prototype._setNeedMore=function(){var e=this.props.contentHeight,t=this._getNodeChildrenHeight(this.content);this.setState({needMore:"auto"!==e&&e<t})},m.prototype._setContentHeight=function(){var e,t;"auto"===this.props.contentHeight?this.content.style.height="auto":this.state.expand?(e=this._getNodeChildrenHeight(this.content),this.content.style.height=e+"px"):(e=s.default.findDOMNode(this.footer),t=this.props.contentHeight,e&&(t-=e.getBoundingClientRect().height),this.content.style.height=t+"px")},m.prototype._getNodeChildrenHeight=function(e){if(!e)return 0;var e=e.childNodes,t=e.length;if(!t)return 0;e=e[t-1];return e.offsetTop+e.offsetHeight},m.prototype.render=function(){var e=this.props,t=e.prefix,n=e.children,e=e.locale,a=this.state,r=a.needMore,a=a.expand;return l.default.createElement("div",{className:t+"card-body"},l.default.createElement("div",{className:t+"card-content",ref:this._contentRefHandler},n),r?l.default.createElement("div",{className:t+"card-footer",ref:this.saveFooter,onClick:this.handleToggle},l.default.createElement(c.default,{text:!0,type:"primary"},a?e.fold:e.expand,l.default.createElement(d.default,{type:"arrow-down",className:a?"expand":""}))):null)},o=i=m,i.propTypes={prefix:u.default.string,contentHeight:u.default.oneOfType([u.default.string,u.default.number]),locale:u.default.object,children:u.default.node},i.defaultProps={prefix:"next-",contentHeight:120,locale:n.default.Card};var h,u=o;function m(e,t){(0,a.default)(this,m);var n=(0,r.default)(this,h.call(this,e,t));return n.handleToggle=function(){n.setState(function(e){return{expand:!e.expand}})},n._contentRefHandler=function(e){n.content=e},n.saveFooter=function(e){n.footer=e},n.state={needMore:!1,expand:!1,contentHeight:"auto"},n}u.displayName="CardCollapseContent",t.default=f.default.config(u,{componentName:"Card"}),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var s=p(n(2)),u=p(n(12)),a=p(n(4)),r=p(n(6)),o=p(n(7)),i=n(0),d=p(i),l=p(n(3)),c=p(n(13)),f=p(n(8));function p(e){return e&&e.__esModule?e:{default:e}}var h,m=n(11).log.warning,g=["video","audio","picture","iframe","img"],o=(h=i.Component,(0,o.default)(y,h),y.prototype.render=function(){var e=this.props,t=e.prefix,n=e.style,a=e.className,r=e.component,o=e.image,i=e.src,e=(0,u.default)(e,["prefix","style","className","component","image","src"]),l=("children"in e||Boolean(o||i)||m("either `children`, `image` or `src` prop must be specified."),-1!==g.indexOf(r)),n=!l&&o?(0,s.default)({backgroundImage:'url("'+o+'")'},n):n;return d.default.createElement(r,(0,s.default)({},e,{style:n,className:(0,c.default)(t+"card-media",a),src:l?o||i:void 0}))},i=n=y,n.propTypes={prefix:l.default.string,component:l.default.elementType,image:l.default.string,src:l.default.string,style:l.default.object,className:l.default.string},n.defaultProps={prefix:"next-",component:"div",style:{}},i);function y(){return(0,a.default)(this,y),(0,r.default)(this,h.apply(this,arguments))}o.displayName="CardMedia",t.default=f.default.config(o),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var r=f(n(2)),o=f(n(12)),a=f(n(4)),i=f(n(6)),l=f(n(7)),s=n(0),u=f(s),d=f(n(3)),c=f(n(13)),n=f(n(8));function f(e){return e&&e.__esModule?e:{default:e}}p=s.Component,(0,l.default)(h,p),h.prototype.render=function(){var e=this.props,t=e.prefix,n=e.component,a=e.className,e=(0,o.default)(e,["prefix","component","className"]);return u.default.createElement(n,(0,r.default)({},e,{className:(0,c.default)(t+"card-actions",a)}))},l=s=h,s.propTypes={prefix:d.default.string,component:d.default.elementType,className:d.default.string},s.defaultProps={prefix:"next-",component:"div"};var p,d=l;function h(){return(0,a.default)(this,h),(0,i.default)(this,p.apply(this,arguments))}d.displayName="CardActions",t.default=n.default.config(d),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var F=c(n(2)),z=c(n(12)),a=c(n(4)),r=c(n(6)),o=c(n(7)),W=c(n(0)),i=c(n(3)),V=c(n(13)),l=c(n(386)),s=c(n(387)),u=c(n(129)),d=c(n(640));function c(e){return e&&e.__esModule?e:{default:e}}function f(){}p=W.default.Component,(0,o.default)(h,p),h.prototype.render=function(){var k=this,e=this.props,S=e.prefix,t=e.className,n=e.children,a=e.component,r=(e.colGroup,e.columns),E=e.locale,x=e.filterParams,C=e.onFilter,o=e.components,L=(e.affixRef,e.headerCellRef,e.onSort,e.sort),T=e.sortIcons,D=e.onResizeChange,O=e.pure,N=e.rtl,P=(e.tableWidth,e.tableEl),j=e.resizeProxyDomRef,e=(0,z.default)(e,["prefix","className","children","component","colGroup","columns","locale","filterParams","onFilter","components","affixRef","headerCellRef","onSort","sort","sortIcons","onResizeChange","pure","rtl","tableWidth","tableEl","resizeProxyDomRef"]),i=(this.checkHasLock(),o.Cell),Y=void 0===i?u.default:i,i=o.Filter,I=void 0===i?l.default:i,i=o.Sort,R=void 0===i?s.default:i,i=o.Resize,A=void 0===i?d.default:i,H=r.length,o=r.map(function(e,M){e=e.map(function(e,t){var n=k.getCellDomRefKey(M,t),a=e.title,r=e.colSpan,o=e.sortable,i=e.sortDirections,l=e.resizable,s=e.asyncResizable,u=e.dataIndex,d=e.filters,c=e.filterMode,f=e.filterMenuProps,p=e.filterProps,h=(e.width,e.align),m=e.alignHeader,g=e.className,y=(e.__normalized,e.lock,e.cellStyle,e.wordBreak),v=(0,z.default)(e,["title","colSpan","sortable","sortDirections","resizable","asyncResizable","dataIndex","filters","filterMode","filterMenuProps","filterProps","width","align","alignHeader","className","__normalized","lock","cellStyle","wordBreak"]),_=L?L[u]:"",g=(0,V.default)(((b={})[S+"table-header-node"]=!0,b[S+"table-header-resizable"]=l||s,b[S+"table-word-break-"+y]=!!y,b[S+"table-header-sort-"+_]=o&&_,b[g]=g,b)),y={},_=void 0,b=void 0,w=void 0;return y.colSpan=r,e.children&&e.children.length||(o&&(_=W.default.createElement(R,{prefix:S,className:S+"table-header-icon",dataIndex:u,onSort:k.onSort,sortDirections:i,sortIcons:T,sort:L,rtl:N,locale:E})),(s||l)&&(w=W.default.createElement(A,{asyncResizable:s,hasLock:k.hasLock,col:e,tableEl:P,prefix:S,rtl:N,dataIndex:u,resizeProxyDomRef:j,cellDomRef:k[n],onChange:D})),d&&(b=d.length?W.default.createElement(I,{dataIndex:u,className:S+"table-header-icon",filters:d,prefix:S,locale:E,rtl:N,filterParams:x,filterMode:c,filterMenuProps:f,filterProps:p,onFilter:C}):null),y.rowSpan=H-M),0==+y.colSpan?null:W.default.createElement(Y,(0,F.default)({},v,y,{key:t,prefix:S,pure:O,rtl:N,cell:a,component:"th",align:m||h,className:g,ref:k.getCellRef.bind(k,M,t),getCellDomRef:k.getCellDomRef.bind(k,M,t),type:"header"}),_,b,w)});return W.default.createElement("tr",{key:M},e)});return W.default.createElement(a,(0,F.default)({className:t},e),o,n)},o=n=h,n.propTypes={children:i.default.any,prefix:i.default.string,pure:i.default.bool,className:i.default.string,component:i.default.string,columns:i.default.array,colGroup:i.default.object,headerCellRef:i.default.func,locale:i.default.object,filterParams:i.default.object,onFilter:i.default.func,components:i.default.object,sort:i.default.object,sortIcons:i.default.object,onSort:i.default.func,onResizeChange:i.default.func,tableWidth:i.default.number,tableEl:i.default.any},n.defaultProps={component:"thead",columns:[],headerCellRef:f,onFilter:f,components:{},onSort:f,onResizeChange:f};var p,i=o;function h(){(0,a.default)(this,h);var o=(0,r.default)(this,p.call(this));return o.checkHasLock=function(){for(var e=o.props.columns,t=!1,n=0;n<e.length;n++){for(var a=e[n],r=0;r<a.length;r++)if(a[r].lock){t=!0;break}if(t)break}o.hasLock=t},o.getCellRef=function(e,t,n){o.props.headerCellRef(e,t,n);var a=o.props.columns,a=a[e]&&a[e][t];a&&a.ref&&"function"==typeof a.ref&&a.ref(n)},o.getCellDomRef=function(e,t,n){e=o.getCellDomRefKey(e,t);o[e]=n},o.getCellDomRefKey=function(e,t){return"header_cell_"+e+"_"+t},o.onSort=function(e,t,n){o.props.onSort(e,t,n)},o.hasLock=!1,o}i.displayName="Header",t.default=i,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var a,m=d(n(2)),g=d(n(12)),r=d(n(4)),o=d(n(6)),i=d(n(7)),y=d(n(0)),l=d(n(3)),s=n(30),v=d(n(13)),_=d(n(113)),b=d(n(50)),w=d(n(18)),M=d(n(24)),u=n(11);function d(e){return e&&e.__esModule?e:{default:e}}c=y.default.Component,(0,i.default)(f,c),f.getDerivedStateFromProps=function(e,t){var n,a={};return e.hasOwnProperty("filterParams")&&void 0!==e.filterParams&&(n=e.dataIndex||this.props.dataIndex,e=(e.filterParams||{})[n]||{},n=void 0,t.selectedKeysChangedByInner?(n=t.selectedKeys||[],a.selectedKeysChangedByInner=!1):n=e.selectedKeys||[],a.selectedKeys=n),a},f.prototype.componentDidUpdate=function(e,t){t=t.selectedKeys;this._selectedKeys=[].concat(t)},f.prototype.render=function(){var e,t=this.props,n=t.filters,a=t.prefix,r=t.locale,o=t.className,i=t.filterMode,l=t.filterMenuProps,s=t.filterProps,t=t.rtl,u=(0,v.default)(s&&s.className,((u={})[a+"table-filter-menu"]=!0,u)),d=this.state,c=d.visible,d=d.selectedKeys,l=l||{},f=l.subMenuSelectable,l=(0,g.default)(l,["subMenuSelectable"]);function p(e){return e.map(function(e){return e.children?(t=e.children,y.default.createElement(b.default.SubMenu,{label:e.label,key:e.value,selectable:f},p(t))):y.default.createElement(b.default.Item,{key:e.value},e.label);var t})}var n=p(n),h=y.default.createElement("div",{className:a+"table-filter-footer"},y.default.createElement(w.default,{type:"primary",onClick:this.onFilterConfirm},r.ok),y.default.createElement(w.default,{onClick:this.onFilterClear},r.reset)),o=(0,v.default)(((e={})[a+"table-filter"]=!0,e[o]=o,e)),a=(0,v.default)(((e={})[a+"table-filter-active"]=d&&0<d.length,e));return y.default.createElement(_.default,(0,m.default)({trigger:y.default.createElement("span",{role:"button","aria-label":r.filter,onKeyDown:this.filterKeydown,tabIndex:"0",className:o},y.default.createElement(M.default,{type:"filter",size:"small",className:a})),triggerType:"click",visible:c,autoFocus:!0,rtl:t,needAdjust:!1,onVisibleChange:this.onFilterVisible,className:u},s),y.default.createElement(b.default,(0,m.default)({footer:h,rtl:t,selectedKeys:d,selectMode:i,onSelect:this.onFilterSelect},l),n))},i=n=f,n.propTypes={dataIndex:l.default.string,filters:l.default.array,filterMode:l.default.string,filterParams:l.default.object,filterMenuProps:l.default.object,filterProps:l.default.object,locale:l.default.object,onFilter:l.default.func,prefix:l.default.string,rtl:l.default.bool},n.defaultProps={onFilter:function(){}},a=function(){var n=this;this.filterKeydown=function(e){e.preventDefault(),e.stopPropagation(),e.keyCode===u.KEYCODE.ENTER&&n.setState({visible:!n.state.visible})},this.onFilterVisible=function(e){n.setState({visible:e}),e||(e=[].concat(n._selectedKeys),n.setState({selectedKeysChangedByInner:!0,selectedKeys:e}))},this.onFilterSelect=function(e){n.setState({visible:!0,selectedKeysChangedByInner:!0,selectedKeys:e})},this.onFilterConfirm=function(){var e=n.state.selectedKeys,t={};t[n.props.dataIndex]={visible:!1,selectedKeys:e},n._selectedKeys=[].concat(e),n.setState({visible:!1,selectedKeysChangedByInner:!0}),n.props.onFilter(t)},this.onFilterClear=function(){var e={};e[n.props.dataIndex]={visible:!1,selectedKeys:[]},n._selectedKeys=[],n.setState({selectedKeys:[],visible:!1,selectedKeysChangedByInner:!0}),n.props.onFilter(e)}};var c,l=i;function f(e){(0,r.default)(this,f);var t=(0,o.default)(this,c.call(this,e));a.call(t);e=(e.filterParams||{})[e.dataIndex]||{};return t.state={visible:e.visible||!1,selectedKeys:e.selectedKeys||[],selectedKeysChangedByInner:!0},t._selectedKeys=[].concat(t.state.selectedKeys),t}l.displayName="Filter",t.default=(0,s.polyfill)(l),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var r=s(n(4)),o=s(n(6)),a=s(n(7)),c=s(n(0)),i=s(n(3)),f=s(n(13)),p=s(n(24)),l=n(11);function s(e){return e&&e.__esModule?e:{default:e}}u=c.default.Component,(0,a.default)(d,u),d.prototype.renderSort=function(){var e=this.props,t=e.prefix,n=e.sort,a=e.sortIcons,r=e.className,o=e.dataIndex,i=e.locale,l=e.sortDirections,s=e.rtl,u=n[o],d={desc:"descending",asc:"ascending"},e=l.map(function(e){return"default"===e?null:c.default.createElement("a",{key:e,className:u===e?"current":""},a?a[e]:c.default.createElement(p.default,{rtl:s,type:d[e],size:"xs"}))}),o=(0,f.default)(((n={})[t+"table-sort"]=!0,n[r]=r,n));return c.default.createElement("span",{role:"button",tabIndex:"0","aria-label":i[u],className:o,onClick:this.handleClick.bind(this),onKeyDown:this.keydownHandler},e)},d.prototype.render=function(){return this.renderSort()},a=n=d,n.propTypes={prefix:i.default.string,rtl:i.default.bool,className:i.default.string,sort:i.default.object,sortIcons:i.default.object,onSort:i.default.func,sortDirections:i.default.arrayOf(i.default.oneOf(["desc","asc","default"])),dataIndex:i.default.string,locale:i.default.object},n.defaultProps={sort:{},sortDirections:["desc","asc"]};var u,i=a;function d(){var e,i;(0,r.default)(this,d);for(var t=arguments.length,n=Array(t),a=0;a<t;a++)n[a]=arguments[a];return(e=i=(0,o.default)(this,u.call.apply(u,[this].concat(n)))).handleClick=function(){var e=i.props,n=e.sort,a=e.dataIndex,r=e.sortDirections,o="";r.forEach(function(e,t){n[a]===e&&(o=r.length-1>t?r[t+1]:r[0])}),n[a]||(o=r[0]),i.onSort(a,o)},i.keydownHandler=function(e){e.preventDefault(),e.stopPropagation(),e.keyCode===l.KEYCODE.ENTER&&i.handleClick()},i.onSort=function(e,t){var n={};n[e]=t,i.props.onSort(e,t,n)},(0,o.default)(i,e)}i.displayName="Sort",t.default=i,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var r=c(n(2)),a=c(n(4)),o=c(n(6)),i=c(n(7)),l=c(n(0)),s=c(n(3)),u=c(n(13)),d=c(n(389));function c(e){return e&&e.__esModule?e:{default:e}}f=l.default.Component,(0,i.default)(p,f),p.prototype.render=function(){var e=this.props,t=e.className,n=e.record,e=e.primaryKey,a=this.context.selectedRowKeys,n=(0,u.default)(((a={selected:-1<a.indexOf(n[e])})[t]=t,a));return l.default.createElement(d.default,(0,r.default)({},this.props,{className:n}))},i=n=p,n.propTypes=(0,r.default)({},d.default.propTypes),n.defaultProps=(0,r.default)({},d.default.defaultProps),n.contextTypes={selectedRowKeys:s.default.array};var f,n=i;function p(){return(0,a.default)(this,p),(0,o.default)(this,f.apply(this,arguments))}n.displayName="SelectionRow",t.default=n,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var o=d(n(2)),i=d(n(12)),l=d(n(4)),s=d(n(6)),a=d(n(7)),_=d(n(0)),r=d(n(3)),b=n(11),u=d(n(174));function d(e){return e&&e.__esModule?e:{default:e}}c=_.default.Component,(0,a.default)(f,c),f.prototype.renderExpandedRow=function(e,r){var t=this.context,n=t.expandedRowRender,a=t.expandedRowIndent,o=t.openRowKeys,i=t.lockType,l=t.expandedIndexSimulate,t=t.expandedRowWidthEquals2Table,l=l?(r-1)/2:r,s=this.props,u=s.columns,d=s.cellRef,s=u.length,c=u[0]&&u[0].__colIndex||0;if(n){var f=this.props,p=f.primaryKey,f=f.prefix,h=a[0],a=a[1],m=h+a,g=function(e){for(var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:0,a=[],t=0;t<e;t++)!function(t){a.push(_.default.createElement("td",{key:t,ref:function(e){return d(r,t+n,e)}},"聽"))}(t);return a},y=void 0;if(s<m&&!i&&b.log.warning("It's not allowed expandedRowIndent is more than the number of columns."),h<u.length&&"left"===i&&b.log.warning("expandedRowIndent left is less than the number of left lock columns."),a<u.length&&"right"===i&&b.log.warning("expandedRowIndent right is less than the number of right lock columns."),i)return-1<o.indexOf(e[p])?_.default.createElement("tr",{className:f+"table-expanded-row",key:"expanded-"+l},_.default.createElement("td",{colSpan:s,ref:function(e){return d(r,c,e)}},"聽")):null;var i={position:"sticky",left:0},y=n(e,l),v=(y=_.default.isValidElement(y)?t?_.default.createElement("div",{className:f+"table-expanded-area",ref:this.getExpandedRow.bind(this,e[p]),style:i},y):y:_.default.createElement("div",{className:f+"table-cell-wrapper",ref:this.getExpandedRow.bind(this,e[p]),style:t&&i},y),u.length);return u.forEach(function(e){"right"===e.lock&&v--}),-1<o.indexOf(e[p])?_.default.createElement("tr",{className:f+"table-expanded-row",key:"expanded-"+(e[p]||l)},g(h),_.default.createElement("td",{colSpan:s-m},y),g(a,v)):null}return null},f.prototype.render=function(){var e=this.props,t=e.record,n=e.rowIndex,a=e.columns,e=(0,i.default)(e,["record","rowIndex","columns"]),r=this.context.expandedIndexSimulate;return t.__expanded?this.renderExpandedRow(t,n,a):_.default.createElement(u.default,(0,o.default)({},e,{record:t,columns:a,__rowIndex:n,rowIndex:r?n/2:n}))},a=n=f,n.propTypes=(0,o.default)({},u.default.propTypes),n.defaultProps=(0,o.default)({},u.default.defaultProps),n.contextTypes={openRowKeys:r.default.array,expandedRowRender:r.default.func,expandedRowIndent:r.default.array,expandedIndexSimulate:r.default.bool,expandedRowWidthEquals2Table:r.default.bool,lockType:r.default.oneOf(["left","right"]),getExpandedRowRef:r.default.func};var c,n=a;function f(){var e,a;(0,l.default)(this,f);for(var t=arguments.length,n=Array(t),r=0;r<t;r++)n[r]=arguments[r];return(e=a=(0,s.default)(this,c.call.apply(c,[this].concat(n)))).getExpandedRow=function(e,t){var n=a.context.getExpandedRowRef;n&&n(e,t)},(0,s.default)(a,e)}n.displayName="ExpandedRow",t.default=n,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var l=f(n(2)),s=f(n(12)),o=f(n(4)),i=f(n(6)),a=f(n(7)),u=f(n(0)),r=n(23),d=f(n(3)),c=f(n(127));function f(e){return e&&e.__esModule?e:{default:e}}p=u.default.Component,(0,a.default)(h,p),h.prototype.componentDidMount=function(){var e=this.context.getNode;e&&e("body",(0,r.findDOMNode)(this))},h.prototype.render=function(){var e=this.props,t=e.className,n=e.colGroup,a=(e.onLockScroll,e.tableWidth),e=(0,s.default)(e,["className","colGroup","onLockScroll","tableWidth"]),r=this.context,o=r.maxBodyHeight,i={};return r.fixedHeader&&(i.maxHeight=o,i.position="relative"),u.default.createElement("div",{style:i,className:t,onScroll:this.onBodyScroll},u.default.createElement("table",{style:{width:a}},n,u.default.createElement(c.default,(0,l.default)({},e,{colGroup:n}))))},a=n=h,n.propTypes={children:d.default.any,prefix:d.default.string,className:d.default.string,colGroup:d.default.any,onLockScroll:d.default.func,tableWidth:d.default.number},n.contextTypes={fixedHeader:d.default.bool,maxBodyHeight:d.default.oneOfType([d.default.number,d.default.string]),onFixedScrollSync:d.default.func,getNode:d.default.func};var p,n=a;function h(){var e,n;(0,o.default)(this,h);for(var t=arguments.length,a=Array(t),r=0;r<t;r++)a[r]=arguments[r];return(e=n=(0,i.default)(this,p.call.apply(p,[this].concat(a)))).onBodyScroll=function(e){var t=n.context.onFixedScrollSync;t&&t(e),"onLockScroll"in n.props&&"function"==typeof n.props.onLockScroll&&n.props.onLockScroll(e)},(0,i.default)(n,e)}n.displayName="FixedBody",t.default=n,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var a=c(n(2)),o=c(n(4)),i=c(n(6)),r=c(n(7)),l=c(n(0)),s=n(23),u=c(n(3)),d=c(n(390));function c(e){return e&&e.__esModule?e:{default:e}}f=l.default.Component,(0,r.default)(p,f),p.prototype.componentDidMount=function(){this.context.getLockNode("body",(0,s.findDOMNode)(this),this.context.lockType)},p.prototype.render=function(){var e={onLockScroll:this.onBodyScroll};return l.default.createElement(d.default,(0,a.default)({},this.props,e))},r=n=p,n.propTypes=(0,a.default)({},d.default.propTypes),n.contextTypes=(0,a.default)({},d.default.contextTypes,{getLockNode:u.default.func,onLockBodyScroll:u.default.func,lockType:u.default.oneOf(["left","right"])});var f,n=r;function p(){var e,t;(0,o.default)(this,p);for(var n=arguments.length,a=Array(n),r=0;r<n;r++)a[r]=arguments[r];return(e=t=(0,i.default)(this,f.call.apply(f,[this].concat(a)))).onBodyScroll=function(e){t.context.onLockBodyScroll(e)},(0,i.default)(t,e)}n.displayName="LockBody",t.default=n,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var a,r=d(n(2)),o=d(n(4)),i=d(n(6)),l=d(n(7)),s=n(23),u=d(n(3)),n=d(n(130));function d(e){return e&&e.__esModule?e:{default:e}}c=n.default,(0,l.default)(f,c),f.prototype.componentDidMount=function(){var e=this.context,t=e.getNode,e=e.getLockNode;t&&t("header",(0,s.findDOMNode)(this),this.context.lockType),e&&e("header",(0,s.findDOMNode)(this),this.context.lockType)},a=l=f,l.propTypes=(0,r.default)({},n.default.propTypes),l.contextTypes=(0,r.default)({},n.default.contextTypes,{getLockNode:u.default.func,lockType:u.default.oneOf(["left","right"])});var c,l=a;function f(){return(0,o.default)(this,f),(0,i.default)(this,c.apply(this,arguments))}t.default=l,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var a=l(n(4)),r=l(n(6)),o=l(n(7)),i=l(n(0)),n=l(n(3));function l(e){return e&&e.__esModule?e:{default:e}}s=i.default.Component,(0,o.default)(u,s),u.prototype.render=function(){return null},o=i=u,i.propTypes={cell:n.default.oneOfType([n.default.element,n.default.node,n.default.func]),hasChildrenSelection:n.default.bool,hasSelection:n.default.bool,useFirstLevelDataWhenNoChildren:n.default.bool},i.defaultProps={cell:function(){return""},hasSelection:!0,hasChildrenSelection:!1,useFirstLevelDataWhenNoChildren:!1},i._typeMark="listHeader";var s,n=o;function u(){return(0,a.default)(this,u),(0,r.default)(this,s.apply(this,arguments))}n.displayName="ListHeader",t.default=n,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var a=l(n(4)),r=l(n(6)),o=l(n(7)),i=l(n(0)),n=l(n(3));function l(e){return e&&e.__esModule?e:{default:e}}s=i.default.Component,(0,o.default)(u,s),u.prototype.render=function(){return null},o=i=u,i.propTypes={cell:n.default.oneOfType([n.default.element,n.default.node,n.default.func])},i.defaultProps={cell:function(){return""}},i._typeMark="listFooter";var s,n=o;function u(){return(0,a.default)(this,u),(0,r.default)(this,s.apply(this,arguments))}n.displayName="ListFooter",t.default=n,e.exports=t.default},function(e,t,n){"use strict";n(70),n(75),n(43),n(660)},function(e,t,n){var a,d,u,s,o,c,f=[].indexOf||function(e){for(var t=0,n=this.length;t<n;t++)if(t in this&&this[t]===e)return t;return-1};function r(){}s=n(111),o=n(665),a=n(667),c=n(112),d=n(397),u=n(398),n(668),r.REGEX_QUOTED_STRING="(?:\"(?:[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\"|'(?:[^']*(?:''[^']*)*)')",r.PATTERN_TRAILING_COMMENTS=new s("^\\s*#.*$"),r.PATTERN_QUOTED_SCALAR=new s("^"+r.REGEX_QUOTED_STRING),r.PATTERN_THOUSAND_NUMERIC_SCALAR=new s("^(-|\\+)?[0-9,]+(\\.[0-9]+)?$"),r.PATTERN_SCALAR_BY_DELIMITERS={},r.settings={},r.configure=function(e,t){null==t&&(t=null),this.settings.exceptionOnInvalidType=e=null==e?null:e,this.settings.objectDecoder=t},r.parse=function(e,t,n){var a,r;if(null==n&&(n=null),this.settings.exceptionOnInvalidType=t=null==t?!1:t,this.settings.objectDecoder=n,null==e)return"";if(0===(e=c.trim(e)).length)return"";switch(a={exceptionOnInvalidType:t,objectDecoder:n,i:0},e.charAt(0)){case"[":r=this.parseSequence(e,a),++a.i;break;case"{":r=this.parseMapping(e,a),++a.i;break;default:r=this.parseScalar(e,null,['"',"'"],a)}if(""!==this.PATTERN_TRAILING_COMMENTS.replace(e.slice(a.i),""))throw new d('Unexpected characters near "'+e.slice(a.i)+'".');return r},r.dump=function(e,t,n){return null==t&&(t=!1),null==n&&(n=null),null==e?"null":"object"==(t=typeof e)?e instanceof Date?e.toISOString():null==n||"string"!=typeof(n=n(e))&&null==n?this.dumpObject(e):n:"boolean"==t?e?"true":"false":c.isDigits(e)?"string"==t?"'"+e+"'":String(parseInt(e)):c.isNumeric(e)?"string"==t?"'"+e+"'":String(parseFloat(e)):"number"==t?e===1/0?".Inf":e===-1/0?"-.Inf":isNaN(e)?".NaN":e:a.requiresDoubleQuoting(e)?a.escapeWithDoubleQuotes(e):a.requiresSingleQuoting(e)?a.escapeWithSingleQuotes(e):""===e?'""':c.PATTERN_DATE.test(e)||"null"===(n=e.toLowerCase())||"~"===n||"true"===n||"false"===n?"'"+e+"'":e},r.dumpObject=function(e,t,n){var a,r,o,i,l;if(null==n&&(n=null),e instanceof Array){for(i=[],a=0,o=e.length;a<o;a++)l=e[a],i.push(this.dump(l));return"["+i.join(", ")+"]"}for(r in i=[],e)l=e[r],i.push(this.dump(r)+": "+this.dump(l));return"{"+i.join(", ")+"}"},r.parseScalar=function(e,t,n,a,r){var o,i,l;if(null==t&&(t=null),null==n&&(n=['"',"'"]),null==r&&(r=!0),o=(a=null==(a=null==a?null:a)?{exceptionOnInvalidType:this.settings.exceptionOnInvalidType,objectDecoder:this.settings.objectDecoder,i:0}:a).i,l=e.charAt(o),0<=f.call(n,l)){if(i=this.parseQuotedScalar(e,a),o=a.i,null!=t&&(n=c.ltrim(e.slice(o)," ").charAt(0),!(0<=f.call(t,n))))throw new d("Unexpected characters ("+e.slice(o)+").")}else{if(t){if(l=t.join("|"),null==(n=this.PATTERN_SCALAR_BY_DELIMITERS[l])&&(n=new s("^(.+?)("+l+")"),this.PATTERN_SCALAR_BY_DELIMITERS[l]=n),!(t=n.exec(e.slice(o))))throw new d("Malformed inline YAML string ("+e+").");o+=(i=t[1]).length}else o+=(i=e.slice(o)).length,-1!==(l=i.indexOf(" #"))&&(i=c.rtrim(i.slice(0,l)));r&&(i=this.evaluateScalar(i,a))}return a.i=o,i},r.parseQuotedScalar=function(e,t){var n,a,r=t.i;if(n=this.PATTERN_QUOTED_SCALAR.exec(e.slice(r)))return a=n[0].substr(1,n[0].length-2),a='"'===e.charAt(r)?o.unescapeDoubleQuotedString(a):o.unescapeSingleQuotedString(a),r+=n[0].length,t.i=r,a;throw new u("Malformed inline YAML string ("+e.slice(r)+").")},r.parseSequence=function(e,t){var n,a,r=[],o=e.length,i=t.i;for(i+=1;i<o;){switch(t.i=i,e.charAt(i)){case"[":r.push(this.parseSequence(e,t)),i=t.i;break;case"{":r.push(this.parseMapping(e,t)),i=t.i;break;case"]":return r;case",":case" ":case"\n":break;default:if(n='"'===(n=e.charAt(i))||"'"===n,a=this.parseScalar(e,[",","]"],['"',"'"],t),i=t.i,!n&&"string"==typeof a&&(-1!==a.indexOf(": ")||-1!==a.indexOf(":\n")))try{a=this.parseMapping("{"+a+"}")}catch(e){0}r.push(a),--i}++i}throw new u("Malformed inline YAML string "+e)},r.parseMapping=function(e,t){var n,a,r,o,i={},l=e.length,s=t.i;for(s+=1,r=!1;s<l;){switch(t.i=s,e.charAt(s)){case" ":case",":case"\n":++s,t.i=s,r=!0;break;case"}":return i}if(r)r=!1;else for(a=this.parseScalar(e,[":"," ","\n"],['"',"'"],t,!1),s=t.i,n=!1;s<l;){switch(t.i=s,e.charAt(s)){case"[":o=this.parseSequence(e,t),s=t.i,void 0===i[a]&&(i[a]=o),n=!0;break;case"{":o=this.parseMapping(e,t),s=t.i,void 0===i[a]&&(i[a]=o),n=!0;break;case":":case" ":case"\n":break;default:o=this.parseScalar(e,[",","}"],['"',"'"],t),s=t.i,void 0===i[a]&&(i[a]=o),n=!0,--s}if(++s,n)break}}throw new u("Malformed inline YAML string "+e)},r.evaluateScalar=function(e,t){var n,a,r,o,i,l,s,u;switch(l=(e=c.trim(e)).toLowerCase()){case"null":case"":case"~":return null;case"true":return!0;case"false":return!1;case".inf":return 1/0;case".nan":return NaN;case"-.inf":return 1/0;default:switch(l.charAt(0)){case"!":switch(-1===(r=e.indexOf(" "))?l:l.slice(0,r)){case"!":return-1!==r?parseInt(this.parseScalar(e.slice(2))):null;case"!str":return c.ltrim(e.slice(4));case"!!str":return c.ltrim(e.slice(5));case"!!int":return parseInt(this.parseScalar(e.slice(5)));case"!!bool":return c.parseBoolean(this.parseScalar(e.slice(6)),!1);case"!!float":return parseFloat(this.parseScalar(e.slice(7)));case"!!timestamp":return c.stringToDate(c.ltrim(e.slice(11)));default:if(o=(t=null==t?{exceptionOnInvalidType:this.settings.exceptionOnInvalidType,objectDecoder:this.settings.objectDecoder,i:0}:t).objectDecoder,a=t.exceptionOnInvalidType,o)return-1===(r=(u=c.rtrim(e)).indexOf(" "))?o(u,null):(0<(s=c.ltrim(u.slice(r+1))).length||(s=null),o(u.slice(0,r),s));if(a)throw new d("Custom object support when parsing a YAML file has been disabled.");return null}break;case"0":return"0x"===e.slice(0,2)?c.hexDec(e):c.isDigits(e)?c.octDec(e):c.isNumeric(e)?parseFloat(e):e;case"+":return c.isDigits(e)?(i=e,n=parseInt(i),i===String(n)?n:i):c.isNumeric(e)?parseFloat(e):this.PATTERN_THOUSAND_NUMERIC_SCALAR.test(e)?parseFloat(e.replace(",","")):e;case"-":return c.isDigits(e.slice(1))?"0"===e.charAt(1)?-c.octDec(e.slice(1)):(i=e.slice(1),n=parseInt(i),i===String(n)?-n:-i):c.isNumeric(e)?parseFloat(e):this.PATTERN_THOUSAND_NUMERIC_SCALAR.test(e)?parseFloat(e.replace(",","")):e;default:return(n=c.stringToDate(e))?n:c.isNumeric(e)?parseFloat(e):this.PATTERN_THOUSAND_NUMERIC_SCALAR.test(e)?parseFloat(e.replace(",","")):e}}},e.exports=r},function(e,t){var i={}.hasOwnProperty,n=function(e){var t,n=o,a=e;for(t in a)i.call(a,t)&&(n[t]=a[t]);function r(){this.constructor=n}function o(e,t,n){this.message=e,this.parsedLine=t,this.snippet=n}return r.prototype=a.prototype,n.prototype=new r,n.__super__=a.prototype,o.prototype.toString=function(){return null!=this.parsedLine&&null!=this.snippet?"<ParseException> "+this.message+" (line "+this.parsedLine+": '"+this.snippet+"')":"<ParseException> "+this.message},o}(Error);e.exports=n},function(e,t){var i={}.hasOwnProperty,n=function(e){var t,n=o,a=e;for(t in a)i.call(a,t)&&(n[t]=a[t]);function r(){this.constructor=n}function o(e,t,n){this.message=e,this.parsedLine=t,this.snippet=n}return r.prototype=a.prototype,n.prototype=new r,n.__super__=a.prototype,o.prototype.toString=function(){return null!=this.parsedLine&&null!=this.snippet?"<ParseMore> "+this.message+" (line "+this.parsedLine+": '"+this.snippet+"')":"<ParseMore> "+this.message},o}(Error);e.exports=n},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var y=m(n(2)),a=m(n(4)),r=m(n(6)),o=m(n(7)),i=n(0),v=m(i),l=n(23),s=m(n(3)),_=m(n(13)),u=n(11),f=m(n(50)),d=m(n(62)),b=m(n(10)),c=m(n(44)),p=m(n(675)),h=m(n(400)),w=n(177);function m(e){return e&&e.__esModule?e:{default:e}}var M=d.default.Popup,g=f.default.Item,k=f.default.Group,n=u.func.noop,S=u.func.bindCtx,E=u.func.makeChain;x=v.default.Component,(0,o.default)(C,x),C.prototype.componentDidMount=function(){var e=this;setTimeout(function(){return e.syncWidth()},0),u.events.on(window,"resize",this.handleResize)},C.prototype.componentDidUpdate=function(e,t){e.label===this.props.label&&t.value===this.state.value||this.syncWidth()},C.prototype.componentWillUnmount=function(){u.events.off(window,"resize",this.handleResize),clearTimeout(this.resizeTimeout)},C.prototype.syncWidth=function(){var e=this,t=this.props,n=t.popupStyle,t=t.popupProps;n&&"width"in n||t&&t.style&&"width"in t.style||(n=u.dom.getStyle(this.selectDOM,"width"))&&this.width!==n&&(this.width=n,this.popupRef&&this.shouldAutoWidth()&&setTimeout(function(){e.popupRef&&u.dom.setStyle(e.popupRef,"width",e.width)},0))},C.prototype.handleResize=function(){var e=this;clearTimeout(this.resizeTimeout),this.state.visible&&(this.resizeTimeout=setTimeout(function(){e.syncWidth()},200))},C.prototype.setDataSource=function(e){var t=e.dataSource,e=e.children;return i.Children.count(e)?this.dataStore.updateByDS(e,!0):Array.isArray(t)?this.dataStore.updateByDS(t,!1):[]},C.prototype.setVisible=function(e,t){this.props.disabled&&e||this.state.visible===e||("visible"in this.props||this.setState({visible:e}),this.props.onVisibleChange(e,t))},C.prototype.setFirstHightLightKeyForMenu=function(e){var t=this.state.highlightKey;this.props.autoHighlightFirstItem&&(this.dataStore.getMenuDS().length&&this.dataStore.getEnableDS().length&&(!t||e)&&(t=""+this.dataStore.getEnableDS()[0].value,this.setState({highlightKey:t}),this.props.onToggleHighlightItem(t,"autoFirstItem")),e&&!this.dataStore.getEnableDS().length&&(this.setState({highlightKey:null}),this.props.onToggleHighlightItem(null,"highlightKeyToNull")))},C.prototype.handleChange=function(e){var t;"value"in this.props||this.setState({value:e});for(var n=arguments.length,a=Array(1<n?n-1:0),r=1;r<n;r++)a[r-1]=arguments[r];(t=this.props).onChange.apply(t,[e].concat(a))},C.prototype.handleMenuBodyClick=function(e){this.props.popupAutoFocus||this.focusInput(e)},C.prototype.toggleHighlightItem=function(e){if(this.state.visible){var t=this.dataStore.getEnableDS().length;if(!t)return!1;var n=this.state.highlightKey,a=-1,e=(null!==n&&this.dataStore.getEnableDS().some(function(e,t){return-1<(a=""+e.value===n?t:a)}),t<=(a=(a+=e)<0?t-1:a)&&(a=0),this.dataStore.getEnableDS()[a]),n=e?""+e.value:null;return this.setState({highlightKey:n,srReader:e.label}),this.scrollMenuIntoView(),e}this.setVisible(!0,"enter")},C.prototype.scrollMenuIntoView=function(){var t=this,n=this.props.prefix;clearTimeout(this.highlightTimer),this.highlightTimer=setTimeout(function(){try{var e=(0,l.findDOMNode)(t.menuRef).querySelector("."+n+"select-menu-item."+n+"focused");e&&e.scrollIntoViewIfNeeded&&e.scrollIntoViewIfNeeded()}catch(e){}})},C.prototype.renderMenuHeader=function(){var e=this.props.menuProps;return e&&"header"in e?e.header:null},C.prototype.handleSelect=function(){},C.prototype.renderMenu=function(){var n=this,e=this.props,t=e.prefix,a=e.mode,r=e.locale,o=e.notFoundContent,i=e.useVirtual,e=e.menuProps,l=this.state,s=l.dataSource,l=l.highlightKey,u=this.state.value,d=void 0,d=(0,w.isNull)(u)||0===u.length||this.isAutoComplete?[]:(0,w.isSingle)(a)?[(0,w.valueToSelectKey)(u)]:[].concat(u).map(function(e){return(0,w.valueToSelectKey)(e)}),u=this.renderMenuItem(s),s=(0,_.default)(((s={})[t+"select-menu"]=!0,s[t+"select-menu-empty"]=!u||!u.length,s)),c=(u&&u.length||(u=v.default.createElement("span",{className:t+"select-menu-empty-content"},o||r.notFoundContent)),(0,y.default)({},e,{children:u,role:"listbox",selectedKeys:d,focusedKey:l,focusable:!1,selectMode:(0,w.isSingle)(a)?"single":"multiple",onSelect:this.handleMenuSelect,onItemClick:this.handleItemClick,header:this.renderMenuHeader(),onClick:this.handleMenuBodyClick,onMouseDown:this.handleMouseDown,className:s})),o=this.shouldAutoWidth()?{width:"100%"}:{minWidth:this.width};return i&&10<u.length?v.default.createElement("div",{className:t+"select-menu-wrapper",style:(0,y.default)({position:"relative"},o)},v.default.createElement(h.default,{itemsRenderer:function(e,t){return v.default.createElement(f.default,(0,y.default)({ref:function(e){t(e),n.menuRef=e},flatenContent:!0},c),e)}},u)):v.default.createElement(f.default,(0,y.default)({},c,{style:o}))},C.prototype.renderMenuItem=function(e){var n=this,t=this.props,a=t.prefix,r=t.itemRender,o=t.showDataSourceChildren,i=void 0,i=this.isAutoComplete?this.state.value:this.state.searchValue;return e.map(function(e,t){return e?Array.isArray(e.children)&&o?v.default.createElement(k,{key:t,label:e.label},n.renderMenuItem(e.children)):(t={role:"option",key:e.value,className:a+"select-menu-item",disabled:e.disabled},"title"in e&&(t.title=e.title),v.default.createElement(g,t,r(e,i))):null})},C.prototype.focusInput=function(){this.inputRef.focus()},C.prototype.focus=function(){var e;(e=this.inputRef).focus.apply(e,arguments)},C.prototype.beforeOpen=function(){"single"===this.props.mode&&this.setFirstHightLightKeyForMenu(),this.syncWidth()},C.prototype.beforeClose=function(){},C.prototype.afterClose=function(){},C.prototype.shouldAutoWidth=function(){return!this.props.popupComponent&&this.props.autoWidth},C.prototype.render=function(e){var t,n=e.prefix,a=e.mode,r=e.popupProps,o=e.popupContainer,i=e.popupClassName,l=e.popupStyle,s=e.popupContent,u=e.canCloseByTrigger,d=e.followTrigger,c=e.cache,f=e.popupComponent,p=e.isPreview,h=e.renderPreview,m=e.style,e=e.className,g=(0,_.default)(((g={})[n+"select-auto-complete-menu"]=!s&&this.isAutoComplete,g[n+"select-"+a+"-menu"]=!s&&!!a,g),i||r.className);if(p)return this.isAutoComplete?v.default.createElement(b.default,{style:m,className:e,isPreview:p,renderPreview:h,value:this.state.value}):(i=this.state.value,t=this.state.value,this.useDetailValue()||(t=(i===this.valueDataSource.value?this.valueDataSource:(0,w.getValueDataSource)(i,this.valueDataSource.mapValueDS,this.dataStore.getMapDS())).valueDS),"function"==typeof h?(i=(0,_.default)(((i={})[n+"form-preview"]=!0,i[e]=!!e,i)),v.default.createElement("div",{style:m,className:i},h(t,this.props))):(i=this.props.fillProps,"single"===a?v.default.createElement(b.default,{style:m,className:e,isPreview:p,value:t?i?t[i]:t.label:""}):v.default.createElement(b.default,{style:m,className:e,isPreview:p,value:(t||[]).map(function(e){return e.label}).join(", ")})));h=(0,y.default)({triggerType:"click",autoFocus:!!this.props.popupAutoFocus,cache:c},r,{beforeOpen:E(this.beforeOpen,r.beforeOpen),beforeClose:E(this.beforeClose,r.beforeClose),afterClose:E(this.afterClose,r.afterClose),canCloseByTrigger:u,followTrigger:d,visible:this.state.visible,onVisibleChange:this.handleVisibleChange,shouldUpdatePosition:!0,container:o||r.container,className:g,style:l||r.style});return r.v2&&delete h.shouldUpdatePosition,v.default.createElement(f||M,(0,y.default)({},h,{trigger:this.renderSelect()}),s?v.default.createElement("div",{className:n+"select-popup-wrap",style:this.shouldAutoWidth()?{width:this.width}:{},ref:this.savePopupRef},s):v.default.createElement("div",{className:n+"select-spacing-tb",style:this.shouldAutoWidth()?{width:this.width}:{},ref:this.savePopupRef},this.renderMenu()))},o=d=C,d.propTypes={prefix:s.default.string,size:s.default.oneOf(["small","medium","large"]),value:s.default.any,defaultValue:s.default.any,placeholder:s.default.string,autoWidth:s.default.bool,label:s.default.node,hasClear:s.default.bool,state:s.default.oneOf(["error","loading","success","warning"]),readOnly:s.default.bool,disabled:s.default.bool,visible:s.default.bool,defaultVisible:s.default.bool,onVisibleChange:s.default.func,popupContainer:s.default.any,popupClassName:s.default.any,popupStyle:s.default.object,popupProps:s.default.object,followTrigger:s.default.bool,popupContent:s.default.node,menuProps:s.default.object,filterLocal:s.default.bool,filter:s.default.func,defaultHighlightKey:s.default.string,highlightKey:s.default.string,onToggleHighlightItem:s.default.func,autoHighlightFirstItem:s.default.bool,useVirtual:s.default.bool,className:s.default.any,children:s.default.any,dataSource:s.default.array,itemRender:s.default.func,mode:s.default.string,notFoundContent:s.default.node,locale:s.default.object,rtl:s.default.bool,popupComponent:s.default.any,isPreview:s.default.bool,renderPreview:s.default.func,showDataSourceChildren:s.default.bool},d.defaultProps={prefix:"next-",size:"medium",autoWidth:!0,onChange:n,onVisibleChange:n,onToggleHighlightItem:n,popupProps:{},filterLocal:!0,filter:w.filter,itemRender:function(e){return e.label||e.value},locale:c.default.Select,autoHighlightFirstItem:!0,showDataSourceChildren:!0,defaultHighlightKey:null};var x,s=o;function C(e){(0,a.default)(this,C);var t=(0,r.default)(this,x.call(this,e)),n=(t.handleMouseDown=function(e){t.props.popupAutoFocus||e.preventDefault()},t.saveSelectRef=function(e){t.selectDOM=(0,l.findDOMNode)(e)},t.saveInputRef=function(e){e&&e.getInstance()&&(t.inputRef=e.getInstance())},t.savePopupRef=function(e){t.popupRef=e},t.dataStore=new p.default({filter:e.filter,filterLocal:e.filterLocal,showDataSourceChildren:e.showDataSourceChildren}),e.mode,"value"in e?e.value:e.defaultValue);return"single"!==e.mode&&n&&!Array.isArray(n)&&(n=[n]),t.state={dataStore:t.dataStore,value:n,visible:"visible"in e?e.visible:e.defaultVisible,dataSource:t.setDataSource(t.props),width:100,highlightKey:"highlightKey"in e?e.highlightKey:"single"===e.mode?e.value||e.defaultHighlightKey||e.defaultValue:e.defaultHighlightKey,srReader:""},S(t,["handleMenuBodyClick","handleVisibleChange","focusInput","beforeOpen","beforeClose","afterClose","handleResize"]),t}s.displayName="Base",t.default=s,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var a=r(n(8)),n=r(n(676));function r(e){return e&&e.__esModule?e:{default:e}}t.default=a.default.config(n.default),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var a=o(n(2));t.getDisabledCompatibleTrigger=function(e){{var t,n;if("Config(Button)"===e.type.displayName&&e.props.disabled)return t=e.props.style&&e.props.style.display?e.props.style.display:"inline-block",n=r.default.cloneElement(e,{style:(0,a.default)({},e.props.style,{pointerEvents:"none"})}),r.default.createElement("span",{style:{display:t,cursor:"not-allowed"}},n)}return e};var r=o(n(0));function o(e){return e&&e.__esModule?e:{default:e}}},function(e,t,n){"use strict";t.__esModule=!0,t.triggerEvents=void 0;var a=o(n(38));t.getOffsetWH=function(e,t){var n="width";"left"!==t&&"right"!==t||(n="height");return e?e.getBoundingClientRect()[n]:0},t.getOffsetLT=function(e,t){var n="left";"left"!==t&&"right"!==t||(n="top");return e.getBoundingClientRect()[n]},t.isTransformSupported=function(e){return"transform"in e||"webkitTransform"in e||"MozTransform"in e},t.toArray=function(e){var n=[];return r.default.Children.forEach(e,function(e,t){r.default.isValidElement(e)&&n.push(r.default.cloneElement(e,{key:e.key||t,title:e.props.title||e.props.tab}))}),n},t.tabsArrayShallowEqual=function(e,t){if(e!==t){if(!e||!t||(void 0===e?"undefined":(0,a.default)(e))+(void 0===t?"undefined":(0,a.default)(t))!=="objectobject"||e.length!==t.length)return!1;for(var n=0;n<e.length;n++)if(e[n].key!==t[n].key||e[n].props.title!==t[n].props.title)return!1}return!0};var r=o(n(0));function o(e){return e&&e.__esModule?e:{default:e}}t.triggerEvents={CLICK:"click",HOVER:"hover"}},function(e,t,n){"use strict";n(43),n(703)},function(e,t,n){},function(e,t,n){"use strict";t.__esModule=!0,t.getTrackLeft=t.getTrackAnimateCSS=t.getTrackCSS=void 0;var o=a(n(2)),i=a(n(23));function a(e){return e&&e.__esModule?e:{default:e}}function l(n,e){e.reduce(function(e,t){return e&&n.hasOwnProperty(t)},!0)||console.error("Keys Missing",n)}var r=t.getTrackCSS=function(e){l(e,["left","variableWidth","slideCount","slidesToShow","slideWidth"]);var t=void 0,n=void 0,a=e.slideCount+2*e.slidesToShow,a=(e.vertical?n=a*e.slideHeight:t=!e.variableWidth&&e.centerMode?(e.slideCount+2*(e.slidesToShow+1))*e.slideWidth:(e.slideCount+2*e.slidesToShow)*e.slideWidth,{opacity:1}),r={WebkitTransform:e.vertical?"translate3d(0px, "+e.left+"px, 0px)":"translate3d("+e.left+"px, 0px, 0px)",transform:e.vertical?"translate3d(0px, "+e.left+"px, 0px)":"translate3d("+e.left+"px, 0px, 0px)",transition:"",WebkitTransition:"",msTransform:e.vertical?"translateY("+e.left+"px)":"translateX("+e.left+"px)"};return t&&(a=(0,o.default)({},a,{width:t})),n&&(a=(0,o.default)({},a,{height:n})),a="fade"!==e.animation?(0,o.default)({},a,r):a};t.getTrackAnimateCSS=function(e){l(e,["left","variableWidth","slideCount","slidesToShow","slideWidth","speed","cssEase"]);var t=r(e);return t.WebkitTransition="-webkit-transform "+e.speed+"ms "+e.cssEase,t.transition="transform "+e.speed+"ms "+e.cssEase,t},t.getTrackLeft=function(e){l(e,["slideIndex","trackRef","infinite","centerMode","slideCount","slidesToShow","slidesToScroll","slideWidth","listWidth","variableWidth","slideHeight"]);var t,n=0,a=void 0,r=void 0,o=0;return"fade"===e.animation?0:(e.infinite?(e.slideCount>e.slidesToShow&&(n=e.slideWidth*e.slidesToShow*-1,o=e.slideHeight*e.slidesToShow*-1),e.slideCount%e.slidesToScroll!=0&&(t=e.slideIndex+e.slidesToScroll>e.slideCount&&e.slideCount>e.slidesToShow,(t=e.rtl?(e.slideIndex>=e.slideCount?e.slideCount-e.slideIndex:e.slideIndex)+e.slidesToScroll>e.slideCount&&e.slideCount>e.slidesToShow:t)&&(o=e.slideIndex>e.slideCount?(n=(e.slidesToShow-(e.slideIndex-e.slideCount))*e.slideWidth*-1,(e.slidesToShow-(e.slideIndex-e.slideCount))*e.slideHeight*-1):(n=e.slideCount%e.slidesToScroll*e.slideWidth*-1,e.slideCount%e.slidesToScroll*e.slideHeight*-1)))):e.slideCount%e.slidesToScroll!=0&&e.slideIndex+e.slidesToScroll>e.slideCount&&e.slideCount>e.slidesToShow&&(n=(e.slidesToShow-e.slideCount%e.slidesToScroll)*e.slideWidth),e.centerMode&&(e.infinite?n+=e.slideWidth*Math.floor(e.slidesToShow/2):n=e.slideWidth*Math.floor(e.slidesToShow/2)),a=e.vertical?e.slideIndex*e.slideHeight*-1+o:e.slideIndex*e.slideWidth*-1+n,!0===e.variableWidth&&(t=void 0,a=(r=e.slideCount<=e.slidesToShow||!1===e.infinite?i.default.findDOMNode(e.trackRef).childNodes[e.slideIndex]:(t=e.slideIndex+e.slidesToShow,i.default.findDOMNode(e.trackRef).childNodes[t]))?-1*r.offsetLeft:0,!0===e.centerMode&&(r=!1===e.infinite?i.default.findDOMNode(e.trackRef).children[e.slideIndex]:i.default.findDOMNode(e.trackRef).children[e.slideIndex+e.slidesToShow+1])&&(a=-1*r.offsetLeft+(e.listWidth-r.offsetWidth)/2)),a)}},function(e,t,n){"use strict";t.__esModule=!0;var p=u(n(2)),h=u(n(12)),o=u(n(4)),i=u(n(6)),a=u(n(7)),m=u(n(0)),r=u(n(3)),g=u(n(13)),l=u(n(8)),y=u(n(24)),s=n(11);function u(e){return e&&e.__esModule?e:{default:e}}d=m.default.Component,(0,a.default)(c,d),c.prototype.render=function(){var e=this.props,t=e.title,n=e.children,a=e.className,r=e.isExpanded,o=e.disabled,i=e.style,l=e.prefix,s=e.onClick,u=e.id,e=(0,h.default)(e,["title","children","className","isExpanded","disabled","style","prefix","onClick","id"]),a=(0,g.default)(((d={})[l+"collapse-panel"]=!0,d[l+"collapse-panel-hidden"]=!r,d[l+"collapse-panel-expanded"]=r,d[l+"collapse-panel-disabled"]=o,d[a]=a,d)),d=(0,g.default)(((d={})[l+"collapse-panel-icon"]=!0,d[l+"collapse-panel-icon-expanded"]=r,d)),c=u?u+"-heading":void 0,f=u?u+"-region":void 0;return m.default.createElement("div",(0,p.default)({className:a,style:i,id:u},e),m.default.createElement("div",{id:c,className:l+"collapse-panel-title",onClick:s,onKeyDown:this.onKeyDown,tabIndex:"0","aria-disabled":o,"aria-expanded":r,"aria-controls":f,role:"button"},m.default.createElement(y.default,{type:"arrow-right",className:d,"aria-hidden":"true"}),t),m.default.createElement("div",{className:l+"collapse-panel-content",role:"region",id:f},n))},a=n=c,n.propTypes={prefix:r.default.string,style:r.default.object,children:r.default.any,isExpanded:r.default.bool,disabled:r.default.bool,title:r.default.node,className:r.default.string,onClick:r.default.func,id:r.default.string},n.defaultProps={prefix:"next-",isExpanded:!1,onClick:s.func.noop},n.isNextPanel=!0;var d,r=a;function c(){var e,n;(0,o.default)(this,c);for(var t=arguments.length,a=Array(t),r=0;r<t;r++)a[r]=arguments[r];return(e=n=(0,i.default)(this,d.call.apply(d,[this].concat(a)))).onKeyDown=function(e){var t;e.keyCode===s.KEYCODE.SPACE&&(t=n.props.onClick,e.preventDefault(),t&&t(e))},(0,i.default)(n,e)}r.displayName="Panel",t.default=l.default.config(r),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var n=n(12),i=(n=n)&&n.__esModule?n:{default:n};t.default=function(e,t){var n=e.listType,a=e.defaultFileList,r=e.fileList,o=(0,i.default)(e,["listType","defaultFileList","fileList"]);return"text-image"===n?(t("listType=text-image","listType=image","Upload"),o.listType="image"):"picture-card"===n?(t("listType=picture-card","listType=card","Upload"),o.listType="card"):o.listType=n,"defaultFileList"in e&&(t("defaultFileList","defaultValue","Upload"),o.defaultValue=a),"fileList"in e&&(t("fileList","value","Upload"),o.value=r),o},e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var o=r(n(4)),i=r(n(6)),a=r(n(7)),n=n(0);function r(e){return e&&e.__esModule?e:{default:e}}l=n.Component,(0,a.default)(s,l),s.prototype.abort=function(e){this.uploaderRef.abort(e)},s.prototype.startUpload=function(){this.uploaderRef.startUpload()},s.prototype.isUploading=function(){return this.uploaderRef.isUploading()};var l,n=s;function s(){var e,t;(0,o.default)(this,s);for(var n=arguments.length,a=Array(n),r=0;r<n;r++)a[r]=arguments[r];return(e=t=(0,i.default)(this,l.call.apply(l,[this].concat(a)))).saveUploaderRef=function(e){e&&"function"==typeof e.getInstance?t.uploaderRef=e.getInstance():t.uploaderRef=e},(0,i.default)(t,e)}n.displayName="Base",t.default=n,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var m=d(n(2)),g=d(n(12)),o=d(n(4)),i=d(n(6)),a=d(n(7)),r=n(0),y=d(r),l=d(n(3)),s=n(11),u=d(n(410)),v=d(n(181));function d(e){return e&&e.__esModule?e:{default:e}}c=r.Component,(0,a.default)(f,c),f.prototype.componentDidMount=function(){var e=this.props,e=this.getUploadOptions(e);this.uploader=new u.default(e)},f.prototype.componentDidUpdate=function(e){for(var t=this.getUploadOptions(e),n=this.getUploadOptions(this.props),a=Object.keys(n),r=0;r<a.length;r++){var o=a[r];if(n[o]!==t[o])return void this.uploader.setOptions(n)}},f.prototype.componentWillUnmount=function(){this.abort()},f.prototype.abort=function(e){this.uploader.abort(e)},f.prototype.startUpload=function(e){this.uploader.startUpload(e)},f.prototype.render=function(){var e=this.props,t=e.accept,n=e.multiple,a=e.webkitdirectory,r=e.children,o=e.id,i=e.disabled,l=e.dragable,s=e.style,u=e.className,d=e.onSelect,c=e.onDragOver,f=e.onDragLeave,p=e.onDrop,h=e.name,e=(0,g.default)(e,["accept","multiple","webkitdirectory","children","id","disabled","dragable","style","className","onSelect","onDragOver","onDragLeave","onDrop","name"]);return y.default.createElement(v.default,(0,m.default)({},e,{id:o,accept:t,multiple:n,webkitdirectory:a,dragable:l,disabled:i,className:u,style:s,onSelect:d,onDragOver:c,onDragLeave:f,onDrop:p,name:h}),r)},r=n=f,n.propTypes=(0,m.default)({},v.default.propTypes,{action:l.default.string,accept:l.default.string,data:l.default.oneOfType([l.default.object,l.default.func]),headers:l.default.object,withCredentials:l.default.bool,beforeUpload:l.default.func,onProgress:l.default.func,onSuccess:l.default.func,onError:l.default.func,children:l.default.node,timeout:l.default.number,method:l.default.oneOf(["post","put"]),request:l.default.func}),n.defaultProps=(0,m.default)({},v.default.defaultProps,{name:"file",multiple:!1,withCredentials:!0,beforeUpload:s.func.noop,onSelect:s.func.noop,onDragOver:s.func.noop,onDragLeave:s.func.noop,onDrop:s.func.noop,onProgress:s.func.noop,onSuccess:s.func.noop,onError:s.func.noop,onAbort:s.func.noop,method:"post"});var c,a=r;function f(){var e,t;(0,o.default)(this,f);for(var n=arguments.length,a=Array(n),r=0;r<n;r++)a[r]=arguments[r];return(e=t=(0,i.default)(this,c.call.apply(c,[this].concat(a)))).getUploadOptions=function(e){return{action:e.action,name:e.name,timeout:e.timeout,method:e.method,beforeUpload:e.beforeUpload,onProgress:e.onProgress,onSuccess:e.onSuccess,onError:e.onError,withCredentials:e.withCredentials,headers:e.headers,data:e.data,request:e.request}},(0,i.default)(t,e)}a.displayName="Html5Uploader",t.default=a,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var h=r(n(2)),a=r(n(4)),d=n(11),c=n(99),m=r(n(729));function r(e){return e&&e.__esModule?e:{default:e}}var o=d.func.noop;function i(e){(0,a.default)(this,i),this.options=(0,h.default)({beforeUpload:o,onProgress:o,onSuccess:o,onError:o,data:{},name:"file",method:"post"},e),this.reqs={}}i.prototype.setOptions=function(e){(0,h.default)(this.options,e)},i.prototype.startUpload=function(e){var t=this;(e.length?Array.prototype.slice.call(e):[e]).forEach(function(e){e.uid=e.uid||(0,c.uid)(),t.upload(e)})},i.prototype.abort=function(e){var t,n=this.reqs;e?((t=e)&&e.uid&&(t=e.uid),n[t]&&(n[t].abort(),delete n[t])):Object.keys(n).forEach(function(e){n[e]&&n[e].abort&&n[e].abort(),delete n[e]})},i.prototype.upload=function(n){var a=this,e=this.options,t=e.beforeUpload,r=e.action,o=e.name,i=e.headers,l=e.timeout,s=e.withCredentials,u=e.method,e=e.data,t=t(n,{action:r,name:o,headers:i,timeout:l,withCredentials:s,method:u,data:e});d.func.promiseCall(t,function(e){var t;if(!1===e)return(t=new Error(c.errorCode.BEFOREUPLOAD_REJECT)).code=c.errorCode.BEFOREUPLOAD_REJECT,a.options.onError(t,null,n);a.post(n,d.obj.isPlainObject(e)?e:void 0)},function(e){var t=void 0;e?t=e:(t=new Error(c.errorCode.BEFOREUPLOAD_REJECT)).code=c.errorCode.BEFOREUPLOAD_REJECT,a.options.onError(t,null,n)})},i.prototype.post=function(n){var a=this,e=(0,h.default)({},this.options,1<arguments.length&&void 0!==arguments[1]?arguments[1]:{}),t=e.action,r=e.name,o=e.headers,i=e.timeout,l=e.withCredentials,s=e.onProgress,u=e.onSuccess,d=e.onError,c=e.method,f=e.data,p=("function"==typeof f&&(f=f(n)),n.uid),e="function"==typeof e.request?e.request:m.default;this.reqs[p]=e({action:t,filename:r,file:n,data:f,timeout:i,headers:o,withCredentials:l,method:c,onProgress:function(e){s(e,n)},onSuccess:function(e){delete a.reqs[p],u(e,n)},onError:function(e,t){delete a.reqs[p],d(e,t,n)}})},t.default=i,e.exports=t.default},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.routerMiddleware=t.routerActions=t.goForward=t.goBack=t.go=t.replace=t.push=t.CALL_HISTORY_METHOD=t.routerReducer=t.LOCATION_CHANGE=t.syncHistoryWithStore=void 0;var a=n(187),r=(Object.defineProperty(t,"LOCATION_CHANGE",{enumerable:!0,get:function(){return a.LOCATION_CHANGE}}),Object.defineProperty(t,"routerReducer",{enumerable:!0,get:function(){return a.routerReducer}}),n(188));Object.defineProperty(t,"CALL_HISTORY_METHOD",{enumerable:!0,get:function(){return r.CALL_HISTORY_METHOD}}),Object.defineProperty(t,"push",{enumerable:!0,get:function(){return r.push}}),Object.defineProperty(t,"replace",{enumerable:!0,get:function(){return r.replace}}),Object.defineProperty(t,"go",{enumerable:!0,get:function(){return r.go}}),Object.defineProperty(t,"goBack",{enumerable:!0,get:function(){return r.goBack}}),Object.defineProperty(t,"goForward",{enumerable:!0,get:function(){return r.goForward}}),Object.defineProperty(t,"routerActions",{enumerable:!0,get:function(){return r.routerActions}});var o=i(n(454)),n=i(n(455));function i(e){return e&&e.__esModule?e:{default:e}}t.syncHistoryWithStore=o.default,t.routerMiddleware=n.default},function(e,t,n){"use strict";e.exports=n(457)},function(e,t,n){var a=n(532);e.exports=function(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,a(e,t)},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,t,n){"use strict";t.__esModule=!0,t.default={momentLocale:"en",Timeline:{expand:"Expand",fold:"Fold"},Balloon:{close:"Close"},Card:{expand:"Expand",fold:"Fold"},Calendar:{today:"Today",now:"Now",ok:"OK",clear:"Clear",month:"Month",year:"Year",prevYear:"Previous Year",nextYear:"Next Year",prevMonth:"Previous Month",nextMonth:"Next Month",prevDecade:"Previous Decade",nextDecade:"Next Decade",yearSelectAriaLabel:"Select Year",monthSelectAriaLabel:"Select Month"},DatePicker:{placeholder:"Select Date",datetimePlaceholder:"Select Date And Time",monthPlaceholder:"Select Month",yearPlaceholder:"Select Year",weekPlaceholder:"Select Week",now:"Now",selectTime:"Select Time",selectDate:"Select Date",ok:"OK",clear:"Clear",startPlaceholder:"Start Date",endPlaceholder:"End Date",hour:"H",minute:"M",second:"S"},Dialog:{close:"Close",ok:"OK",cancel:"Cancel"},Drawer:{close:"Close"},Message:{closeAriaLabel:"Close"},Pagination:{prev:"Previous",next:"Next",goTo:"Go to",page:"Page",go:"View",total:"Page {current}, {total} pages",labelPrev:"Previous page, current page {current}",labelNext:"Next page, current page {current}",inputAriaLabel:"Please enter what page to skip to",selectAriaLabel:"Please select how many items are displayed on each page",pageSize:"Items per page:"},Input:{clear:"Clear"},List:{empty:"No Data"},Select:{selectPlaceholder:"Please Select",autoCompletePlaceholder:"Please Input",notFoundContent:"No Options",maxTagPlaceholder:"Selected {selected}/{total} Total",selectAll:"Select All"},TreeSelect:{maxTagPlaceholder:"Selected {selected}/{total} Total",shortMaxTagPlaceholder:"Selected {selected}"},Table:{empty:"No Data",ok:"OK",reset:"Reset",asc:"Ascending Order",desc:"Descending Order",expanded:"Expanded",folded:"Folded",filter:"Filter",selectAll:"Select All"},TimePicker:{placeholder:"Select Time",clear:"Clear",hour:"H",minute:"M",second:"S",ok:"OK"},Transfer:{items:"items",item:"item",moveAll:"Move All",searchPlaceholder:"Please Input",moveToLeft:"Uncheck Selected Elements",moveToRight:"Submit Selected Elements"},Upload:{card:{cancel:"Cancel",addPhoto:"Add Picture",download:"Download",delete:"Delete"},drag:{text:"Click or Drag the file to this area to upload",hint:"Support docx, xls, PDF, rar, zip, PNG, JPG and other files upload"},upload:{delete:"Delete"}},Search:{buttonText:"Search"},Tag:{delete:"Delete"},Rating:{description:"Rating Options"},Switch:{on:"on",off:"off"},Tab:{closeAriaLabel:"close"},Form:{Validate:{default:"Validation error on field %s",required:"%s is required",format:{number:"%s is not a number",email:"%s is not a valid email",url:"%s is not a valid url",tel:"%s is not a valid phone number"},number:{length:"%s must be exactly %s characters",min:"%s cannot be less than %s",max:"%s cannot be greater than %s",minLength:"%s must be at least %s characters",maxLength:"%s cannot be longer than %s characters"},string:{length:"%s must be exactly %s characters",min:"%s cannot be less than %s",max:"%s cannot be greater than %s",minLength:"%s must be at least %s characters",maxLength:"%s cannot be longer than %s characters"},array:{length:"%s must be exactly %s in length",minLength:"%s cannot be less than %s in length",maxLength:"%s cannot be greater than %s in length"},pattern:"%s value %s does not match pattern %s"}}},e.exports=t.default},function(e,t,n){"use strict";var a=n(371),r=n(610),n=n(168);e.exports={formats:n,parse:r,stringify:a}},function(e,a,r){"use strict";!function(e){var i=r(0),t=r.n(i),l=r(58),n=r(3),s=r.n(n),u=1073741823,d="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==e?e:{};n=t.a.createContext||function(a,o){var e,r="__create-react-context-"+(d[t="__global_unique_id__"]=(d[t]||0)+1)+"__",t=function(t){function e(){var n,a,e=t.apply(this,arguments)||this;return e.emitter=(n=e.props.value,a=[],{on:function(e){a.push(e)},off:function(t){a=a.filter(function(e){return e!==t})},get:function(){return n},set:function(e,t){n=e,a.forEach(function(e){return e(n,t)})}}),e}Object(l.a)(e,t);var n=e.prototype;return n.getChildContext=function(){var e={};return e[r]=this.emitter,e},n.componentWillReceiveProps=function(e){var t,n,a,r;this.props.value!==e.value&&(t=this.props.value,n=e.value,((a=t)===(r=n)?0===a&&1/a!=1/r:a==a||r==r)&&(a="function"==typeof o?o(t,n):u,0!==(a|=0)&&this.emitter.set(e.value,a)))},n.render=function(){return this.props.children},e}(i.Component),n=(t.childContextTypes=((n={})[r]=s.a.object.isRequired,n),function(e){function t(){var n=e.apply(this,arguments)||this;return n.state={value:n.getValue()},n.onUpdate=function(e,t){0!=((0|n.observedBits)&t)&&n.setState({value:n.getValue()})},n}Object(l.a)(t,e);var n=t.prototype;return n.componentWillReceiveProps=function(e){e=e.observedBits;this.observedBits=null==e?u:e},n.componentDidMount=function(){this.context[r]&&this.context[r].on(this.onUpdate);var e=this.props.observedBits;this.observedBits=null==e?u:e},n.componentWillUnmount=function(){this.context[r]&&this.context[r].off(this.onUpdate)},n.getValue=function(){return this.context[r]?this.context[r].get():a},n.render=function(){return e=this.props.children,(Array.isArray(e)?e[0]:e)(this.state.value);var e},t}(i.Component));return n.contextTypes=((e={})[r]=s.a.object,e),{Provider:t,Consumer:n}};a.a=n}.call(this,r(351))},function(e,t,n){var i,a,l;function r(){}a=n(664),i=n(669),l=n(112),r.parse=function(e,t,n){return null==t&&(t=!1),null==n&&(n=null),(new a).parse(e,t,n)},r.parseFile=function(e,n,a,r){var o;return null==a&&(a=!1),null==r&&(r=null),null!=(n=null==n?null:n)?l.getStringFromFile(e,(o=this,function(e){var t=null;null!=e&&(t=o.parse(e,a,r)),n(t)})):null!=(e=l.getStringFromFile(e))?this.parse(e,a,r):null},r.dump=function(e,t,n,a,r){var o;return null==t&&(t=2),null==n&&(n=4),null==a&&(a=!1),null==r&&(r=null),(o=new i).indentation=n,o.dump(e,t,0,a,r)},r.stringify=function(e,t,n,a,r){return this.dump(e,t,n,a,r)},r.load=function(e,t,n,a){return this.parseFile(e,t,n,a)},n=r,"undefined"!=typeof window&&null!==window&&(window.YAML=n),"undefined"!=typeof window&&null!==window||(this.YAML=n),e.exports=n},function(e,t,n){"use strict";t.__esModule=!0;var n=n(711),n=(n=n)&&n.__esModule?n:{default:n};t.default=n.default,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var r=i(n(2)),o=i(n(12)),a=i(n(8)),n=i(n(719));function i(e){return e&&e.__esModule?e:{default:e}}t.default=a.default.config(n.default,{exportNames:["resize"],transform:function(t,n){var e,a;return"fade"in t&&(n("fade","animation","Slider"),a=(e=t).fade,e=(0,o.default)(e,["fade"]),t=a?(0,r.default)({animation:"fade"},e):e),"arrowPos"in t&&("inline"===t.arrowPos?(n("arrowPos=inline","arrowPosition=inner","Slider"),t.arrowPos="inner"):n("arrowPos","arrowPosition","Slider"),e=(a=t).arrowPos,a=(0,o.default)(a,["arrowPos"]),t=(0,r.default)({arrowPosition:e},a)),["arrowDirection","dotsDirection","slideDirection"].forEach(function(e){"horizontal"===t[e]?(n(e+"=horizontal",e+"=hoz","Slider"),t[e]="hoz"):"vertical"===t[e]&&(n(e+"=vertical",e+"=ver","Slider"),t[e]="ver")}),"initialSlide"in t&&(n("initialSlide","defaultActiveIndex","Slider"),a=(e=t).initialSlide,e=(0,o.default)(e,["initialSlide"]),t=(0,r.default)({defaultActiveIndex:a},e)),"slickGoTo"in t&&(n("slickGoTo","activeIndex","Slider"),e=(a=t).slickGoTo,a=(0,o.default)(a,["slickGoTo"]),t=(0,r.default)({activeIndex:e},a)),"afterChange"in t&&(n("afterChange","onChange","Slider"),a=(e=t).afterChange,e=(0,o.default)(e,["afterChange"]),t=(0,r.default)({onChange:a},e)),"beforeChange"in t&&(n("beforeChange","onBeforeChange","Slider"),e=(a=t).beforeChange,a=(0,o.default)(a,["beforeChange"]),t=(0,r.default)({onBeforeChange:e},a)),t}}),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var c,a=b(n(2)),r=b(n(12)),f=b(n(4)),p=b(n(6)),o=b(n(7)),i=b(n(0)),l=b(n(8)),s=n(11),u=n(99),d=b(n(407)),h=b(n(180)),m=b(n(182)),g=b(n(735)),y=b(n(736)),v=b(n(181)),_=b(n(410));function b(e){return e&&e.__esModule?e:{default:e}}function w(e){(0,f.default)(this,w);var t=(0,p.default)(this,c.call(this,e)),e=(t.handleSelect=function(e){t.uploader.startUpload(e)},t.props),n=e.action,a=e.name,r=e.method,o=e.beforeUpload,i=e.onProgress,l=e.onError,s=e.withCredentials,u=e.headers,d=e.data,e=e.onSuccess;return t.uploader=new _.default({action:n,name:a,method:r,beforeUpload:o,onProgress:i,onError:l,withCredentials:s,headers:u,data:d,onSuccess:e}),t}h.default.Card=l.default.config(g.default,{componentName:"Upload"}),h.default.Dragger=l.default.config(y.default,{componentName:"Upload"}),h.default.Selecter=v.default,h.default.Uploader=_.default,h.default.ErrorCode=u.errorCode,h.default.ImageUpload=l.default.config(g.default,{componentName:"Upload",transform:function(e,t){t("Upload.ImageUpload","Upload.Card","Upload");t=(0,d.default)(e,function(){});return t.locale&&t.locale.image&&(t.locale.card=t.locale.image),t}}),h.default.DragUpload=l.default.config(y.default,{componentName:"Upload",transform:function(e,t){t("Upload.DragUpload","Upload.Dragger","Upload");t=(0,d.default)(e,function(){});return t.listType||(t.listType="card"),t}}),h.default.Core=(c=i.default.Component,(0,o.default)(w,c),w.prototype.abort=function(){this.uploader.abort()},w.prototype.render=function(){s.log.deprecated("Upload.Core","Upload.Selecter and Upload.Uploader","Upload");var e=this.props,e=(e.action,e.name,e.method,e.beforeUpload,e.onProgress,e.onError,e.withCredentials,e.headers,e.data,e.onSuccess,(0,r.default)(e,["action","name","method","beforeUpload","onProgress","onError","withCredentials","headers","data","onSuccess"]));return i.default.createElement(v.default,(0,a.default)({},(0,d.default)(e,function(){}),{onSelect:this.handleSelect}))},w),h.default.List=m.default,h.default.CropUpload=function(){return s.log.deprecated("Upload.CropUpload","@alife/bc-next-crop-upload","Upload"),null},t.default=l.default.config(h.default,{transform:d.default}),e.exports=t.default},function(e,t,n){"use strict";var a=n(14),r=n(15),o=n(17),i=n(16),l=n(21),s=n(0),u=n.n(s),s=n(37),d=n(40),s=Object(s.b)(function(e){return Object(l.a)({},e.base)})(n=function(e){Object(o.a)(n,e);var t=Object(i.a)(n);function n(){return Object(a.a)(this,n),t.apply(this,arguments)}return Object(r.a)(n,[{key:"render",value:function(){var e=this.props.functionMode;return u.a.createElement(u.a.Fragment,null,""!==e&&u.a.createElement(d.a,{to:"/".concat("naming"===e?"serviceManagement":"configurationManagement")}))}}]),n}(u.a.Component))||n;t.a=s},function(e,t,n){"use strict";var a=n(104),r=n(101),o=n(118),i=n(45),l=n(82),n=n(116);t.a={locale:a.b,base:r.a,subscribers:o.a,authority:i.d,namespace:l.a,configuration:n.a}},function(e,t,n){"use strict";function a(r){return function(e){var n=e.dispatch,a=e.getState;return function(t){return function(e){return"function"==typeof e?e(n,a,r):t(e)}}}}var r=a();r.withExtraArgument=a,t.a=r},function(I,e,t){"use strict";t(64);var n=t(46),r=t.n(n),n=(t(87),t(53)),o=t.n(n),n=(t(39),t(5)),i=t.n(n),n=(t(699),t(420)),l=t.n(n),n=(t(32),t(18)),d=t.n(n),n=(t(59),t(29)),c=t.n(n),n=(t(36),t(10)),f=t.n(n),n=(t(51),t(25)),s=t.n(n),n=(t(63),t(20)),p=t.n(n),n=(t(158),t(113)),u=t.n(n),n=(t(80),t(50)),h=t.n(n),n=(t(43),t(24)),m=t.n(n),n=(t(109),t(71)),g=t.n(n),n=(t(35),t(19)),y=t.n(n),n=(t(49),t(27)),v=t.n(n),_=t(14),b=t(15),w=t(22),M=t(17),k=t(16),n=(t(26),t(8)),n=t.n(n),a=(t(403),t(117)),a=t.n(a),S=(t(704),t(185)),E=t.n(S),S=t(0),x=t.n(S),S=(t(706),t(418)),C=t.n(S),L=t(1),T=(t(710),function(e){Object(M.a)(a,e);var n=Object(k.a)(a);function a(e){var t;return Object(_.a)(this,a),(t=n.call(this,e)).state={visible:!1,valueList:e.valueList||[],dataSourceList:e.dataSource||[],currentPage:1,total:0,pageSize:10,dataSource:{}},t}return Object(b.a)(a,[{key:"componentDidMount",value:function(){}},{key:"openDialog",value:function(e){var t=this;this.setState({visible:!0,dataSource:e,pageSize:e.pageSize},function(){t.getData(),t.transfer._instance.filterCheckedValue=function(e,t,n){return{left:e,right:t}}})}},{key:"closeDialog",value:function(){this.setState({visible:!1})}},{key:"getData",value:function(){var t=this,e=this.state.dataSource;Object(L.b)({url:"/diamond-ops/configList/serverId/".concat(e.serverId,"?dataId=").concat(e.dataId,"&group=").concat(e.group,"&appName=").concat(e.appName,"&config_tags=").concat(e.config_tags||"","&pageNo=").concat(this.state.currentPage,"&pageSize=").concat(e.pageSize),success:function(e){200===e.code&&t.setState({dataSourceList:e.data.map(function(e){return{label:e.dataId,value:e.dataId}})||[],total:e.total})}})}},{key:"changePage",value:function(e){var t=this;this.setState({currentPage:e},function(){t.getData()})}},{key:"onChange",value:function(e,t,n){this.setState({valueList:e})}},{key:"onSubmit",value:function(){this.props.onSubmit&&this.props.onSubmit(this.state.valueList)}},{key:"render",value:function(){var t=this;return x.a.createElement(y.a,{visible:this.state.visible,style:{width:"500px"},onCancel:this.closeDialog.bind(this),onClose:this.closeDialog.bind(this),onOk:this.onSubmit.bind(this),title:"鎵归噺鎿嶄綔"},x.a.createElement("div",null,x.a.createElement(C.a,{ref:function(e){return t.transfer=e},listStyle:{height:350},dataSource:this.state.dataSourceList||[],value:this.state.valueList,onChange:this.onChange.bind(this)}),x.a.createElement(r.a,{style:{marginTop:10},current:this.state.currentPage,total:this.state.total,pageSize:this.state.pageSize,onChange:this.changePage.bind(this),type:"simple"})))}}]),a}(x.a.Component)),R=t(48),S=(t(52),t(33)),A=t.n(S),S=(t(132),t(60)),D=t.n(S),O=(t(404),D.a.Item),H=(0,n.a.config)(((S=function(e){Object(M.a)(n,e);var t=Object(k.a)(n);function n(e){return Object(_.a)(this,n),(e=t.call(this,e)).state={dialogvisible:!1,loading:!1},e.defaultCode="",e.nodejsCode="TODO",e.cppCode="TODO",e.shellCode="TODO",e.pythonCode="TODO",e.csharpCode="TODO",e.record={},e.sprigboot_code='// Refer to document: https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-boot-example/nacos-spring-boot-config-example\npackage com.alibaba.nacos.example.spring.boot.controller;\n\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.ResponseBody;\n\nimport static org.springframework.web.bind.annotation.RequestMethod.GET;\n\n@Controller\n@RequestMapping("config")\npublic class ConfigController {\n\n    @Value("${useLocalCache:false}")\n    private boolean useLocalCache;\n\n    public void setUseLocalCache(boolean useLocalCache) {\n        this.useLocalCache = useLocalCache;\n    }\n\n    @RequestMapping(value = "/get", method = GET)\n    @ResponseBody\n    public boolean get() {\n        return useLocalCache;\n    }\n}',e.sprigcloud_code='// Refer to document:  https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-cloud-example/nacos-spring-cloud-config-example\npackage com.alibaba.nacos.example.spring.cloud.controller;\n\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.cloud.context.config.annotation.RefreshScope;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\n@RequestMapping("/config")\n@RefreshScope\npublic class ConfigController {\n\n    @Value("${useLocalCache:false}")\n    private boolean useLocalCache;\n\n    @RequestMapping("/get")\n    public boolean get() {\n        return useLocalCache;\n    }\n}',e}return Object(b.a)(n,[{key:"componentDidMount",value:function(){}},{key:"openLoading",value:function(){this.setState({loading:!0})}},{key:"closeLoading",value:function(){this.setState({loading:!1})}},{key:"getData",value:function(){var e=Object(L.a)("namespace"),e={group:this.record.group||"",dataId:this.record.dataId||"",namespace:e,inEdas:window.globalConfig.isParentEdas()};this.defaultCode=this.getJavaCode(e),this.createCodeMirror("text/x-java",this.defaultCode),this.nodejsCode=this.getNodejsCode(e),this.cppCode=this.getCppCode(e),this.shellCode=this.getShellCode(e),this.pythonCode=this.getPythonCode(e),this.csharpCode=this.getCSharpCode(e),this.forceUpdate()}},{key:"getJavaCode",value:function(e){return'/*\n* Demo for Nacos\n* pom.xml\n    <dependency>\n        <groupId>com.alibaba.nacos</groupId>\n        <artifactId>nacos-client</artifactId>\n        <version>${version}</version>\n    </dependency>\n*/\npackage com.alibaba.nacos.example;\n\nimport java.util.Properties;\nimport java.util.concurrent.Executor;\nimport com.alibaba.nacos.api.NacosFactory;\nimport com.alibaba.nacos.api.config.ConfigService;\nimport com.alibaba.nacos.api.config.listener.Listener;\nimport com.alibaba.nacos.api.exception.NacosException;\n\n/**\n * Config service example\n *\n * @author Nacos\n *\n */\npublic class ConfigExample {\n\n\tpublic static void main(String[] args) throws NacosException, InterruptedException {\n\t\tString serverAddr = "localhost";\n\t\tString dataId = "'.concat(e.dataId,'";\n\t\tString group = "').concat(e.group,'";\n\t\tProperties properties = new Properties();\n\t\tproperties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);\n\t\tConfigService configService = NacosFactory.createConfigService(properties);\n\t\tString content = configService.getConfig(dataId, group, 5000);\n\t\tSystem.out.println(content);\n\t\tconfigService.addListener(dataId, group, new Listener() {\n\t\t\t@Override\n\t\t\tpublic void receiveConfigInfo(String configInfo) {\n\t\t\t\tSystem.out.println("recieve:" + configInfo);\n\t\t\t}\n\n\t\t\t@Override\n\t\t\tpublic Executor getExecutor() {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t});\n\n\t\tboolean isPublishOk = configService.publishConfig(dataId, group, "content");\n\t\tSystem.out.println(isPublishOk);\n\n\t\tThread.sleep(3000);\n\t\tcontent = configService.getConfig(dataId, group, 5000);\n\t\tSystem.out.println(content);\n\n\t\tboolean isRemoveOk = configService.removeConfig(dataId, group);\n\t\tSystem.out.println(isRemoveOk);\n\t\tThread.sleep(3000);\n\n\t\tcontent = configService.getConfig(dataId, group, 5000);\n\t\tSystem.out.println(content);\n\t\tThread.sleep(300000);\n\n\t}\n}\n')}},{key:"getNodejsCode",value:function(e){return"TODO"}},{key:"getCppCode",value:function(e){return"TODO"}},{key:"getShellCode",value:function(e){return"TODO"}},{key:"getPythonCode",value:function(e){return"TODO"}},{key:"getCSharpCode",value:function(e){return'/*\nDemo for Basic Nacos Opreation\nApp.csproj\n\n<ItemGroup>\n  <PackageReference Include="nacos-sdk-csharp" Version="${latest.version}" />\n</ItemGroup>\n*/\n\nusing Microsoft.Extensions.DependencyInjection;\nusing Nacos.V2;\nusing Nacos.V2.DependencyInjection;\nusing System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\n\nclass Program\n{\n    static async Task Main(string[] args)\n    {\n        string serverAddr = "http://localhost:8848";\n        string dataId = "'.concat(e.dataId,'";\n        string group = "').concat(e.group,'";\n\n        IServiceCollection services = new ServiceCollection();\n\n        services.AddNacosV2Config(x =>\n        {\n            x.ServerAddresses = new List<string> { serverAddr };\n            x.Namespace = "cs-test";\n\n            // swich to use http or rpc\n            x.ConfigUseRpc = true;\n        });\n\n        IServiceProvider serviceProvider = services.BuildServiceProvider();\n        var configSvc = serviceProvider.GetService<INacosConfigService>();\n\n        var content = await configSvc.GetConfig(dataId, group, 3000);\n        Console.WriteLine(content);\n\n        var listener = new ConfigListener();\n\n        await configSvc.AddListener(dataId, group, listener);\n\n        var isPublishOk = await configSvc.PublishConfig(dataId, group, "content");\n        Console.WriteLine(isPublishOk);\n\n        await Task.Delay(3000);\n        content = await configSvc.GetConfig(dataId, group, 5000);\n        Console.WriteLine(content);\n\n        var isRemoveOk = await configSvc.RemoveConfig(dataId, group);\n        Console.WriteLine(isRemoveOk);\n        await Task.Delay(3000);\n\n        content = await configSvc.GetConfig(dataId, group, 5000);\n        Console.WriteLine(content);\n        await Task.Delay(300000);\n    }\n\n    internal class ConfigListener : IListener\n    {\n        public void ReceiveConfigInfo(string configInfo)\n        {\n            Console.WriteLine("recieve:" + configInfo);\n        }\n    }\n}\n\n/*\nRefer to document:  https://github.com/nacos-group/nacos-sdk-csharp/tree/dev/samples/MsConfigApp\nDemo for ASP.NET Core Integration\nMsConfigApp.csproj\n\n<ItemGroup>\n  <PackageReference Include="nacos-sdk-csharp.Extensions.Configuration" Version="${latest.version}" />\n</ItemGroup>\n*/\n\nusing Microsoft.AspNetCore.Hosting;\nusing Microsoft.Extensions.Configuration;\nusing Microsoft.Extensions.Hosting;\nusing Serilog;\nusing Serilog.Events;\n\npublic class Program\n{\n    public static void Main(string[] args)\n    {\n        Log.Logger = new LoggerConfiguration()\n            .Enrich.FromLogContext()\n            .MinimumLevel.Override("Microsoft", LogEventLevel.Warning)\n            .MinimumLevel.Override("System", LogEventLevel.Warning)\n            .MinimumLevel.Debug()\n            .WriteTo.Console()\n            .CreateLogger();\n\n        try\n        {\n            Log.ForContext<Program>().Information("Application starting...");\n            CreateHostBuilder(args, Log.Logger).Build().Run();\n        }\n        catch (System.Exception ex)\n        {\n            Log.ForContext<Program>().Fatal(ex, "Application start-up failed!!");\n        }\n        finally\n        {\n            Log.CloseAndFlush();\n        }\n    }\n\n    public static IHostBuilder CreateHostBuilder(string[] args, Serilog.ILogger logger) =>\n        Host.CreateDefaultBuilder(args)\n            .ConfigureAppConfiguration((context, builder) =>\n            {\n                var c = builder.Build();\n                builder.AddNacosV2Configuration(c.GetSection("NacosConfig"), logAction: x => x.AddSerilog(logger));\n            })\n            .ConfigureWebHostDefaults(webBuilder =>\n            {\n                webBuilder.UseStartup<Startup>().UseUrls("http://*:8787");\n            })\n            .UseSerilog();\n}\n  ')}},{key:"openDialog",value:function(e){var t=this;this.setState({dialogvisible:!0}),this.record=e,setTimeout(function(){t.getData()})}},{key:"closeDialog",value:function(){this.setState({dialogvisible:!1})}},{key:"createCodeMirror",value:function(e,t){var n=this.refs.codepreview;n&&(n.innerHTML="",this.cm=window.CodeMirror(n,{value:t,mode:e,height:400,width:500,lineNumbers:!0,theme:"xq-light",lint:!0,tabMode:"indent",autoMatchParens:!0,textWrapping:!0,gutters:["CodeMirror-lint-markers"],extraKeys:{F1:function(e){e.setOption("fullScreen",!e.getOption("fullScreen"))},Esc:function(e){e.getOption("fullScreen")&&e.setOption("fullScreen",!1)}}}))}},{key:"changeTab",value:function(e,t){var n=this;setTimeout(function(){n[e]=!0,n.createCodeMirror("text/javascript",t)})}},{key:"render",value:function(){var e=this.props.locale,e=void 0===e?{}:e;return x.a.createElement("div",null,x.a.createElement(y.a,{title:e.sampleCode,style:{width:"80%"},visible:this.state.dialogvisible,footer:x.a.createElement("div",null),onClose:this.closeDialog.bind(this)},x.a.createElement("div",{style:{height:500}},x.a.createElement(A.a,{tip:e.loading,style:{width:"100%"},visible:this.state.loading},x.a.createElement(D.a,{shape:"text",style:{height:40,paddingBottom:10}},x.a.createElement(O,{title:"Java",key:1,onClick:this.changeTab.bind(this,"commoneditor1",this.defaultCode)}),x.a.createElement(O,{title:"Spring Boot",key:2,onClick:this.changeTab.bind(this,"commoneditor2",this.sprigboot_code)}),x.a.createElement(O,{title:"Spring Cloud",key:21,onClick:this.changeTab.bind(this,"commoneditor21",this.sprigcloud_code)}),x.a.createElement(O,{title:"Node.js",key:3,onClick:this.changeTab.bind(this,"commoneditor3",this.nodejsCode)}),x.a.createElement(O,{title:"C++",key:4,onClick:this.changeTab.bind(this,"commoneditor4",this.cppCode)}),x.a.createElement(O,{title:"Shell",key:5,onClick:this.changeTab.bind(this,"commoneditor5",this.shellCode)}),x.a.createElement(O,{title:"Python",key:6,onClick:this.changeTab.bind(this,"commoneditor6",this.pythonCode)}),x.a.createElement(O,{title:"C#",key:7,onClick:this.changeTab.bind(this,"commoneditor7",this.csharpCode)})),x.a.createElement("div",{ref:"codepreview"})))))}}]),n}(x.a.Component)).displayName="ShowCodeing",S=S))||S,S=(t(66),t(41)),S=t.n(S),F=(t(716),S.a.Row),N=S.a.Col,z=(0,n.a.config)(((S=function(e){Object(M.a)(n,e);var t=Object(k.a)(n);function n(e){return Object(_.a)(this,n),(e=t.call(this,e)).state={visible:!1,title:"",content:"",isok:!0,dataId:"",group:""},e}return Object(b.a)(n,[{key:"componentDidMount",value:function(){this.initData()}},{key:"initData",value:function(){var e=this.props.locale;this.setState({title:(void 0===e?{}:e).confManagement})}},{key:"openDialog",value:function(e){this.setState({visible:!0,title:e.title,content:e.content,isok:e.isok,dataId:e.dataId,group:e.group,message:e.message})}},{key:"closeDialog",value:function(){this.setState({visible:!1})}},{key:"render",value:function(){var e=this.props.locale,e=void 0===e?{}:e,t=x.a.createElement("div",{style:{textAlign:"right"}},x.a.createElement(d.a,{type:"primary",onClick:this.closeDialog.bind(this)},e.determine));return x.a.createElement("div",null,x.a.createElement(y.a,{visible:this.state.visible,footer:t,style:{width:555},onCancel:this.closeDialog.bind(this),onClose:this.closeDialog.bind(this),title:e.deletetitle},x.a.createElement("div",null,x.a.createElement(F,null,x.a.createElement(N,{span:"4",style:{paddingTop:16}},x.a.createElement(m.a,{type:"".concat(this.state.isok?"success":"delete","-filling"),style:{color:this.state.isok?"green":"red"},size:"xl"})),x.a.createElement(N,{span:"20"},x.a.createElement("div",null,x.a.createElement("h3",null,this.state.isok?e.deletedSuccessfully:e.deleteFailed),x.a.createElement("p",null,x.a.createElement("span",{style:{color:"#999",marginRight:5}},"Data ID"),x.a.createElement("span",{style:{color:"#c7254e"}},this.state.dataId)),x.a.createElement("p",null,x.a.createElement("span",{style:{color:"#999",marginRight:5}},"Group"),x.a.createElement("span",{style:{color:"#c7254e"}},this.state.group)),this.state.isok?"":x.a.createElement("p",{style:{color:"red"}},this.state.message)))))))}}]),n}(x.a.Component)).displayName="DeleteDialog",S=S))||S,S=(t(717),t(419)),W=t.n(S),V=(0,n.a.config)(((S=function(e){Object(M.a)(n,e);var t=Object(k.a)(n);function n(){return Object(_.a)(this,n),t.apply(this,arguments)}return Object(b.a)(n,[{key:"render",value:function(){var e=this.props,t=e.data,t=void 0===t?{}:t,n=e.height,e=e.locale,a=void 0===e?{}:e;return x.a.createElement("div",null,"notice"===t.modeType?x.a.createElement("div",{"data-spm-click":"gostr=/aliyun;locaid=notice"},x.a.createElement(W.a,{style:{marginBottom:1<t.modeList.length?20:10},arrows:!1},t.modeList.map(function(e,t){return x.a.createElement("div",{key:t,className:"slider-img-wrapper"},x.a.createElement("div",{className:"alert alert-success",style:{minHeight:120,backgroundColor:"#e9feff"}},x.a.createElement("div",{className:"alert-success-text",style:{fontWeight:"bold"}},a.importantReminder0),x.a.createElement("strong",{style:{color:"#777a7e"}},x.a.createElement("span",null,e.title)),x.a.createElement("strong",null,x.a.createElement("span",null,x.a.createElement("a",{style:{marginLeft:10,color:"#33cde5"},href:e.url,target:"_blank"},a.viewDetails1)))))}))," "):x.a.createElement("div",{className:"dash-card-contentwrappers",style:{height:n||"auto"},"data-spm-click":"gostr=/aliyun;locaid=".concat(t.modeType)},x.a.createElement("h3",{className:"dash-card-title"},t.modeName),x.a.createElement("div",{className:"dash-card-contentlist"},t.modeList?t.modeList.map(function(e){return x.a.createElement("div",{className:"dash-card-contentitem"},x.a.createElement("a",{href:e.url,target:"_blank"},e.title),"new"===e.tag?x.a.createElement("img",{style:{width:28,marginLeft:2,verticalAlign:"text-bottom"},src:"//img.alicdn.com/tps/TB1pS2YMVXXXXcCaXXXXXXXXXXX-56-24.png",alt:""}):"","hot"===e.tag?x.a.createElement("img",{style:{width:28,marginLeft:2,verticalAlign:"text-bottom"},src:"//img.alicdn.com/tps/TB1nusxPXXXXXb0aXXXXXXXXXXX-56-24.png",alt:""}):"")}):""))," ")}}]),n}(x.a.Component)).displayName="DashboardCard",S=S))||S,S=t(37),P=t(116),B=t(69),U=t(103),j=(t(726),t(28)),K=E.a.Item,Y=(a.a.Panel,new Map),S=Object(S.b)(function(e){return{configurations:e.configuration.configurations}},{getConfigs:P.b,getConfigsV2:P.c})(a=(0,n.a.config)(((t=function(e){Object(M.a)(a,e);var n=Object(k.a)(a);function a(e){Object(_.a)(this,a),(t=n.call(this,e)).handleDefaultFuzzySwitchChange=function(){t.setState({defaultFuzzySearch:!t.state.defaultFuzzySearch})},t.clear=function(){t.setAppName(""),t.setConfigTags([]),t.setConfigDetail("")},t.changeAdvancedQuery=function(){Object(L.c)("isAdvanceQuery",!t.state.isAdvancedQuery),t.state.isAdvancedQuery&&t.clear(),t.setState({isAdvancedQuery:!t.state.isAdvancedQuery})},t.deleteDialog=x.a.createRef(),t.showcode=x.a.createRef(),t.field=new v.a(Object(w.a)(t)),t.appName=Object(L.a)("appName")||"",t.preAppName=t.appName,t.group=Object(L.a)("group")||"",t.preGroup=t.group,t.dataId=Object(L.a)("dataId")||"",t.preDataId=t.dataId,t.serverId=Object(L.a)("serverId")||"center",t.edasAppId=Object(L.a)("edasAppId")||"",t.edasAppName=Object(L.a)("edasAppName")||"",t.inApp=t.edasAppId,t.isAdvance=Object(L.a)("isAdvanceQuery")||!1,t.state={value:"",visible:!1,total:0,pageSize:Object(L.a)("pageSize")?Object(L.a)("pageSize"):10,currentPage:1,dataSource:[],fieldValue:[],showAppName:!1,showgroup:!1,dataId:t.dataId,group:t.group,appName:t.appName,config_detail:Object(L.a)("configDetail")||"",config_tags:Object(L.a)("configTags")?Object(L.a)("configTags").split(","):[],tagLst:Object(L.a)("tagList")?Object(L.a)("tagList").split(","):[],selectValue:[],loading:!1,groupList:[],groups:[],tenant:!0,nownamespace_id:window.nownamespace||"",nownamespace_name:window.namespaceShowName||"",selectedRecord:[],selectedKeys:[],hasdash:!1,isCn:!0,contentList:[],isAdvancedQuery:t.isAdvance,isCheckAll:!1,rowSelection:{onChange:t.configDataTableOnChange.bind(Object(w.a)(t)),selectedRowKeys:[]},isPageEnter:!1,defaultFuzzySearch:!0};var t,e={dataId:t.dataId||"",group:t.preGroup||"",appName:t.appName||""};return Object(L.c)(e),t.batchHandle=null,t.toggleShowQuestionnaire=t.toggleShowQuestionnaire.bind(Object(w.a)(t)),t}return Object(b.a)(a,[{key:"componentDidMount",value:function(){var e=this.props.locale,e=void 0===e?{}:e;this.setIsCn(),window._getLink&&"true"===window._getLink("isCn")&&!this.checkQuestionnaire()&&"acm.console.aliyun.com"===window.location.host&&y.a.alert({title:e.questionnaire2,style:{width:"60%"},content:x.a.createElement("div",null,x.a.createElement("div",{style:{fontSize:"15px",lineHeight:"22px"}},e.ad,x.a.createElement("a",{href:"https://survey.aliyun.com/survey/k0BjJ2ARC",target:"_blank"},e.questionnaire2)),x.a.createElement("div",{style:{fontSize:"15px"}},e.noLongerDisplay4,x.a.createElement(g.a,{onChange:this.toggleShowQuestionnaire})))})}},{key:"setIsCn",value:function(){this.setState({isCn:"zh-CN"===localStorage.getItem(j.f)})}},{key:"toggleShowQuestionnaire",value:function(e){e?localStorage.setItem("acm_questionnaire",1):localStorage.removeItem("acm_questionnaire")}},{key:"checkQuestionnaire",value:function(){return!!localStorage.getItem("acm_questionnaire")}},{key:"navTo",value:function(e,t){switch(this.serverId=Object(L.a)("serverId")||"",this.tenant=Object(L.a)("namespace")||"",e){case"/historyRollback":e="".concat(e,"?historyServerId=").concat(this.serverId||"","&historyDataId=").concat(t.dataId,"&historyGroup=").concat(t.group,"&namespace=").concat(this.tenant);break;case"/listeningToQuery":e="".concat(e,"?listeningServerId=").concat(this.serverId||"","&listeningDataId=").concat(t.dataId,"&listeningGroup=").concat(t.group,"&namespace=").concat(this.tenant);break;case"/pushTrajectory":e="".concat(e,"?serverId=").concat(this.serverId||"","&dataId=").concat(t.dataId,"&group=").concat(t.group,"&namespace=").concat(this.tenant)}this.props.history.push(e)}},{key:"openLoading",value:function(){this.setState({loading:!0})}},{key:"closeLoading",value:function(){this.setState({loading:!1})}},{key:"cleanAndGetData",value:function(){0<arguments.length&&void 0!==arguments[0]&&arguments[0]&&(this.dataId="",this.group="",this.setState({group:"",dataId:""}),Object(L.c)({group:"",dataId:""})),this.getData(),Y.clear();var e=this.state.rowSelection;e.selectedRowKeys=[],this.setState({rowSelection:e})}},{key:"changeParamsBySearchType",value:function(e){this.state.defaultFuzzySearch&&(e.dataId&&""!==e.dataId&&(e.dataId="*"+e.dataId+"*"),e.group&&""!==e.group&&(e.group="*"+e.group+"*")),this.state.defaultFuzzySearch?e.search="blur":e.search="accurate"}},{key:"getData",value:function(){var t,n,e,a,r=this,o=0<arguments.length&&void 0!==arguments[0]?arguments[0]:1;this.state.loading||(e=(a=this.props).locale,t=void 0===e?{}:e,e=a.configurations,n=void 0===e?{}:e,this.tenant=Object(L.a)("namespace")||"",this.serverId=Object(L.a)("serverId")||"",a=Object(L.a)("pageNo"),e=Object(L.a)("pageSize"),this.pageNo=a||o,this.pageSize=e||this.state.pageSize,a={dataId:this.dataId,group:this.group,appName:this.appName,config_tags:this.state.config_tags.join(","),pageNo:a||o,pageSize:e||this.state.pageSize,tenant:this.tenant},Object(L.c)("pageSize",null),Object(L.c)("pageNo",null),this.changeParamsBySearchType(a),this.setState({loading:!0}),(this.state.config_detail&&""!==this.state.config_detail?(this.state.defaultFuzzySearch?a.config_detail="*"+this.state.config_detail+"*":a.config_detail=this.state.config_detail,this.props.getConfigsV2(a)):this.props.getConfigs(a)).then(function(){return r.setState({loading:!1,selectedRecord:[],selectedKeys:[],tenant:r.tenant})}).catch(function(e){n.pageItems=[],n.totalCount=0,r.setState({loading:!1}),e&&[401,403].includes(e.status)&&y.a.alert({title:t.authFail,content:t.getNamespace403.replace("${namespaceName}",r.state.nownamespace_name)})}))}},{key:"chooseNav",value:function(e,t){switch(t){case"nav1":this.navTo("/historyRollback",e);break;case"nav2":this.navTo("/pushTrajectory",e);break;default:this.navTo("/listeningToQuery",e)}}},{key:"removeConfig",value:function(n){var e=this.props.locale,a=void 0===e?{}:e,r=this;y.a.confirm({title:a.removeConfiguration,content:x.a.createElement("div",{style:{marginTop:"-20px"}},x.a.createElement("h3",null,a.sureDelete),x.a.createElement("p",null,x.a.createElement("span",{style:{color:"#999",marginRight:5}},"Data ID"),x.a.createElement("span",{style:{color:"#c7254e"}},n.dataId)),x.a.createElement("p",null,x.a.createElement("span",{style:{color:"#999",marginRight:5}},"Group"),x.a.createElement("span",{style:{color:"#c7254e"}},n.group)),x.a.createElement("p",null,x.a.createElement("span",{style:{color:"#999",marginRight:5}},a.environment),x.a.createElement("span",{style:{color:"#c7254e"}},r.serverId||""))),onOk:function(){var e="v1/cs/configs?dataId=".concat(n.dataId,"&group=").concat(n.group);Object(L.b)({url:e,type:"delete",success:function(e){var t={};t.title=a.configurationManagement,t.content="",t.dataId=n.dataId,t.group=n.group,!0===e?t.isok=!0:(t.isok=!1,t.message=e.message),r.deleteDialog.current.getInstance().openDialog(t),r.getData()}})}})}},{key:"showCode",value:function(e){this.showcode.current.getInstance().openDialog(e)}},{key:"renderCol",value:function(e,t,n){var a=this.props.locale,a=void 0===a?{}:a;return x.a.createElement("div",null,x.a.createElement("a",{onClick:this.goDetail.bind(this,n),style:{marginRight:5}},a.details),x.a.createElement("span",{style:{marginRight:5}},"|"),x.a.createElement("a",{style:{marginRight:5},onClick:this.showCode.bind(this,n)},a.sampleCode),x.a.createElement("span",{style:{marginRight:5}},"|"),x.a.createElement("a",{style:{marginRight:5},onClick:this.goEditor.bind(this,n)},a.edit),x.a.createElement("span",{style:{marginRight:5}},"|"),x.a.createElement("a",{style:{marginRight:5},onClick:this.removeConfig.bind(this,n)},a.deleteAction),x.a.createElement("span",{style:{marginRight:5}},"|"),x.a.createElement(u.a,{trigger:x.a.createElement("a",{title:a.more},x.a.createElement(m.a,{type:"ellipsis",size:"small",style:{transform:"rotate(90deg)"}})),triggerType:"click"},x.a.createElement(h.a,{onItemClick:this.chooseNav.bind(this,n)},x.a.createElement(h.a.Item,{key:"nav1"},a.version),x.a.createElement(h.a.Item,{key:"nav3"},a.listenerQuery))))}},{key:"changePage",value:function(e,t){var n=this;this.setState({isPageEnter:t&&t.keyCode&&13===t.keyCode,currentPage:e},function(){return n.getData(e,!1)})}},{key:"onChangeSort",value:function(n,a){var e=this.props.configurations;(void 0===e?{}:e).pageItems.sort(function(e,t){return"asc"===a?(e[n]+"").localeCompare(t[n]+""):(t[n]+"").localeCompare(e[n]+"")}),this.forceUpdate()}},{key:"handlePageSizeChange",value:function(e){var t=this;this.setState({pageSize:e},function(){return t.changePage(1)})}},{key:"setConfigDetail",value:function(e){this.setState({config_detail:e}),Object(L.c)("configDetail",e)}},{key:"setAppName",value:function(e){this.appName=e,this.setState({appName:e}),Object(L.c)("appName",e)}},{key:"setConfigTags",value:function(e){this.setState({config_tags:e||[],tagLst:e}),e?(Object(L.c)("tagList",e.join(",")),Object(L.c)("configTags",e.join(","))):(Object(L.c)("tagList",""),Object(L.c)("configTags",""))}},{key:"setGroup",value:function(e){this.group=e||"",this.setState({group:e||""}),Object(L.c)("group",e)}},{key:"selectAll",value:function(){this.getData()}},{key:"chooseEnv",value:function(e){this.serverId=Object(L.a)("serverId")||"center",this.tenant=Object(L.a)("namespace")||"",this.props.history.push("/newconfig?serverId=".concat(this.serverId||"","&namespace=").concat(this.tenant,"&edasAppName=").concat(this.edasAppName,"&edasAppId=").concat(this.edasAppId,"&searchDataId=").concat(this.dataId,"&searchGroup=").concat(this.group))}},{key:"setNowNameSpace",value:function(e,t){this.setState({nownamespace_name:e,nownamespace_id:t})}},{key:"goDetail",value:function(e){this.serverId=Object(L.a)("serverId")||"center",this.tenant=Object(L.a)("namespace")||"",this.props.history.push("/configdetail?serverId=".concat(this.serverId||"","&dataId=").concat(e.dataId,"&group=").concat(e.group,"&namespace=").concat(this.tenant,"&edasAppName=").concat(this.edasAppName,"&searchDataId=").concat(this.dataId,"&searchGroup=").concat(this.group,"&pageSize=").concat(this.pageSize,"&pageNo=").concat(this.pageNo))}},{key:"goEditor",value:function(e){this.serverId=Object(L.a)("serverId")||"center",this.tenant=Object(L.a)("namespace")||"",this.props.history.push("/configeditor?serverId=".concat(this.serverId||"","&dataId=").concat(e.dataId,"&group=").concat(e.group,"&namespace=").concat(this.tenant,"&edasAppName=").concat(this.edasAppName,"&edasAppId=").concat(this.edasAppId,"&searchDataId=").concat(this.dataId,"&searchGroup=").concat(this.group,"&pageSize=").concat(this.pageSize,"&pageNo=").concat(this.pageNo))}},{key:"openUri",value:function(e,t){window.open([e,Object.keys(t).map(function(e){return"".concat(e,"=").concat(t[e])}).join("&")].join("?"))}},{key:"exportData",value:function(){var e=this.group,t=this.appName,n=this.dataId,a=this.openUri,r=JSON.parse(localStorage.token||"{}"),o=r.accessToken,o=void 0===o?"":o,r=r.username,r=void 0===r?"":r;a("v1/cs/configs",{export:"true",tenant:Object(L.a)("namespace"),group:e,appName:t,dataId:n,ids:"",accessToken:o,username:r})}},{key:"exportDataNew",value:function(){var e=this.group,t=this.appName,n=this.dataId,a=this.openUri,r=JSON.parse(localStorage.token||"{}"),o=r.accessToken,o=void 0===o?"":o,r=r.username,r=void 0===r?"":r;a("v1/cs/configs",{exportV2:"true",tenant:Object(L.a)("namespace"),group:e,appName:t,dataId:n,ids:"",accessToken:o,username:r})}},{key:"exportSelectedData",value:function(e){var a=[],t=this.props.locale,t=void 0===t?{}:t,n=JSON.parse(localStorage.token||"{}"),r=n.accessToken,r=void 0===r?"":r,n=n.username,n=void 0===n?"":n;Y.size?(Y.forEach(function(e,t,n){return a.push(t)}),e?this.openUri("v1/cs/configs",{exportV2:"true",tenant:Object(L.a)("namespace"),group:"",appName:"",ids:a.join(","),accessToken:r,username:n}):this.openUri("v1/cs/configs",{export:"true",tenant:Object(L.a)("namespace"),group:"",appName:"",ids:a.join(","),accessToken:r,username:n})):y.a.alert({title:t.exportSelectedAlertTitle,content:t.exportSelectedAlertContent})}},{key:"multipleSelectionDeletion",value:function(){var r,e=this.props.locale,t=void 0===e?{}:e,n=this;0===Y.size?y.a.alert({title:t.delSelectedAlertTitle,content:t.delSelectedAlertContent}):(r=[],Y.forEach(function(e,t,n){var a={};a.dataId=e.dataId,a.group=e.group,r.push(a)}),y.a.confirm({title:t.removeConfiguration,content:x.a.createElement("div",{style:{marginTop:"-20px"}},x.a.createElement("h3",null,t.sureDelete),x.a.createElement(p.a,{dataSource:r},x.a.createElement(p.a.Column,{title:"Data Id",dataIndex:"dataId"}),x.a.createElement(p.a.Column,{title:"Group",dataIndex:"group"}))),onOk:function(){var e="v1/cs/configs?delType=ids&ids=".concat(Array.from(Y.keys()).join(","),"&tenant=")+n.state.nownamespace_id;Object(L.b)({url:e,type:"delete",success:function(e){s.a.success(t.delSuccessMsg),n.getData()}})}}))}},{key:"cloneSelectedDataConfirm",value:function(){var e=this.props.locale,s=void 0===e?{}:e,u=this;u.field.setValue("sameConfigPolicy","ABORT"),u.field.setValue("cloneTargetSpace",void 0),0===Y.size?y.a.alert({title:s.cloneSelectedAlertTitle,content:s.cloneSelectedAlertContent}):Object(L.b)({url:"v1/console/namespaces?namespaceId=",beforeSend:function(){u.openLoading()},success:function(e){var a=this,e=(u.closeLoading(),e&&200===e.code&&e.data||y.a.alert({title:s.getNamespaceFailed,content:s.getNamespaceFailed}),e.data),n=[],r=(e.forEach(function(e){var t={isCurrent:!1};u.state.nownamespace_id===e.namespace&&(t.isCurrent=!0),"public"===e.namespaceShowName?(t.label="public | public",t.value="public"):(t.label="".concat(e.namespaceShowName," | ").concat(e.namespace),t.value=e.namespace),n.push(t)}),[]),o=new Map,i=(Y.forEach(function(e,t,n){var a={};a.id=t,a.dataId=e.dataId,a.group=e.group,r.push(a),o.set(t,JSON.parse(JSON.stringify(e)))}),function(e,t,n){1===t?o.get(e.id).dataId=n.target.value:o.get(e.id).group=n.target.value}),l=y.a.confirm({title:s.cloningConfiguration,footer:!1,content:x.a.createElement(x.a.Fragment,null,x.a.createElement("div",{style:{marginBottom:10}},x.a.createElement("span",{style:{color:"#999",marginRight:5}},s.source),x.a.createElement("span",{style:{color:"#49D2E7"}},u.state.nownamespace_name," "),"|"," ",u.state.nownamespace_id),x.a.createElement("div",{style:{marginBottom:10}},x.a.createElement("span",{style:{color:"#999",marginRight:5}},s.configurationNumber),x.a.createElement("span",{style:{color:"#49D2E7"}},Y.size," "),s.selectedEntry),x.a.createElement("div",{style:{marginBottom:10}},x.a.createElement("span",{style:{color:"red",marginRight:2,marginLeft:-10}},"*"),x.a.createElement("span",{style:{color:"#999",marginRight:5}},s.target),x.a.createElement(c.a,{style:{width:450},placeholder:s.selectNamespace,size:"medium",hasArrow:!0,showSearch:!0,hasClear:!1,mode:"single",itemRender:function(e){return e.isCurrent?x.a.createElement("span",{style:{color:"#00AA00","font-weight":"bold"}},e.label):x.a.createElement("span",null,e.label)},dataSource:n,onChange:function(e,t,n){e&&(document.getElementById("cloneTargetSpaceSelectErr").style.display="none",u.field.setValue("cloneTargetSpace",e))}}),x.a.createElement("br",null),x.a.createElement("span",{id:"cloneTargetSpaceSelectErr",style:{color:"red",display:"none"}},s.selectNamespace)),x.a.createElement("div",{style:{marginBottom:10}},x.a.createElement("span",{style:{color:"#999",marginRight:5}},s.samePreparation,":"),x.a.createElement(c.a,{style:{width:130},size:"medium",hasArrow:!0,mode:"single",filterLocal:!1,defaultValue:"ABORT",dataSource:[{label:s.abortImport,value:"ABORT"},{label:s.skipImport,value:"SKIP"},{label:s.overwriteImport,value:"OVERWRITE"}],hasClear:!1,onChange:function(e,t,n){e&&u.field.setValue("sameConfigPolicy",e)}})),x.a.createElement("div",{style:{marginBottom:10}},x.a.createElement(d.a,{type:"primary",style:{marginRight:10},onClick:function(){var r,e,t;u.field.getValue("cloneTargetSpace")?(document.getElementById("cloneTargetSpaceSelectErr").style.display="none",r=[],o.forEach(function(e,t,n){var a={};a.cfgId=t,a.dataId=e.dataId,a.group=e.group,r.push(a)}),e=u.field.getValue("cloneTargetSpace"),t=u.field.getValue("sameConfigPolicy"),Object(L.b)({url:"v1/cs/configs?clone=true&tenant=".concat(e,"&policy=").concat(t,"&namespaceId="),method:"post",data:JSON.stringify(r),contentType:"application/json",beforeSend:function(){u.openLoading()},success:function(e){u.closeLoading(),u.processImportAndCloneResult(e,s,l,!1)},error:function(e){u.closeLoading(),u.setState({dataSource:[],total:0,currentPage:0})},complete:function(){u.closeLoading()}})):document.getElementById("cloneTargetSpaceSelectErr").style.display="inline"},"data-spm-click":"gostr=/aliyun;locaid=doClone"},s.startCloning)),x.a.createElement("div",{style:{marginBottom:10}},x.a.createElement("span",{style:{color:"#00AA00",fontWeight:"bold"}},s.cloneEditableTitle)),x.a.createElement(p.a,{dataSource:r},x.a.createElement(p.a.Column,{title:"Data Id",dataIndex:"dataId",cell:function(e,t,n){return x.a.createElement(f.a,{defaultValue:e,onBlur:i.bind(a,n,1)})}}),x.a.createElement(p.a.Column,{title:"Group",dataIndex:"group",cell:function(e,t,n){return x.a.createElement(f.a,{defaultValue:e,onBlur:i.bind(a,n,2)})}})))})},error:function(e){u.closeLoading(),u.setState({dataSource:[],total:0,currentPage:0})},complete:function(){u.closeLoading()}})}},{key:"processImportAndCloneResult",value:function(e,t,n,a){var r,o,i=e.code;200===i?(n.hide(),n=e.data.failData?e.data.failData.length:0,o=e.data.skipData?e.data.skipData.length:0,r=e.data.unrecognizedCount||0,0<n?y.a.alert({title:a?t.importAbort:t.cloneAbort,content:x.a.createElement("div",{style:{width:"500px"}},x.a.createElement("h4",null,t.conflictConfig,"锛�",e.data.failData[0].group,"/",e.data.failData[0].dataId),x.a.createElement("div",{style:{marginTop:20}},x.a.createElement("h5",null,t.failureEntries,": ",n),x.a.createElement(p.a,{dataSource:e.data.failData},x.a.createElement(p.a.Column,{title:"Data Id",dataIndex:"dataId"}),x.a.createElement(p.a.Column,{title:"Group",dataIndex:"group"}))),x.a.createElement("div",null,x.a.createElement("h5",null,t.unprocessedEntries,": ",o),x.a.createElement(p.a,{dataSource:e.data.skipData},x.a.createElement(p.a.Column,{title:"Data Id",dataIndex:"dataId"}),x.a.createElement(p.a.Column,{title:"Group",dataIndex:"group"}))),x.a.createElement("div",null,x.a.createElement("h5",null,t.unrecognizedEntries,": ",r),x.a.createElement(p.a,{dataSource:e.data.unrecognizedData},x.a.createElement(p.a.Column,{title:"Item Name",dataIndex:"itemName"}))))}):0<o||0<r?(n="".concat(a?t.importSuccEntries:t.cloneSuccEntries).concat(e.data.succCount),y.a.alert({title:a?t.importSucc:t.cloneSucc,content:x.a.createElement("div",{style:{width:"500px"}},x.a.createElement("h5",null,n),x.a.createElement("div",null,x.a.createElement("h5",null,t.skippedEntries,": ",o),x.a.createElement(p.a,{dataSource:e.data.skipData},x.a.createElement(p.a.Column,{title:"Data Id",dataIndex:"dataId"}),x.a.createElement(p.a.Column,{title:"Group",dataIndex:"group"}))),x.a.createElement("div",null,x.a.createElement("h5",null,t.unrecognizedEntries,": ",r),x.a.createElement(p.a,{dataSource:e.data.unrecognizedData},x.a.createElement(p.a.Column,{title:"Item Name",dataIndex:"itemName"}))))})):(n="".concat(a?t.importSuccBegin:t.cloneSuccBegin).concat(e.data.succCount).concat(a?t.importSuccEnd:t.cloneSuccEnd),s.a.success(n)),this.getData()):(o=a?t.importFailMsg:t.cloneFailMsg,100001===i&&(o=t.namespaceNotExist),100002===i&&(o=t.metadataIllegal),100003!==i&&100004!==i&&100005!==i||(o=t.importDataValidationError),y.a.alert({title:a?t.importFail:t.cloneFail,content:o}))}},{key:"importData",value:function(){var e=this.props.locale,t=void 0===e?{}:e,a=this,e=(a.field.setValue("sameConfigPolicy","ABORT"),{});try{e=JSON.parse(localStorage.token)}catch(e){console.log(e),goLogin()}var n=e.accessToken,n=void 0===n?"":n,e=e.username,e=void 0===e?"":e,e={accept:"application/zip",action:"v1/cs/configs?import=true&namespace=".concat(Object(L.a)("namespace"),"&accessToken=").concat(n,"&username=").concat(e,"&tenant=").concat(Object(L.a)("namespace")),headers:Object.assign({},{},{accessToken:n}),data:{policy:a.field.getValue("sameConfigPolicy")},beforeUpload:function(e,t){return t.data={policy:a.field.getValue("sameConfigPolicy")},t},onSuccess:function(e){a.processImportAndCloneResult(e.response,t,r,!0)},onError:function(e){e=e.response,e.data,e=e.status;[401,403].includes(e)?y.a.alert({title:t.importFail,content:t.importFail403}):y.a.alert({title:t.importFail,content:t.importDataValidationError})}},r=y.a.confirm({title:t.import,footer:!1,content:x.a.createElement("div",null,x.a.createElement("div",{style:{marginBottom:10}},x.a.createElement("span",{style:{color:"#999",marginRight:5}},t.targetNamespace,":"),x.a.createElement("span",{style:{color:"#49D2E7"}},this.state.nownamespace_name," "),"|"," ",this.state.nownamespace_id),x.a.createElement("div",{style:{marginBottom:10}},x.a.createElement("span",{style:{color:"#999",marginRight:5}},t.samePreparation,":"),x.a.createElement(c.a,{style:{width:130},size:"medium",hasArrow:!0,mode:"single",filterLocal:!1,defaultValue:"ABORT",dataSource:[{label:t.abortImport,value:"ABORT"},{label:t.skipImport,value:"SKIP"},{label:t.overwriteImport,value:"OVERWRITE"}],hasClear:!1,onChange:function(e,t,n){a.field.setValue("sameConfigPolicy",e)}})),x.a.createElement("div",{style:{marginBottom:10}},x.a.createElement(m.a,{type:"prompt",style:{color:"#FFA003",marginRight:"10px"}}),t.importRemind),x.a.createElement("div",null,x.a.createElement(l.a,Object.assign({name:"file",listType:"text","data-spm-click":"gostr=/aliyun;locaid=configsImport"},e),x.a.createElement(d.a,{type:"primary"},t.uploadBtn))))})}},{key:"configDataTableOnChange",value:function(e,t){var n=this.state.rowSelection;n.selectedRowKeys=e,this.setState({rowSelection:n}),Y.clear(),t.forEach(function(e,t){Y.set(e.id,e)})}},{key:"render",value:function(){var n=this,e=this.props,t=e.locale,t=void 0===t?{}:t,e=e.configurations,e=void 0===e?{}:e;return x.a.createElement(x.a.Fragment,null,x.a.createElement(T,{ref:function(e){return n.batchHandle=e}}),x.a.createElement("div",{className:this.state.hasdash?"dash-page-container":""},x.a.createElement("div",{className:this.state.hasdash?"dash-left-container":"",style:{position:"relative"}},x.a.createElement("div",{style:{display:this.inApp?"none":"block"}},x.a.createElement(B.a,{title:t.configurationManagement8,desc:this.state.nownamespace_id,nameSpace:!0}),x.a.createElement(R.a,{namespaceCallBack:this.cleanAndGetData.bind(this),setNowNameSpace:this.setNowNameSpace.bind(this)})),x.a.createElement("div",{style:{position:"relative",marginTop:10,height:"auto",overflow:"visible"}},x.a.createElement(i.a,{inline:!0},x.a.createElement(i.a.Item,null,x.a.createElement(d.a,{type:"primary",onClick:this.chooseEnv.bind(this)},t.createConfiguration)),x.a.createElement(i.a.Item,{label:"Data ID"},x.a.createElement(f.a,{value:this.dataId,htmlType:"text",placeholder:this.state.defaultFuzzySearch?t.defaultFuzzyd:t.fuzzyd,style:{width:200},onChange:function(e){n.dataId=e,n.setState({dataId:e}),Object(L.c)("dataId",n.dataId)},onPressEnter:function(){return n.selectAll()}})),x.a.createElement(i.a.Item,{label:"Group"},x.a.createElement(c.a.AutoComplete,{style:{width:200},size:"medium",placeholder:this.state.defaultFuzzySearch?t.defaultFuzzyg:t.fuzzyg,dataSource:this.state.groups,value:this.state.group,onChange:this.setGroup.bind(this),onPressEnter:function(){return n.selectAll()},hasClear:!0})),x.a.createElement(i.a.Item,{label:"榛樿妯$硦鍖归厤"},x.a.createElement(o.a,{checkedChildren:"",unCheckedChildren:"",defaultChecked:this.state.defaultFuzzySearch,onChange:this.handleDefaultFuzzySwitchChange,title:"鑷姩鍦ㄦ悳绱㈠弬鏁板墠鍚庡姞涓�*"})),x.a.createElement(i.a.Item,{label:""},x.a.createElement(d.a,{type:"primary",style:{marginRight:10},onClick:this.selectAll.bind(this),"data-spm-click":"gostr=/aliyun;locaid=dashsearch"},t.query)),x.a.createElement(i.a.Item,{style:this.inApp?{display:"none"}:{verticalAlign:"middle",marginTop:0,marginLeft:0}},x.a.createElement(d.a,{onClick:this.changeAdvancedQuery},this.state.isAdvancedQuery?x.a.createElement(x.a.Fragment,null,t.advancedQuery9,x.a.createElement(m.a,{type:"arrow-up",size:"xs",style:{marginLeft:"5px"}})):x.a.createElement(x.a.Fragment,null,t.advancedQuery9,x.a.createElement(m.a,{type:"arrow-down",size:"xs",style:{marginLeft:"5px"}})))),x.a.createElement(i.a.Item,{label:""},x.a.createElement(d.a,{type:"primary",style:{marginRight:10},onClick:this.importData.bind(this),"data-spm-click":"gostr=/aliyun;locaid=configsExport"},t.import)),x.a.createElement("br",null),x.a.createElement(i.a.Item,{style:!this.inApp&&this.state.isAdvancedQuery?{}:{display:"none"},label:t.application},x.a.createElement(f.a,{htmlType:"text",placeholder:t.app1,style:{width:200},value:this.state.appName,onChange:this.setAppName.bind(this),onPressEnter:function(){return n.getData()}})),x.a.createElement(i.a.Item,{style:this.state.isAdvancedQuery?{}:{display:"none"},label:t.tags},x.a.createElement(c.a,{style:{width:200},size:"medium",hasArrow:!0,mode:"tag",placeholder:t.pleaseEnterTag,dataSource:this.state.tagLst,value:this.state.config_tags,onChange:this.setConfigTags.bind(this),showSearch:!0,onSearch:function(e){var t=n.state.tagLst;t.includes(e)||(n.setState({tagLst:t.concat(e)}),Object(L.c)("tagList",n.state.tagLst.join(",")))},hasClear:!0})),x.a.createElement(i.a.Item,{style:this.state.isAdvancedQuery?{}:{display:"none"},label:t.configDetailLabel},x.a.createElement(f.a,{htmlType:"text",placeholder:t.configDetailH,style:{width:200},value:this.state.config_detail,onChange:this.setConfigDetail.bind(this)}))),x.a.createElement("div",{style:{position:"absolute",right:10,top:0}},x.a.createElement(m.a,{type:"add",size:"medium",style:{color:"black",marginRight:0,verticalAlign:"middle",cursor:"pointer",backgroundColor:"#eee",border:"1px solid #ddd",padding:"3px 6px"},onClick:this.chooseEnv.bind(this)}))),x.a.createElement(U.a,{total:e.totalCount}),x.a.createElement(p.a,{className:"configuration-table",dataSource:e.pageItems,locale:{empty:t.pubNoData},ref:"dataTable",loading:this.state.loading,rowSelection:this.state.rowSelection,onSort:this.onChangeSort.bind(this)},x.a.createElement(p.a.Column,{sortable:!0,title:"Data Id",dataIndex:"dataId"}),x.a.createElement(p.a.Column,{sortable:!0,title:"Group",dataIndex:"group"}),!this.inApp&&x.a.createElement(p.a.Column,{sortable:!0,title:t.application,dataIndex:"appName"}),x.a.createElement(p.a.Column,{title:t.operation,cell:this.renderCol.bind(this)})),0<e.totalCount&&x.a.createElement(x.a.Fragment,null,x.a.createElement("div",{style:{float:"left"}},[{warning:!0,text:t.deleteAction,locaid:"configsDelete",onClick:function(){return n.multipleSelectionDeletion()}},{text:t.clone,locaid:"configsDelete",onClick:function(){return n.cloneSelectedDataConfirm()}}].map(function(e){return x.a.createElement(d.a,{warning:e.warning,type:"primary",style:{marginRight:10},onClick:e.onClick,"data-spm-click":"gostr=/aliyun;locaid=".concat(e.locaid)},e.text)}),x.a.createElement(E.a,{type:"primary",autoWidth:!1,label:t.exportBtn,popupStyle:{minWidth:150}},[{text:t.export,locaid:"exportData",onClick:function(){return n.exportData(n)}},{text:t.newExport,locaid:"exportDataNew",onClick:function(){return n.exportDataNew(n)}},{text:t.exportSelected,locaid:"configsExport",onClick:function(){return n.exportSelectedData(!1)}},{text:t.newExportSelected,locaid:"configsExport",onClick:function(){return n.exportSelectedData(!0)}}].map(function(e,t){return x.a.createElement(K,{key:e.text,style:{minWidth:150},onClick:e.onClick},e.text)}))),x.a.createElement(r.a,{style:{float:"right"},pageSizeList:j.e,pageSizePosition:"start",pageSizeSelector:"dropdown",popupProps:{align:"bl tl"},onPageSizeChange:function(e){return n.handlePageSizeChange(e)},current:e.pageNumber,total:e.totalCount,pageSize:this.state.pageSize,onChange:this.changePage.bind(this)})),x.a.createElement(H,{ref:this.showcode}),x.a.createElement(z,{ref:this.deleteDialog})),this.state.hasdash&&x.a.createElement("div",{className:"dash-right-container"},this.state.contentList.map(function(e,t){return x.a.createElement(V,{data:e,height:"auto",key:"show".concat(t)})}))))}}]),a}(x.a.Component)).displayName="ConfigurationManagement",a=t))||a)||a;e.a=S},function(I,e,t){"use strict";t(52);var n=t(33),c=t.n(n),n=(t(171),t(102)),m=t.n(n),n=(t(36),t(10)),y=t.n(n),n=(t(32),t(18)),g=t.n(n),n=(t(51),t(25)),p=t.n(n),r=t(14),a=t(15),o=t(17),i=t(16),n=(t(26),t(8)),n=t.n(n),l=(t(39),t(5)),v=t.n(l),_=t(0),b=t.n(_),h=t(1),f=t(140),l=(t(35),t(19)),w=t.n(l),l=(t(87),t(53)),M=t.n(l),l=(t(59),t(29)),k=t.n(l),s=t(22),S=t(68),E=t(83),x=(0,n.a.config)(((l=function(e){Object(o.a)(n,e);var t=Object(i.a)(n);function n(e){return Object(r.a)(this,n),(e=t.call(this,e)).state={editCluster:{},editClusterDialogVisible:!1},e.show=e.show.bind(Object(s.a)(e)),e}return Object(a.a)(n,[{key:"show",value:function(e){var t=e.metadata,t=void 0===t?{}:t;Object.keys(t).length&&(e.metadataText=JSON.stringify(t,null,"\t")),this.setState({editCluster:e,editClusterDialogVisible:!0})}},{key:"hide",value:function(){this.setState({editClusterDialogVisible:!1})}},{key:"onConfirm",value:function(){var t=this,e=this.props,n=e.openLoading,a=e.closeLoading,r=e.getServiceDetail,e=this.state.editCluster,o=e.name,i=e.serviceName,l=e.metadataText,s=e.defaultCheckPort,u=e.useIPPort4Check,e=e.healthChecker;Object(h.b)({method:"PUT",url:"v1/ns/cluster",data:{serviceName:i,clusterName:o,metadata:l,checkPort:s,useInstancePort4Check:u,healthChecker:JSON.stringify(e)},dataType:"text",beforeSend:function(){return n()},success:function(e){"ok"!==e?p.a.error(e):(t.hide(),r())},complete:function(){return a()}})}},{key:"onChangeCluster",value:function(e){var t=this.state.editCluster;this.setState({editCluster:Object.assign({},void 0===t?{}:t,e)})}},{key:"render",value:function(){function t(e){return n.onChangeCluster({healthChecker:Object.assign({},f,e)})}var n=this,e=this.props.locale,e=void 0===e?{}:e,a=e.updateCluster,r=e.checkType,o=e.checkPort,i=e.useIpPortCheck,l=e.checkPath,s=e.checkHeaders,u=this.state,d=u.editCluster,d=void 0===d?{}:d,u=u.editClusterDialogVisible,c=d.healthChecker,f=void 0===c?{}:c,c=d.useIPPort4Check,p=d.defaultCheckPort,p=void 0===p?"80":p,d=d.metadataText,d=void 0===d?"":d,h=f.type,m=f.path,g=f.headers;return b.a.createElement(w.a,{className:"cluster-edit-dialog",style:{width:600},title:a,visible:u,onOk:function(){return n.onConfirm()},onCancel:function(){return n.hide()},onClose:function(){return n.hide()}},b.a.createElement(v.a,S.a,b.a.createElement(v.a.Item,{label:"".concat(r)},b.a.createElement(k.a,{className:"in-select",defaultValue:h,onChange:function(e){return t({type:e})}},b.a.createElement(k.a.Option,{value:"TCP"},"TCP"),b.a.createElement(k.a.Option,{value:"HTTP"},"HTTP"),b.a.createElement(k.a.Option,{value:"NONE"},"NONE"))),b.a.createElement(v.a.Item,{label:"".concat(o)},b.a.createElement(y.a,{className:"in-text",value:p,onChange:function(e){return n.onChangeCluster({defaultCheckPort:e})}})),b.a.createElement(v.a.Item,{label:"".concat(i)},b.a.createElement(M.a,{checked:c,onChange:function(e){return n.onChangeCluster({useIPPort4Check:e})}})),"HTTP"===h&&[b.a.createElement(v.a.Item,{label:"".concat(l)},b.a.createElement(y.a,{className:"in-text",value:m,onChange:function(e){return t({path:e})}})),b.a.createElement(v.a.Item,{label:"".concat(s)},b.a.createElement(y.a,{className:"in-text",value:g,onChange:function(e){return t({headers:e})}}))],b.a.createElement(v.a.Item,{label:"".concat(e.metadata)},b.a.createElement(E.a,{language:"json",width:"100%",height:200,value:d,onChange:function(e){return n.onChangeCluster({metadataText:e})}}))))}}]),n}(b.a.Component)).displayName="EditClusterDialog",l=l))||l,l=(t(64),t(46)),u=t.n(l),l=(t(63),t(20)),d=t.n(l),C=(0,n.a.config)(((l=function(e){Object(o.a)(n,e);var t=Object(i.a)(n);function n(e){return Object(r.a)(this,n),(e=t.call(this,e)).state={editInstance:{},editInstanceDialogVisible:!1},e.show=e.show.bind(Object(s.a)(e)),e}return Object(a.a)(n,[{key:"show",value:function(e){var t=e.metadata,t=void 0===t?{}:t;Object.keys(t).length&&(e.metadataText=JSON.stringify(t,null,"\t")),this.setState({editInstance:e,editInstanceDialogVisible:!0})}},{key:"hide",value:function(){this.setState({editInstanceDialogVisible:!1})}},{key:"onConfirm",value:function(){var t=this,e=this.props,n=e.serviceName,a=e.clusterName,r=e.groupName,o=e.getInstanceList,i=e.openLoading,l=e.closeLoading,e=this.state.editInstance,s=e.ip,u=e.port,d=e.ephemeral,c=e.weight,f=e.enabled,e=e.metadataText;Object(h.b)({method:"PUT",url:"v1/ns/instance",data:{serviceName:n,clusterName:a,groupName:r,ip:s,port:u,ephemeral:d,weight:c,enabled:f,metadata:e},dataType:"text",beforeSend:function(){return i()},success:function(e){"ok"!==e?p.a.error(e):(t.hide(),o())},error:function(e){return p.a.error(e.responseText||"error")},complete:function(){return l()}})}},{key:"onChangeCluster",value:function(e){var t=this.state.editInstance;this.setState({editInstance:Object.assign({},void 0===t?{}:t,e)})}},{key:"render",value:function(){var t=this,e=this.props.locale,e=void 0===e?{}:e,n=this.state,a=n.editInstanceDialogVisible,n=n.editInstance;return b.a.createElement(w.a,{className:"instance-edit-dialog",title:e.updateInstance,style:{width:600},visible:a,onOk:function(){return t.onConfirm()},onCancel:function(){return t.hide()},onClose:function(){return t.hide()}},b.a.createElement(v.a,S.a,b.a.createElement(v.a.Item,{label:"IP:"},b.a.createElement("p",null,n.ip)),b.a.createElement(v.a.Item,{label:"".concat(e.port)},b.a.createElement("p",null,n.port)),b.a.createElement(v.a.Item,{label:"".concat(e.weight)},b.a.createElement(y.a,{className:"in-text",value:n.weight,onChange:function(e){return t.onChangeCluster({weight:e})}})),b.a.createElement(v.a.Item,{label:"".concat(e.whetherOnline)},b.a.createElement(M.a,{checked:n.enabled,onChange:function(e){return t.onChangeCluster({enabled:e})}})),b.a.createElement(v.a.Item,{label:"".concat(e.metadata)},b.a.createElement(E.a,{language:"json",width:"100%",height:200,value:n.metadataText,onChange:function(e){return t.onChangeCluster({metadataText:e})}}))))}}]),n}(b.a.Component)).displayName="EditInstanceDialog",l=l))||l,l=(0,n.a.config)(((l=function(e){Object(o.a)(n,e);var t=Object(i.a)(n);function n(e){return Object(r.a)(this,n),(e=t.call(this,e)).rowColor=function(e){e=e.healthy;return{className:"row-bg-".concat(S.b["".concat(e)])}},e.editInstanceDialog=b.a.createRef(),e.state={loading:!1,instance:{count:0,list:[]},pageNum:1,pageSize:10},e}return Object(a.a)(n,[{key:"componentDidMount",value:function(){this.getInstanceList()}},{key:"openLoading",value:function(){this.setState({loading:!0})}},{key:"closeLoading",value:function(){this.setState({loading:!1})}},{key:"getInstanceList",value:function(){var e,t=this,n=this.props,a=n.clusterName,r=n.serviceName,o=n.groupName;n.filters;a&&(e=(n=this.state).pageSize,n=n.pageNum,Object(h.b)({url:"v1/ns/catalog/instances",data:{serviceName:r,clusterName:a,groupName:o,pageSize:e,pageNo:n},beforeSend:function(){return t.openLoading()},success:function(e){return t.setState({instance:e})},complete:function(){return t.closeLoading()}}))}},{key:"openInstanceDialog",value:function(e){this.editInstanceDialog.current.getInstance().show(e)}},{key:"switchState",value:function(t,e){var n=this,a=this.state.instance,r=e.ip,o=e.port,i=e.ephemeral,l=e.weight,s=e.enabled,e=e.metadata,u=this.props,d=u.clusterName,c=u.serviceName,u=u.groupName;Object(h.b)({method:"PUT",url:"v1/ns/instance",data:{serviceName:c,clusterName:d,groupName:u,ip:r,port:o,ephemeral:i,weight:l,enabled:!s,metadata:JSON.stringify(e)},dataType:"text",beforeSend:function(){return n.openLoading()},success:function(){var e=Object.assign({},a);e.list[t].enabled=!s,n.setState({instance:e})},error:function(e){return p.a.error(e.responseText||"error")},complete:function(){return n.closeLoading()}})}},{key:"onChangePage",value:function(e){var t=this;this.setState({pageNum:e},function(){return t.getInstanceList()})}},{key:"render",value:function(){var a=this,e=this.props.locale,r=void 0===e?{}:e,e=this.props,t=e.clusterName,n=e.serviceName,e=e.groupName,o=this.state,i=o.instance,l=o.pageSize,o=o.loading,s=L(i.list,this.props.filters),s={count:s.length,list:s};return s.count?b.a.createElement("div",null,b.a.createElement(d.a,{dataSource:s.list,loading:o,rowProps:this.rowColor},b.a.createElement(d.a.Column,{width:138,title:"IP",dataIndex:"ip"}),b.a.createElement(d.a.Column,{width:100,title:r.port,dataIndex:"port"}),b.a.createElement(d.a.Column,{width:100,title:r.ephemeral,dataIndex:"ephemeral",cell:function(e){return"".concat(e)}}),b.a.createElement(d.a.Column,{width:100,title:r.weight,dataIndex:"weight"}),b.a.createElement(d.a.Column,{width:100,title:r.healthy,dataIndex:"healthy",cell:function(e){return"".concat(e)}}),b.a.createElement(d.a.Column,{title:r.metadata,dataIndex:"metadata",cell:function(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{};return t?Object.keys(t).map(function(e){return b.a.createElement("p",null,e,"=",t[e])}):null}}),b.a.createElement(d.a.Column,{title:r.operation,width:160,cell:function(e,t,n){return b.a.createElement("div",null,b.a.createElement(g.a,{type:"normal",className:"edit-btn",onClick:function(){return a.openInstanceDialog(n)}},r.editor),b.a.createElement(g.a,{type:n.enabled?"normal":"secondary",onClick:function(){return a.switchState(t,n)}},r[n.enabled?"offline":"online"]))}})),i.count>l?b.a.createElement(u.a,{className:"pagination",total:i.count,pageSize:l,onChange:function(e){return a.onChangePage(e)}}):null,b.a.createElement(C,{ref:this.editInstanceDialog,serviceName:n,clusterName:t,groupName:e,openLoading:function(){return a.openLoading()},closeLoading:function(){return a.closeLoading()},getInstanceList:function(){return a.getInstanceList()}})):null}}]),n}(b.a.Component)).displayName="InstanceTable",l.defaultProps={filters:new Map},l=l))||l,L=function(e,t){return e.filter(function(e){var n=e.metadata,a=!0;return t.forEach(function(e,t){if(e!==n[t])return a=!1}),a})},T=l,D=t(47),O=t(31),l=(t(175),t(74)),l=t.n(l),N=l.a.Group,P=l.a.Closeable,j=v.a.Item;var R=n.a.config(function(e){function t(){var e;a(),o&&l&&(e=new Map(Array.from(p)).set(o,l),h(e),d(""),f(""),n())}function n(){i(""),s("")}function a(){d(o?"":"error"),f(l?"":"error")}var r=Object(_.useState)(""),o=(r=Object(O.a)(r,2))[0],i=r[1],r=Object(_.useState)(""),l=(r=Object(O.a)(r,2))[0],s=r[1],r=Object(_.useState)(""),u=(r=Object(O.a)(r,2))[0],d=r[1],r=Object(_.useState)(""),c=(r=Object(O.a)(r,2))[0],f=r[1],r=Object(_.useState)(new Map),p=(r=Object(O.a)(r,2))[0],h=r[1],r=void 0===(r=e.locale)?{}:r;return Object(_.useEffect)(function(){e.setFilters(p)},[p]),b.a.createElement(m.a,{contentHeight:"auto",className:"inner-card"},b.a.createElement(v.a,{inline:!0,size:"small"},b.a.createElement(j,{label:r.title},b.a.createElement(j,null,b.a.createElement(y.a,{placeholder:"key",value:o,trim:!0,onChange:function(e){return i(e)},onPressEnter:t,state:u})),b.a.createElement(j,null,b.a.createElement(y.a,{placeholder:"value",value:l,trim:!0,onChange:function(e){return s(e)},onPressEnter:t,state:c})),b.a.createElement(j,{label:""},b.a.createElement(g.a,{type:"primary",onClick:t,style:{marginRight:10}},r.addFilter),0<p.size?b.a.createElement(g.a,{type:"primary",onClick:function(){h(new Map)}},r.clear):""))),b.a.createElement(N,null,Array.from(p).map(function(n){return b.a.createElement(P,{size:"medium",key:n[0],onClose:function(){return e=n[0],(t=new Map(Array.from(p))).delete(e),void h(t);var e,t}},"".concat(n[0]," : ").concat(n[1]))})))}),Y=(t(739),v.a.Item),A={labelCol:{fixedSpan:10},wrapperCol:{span:14}},n=(0,n.a.config)(((l=function(e){Object(o.a)(n,e);var t=Object(i.a)(n);function n(e){var a;return Object(r.a)(this,n),(a=t.call(this,e)).setFilters=function(n){return function(e){var t=a.state.instanceFilters,t=new Map(Array.from(t));t.set(n,e),a.setState({instanceFilters:t})}},a.editServiceDialog=b.a.createRef(),a.editClusterDialog=b.a.createRef(),a.state={serviceName:Object(D.b)(e.location.search,"name"),groupName:Object(D.b)(e.location.search,"groupName"),loading:!1,currentPage:1,clusters:[],instances:{},service:{},pageSize:10,pageNum:{},instanceFilters:new Map},a}return Object(a.a)(n,[{key:"componentDidMount",value:function(){this.state.serviceName?this.getServiceDetail():this.props.history.goBack()}},{key:"getServiceDetail",value:function(){var n=this,e=this.state,t=e.serviceName,e=e.groupName;Object(h.b)({url:"v1/ns/catalog/service?serviceName=".concat(t,"&groupName=").concat(e),beforeSend:function(){return n.openLoading()},success:function(e){var t=e.clusters,e=e.service;return n.setState({service:void 0===e?{}:e,clusters:void 0===t?[]:t})},error:function(e){return p.a.error(e.responseText||"error")},complete:function(){return n.closeLoading()}})}},{key:"openLoading",value:function(){this.setState({loading:!0})}},{key:"closeLoading",value:function(){this.setState({loading:!1})}},{key:"openEditServiceDialog",value:function(){this.editServiceDialog.current.getInstance().show(this.state.service)}},{key:"openClusterDialog",value:function(e){this.editClusterDialog.current.getInstance().show(e)}},{key:"render",value:function(){var t=this,e=this.props.locale,n=void 0===e?{}:e,e=this.state,a=e.serviceName,r=e.groupName,o=e.loading,i=e.service,i=void 0===i?{}:i,l=e.clusters,s=e.instanceFilters,e=i.metadata,e=void 0===e?{}:e,u=i.selector,u=void 0===u?{}:u,d="";return Object.keys(e).length&&(d=JSON.stringify(e,null,"\t")),b.a.createElement("div",{className:"main-container service-detail"},b.a.createElement(c.a,{shape:"flower",tip:"Loading...",className:"loading",visible:o,color:"#333"},b.a.createElement("h1",{style:{position:"relative",width:"100%"}},n.serviceDetails,b.a.createElement(g.a,{type:"primary",className:"header-btn",onClick:function(){return t.props.history.goBack()}},n.back),b.a.createElement(g.a,{type:"normal",className:"header-btn",onClick:function(){return t.openEditServiceDialog()}},n.editService)),b.a.createElement(v.a,A,b.a.createElement(Y,{label:"".concat(n.serviceName)},b.a.createElement(y.a,{value:i.name,readOnly:!0})),b.a.createElement(Y,{label:"".concat(n.groupName)},b.a.createElement(y.a,{value:i.groupName,readOnly:!0})),b.a.createElement(Y,{label:"".concat(n.protectThreshold)},b.a.createElement(y.a,{value:i.protectThreshold,readOnly:!0})),b.a.createElement(Y,{label:"".concat(n.metadata)},b.a.createElement(E.a,{language:"json",width:"100%",height:200,value:d,options:S.c})),b.a.createElement(Y,{label:"".concat(n.type)},b.a.createElement(y.a,{value:u.type,readOnly:!0})),"none"!==u.type&&b.a.createElement(Y,{label:"".concat(n.selector)},b.a.createElement(y.a,{value:u.expression,readOnly:!0}))),l.map(function(e){return b.a.createElement(m.a,{key:e.name,className:"cluster-card",title:"".concat(n.cluster),subTitle:e.name,contentHeight:"auto",extra:b.a.createElement(g.a,{type:"normal",onClick:function(){return t.openClusterDialog(e)}},n.editCluster)},b.a.createElement(R,{setFilters:t.setFilters(e.name),locale:n.InstanceFilter}),b.a.createElement(T,{clusterName:e.name,serviceName:a,groupName:r,filters:s.get(e.name)}))})),b.a.createElement(f.a,{ref:this.editServiceDialog,openLoading:function(){return t.openLoading()},closeLoading:function(){return t.closeLoading()},getServiceDetail:function(){return t.getServiceDetail()}}),b.a.createElement(x,{ref:this.editClusterDialog,openLoading:function(){return t.openLoading()},closeLoading:function(){return t.closeLoading()},getServiceDetail:function(){return t.getServiceDetail()}}))}}]),n}(b.a.Component)).displayName="ServiceDetail",t=l))||t;e.a=n},function(e,t,n){"use strict";n(52);var a=n(33),d=n.n(a),a=(n(63),n(20)),c=n.n(a),a=(n(32),n(18)),f=n.n(a),a=(n(35),n(19)),s=n.n(a),r=n(14),o=n(15),i=n(17),l=n(16),a=(n(26),n(8)),a=n.n(a),u=n(0),p=n.n(u),h=n(48),u=(n(36),n(10)),m=n.n(u),u=(n(49),n(27)),g=n.n(u),y=n(22),u=(n(39),n(5)),v=n.n(u),_=n(1),b=(n(635),v.a.Item),w={labelCol:{fixedSpan:6},wrapperCol:{span:18}},M=(0,a.a.config)(((u=function(e){Object(i.a)(n,e);var t=Object(l.a)(n);function n(e){return Object(r.a)(this,n),(e=t.call(this,e)).state={dialogvisible:!1,loading:!1,disabled:!1,dataSource:[]},e.field=new g.a(Object(y.a)(e)),e.disabled=!1,e}return Object(o.a)(n,[{key:"componentDidMount",value:function(){this.groupLabel=document.getElementById("groupwrapper")}},{key:"openDialog",value:function(e){this.setState({dialogvisible:!0,disabled:!1,dataSource:e}),this.disabled=!1}},{key:"closeDialog",value:function(){this.setState({dialogvisible:!1})}},{key:"openLoading",value:function(){this.setState({loading:!0})}},{key:"closeLoading",value:function(){this.setState({loading:!1})}},{key:"showGroup",value:function(){this.groupLabel.style.display="block"}},{key:"hideGroup",value:function(){this.groupLabel.style.display="none"}},{key:"changeType",value:function(e){0===e?this.showGroup():this.hideGroup()}},{key:"handleSubmit",value:function(){var a=this,e=this.props.locale,r=void 0===e?{}:e;this.field.validate(function(e,t){var n;e||(a.disabled=!0,a.setState({disabled:!0}),n=(n=t.customNamespaceId)||"",Object(_.b)({type:"get",url:"v1/console/namespaces?checkNamespaceIdExist=true",contentType:"application/x-www-form-urlencoded",beforeSend:function(){return a.openLoading()},data:{customNamespaceId:n},success:function(e){a.disabled=!1,a.setState({disabled:!1}),!0===e?s.a.alert({title:r.notice,content:r.namespaceIdAlreadyExist}):Object(_.b)({type:"post",url:"v1/console/namespaces",contentType:"application/x-www-form-urlencoded",beforeSend:function(){return a.openLoading()},data:{customNamespaceId:n,namespaceName:t.namespaceShowName,namespaceDesc:t.namespaceDesc},success:function(e){a.disabled=!1,a.setState({disabled:!1}),!0===e?(a.closeDialog(),a.props.getNameSpaces(),a.refreshNameSpace()):s.a.alert({title:r.notice,content:r.newnamespceFailedMessage})},complete:function(){return a.closeLoading()}})},complete:function(){return a.closeLoading()}}))})}},{key:"refreshNameSpace",value:function(){setTimeout(function(){Object(_.b)({type:"get",url:"v1/console/namespaces",success:function(e){200===e.code&&(window.namespaceList=e.data)}})},2e3)}},{key:"validateChart",value:function(e,t,n){var a=this.props.locale,a=void 0===a?{}:a;/[@#\$%\^&\*]+/g.test(t)?n(a.input):n()}},{key:"validateNamespzecId",value:function(e,t,n){var a,r;t&&""!==t.trim()?(a=void 0===(a=this.props.locale)?{}:a,128<t.length&&n(a.namespaceIdTooLong),!(r=t.match(/^[\w-]+/g))||1<r.length||t.length!==r[0].length?n(a.input):n()):n()}},{key:"render",value:function(){var e=this.props.locale,e=void 0===e?{}:e,t=p.a.createElement("div",null,p.a.createElement(f.a,{type:"primary",onClick:this.handleSubmit.bind(this),disabled:this.disabled},e.ok),p.a.createElement(f.a,{type:"normal",onClick:this.closeDialog.bind(this),style:{marginLeft:5}},e.cancel));return p.a.createElement("div",null,p.a.createElement(s.a,{title:e.newnamespce,style:{width:"50%"},visible:this.state.dialogvisible,onOk:this.handleSubmit.bind(this),onCancel:this.closeDialog.bind(this),footer:t,onClose:this.closeDialog.bind(this)},p.a.createElement(v.a,{field:this.field},p.a.createElement(d.a,{tip:e.loading,style:{width:"100%",position:"relative"},visible:this.state.loading},p.a.createElement(b,Object.assign({label:e.namespaceId},w),p.a.createElement(m.a,Object.assign({},this.field.init("customNamespaceId",{rules:[{validator:this.validateNamespzecId.bind(this)}]}),{style:{width:"100%"}}))),p.a.createElement(b,Object.assign({label:e.name,required:!0},w),p.a.createElement(m.a,Object.assign({},this.field.init("namespaceShowName",{rules:[{required:!0,message:e.namespacenotnull},{validator:this.validateChart.bind(this)}]}),{style:{width:"100%"}}))),p.a.createElement(b,Object.assign({label:e.description,required:!0},w),p.a.createElement(m.a,Object.assign({},this.field.init("namespaceDesc",{rules:[{required:!0,message:e.namespacedescnotnull},{validator:this.validateChart.bind(this)}]}),{style:{width:"100%"}})))))))}}]),n}(p.a.Component)).displayName="NewNameSpace",u=u))||u,k=(n(636),v.a.Item),S=(0,a.a.config)(((u=function(e){Object(i.a)(n,e);var t=Object(l.a)(n);function n(e){return Object(r.a)(this,n),(e=t.call(this,e)).state={dialogvisible:!1,loading:!1},e.field=new g.a(Object(y.a)(e)),e}return Object(o.a)(n,[{key:"openDialog",value:function(e){this.getNamespaceDetail(e),this.setState({dialogvisible:!0,type:e.type})}},{key:"closeDialog",value:function(){this.setState({dialogvisible:!1})}},{key:"openLoading",value:function(){this.setState({loading:!0})}},{key:"closeLoading",value:function(){this.setState({loading:!1})}},{key:"getNamespaceDetail",value:function(e){var t=this,n=this.props.locale,a=void 0===n?{}:n;this.field.setValues(e),Object(_.b)({type:"get",url:"v1/console/namespaces?show=all&namespaceId=".concat(e.namespace),success:function(e){null!==e?t.field.setValue("namespaceDesc",e.namespaceDesc):s.a.alert({title:a.notice,content:e.message})},error:function(){window.namespaceList=[],t.handleNameSpaces(window.namespaceList)}})}},{key:"handleSubmit",value:function(){var n=this,e=this.props.locale,a=void 0===e?{}:e;this.field.validate(function(e,t){e||Object(_.b)({type:"put",beforeSend:function(){n.openLoading()},url:"v1/console/namespaces",contentType:"application/x-www-form-urlencoded",data:{namespace:t.namespace,namespaceShowName:t.namespaceShowName,namespaceDesc:t.namespaceDesc},success:function(e){!0===e?(n.closeDialog(),n.props.getNameSpaces(),n.refreshNameSpace()):s.a.alert({title:a.notice,content:e.message})},complete:function(){n.closeLoading()}})})}},{key:"refreshNameSpace",value:function(){setTimeout(function(){Object(_.b)({type:"get",url:"v1/console/namespaces",success:function(e){200===e.code&&(window.namespaceList=e.data)}})},2e3)}},{key:"validateChart",value:function(e,t,n){var a=this.props.locale,a=void 0===a?{}:a;/[@#\$%\^&\*]+/g.test(t)?n(a.pleaseDo):n()}},{key:"render",value:function(){var e=this.props.locale,e=void 0===e?{}:e,t={labelCol:{fixedSpan:6},wrapperCol:{span:18}},n=0===this.state.type?p.a.createElement("div",null):p.a.createElement(f.a,{type:"primary",onClick:this.handleSubmit.bind(this)},e.publicSpace);return p.a.createElement("div",null,p.a.createElement(s.a,{title:e.confirmModify,style:{width:"50%"},visible:this.state.dialogvisible,footer:n,onCancel:this.closeDialog.bind(this),onClose:this.closeDialog.bind(this)},p.a.createElement(d.a,{tip:e.editNamespace,style:{width:"100%",position:"relative"},visible:this.state.loading},p.a.createElement(v.a,{field:this.field},p.a.createElement(k,Object.assign({label:e.load,required:!0},t),p.a.createElement(m.a,Object.assign({},this.field.init("namespaceShowName",{rules:[{required:!0,message:e.namespace},{validator:this.validateChart.bind(this)}]}),{disabled:0===this.state.type}))),p.a.createElement(k,Object.assign({label:e.description,required:!0},t),p.a.createElement(m.a,Object.assign({},this.field.init("namespaceDesc",{rules:[{required:!0,message:e.namespaceDesc},{validator:this.validateChart.bind(this)}]}),{disabled:0===this.state.type})))))))}}]),n}(p.a.Component)).displayName="EditorNameSpace",u=u))||u,a=(n(637),(0,a.a.config)(((u=function(e){Object(i.a)(n,e);var t=Object(l.a)(n);function n(e){return Object(r.a)(this,n),(e=t.call(this,e)).editgroup=p.a.createRef(),e.newnamespace=p.a.createRef(),e.state={loading:!1,defaultNamespace:"",defaultNamespaceName:"public",dataSource:[]},e}return Object(o.a)(n,[{key:"componentDidMount",value:function(){this.getNameSpaces(0)}},{key:"getNameSpaces",value:function(){var a=this,e=this.props.locale,r=(void 0===e?{}:e).prompt,t=this;t.openLoading(),Object(_.b)({type:"get",beforeSend:function(){},url:"v1/console/namespaces",success:function(e){if(200===e.code){var t=e.data||[];window.namespaceList=t;for(var n=0;n<t.length;n++)1===t[n].type&&a.setState({defaultNamespace:t[n].namespace});a.setState({dataSource:t})}else s.a.alert({title:r,content:e.message})},complete:function(){t.closeLoading()},error:function(e){window.namespaceList=[{namespace:"",namespaceShowName:"鍏叡绌洪棿",type:0}]}})}},{key:"openLoading",value:function(){this.setState({loading:!0})}},{key:"closeLoading",value:function(){this.setState({loading:!1})}},{key:"detailNamespace",value:function(e){var t=this,n=this.props.locale,n=void 0===n?{}:n,a=n.namespaceDetails,r=n.namespaceName,o=n.namespaceID,i=n.configuration,l=n.description,n=e.namespace;Object(_.b)({url:"v1/console/namespaces?show=all&namespaceId=".concat(n),beforeSend:function(){t.openLoading()},success:function(e){null!==e&&s.a.alert({style:{width:"500px"},needWrapper:!1,title:a,content:p.a.createElement("div",null,p.a.createElement("div",{style:{marginTop:"10px"}},p.a.createElement("p",null,p.a.createElement("span",{style:{color:"#999",marginRight:5}},"".concat(r)),p.a.createElement("span",{style:{color:"#c7254e"}},e.namespaceShowName)),p.a.createElement("p",null,p.a.createElement("span",{style:{color:"#999",marginRight:5}},"".concat(o)),p.a.createElement("span",{style:{color:"#c7254e"}},e.namespace)),p.a.createElement("p",null,p.a.createElement("span",{style:{color:"#999",marginRight:5}},"".concat(i)),p.a.createElement("span",{style:{color:"#c7254e"}},e.configCount," / ",e.quota)),p.a.createElement("p",null,p.a.createElement("span",{style:{color:"#999",marginRight:5}},"".concat(l)),p.a.createElement("span",{style:{color:"#c7254e"}},e.namespaceDesc))))})},complete:function(){t.closeLoading()}})}},{key:"removeNamespace",value:function(n){var a=this,e=this.props.locale,e=void 0===e?{}:e,t=e.removeNamespace,r=e.confirmDelete,o=e.namespaceName,i=e.namespaceID,l=(e.configurationManagement,e.deletedFailure);s.a.confirm({title:t,content:p.a.createElement("div",{style:{marginTop:"-20px"}},p.a.createElement("h3",null,r),p.a.createElement("p",null,p.a.createElement("span",{style:{color:"#999",marginRight:5}},"".concat(o)),p.a.createElement("span",{style:{color:"#c7254e"}},n.namespaceShowName)),p.a.createElement("p",null,p.a.createElement("span",{style:{color:"#999",marginRight:5}},"".concat(i)),p.a.createElement("span",{style:{color:"#c7254e"}},n.namespace))),onOk:function(){var e="v1/console/namespaces?namespaceId=".concat(n.namespace);Object(_.b)({url:e,type:"delete",success:function(e){var t;!0===e?(t=Object(_.a)("namespace"),n.namespace===t&&(Object(_.c)("namespace",a.state.defaultNamespace),Object(_.c)("namespaceShowName",a.state.defaultNamespaceName),window.nownamespace=a.state.defaultNamespace,window.namespaceShowName=a.state.defaultNamespaceName)):s.a.alert({content:e.message,title:l}),a.getNameSpaces()}})}})}},{key:"refreshNameSpace",value:function(){Object(_.b)({type:"get",url:"v1/console/namespaces",success:function(e){200===e.code&&(window.namespaceList=e.data)},error:function(e){window.namespaceList=[{namespace:"",namespaceShowName:"鍏叡绌洪棿",type:0}]}})}},{key:"openToEdit",value:function(e){this.editgroup.current.getInstance().openDialog(e)}},{key:"renderOption",value:function(e,t,n){var a=this.props.locale,a=void 0===a?{}:a,r=a.namespaceDelete,o=a.details,a=a.edit,i=p.a.createElement("a",{onClick:this.removeNamespace.bind(this,n),style:{marginRight:10}},r),r=(1!==n.type&&0!==n.type||(i=p.a.createElement("span",{style:{marginRight:10,cursor:"not-allowed",color:"#999"},disabled:!0},r)),p.a.createElement("a",{onClick:this.detailNamespace.bind(this,n),style:{marginRight:10}},o)),o=p.a.createElement("a",{onClick:this.openToEdit.bind(this,n)},a);return 0!==n.type&&1!==n.type||(o=p.a.createElement("span",{style:{marginRight:10,cursor:"not-allowed",color:"#999"},disabled:!0},a)),p.a.createElement("div",null,r,i,o)}},{key:"addNameSpace",value:function(){this.newnamespace.current.getInstance().openDialog(this.state.dataSource)}},{key:"renderName",value:function(e,t,n){var a=this.props.locale,a=(void 0===a?{}:a).namespacePublic,r=n.namespaceShowName;return 0===n.type&&(r=a),p.a.createElement("div",null,r)}},{key:"render",value:function(){var e=this,t=this.props.locale,t=void 0===t?{}:t,n=t.pubNoData,a=t.namespace,r=t.namespaceAdd,o=t.namespaceNames,i=t.description,l=t.namespaceNumber,s=t.configuration,u=t.namespaceOperation;return p.a.createElement(p.a.Fragment,null,p.a.createElement(h.a,{left:a}),p.a.createElement("div",{className:"fusion-demo"},p.a.createElement(d.a,{shape:"flower",tip:"Loading...",color:"#333",style:{width:"100%"},visible:this.state.loading},p.a.createElement("div",null,p.a.createElement("div",{style:{textAlign:"right",marginBottom:10}},p.a.createElement(f.a,{type:"primary",style:{marginRight:20,marginTop:10},onClick:this.addNameSpace.bind(this)},r),p.a.createElement(f.a,{style:{marginRight:0,marginTop:10},type:"secondary",onClick:function(){return e.getNameSpaces()}},t.refresh)),p.a.createElement("div",null,p.a.createElement(c.a,{dataSource:this.state.dataSource,locale:{empty:n}},p.a.createElement(c.a.Column,{title:o,dataIndex:"namespaceShowName",cell:this.renderName.bind(this)}),p.a.createElement(c.a.Column,{title:l,dataIndex:"namespace"}),p.a.createElement(c.a.Column,{title:i,dataIndex:"namespaceDesc"}),p.a.createElement(c.a.Column,{title:s,dataIndex:"configCount"}),p.a.createElement(c.a.Column,{title:u,dataIndex:"time",cell:this.renderOption.bind(this)})))),p.a.createElement(M,{ref:this.newnamespace,getNameSpaces:this.getNameSpaces.bind(this)}),p.a.createElement(S,{ref:this.editgroup,getNameSpaces:this.getNameSpaces.bind(this)}))))}}]),n}(p.a.Component)).displayName="NameSpace",n=u))||n);t.a=a},function(e,t,n){"use strict";n(52);var a=n(33),l=n.n(a),a=(n(32),n(18)),s=n.n(a),a=(n(36),n(10)),u=n.n(a),a=(n(49),n(27)),r=n.n(a),a=(n(35),n(19)),d=n.n(a),c=n(31),o=n(14),i=n(15),f=n(22),p=n(17),h=n(16),a=(n(26),n(8)),a=n.n(a),m=(n(66),n(41)),m=n.n(m),g=(n(39),n(5)),y=n.n(g),g=(n(132),n(60)),v=n.n(g),g=n(0),_=n.n(g),b=n(1),w=n(47),M=n(90),k=(n(685),n(34)),g=(n(59),n(29)),S=n.n(g),g=n(37),n=n(82),E=y.a.Item,x=S.a.Option,C={labelCol:{fixedSpan:4},wrapperCol:{span:19}},L=Object(g.b)(function(e){return{namespaces:e.namespace.namespaces}},{getNamespaces:n.b})(n=(0,a.a.config)(((g=function(e){Object(p.a)(n,e);var t=Object(h.a)(n);function n(e){return Object(o.a)(this,n),(e=t.call(this,e)).field=new r.a(Object(f.a)(e)),e.state={namespacesDataSource:[]},e}return Object(i.a)(n,[{key:"componentDidMount",value:function(){this.getNamespaces()}},{key:"getNamespaces",value:function(){var t=this;Object(b.b)({type:"get",url:"v1/console/namespaces",success:function(e){200===e.code?(t.state.namespacesDataSource,t.setState({namespacesDataSource:e.data})):d.a.alert({title:prompt,content:e.message})},error:function(e){window.namespaceList=[{namespace:"",namespaceShowName:"鍏叡绌洪棿",type:0}]}})}},{key:"render",value:function(){var t=this,e=this.props.locale,e=void 0===e?{}:e,n=this.field.getError,a=this.props,r=a.visible,o=a.onOk,i=a.onCancel,l=a.dataId,a=a.group,s=this.state.namespacesDataSource;return _.a.createElement(_.a.Fragment,null,_.a.createElement(d.a,{title:e.configComparisonTitle,visible:r,onOk:function(){var e=Object.keys({dataId:"dataId",group:"group",namespace:"namespace"}).map(function(e){return t.field.getValue(e)});o(e)},onClose:i,onCancel:i,afterClose:function(){return t.field.reset()}},_.a.createElement(y.a,Object.assign({style:{width:430}},C,{field:this.field}),_.a.createElement(E,{label:"namespace",help:n("namespace")},_.a.createElement(S.a,{name:"namespace",placeholder:e.namespaceSelect,style:{width:"100%"}},s.map(function(e){var t=e.namespace,e=e.namespaceShowName;return _.a.createElement(x,{value:t},e," ",t?"(".concat(t,")"):"")}))),_.a.createElement(E,{label:"Data Id",required:!0,help:n("Data Id")},_.a.createElement(u.a,{name:"dataId",trim:!0,placeholder:e.dataIdInput,defaultValue:l})),_.a.createElement(E,{label:"Group",required:!0,help:n("Group")},_.a.createElement(u.a,{name:"group",trim:!0,placeholder:e.configComparison,defaultValue:a})))))}}]),n}(_.a.Component)).displayName="ConfigCompare",n=g))||n)||n,T=v.a.Item,D=y.a.Item,O=m.a.Row,N=m.a.Col,m=(0,a.a.config)(((g=function(e){Object(p.a)(n,e);var t=Object(h.a)(n);function n(e){var l;return Object(o.a)(this,n),(l=t.call(this,e)).openCompare=function(e){var e=Object(c.a)(e,3),t=e[0],n=e[1],e=e[2],a=Object(f.a)(l),r=l.props.locale,o=void 0===r?{}:r,i=l.monacoEditor.getValue();k.a.get("v1/cs/configs",{params:{show:"all",group:n,dataId:t,tenant:e}}).then(function(e){null!=e&&""!==e?(e=e.content,i=i.replace(/\r\n/g,"\n").replace(/\n/g,"\r\n"),e=e.replace(/\r\n/g,"\n").replace(/\n/g,"\r\n"),a.compareEditorDialog.current.getInstance().openDialog(i,e)):d.a.alert({title:o.error,content:o.configNotFind})})},l.state={loading:!1,showmore:!1,activeKey:"normal",hasbeta:!1,ips:"",checkedBeta:!1,switchEncrypt:!1,tag:[],editorClass:"editor-normal"},l.field=new r.a(Object(f.a)(l)),l.dataId=Object(b.a)("dataId")||"yanlin",l.group=Object(b.a)("group")||"DEFAULT_GROUP",l.ips="",l.valueMap={},l.tenant=Object(b.a)("namespace")||"",l.searchDataId=Object(b.a)("searchDataId")||"",l.searchGroup=Object(b.a)("searchGroup")||"",l.pageSize=Object(b.a)("pageSize"),l.pageNo=Object(b.a)("pageNo"),l.diffEditorDialog=_.a.createRef(),l.compareEditorDialog=_.a.createRef(),l}return Object(i.a)(n,[{key:"componentDidMount",value:function(){this.initData(),this.getDataDetail(),this.initFullScreenEvent()}},{key:"initData",value:function(){var e=this.props.locale,e=void 0===e?{}:e;this.dataId.startsWith("cipher-")&&this.setState({switchEncrypt:!0}),this.setState({tag:[{title:e.official,key:"normal"}]})}},{key:"initFullScreenEvent",value:function(){var t=this;document.body.addEventListener("keydown",function(e){"F1"===e.key&&(e.preventDefault(),t.setState({editorClass:"editor-full-screen"})),"Escape"===e.key&&t.setState({editorClass:"editor-normal"})})}},{key:"openLoading",value:function(){this.setState({loading:!0})}},{key:"closeLoading",value:function(){this.setState({loading:!1})}},{key:"changeTab",value:function(e){var t=e.split("-")[0],t=this.valueMap[t];this.setState({activeKey:e}),this.field.setValue("content",t.content),t.betaIps&&this.setState({ips:t.betaIps})}},{key:"toggleMore",value:function(){this.setState({showmore:!this.state.showmore})}},{key:"getDataDetail",value:function(){var e=this.props.locale,n=void 0===e?{}:e,a=this,e=(this.serverId=Object(b.a)("serverId")||"center",this.tenant=Object(b.a)("namespace")||"",this.edasAppName=Object(b.a)("edasAppName")||"",this.inApp=this.edasAppName,"v1/cs/configs?show=all&dataId=".concat(this.dataId,"&group=").concat(this.group));Object(b.b)({url:e,beforeSend:function(){a.openLoading()},success:function(e){var t;null!=e?(a.valueMap.normal=t=e,a.field.setValue("dataId",t.dataId),a.field.setValue("content",t.content),a.field.setValue("appName",a.inApp?a.edasAppName:t.appName),a.field.setValue("envs",a.serverId),a.field.setValue("group",t.group),a.field.setValue("config_tags",t.configTags),a.field.setValue("desc",t.desc),a.field.setValue("md5",t.md5),a.field.setValue("type",t.type),a.initMoacoEditor(t.type,t.content)):d.a.alert({title:n.error,content:e.message})},complete:function(){a.closeLoading()}})}},{key:"goList",value:function(){this.props.history.push(Object(w.a)("/configurationManagement",{serverId:this.serverId,group:this.searchGroup,dataId:this.searchDataId,namespace:this.tenant,pageNo:this.pageNo,pageSize:this.pageSize}))}},{key:"initMoacoEditor",value:function(e,t){var n=this,a=document.getElementById("container"),r=(a.innerHTML="",{value:t,language:e,codeLens:!(this.monacoEditor=null),selectOnLineNumbers:!0,roundedSelection:!1,readOnly:!0,lineNumbersMinChars:!0,theme:"vs-dark",wordWrapColumn:120,folding:!1,showFoldingControls:"always",wordWrap:"wordWrapColumn",cursorStyle:"line",automaticLayout:!0});window.monaco?this.monacoEditor=window.monaco.editor.create(a,r):window.importEditor(function(){n.monacoEditor=window.monaco.editor.create(a,r)})}},{key:"openDiff",value:function(){var n=this,e=this.props.locale,a=void 0===e?{}:e,r=this.monacoEditor.getValue(),e="v1/cs/history/previous?id=".concat(this.valueMap.normal.id,"&dataId=").concat(this.dataId,"&group=").concat(this.group);Object(b.b)({url:e,beforeSend:function(){n.openLoading()},success:function(e){var t;null!=e?(t=e.content,r=r.replace(/\r\n/g,"\n").replace(/\n/g,"\r\n"),t=t.replace(/\r\n/g,"\n").replace(/\n/g,"\r\n"),n.diffEditorDialog.current.getInstance().openDialog(r,t)):d.a.alert({title:a.error,content:e.message})},complete:function(){n.closeLoading()}})}},{key:"onClickConfigCompare",value:function(){this.setState({configCompareVisible:!0})}},{key:"closeConfigCompare",value:function(){this.setState({configCompareVisible:!1})}},{key:"render",value:function(){var t=this,e=this.props.locale,e=void 0===e?{}:e,n=this.state,a=n.configCompareVisible,n=n.editorClass,r=this.field.init,o={labelCol:{span:2},wrapperCol:{span:22}},i=this.state.activeKey.split("-")[0];return _.a.createElement("div",null,_.a.createElement(l.a,{shape:"flower",tip:"Loading...",style:{width:"100%",position:"relative"},visible:this.state.loading,color:"#333"},_.a.createElement("h1",{style:{position:"relative",width:"100%"}},e.configurationDetails),this.state.hasbeta?_.a.createElement("div",{style:{display:"inline-block",height:40,width:"80%",overflow:"hidden"}},_.a.createElement(v.a,{shape:"wrapped",onChange:this.changeTab.bind(this),lazyLoad:!1,activeKey:this.state.activeKey},this.state.tag.map(function(e){return _.a.createElement(T,{title:e.title,key:e.key})}))):"",_.a.createElement(y.a,Object.assign({inline:!1,field:this.field},o),_.a.createElement(D,{label:e.namespace,required:!0},_.a.createElement("p",null,this.tenant)),_.a.createElement(D,{label:"Data ID",required:!0},_.a.createElement(u.a,Object.assign({htmlType:"text",readOnly:!0},r("dataId")))),_.a.createElement(D,{label:"Group",required:!0},_.a.createElement(u.a,Object.assign({htmlType:"text",readOnly:!0},r("group")))),_.a.createElement(D,{label:" "},_.a.createElement("div",null,_.a.createElement("a",{style:{fontSize:"12px"},onClick:this.toggleMore.bind(this)},this.state.showmore?e.collapse:e.more))),_.a.createElement(D,{label:e.home,className:"more-item".concat(this.state.showmore?"":" hide")},_.a.createElement(u.a,Object.assign({htmlType:"text",readOnly:!0},r("appName")))),_.a.createElement(D,{label:e.tags,className:"more-item".concat(this.state.showmore?"":" hide")},_.a.createElement(u.a,Object.assign({htmlType:"text",readOnly:!0},r("config_tags")))),_.a.createElement(D,Object.assign({label:e.description},o),_.a.createElement(u.a.TextArea,Object.assign({htmlType:"text",multiple:!0,rows:3,readOnly:!0},r("desc")))),"normal"===i?"":_.a.createElement(D,{label:e.betaRelease},_.a.createElement("div",{style:{width:"100%"},id:"betaips"},_.a.createElement(u.a.TextArea,{multiple:!0,style:{width:"100%"},value:this.state.ips,readOnly:!0,placeholder:"127.0.0.1,127.0.0.2"}))),_.a.createElement(D,{label:"MD5:",required:!0},_.a.createElement(u.a,Object.assign({htmlType:"text",readOnly:!0},r("md5")))),_.a.createElement(D,{label:e.configuration,required:!0},_.a.createElement("div",{className:n,id:"container",style:{minHeight:500}}))),_.a.createElement(O,null,_.a.createElement(N,{span:"24",className:"button-list"},_.a.createElement(s.a,{type:"primary",onClick:function(){return t.onClickConfigCompare()}},e.configComparison)," ",_.a.createElement(s.a,{type:"primary",onClick:this.openDiff.bind(this)},e.versionComparison)," ",_.a.createElement(s.a,{type:"normal",onClick:this.goList.bind(this)},e.back))),_.a.createElement(M.a,{ref:this.diffEditorDialog,title:e.versionComparison,currentArea:e.dialogCurrentArea,originalArea:e.dialogOriginalArea}),_.a.createElement(M.a,{ref:this.compareEditorDialog,title:e.configComparison,currentArea:e.dialogCurrentConfig,originalArea:e.dialogComparedConfig})),_.a.createElement(L,{visible:a,dataId:this.dataId,group:this.group,onOk:function(e){t.openCompare(e)},onCancel:function(){return t.closeConfigCompare()}}))}}]),n}(_.a.Component)).displayName="ConfigDetail",n=g))||n;t.a=m},function(e,t,n){"use strict";n(64);var a=n(46),s=n.n(a),a=(n(35),n(19)),u=n.n(a),a=(n(63),n(20)),d=n.n(a),a=(n(32),n(18)),c=n.n(a),a=(n(87),n(53)),f=n.n(a),a=(n(39),n(5)),p=n.n(a),a=(n(36),n(10)),h=n.n(a),i=n(14),l=n(15),m=n(22),g=n(17),y=n(16),a=(n(26),n(8)),a=n.n(a),r=n(0),v=n.n(r),r=n(37),_=n(45),b=n(48),o=(n(59),n(29)),w=n.n(o),o=(n(49),n(27)),M=n.n(o),k=p.a.Item,S={labelCol:{fixedSpan:4},wrapperCol:{span:19}},E=Object(r.b)(function(e){return{users:e.authority.users}},{searchUsers:_.m})(o=(0,a.a.config)(((o=function(e){Object(g.a)(o,e);var r=Object(y.a)(o);function o(){var t;Object(i.a)(this,o);for(var e=arguments.length,n=new Array(e),a=0;a<e;a++)n[a]=arguments[a];return(t=r.call.apply(r,[this].concat(n))).field=new M.a(Object(m.a)(t)),t.state={dataSource:[]},t.handleChange=function(e){0<e.length&&Object(_.m)(e).then(function(e){t.setState({dataSource:e})})},t}return Object(l.a)(o,[{key:"check",value:function(){var n=this,e=this.props.locale,a={role:e.roleError,username:e.usernameError},e=Object.keys(a).map(function(e){var t=n.field.getValue(e);return t||n.field.setError(e,a[e]),t});return 2===e.filter(function(e){return e}).length?e:null}},{key:"render",value:function(){var t=this,e=this.props.locale,n=this.field.getError,a=this.props,r=a.visible,o=a.onOk,i=a.onCancel;return v.a.createElement(v.a.Fragment,null,v.a.createElement(u.a,{title:e.bindingRoles,visible:r,onOk:function(){var e=t.check();e&&o(e).then(function(){return i()})},onClose:i,onCancel:i,afterClose:function(){return t.field.reset()}},v.a.createElement(p.a,Object.assign({style:{width:400}},S,{field:this.field}),v.a.createElement(k,{label:e.role,required:!0,help:n("role")},v.a.createElement(h.a,{name:"role",trim:!0,placeholder:e.rolePlaceholder})),v.a.createElement(k,{label:e.username,required:!0,help:n("username")},v.a.createElement(w.a.AutoComplete,{name:"username",style:{width:316},filterLocal:!1,placeholder:e.usernamePlaceholder,onChange:this.handleChange,dataSource:this.state.dataSource})))))}}]),o}(v.a.Component)).displayName="NewRole",o=o))||o)||o,r=(n(743),Object(r.b)(function(e){return{roles:e.authority.roles}},{getRoles:_.i})(n=(0,a.a.config)(((o=function(e){Object(g.a)(n,e);var t=Object(y.a)(n);function n(e){return Object(i.a)(this,n),(e=t.call(this,e)).state={loading:!0,pageNo:1,pageSize:9,role:"",defaultFuzzySearch:!0},e.handleDefaultFuzzySwitchChange=e.handleDefaultFuzzySwitchChange.bind(Object(m.a)(e)),e}return Object(l.a)(n,[{key:"componentDidMount",value:function(){this.getRoles()}},{key:"getRoles",value:function(){var e=this,t=(this.setState({loading:!0}),this.state),n=t.pageNo,t=t.pageSize,a=this.state,r=a.username,a=a.role,o="accurate";this.state.defaultFuzzySearch&&(r&&""!==r&&(r="*".concat(r,"*")),a&&""!==a&&(a="*".concat(a,"*"))),a&&-1!==a.indexOf("*")&&(o="blur"),r&&-1!==r.indexOf("*")&&(o="blur"),this.props.getRoles({pageNo:n,pageSize:t,role:a,username:r,search:o}).then(function(){e.state.loading&&e.setState({loading:!1})}).catch(function(){return e.setState({loading:!1})})}},{key:"colseCreateRole",value:function(){this.setState({createRoleVisible:!1})}},{key:"handleDefaultFuzzySwitchChange",value:function(){this.setState({defaultFuzzySearch:!this.state.defaultFuzzySearch})}},{key:"render",value:function(){var a=this,e=this.props,t=e.roles,r=e.locale,e=this.state,n=e.loading,o=e.pageSize,i=e.pageNo,l=e.createRoleVisible;e.passwordResetUser;return v.a.createElement(v.a.Fragment,null,v.a.createElement(b.a,{left:r.roleManagement}),v.a.createElement(p.a,{inline:!0},v.a.createElement(p.a.Item,{label:"鐢ㄦ埛鍚�"},v.a.createElement(h.a,{value:this.state.username,htmlType:"text",placeholder:this.state.defaultFuzzySearch?r.defaultFuzzyd:r.fuzzyd,style:{width:200},onChange:function(e){a.setState({username:e})}})),v.a.createElement(p.a.Item,{label:"瑙掕壊鍚�"},v.a.createElement(h.a,{value:this.state.role,htmlType:"text",placeholder:this.state.defaultFuzzySearch?r.defaultFuzzyd:r.fuzzyd,style:{width:200},onChange:function(e){a.setState({role:e})}})),v.a.createElement(p.a.Item,{label:"榛樿妯$硦鍖归厤"},v.a.createElement(f.a,{checkedChildren:"",unCheckedChildren:"",defaultChecked:this.state.defaultFuzzySearch,onChange:this.handleDefaultFuzzySwitchChange,title:"鑷姩鍦ㄦ悳绱㈠弬鏁板墠鍚庡姞涓�*"})),v.a.createElement(p.a.Item,{label:""},v.a.createElement(c.a,{type:"primary",style:{marginRight:10},onClick:function(){return a.getRoles()},"data-spm-click":"gostr=/aliyun;locaid=dashsearch"},r.query)),v.a.createElement(p.a.Item,{style:{float:"right"}},v.a.createElement(c.a,{type:"primary",onClick:function(){return a.setState({createRoleVisible:!0})},style:{marginRight:20}},r.bindingRoles))),v.a.createElement(d.a,{dataSource:t.pageItems,loading:n,maxBodyHeight:476,fixedHeader:!0},v.a.createElement(d.a.Column,{title:r.role,dataIndex:"role"}),v.a.createElement(d.a.Column,{title:r.username,dataIndex:"username"}),v.a.createElement(d.a.Column,{title:r.operation,dataIndex:"role",cell:function(e,t,n){return"ROLE_ADMIN"===e?null:v.a.createElement(c.a,{type:"primary",warning:!0,onClick:function(){return u.a.confirm({title:r.deleteRole,content:r.deleteRoleTip,onOk:function(){return Object(_.f)(n).then(function(){a.setState({pageNo:1},function(){return a.getRoles()})})}})}},r.deleteRole)}})),t.totalCount>o&&v.a.createElement(s.a,{className:"users-pagination",current:i,total:t.totalCount,pageSize:o,onChange:function(e){return a.setState({pageNo:e},function(){return a.getRoles()})}}),v.a.createElement(E,{visible:l,onOk:function(e){return Object(_.b)(e).then(function(e){return a.getRoles(),e})},onCancel:function(){return a.colseCreateRole()}}))}}]),n}(v.a.Component)).displayName="RolesManagement",n=o))||n)||n);t.a=r},function(y,e,t){"use strict";t(64);var n=t(46),w=t.n(n),n=(t(32),t(18)),M=t.n(n),n=(t(87),t(53)),k=t.n(n),n=(t(36),t(10)),S=t.n(n),E=t(21),n=(t(51),t(25)),r=t.n(n),n=(t(35),t(19)),o=t.n(n),n=(t(49),t(27)),i=t.n(n),l=t(14),s=t(15),u=t(22),d=t(17),c=t(16),n=(t(26),t(8)),n=t.n(n),a=(t(63),t(20)),x=t.n(a),a=(t(66),t(41)),a=t.n(a),f=(t(39),t(5)),C=t.n(f),f=t(0),L=t.n(f),p=t(1),T=t(47),D=t(48),O=t(140),f=(t(52),t(33)),h=t.n(f),f=(t(132),t(60)),m=t.n(f),g=(t(404),m.a.Item),N=(0,n.a.config)(((f=function(e){Object(d.a)(n,e);var t=Object(c.a)(n);function n(e){return Object(l.a)(this,n),(e=t.call(this,e)).state={dialogvisible:!1,loading:!1},e.defaultCode="",e.nodejsCode="TODO",e.cppCode="TODO",e.shellCode="TODO",e.pythonCode="TODO",e.record={},e.springCode="TODO",e.sprigbootCode="TODO",e.sprigcloudCode="TODO",e.csharpCode="TODO",e}return Object(s.a)(n,[{key:"componentDidMount",value:function(){}},{key:"openLoading",value:function(){this.setState({loading:!0})}},{key:"closeLoading",value:function(){this.setState({loading:!1})}},{key:"getData",value:function(){var e=Object(p.a)("namespace"),e={group:this.record.group||"",dataId:this.record.dataId||"",namespace:e,inEdas:window.globalConfig.isParentEdas()};this.defaultCode=this.getJavaCode(e),this.createCodeMirror("text/x-java",this.defaultCode),this.springCode=this.getSpringCode(e),this.sprigbootCode=this.getSpringBootCode(e),this.sprigcloudCode=this.getSpringCloudCode(e),this.nodejsCode=this.getNodejsCode(e),this.cppCode=this.getCppCode(e),this.shellCode=this.getShellCode(e),this.pythonCode=this.getPythonCode(e),this.csharpCode=this.getCSharpCode(e),this.forceUpdate()}},{key:"getJavaCode",value:function(e){return'/* Refer to document: https://github.com/alibaba/nacos/blob/master/example/src/main/java/com/alibaba/nacos/example\n*  pom.xml\n    <dependency>\n        <groupId>com.alibaba.nacos</groupId>\n        <artifactId>nacos-client</artifactId>\n        <version>${latest.version}</version>\n    </dependency>\n*/\npackage com.alibaba.nacos.example;\n\nimport java.util.Properties;\n\nimport com.alibaba.nacos.api.exception.NacosException;\nimport com.alibaba.nacos.api.naming.NamingFactory;\nimport com.alibaba.nacos.api.naming.NamingService;\nimport com.alibaba.nacos.api.naming.listener.Event;\nimport com.alibaba.nacos.api.naming.listener.EventListener;\nimport com.alibaba.nacos.api.naming.listener.NamingEvent;\n\n/**\n * @author nkorange\n */\npublic class NamingExample {\n\n    public static void main(String[] args) throws NacosException {\n\n        Properties properties = new Properties();\n        properties.setProperty("serverAddr", System.getProperty("serverAddr"));\n        properties.setProperty("namespace", System.getProperty("namespace"));\n\n        NamingService naming = NamingFactory.createNamingService(properties);\n\n        naming.registerInstance("'.concat(this.record.name,'", "11.11.11.11", 8888, "TEST1");\n\n        naming.registerInstance("').concat(this.record.name,'", "2.2.2.2", 9999, "DEFAULT");\n\n        System.out.println(naming.getAllInstances("').concat(this.record.name,'"));\n\n        naming.deregisterInstance("').concat(this.record.name,'", "2.2.2.2", 9999, "DEFAULT");\n\n        System.out.println(naming.getAllInstances("').concat(this.record.name,'"));\n\n        naming.subscribe("').concat(this.record.name,'", new EventListener() {\n            @Override\n            public void onEvent(Event event) {\n                System.out.println(((NamingEvent)event).getServiceName());\n                System.out.println(((NamingEvent)event).getInstances());\n            }\n        });\n    }\n}')}},{key:"getSpringCode",value:function(e){return'/* Refer to document: https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-example/nacos-spring-discovery-example\n*  pom.xml\n    <dependency>\n        <groupId>com.alibaba.nacos</groupId>\n        <artifactId>nacos-spring-context</artifactId>\n        <version>${latest.version}</version>\n    </dependency>\n*/\n\n// Refer to document:  https://github.com/nacos-group/nacos-examples/blob/master/nacos-spring-example/nacos-spring-discovery-example/src/main/java/com/alibaba/nacos/example/spring\npackage com.alibaba.nacos.example.spring;\n\nimport com.alibaba.nacos.api.annotation.NacosProperties;\nimport com.alibaba.nacos.spring.context.annotation.discovery.EnableNacosDiscovery;\nimport org.springframework.context.annotation.Configuration;\n\n@Configuration\n@EnableNacosDiscovery(globalProperties = @NacosProperties(serverAddr = "127.0.0.1:8848"))\npublic class NacosConfiguration {\n\n}\n\n// Refer to document: https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-example/nacos-spring-discovery-example/src/main/java/com/alibaba/nacos/example/spring/controller\npackage com.alibaba.nacos.example.spring.controller;\n\nimport com.alibaba.nacos.api.annotation.NacosInjected;\nimport com.alibaba.nacos.api.exception.NacosException;\nimport com.alibaba.nacos.api.naming.NamingService;\nimport com.alibaba.nacos.api.naming.pojo.Instance;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.ResponseBody;\n\nimport java.util.List;\n\nimport static org.springframework.web.bind.annotation.RequestMethod.GET;\n\n@Controller\n@RequestMapping("discovery")\npublic class DiscoveryController {\n\n    @NacosInjected\n    private NamingService namingService;\n\n    @RequestMapping(value = "/get", method = GET)\n    @ResponseBody\n    public List<Instance> get(@RequestParam String serviceName) throws NacosException {\n        return namingService.getAllInstances(serviceName);\n    }\n}'}},{key:"getSpringBootCode",value:function(e){return'/* Refer to document: https://github.com/nacos-group/nacos-examples/blob/master/nacos-spring-boot-example/nacos-spring-boot-discovery-example\n*  pom.xml\n    <dependency>\n       <groupId>com.alibaba.boot</groupId>\n       <artifactId>nacos-discovery-spring-boot-starter</artifactId>\n       <version>${latest.version}</version>\n    </dependency>\n*/\n/* Refer to document:  https://github.com/nacos-group/nacos-examples/blob/master/nacos-spring-boot-example/nacos-spring-boot-discovery-example/src/main/resources\n* application.properties\n   nacos.discovery.server-addr=127.0.0.1:8848\n*/\n// Refer to document: https://github.com/nacos-group/nacos-examples/blob/master/nacos-spring-boot-example/nacos-spring-boot-discovery-example/src/main/java/com/alibaba/nacos/example/spring/boot/controller\n\npackage com.alibaba.nacos.example.spring.boot.controller;\n\nimport com.alibaba.nacos.api.annotation.NacosInjected;\nimport com.alibaba.nacos.api.exception.NacosException;\nimport com.alibaba.nacos.api.naming.NamingService;\nimport com.alibaba.nacos.api.naming.pojo.Instance;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.ResponseBody;\n\nimport java.util.List;\n\nimport static org.springframework.web.bind.annotation.RequestMethod.GET;\n\n@Controller\n@RequestMapping("discovery")\npublic class DiscoveryController {\n\n    @NacosInjected\n    private NamingService namingService;\n\n    @RequestMapping(value = "/get", method = GET)\n    @ResponseBody\n    public List<Instance> get(@RequestParam String serviceName) throws NacosException {\n        return namingService.getAllInstances(serviceName);\n    }\n}'}},{key:"getSpringCloudCode",value:function(e){return"/* Refer to document: https://github.com/nacos-group/nacos-examples/blob/master/nacos-spring-cloud-example/nacos-spring-cloud-discovery-example/\n*  pom.xml\n    <dependency>\n       <groupId>org.springframework.cloud</groupId>\n       <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>\n       <version>${latest.version}</version>\n    </dependency>\n*/\n\n// nacos-spring-cloud-provider-example\n\n/* Refer to document:  https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-cloud-example/nacos-spring-cloud-discovery-example/nacos-spring-cloud-provider-example/src/main/resources\n* application.properties\nserver.port=18080\nspring.application.name=".concat(this.record.name,'\nspring.cloud.nacos.discovery.server-addr=127.0.0.1:8848\n*/\n\n// Refer to document: https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-cloud-example/nacos-spring-cloud-discovery-example/nacos-spring-cloud-provider-example/src/main/java/com/alibaba/nacos/example/spring/cloud\npackage com.alibaba.nacos.example.spring.cloud;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.cloud.client.discovery.EnableDiscoveryClient;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.bind.annotation.RestController;\n\n/**\n * @author xiaojing\n */\n@SpringBootApplication\n@EnableDiscoveryClient\npublic class NacosProviderApplication {\n\n  public static void main(String[] args) {\n    SpringApplication.run(NacosProviderApplication.class, args);\n}\n\n  @RestController\n  class EchoController {\n    @RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)\n    public String echo(@PathVariable String string) {\n      return "Hello Nacos Discovery " + string;\n    }\n  }\n}\n\n// nacos-spring-cloud-consumer-example\n\n/* Refer to document: https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-cloud-example/nacos-spring-cloud-discovery-example/nacos-spring-cloud-consumer-example/src/main/resources\n* application.properties\nspring.application.name=micro-service-oauth2\nspring.cloud.nacos.discovery.server-addr=127.0.0.1:8848\n*/\n\n// Refer to document: https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-cloud-example/nacos-spring-cloud-discovery-example/nacos-spring-cloud-consumer-example/src/main/java/com/alibaba/nacos/example/spring/cloud\npackage com.alibaba.nacos.example.spring.cloud;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.cloud.client.discovery.EnableDiscoveryClient;\nimport org.springframework.cloud.client.loadbalancer.LoadBalanced;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.bind.annotation.RestController;\nimport org.springframework.web.client.RestTemplate;\n\n/**\n * @author xiaojing\n */\n@SpringBootApplication\n@EnableDiscoveryClient\npublic class NacosConsumerApplication {\n\n    @LoadBalanced\n    @Bean\n    public RestTemplate restTemplate() {\n        return new RestTemplate();\n    }\n\n    public static void main(String[] args) {\n        SpringApplication.run(NacosConsumerApplication.class, args);\n    }\n\n    @RestController\n    public class TestController {\n\n        private final RestTemplate restTemplate;\n\n        @Autowired\n        public TestController(RestTemplate restTemplate) {this.restTemplate = restTemplate;}\n\n        @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)\n        public String echo(@PathVariable String str) {\n            return restTemplate.getForObject("http://service-provider/echo/" + str, String.class);\n        }\n    }\n}')}},{key:"getNodejsCode",value:function(e){return"TODO"}},{key:"getCppCode",value:function(e){return"TODO"}},{key:"getShellCode",value:function(e){return"TODO"}},{key:"getPythonCode",value:function(e){return"TODO"}},{key:"getCSharpCode",value:function(e){return'/* Refer to document: https://github.com/nacos-group/nacos-sdk-csharp/\nDemo for Basic Nacos Opreation\nApp.csproj\n\n<ItemGroup>\n  <PackageReference Include="nacos-sdk-csharp" Version="${latest.version}" />\n</ItemGroup>\n*/\n\nusing Microsoft.Extensions.DependencyInjection;\nusing Nacos.V2;\nusing Nacos.V2.DependencyInjection;\nusing System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\n\nclass Program\n{\n    static async Task Main(string[] args)\n    {\n        IServiceCollection services = new ServiceCollection();\n\n        services.AddNacosV2Naming(x =>\n        {\n            x.ServerAddresses = new List<string> { "http://localhost:8848/" };\n            x.Namespace = "cs-test";\n\n            // swich to use http or rpc\n            x.NamingUseRpc = true;\n        });\n\n        IServiceProvider serviceProvider = services.BuildServiceProvider();\n        var namingSvc = serviceProvider.GetService<INacosNamingService>();\n\n        await namingSvc.RegisterInstance("'.concat(this.record.name,'", "11.11.11.11", 8888, "TEST1");\n\n        await namingSvc.RegisterInstance("').concat(this.record.name,'", "2.2.2.2", 9999, "DEFAULT");\n\n        Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(await namingSvc.GetAllInstances("').concat(this.record.name,'")));\n\n        await namingSvc.DeregisterInstance("').concat(this.record.name,'", "2.2.2.2", 9999, "DEFAULT");\n\n        var listener = new EventListener();\n\n        await namingSvc.Subscribe("').concat(this.record.name,'", listener);\n    }\n\n    internal class EventListener : IEventListener\n    {\n        public Task OnEvent(IEvent @event)\n        {\n            Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(@event));\n            return Task.CompletedTask;\n        }\n    }\n}\n\n/* Refer to document: https://github.com/nacos-group/nacos-sdk-csharp/\nDemo for ASP.NET Core Integration\nApp.csproj\n\n<ItemGroup>\n  <PackageReference Include="nacos-sdk-csharp.AspNetCore" Version="${latest.version}" />\n</ItemGroup>\n*/\n\n/* Refer to document: https://github.com/nacos-group/nacos-sdk-csharp/blob/dev/samples/App1/appsettings.json\n*  appsettings.json\n{\n  "nacos": {\n    "ServerAddresses": [ "http://localhost:8848" ],\n    "DefaultTimeOut": 15000,\n    "Namespace": "cs",\n    "ServiceName": "App1",\n    "GroupName": "DEFAULT_GROUP",\n    "ClusterName": "DEFAULT",\n    "Port": 0,\n    "Weight": 100,\n    "RegisterEnabled": true,\n    "InstanceEnabled": true,\n    "Ephemeral": true,\n    "NamingUseRpc": true,\n    "NamingLoadCacheAtStart": ""\n  }\n}\n*/\n\n// Refer to document: https://github.com/nacos-group/nacos-sdk-csharp/blob/dev/samples/App1/Startup.cs\nusing Nacos.AspNetCore.V2;\n\npublic class Startup\n{\n    public Startup(IConfiguration configuration)\n    {\n        Configuration = configuration;\n    }\n\n    public IConfiguration Configuration { get; }\n\n    public void ConfigureServices(IServiceCollection services)\n    {\n        // ....\n        services.AddNacosAspNet(Configuration);\n    }\n\n    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)\n    {\n        // ....\n    }\n}\n    ')}},{key:"openDialog",value:function(e){var t=this;this.setState({dialogvisible:!0}),this.record=e,setTimeout(function(){t.getData()})}},{key:"closeDialog",value:function(){this.setState({dialogvisible:!1})}},{key:"createCodeMirror",value:function(e,t){var n=this.refs.codepreview;n&&(n.innerHTML="",this.cm=window.CodeMirror(n,{value:t,mode:e,height:400,width:500,lineNumbers:!0,theme:"xq-light",lint:!0,tabMode:"indent",autoMatchParens:!0,textWrapping:!0,gutters:["CodeMirror-lint-markers"],extraKeys:{F1:function(e){e.setOption("fullScreen",!e.getOption("fullScreen"))},Esc:function(e){e.getOption("fullScreen")&&e.setOption("fullScreen",!1)}}}),this.cm.setSize("auto","490px"))}},{key:"changeTab",value:function(e,t){var n=this;setTimeout(function(){n[e]=!0,n.createCodeMirror("text/javascript",t)})}},{key:"render",value:function(){var e=this.props.locale,e=void 0===e?{}:e;return L.a.createElement("div",null,L.a.createElement(o.a,{title:e.sampleCode,style:{width:"80%"},visible:this.state.dialogvisible,footer:L.a.createElement("div",null),onClose:this.closeDialog.bind(this)},L.a.createElement("div",{style:{height:500}},L.a.createElement(h.a,{tip:e.loading,style:{width:"100%"},visible:this.state.loading},L.a.createElement(m.a,{shape:"text",style:{height:40,paddingBottom:10}},L.a.createElement(g,{title:"Java",key:0,onClick:this.changeTab.bind(this,"commoneditor1",this.defaultCode)}),L.a.createElement(g,{title:"Spring",key:1,onClick:this.changeTab.bind(this,"commoneditor1",this.springCode)}),L.a.createElement(g,{title:"Spring Boot",key:2,onClick:this.changeTab.bind(this,"commoneditor2",this.sprigbootCode)}),L.a.createElement(g,{title:"Spring Cloud",key:21,onClick:this.changeTab.bind(this,"commoneditor21",this.sprigcloudCode)}),L.a.createElement(g,{title:"Node.js",key:3,onClick:this.changeTab.bind(this,"commoneditor3",this.nodejsCode)}),L.a.createElement(g,{title:"C++",key:4,onClick:this.changeTab.bind(this,"commoneditor4",this.cppCode)}),L.a.createElement(g,{title:"Shell",key:5,onClick:this.changeTab.bind(this,"commoneditor5",this.shellCode)}),L.a.createElement(g,{title:"Python",key:6,onClick:this.changeTab.bind(this,"commoneditor6",this.pythonCode)}),L.a.createElement(g,{title:"C#",key:7,onClick:this.changeTab.bind(this,"commoneditor7",this.csharpCode)})),L.a.createElement("div",{ref:"codepreview"})))))}}]),n}(L.a.Component)).displayName="ShowServiceCodeing",f=f))||f,P=t(69),j=(t(738),t(28)),Y=C.a.Item,I=a.a.Row,R=a.a.Col,A=x.a.Column,a=(0,n.a.config)(((f=function(e){Object(d.a)(a,e);var t=Object(c.a)(a);function a(e){var n;return Object(l.a)(this,a),(n=t.call(this,e)).getQueryLater=function(){setTimeout(function(){return n.queryServiceList()})},n.showcode=function(){setTimeout(function(){return n.queryServiceList()})},n.setNowNameSpace=function(e,t){return n.setState({nowNamespaceName:e,nowNamespaceId:t})},n.rowColor=function(e){return{className:e.healthyInstanceCount?"":"row-bg-red"}},n.editServiceDialog=L.a.createRef(),n.showcode=L.a.createRef(),n.state={loading:!1,total:0,pageSize:10,currentPage:1,dataSource:[],search:{serviceName:Object(p.a)("serviceNameParam")||"",groupName:Object(p.a)("groupNameParam")||""},hasIpCount:!("false"===localStorage.getItem("hasIpCount"))},n.field=new i.a(Object(u.a)(n)),n}return Object(s.a)(a,[{key:"openLoading",value:function(){this.setState({loading:!0})}},{key:"closeLoading",value:function(){this.setState({loading:!1})}},{key:"openEditServiceDialog",value:function(){try{this.editServiceDialog.current.getInstance().show(this.state.service)}catch(e){}}},{key:"queryServiceList",value:function(){var n=this,e=this.state,t=e.currentPage,a=e.pageSize,r=e.search,o=e.withInstances,o=void 0!==o&&o,e=e.hasIpCount,e=["hasIpCount=".concat(e),"withInstances=".concat(o),"pageNo=".concat(t),"pageSize=".concat(a),"serviceNameParam=".concat(r.serviceName),"groupNameParam=".concat(r.groupName)];Object(p.c)({serviceNameParam:r.serviceName,groupNameParam:r.groupName}),this.openLoading(),Object(p.b)({url:"v1/ns/catalog/services?".concat(e.join("&")),success:function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},t=e.count,e=e.serviceList;n.setState({dataSource:void 0===e?[]:e,total:void 0===t?0:t,loading:!1})},error:function(){return n.setState({dataSource:[],total:0,currentPage:0,loading:!1})}})}},{key:"showSampleCode",value:function(e){this.showcode.current.getInstance().openDialog(e)}},{key:"querySubscriber",value:function(e){var t=e.name,e=e.groupName,n=this.state.nowNamespaceId;this.props.history.push(Object(T.a)("/subscriberList",{namespace:n,name:t,groupName:e}))}},{key:"handlePageSizeChange",value:function(e){var t=this;this.setState({pageSize:e},function(){return t.queryServiceList()})}},{key:"deleteService",value:function(e){var t=this,n=this.props.locale,n=void 0===n?{}:n,a=n.prompt,n=n.promptDelete;o.a.confirm({title:a,content:n,onOk:function(){Object(p.b)({method:"DELETE",url:"v1/ns/service?serviceName=".concat(e.name,"&groupName=").concat(e.groupName),dataType:"text",beforeSend:function(){return t.openLoading()},success:function(e){"ok"!==e?r.a.error(e):t.queryServiceList()},error:function(e){return r.a.error(e.responseText||e.statusText)},complete:function(){return t.closeLoading()}})}})}},{key:"render",value:function(){var a=this,e=this.props.locale,e=void 0===e?{}:e,t=e.pubNoData,n=e.serviceList,r=e.serviceName,o=e.serviceNamePlaceholder,i=e.groupName,l=e.groupNamePlaceholder,s=e.hiddenEmptyService,u=e.query,d=e.create,c=e.operation,f=e.detail,p=e.sampleCode,h=e.deleteAction,m=e.subscriber,g=this.state,y=g.search,v=(g.nowNamespaceName,g.nowNamespaceId),g=g.hasIpCount,_=this.field,b=_.init,_=_.getValue;return this.init=b,this.getValue=_,L.a.createElement("div",{className:"main-container service-management"},L.a.createElement(P.a,{title:n,desc:v,nameSpace:!0}),L.a.createElement(D.a,{setNowNameSpace:this.setNowNameSpace,namespaceCallBack:this.getQueryLater}),L.a.createElement(I,{className:"demo-row",style:{marginBottom:10,padding:0}},L.a.createElement(R,{span:"24"},L.a.createElement(C.a,{inline:!0,field:this.field},L.a.createElement(Y,{label:r},L.a.createElement(S.a,{placeholder:o,style:{width:200},value:y.serviceName,onChange:function(e){return a.setState({search:Object(E.a)(Object(E.a)({},y),{},{serviceName:e})})},onPressEnter:function(){return a.setState({currentPage:1},function(){return a.queryServiceList()})}})),L.a.createElement(Y,{label:i},L.a.createElement(S.a,{placeholder:l,style:{width:200},value:y.groupName,onChange:function(e){return a.setState({search:Object(E.a)(Object(E.a)({},y),{},{groupName:e})})},onPressEnter:function(){return a.setState({currentPage:1},function(){return a.queryServiceList()})}})),L.a.createElement(C.a.Item,{label:"".concat(s)},L.a.createElement(k.a,{checked:g,onChange:function(e){return a.setState({hasIpCount:e,currentPage:1},function(){localStorage.setItem("hasIpCount",e),a.queryServiceList()})}})),L.a.createElement(Y,{label:""},L.a.createElement(M.a,{type:"primary",onClick:function(){return a.setState({currentPage:1},function(){return a.queryServiceList()})},style:{marginRight:10}},u)),L.a.createElement(Y,{label:"",style:{float:"right"}},L.a.createElement(M.a,{type:"primary",onClick:function(){return a.openEditServiceDialog()}},d))))),L.a.createElement(I,{style:{padding:0}},L.a.createElement(R,{span:"24",style:{padding:0}},L.a.createElement(x.a,{dataSource:this.state.dataSource,locale:{empty:t},rowProps:function(e){return a.rowColor(e)},loading:this.state.loading},L.a.createElement(A,{title:e.columnServiceName,dataIndex:"name"}),L.a.createElement(A,{title:e.groupName,dataIndex:"groupName"}),L.a.createElement(A,{title:e.columnClusterCount,dataIndex:"clusterCount"}),L.a.createElement(A,{title:e.columnIpCount,dataIndex:"ipCount"}),L.a.createElement(A,{title:e.columnHealthyInstanceCount,dataIndex:"healthyInstanceCount"}),L.a.createElement(A,{title:e.columnTriggerFlag,dataIndex:"triggerFlag"}),L.a.createElement(A,{title:c,align:"center",cell:function(e,t,n){return L.a.createElement("div",null,L.a.createElement("a",{onClick:function(){var e=n.name,t=n.groupName;a.props.history.push(Object(T.a)("/serviceDetail",{name:e,groupName:t}))},style:{marginRight:5}},f),L.a.createElement("span",{style:{marginRight:5}},"|"),L.a.createElement("a",{style:{marginRight:5},onClick:function(){return a.showSampleCode(n)}},p),L.a.createElement("span",{style:{marginRight:5}},"|"),L.a.createElement("a",{style:{marginRight:5},onClick:function(){return a.querySubscriber(n)}},m),L.a.createElement("span",{style:{marginRight:5}},"|"),L.a.createElement("a",{onClick:function(){return a.deleteService(n)},style:{marginRight:5}},h))}})))),L.a.createElement("div",{style:{marginTop:10,textAlign:"right"}},L.a.createElement(w.a,{current:this.state.currentPage,pageSizeList:j.e,pageSizePosition:"start",pageSizeSelector:"dropdown",popupProps:{align:"bl tl"},total:this.state.total,pageSize:this.state.pageSize,onPageSizeChange:function(e){return a.handlePageSizeChange(e)},onChange:function(e){return a.setState({currentPage:e},function(){return a.queryServiceList()})}})),L.a.createElement(N,{ref:this.showcode}),L.a.createElement(O.a,{ref:this.editServiceDialog,openLoading:function(){return a.openLoading()},closeLoading:function(){return a.closeLoading()},queryServiceList:function(){return a.setState({currentPage:1},function(){return a.queryServiceList()})}}))}}]),a}(L.a.Component)).displayName="ServiceList",t=f))||t;e.a=a},function(e,t,n){"use strict";n(64);var a=n(46),s=n.n(a),a=(n(35),n(19)),u=n.n(a),d=n(31),a=(n(63),n(20)),c=n.n(a),a=(n(32),n(18)),f=n.n(a),a=(n(87),n(53)),p=n.n(a),a=(n(39),n(5)),h=n.n(a),a=(n(36),n(10)),m=n.n(a),i=n(14),l=n(15),g=n(22),y=n(17),v=n(16),a=(n(26),n(8)),a=n.n(a),r=n(0),_=n.n(r),r=n(37),b=n(45),o=n(82),w=n(48),M=(n(49),n(27)),k=n.n(M),M=(n(59),n(29)),S=n.n(M),E=h.a.Item,x=S.a.Option,C={labelCol:{fixedSpan:4},wrapperCol:{span:19}},L=Object(r.b)(function(e){return{namespaces:e.namespace.namespaces}},{getNamespaces:o.b,searchRoles:b.l})(M=(0,a.a.config)(((M=function(e){Object(y.a)(o,e);var r=Object(v.a)(o);function o(){var t;Object(i.a)(this,o);for(var e=arguments.length,n=new Array(e),a=0;a<e;a++)n[a]=arguments[a];return(t=r.call.apply(r,[this].concat(n))).field=new k.a(Object(g.a)(t)),t.state={dataSource:[]},t.handleChange=function(e){0<e.length&&Object(b.l)(e).then(function(e){t.setState({dataSource:e})})},t}return Object(l.a)(o,[{key:"componentDidMount",value:function(){this.props.getNamespaces()}},{key:"check",value:function(){var n=this,e=this.props.locale,a={role:e.roleError,resource:e.resourceError,action:e.actionError},e=Object.keys(a).map(function(e){var t=n.field.getValue(e);return t||n.field.setError(e,a[e]),t});return 3===e.filter(function(e){return e}).length?e:null}},{key:"render",value:function(){var t=this,e=this.field.getError,n=this.props,a=n.visible,r=n.onOk,o=n.onCancel,i=n.locale,n=n.namespaces;return _.a.createElement(_.a.Fragment,null,_.a.createElement(u.a,{title:i.addPermission,visible:a,onOk:function(){var e=t.check();e&&r(e).then(function(){return o()})},onClose:o,onCancel:o,afterClose:function(){return t.field.reset()}},_.a.createElement(h.a,Object.assign({style:{width:400}},C,{field:this.field}),_.a.createElement(E,{label:i.role,required:!0,help:e("role")},_.a.createElement(S.a.AutoComplete,{name:"role",style:{width:316},filterLocal:!1,placeholder:i.rolePlaceholder,onChange:this.handleChange,dataSource:this.state.dataSource})),_.a.createElement(E,{label:i.resource,required:!0,help:e("resource")},_.a.createElement(S.a,{name:"resource",placeholder:i.resourcePlaceholder,style:{width:"100%"}},n.map(function(e){var t=e.namespace,e=e.namespaceShowName;return _.a.createElement(x,{value:"".concat(t,":*:*")},e," ",t?"(".concat(t,")"):"")}))),_.a.createElement(E,{label:i.action,required:!0,help:e("action")},_.a.createElement(S.a,{name:"action",placeholder:i.actionPlaceholder,style:{width:"100%"}},_.a.createElement(x,{value:"r"},i.readOnly,"(r)"),_.a.createElement(x,{value:"w"},i.writeOnly,"(w)"),_.a.createElement(x,{value:"rw"},i.readWrite,"(rw)"))))))}}]),o}(_.a.Component)).displayName="NewPermissions",M=M))||M)||M,r=(n(742),Object(r.b)(function(e){return{permissions:e.authority.permissions,namespaces:e.namespace.namespaces}},{getPermissions:b.h,getNamespaces:o.b})(n=(0,a.a.config)(((M=function(e){Object(y.a)(n,e);var t=Object(v.a)(n);function n(e){return Object(i.a)(this,n),(e=t.call(this,e)).state={loading:!0,pageNo:1,pageSize:9,createPermission:!1,defaultFuzzySearch:!0,role:""},e.handleDefaultFuzzySwitchChange=e.handleDefaultFuzzySwitchChange.bind(Object(g.a)(e)),e}return Object(l.a)(n,[{key:"componentDidMount",value:function(){this.getPermissions(),this.props.getNamespaces()}},{key:"getPermissions",value:function(){var e=this,t=(this.setState({loading:!0}),this.state),n=t.pageNo,t=t.pageSize,a=this.state.role,r="accurate";(a=this.state.defaultFuzzySearch&&a&&""!==a?"*".concat(a,"*"):a)&&-1!==a.indexOf("*")&&(r="blur"),this.props.getPermissions({pageNo:n,pageSize:t,role:a,search:r}).then(function(){e.state.loading&&e.setState({loading:!1})}).catch(function(){return e.setState({loading:!1})})}},{key:"colseCreatePermission",value:function(){this.setState({createPermissionVisible:!1})}},{key:"getActionText",value:function(e){var t=this.props.locale;return{r:"".concat(t.readOnly," (r)"),w:"".concat(t.writeOnly," (w)"),rw:"".concat(t.readWrite," (rw)")}[e]}},{key:"handleDefaultFuzzySwitchChange",value:function(){this.setState({defaultFuzzySearch:!this.state.defaultFuzzySearch})}},{key:"render",value:function(){var a=this,e=this.props,t=e.permissions,n=e.namespaces,r=void 0===n?[]:n,o=e.locale,n=this.state,e=n.loading,i=n.pageSize,l=n.pageNo,n=n.createPermissionVisible;return _.a.createElement(_.a.Fragment,null,_.a.createElement(w.a,{left:o.privilegeManagement}),_.a.createElement(h.a,{inline:!0},_.a.createElement(h.a.Item,{label:"瑙掕壊鍚�"},_.a.createElement(m.a,{value:this.state.role,htmlType:"text",placeholder:this.state.defaultFuzzySearch?o.defaultFuzzyd:o.fuzzyd,style:{width:200},onChange:function(e){a.setState({role:e})}})),_.a.createElement(h.a.Item,{label:"榛樿妯$硦鍖归厤"},_.a.createElement(p.a,{checkedChildren:"",unCheckedChildren:"",defaultChecked:this.state.defaultFuzzySearch,onChange:this.handleDefaultFuzzySwitchChange,title:"鑷姩鍦ㄦ悳绱㈠弬鏁板墠鍚庡姞涓�*"})),_.a.createElement(h.a.Item,{label:""},_.a.createElement(f.a,{type:"primary",style:{marginRight:10},onClick:function(){return a.getPermissions()},"data-spm-click":"gostr=/aliyun;locaid=dashsearch"},o.query)),_.a.createElement(h.a.Item,{style:{float:"right"}},_.a.createElement(f.a,{type:"primary",onClick:function(){return a.setState({createPermissionVisible:!0})},style:{marginRight:20}},o.addPermission))),_.a.createElement(c.a,{dataSource:t.pageItems,loading:e,maxBodyHeight:476,fixedHeader:!0},_.a.createElement(c.a.Column,{title:o.role,dataIndex:"role"}),_.a.createElement(c.a.Column,{title:o.resource,dataIndex:"resource",cell:function(n){var e=r.filter(function(e){var e=e.namespace,t=n.split(":");return Object(d.a)(t,1)[0]===e}),e=Object(d.a)(e,1)[0],e=void 0===e?{}:e,t=e.namespaceShowName,e=e.namespace,e=void 0===e?"":e;return(void 0===t?"":t)+(e?" (".concat(e,")"):"")}}),_.a.createElement(c.a.Column,{title:o.action,dataIndex:"action",cell:function(e){return a.getActionText(e)}}),_.a.createElement(c.a.Column,{title:o.operation,cell:function(e,t,n){return _.a.createElement(_.a.Fragment,null,_.a.createElement(f.a,{type:"primary",warning:!0,onClick:function(){return u.a.confirm({title:o.deletePermission,content:o.deletePermissionTip,onOk:function(){return Object(b.e)(n).then(function(){a.setState({pageNo:1},function(){return a.getPermissions()})})}})}},o.deletePermission))}})),t.totalCount>i&&_.a.createElement(s.a,{className:"users-pagination",current:l,total:t.totalCount,pageSize:i,onChange:function(e){return a.setState({pageNo:e},function(){return a.getPermissions()})}}),_.a.createElement(L,{visible:n,onOk:function(e){return Object(b.a)(e).then(function(e){return a.setState({pageNo:1},function(){return a.getPermissions()}),e})},onCancel:function(){return a.colseCreatePermission()}}))}}]),n}(_.a.Component)).displayName="PermissionsManagement",n=M))||n)||n);t.a=r},function(e,t,n){"use strict";n(64);var a=n(46),u=n.n(a),a=(n(35),n(19)),d=n.n(a),a=(n(63),n(20)),c=n.n(a),a=(n(32),n(18)),f=n.n(a),a=(n(87),n(53)),p=n.n(a),a=(n(39),n(5)),h=n.n(a),a=(n(36),n(10)),m=n.n(a),i=n(14),l=n(15),s=n(22),g=n(17),y=n(16),a=(n(26),n(8)),a=n.n(a),r=n(0),v=n.n(r),r=n(37),_=n(45),b=n(48),w=n(31),o=(n(49),n(27)),M=n.n(o),k=(n(159),h.a.Item),S={labelCol:{fixedSpan:4},wrapperCol:{span:19}},E=(0,a.a.config)(((o=function(e){Object(g.a)(o,e);var r=Object(y.a)(o);function o(){var e;Object(i.a)(this,o);for(var t=arguments.length,n=new Array(t),a=0;a<t;a++)n[a]=arguments[a];return(e=r.call.apply(r,[this].concat(n))).field=new M.a(Object(s.a)(e)),e}return Object(l.a)(o,[{key:"check",value:function(){var n=this,e=this.props.locale,a={username:e.usernameError,password:e.passwordError,rePassword:e.rePasswordError},t=Object.keys(a).map(function(e){var t=n.field.getValue(e);return t||n.field.setError(e,a[e]),t});if(3!==t.filter(function(e){return e}).length)return null;var r=["password","rePassword"].map(function(e){return n.field.getValue(e)}),r=Object(w.a)(r,2);return r[0]!==r[1]?(this.field.setError("rePassword",e.rePasswordError2),null):t}},{key:"render",value:function(){var t=this,e=this.props.locale,n=this.field.getError,a=this.props,r=a.visible,o=a.onOk,i=a.onCancel;return v.a.createElement(v.a.Fragment,null,v.a.createElement(d.a,{title:e.createUser,visible:r,onOk:function(){var e=t.check();e&&o(e).then(function(){return i()})},onClose:i,onCancel:i,afterClose:function(){return t.field.reset()}},v.a.createElement(h.a,Object.assign({style:{width:400}},S,{field:this.field}),v.a.createElement(k,{label:e.username,required:!0,help:n("username")},v.a.createElement(m.a,{name:"username",trim:!0,placeholder:e.usernamePlaceholder})),v.a.createElement(k,{label:e.password,required:!0,help:n("password")},v.a.createElement(m.a,{name:"password",htmlType:"password",placeholder:e.passwordPlaceholder})),v.a.createElement(k,{label:e.rePassword,required:!0,help:n("rePassword")},v.a.createElement(m.a,{name:"rePassword",htmlType:"password",placeholder:e.rePasswordPlaceholder})))))}}]),o}(v.a.Component)).displayName="NewUser",o=o))||o,x=n(136),C=n(1),r=Object(r.b)(function(e){return{users:e.authority.users}},{getUsers:_.j})(n=(0,a.a.config)(((o=function(e){Object(g.a)(n,e);var t=Object(y.a)(n);function n(e){return Object(i.a)(this,n),(e=t.call(this,e)).username=Object(C.a)("username"),e.state={loading:!0,pageNo:1,pageSize:9,username:e.username,defaultFuzzySearch:!0},e.handleDefaultFuzzySwitchChange=e.handleDefaultFuzzySwitchChange.bind(Object(s.a)(e)),e}return Object(l.a)(n,[{key:"componentDidMount",value:function(){this.getUsers()}},{key:"getUsers",value:function(){var e=this,t=(this.setState({loading:!0}),{pageNo:this.state.pageNo,pageSize:this.state.pageSize,username:this.username,search:"blur"});this.state.defaultFuzzySearch&&t.username&&""!==t.username&&(t.username="*".concat(t.username,"*")),t.username&&-1!==t.username.indexOf("*")?t.search="blur":t.search="accurate",this.props.getUsers({pageNo:t.pageNo,pageSize:t.pageSize,username:t.username,search:t.search}).then(function(){e.state.loading&&e.setState({loading:!1})}).catch(function(){return e.setState({loading:!1})})}},{key:"colseCreateUser",value:function(){this.setState({createUserVisible:!1})}},{key:"handleDefaultFuzzySwitchChange",value:function(){this.setState({defaultFuzzySearch:!this.state.defaultFuzzySearch})}},{key:"render",value:function(){var t=this,e=this.props,n=e.users,a=e.locale,e=this.state,r=e.loading,o=e.pageSize,i=e.pageNo,l=e.createUserVisible,s=e.passwordResetUserVisible,e=e.passwordResetUser;return v.a.createElement(v.a.Fragment,null,v.a.createElement(b.a,{left:a.userManagement}),v.a.createElement(h.a,{inline:!0},v.a.createElement(h.a.Item,{label:"鐢ㄦ埛鍚�"},v.a.createElement(m.a,{value:this.username,htmlType:"text",placeholder:this.state.defaultFuzzySearch?a.defaultFuzzyd:a.fuzzyd,style:{width:200},onChange:function(e){t.username=e,t.setState({username:e})}})),v.a.createElement(h.a.Item,{label:"榛樿妯$硦鍖归厤"},v.a.createElement(p.a,{checkedChildren:"",unCheckedChildren:"",defaultChecked:this.state.defaultFuzzySearch,onChange:this.handleDefaultFuzzySwitchChange,title:"鑷姩鍦ㄦ悳绱㈠弬鏁板墠鍚庡姞涓�*"})),v.a.createElement(h.a.Item,{label:""},v.a.createElement(f.a,{type:"primary",style:{marginRight:10},onClick:function(){return t.getUsers()},"data-spm-click":"gostr=/aliyun;locaid=dashsearch"},a.query)),v.a.createElement(h.a.Item,{style:{float:"right"}},v.a.createElement(f.a,{type:"primary",onClick:function(){return t.setState({createUserVisible:!0})},style:{marginRight:20}},a.createUser))),v.a.createElement(c.a,{dataSource:n.pageItems,loading:r,maxBodyHeight:476,fixedHeader:!0},v.a.createElement(c.a.Column,{title:a.username,dataIndex:"username"}),v.a.createElement(c.a.Column,{title:a.password,dataIndex:"password",cell:function(e){return e.replace(/\S/g,"*")}}),v.a.createElement(c.a.Column,{title:a.operation,dataIndex:"username",cell:function(e){return v.a.createElement(v.a.Fragment,null,v.a.createElement(f.a,{type:"primary",onClick:function(){return t.setState({passwordResetUser:e,passwordResetUserVisible:!0})}},a.resetPassword),"聽聽聽",v.a.createElement(f.a,{type:"primary",warning:!0,onClick:function(){return d.a.confirm({title:a.deleteUser,content:a.deleteUserTip,onOk:function(){return Object(_.g)(e).then(function(){t.setState({pageNo:1},function(){return t.getUsers()})})}})}},a.deleteUser))}})),n.totalCount>o&&v.a.createElement(u.a,{className:"users-pagination",current:i,total:n.totalCount,pageSize:o,onChange:function(e){return t.setState({pageNo:e},function(){return t.getUsers()})}}),v.a.createElement(E,{visible:l,onOk:function(e){return Object(_.c)(e).then(function(e){return t.setState({pageNo:1},function(){return t.getUsers()}),e})},onCancel:function(){return t.colseCreateUser()}}),v.a.createElement(x.a,{visible:s,username:e,onOk:function(e){return Object(_.k)(e).then(function(e){return t.getUsers(),e})},onCancel:function(){return t.setState({passwordResetUser:void 0,passwordResetUserVisible:!1})}}))}}]),n}(v.a.Component)).displayName="UserManagement",n=o))||n)||n;t.a=r},function(e,t,l){"use strict";l(52);var n=l(33),g=l.n(n),n=(l(32),l(18)),y=l.n(n),n=(l(395),l(139)),v=l.n(n),n=(l(43),l(24)),_=l.n(n),n=(l(126),l(88)),b=l.n(n),n=(l(109),l(71)),w=l.n(n),n=(l(59),l(29)),M=l.n(n),n=(l(36),l(10)),k=l.n(n),n=(l(39),l(5)),S=l.n(n),n=(l(132),l(60)),E=l.n(n),a=l(61),n=(l(35),l(19)),s=l.n(n),x=l(21),n=(l(51),l(25)),r=l.n(n),o=l(14),i=l(15),u=l(17),d=l(16),n=(l(26),l(8)),n=l.n(n),c=(l(66),l(41)),c=l.n(c),f=l(0),C=l.n(f),p=l(1),h=l(47),m=l(34),L=l(138),T=l(105),D=l(90),O=(l(690),c.a.Row),N=c.a.Col,P=[{value:"text",label:"TEXT"},{value:"json",label:"JSON"},{value:"xml",label:"XML"},{value:"yaml",label:"YAML"},{value:"html",label:"HTML"},{value:"properties",label:"Properties"}],j=["production","beta"],n=(0,n.a.config)(((f=function(e){Object(u.a)(n,e);var t=Object(d.a)(n);function n(e){return Object(o.a)(this,n),(e=t.call(this,e)).state={loading:!1,isBeta:!1,isNewConfig:!0,betaPublishSuccess:!1,betaIps:"",tabActiveKey:"",form:{dataId:"",group:"",content:"",appName:"",desc:"",config_tags:[],type:"text"},tagDataSource:[],subscriberDataSource:[],openAdvancedSettings:!1,editorClass:"editor-normal"},e.successDialog=C.a.createRef(),e.diffEditorDialog=C.a.createRef(),e}return Object(i.a)(n,[{key:"componentDidMount",value:function(){var t=this,e=!Object(p.a)("dataId"),n=Object(p.a)("group").trim();this.tenant=Object(p.a)("namespace")||"",this.setState({isNewConfig:e},function(){e?(n&&t.setState({group:n}),t.initMoacoEditor("text","")):t.changeForm({dataId:Object(p.a)("dataId").trim(),group:n},function(){t.getConfig(!0).then(function(e){e?t.setState({isBeta:!0,tabActiveKey:"beta",betaPublishSuccess:!0}):t.getConfig()}),t.getSubscribesByNamespace()}),t.initFullScreenEvent()})}},{key:"initMoacoEditor",value:function(e,t){var n=this,a=document.getElementById("container"),r=(a.innerHTML="",{value:t,language:e,codeLens:!(this.monacoEditor=null),selectOnLineNumbers:!0,roundedSelection:!1,readOnly:!1,lineNumbersMinChars:!0,theme:"vs-dark",folding:!0,showFoldingControls:"always",cursorStyle:"line",automaticLayout:!0});window.monaco?this.monacoEditor=window.monaco.editor.create(a,r):window.importEditor(function(){n.monacoEditor=window.monaco.editor.create(a,r)})}},{key:"initFullScreenEvent",value:function(){var t=this;document.body.addEventListener("keydown",function(e){"F1"===e.key?(e.preventDefault(),t.setState({editorClass:"editor-full-screen"})):"Escape"===e.key&&t.setState({editorClass:"editor-normal"})})}},{key:"createDiffCodeMirror",value:function(e,t){var n=this.diffEditorDialog.current.getInstance();n.innerHTML="",this.diffeditor=window.CodeMirror.MergeView(n,{value:e||"",origLeft:null,orig:t||"",lineNumbers:!0,mode:this.mode,theme:"xq-light",highlightDifferences:!0,connect:"align",collapseIdentical:!1})}},{key:"openDiff",value:function(e){this.diffcb=e;var e=this.monacoEditor.getValue(),t=this.codeVal||"",e=e.replace(/\r\n/g,"\n").replace(/\n/g,"\r\n"),t=t.replace(/\r\n/g,"\n").replace(/\n/g,"\r\n");this.diffEditorDialog.current.getInstance().openDialog(e,t)}},{key:"clickTab",value:function(e){var t=this;this.setState({tabActiveKey:e},function(){return t.getConfig("beta"===e)})}},{key:"getCodeVal",value:function(){var e=this.props.locale,e=void 0===e?{}:e,t=this.state.form,t=(t.type,t.content),t=this.monacoEditor?this.monacoEditor.getValue():t;return t||(r.a.error({content:e.submitFailed,align:"cc cc"}),!1)}},{key:"setCodeVal",value:function(e){var t=this.state.form;this.setState({form:Object(x.a)(Object(x.a)({},t),{},{content:e})}),this.monacoEditor&&this.monacoEditor.setValue(e)}},{key:"publish",value:function(){var t=this,e=this.props.locale,n=void 0===e?{}:e,e=this.state.form.type,a=(this.state.isNewConfig&&this.validation(),this.getCodeVal());if(a)return L.a.validate({content:a,type:e})?this._publishConfig():new Promise(function(e){s.a.confirm({content:n.codeValErrorPrompt,onOk:function(){return e(t._publishConfig())},onCancel:function(){return e(!1)}})})}},{key:"_publishConfig",value:function(){var t=this,n=0<arguments.length&&void 0!==arguments[0]&&arguments[0],e=this.state,a=e.betaIps,r=e.isNewConfig,e={"Content-Type":"application/x-www-form-urlencoded"},o=(n&&(e.betaIps=a),Object(x.a)(Object(x.a)({},this.state.form),{},{content:this.getCodeVal(),betaIps:a})),i={},a=(Object.keys(o).forEach(function(e){i[e]=o[e]}),this.state.form.config_tags),a=(0<a.length&&(i.config_tags=a.join(",")),l(371));return this.setState({loading:!0}),Object(m.a)({url:"v1/cs/configs",method:"post",data:a(i),headers:e}).then(function(e){return e&&(r&&t.setState({isNewConfig:!1}),t.getConfig(n)),t.setState({loading:!1}),e},function(e){t.setState({loading:!1}),e.status&&403===e.status&&s.a.alert({content:t.props.locale.publishFailed403})})}},{key:"publishBeta",value:function(){var t=this;return this._publishConfig(!0).then(function(e){if(e)return t.setState({betaPublishSuccess:!0,tabActiveKey:"beta"}),e})}},{key:"stopBeta",value:function(){var t=this,e=this.state.form,n=e.dataId,e=e.group,a=Object(p.a)("namespace");return m.a.delete("v1/cs/configs",{params:{beta:!0,dataId:n,group:e,tenant:a}}).then(function(e){return e.data&&t.setState({isBeta:!1,betaPublishSuccess:!1,tabActiveKey:""},function(){return t.getConfig()}),e})}},{key:"changeForm",value:function(e,t){var n=this.state.form;this.setState({form:Object(x.a)(Object(x.a)({},n),e)},function(){t&&t()})}},{key:"setConfigTags",value:function(n){var e,t=this.state.tagDataSource;0<n.length&&(e=n[n.length-1],t.indexOf(e)<0&&this.setState({tagDataSource:[].concat(Object(a.a)(t),[e])}),5<n.length&&n.pop(),n.forEach(function(e,t){-1===e.indexOf(",")&&-1===e.indexOf("=")||n.splice(t,1)})),this.changeForm({config_tags:n})}},{key:"goBack",value:function(){var e=Object(p.a)("serverId")||"",t=Object(p.a)("namespace"),n=Object(p.a)("searchGroup")||"",a=Object(p.a)("searchDataId")||"",r=Object(p.a)("pageSize"),o=Object(p.a)("pageNo");this.props.history.push(Object(h.a)("/configurationManagement",{serverId:e,group:n,dataId:a,namespace:t,pageSize:r,pageNo:o}))}},{key:"getConfig",value:function(){var i=this,l=0<arguments.length&&void 0!==arguments[0]&&arguments[0],e=Object(p.a)("namespace"),t=this.state.form,t={dataId:t.dataId,group:t.group,namespaceId:e,tenant:e};return l?t.beta=!0:t.show="all",m.a.get("v1/cs/configs",{params:t}).then(function(e){var t=l?e.data:e;if(!t)return!1;var n=t.type,a=t.content,r=t.configTags,o=t.betaIps;return i.setState({betaIps:o}),i.changeForm(Object(x.a)(Object(x.a)({},t),{},{config_tags:r?r.split(","):[]})),i.initMoacoEditor(n,a),i.codeVal=a,i.setState({tagDataSource:i.state.form.config_tags}),e})}},{key:"getSubscribesByNamespace",value:function(){var a=this,e=Object(p.a)("namespace"),t=this.state.form,n=t.dataId,t=t.group;return m.a.get("v1/cs/configs/listener",{params:{dataId:n,group:t,namespaceId:e,tenant:e}}).then(function(e){var t=a.state.subscriberDataSource,n=e.lisentersGroupkeyStatus;return n&&a.setState({subscriberDataSource:t.concat(Object.keys(n))}),e})}},{key:"validation",value:function(){var e=this.props.locale,t=this.state.form,n=t.dataId,t=t.group;return n?!!t||(this.setState({groupError:{validateState:"error",help:e.homeApplication}}),!1):(this.setState({dataIdError:{validateState:"error",help:e.recipientFrom}}),!1)}},{key:"render",value:function(){var t=this,e=this.state,n=e.loading,a=e.betaIps,r=e.openAdvancedSettings,o=e.isBeta,i=e.isNewConfig,l=e.betaPublishSuccess,s=e.form,u=e.tagDataSource,d=e.tabActiveKey,c=e.dataIdError,c=void 0===c?{}:c,f=e.groupError,f=void 0===f?{}:f,p=e.subscriberDataSource,e=e.editorClass,h=this.props.locale,m=void 0===h?{}:h;return C.a.createElement("div",{className:"config-editor"},C.a.createElement(g.a,{shape:"flower",style:{position:"relative",width:"100%"},visible:n,tip:"Loading...",color:"#333"},C.a.createElement("h1",null,m.toedit),l&&C.a.createElement(E.a,{shape:"wrapped",activeKey:d,onChange:function(e){return t.clickTab(e)}},j.map(function(e){return C.a.createElement(E.a.Item,{title:m[e],key:e},m[e])})),C.a.createElement(S.a,Object.assign({className:"new-config-form"},{labelCol:{span:2},wrapperCol:{span:22}}),C.a.createElement(S.a.Item,{label:m.namespace,required:!0},C.a.createElement("p",null,this.tenant)),C.a.createElement(S.a.Item,Object.assign({label:"Data ID",required:!0},c),C.a.createElement(k.a,{value:s.dataId,onChange:function(e){return t.changeForm({dataId:e},function(){return t.setState({dataIdError:{}})})},disabled:!i})),C.a.createElement(S.a.Item,Object.assign({label:"Group",required:!0},f),C.a.createElement(k.a,{value:s.group,onChange:function(e){return t.changeForm({group:e},function(){return t.setState({groupError:{}})})},disabled:!i})),C.a.createElement(S.a.Item,{label:" "},C.a.createElement("a",{onClick:function(){return t.setState({openAdvancedSettings:!r})}},r?m.collapse:m.groupNotEmpty)),r&&C.a.createElement(C.a.Fragment,null,C.a.createElement(S.a.Item,{label:m.tags},C.a.createElement(M.a,{size:"medium",hasArrow:!0,autoWidth:!0,mode:"tag",filterLocal:!0,value:s.config_tags,dataSource:u,onChange:function(e){return t.setConfigTags(e)},hasClear:!0})),C.a.createElement(S.a.Item,{label:m.targetEnvironment},C.a.createElement(k.a,{value:s.appName,onChange:function(e){return t.changeForm({appName:e})}}))),C.a.createElement(S.a.Item,{label:m.description},C.a.createElement(k.a.TextArea,{value:s.desc,"aria-label":"TextArea",onChange:function(e){return t.changeForm({desc:e})}})),!i&&"production"!==d&&C.a.createElement(S.a.Item,{label:m.betaPublish},!l&&C.a.createElement(w.a,{checked:o,onChange:function(e){return t.setState({isBeta:e})}},m.betaSwitchPrompt),o&&C.a.createElement(M.a,{size:"medium",hasArrow:!0,autoWidth:!0,mode:"tag",filterLocal:!0,dataSource:p,onChange:function(e){return t.setState({betaIps:e.join(",")})},hasClear:!0,value:a?a.split(","):[]})),C.a.createElement(S.a.Item,{label:m.format},C.a.createElement(b.a.Group,{defaultValue:"text",value:s.type,onChange:function(e){t.initMoacoEditor(e,s.content),t.changeForm({type:e})}},P.map(function(e){return C.a.createElement(b.a,{value:e.value,key:e.value},e.label)}))),C.a.createElement(S.a.Item,{label:C.a.createElement("div",{className:"help-label"},C.a.createElement("span",null,m.configcontent),C.a.createElement(v.a,{trigger:C.a.createElement(_.a,{type:"help",size:"small"}),align:"t",style:{marginRight:5},triggerType:"hover"},C.a.createElement("p",null,m.escExit),C.a.createElement("p",null,m.releaseBeta)),C.a.createElement("span",null,":"))},C.a.createElement("div",{id:"container",className:e,style:{minHeight:450}}))),C.a.createElement(O,null,C.a.createElement(N,{span:"24",className:"button-list"},o&&l&&"production"!==d&&C.a.createElement(y.a,{size:"large",type:"primary",onClick:function(){return t.stopBeta().then(function(){t.successDialog.current.getInstance().openDialog(Object(x.a)({title:C.a.createElement("div",null,m.stopPublishBeta),isok:!0},s))})}},m.stopPublishBeta),o&&"production"!==d&&C.a.createElement(y.a,{size:"large",type:"primary",disabled:!a||l,onClick:function(){return t.openDiff("publishBeta")}},m.release),C.a.createElement(y.a,{type:"primary",disabled:"production"===d,onClick:function(){return t.openDiff("publish")}},m.publish),C.a.createElement(y.a,{type:"normal",onClick:function(){return t.goBack()}},m.back))),C.a.createElement(D.a,{ref:this.diffEditorDialog,publishConfig:function(e){t.setCodeVal(e),t[t.diffcb]().then(function(e){e&&(e=m.toedit,i&&(e=m.newConfigEditor),"publishBeta"===t.diffcb&&(e=m.betaPublish),"publish"===t.diffcb&&"beta"===d&&(e=m.stopPublishBeta,t.stopBeta()),t.successDialog.current.getInstance().openDialog(Object(x.a)({title:C.a.createElement("div",null,e),isok:!0},s)))})},title:m.dialogTitle,currentArea:m.dialogCurrentArea,originalArea:m.dialogOriginalArea}),C.a.createElement(T.a,{ref:this.successDialog})))}}]),n}(C.a.Component)).displayName="ConfigEditor",c=f))||c;t.a=n},function(e,t,n){"use strict";n(52);var a=n(33),c=n.n(a),a=(n(64),n(46)),f=n.n(a),a=(n(175),n(74)),p=n.n(a),a=(n(36),n(10)),h=n.n(a),a=(n(32),n(18)),m=n.n(a),a=(n(35),n(19)),r=n.n(a),a=(n(49),n(27)),o=n.n(a),i=n(14),l=n(15),s=n(22),u=n(17),d=n(16),a=(n(26),n(8)),a=n.n(a),g=(n(403),n(117)),y=n.n(g),g=(n(63),n(20)),v=n.n(g),g=(n(66),n(41)),g=n.n(g),_=(n(39),n(5)),b=n.n(_),_=n(0),w=n.n(_),M=n(1),k=n(48),_=n(137),S=n.n(_),E=n(69),x=(n(741),b.a.Item),C=g.a.Row,L=g.a.Col,T=v.a.Column,D=y.a.Panel,g=(0,a.a.config)(((_=function(e){Object(u.a)(a,e);var t=Object(d.a)(a);function a(e){var n;return Object(i.a)(this,a),(n=t.call(this,e)).getQueryLater=function(){setTimeout(function(){return n.queryClusterStateList()})},n.setNowNameSpace=function(e,t){return n.setState({nowNamespaceName:e,nowNamespaceId:t})},n.rowColor=function(e){return{className:(e.voteFor,"")}},n.state={loading:!1,total:0,pageSize:10,currentPage:1,keyword:"",dataSource:[]},n.field=new o.a(Object(s.a)(n)),n}return Object(l.a)(a,[{key:"openLoading",value:function(){this.setState({loading:!0})}},{key:"closeLoading",value:function(){this.setState({loading:!1})}},{key:"openEditServiceDialog",value:function(){try{this.editServiceDialog.current.getInstance().show(this.state.service)}catch(e){}}},{key:"queryClusterStateList",value:function(){var n=this,e=this.state,t=e.currentPage,a=e.pageSize,r=e.keyword,e=e.withInstances,e=["withInstances=".concat(void 0!==e&&e),"pageNo=".concat(t),"pageSize=".concat(a),"keyword=".concat(r)];Object(M.b)({url:"v1/core/cluster/nodes?".concat(e.join("&")),beforeSend:function(){return n.openLoading()},success:function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},t=e.count,e=e.data;n.setState({dataSource:void 0===e?[]:e,total:void 0===t?0:t})},error:function(){return n.setState({dataSource:[],total:0,currentPage:0})},complete:function(){return n.closeLoading()}})}},{key:"leave",value:function(e){var t=this;this.openLoading(),S.a.post("v1/core/cluster/server/leave",e).then(function(){t.queryClusterStateList(),t.closeLoading()}).catch(function(){t.queryClusterStateList(),t.closeLoading()})}},{key:"showLeaveDialog",value:function(e){var t=this,n=this.props.locale,n=void 0===n?{}:n;r.a.confirm({title:n.confirm,content:n.confirmTxt,onOk:function(){return t.leave([e])},onCancel:function(){}})}},{key:"renderCol",value:function(e,t,n){var a=this.props.locale,a=void 0===a?{}:a;return w.a.createElement(m.a,{onClick:this.showLeaveDialog.bind(this,e),type:"primary",warning:!0},a.leave)}},{key:"render",value:function(){var t=this,e=this.props.locale,a=void 0===e?{}:e,e=a.pubNoData,n=a.clusterNodeList,r=a.nodeIp,o=a.nodeIpPlaceholder,i=a.query,l=this.state,s=l.keyword,l=(l.nowNamespaceName,l.nowNamespaceId),u=this.field,d=u.init,u=u.getValue;return this.init=d,this.getValue=u,w.a.createElement("div",{className:"main-container cluster-management"},w.a.createElement(c.a,{shape:"flower",style:{position:"relative",width:"100%"},visible:this.state.loading,tip:"Loading...",color:"#333"},w.a.createElement(E.a,{title:n,desc:l,nameSpace:!0}),w.a.createElement(k.a,{setNowNameSpace:this.setNowNameSpace,namespaceCallBack:this.getQueryLater}),w.a.createElement(C,{className:"demo-row",style:{marginBottom:10,padding:0}},w.a.createElement(L,{span:"24"},w.a.createElement(b.a,{inline:!0,field:this.field},w.a.createElement(x,{label:r},w.a.createElement(h.a,{placeholder:o,style:{width:200},value:s,onChange:function(e){return t.setState({keyword:e})},onPressEnter:function(){return t.setState({currentPage:1},function(){return t.queryClusterStateList()})}})),w.a.createElement(x,{label:""},w.a.createElement(m.a,{type:"primary",onClick:function(){return t.setState({currentPage:1},function(){return t.queryClusterStateList()})},style:{marginRight:10}},i))))),w.a.createElement(C,{style:{padding:0}},w.a.createElement(L,{span:"24",style:{padding:0}},w.a.createElement(v.a,{dataSource:this.state.dataSource,locale:{empty:e},rowProps:function(e){return t.rowColor(e)}},w.a.createElement(T,{title:a.nodeIp,dataIndex:"address",width:"20%"}),w.a.createElement(T,{title:a.nodeState,dataIndex:"state",width:"20%",cell:function(e,t,n){return"UP"===e?w.a.createElement(p.a,{key:"p_p_".concat(e),type:"primary",color:"green"},e):"DOWN"===e?w.a.createElement(p.a,{key:"p_p_".concat(e),type:"primary",color:"red"},e):"SUSPICIOUS"===e?w.a.createElement(p.a,{key:"p_p_".concat(e),type:"primary",color:"orange"},e):w.a.createElement(p.a,{key:"p_p_".concat(e),type:"primary",color:"turquoise"},e)}}),w.a.createElement(T,{title:a.extendInfo,dataIndex:"extendInfo",width:"30%",cell:function(e,t,n){return w.a.createElement(y.a,null,w.a.createElement(D,{title:a.extendInfo},w.a.createElement("ul",null,w.a.createElement("li",null,w.a.createElement("pre",null,JSON.stringify(e,null,4))))))}}),w.a.createElement(T,{title:a.operation,dataIndex:"address",width:"20%",cell:this.renderCol.bind(this)})))),this.state.total>this.state.pageSize&&w.a.createElement("div",{style:{marginTop:10,textAlign:"right"}},w.a.createElement(f.a,{current:this.state.currentPage,total:this.state.total,pageSize:this.state.pageSize,onChange:function(e){return t.setState({currentPage:e},function(){return t.queryClusterStateList()})}}))))}}]),a}(w.a.Component)).displayName="ClusterNodeList",n=_))||n;t.a=g},function(e,t,n){"use strict";n(52);var a=n(33),r=n.n(a),a=(n(32),n(18)),o=n.n(a),a=(n(395),n(139)),i=n.n(a),a=(n(43),n(24)),l=n.n(a),a=(n(36),n(10)),s=n.n(a),u=n(61),a=(n(49),n(27)),d=n.n(a),a=(n(35),n(19)),c=n.n(a),a=(n(51),n(25)),f=n.n(a),p=n(14),h=n(15),m=n(22),g=n(17),y=n(16),a=(n(26),n(8)),a=n.n(a),v=(n(59),n(29)),_=n.n(v),v=(n(126),n(88)),v=n.n(v),b=(n(39),n(5)),w=n.n(b),b=n(65),M=n.n(b),b=n(0),k=n.n(b),S=n(105),E=n(1),x=n(47),C=n(138),L=(n(670),w.a.Item),T=v.a.Group,D=_.a.AutoComplete,v=(0,a.a.config)(((b=function(e){Object(g.a)(n,e);var t=Object(y.a)(n);function n(e){var l;return Object(p.a)(this,n),(l=t.call(this,e)).publicConfigBeforeCheck=function(t){var e=l.props.locale,n=void 0===e?{}:e,e=l.state.addonBefore;Object(E.b)({url:"v1/cs/configs",data:{show:"all",dataId:e+l.field.getValue("dataId"),group:l.field.getValue("group"),tenant:Object(E.a)("namespace")||""},success:function(e){f.a.error({content:n.dataIdExists,align:"cc cc"})},error:function(e){403===(e||{}).status?c.a.alert({content:n.publishFailed403}):l._publishConfig(t)}})},l._publishConfig=function(e){var n=Object(m.a)(l),t=l.props.locale,a=void 0===t?{}:t,t=l.state,r=t.addonBefore,o=t.config_tags,t=t.configType,i=(l.tenant=Object(E.a)("namespace")||"",{dataId:r+l.field.getValue("dataId"),group:l.field.getValue("group"),content:e,desc:l.field.getValue("desc"),config_tags:o.join(),type:t,appName:l.inApp?l.edasAppId:l.field.getValue("appName"),tenant:l.tenant});l.serverId=Object(E.a)("serverId")||"center";Object(E.b)({type:"post",contentType:"application/x-www-form-urlencoded",url:"v1/cs/configs",data:i,beforeSend:function(){l.openLoading()},success:function(e){var t={};t.maintitle=a.newListingMain,t.title=a.newListing,t.content="",t.dataId=i.dataId,t.group=i.group,!0===e?(n.group=i.group,n.dataId=i.dataId,Object(E.c)({group:i.group,dataId:i.dataId}),t.isok=!0):(t.isok=!1,t.message=e.message),n.successDialog.current.getInstance().openDialog(t)},complete:function(){l.closeLoading(),l.goList()},error:function(e){l.closeLoading(),c.a.alert({content:a.publishFailed})}})},l.successDialog=k.a.createRef(),l.field=new d.a(Object(m.a)(l)),l.edasAppName=Object(E.a)("edasAppName")||"",l.edasAppId=Object(E.a)("edasAppId")||"",l.inApp=l.edasAppName,l.field.setValue("appName",l.inApp?l.edasAppName:""),l.inEdas=window.globalConfig.isParentEdas(),l.dataId=Object(E.a)("dataId")||"",l.group=Object(E.a)("group")||"DEFAULT_GROUP",l.searchDataId=Object(E.a)("searchDataId")||"",l.searchGroup=Object(E.a)("searchGroup")||"",l.state={configType:"text",codeValue:"",envname:"",targetEnvName:"",groups:[],groupNames:[],envlist:[],tagLst:[],config_tags:[],envvalues:[],showmore:!1,loading:!1,encrypt:!1,addonBefore:"",showGroupWarning:!1,editorClass:"editor-normal"},l.codeValue="",l.mode="text",l.ips="",l}return Object(h.a)(n,[{key:"componentDidMount",value:function(){var e=this;this.betaips=document.getElementById("betaips"),this.chontenttab=document.getElementById("chontenttab"),this.tenant=Object(E.a)("namespace")||"",this.field.setValue("group",this.group),window.monaco?this.initMoacoEditor():window.importEditor(function(){e.initMoacoEditor()}),this.initFullScreenEvent()}},{key:"changeModel",value:function(e){var t,n;this.monacoEditor?(t=this.monacoEditor.getModel(),n=this.monacoEditor.getValue(),n=window.monaco.editor.createModel(n,e),this.monacoEditor.setModel(n),t&&t.dispose()):(M()("#container").empty(),this.monacoEditor=window.monaco.editor.create(document.getElementById("container"),{model:null}))}},{key:"initMoacoEditor",value:function(){this.monacoEditor=window.monaco.editor.create(document.getElementById("container"),{value:this.codeValue,language:this.state.configType,codeLens:!0,selectOnLineNumbers:!0,roundedSelection:!1,readOnly:!1,lineNumbersMinChars:!0,theme:"vs-dark",folding:!0,showFoldingControls:"always",cursorStyle:"line",automaticLayout:!0})}},{key:"initFullScreenEvent",value:function(){var t=this;document.body.addEventListener("keydown",function(e){"F1"===e.key&&(e.preventDefault(),t.setState({editorClass:"editor-full-screen"})),"Escape"===e.key&&t.setState({editorClass:"editor-normal"})})}},{key:"setGroup",value:function(e){this.group=e||"",this.field.setValue("group",this.group),this.inEdas&&this.setState({showGroupWarning:""!==this.group&&this.state.groupNames.indexOf(e)<0})}},{key:"tagSearch",value:function(e){var t=this.state.tagLst;t.includes(e)||this.setState({tagLst:[e].concat(Object(u.a)(t))})}},{key:"setConfigTags",value:function(n){5<n.length&&n.pop(),n.forEach(function(e,t){-1===e.indexOf(",")&&-1===e.indexOf("=")||n.splice(t,1)}),this.setState({tagLst:n,config_tags:n})}},{key:"onInputUpdate",value:function(a){var t=this;this.inputtimmer&&clearTimeout(this.inputtimmer),this.inputtimmer=setTimeout(function(){var e=t.state.tagLst,n=!1;e.forEach(function(e,t){e.value===a&&(n=!0)}),n||e.push({value:a,label:a,time:Math.random()}),t.setState({tagLst:e})},500)}},{key:"toggleMore",value:function(){this.setState({showmore:!this.state.showmore})}},{key:"goList",value:function(){this.tenant=Object(E.a)("namespace")||"",this.serverId=Object(E.a)("serverId")||"",this.props.history.push(Object(x.a)("/configurationManagement",{serverId:this.serverId,group:this.searchGroup,dataId:this.searchDataId,namespace:this.tenant}))}},{key:"openLoading",value:function(){this.setState({loading:!0})}},{key:"closeLoading",value:function(){this.setState({loading:!1})}},{key:"newChangeConfig",value:function(e){this.setState({configType:e}),this.changeModel(e)}},{key:"setCodeValue",value:function(e){this.setState({codeValue:e})}},{key:"publishConfig",value:function(){var a=this,e=this.props.locale,r=void 0===e?{}:e;this.field.validate(function(e,t){var n;e||(e=a.state.configType,n="",(n=a.monacoEditor?a.monacoEditor.getValue():a.codeValue)?C.a.validate({content:n,type:e})?a.publicConfigBeforeCheck(n):c.a.confirm({content:r.confirmSyanx,onOk:function(){a.publicConfigBeforeCheck(n)}}):f.a.error({content:r.dataRequired,align:"cc cc"}))})}},{key:"changeEnv",value:function(e){this.targetEnvs=e,this.setState({envvalues:e})}},{key:"changeBeta",value:function(e){this.betaips.style.display=e?"block":"none"}},{key:"getIps",value:function(e){this.ips=e}},{key:"validateChart",value:function(e,t,n){var a=this.props.locale,a=void 0===a?{}:a;/[@#\$%\^&\*\s]+/g.test(t)?n(a.doNotEnter):n()}},{key:"render",value:function(){var t=this,e=this.props.locale,e=void 0===e?{}:e,n=this.field.init,a=this.state.editorClass;return k.a.createElement(r.a,{shape:"flower",tip:"Loading...",style:{width:"100%",position:"relative"},visible:this.state.loading,color:"#333"},k.a.createElement("h1",null,e.newListing),k.a.createElement(w.a,Object.assign({className:"new-config-form",field:this.field},{labelCol:{span:2},wrapperCol:{span:22}}),k.a.createElement(w.a.Item,{label:e.namespace,required:!0},k.a.createElement("p",null,this.tenant)),k.a.createElement(L,{label:"Data ID",required:!0},k.a.createElement(s.a,Object.assign({},n("dataId",{rules:[{required:!0,message:e.newConfig},{validator:this.validateChart.bind(this)}]}),{maxLength:255,addonTextBefore:this.state.addonBefore?k.a.createElement("div",{style:{minWidth:100,color:"#373D41"}},this.state.addonBefore):null}))),k.a.createElement(L,{label:"Group",required:!0},k.a.createElement(D,Object.assign({style:{width:"100%"},size:"large",hasArrow:!0,dataSource:this.state.groups,placeholder:e.groupPlaceholder,defaultValue:this.group},n("group",{rules:[{required:!0,message:e.moreAdvanced},{maxLength:127,message:e.groupNotEmpty},{validator:this.validateChart.bind(this)}]}),{onChange:this.setGroup.bind(this),hasClear:!0}))),k.a.createElement(L,{label:" ",style:{display:this.state.showGroupWarning?"block":"none"}},k.a.createElement(f.a,{type:"warning",size:"medium",animation:!1},e.annotation)),k.a.createElement(L,{label:" "},k.a.createElement("div",null,k.a.createElement("a",{style:{fontSize:"12px"},onClick:this.toggleMore.bind(this)},this.state.showmore?e.dataIdLength:e.collapse))),k.a.createElement(L,{label:e.tags,className:"more-item".concat(this.state.showmore?"":" hide")},k.a.createElement(_.a,{size:"medium",showSearch:!0,hasArrow:!0,style:{width:"100%",height:"100%!important"},autoWidth:!0,mode:"multiple",filterLocal:!0,placeholder:e.pleaseEnterTag,dataSource:this.state.tagLst,value:this.state.config_tags,onChange:this.setConfigTags.bind(this),onSearch:function(e){return t.tagSearch(e)},hasClear:!0})),k.a.createElement(L,{label:e.groupIdCannotBeLonger,className:"more-item".concat(this.state.showmore?"":" hide")},k.a.createElement(s.a,Object.assign({},n("appName"),{readOnly:this.inApp}))),k.a.createElement(L,{label:e.description},k.a.createElement(s.a.TextArea,Object.assign({htmlType:"text",multiple:!0,rows:3},n("desc")))),k.a.createElement(L,{label:e.targetEnvironment},k.a.createElement(T,{dataSource:[{value:"text",label:"TEXT"},{value:"json",label:"JSON"},{value:"xml",label:"XML"},{value:"yaml",label:"YAML"},{value:"html",label:"HTML"},{value:"properties",label:"Properties"}],value:this.state.configType,onChange:this.newChangeConfig.bind(this)})),k.a.createElement(L,{label:k.a.createElement("span",null,e.configurationFormat,k.a.createElement(i.a,{trigger:k.a.createElement(l.a,{type:"help",size:"small",style:{color:"#1DC11D",margin:"0 5px",verticalAlign:"middle"}}),align:"t",style:{marginRight:5},triggerType:"hover"},k.a.createElement("p",null,e.configureContentsOf),k.a.createElement("p",null,e.fullScreen)),":"),required:!0},k.a.createElement("div",{id:"container",className:a,style:{minHeight:450}})),k.a.createElement(L,{label:" "},k.a.createElement("div",{style:{textAlign:"right"}},k.a.createElement(o.a,{type:"primary",style:{marginRight:10},onClick:this.publishConfig.bind(this)},e.escExit),k.a.createElement(o.a,{type:"normal",onClick:this.goList.bind(this)},e.release)))),k.a.createElement(S.a,{ref:this.successDialog}))}}]),n}(k.a.Component)).displayName="NewConfig",n=b))||n;t.a=v},function(e,t,n){"use strict";n(171);var a=n(102),r=n.n(a),a=(n(36),n(10)),o=n.n(a),i=n(31),a=(n(49),n(27)),l=n.n(a),a=(n(51),n(25)),s=n.n(a),u=n(14),d=n(15),c=n(22),f=n(17),p=n(16),a=(n(26),n(8)),a=n.n(a),h=(n(39),n(5)),m=n.n(h),h=n(0),g=n.n(h),h=n(40),y=(n(627),n(135)),v=n(101),_=m.a.Item,n=(n=a.a.config,Object(h.g)(h=n(((a=function(e){Object(f.a)(n,e);var t=Object(p.a)(n);function n(e){var a;return Object(u.a)(this,n),(a=t.call(this,e)).handleSubmit=function(){var e=a.props.locale,n=void 0===e?{}:e;a.field.validate(function(e,t){e||Object(v.c)(t).then(function(e){localStorage.setItem("token",JSON.stringify(e)),a.props.history.push("/")}).catch(function(){s.a.error({content:n.invalidUsernameOrPassword})})})},a.onKeyDown=function(e){"Enter"===e.key&&(e.preventDefault(),e.stopPropagation(),a.handleSubmit())},a.field=new l.a(Object(c.a)(a)),a}return Object(d.a)(n,[{key:"componentDidMount",value:function(){var e;localStorage.getItem("token")&&(e=location.href.split("#"),e=Object(i.a)(e,1)[0],location.href="".concat(e,"#/"))}},{key:"render",value:function(){var e=this.props.locale,e=void 0===e?{}:e;return g.a.createElement("div",{className:"home-page"},g.a.createElement(y.a,null),g.a.createElement("section",{className:"top-section",style:{background:"url(img/black_dot.png) repeat",backgroundSize:"14px 14px"}},g.a.createElement("div",{className:"vertical-middle product-area"},g.a.createElement("img",{className:"product-logo",src:"img/nacos.png"}),g.a.createElement("p",{className:"product-desc"},e.productDesc)),g.a.createElement("div",{className:"animation animation1"}),g.a.createElement("div",{className:"animation animation2"}),g.a.createElement("div",{className:"animation animation3"}),g.a.createElement("div",{className:"animation animation4"}),g.a.createElement("div",{className:"animation animation5"}),g.a.createElement(r.a,{className:"login-panel",contentHeight:"auto"},g.a.createElement("div",{className:"login-header"},e.login),g.a.createElement("div",{className:"internal-sys-tip"},g.a.createElement("div",null,e.internalSysTip1),g.a.createElement("div",null,e.internalSysTip2)),g.a.createElement(m.a,{className:"login-form",field:this.field},g.a.createElement(_,null,g.a.createElement(o.a,Object.assign({},this.field.init("username",{rules:[{required:!0,message:e.usernameRequired}]}),{placeholder:e.pleaseInputUsername,onKeyDown:this.onKeyDown}))),g.a.createElement(_,null,g.a.createElement(o.a,Object.assign({htmlType:"password",placeholder:e.pleaseInputPassword},this.field.init("password",{rules:[{required:!0,message:e.passwordRequired}]}),{onKeyDown:this.onKeyDown}))),g.a.createElement(_,{label:" "},g.a.createElement(m.a.Submit,{onClick:this.handleSubmit},e.submit))))))}}]),n}(g.a.Component)).displayName="Login",h=a))||h)||h);t.a=n},function(e,t,n){"use strict";n(52);var a=n(33),m=n.n(a),a=(n(64),n(46)),g=n.n(a),a=(n(32),n(18)),y=n.n(a),a=(n(36),n(10)),v=n.n(a),_=n(21),a=(n(51),n(25)),o=n.n(a),a=(n(49),n(27)),r=n.n(a),i=n(14),l=n(15),s=n(22),u=n(17),d=n(16),a=(n(26),n(8)),a=n.n(a),c=(n(63),n(20)),b=n.n(c),c=(n(66),n(41)),c=n.n(c),f=(n(39),n(5)),w=n.n(f),f=n(0),M=n.n(f),f=n(37),p=n(118),h=n(1),k=n(48),S=n(69),E=(n(740),w.a.Item),x=c.a.Row,C=c.a.Col,L=b.a.Column,f=Object(f.b)(function(e){return{subscriberData:e.subscribers}},{getSubscribers:p.b,removeSubscribers:p.c})(c=(0,a.a.config)(((n=function(e){Object(u.a)(a,e);var t=Object(d.a)(a);function a(e){var n;return Object(i.a)(this,a),(n=t.call(this,e)).switchNamespace=function(){n.props.removeSubscribers()},n.setNowNameSpace=function(e,t){return n.setState({nowNamespaceName:e,nowNamespaceId:t})},n.state={loading:!1,total:0,pageSize:10,pageNo:1,search:{serviceName:Object(h.a)("name")||"",groupName:Object(h.a)("groupName")||""},nowNamespaceId:Object(h.a)("namespace")||""},n.field=new r.a(Object(s.a)(n)),n}return Object(l.a)(a,[{key:"componentDidMount",value:function(){this.state.search.serviceName&&this.querySubscriberList()}},{key:"openLoading",value:function(){this.setState({loading:!0})}},{key:"closeLoading",value:function(){this.setState({loading:!1})}},{key:"querySubscriberList",value:function(){var e=this.props.locale.searchServiceNamePrompt,t=this.state,n=t.search,a=t.pageSize,r=t.pageNo,t=t.nowNamespaceId,t=void 0===t?"":t;n.serviceName?this.props.getSubscribers(Object(_.a)(Object(_.a)({},n),{},{pageSize:a,pageNo:r,namespaceId:t})):o.a.error(e)}},{key:"render",value:function(){var t=this,e=this.props,n=e.locale,n=void 0===n?{}:n,e=e.subscriberData,e=void 0===e?{}:e,a=e.count,a=void 0===a?0:a,e=e.subscribers,e=void 0===e?[]:e,r=n.pubNoData,o=n.subscriberList,i=n.serviceName,l=n.serviceNamePlaceholder,s=n.groupName,u=n.groupNamePlaceholder,d=n.query,c=this.state,f=c.search,c=(c.nowNamespaceName,c.nowNamespaceId),p=this.field,h=p.init,p=p.getValue;return this.init=h,this.getValue=p,M.a.createElement("div",{className:"main-container subscriber-list"},M.a.createElement(m.a,{shape:"flower",style:{position:"relative",width:"100%"},visible:this.state.loading,tip:"Loading...",color:"#333"},M.a.createElement(S.a,{title:o,desc:c,nameSpace:!0}),M.a.createElement(k.a,{setNowNameSpace:this.setNowNameSpace,namespaceCallBack:this.switchNamespace}),M.a.createElement(x,{className:"demo-row",style:{marginBottom:10,padding:0}},M.a.createElement(C,{span:"24"},M.a.createElement(w.a,{inline:!0,field:this.field},M.a.createElement(E,{label:i,required:!0},M.a.createElement(v.a,{placeholder:l,style:{width:200},value:f.serviceName,onChange:function(e){return t.setState({search:Object(_.a)(Object(_.a)({},f),{},{serviceName:e})})},onPressEnter:function(){return t.setState({pageNo:1},function(){return t.querySubscriberList()})}})),M.a.createElement(E,{label:s},M.a.createElement(v.a,{placeholder:u,style:{width:200},value:f.groupName,onChange:function(e){return t.setState({search:Object(_.a)(Object(_.a)({},f),{},{groupName:e})})},onPressEnter:function(){return t.setState({pageNo:1},function(){return t.querySubscriberList()})}})),M.a.createElement(E,{label:""},M.a.createElement(y.a,{type:"primary",onClick:function(){return t.setState({pageNo:1},function(){return t.querySubscriberList()})},style:{marginRight:10}},d))))),M.a.createElement(x,{style:{padding:0}},M.a.createElement(C,{span:"24",style:{padding:0}},M.a.createElement(b.a,{dataSource:e,locale:{empty:r}},M.a.createElement(L,{title:n.address,dataIndex:"addrStr"}),M.a.createElement(L,{title:n.clientVersion,dataIndex:"agent"}),M.a.createElement(L,{title:n.appName,dataIndex:"app"})))),a>this.state.pageSize&&M.a.createElement("div",{style:{marginTop:10,textAlign:"right"}},M.a.createElement(g.a,{current:this.state.pageNo,total:a,pageSize:this.state.pageSize,onChange:function(e){return t.setState({pageNo:e},function(){return t.querySubscriberList()})}}))))}}]),a}(M.a.Component)).displayName="SubscriberList",c=n))||c)||c;t.a=f},function(e,t,n){"use strict";n(43);function o(e){var t=void 0===(t=localStorage.token)?"{}":t,t=(Object(y.c)(t)&&JSON.parse(t)||{}).globalAdmin;return["naming"===e?void 0:v,{key:"serviceManagementVirtual",children:[{key:"serviceManagement",url:"/serviceManagement"},{key:"subscriberList",url:"/subscriberList"}]},t?_:void 0,{key:"namespace",url:"/namespace"},{key:"clusterManagementVirtual",children:[{key:"clusterManagement",url:"/clusterManagement"}]}].filter(function(e){return e})}var a=n(24),i=n.n(a),r=n(14),l=n(15),s=n(17),u=n(16),a=(n(26),n(8)),a=n.n(a),d=n(21),c=(n(80),n(50)),f=n.n(c),c=n(0),p=n.n(c),c=n(40),h=n(37),m=n(135),g=n(101),y=n(47),v={key:"configurationManagementVirtual",children:[{key:"configurationManagement",url:"/configurationManagement"},{key:"historyRollback",url:"/historyRollback"},{key:"listeningToQuery",url:"/listeningToQuery"}]},_={key:"authorityControl",children:[{key:"userList",url:"/userManagement"},{key:"roleManagement",url:"/rolesManagement"},{key:"privilegeManagement",url:"/permissionsManagement"}]},b=f.a.SubMenu,w=f.a.Item,c=(n=Object(h.b)(function(e){return Object(d.a)(Object(d.a)({},e.locale),e.base)},{getState:g.b}),h=a.a.config,Object(c.g)(a=n(a=h(((g=function(e){Object(s.a)(n,e);var t=Object(u.a)(n);function n(){return Object(r.a)(this,n),t.apply(this,arguments)}return Object(l.a)(n,[{key:"componentDidMount",value:function(){this.props.getState()}},{key:"goBack",value:function(){this.props.history.goBack()}},{key:"navTo",value:function(e){var t=this.props.location.search,t=new URLSearchParams(t);t.set("namespace",window.nownamespace),t.set("namespaceShowName",window.namespaceShowName),this.props.history.push([e,"?",t.toString()].join(""))}},{key:"isCurrentPath",value:function(e){return e===this.props.location.pathname?"current-path next-selected":void 0}},{key:"defaultOpenKeys",value:function(){for(var t=this,e=o(this.props.functionMode),n=0,a=e.length;n<a;n++){var r=e[n].children;if(r&&r.filter(function(e){return e.url===t.props.location.pathname}).length)return String(n)}}},{key:"isShowGoBack",value:function(){var t=[];return o(this.props.functionMode).forEach(function(e){e.url&&t.push(e.url),e.children&&e.children.forEach(function(e){e=e.url;return t.push(e)})}),!t.includes(this.props.location.pathname)}},{key:"render",value:function(){var a=this,e=this.props,t=e.locale,r=void 0===t?{}:t,t=e.version,e=e.functionMode,e=o(e);return p.a.createElement("section",{className:"next-shell next-shell-desktop next-shell-brand",style:{minHeight:"100vh"}},p.a.createElement(m.a,null),p.a.createElement("section",{className:"next-shell-sub-main"},p.a.createElement("div",{className:"main-container next-shell-main"},p.a.createElement("div",{className:"left-panel next-aside-navigation"},p.a.createElement("div",{className:"next-shell-navigation next-shell-mini next-shell-aside",style:{padding:0}},this.isShowGoBack()?p.a.createElement("div",{className:"go-back",onClick:function(){return a.goBack()}},p.a.createElement(i.a,{type:"arrow-left"})):p.a.createElement(p.a.Fragment,null,p.a.createElement("h1",{className:"nav-title"},r.nacosName,p.a.createElement("span",null,t)),p.a.createElement(f.a,{defaultOpenKeys:this.defaultOpenKeys(),className:"next-nav next-normal next-active next-right next-no-arrow next-nav-embeddable",openMode:"single"},e.map(function(e,n){return e.children?p.a.createElement(b,{key:String(n),label:r[e.key]},e.children.map(function(e,t){return p.a.createElement(w,{key:[n,t].join("-"),onClick:function(){return a.navTo(e.url)},className:a.isCurrentPath(e.url)},r[e.key])})):p.a.createElement(w,{key:String(n),className:["first-menu",a.isCurrentPath(e.url)].filter(function(e){return e}).join(" "),onClick:function(){return a.navTo(e.url)}},r[e.key])}))))),p.a.createElement("div",{className:"right-panel next-shell-sub-main"},this.props.children))))}}]),n}(p.a.Component)).displayName="MainLayout",a=g))||a)||a)||a);t.a=c},function(e,t,n){"use strict";n(52);var a=n(33),r=n.n(a),a=(n(64),n(46)),o=n.n(a),a=(n(63),n(20)),i=n.n(a),a=(n(36),n(10)),l=n.n(a),a=(n(59),n(29)),s=n.n(a),a=(n(49),n(27)),u=n.n(a),d=n(31),c=n(14),f=n(15),p=n(22),h=n(17),m=n(16),a=(n(26),n(8)),a=n.n(a),g=(n(66),n(41)),g=n.n(g),y=(n(39),n(5)),v=n.n(y),y=n(0),_=n.n(y),b=n(48),w=n(1),M=n(103),k=(n(697),v.a.Item),S=g.a.Row,E=g.a.Col,g=(0,a.a.config)(((y=function(e){Object(h.a)(n,e);var t=Object(m.a)(n);function n(e){var a;return Object(c.a)(this,n),(a=t.call(this,e)).queryTrackQuery=function(){var l=Object(p.a)(a),e="",s=a.getValue("type");if(1===s){var t=a.getValue("ip"),e="v1/cs/listener?ip=".concat(t),t=window.nownamespace||Object(w.a)("namespace")||"";t&&(e+="&tenant=".concat(t))}else{var t=a.getValue("dataId"),n=a.getValue("group");if(!t||!n)return!1;e="v1/cs/configs/listener?dataId=".concat(t,"&group=").concat(n)}Object(w.b)({url:e,beforeSend:function(){l.openLoading()},success:function(e){if(200===e.collectStatus){var t,n,a,r,o=[],i=e.lisentersGroupkeyStatus;for(t in i)1===s?(n={},a=t.split("+"),r=(a=Object(d.a)(a,2))[0],a=a[1],n.dataId=r,n.group=a,n.md5=i[t],o.push(n)):((r={}).ip=t,r.md5=i[t],o.push(r));l.setState({dataSource:o||[],total:o.length||0})}},complete:function(){l.closeLoading()}})},a.changePage=function(e){a.setState({currentPage:e})},a.getQueryLater=function(){setTimeout(function(){a.queryTrackQuery()})},a.state={value:"",visible:!1,loading:!1,total:0,pageSize:10,currentPage:1,dataSource:[]},a.field=new u.a(Object(p.a)(a)),a.group=Object(w.a)("listeningGroup")||"",a.dataId=Object(w.a)("listeningDataId")||"",a.serverId=Object(w.a)("listeningServerId")||"",a.tenant=Object(w.a)("namespace")||"",a}return Object(f.a)(n,[{key:"componentDidMount",value:function(){this.field.setValue("type",0),this.field.setValue("group",this.group),this.field.setValue("dataId",this.dataId)}},{key:"onSearch",value:function(){}},{key:"onChange",value:function(){}},{key:"openLoading",value:function(){this.setState({loading:!0})}},{key:"closeLoading",value:function(){this.setState({loading:!1})}},{key:"showMore",value:function(){}},{key:"resetSearch",value:function(){this.field.reset(),this.forceUpdate()}},{key:"renderStatus",value:function(e,t,n){var a=this.props.locale,a=void 0===a?{}:a;return _.a.createElement("div",null,!0===n.pushStatus?_.a.createElement("span",{style:{color:"green"}},a.success):_.a.createElement("span",{style:{color:"red"}},a.failure))}},{key:"render",value:function(){var t=this,e=this.props.locale,e=void 0===e?{}:e,n=this.field,a=n.init,n=n.getValue,a=(this.init=a,this.getValue=n,[{label:e.configuration,value:0},{label:"IP",value:1}]);return _.a.createElement(_.a.Fragment,null,_.a.createElement(r.a,{shape:"flower",style:{position:"relative"},visible:this.state.loading,tip:"Loading...",color:"#333"},_.a.createElement(b.a,{left:e.listenerQuery,namespaceCallBack:this.getQueryLater}),_.a.createElement(S,{className:"demo-row",style:{marginBottom:10,padding:0}},_.a.createElement(E,{span:"24"},_.a.createElement(v.a,{inline:!0,field:this.field},_.a.createElement(k,{label:"".concat(e.queryDimension)},_.a.createElement(s.a,Object.assign({dataSource:a,style:{width:200}},this.init("type"),{onChange:function(e){t.field.setValue("type",e),t.queryTrackQuery()}}))),_.a.createElement(k,{label:"Data ID",style:{display:0===this.getValue("type")?"":"none"},required:!0},_.a.createElement(l.a,Object.assign({placeholder:e.pleaseEnterTheDataId,style:{width:200}},this.init("dataId",{rules:[{required:!0,message:e.dataIdCanNotBeEmpty}]})))),_.a.createElement(k,{label:"Group",style:{display:0===this.getValue("type")?"":"none"},required:!0},_.a.createElement(l.a,Object.assign({placeholder:e.pleaseInputGroup,style:{width:200}},this.init("group",{rules:[{required:!0,message:e.groupCanNotBeEmpty}]})))),_.a.createElement(k,{label:"IP:",style:{display:0===this.getValue("type")?"none":""}},_.a.createElement(l.a,Object.assign({placeholder:e.pleaseInputIp,style:{width:200,boxSize:"border-box"}},this.init("ip")))),_.a.createElement(k,{label:""},_.a.createElement(v.a.Submit,{validate:!0,type:"primary",onClick:this.queryTrackQuery,style:{marginRight:10}},e.query))))),_.a.createElement("div",{style:{position:"relative"}},_.a.createElement(M.a,{total:this.state.total})),_.a.createElement(S,{style:{padding:0}},_.a.createElement(E,{span:"24",style:{padding:0}},1===this.getValue("type")?_.a.createElement(i.a,{dataSource:this.state.dataSource,fixedHeader:!0,maxBodyHeight:500,locale:{empty:e.pubNoData}},_.a.createElement(i.a.Column,{title:"Data ID",dataIndex:"dataId"}),_.a.createElement(i.a.Column,{title:"Group",dataIndex:"group"}),_.a.createElement(i.a.Column,{title:"MD5",dataIndex:"md5"})):_.a.createElement(i.a,{dataSource:this.state.dataSource,fixedHeader:!0,maxBodyHeight:400,locale:{empty:e.pubNoData}},_.a.createElement(i.a.Column,{title:"IP",dataIndex:"ip"}),_.a.createElement(i.a.Column,{title:"MD5",dataIndex:"md5"})))),_.a.createElement("div",{style:{marginTop:10,textAlign:"right"}},_.a.createElement(o.a,{current:this.state.currentPage,total:this.state.total,pageSize:this.state.pageSize,onChange:this.changePage}),",")))}}]),n}(_.a.Component)).displayName="ListeningToQuery",n=y))||n;t.a=g},function(e,t,n){"use strict";n(52);var a=n(33),r=n.n(a),a=(n(64),n(46)),o=n.n(a),a=(n(63),n(20)),i=n.n(a),a=(n(39),n(5)),l=n.n(a),a=(n(59),n(29)),s=n.n(a),a=(n(51),n(25)),u=n.n(a),a=(n(49),n(27)),d=n.n(a),c=n(14),f=n(15),p=n(22),h=n(17),m=n(16),a=(n(26),n(8)),a=n.n(a),g=n(0),y=n.n(g),v=n(48),_=n(1),b=(n(694),n(90)),w=n(103),a=(0,a.a.config)(((g=function(e){Object(h.a)(n,e);var t=Object(m.a)(n);function n(e){return Object(c.a)(this,n),(e=t.call(this,e)).field=new d.a(Object(p.a)(e)),e.appName=Object(_.a)("appName")||"",e.preAppName=e.appName,e.group=Object(_.a)("historyGroup")||"",e.preGroup=e.group,e.dataId=Object(_.a)("historyDataId")||"",e.preDataId=e.dataId,e.serverId=Object(_.a)("historyServerId")||"",e.state={value:"",visible:!1,total:0,pageSize:10,currentPage:1,dataSource:[],fieldValue:[],showAppName:!1,showgroup:!1,dataId:e.dataId,group:e.group,appName:e.appName,selectValue:[],loading:!1},e.diffEditorDialog=y.a.createRef(),e}return Object(f.a)(n,[{key:"componentDidMount",value:function(){this.field.setValue("group",this.group),this.field.setValue("dataId",this.dataId)}},{key:"openLoading",value:function(){this.setState({loading:!0})}},{key:"closeLoading",value:function(){this.setState({loading:!1})}},{key:"cleanAndGetData",value:function(){0<arguments.length&&void 0!==arguments[0]&&arguments[0]&&(this.dataId="",this.group="",this.setState({group:"",dataId:""}),Object(_.c)("historyGroup",""),Object(_.c)("historyDataId","")),this.getData(),this.getConfigList()}},{key:"getData",value:function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:1,t=this;if(this.serverId=Object(_.a)("serverId")||"",!this.state.dataId)return!1;Object(_.b)({beforeSend:function(){t.openLoading()},url:"v1/cs/history?search=accurate&dataId=".concat(this.state.dataId,"&group=").concat(this.state.group,"&&pageNo=").concat(e,"&pageSize=").concat(this.state.pageSize),success:function(e){null!=e&&t.setState({dataSource:e.pageItems||[],total:e.totalCount,currentPage:e.pageNumber})},complete:function(){t.closeLoading()}})}},{key:"renderCol",value:function(e,t,n){var a=this.props.locale,a=void 0===a?{}:a;return y.a.createElement("div",null,y.a.createElement("a",{onClick:this.goDetail.bind(this,n),style:{marginRight:5}},a.details),y.a.createElement("span",{style:{marginRight:5}},"|"),y.a.createElement("a",{style:{marginRight:5},onClick:this.goRollBack.bind(this,n)},a.rollback),y.a.createElement("span",{style:{marginRight:5}},"|"),y.a.createElement("a",{style:{marginRight:5},onClick:this.goCompare.bind(this,n)},a.compare))}},{key:"changePage",value:function(e){this.setState({currentPage:e}),this.getData(e)}},{key:"chooseFieldChange",value:function(e){this.setState({fieldValue:e})}},{key:"selectAll",value:function(){var e=this.props.locale,e=void 0===e?{}:e;return this.state.dataId?this.state.group?(this.state.dataId!==this.preDataId&&(this.preDataId=this.state.dataId),this.state.group!==this.preGroup&&(this.preGroup=this.state.group),void this.getData()):(u.a.error(e.groupCanNotBeEmpty),!1):(u.a.error(e.dataIdCanNotBeEmpty),!1)}},{key:"resetAll",value:function(){this.dataId="",this.group="",this.setState({selectValue:[],dataId:"",appName:"",group:"",showAppName:!1,showgroup:!1}),Object(_.c)({group:"",dataId:""})}},{key:"chooseEnv",value:function(e){}},{key:"goDetail",value:function(e){this.serverId=Object(_.a)("serverId")||"center",this.tenant=Object(_.a)("namespace")||"",this.props.history.push("/historyDetail?serverId=".concat(this.serverId||"","&dataId=").concat(e.dataId,"&group=").concat(e.group,"&nid=").concat(e.id,"&namespace=").concat(this.tenant))}},{key:"goCompare",value:function(e){var n=this,t=Object(_.a)("namespace")||"",a=Object(_.a)("serverId")||"center";this.getConfig(-1,t,a,this.dataId,this.group).then(function(t){n.getHistoryConfig(e.id,n.dataId,n.group).then(function(e){n.diffEditorDialog.current.getInstance().openDialog(e.content,t.content)})})}},{key:"getConfig",value:function(e,r,t,o,i){var l=this;return new Promise(function(t,e){l.props.locale;var n=l,a=(l.tenant=r,l.serverId=r,"v1/cs/configs?show=all&dataId=".concat(o,"&group=").concat(i));Object(_.b)({url:a,beforeSend:function(){n.openLoading()},success:function(e){null!=e&&t(e)},complete:function(){n.closeLoading()}})})}},{key:"getHistoryConfig",value:function(n,a,r){var o=this;return new Promise(function(t,e){o.props.locale;Object(_.b)({url:"v1/cs/history?dataId=".concat(a,"&group=").concat(r,"&nid=").concat(n),success:function(e){null!=e&&t(e)}})})}},{key:"goRollBack",value:function(e){this.serverId=Object(_.a)("serverId")||"center",this.tenant=Object(_.a)("namespace")||"",this.props.history.push("/configRollback?serverId=".concat(this.serverId||"","&dataId=").concat(e.dataId,"&group=").concat(e.group,"&nid=").concat(e.id,"&namespace=").concat(this.tenant,"&nid=").concat(e.id))}},{key:"getConfigList",value:function(){this.props.locale;this.tenant=Object(_.a)("namespace")||"";var r=this;Object(_.b)({url:"v1/cs/history/configs?tenant=".concat(this.tenant),success:function(e){if(null!=e){for(var t=[],n=[],a=0;a<e.length;a++)t.push({value:e[a].dataId,label:e[a].dataId}),n.push({value:e[a].group,label:e[a].group});r.setState({dataIds:t,groups:n})}}})}},{key:"render",value:function(){var n=this,e=this.props.locale,t=void 0===e?{}:e,e=this.field.init;return this.init=e,y.a.createElement("div",null,y.a.createElement(r.a,{shape:"flower",style:{position:"relative",width:"100%"},visible:this.state.loading,tip:"Loading...",color:"#333"},y.a.createElement(v.a,{left:t.toConfigure,namespaceCallBack:this.cleanAndGetData.bind(this)}),y.a.createElement("div",null,y.a.createElement(l.a,{inline:!0,field:this.field},y.a.createElement(l.a.Item,{label:"Data ID",required:!0},y.a.createElement(s.a,{style:{width:200},size:"medium",hasArrow:!0,mode:"single",placeholder:t.dataId,dataSource:this.state.dataIds,hasClear:!0,showSearch:!0,value:this.state.dataId,onChange:function(e){n.setState({dataId:e=e||""}),Object(_.c)("historyDataId",e)},onSearch:function(e){var t=n.state.dataIds;t.includes(e)||n.setState({dataIds:t.concat(e)})}})),y.a.createElement(l.a.Item,{label:"Group:",required:!0},y.a.createElement(s.a,{style:{width:200},size:"medium",hasArrow:!0,mode:"single",placeholder:t.group,dataSource:this.state.groups,value:this.state.group,hasClear:!0,showSearch:!0,onChange:function(e){n.setState({group:e=e||""}),Object(_.c)("historyGroup",e)},onSearch:function(e){var t=n.state.groups;t.includes(e)||n.setState({groups:t.concat(e)})}})),y.a.createElement(l.a.Item,{label:""},y.a.createElement(l.a.Submit,{validate:!0,type:"primary",onClick:this.selectAll.bind(this),style:{marginRight:10}},t.query)))),y.a.createElement("div",{style:{position:"relative",width:"100%",overflow:"hidden",height:"40px"}},y.a.createElement("h3",{style:{height:30,width:"100%",lineHeight:"30px",padding:0,margin:0,fontSize:16}},y.a.createElement(w.a,{total:this.state.total}))),y.a.createElement("div",null,y.a.createElement(i.a,{dataSource:this.state.dataSource,locale:{empty:t.pubNoData}},y.a.createElement(i.a.Column,{title:"Data ID",dataIndex:"dataId"}),y.a.createElement(i.a.Column,{title:"Group",dataIndex:"group"}),y.a.createElement(i.a.Column,{title:t.operator,dataIndex:"srcUser"}),y.a.createElement(i.a.Column,{title:t.lastUpdateTime,dataIndex:"lastModifiedTime",cell:function(e){if(!e)return"";try{return new Date(e).toLocaleString(t.momentLocale)}catch(e){return""}}}),y.a.createElement(i.a.Column,{title:t.operation,cell:this.renderCol.bind(this)}))),y.a.createElement("div",{style:{marginTop:10,textAlign:"right"}},y.a.createElement(o.a,{current:this.state.currentPage,total:this.state.total,pageSize:this.state.pageSize,onChange:this.changePage.bind(this)}),","),y.a.createElement(b.a,{ref:this.diffEditorDialog,title:t.historyCompareTitle,currentArea:t.historyCompareSelectedVersion,originalArea:t.historyCompareLastVersion})))}}]),n}(y.a.Component)).displayName="HistoryRollback",n=g))||n;t.a=a},function(e,t,n){"use strict";n(32);var a=n(18),r=n.n(a),a=(n(36),n(10)),o=n.n(a),a=(n(35),n(19)),i=n.n(a),a=(n(49),n(27)),l=n.n(a),s=n(14),u=n(15),d=n(22),c=n(17),f=n(16),a=(n(26),n(8)),a=n.n(a),p=(n(39),n(5)),h=n.n(p),p=n(0),m=n.n(p),g=n(1),y=n(47),v=(n(692),h.a.Item),a=(0,a.a.config)(((p=function(e){Object(c.a)(n,e);var t=Object(f.a)(n);function n(e){return Object(s.a)(this,n),(e=t.call(this,e)).field=new l.a(Object(d.a)(e)),e.dataId=Object(g.a)("dataId")||"yanlin",e.group=Object(g.a)("group")||"DEFAULT_GROUP",e.serverId=Object(g.a)("serverId")||"center",e.nid=Object(g.a)("nid")||"",e.state={envName:"",visible:!1,showmore:!1},e}return Object(u.a)(n,[{key:"componentDidMount",value:function(){var e=this.props.locale,e=void 0===e?{}:e;this.typeMap={U:"publish",I:e.rollbackDelete,D:"publish"},this.typeMapName={U:e.update,I:e.insert,D:e.rollbackDelete},this.getDataDetail()}},{key:"toggleMore",value:function(){this.setState({showmore:!this.state.showmore})}},{key:"getDataDetail",value:function(){var n=this,e=(this.tenant=Object(g.a)("namespace")||"",this.serverId=Object(g.a)("serverId")||"center","v1/cs/history?dataId=".concat(this.dataId,"&group=").concat(this.group,"&nid=").concat(this.nid));Object(g.b)({url:e,success:function(e){var t;null!=e&&(t=n.serverId,n.id=(e=e).id,n.field.setValue("dataId",e.dataId),n.field.setValue("content",e.content),n.field.setValue("appName",e.appName),n.field.setValue("opType",e.opType.trim()),n.opType=e.opType,n.field.setValue("group",e.group),n.field.setValue("md5",e.md5),n.field.setValue("envName",t),n.setState({envName:t}))}})}},{key:"goList",value:function(){var e=Object(g.a)("namespace"),t=this.serverId,n=this.dataId,a=this.group;this.props.history.push(Object(y.a)("/historyRollback",{serverId:t,dataId:n,group:a,namespace:e}))}},{key:"onOpenConfirm",value:function(){var e=this.props.locale,n=void 0===e?{}:e,a=this,r="post",e="";"I"===this.opType.trim()&&(r="delete",e=n.additionalRollbackMessage),i.a.confirm({title:n.rollBack,content:m.a.createElement("div",{style:{marginTop:"-20px",maxWidth:"500px"}},m.a.createElement("h3",null,n.determine," ",n.followingConfiguration," ",e),m.a.createElement("p",null,m.a.createElement("span",{style:{color:"#999",marginRight:5}},"Data ID"),m.a.createElement("span",{style:{color:"#c7254e"}},a.field.getValue("dataId"))),m.a.createElement("p",null,m.a.createElement("span",{style:{color:"#999",marginRight:5}},"Group"),m.a.createElement("span",{style:{color:"#c7254e"}},a.field.getValue("group")))),onOk:function(){a.tenant=Object(g.a)("namespace")||"",a.serverId=Object(g.a)("serverId")||"center",a.dataId=a.field.getValue("dataId"),a.group=a.field.getValue("group");var e={appName:a.field.getValue("appName"),dataId:a.dataId,group:a.group,content:a.field.getValue("content"),tenant:a.tenant},t="v1/cs/configs";"I"===a.opType.trim()&&(t="v1/cs/configs?dataId=".concat(a.dataId,"&group=").concat(a.group),e={}),Object(g.b)({type:r,contentType:"application/x-www-form-urlencoded",url:t,data:e,success:function(e){!0===e&&i.a.alert({content:n.rollbackSuccessful})}})}})}},{key:"getOpType",value:function(e,t){return e?{U:t.update,I:t.insert,D:t.deleteAction}[e]:""}},{key:"render",value:function(){var e=this.props.locale,e=void 0===e?{}:e,t=this.field.init,n={labelCol:{fixedSpan:6},wrapperCol:{span:18}},a=this.getOpType;return m.a.createElement("div",null,m.a.createElement("h1",null,e.configurationRollback),m.a.createElement(h.a,{field:this.field},m.a.createElement(v,Object.assign({label:e.namespace,required:!0},n),m.a.createElement("p",null,this.tenant)),m.a.createElement(v,Object.assign({label:"Data ID",required:!0},n),m.a.createElement(o.a,Object.assign({htmlType:"text",readOnly:!0},t("dataId"))),m.a.createElement("div",{style:{marginTop:10}},m.a.createElement("a",{style:{fontSize:"12px"},onClick:this.toggleMore.bind(this)},this.state.showmore?e.collapse:e.more))),m.a.createElement("div",{style:{overflow:"hidden",height:this.state.showmore?"auto":"0"}},m.a.createElement(v,Object.assign({label:"Group:",required:!0},n),m.a.createElement(o.a,Object.assign({htmlType:"text",readOnly:!0},t("group")))),m.a.createElement(v,Object.assign({label:e.home},n),m.a.createElement(o.a,Object.assign({htmlType:"text",readOnly:!0},t("appName"))))),m.a.createElement(v,Object.assign({label:e.actionType,required:!0},n),m.a.createElement(o.a,{htmlType:"text",readOnly:!0,value:a(t("opType").value,e)})),m.a.createElement(v,Object.assign({label:"MD5:",required:!0},n),m.a.createElement(o.a,Object.assign({htmlType:"text",readOnly:!0},t("md5")))),m.a.createElement(v,Object.assign({label:e.configuration,required:!0},n),m.a.createElement(o.a.TextArea,Object.assign({htmlType:"text",multiple:!0,rows:15,readOnly:!0},t("content")))),m.a.createElement(v,Object.assign({label:" "},n),m.a.createElement(r.a,{type:"primary",style:{marginRight:10},onClick:this.onOpenConfirm.bind(this)},e.rollBack),m.a.createElement(r.a,{type:"normal",onClick:this.goList.bind(this)},e.back))))}}]),n}(m.a.Component)).displayName="ConfigRollback",n=p))||n;t.a=a},function(e,t,n){"use strict";n(32);var a=n(18),r=n.n(a),a=(n(36),n(10)),o=n.n(a),a=(n(39),n(5)),i=n.n(a),a=(n(49),n(27)),l=n.n(a),s=n(14),u=n(15),d=n(22),c=n(17),f=n(16),a=(n(26),n(8)),a=n.n(a),p=n(0),h=n.n(p),m=n(1),a=(n(691),(0,a.a.config)(((p=function(e){Object(c.a)(n,e);var t=Object(f.a)(n);function n(e){return Object(s.a)(this,n),(e=t.call(this,e)).state={showmore:!1},e.edasAppName=Object(m.a)("edasAppName"),e.edasAppId=Object(m.a)("edasAppId"),e.inApp=e.edasAppName,e.field=new l.a(Object(d.a)(e)),e.dataId=Object(m.a)("dataId")||"yanlin",e.group=Object(m.a)("group")||"DEFAULT_GROUP",e.serverId=Object(m.a)("serverId")||"center",e.nid=Object(m.a)("nid")||"123509854",e.tenant=Object(m.a)("namespace")||"",e}return Object(u.a)(n,[{key:"componentDidMount",value:function(){this.getDataDetail()}},{key:"toggleMore",value:function(){this.setState({showmore:!this.state.showmore})}},{key:"getDataDetail",value:function(){this.props.locale;var t=this;Object(m.b)({url:"v1/cs/history?dataId=".concat(this.dataId,"&group=").concat(this.group,"&nid=").concat(this.nid),success:function(e){null!=e&&(t.field.setValue("dataId",(e=e).dataId),t.field.setValue("content",e.content),t.field.setValue("appName",t.inApp?t.edasAppName:e.appName),t.field.setValue("envs",t.serverId),t.field.setValue("srcUser",e.srcUser),t.field.setValue("srcIp",e.srcIp),t.field.setValue("opType",e.opType.trim()),t.field.setValue("group",e.group),t.field.setValue("md5",e.md5))}})}},{key:"goList",value:function(){this.props.history.push("/historyRollback?serverId=".concat(this.serverId,"&historyGroup=").concat(this.group,"&historyDataId=").concat(this.dataId,"&namespace=").concat(this.tenant))}},{key:"getOpType",value:function(e,t){return e?{U:t.update,I:t.insert,D:t.deleteAction}[e]:""}},{key:"render",value:function(){var e=this.props.locale,e=void 0===e?{}:e,t=this.field.init,n={labelCol:{fixedSpan:6},wrapperCol:{span:18}},a=this.getOpType;return h.a.createElement("div",null,h.a.createElement("h1",null,e.historyDetails),h.a.createElement(i.a,{field:this.field},h.a.createElement(i.a.Item,Object.assign({label:e.namespace,required:!0},n),h.a.createElement("p",null,this.tenant)),h.a.createElement(i.a.Item,Object.assign({label:"Data ID",required:!0},n),h.a.createElement(o.a,Object.assign({htmlType:"text",readOnly:!0},t("dataId"))),h.a.createElement("div",{style:{marginTop:10}},h.a.createElement("a",{style:{fontSize:"12px"},onClick:this.toggleMore.bind(this)},this.state.showmore?e.recipientFrom:e.moreAdvancedOptions))),h.a.createElement("div",{style:{overflow:"hidden",height:this.state.showmore?"auto":"0"}},h.a.createElement(i.a.Item,Object.assign({label:"Group",required:!0},n),h.a.createElement(o.a,Object.assign({htmlType:"text",readOnly:!0},t("group")))),h.a.createElement(i.a.Item,Object.assign({label:e.home},n),h.a.createElement(o.a,Object.assign({htmlType:"text",readOnly:!0},t("appName"))))),h.a.createElement(i.a.Item,Object.assign({label:e.operator,required:!0},n),h.a.createElement(o.a,Object.assign({htmlType:"text",readOnly:!0},t("srcUser")))),h.a.createElement(i.a.Item,Object.assign({label:e.sourceIp,required:!0},n),h.a.createElement(o.a,Object.assign({htmlType:"text",readOnly:!0},t("srcIp")))),h.a.createElement(i.a.Item,Object.assign({label:e.actionType,required:!0},n),h.a.createElement(o.a,{htmlType:"text",readOnly:!0,value:a(t("opType").value,e)})),h.a.createElement(i.a.Item,Object.assign({label:"MD5:",required:!0},n),h.a.createElement(o.a,Object.assign({htmlType:"text",readOnly:!0},t("md5")))),h.a.createElement(i.a.Item,Object.assign({label:e.configureContent,required:!0},n),h.a.createElement(o.a.TextArea,Object.assign({htmlType:"text",multiple:!0,rows:15,readOnly:!0},t("content")))),h.a.createElement(i.a.Item,Object.assign({label:" "},n),h.a.createElement(r.a,{type:"primary",onClick:this.goList.bind(this)},e.back))))}}]),n}(h.a.Component)).displayName="HistoryDetail",n=p))||n);t.a=a},function(e,t,n){"use strict";n(52);var a=n(33),r=n.n(a),a=(n(32),n(18)),o=n.n(a),a=(n(109),n(71)),i=n.n(a),a=(n(39),n(5)),l=n.n(a),a=(n(36),n(10)),s=n.n(a),a=(n(35),n(19)),u=n.n(a),a=(n(49),n(27)),d=n.n(a),c=n(14),f=n(15),p=n(22),h=n(17),m=n(16),a=(n(26),n(8)),a=n.n(a),g=n(0),y=n.n(g),v=n(105),_=n(1),b=n(47),a=(n(682),(0,a.a.config)(((g=function(e){Object(h.a)(n,e);var t=Object(m.a)(n);function n(e){return Object(c.a)(this,n),(e=t.call(this,e)).successDialog=y.a.createRef(),e.field=new d.a(Object(p.a)(e)),e.dataId=Object(_.a)("dataId")||"yanlin",e.group=Object(_.a)("group")||"",e.serverId=Object(_.a)("serverId")||"",e.state={configType:0,envvalues:[],commonvalue:[],envComponent:"",envGroups:[],envlist:[],loading:!1,showmore:!1},e.codeValue="",e.mode="text",e.ips="",e}return Object(f.a)(n,[{key:"componentDidMount",value:function(){this.getDataDetail()}},{key:"toggleMore",value:function(){this.setState({showmore:!this.state.showmore})}},{key:"getEnvList",value:function(e){this.setState({envvalues:e}),this.envs=e}},{key:"getDomain",value:function(){var t=this;Object(_.b)({url:"/diamond-ops/env/domain",success:function(e){200===e.code&&(e=e.data.envGroups,t.setState({envGroups:e}))}})}},{key:"getDataDetail",value:function(){var i=this,e=this.props.locale,l=void 0===e?{}:e,e=(this.tenant=Object(_.a)("namespace")||"",this.serverId=Object(_.a)("serverId")||"center","/diamond-ops/configList/detail/serverId/".concat(this.serverId,"/dataId/").concat(this.dataId,"/group/").concat(this.group,"/tenant/").concat(this.tenant,"?id="));"global"!==this.tenant&&this.tenant||(e="/diamond-ops/configList/detail/serverId/".concat(this.serverId,"/dataId/").concat(this.dataId,"/group/").concat(this.group,"?id=")),Object(_.b)({url:e,beforeSend:function(){i.openLoading()},success:function(e){if(200===e.code){for(var t=e.data,t=void 0===t?{}:t,n=(i.field.setValue("dataId",t.dataId),i.field.setValue("appName",t.appName),i.field.setValue("group",t.group),i.field.setValue("content",t.content||""),t.envs||[]),a=[],r=[],o=0;o<n.length;o++)r.push({value:n[o].serverId,label:n[o].name}),n[o].serverId===i.serverId&&a.push(i.serverId);i.setState({envlist:r,envvalues:a})}else u.a.alert({title:l.error,content:e.message})},complete:function(){i.closeLoading()}})}},{key:"goList",value:function(){this.props.history.push("/configurationManagement?serverId=".concat(this.serverId,"&group=").concat(this.group,"&dataId=").concat(this.dataId))}},{key:"sync",value:function(){var n=this,e=this.props.locale,a=void 0===e?{}:e,r={dataId:this.field.getValue("dataId"),appName:this.field.getValue("appName"),group:this.field.getValue("group"),content:this.field.getValue("content"),betaIps:this.ips,targetEnvs:this.envs};Object(_.b)({type:"put",contentType:"application/json",url:"/diamond-ops/configList/serverId/".concat(this.serverId,"/dataId/").concat(r.dataId,"/group/").concat(r.group,"?id="),data:JSON.stringify(r),success:function(e){var t={};t.maintitle=a.syncConfigurationMain,t.title=a.syncConfiguration,t.content="",t.dataId=r.dataId,t.group=r.group,t.isok=200===e.code,t.isok||(t.isok=!1,t.message=e.message),n.successDialog.current.openDialog(t)}})}},{key:"syncResult",value:function(){var e=this.field.getValue("dataId"),t=this.field.getValue("group");this.props.history.push(Object(b.a)("/diamond-ops/static/pages/config-sync/index.html",{dataId:e,gruop:t}))}},{key:"changeEnv",value:function(e){this.targetEnvs=e,this.setState({envvalues:e})}},{key:"getIps",value:function(e){this.ips=e}},{key:"goResult",value:function(){var e=this.serverId,t=this.dataId,n=this.group;this.props.history.push(Object(b.a)("/consistencyEfficacy",{serverId:e,dataId:t,group:n}))}},{key:"openLoading",value:function(){this.setState({loading:!0})}},{key:"closeLoading",value:function(){this.setState({loading:!1})}},{key:"render",value:function(){var e=this.field.init,t=this.props.locale,t=void 0===t?{}:t,n={labelCol:{span:2},wrapperCol:{span:22}};return y.a.createElement("div",null,y.a.createElement(r.a,{shape:"flower",style:{position:"relative",width:"100%"},visible:this.state.loading,tip:"Loading...",color:"#333"},y.a.createElement("h1",null,t.syncConfiguration),y.a.createElement(l.a,{field:this.field},y.a.createElement(l.a.Item,Object.assign({label:"Data ID",required:!0},n),y.a.createElement(s.a,Object.assign({htmlType:"text",disabled:"disabled"},e("dataId"))),y.a.createElement("div",{style:{marginTop:10}},y.a.createElement("a",{style:{fontSize:"12px"},onClick:this.toggleMore.bind(this)},this.state.showmore?t.collapse:t.advancedOptions))),y.a.createElement("div",{style:{overflow:"hidden",height:this.state.showmore?"auto":"0"}},y.a.createElement(l.a.Item,Object.assign({label:"Group ID",required:!0},n),y.a.createElement(s.a,Object.assign({htmlType:"text",disabled:"disabled"},e("group")))),y.a.createElement(l.a.Item,Object.assign({label:t.home,required:!0},n),y.a.createElement(s.a,Object.assign({htmlType:"text",disabled:"disabled"},e("appName"))))),y.a.createElement(l.a.Item,Object.assign({label:t.region,required:!0},n),y.a.createElement(s.a,Object.assign({htmlType:"text",disabled:"disabled"},e("envs")))),y.a.createElement(l.a.Item,Object.assign({label:t.configuration,required:!0},n),y.a.createElement(s.a.TextArea,Object.assign({htmlType:"text",multiple:!0,rows:15,disabled:"disabled"},e("content")))),y.a.createElement(l.a.Item,Object.assign({label:t.target,required:!0},n),y.a.createElement("div",null,y.a.createElement(i.a.Group,{value:this.state.envvalues,onChange:this.changeEnv.bind(this),dataSource:this.state.envlist}))),y.a.createElement(l.a.Item,Object.assign({label:" "},n),y.a.createElement("div",{style:{textAlign:"right"}},y.a.createElement(o.a,{type:"primary",onClick:this.sync.bind(this),style:{marginRight:10}},t.sync),y.a.createElement(o.a,{type:"light",onClick:this.goList.bind(this)},t.back)))),y.a.createElement(v.a,{ref:this.successDialog})))}}]),n}(y.a.Component)).displayName="ConfigSync",n=g))||n);t.a=a},function(e,t,F){"use strict";F.r(t),function(e){F(52);var t=F(33),a=F.n(t),t=(F(26),F(8)),r=F.n(t),o=F(14),i=F(15),l=F(17),s=F(16),n=F(21),t=F(0),u=F.n(t),t=F(23),t=F.n(t),d=F(119),c=F(411),f=F(423),p=F(37),h=F(40),m=F(81),g=(F(458),F(437)),y=F(28),v=F(435),_=F(426),b=F(434),w=F(442),M=F(427),k=F(432),S=F(441),E=F(440),x=F(439),C=F(438),L=F(424),T=F(429),D=F(425),O=F(436),N=F(433),P=F(431),j=F(430),I=F(428),R=F(421),Y=F(422),A=F(104),e=(F(744),e.hot,localStorage.getItem(y.f)||localStorage.setItem(y.f,"zh-CN"===navigator.language?"zh-CN":"en-US"),Object(d.b)(Object(n.a)(Object(n.a)({},Y.a),{},{routing:c.routerReducer}))),Y=Object(d.d)(e,Object(d.c)(Object(d.a)(f.a),window[y.i]?window[y.i]():function(e){return e})),H=[{path:"/",exact:!0,render:function(){return u.a.createElement(h.a,{to:"/welcome"})}},{path:"/welcome",component:R.a},{path:"/namespace",component:_.a},{path:"/newconfig",component:b.a},{path:"/configsync",component:w.a},{path:"/configdetail",component:M.a},{path:"/configeditor",component:k.a},{path:"/historyDetail",component:S.a},{path:"/configRollback",component:E.a},{path:"/historyRollback",component:x.a},{path:"/listeningToQuery",component:C.a},{path:"/configurationManagement",component:L.a},{path:"/serviceManagement",component:T.a},{path:"/serviceDetail",component:D.a},{path:"/subscriberList",component:O.a},{path:"/clusterManagement",component:N.a},{path:"/userManagement",component:P.a},{path:"/rolesManagement",component:I.a},{path:"/permissionsManagement",component:j.a}],e=Object(p.b)(function(e){return Object(n.a)({},e.locale)},{changeLanguage:A.a})(c=function(e){Object(l.a)(n,e);var t=Object(s.a)(n);function n(e){return Object(o.a)(this,n),(e=t.call(this,e)).state={shownotice:"none",noticecontent:"",nacosLoading:{}},e}return Object(i.a)(n,[{key:"componentDidMount",value:function(){var e=localStorage.getItem(y.f);this.props.changeLanguage(e)}},{key:"router",get:function(){return u.a.createElement(m.a,null,u.a.createElement(h.d,null,u.a.createElement(h.b,{path:"/login",component:v.a}),u.a.createElement(g.a,null,H.map(function(e){return u.a.createElement(h.b,Object.assign({key:e.path},e))}))))}},{key:"render",value:function(){var e=this.props.locale;return u.a.createElement(a.a,Object.assign({className:"nacos-loading",shape:"flower",tip:"loading...",visible:!1,fullScreen:!0},this.state.nacosLoading),u.a.createElement(r.a,{locale:e},this.router))}}]),n}(u.a.Component))||c;t.a.render(u.a.createElement(p.a,{store:Y},u.a.createElement(e,null)),document.getElementById("root"))}.call(this,F(444)(e))},function(e,t){e.exports=function(e){var t;return e.webpackPolyfill||((t=Object.create(e)).children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),Object.defineProperty(t,"exports",{enumerable:!0}),t.webpackPolyfill=1),t}},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(I,e,t){"use strict";
+/** @license React v16.14.0
+ * react.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */var d=t(186),t="function"==typeof Symbol&&Symbol.for,c=t?Symbol.for("react.element"):60103,u=t?Symbol.for("react.portal"):60106,n=t?Symbol.for("react.fragment"):60107,a=t?Symbol.for("react.strict_mode"):60108,r=t?Symbol.for("react.profiler"):60114,o=t?Symbol.for("react.provider"):60109,i=t?Symbol.for("react.context"):60110,l=t?Symbol.for("react.forward_ref"):60112,s=t?Symbol.for("react.suspense"):60113,f=t?Symbol.for("react.memo"):60115,p=t?Symbol.for("react.lazy"):60116,h="function"==typeof Symbol&&Symbol.iterator;function m(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var g={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},y={};function v(e,t,n){this.props=e,this.context=t,this.refs=y,this.updater=n||g}function _(){}function b(e,t,n){this.props=e,this.context=t,this.refs=y,this.updater=n||g}v.prototype.isReactComponent={},v.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error(m(85));this.updater.enqueueSetState(this,e,t,"setState")},v.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},_.prototype=v.prototype;var t=b.prototype=new _,w=(t.constructor=b,d(t,v.prototype),t.isPureReactComponent=!0,{current:null}),M=Object.prototype.hasOwnProperty,k={key:!0,ref:!0,__self:!0,__source:!0};function S(e,t,n){var a,r={},o=null,i=null;if(null!=t)for(a in void 0!==t.ref&&(i=t.ref),void 0!==t.key&&(o=""+t.key),t)M.call(t,a)&&!k.hasOwnProperty(a)&&(r[a]=t[a]);var l=arguments.length-2;if(1===l)r.children=n;else if(1<l){for(var s=Array(l),u=0;u<l;u++)s[u]=arguments[u+2];r.children=s}if(e&&e.defaultProps)for(a in l=e.defaultProps)void 0===r[a]&&(r[a]=l[a]);return{$$typeof:c,type:e,key:o,ref:i,props:r,_owner:w.current}}function E(e){return"object"==typeof e&&null!==e&&e.$$typeof===c}var x=/\/+/g,C=[];function L(e,t,n,a){var r;return C.length?((r=C.pop()).result=e,r.keyPrefix=t,r.func=n,r.context=a,r.count=0,r):{result:e,keyPrefix:t,func:n,context:a,count:0}}function T(e){e.result=null,e.keyPrefix=null,e.func=null,e.context=null,e.count=0,C.length<10&&C.push(e)}function D(e,t,n){return null==e?0:function e(t,n,a,r){var o=!1;if(null===(t="undefined"!=(l=typeof t)&&"boolean"!==l?t:null))o=!0;else switch(l){case"string":case"number":o=!0;break;case"object":switch(t.$$typeof){case c:case u:o=!0}}if(o)return a(r,t,""===n?"."+O(t,0):n),1;if(o=0,n=""===n?".":n+":",Array.isArray(t))for(var i=0;i<t.length;i++){var l,s=n+O(l=t[i],i);o+=e(l,s,a,r)}else if("function"==typeof(s=null!==t&&"object"==typeof t&&"function"==typeof(s=h&&t[h]||t["@@iterator"])?s:null))for(t=s.call(t),i=0;!(l=t.next()).done;)o+=e(l=l.value,s=n+O(l,i++),a,r);else if("object"===l)throw a=""+t,Error(m(31,"[object Object]"===a?"object with keys {"+Object.keys(t).join(", ")+"}":a,""));return o}(e,"",t,n)}function O(e,t){return"object"==typeof e&&null!==e&&null!=e.key?(e=e.key,n={"=":"=0",":":"=2"},"$"+(""+e).replace(/[=:]/g,function(e){return n[e]})):t.toString(36);var n}function N(e,t){e.func.call(e.context,t,e.count++)}function R(e,t,n){var a=e.result,r=e.keyPrefix;e=e.func.call(e.context,t,e.count++),Array.isArray(e)?P(e,a,n,function(e){return e}):null!=e&&(E(e)&&(t=r+(!(r=e).key||t&&t.key===e.key?"":(""+e.key).replace(x,"$&/")+"/")+n,e={$$typeof:c,type:r.type,key:t,ref:r.ref,props:r.props,_owner:r._owner}),a.push(e))}function P(e,t,n,a,r){var o="";D(e,R,t=L(t,o=null!=n?(""+n).replace(x,"$&/")+"/":o,a,r)),T(t)}var j={current:null};function Y(){var e=j.current;if(null===e)throw Error(m(321));return e}t={ReactCurrentDispatcher:j,ReactCurrentBatchConfig:{suspense:null},ReactCurrentOwner:w,IsSomeRendererActing:{current:!1},assign:d};e.Children={map:function(e,t,n){if(null==e)return e;var a=[];return P(e,a,null,t,n),a},forEach:function(e,t,n){if(null==e)return e;D(e,N,t=L(null,null,t,n)),T(t)},count:function(e){return D(e,function(){return null},null)},toArray:function(e){var t=[];return P(e,t,null,function(e){return e}),t},only:function(e){if(E(e))return e;throw Error(m(143))}},e.Component=v,e.Fragment=n,e.Profiler=r,e.PureComponent=b,e.StrictMode=a,e.Suspense=s,e.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=t,e.cloneElement=function(e,t,n){if(null==e)throw Error(m(267,e));var a=d({},e.props),r=e.key,o=e.ref,i=e._owner;if(null!=t)for(l in void 0!==t.ref&&(o=t.ref,i=w.current),void 0!==t.key&&(r=""+t.key),e.type&&e.type.defaultProps&&(s=e.type.defaultProps),t)M.call(t,l)&&!k.hasOwnProperty(l)&&(a[l]=(void 0===t[l]&&void 0!==s?s:t)[l]);var l=arguments.length-2;if(1===l)a.children=n;else if(1<l){for(var s=Array(l),u=0;u<l;u++)s[u]=arguments[u+2];a.children=s}return{$$typeof:c,type:e.type,key:r,ref:o,props:a,_owner:i}},e.createContext=function(e,t){return(e={$$typeof:i,_calculateChangedBits:t=void 0===t?null:t,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null}).Provider={$$typeof:o,_context:e},e.Consumer=e},e.createElement=S,e.createFactory=function(e){var t=S.bind(null,e);return t.type=e,t},e.createRef=function(){return{current:null}},e.forwardRef=function(e){return{$$typeof:l,render:e}},e.isValidElement=E,e.lazy=function(e){return{$$typeof:p,_ctor:e,_status:-1,_result:null}},e.memo=function(e,t){return{$$typeof:f,type:e,compare:void 0===t?null:t}},e.useCallback=function(e,t){return Y().useCallback(e,t)},e.useContext=function(e,t){return Y().useContext(e,t)},e.useDebugValue=function(){},e.useEffect=function(e,t){return Y().useEffect(e,t)},e.useImperativeHandle=function(e,t,n){return Y().useImperativeHandle(e,t,n)},e.useLayoutEffect=function(e,t){return Y().useLayoutEffect(e,t)},e.useMemo=function(e,t){return Y().useMemo(e,t)},e.useReducer=function(e,t,n){return Y().useReducer(e,t,n)},e.useRef=function(e){return Y().useRef(e)},e.useState=function(e){return Y().useState(e)},e.version="16.14.0"},function(b,e,t){"use strict";
+/** @license React v16.14.0
+ * react-dom.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */var w=t(0),y=t(186),r=t(452);function R(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}if(!w)throw Error(R(227));var A=!1,H=null,F=!1,z=null,W={onError:function(e){A=!0,H=e}};function V(e,t,n,a,r,o,i,l,s){A=!1,H=null,function(e,t,n,a,r,o,i,l,s){var u=Array.prototype.slice.call(arguments,3);try{t.apply(n,u)}catch(e){this.onError(e)}}.apply(W,arguments)}var B=null,U=null,K=null;function G(e,t,n){var a=e.type||"unknown-event";e.currentTarget=K(n),function(){var e;V.apply(this,arguments),A&&(e=H,A=!1,H=null,F||(F=!0,z=e))}(a,t,void 0,e),e.currentTarget=null}var q=null,$={};function J(){if(q)for(var e in $){var t=$[e],n=q.indexOf(e);if(!(-1<n))throw Error(R(96,e));if(!Q[n]){if(!t.extractEvents)throw Error(R(97,e));for(var a in n=(Q[n]=t).eventTypes){var r=void 0,o=n[a],i=t,l=a;if(Z.hasOwnProperty(l))throw Error(R(99,l));var s=(Z[l]=o).phasedRegistrationNames;if(s){for(r in s)s.hasOwnProperty(r)&&X(s[r],i,l);r=!0}else r=!!o.registrationName&&(X(o.registrationName,i,l),!0);if(!r)throw Error(R(98,a,e))}}}}function X(e,t,n){if(ee[e])throw Error(R(100,e));ee[e]=t,te[e]=t.eventTypes[n].dependencies}var Q=[],Z={},ee={},te={};function ne(e){var t,n=!1;for(t in e)if(e.hasOwnProperty(t)){var a=e[t];if(!$.hasOwnProperty(t)||$[t]!==a){if($[t])throw Error(R(102,t));$[t]=a,n=!0}}n&&J()}var ae=!("undefined"==typeof window||void 0===window.document||void 0===window.document.createElement),re=null,oe=null,ie=null;function le(e){if(e=U(e)){if("function"!=typeof re)throw Error(R(280));var t=e.stateNode;t&&(t=B(t),re(e.stateNode,e.type,t))}}function se(e){oe?ie?ie.push(e):ie=[e]:oe=e}function ue(){if(oe){var e=oe,t=ie;if(ie=oe=null,le(e),t)for(e=0;e<t.length;e++)le(t[e])}}function de(e,t){return e(t)}function ce(e,t,n,a,r){return e(t,n,a,r)}function fe(){}var pe=de,he=!1,me=!1;function ge(){null===oe&&null===ie||(fe(),ue())}function ye(e,t,n){if(me)return e(t,n);me=!0;try{pe(e,t,n)}finally{me=!1,ge()}}var ve=/^[: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][: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\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,_e=Object.prototype.hasOwnProperty,be={},we={};function Me(e,t,n,a){if(null==t||function(e,t,n,a){if(null===n||0!==n.type)switch(typeof t){case"function":case"symbol":return 1;case"boolean":return a?void 0:null!==n?!n.acceptsBooleans:"data-"!==(e=e.toLowerCase().slice(0,5))&&"aria-"!==e;default:return}}(e,t,n,a))return 1;if(!a&&null!==n)switch(n.type){case 3:return!t;case 4:return!1===t;case 5:return isNaN(t);case 6:return isNaN(t)||t<1}}function n(e,t,n,a,r,o){this.acceptsBooleans=2===t||3===t||4===t,this.attributeName=a,this.attributeNamespace=r,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=o}var i={},ke=("children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){i[e]=new n(e,0,!1,e,null,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];i[t]=new n(t,1,!1,e[1],null,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){i[e]=new n(e,2,!1,e.toLowerCase(),null,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){i[e]=new n(e,2,!1,e,null,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){i[e]=new n(e,3,!1,e.toLowerCase(),null,!1)}),["checked","multiple","muted","selected"].forEach(function(e){i[e]=new n(e,3,!0,e,null,!1)}),["capture","download"].forEach(function(e){i[e]=new n(e,4,!1,e,null,!1)}),["cols","rows","size","span"].forEach(function(e){i[e]=new n(e,6,!1,e,null,!1)}),["rowSpan","start"].forEach(function(e){i[e]=new n(e,5,!1,e.toLowerCase(),null,!1)}),/[\-:]([a-z])/g);function Se(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(ke,Se);i[t]=new n(t,1,!1,e,null,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(ke,Se);i[t]=new n(t,1,!1,e,"http://www.w3.org/1999/xlink",!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(ke,Se);i[t]=new n(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1)}),["tabIndex","crossOrigin"].forEach(function(e){i[e]=new n(e,1,!1,e.toLowerCase(),null,!1)}),i.xlinkHref=new n("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0),["src","href","action","formAction"].forEach(function(e){i[e]=new n(e,1,!1,e.toLowerCase(),null,!0)});t=w.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;function Ee(e,t,n,a){var r,o=i.hasOwnProperty(t)?i[t]:null;(null!==o?0!==o.type:a||(!(2<t.length)||"o"!==t[0]&&"O"!==t[0]||"n"!==t[1]&&"N"!==t[1]))&&(Me(t,n,o,a)&&(n=null),a||null===o?(r=t,(_e.call(we,r)||!_e.call(be,r)&&(ve.test(r)?we[r]=!0:void(be[r]=!0)))&&(null===n?e.removeAttribute(t):e.setAttribute(t,""+n))):o.mustUseProperty?e[o.propertyName]=null===n?3!==o.type&&"":n:(t=o.attributeName,a=o.attributeNamespace,null===n?e.removeAttribute(t):(n=3===(o=o.type)||4===o&&!0===n?"":""+n,a?e.setAttributeNS(a,t,n):e.setAttribute(t,n))))}t.hasOwnProperty("ReactCurrentDispatcher")||(t.ReactCurrentDispatcher={current:null}),t.hasOwnProperty("ReactCurrentBatchConfig")||(t.ReactCurrentBatchConfig={suspense:null});var xe=/^(.*)[\\\/]/,a="function"==typeof Symbol&&Symbol.for,Ce=a?Symbol.for("react.element"):60103,Le=a?Symbol.for("react.portal"):60106,Te=a?Symbol.for("react.fragment"):60107,De=a?Symbol.for("react.strict_mode"):60108,Oe=a?Symbol.for("react.profiler"):60114,Ne=a?Symbol.for("react.provider"):60109,Pe=a?Symbol.for("react.context"):60110,je=a?Symbol.for("react.concurrent_mode"):60111,Ye=a?Symbol.for("react.forward_ref"):60112,Ie=a?Symbol.for("react.suspense"):60113,Re=a?Symbol.for("react.suspense_list"):60120,Ae=a?Symbol.for("react.memo"):60115,He=a?Symbol.for("react.lazy"):60116,Fe=a?Symbol.for("react.block"):60121,ze="function"==typeof Symbol&&Symbol.iterator;function We(e){return null!==e&&"object"==typeof e&&"function"==typeof(e=ze&&e[ze]||e["@@iterator"])?e:null}function Ve(e){if(null!=e){if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case Te:return"Fragment";case Le:return"Portal";case Oe:return"Profiler";case De:return"StrictMode";case Ie:return"Suspense";case Re:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case Pe:return"Context.Consumer";case Ne:return"Context.Provider";case Ye:var t=(t=e.render).displayName||t.name||"";return e.displayName||(""!==t?"ForwardRef("+t+")":"ForwardRef");case Ae:return Ve(e.type);case Fe:return Ve(e.render);case He:if(e=1===e._status?e._result:null)return Ve(e)}}return null}function Be(e){var t="";do{switch(e.tag){case 3:case 4:case 6:case 7:case 10:case 9:var n="";break;default:var a=e._debugOwner,r=e._debugSource,o=Ve(e.type),n=null;a&&(n=Ve(a.type)),a=o,o="",r?o=" (at "+r.fileName.replace(xe,"")+":"+r.lineNumber+")":n&&(o=" (created by "+n+")"),n="\n    in "+(a||"Unknown")+o}}while(t+=n,e=e.return);return t}function Ue(e){switch(typeof e){case"boolean":case"number":case"object":case"string":case"undefined":return e;default:return""}}function Ke(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function Ge(e){e._valueTracker||(e._valueTracker=function(e){var t,n,a=Ke(e)?"checked":"value",r=Object.getOwnPropertyDescriptor(e.constructor.prototype,a),o=""+e[a];if(!e.hasOwnProperty(a)&&void 0!==r&&"function"==typeof r.get&&"function"==typeof r.set)return t=r.get,n=r.set,Object.defineProperty(e,a,{configurable:!0,get:function(){return t.call(this)},set:function(e){o=""+e,n.call(this,e)}}),Object.defineProperty(e,a,{enumerable:r.enumerable}),{getValue:function(){return o},setValue:function(e){o=""+e},stopTracking:function(){e._valueTracker=null,delete e[a]}}}(e))}function qe(e){if(e){var t=e._valueTracker;if(!t)return 1;var n=t.getValue(),a="";return(e=a=e?Ke(e)?e.checked?"true":"false":e.value:a)!==n&&(t.setValue(e),1)}}function $e(e,t){var n=t.checked;return y({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function Je(e,t){var n=null==t.defaultValue?"":t.defaultValue,a=null!=t.checked?t.checked:t.defaultChecked,n=Ue(null!=t.value?t.value:n);e._wrapperState={initialChecked:a,initialValue:n,controlled:"checkbox"===t.type||"radio"===t.type?null!=t.checked:null!=t.value}}function Xe(e,t){null!=(t=t.checked)&&Ee(e,"checked",t,!1)}function Qe(e,t){Xe(e,t);var n=Ue(t.value),a=t.type;if(null!=n)"number"===a?(0===n&&""===e.value||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if("submit"===a||"reset"===a)return void e.removeAttribute("value");t.hasOwnProperty("value")?et(e,t.type,n):t.hasOwnProperty("defaultValue")&&et(e,t.type,Ue(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked)}function Ze(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var a=t.type;if(!("submit"!==a&&"reset"!==a||void 0!==t.value&&null!==t.value))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}""!==(n=e.name)&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,""!==n&&(e.name=n)}function et(e,t,n){"number"===t&&e.ownerDocument.activeElement===e||(null==n?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}function tt(e,t){var n,a;return e=y({children:void 0},t),n=t.children,a="",w.Children.forEach(n,function(e){null!=e&&(a+=e)}),(t=a)&&(e.children=t),e}function nt(e,t,n,a){if(e=e.options,t){t={};for(var r=0;r<n.length;r++)t["$"+n[r]]=!0;for(n=0;n<e.length;n++)r=t.hasOwnProperty("$"+e[n].value),e[n].selected!==r&&(e[n].selected=r),r&&a&&(e[n].defaultSelected=!0)}else{for(n=""+Ue(n),t=null,r=0;r<e.length;r++){if(e[r].value===n)return e[r].selected=!0,void(a&&(e[r].defaultSelected=!0));null!==t||e[r].disabled||(t=e[r])}null!==t&&(t.selected=!0)}}function at(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(R(91));return y({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function rt(e,t){var n=t.value;if(null==n){if(n=t.children,t=t.defaultValue,null!=n){if(null!=t)throw Error(R(92));if(Array.isArray(n)){if(!(n.length<=1))throw Error(R(93));n=n[0]}t=n}n=t=null==t?"":t}e._wrapperState={initialValue:Ue(n)}}function ot(e,t){var n=Ue(t.value),a=Ue(t.defaultValue);null!=n&&((n=""+n)!==e.value&&(e.value=n),null==t.defaultValue&&e.defaultValue!==n&&(e.defaultValue=n)),null!=a&&(e.defaultValue=""+a)}function it(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!==t&&null!==t&&(e.value=t)}var a="http://www.w3.org/1999/xhtml",lt="http://www.w3.org/2000/svg";function st(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function ut(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?st(t):"http://www.w3.org/2000/svg"===e&&"foreignObject"===t?"http://www.w3.org/1999/xhtml":e}ct=function(e,t){if(e.namespaceURI!==lt||"innerHTML"in e)e.innerHTML=t;else{for((dt=dt||document.createElement("div")).innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=dt.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}};var dt,ct,ft="undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(e,t,n,a){MSApp.execUnsafeLocalFunction(function(){return ct(e,t)})}:ct;function pt(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}function ht(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var mt={animationend:ht("Animation","AnimationEnd"),animationiteration:ht("Animation","AnimationIteration"),animationstart:ht("Animation","AnimationStart"),transitionend:ht("Transition","TransitionEnd")},gt={},yt={};function vt(e){if(gt[e])return gt[e];if(mt[e]){var t,n=mt[e];for(t in n)if(n.hasOwnProperty(t)&&t in yt)return gt[e]=n[t]}return e}ae&&(yt=document.createElement("div").style,"AnimationEvent"in window||(delete mt.animationend.animation,delete mt.animationiteration.animation,delete mt.animationstart.animation),"TransitionEvent"in window||delete mt.transitionend.transition);var _t=vt("animationend"),bt=vt("animationiteration"),wt=vt("animationstart"),Mt=vt("transitionend"),kt="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),St=new("function"==typeof WeakMap?WeakMap:Map);function Et(e){var t=St.get(e);return void 0===t&&(t=new Map,St.set(e,t)),t}function xt(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else for(e=t;0!=(1026&(t=e).effectTag)&&(n=t.return),e=t.return;);return 3===t.tag?n:null}function Ct(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&(null!==(e=e.alternate)&&(t=e.memoizedState)),null!==t)return t.dehydrated}return null}function Lt(e){if(xt(e)!==e)throw Error(R(188))}function Tt(e){if(e=function(e){var t=e.alternate;if(!t){if(null===(t=xt(e)))throw Error(R(188));return t!==e?null:e}for(var n=e,a=t;;){var r=n.return;if(null===r)break;var o=r.alternate;if(null===o){if(null===(a=r.return))break;n=a}else{if(r.child===o.child){for(o=r.child;o;){if(o===n)return Lt(r),e;if(o===a)return Lt(r),t;o=o.sibling}throw Error(R(188))}if(n.return!==a.return)n=r,a=o;else{for(var i=!1,l=r.child;l;){if(l===n){i=!0,n=r,a=o;break}if(l===a){i=!0,a=r,n=o;break}l=l.sibling}if(!i){for(l=o.child;l;){if(l===n){i=!0,n=o,a=r;break}if(l===a){i=!0,a=o,n=r;break}l=l.sibling}if(!i)throw Error(R(189))}}if(n.alternate!==a)throw Error(R(190))}}if(3!==n.tag)throw Error(R(188));return n.stateNode.current===n?e:t}(e))for(var t=e;;){if(5===t.tag||6===t.tag)return t;if(t.child)t=(t.child.return=t).child;else{if(t===e)break;for(;!t.sibling;){if(!t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}}return null}function Dt(e,t){if(null==t)throw Error(R(30));return null==e?t:Array.isArray(e)?(Array.isArray(t)?e.push.apply(e,t):e.push(t),e):Array.isArray(t)?[e].concat(t):[e,t]}function Ot(e,t,n){Array.isArray(e)?e.forEach(t,n):e&&t.call(n,e)}var Nt=null;function Pt(e){if(e){var t=e._dispatchListeners,n=e._dispatchInstances;if(Array.isArray(t))for(var a=0;a<t.length&&!e.isPropagationStopped();a++)G(e,t[a],n[a]);else t&&G(e,t,n);e._dispatchListeners=null,e._dispatchInstances=null,e.isPersistent()||e.constructor.release(e)}}function jt(e){if(e=Nt=null!==e?Dt(Nt,e):Nt,Nt=null,e){if(Ot(e,Pt),Nt)throw Error(R(95));if(F)throw e=z,F=!1,z=null,e}}function Yt(e){return 3===(e=(e=e.target||e.srcElement||window).correspondingUseElement?e.correspondingUseElement:e).nodeType?e.parentNode:e}function It(e){if(!ae)return!1;var t=(e="on"+e)in document;return t||((t=document.createElement("div")).setAttribute(e,"return;"),t="function"==typeof t[e]),t}var Rt=[];function At(e){e.topLevelType=null,e.nativeEvent=null,e.targetInst=null,e.ancestors.length=0,Rt.length<10&&Rt.push(e)}function Ht(e,t,n,a){var r;return Rt.length?((r=Rt.pop()).topLevelType=e,r.eventSystemFlags=a,r.nativeEvent=t,r.targetInst=n,r):{topLevelType:e,eventSystemFlags:a,nativeEvent:t,targetInst:n,ancestors:[]}}function Ft(e){var t=a=e.targetInst;do{if(!t){e.ancestors.push(t);break}var n=t;if(3===n.tag)n=n.stateNode.containerInfo;else{for(;n.return;)n=n.return;n=3!==n.tag?null:n.stateNode.containerInfo}}while(n&&(5!==(a=t.tag)&&6!==a||e.ancestors.push(t),t=Qn(n)));for(t=0;t<e.ancestors.length;t++){var a=e.ancestors[t],r=Yt(e.nativeEvent),n=e.topLevelType,o=e.nativeEvent,i=e.eventSystemFlags;0===t&&(i|=64);for(var l=null,s=0;s<Q.length;s++){var u=Q[s];(u=u&&u.extractEvents(n,a,o,r,i))&&(l=Dt(l,u))}jt(l)}}function zt(e,t,n){if(!n.has(e)){switch(e){case"scroll":_n(t,"scroll",!0);break;case"focus":case"blur":_n(t,"focus",!0),_n(t,"blur",!0),n.set("blur",null),n.set("focus",null);break;case"cancel":case"close":It(e)&&_n(t,e,!0);break;case"invalid":case"submit":case"reset":break;default:-1===kt.indexOf(e)&&d(e,t)}n.set(e,null)}}var Wt,Vt,Bt,Ut=!1,o=[],Kt=null,Gt=null,qt=null,$t=new Map,Jt=new Map,Xt=[],Qt="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput close cancel copy cut paste click change contextmenu reset submit".split(" "),Zt="focus blur dragenter dragleave mouseover mouseout pointerover pointerout gotpointercapture lostpointercapture".split(" ");function en(e,t,n,a,r){return{blockedOn:e,topLevelType:t,eventSystemFlags:32|n,nativeEvent:r,container:a}}function tn(e,t){switch(e){case"focus":case"blur":Kt=null;break;case"dragenter":case"dragleave":Gt=null;break;case"mouseover":case"mouseout":qt=null;break;case"pointerover":case"pointerout":$t.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":Jt.delete(t.pointerId)}}function nn(e,t,n,a,r,o){return null===e||e.nativeEvent!==o?(e=en(t,n,a,r,o),null!==t&&null!==(t=Zn(t))&&Vt(t)):e.eventSystemFlags|=a,e}function an(e){if(null===e.blockedOn){var t,n=wn(e.topLevelType,e.eventSystemFlags,e.container,e.nativeEvent);if(null===n)return 1;null!==(t=Zn(n))&&Vt(t),e.blockedOn=n}}function rn(e,t,n){an(e)&&n.delete(t)}function on(){for(Ut=!1;0<o.length;){var e=o[0];if(null!==e.blockedOn){null!==(e=Zn(e.blockedOn))&&Wt(e);break}var t=wn(e.topLevelType,e.eventSystemFlags,e.container,e.nativeEvent);null!==t?e.blockedOn=t:o.shift()}null!==Kt&&an(Kt)&&(Kt=null),null!==Gt&&an(Gt)&&(Gt=null),null!==qt&&an(qt)&&(qt=null),$t.forEach(rn),Jt.forEach(rn)}function ln(e,t){e.blockedOn===t&&(e.blockedOn=null,Ut||(Ut=!0,r.unstable_scheduleCallback(r.unstable_NormalPriority,on)))}function sn(t){function e(e){return ln(e,t)}if(0<o.length){ln(o[0],t);for(var n=1;n<o.length;n++){var a=o[n];a.blockedOn===t&&(a.blockedOn=null)}}for(null!==Kt&&ln(Kt,t),null!==Gt&&ln(Gt,t),null!==qt&&ln(qt,t),$t.forEach(e),Jt.forEach(e),n=0;n<Xt.length;n++)(a=Xt[n]).blockedOn===t&&(a.blockedOn=null);for(;0<Xt.length&&null===(n=Xt[0]).blockedOn;)(function(e){var t=Qn(e.target);if(null!==t){var n=xt(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=Ct(n)))return e.blockedOn=t,r.unstable_runWithPriority(e.priority,function(){Bt(n)})}else if(3===t&&n.stateNode.hydrate)return e.blockedOn=3===n.tag?n.stateNode.containerInfo:null}e.blockedOn=null})(n),null===n.blockedOn&&Xt.shift()}var un={},dn=new Map,cn=new Map,fn=["abort","abort",_t,"animationEnd",bt,"animationIteration",wt,"animationStart","canplay","canPlay","canplaythrough","canPlayThrough","durationchange","durationChange","emptied","emptied","encrypted","encrypted","ended","ended","error","error","gotpointercapture","gotPointerCapture","load","load","loadeddata","loadedData","loadedmetadata","loadedMetadata","loadstart","loadStart","lostpointercapture","lostPointerCapture","playing","playing","progress","progress","seeking","seeking","stalled","stalled","suspend","suspend","timeupdate","timeUpdate",Mt,"transitionEnd","waiting","waiting"];function pn(e,t){for(var n=0;n<e.length;n+=2){var a=e[n],r=e[n+1],o={phasedRegistrationNames:{bubbled:o="on"+(r[0].toUpperCase()+r.slice(1)),captured:o+"Capture"},dependencies:[a],eventPriority:t};cn.set(a,t),dn.set(a,o),un[r]=o}}pn("blur blur cancel cancel click click close close contextmenu contextMenu copy copy cut cut auxclick auxClick dblclick doubleClick dragend dragEnd dragstart dragStart drop drop focus focus input input invalid invalid keydown keyDown keypress keyPress keyup keyUp mousedown mouseDown mouseup mouseUp paste paste pause pause play play pointercancel pointerCancel pointerdown pointerDown pointerup pointerUp ratechange rateChange reset reset seeked seeked submit submit touchcancel touchCancel touchend touchEnd touchstart touchStart volumechange volumeChange".split(" "),0),pn("drag drag dragenter dragEnter dragexit dragExit dragleave dragLeave dragover dragOver mousemove mouseMove mouseout mouseOut mouseover mouseOver pointermove pointerMove pointerout pointerOut pointerover pointerOver scroll scroll toggle toggle touchmove touchMove wheel wheel".split(" "),1),pn(fn,2);for(var hn="change selectionchange textInput compositionstart compositionend compositionupdate".split(" "),mn=0;mn<hn.length;mn++)cn.set(hn[mn],0);var gn=r.unstable_UserBlockingPriority,yn=r.unstable_runWithPriority,vn=!0;function d(e,t){_n(t,e,!1)}function _n(e,t,n){var a=cn.get(t);switch(void 0===a?2:a){case 0:a=function(e,t,n,a){he||fe();var r=bn,o=he;he=!0;try{ce(r,e,t,n,a)}finally{(he=o)||ge()}}.bind(null,t,1,e);break;case 1:a=function(e,t,n,a){yn(gn,bn.bind(null,e,t,n,a))}.bind(null,t,1,e);break;default:a=bn.bind(null,t,1,e)}n?e.addEventListener(t,a,!0):e.addEventListener(t,a,!1)}function bn(e,t,n,a){if(vn)if(0<o.length&&-1<Qt.indexOf(e))e=en(null,e,t,n,a),o.push(e);else{var r=wn(e,t,n,a);if(null===r)tn(e,a);else if(-1<Qt.indexOf(e))e=en(r,e,t,n,a),o.push(e);else if(!function(e,t,n,a,r){switch(t){case"focus":return Kt=nn(Kt,e,t,n,a,r),1;case"dragenter":return Gt=nn(Gt,e,t,n,a,r),1;case"mouseover":return qt=nn(qt,e,t,n,a,r),1;case"pointerover":var o=r.pointerId;return $t.set(o,nn($t.get(o)||null,e,t,n,a,r)),1;case"gotpointercapture":return o=r.pointerId,Jt.set(o,nn(Jt.get(o)||null,e,t,n,a,r)),1}}(r,e,t,n,a)){tn(e,a),e=Ht(e,a,null,t);try{ye(Ft,e)}finally{At(e)}}}}function wn(e,t,n,a){if(null!==(n=Qn(n=Yt(a)))){var r=xt(n);if(null===r)n=null;else{var o=r.tag;if(13===o){if(null!==(n=Ct(r)))return n;n=null}else if(3===o){if(r.stateNode.hydrate)return 3===r.tag?r.stateNode.containerInfo:null;n=null}else r!==n&&(n=null)}}e=Ht(e,a,n,t);try{ye(Ft,e)}finally{At(e)}return null}var Mn={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!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},kn=["Webkit","ms","Moz","O"];function Sn(e,t,n){return null==t||"boolean"==typeof t||""===t?"":n||"number"!=typeof t||0===t||Mn.hasOwnProperty(e)&&Mn[e]?(""+t).trim():t+"px"}function En(e,t){for(var n in e=e.style,t){var a,r;t.hasOwnProperty(n)&&(a=0===n.indexOf("--"),r=Sn(n,t[n],a),"float"===n&&(n="cssFloat"),a?e.setProperty(n,r):e[n]=r)}}Object.keys(Mn).forEach(function(t){kn.forEach(function(e){e=e+t.charAt(0).toUpperCase()+t.substring(1),Mn[e]=Mn[t]})});var xn=y({menuitem:!0},{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});function Cn(e,t){if(t){if(xn[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML))throw Error(R(137,e,""));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(R(60));if(!("object"==typeof t.dangerouslySetInnerHTML&&"__html"in t.dangerouslySetInnerHTML))throw Error(R(61))}if(null!=t.style&&"object"!=typeof t.style)throw Error(R(62,""))}}function Ln(e,t){if(-1===e.indexOf("-"))return"string"==typeof t.is;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Tn=a;function Dn(e,t){var n=Et(e=9===e.nodeType||11===e.nodeType?e:e.ownerDocument);t=te[t];for(var a=0;a<t.length;a++)zt(t[a],e,n)}function On(){}function Nn(t){if(void 0===(t=t||("undefined"!=typeof document?document:void 0)))return null;try{return t.activeElement||t.body}catch(e){return t.body}}function Pn(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function jn(e,t){var n,a=Pn(e);for(e=0;a;){if(3===a.nodeType){if(n=e+a.textContent.length,e<=t&&t<=n)return{node:a,offset:t-e};e=n}e:{for(;a;){if(a.nextSibling){a=a.nextSibling;break e}a=a.parentNode}a=void 0}a=Pn(a)}}function Yn(){for(var e=window,t=Nn();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(e){n=!1}if(!n)break;t=Nn((e=t.contentWindow).document)}return t}function In(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}var Rn="$",An="/$",Hn="$?",Fn="$!",zn=null,Wn=null;function Vn(e,t){switch(e){case"button":case"input":case"select":case"textarea":return t.autoFocus}}function Bn(e,t){return"textarea"===e||"option"===e||"noscript"===e||"string"==typeof t.children||"number"==typeof t.children||"object"==typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var Un="function"==typeof setTimeout?setTimeout:void 0,Kn="function"==typeof clearTimeout?clearTimeout:void 0;function Gn(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break}return e}function qn(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){var n=e.data;if(n===Rn||n===Fn||n===Hn){if(0===t)return e;t--}else n===An&&t++}e=e.previousSibling}return null}var fn=Math.random().toString(36).slice(2),$n="__reactInternalInstance$"+fn,Jn="__reactEventHandlers$"+fn,Xn="__reactContainere$"+fn;function Qn(e){var t=e[$n];if(t)return t;for(var n=e.parentNode;n;){if(t=n[Xn]||n[$n]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=qn(e);null!==e;){if(n=e[$n])return n;e=qn(e)}return t}n=(e=n).parentNode}return null}function Zn(e){return!(e=e[$n]||e[Xn])||5!==e.tag&&6!==e.tag&&13!==e.tag&&3!==e.tag?null:e}function ea(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(R(33))}function ta(e){return e[Jn]||null}function na(e){for(;(e=e.return)&&5!==e.tag;);return e||null}function aa(e,t){var n=e.stateNode;if(!n)return null;var a=B(n);if(!a)return null;switch(n=a[t],t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":e=!(a=(a=!a.disabled)?a:!("button"===(e=e.type)||"input"===e||"select"===e||"textarea"===e));break;default:e=!1}if(e)return null;if(n&&"function"!=typeof n)throw Error(R(231,t,typeof n));return n}function ra(e,t,n){(t=aa(e,n.dispatchConfig.phasedRegistrationNames[t]))&&(n._dispatchListeners=Dt(n._dispatchListeners,t),n._dispatchInstances=Dt(n._dispatchInstances,e))}function oa(e){if(e&&e.dispatchConfig.phasedRegistrationNames){for(var t=e._targetInst,n=[];t;)n.push(t),t=na(t);for(t=n.length;0<t--;)ra(n[t],"captured",e);for(t=0;t<n.length;t++)ra(n[t],"bubbled",e)}}function ia(e,t,n){e&&n&&n.dispatchConfig.registrationName&&(t=aa(e,n.dispatchConfig.registrationName))&&(n._dispatchListeners=Dt(n._dispatchListeners,t),n._dispatchInstances=Dt(n._dispatchInstances,e))}function la(e){e&&e.dispatchConfig.registrationName&&ia(e._targetInst,null,e)}function sa(e){Ot(e,oa)}var ua=null,da=null,ca=null;function fa(){if(ca)return ca;for(var e=da,t=e.length,n=("value"in ua?ua.value:ua.textContent),a=n.length,r=0;r<t&&e[r]===n[r];r++);for(var o=t-r,i=1;i<=o&&e[t-i]===n[a-i];i++);return ca=n.slice(r,1<i?1-i:void 0)}function pa(){return!0}function ha(){return!1}function l(e,t,n,a){for(var r in this.dispatchConfig=e,this._targetInst=t,this.nativeEvent=n,e=this.constructor.Interface)e.hasOwnProperty(r)&&((t=e[r])?this[r]=t(n):"target"===r?this.target=a:this[r]=n[r]);return this.isDefaultPrevented=(null!=n.defaultPrevented?n.defaultPrevented:!1===n.returnValue)?pa:ha,this.isPropagationStopped=ha,this}function ma(e,t,n,a){var r;return this.eventPool.length?(r=this.eventPool.pop(),this.call(r,e,t,n,a),r):new this(e,t,n,a)}function ga(e){if(!(e instanceof this))throw Error(R(279));e.destructor(),this.eventPool.length<10&&this.eventPool.push(e)}function ya(e){e.eventPool=[],e.getPooled=ma,e.release=ga}y(l.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=pa)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=pa)},persist:function(){this.isPersistent=pa},isPersistent:ha,destructor:function(){for(var e in this.constructor.Interface)this[e]=null;this.nativeEvent=this._targetInst=this.dispatchConfig=null,this.isPropagationStopped=this.isDefaultPrevented=ha,this._dispatchInstances=this._dispatchListeners=null}}),l.Interface={type:null,target:null,currentTarget:function(){return null},eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null},l.extend=function(e){function t(){}function n(){return a.apply(this,arguments)}var a=this,r=(t.prototype=a.prototype,new t);return y(r,n.prototype),((n.prototype=r).constructor=n).Interface=y({},a.Interface,e),n.extend=a.extend,ya(n),n},ya(l);var va=l.extend({data:null}),_a=l.extend({data:null}),ba=[9,13,27,32],wa=ae&&"CompositionEvent"in window,a=null,Ma=(ae&&"documentMode"in document&&(a=document.documentMode),ae&&"TextEvent"in window&&!a),ka=ae&&(!wa||a&&8<a&&a<=11),Sa=String.fromCharCode(32),Ea={beforeInput:{phasedRegistrationNames:{bubbled:"onBeforeInput",captured:"onBeforeInputCapture"},dependencies:["compositionend","keypress","textInput","paste"]},compositionEnd:{phasedRegistrationNames:{bubbled:"onCompositionEnd",captured:"onCompositionEndCapture"},dependencies:"blur compositionend keydown keypress keyup mousedown".split(" ")},compositionStart:{phasedRegistrationNames:{bubbled:"onCompositionStart",captured:"onCompositionStartCapture"},dependencies:"blur compositionstart keydown keypress keyup mousedown".split(" ")},compositionUpdate:{phasedRegistrationNames:{bubbled:"onCompositionUpdate",captured:"onCompositionUpdateCapture"},dependencies:"blur compositionupdate keydown keypress keyup mousedown".split(" ")}},xa=!1;function Ca(e,t){switch(e){case"keyup":return-1!==ba.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"blur":return 1;default:return}}function La(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var Ta=!1;var fn={eventTypes:Ea,extractEvents:function(e,t,n,a){var r;if(wa)e:{switch(e){case"compositionstart":var o=Ea.compositionStart;break e;case"compositionend":o=Ea.compositionEnd;break e;case"compositionupdate":o=Ea.compositionUpdate;break e}o=void 0}else Ta?Ca(e,n)&&(o=Ea.compositionEnd):"keydown"===e&&229===n.keyCode&&(o=Ea.compositionStart);return r=o?(ka&&"ko"!==n.locale&&(Ta||o!==Ea.compositionStart?o===Ea.compositionEnd&&Ta&&(r=fa()):(da="value"in(ua=a)?ua.value:ua.textContent,Ta=!0)),o=va.getPooled(o,t,n,a),r?o.data=r:null!==(r=La(n))&&(o.data=r),sa(o),o):null,(e=(Ma?function(e,t){switch(e){case"compositionend":return La(t);case"keypress":return 32!==t.which?null:(xa=!0,Sa);case"textInput":return(e=t.data)===Sa&&xa?null:e;default:return null}}:function(e,t){if(Ta)return"compositionend"===e||!wa&&Ca(e,t)?(e=fa(),ca=da=ua=null,Ta=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return ka&&"ko"!==t.locale?null:t.data;default:return null}})(e,n))?((t=_a.getPooled(Ea.beforeInput,t,n,a)).data=e,sa(t)):t=null,null===r?t:null===t?r:[r,t]}},Da={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};function Oa(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?Da[e.type]:"textarea"===t}var Na={change:{phasedRegistrationNames:{bubbled:"onChange",captured:"onChangeCapture"},dependencies:"blur change click focus input keydown keyup selectionchange".split(" ")}};function Pa(e,t,n){return(e=l.getPooled(Na.change,e,t,n)).type="change",se(n),sa(e),e}var ja=null,Ya=null;function Ia(e){jt(e)}function Ra(e){if(qe(ea(e)))return e}function Aa(e,t){if("change"===e)return t}var Ha=!1;function Fa(){ja&&(ja.detachEvent("onpropertychange",za),Ya=ja=null)}function za(e){if("value"===e.propertyName&&Ra(Ya))if(e=Pa(Ya,e,Yt(e)),he)jt(e);else{he=!0;try{de(Ia,e)}finally{he=!1,ge()}}}function Wa(e,t,n){"focus"===e?(Fa(),Ya=n,(ja=t).attachEvent("onpropertychange",za)):"blur"===e&&Fa()}function Va(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return Ra(Ya)}function Ba(e,t){if("click"===e)return Ra(t)}function Ua(e,t){if("input"===e||"change"===e)return Ra(t)}ae&&(Ha=It("input")&&(!document.documentMode||9<document.documentMode));var a={eventTypes:Na,_isInputEventSupported:Ha,extractEvents:function(e,t,n,a){var r,o,i=t?ea(t):window,l=i.nodeName&&i.nodeName.toLowerCase();if("select"===l||"input"===l&&"file"===i.type?r=Aa:Oa(i)?Ha?r=Ua:(r=Va,o=Wa):!(l=i.nodeName)||"input"!==l.toLowerCase()||"checkbox"!==i.type&&"radio"!==i.type||(r=Ba),r=r&&r(e,t))return Pa(r,n,a);o&&o(e,i,t),"blur"===e&&(e=i._wrapperState)&&e.controlled&&"number"===i.type&&et(i,"number",i.value)}},Ka=l.extend({view:null,detail:null}),Ga={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function qa(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=Ga[e])&&!!t[e]}function $a(){return qa}var Ja=0,Xa=0,Qa=!1,Za=!1,er=Ka.extend({screenX:null,screenY:null,clientX:null,clientY:null,pageX:null,pageY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:$a,button:null,buttons:null,relatedTarget:function(e){return e.relatedTarget||(e.fromElement===e.srcElement?e.toElement:e.fromElement)},movementX:function(e){if("movementX"in e)return e.movementX;var t=Ja;return Ja=e.screenX,Qa?"mousemove"===e.type?e.screenX-t:0:(Qa=!0,0)},movementY:function(e){if("movementY"in e)return e.movementY;var t=Xa;return Xa=e.screenY,Za?"mousemove"===e.type?e.screenY-t:0:(Za=!0,0)}}),tr=er.extend({pointerId:null,width:null,height:null,pressure:null,tangentialPressure:null,tiltX:null,tiltY:null,twist:null,pointerType:null,isPrimary:null}),nr={mouseEnter:{registrationName:"onMouseEnter",dependencies:["mouseout","mouseover"]},mouseLeave:{registrationName:"onMouseLeave",dependencies:["mouseout","mouseover"]},pointerEnter:{registrationName:"onPointerEnter",dependencies:["pointerout","pointerover"]},pointerLeave:{registrationName:"onPointerLeave",dependencies:["pointerout","pointerover"]}},ar={eventTypes:nr,extractEvents:function(e,t,n,a,r){var o,i,l,s,u="mouseover"===e||"pointerover"===e,d="mouseout"===e||"pointerout"===e;if(u&&0==(32&r)&&(n.relatedTarget||n.fromElement)||!d&&!u)return null;if(u=a.window===a?a:(u=a.ownerDocument)?u.defaultView||u.parentWindow:window,d?(d=t,null!==(t=(t=n.relatedTarget||n.toElement)?Qn(t):null)&&(t!==xt(t)||5!==t.tag&&6!==t.tag)&&(t=null)):d=null,d===t)return null;if("mouseout"===e||"mouseover"===e?(o=er,i=nr.mouseLeave,l=nr.mouseEnter,s="mouse"):"pointerout"!==e&&"pointerover"!==e||(o=tr,i=nr.pointerLeave,l=nr.pointerEnter,s="pointer"),e=null==d?u:ea(d),u=null==t?u:ea(t),(i=o.getPooled(i,d,n,a)).type=s+"leave",i.target=e,i.relatedTarget=u,(n=o.getPooled(l,t,n,a)).type=s+"enter",n.target=u,n.relatedTarget=e,s=t,(a=d)&&s)e:{for(l=s,d=0,e=o=a;e;e=na(e))d++;for(e=0,t=l;t;t=na(t))e++;for(;0<d-e;)o=na(o),d--;for(;0<e-d;)l=na(l),e--;for(;d--;){if(o===l||o===l.alternate)break e;o=na(o),l=na(l)}o=null}else o=null;for(l=o,o=[];a&&a!==l&&(null===(d=a.alternate)||d!==l);)o.push(a),a=na(a);for(a=[];s&&s!==l&&(null===(d=s.alternate)||d!==l);)a.push(s),s=na(s);for(s=0;s<o.length;s++)ia(o[s],"bubbled",i);for(s=a.length;0<s--;)ia(a[s],"captured",n);return 0==(64&r)?[i]:[i,n]}};var rr="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},or=Object.prototype.hasOwnProperty;function ir(e,t){if(!rr(e,t)){if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),a=Object.keys(t);if(n.length!==a.length)return!1;for(a=0;a<n.length;a++)if(!or.call(t,n[a])||!rr(e[n[a]],t[n[a]]))return!1}return!0}var lr=ae&&"documentMode"in document&&document.documentMode<=11,sr={select:{phasedRegistrationNames:{bubbled:"onSelect",captured:"onSelectCapture"},dependencies:"blur contextmenu dragend focus keydown keyup mousedown mouseup selectionchange".split(" ")}},ur=null,dr=null,cr=null,fr=!1;function pr(e,t){var n=t.window===t?t.document:9===t.nodeType?t:t.ownerDocument;return fr||null==ur||ur!==Nn(n)?null:(n="selectionStart"in(n=ur)&&In(n)?{start:n.selectionStart,end:n.selectionEnd}:{anchorNode:(n=(n.ownerDocument&&n.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:n.anchorOffset,focusNode:n.focusNode,focusOffset:n.focusOffset},cr&&ir(cr,n)?null:(cr=n,(e=l.getPooled(sr.select,dr,e,t)).type="select",e.target=ur,sa(e),e))}var hr={eventTypes:sr,extractEvents:function(e,t,n,a,r,o){if(!(o=!(r=o||(a.window===a?a.document:9===a.nodeType?a:a.ownerDocument)))){e:{r=Et(r),o=te.onSelect;for(var i=0;i<o.length;i++)if(!r.has(o[i])){r=!1;break e}r=!0}o=!r}if(!o)switch(r=t?ea(t):window,e){case"focus":!Oa(r)&&"true"!==r.contentEditable||(ur=r,dr=t,cr=null);break;case"blur":cr=dr=ur=null;break;case"mousedown":fr=!0;break;case"contextmenu":case"mouseup":case"dragend":return fr=!1,pr(n,a);case"selectionchange":if(lr)break;case"keydown":case"keyup":return pr(n,a)}return null}},mr=l.extend({animationName:null,elapsedTime:null,pseudoElement:null}),gr=l.extend({clipboardData:function(e){return("clipboardData"in e?e:window).clipboardData}}),yr=Ka.extend({relatedTarget:null});function vr(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,32<=(e=10===e?13:e)||13===e?e:0}var _r={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},br={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"},wr=Ka.extend({key:function(e){if(e.key){var t=_r[e.key]||e.key;if("Unidentified"!==t)return t}return"keypress"===e.type?13===(e=vr(e))?"Enter":String.fromCharCode(e):"keydown"===e.type||"keyup"===e.type?br[e.keyCode]||"Unidentified":""},location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:$a,charCode:function(e){return"keypress"===e.type?vr(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?vr(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}}),Mr=er.extend({dataTransfer:null}),kr=Ka.extend({touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:$a}),Sr=l.extend({propertyName:null,elapsedTime:null,pseudoElement:null}),Er=er.extend({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}),xr={eventTypes:un,extractEvents:function(e,t,n,a){var r=dn.get(e);if(!r)return null;switch(e){case"keypress":if(0===vr(n))return null;case"keydown":case"keyup":e=wr;break;case"blur":case"focus":e=yr;break;case"click":if(2===n.button)return null;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":e=er;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":e=Mr;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":e=kr;break;case _t:case bt:case wt:e=mr;break;case Mt:e=Sr;break;case"scroll":e=Ka;break;case"wheel":e=Er;break;case"copy":case"cut":case"paste":e=gr;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":e=tr;break;default:e=l}return sa(t=e.getPooled(r,t,n,a)),t}},q=Array.prototype.slice.call("ResponderEventPlugin SimpleEventPlugin EnterLeaveEventPlugin ChangeEventPlugin SelectEventPlugin BeforeInputEventPlugin".split(" "));J();var B=ta,U=Zn,K=ea,Cr=(ne({SimpleEventPlugin:xr,EnterLeaveEventPlugin:ar,ChangeEventPlugin:a,SelectEventPlugin:hr,BeforeInputEventPlugin:fn}),[]),Lr=-1;function c(e){Lr<0||(e.current=Cr[Lr],Cr[Lr]=null,Lr--)}function f(e,t){Cr[++Lr]=e.current,e.current=t}var Tr={},p={current:Tr},h={current:!1},Dr=Tr;function Or(e,t){var n=e.type.contextTypes;if(!n)return Tr;var a=e.stateNode;if(a&&a.__reactInternalMemoizedUnmaskedChildContext===t)return a.__reactInternalMemoizedMaskedChildContext;var r,o={};for(r in n)o[r]=t[r];return a&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=o),o}function m(e){return null!=(e=e.childContextTypes)}function Nr(){c(h),c(p)}function Pr(e,t,n){if(p.current!==Tr)throw Error(R(168));f(p,t),f(h,n)}function jr(e,t,n){var a,r=e.stateNode;if(e=t.childContextTypes,"function"!=typeof r.getChildContext)return n;for(a in r=r.getChildContext())if(!(a in e))throw Error(R(108,Ve(t)||"Unknown",a));return y({},n,{},r)}function Yr(e){e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Tr,Dr=p.current,f(p,e),f(h,h.current)}function Ir(e,t,n){var a=e.stateNode;if(!a)throw Error(R(169));n?(e=jr(e,t,Dr),a.__reactInternalMemoizedMergedChildContext=e,c(h),c(p),f(p,e)):c(h),f(h,n)}var Rr=r.unstable_runWithPriority,Ar=r.unstable_scheduleCallback,Hr=r.unstable_cancelCallback,xr=r.unstable_requestPaint,Fr=r.unstable_now,zr=r.unstable_getCurrentPriorityLevel,Wr=r.unstable_ImmediatePriority,Vr=r.unstable_UserBlockingPriority,Br=r.unstable_NormalPriority,Ur=r.unstable_LowPriority,Kr=r.unstable_IdlePriority,Gr={},qr=r.unstable_shouldYield,$r=void 0!==xr?xr:function(){},Jr=null,Xr=null,Qr=!1,Zr=Fr(),g=Zr<1e4?Fr:function(){return Fr()-Zr};function eo(){switch(zr()){case Wr:return 99;case Vr:return 98;case Br:return 97;case Ur:return 96;case Kr:return 95;default:throw Error(R(332))}}function to(e){switch(e){case 99:return Wr;case 98:return Vr;case 97:return Br;case 96:return Ur;case 95:return Kr;default:throw Error(R(332))}}function no(e,t){return e=to(e),Rr(e,t)}function ao(e,t,n){return e=to(e),Ar(e,t,n)}function ro(e){return null===Jr?(Jr=[e],Xr=Ar(Wr,oo)):Jr.push(e),Gr}function E(){var e;null!==Xr&&(e=Xr,Xr=null,Hr(e)),oo()}function oo(){if(!Qr&&null!==Jr){Qr=!0;var t=0;try{var n=Jr;no(99,function(){for(;t<n.length;t++)for(var e=n[t];null!==(e=e(!0)););}),Jr=null}catch(e){throw null!==Jr&&(Jr=Jr.slice(t+1)),Ar(Wr,E),e}finally{Qr=!1}}}function io(e,t,n){return 1073741821-(1+((1073741821-e+t/10)/(n/=10)|0))*n}function x(e,t){if(e&&e.defaultProps)for(var n in t=y({},t),e=e.defaultProps)void 0===t[n]&&(t[n]=e[n]);return t}var lo={current:null},so=null,uo=null,co=null;function fo(){co=uo=so=null}function po(e){var t=lo.current;c(lo),e.type._context._currentValue=t}function ho(e,t){for(;null!==e;){var n=e.alternate;if(e.childExpirationTime<t)e.childExpirationTime=t,null!==n&&n.childExpirationTime<t&&(n.childExpirationTime=t);else{if(!(null!==n&&n.childExpirationTime<t))break;n.childExpirationTime=t}e=e.return}}function mo(e,t){(co=uo=null)!==(e=(so=e).dependencies)&&null!==e.firstContext&&(e.expirationTime>=t&&(Yi=!0),e.firstContext=null)}function v(e,t){if(co!==e&&!1!==t&&0!==t)if("number"==typeof t&&1073741823!==t||(co=e,t=1073741823),t={context:e,observedBits:t,next:null},null===uo){if(null===so)throw Error(R(308));uo=t,so.dependencies={expirationTime:0,firstContext:t,responders:null}}else uo=uo.next=t;return e._currentValue}var go=!1;function yo(e){e.updateQueue={baseState:e.memoizedState,baseQueue:null,shared:{pending:null},effects:null}}function vo(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,baseQueue:e.baseQueue,shared:e.shared,effects:e.effects})}function _o(e,t){return(e={expirationTime:e,suspenseConfig:t,tag:0,payload:null,callback:null,next:null}).next=e}function bo(e,t){var n;null!==(e=e.updateQueue)&&(null===(n=(e=e.shared).pending)?t.next=t:(t.next=n.next,n.next=t),e.pending=t)}function wo(e,t){var n=e.alternate;null!==n&&vo(n,e),null===(n=(e=e.updateQueue).baseQueue)?(e.baseQueue=t.next=t).next=t:(t.next=n.next,n.next=t)}function Mo(e,t,n,a){var r=e.updateQueue,o=(go=!1,r.baseQueue);if(null!==(g=r.shared.pending)&&(null!==o&&(i=o.next,o.next=g.next,g.next=i),o=g,(r.shared.pending=null)!==(i=e.alternate)&&null!==(i=i.updateQueue)&&(i.baseQueue=g)),null!==o){var i=o.next,l=r.baseState,s=0,u=null,d=null,c=null;if(null!==i)for(var f=i;;){if((g=f.expirationTime)<a){var p={expirationTime:f.expirationTime,suspenseConfig:f.suspenseConfig,tag:f.tag,payload:f.payload,callback:f.callback,next:null};null===c?(d=c=p,u=l):c=c.next=p,s<g&&(s=g)}else{null!==c&&(c=c.next={expirationTime:1073741823,suspenseConfig:f.suspenseConfig,tag:f.tag,payload:f.payload,callback:f.callback,next:null}),ns(g,f.suspenseConfig);e:{var h=e,m=f,g=t,p=n;switch(m.tag){case 1:if("function"==typeof(h=m.payload)){l=h.call(p,l,g);break e}l=h;break e;case 3:h.effectTag=-4097&h.effectTag|64;case 0:if(null==(g="function"==typeof(h=m.payload)?h.call(p,l,g):h))break e;l=y({},l,g);break e;case 2:go=!0}}null!==f.callback&&(e.effectTag|=32,null===(g=r.effects)?r.effects=[f]:g.push(f))}if(null===(f=f.next)||f===i){if(null===(g=r.shared.pending))break;f=o.next=g.next,g.next=i,r.baseQueue=o=g,r.shared.pending=null}}null===c?u=l:c.next=d,r.baseState=u,r.baseQueue=c,as(s),e.expirationTime=s,e.memoizedState=l}}function ko(e,t,n){if(e=t.effects,(t.effects=null)!==e)for(t=0;t<e.length;t++){var a=e[t],r=a.callback;if(null!==r){if(a.callback=null,a=r,r=n,"function"!=typeof a)throw Error(R(191,a));a.call(r)}}}var So=t.ReactCurrentBatchConfig,Eo=(new w.Component).refs;function xo(e,t,n,a){n=null==(n=n(a,t=e.memoizedState))?t:y({},t,n),e.memoizedState=n,0===e.expirationTime&&(e.updateQueue.baseState=n)}var Co={isMounted:function(e){return!!(e=e._reactInternalFiber)&&xt(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternalFiber;var a=Bl(),r=So.suspense;(r=_o(a=Ul(a,e,r),r)).payload=t,null!=n&&(r.callback=n),bo(e,r),Kl(e,a)},enqueueReplaceState:function(e,t,n){e=e._reactInternalFiber;var a=Bl(),r=So.suspense;(r=_o(a=Ul(a,e,r),r)).tag=1,r.payload=t,null!=n&&(r.callback=n),bo(e,r),Kl(e,a)},enqueueForceUpdate:function(e,t){e=e._reactInternalFiber;var n=Bl(),a=So.suspense;(a=_o(n=Ul(n,e,a),a)).tag=2,null!=t&&(a.callback=t),bo(e,a),Kl(e,n)}};function Lo(e,t,n,a,r,o,i){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(a,o,i):!t.prototype||!t.prototype.isPureReactComponent||(!ir(n,a)||!ir(r,o))}function To(e,t,n){var a=!1,r=Tr,o=t.contextType;t=new t(n,o="object"==typeof o&&null!==o?v(o):(r=m(t)?Dr:p.current,(a=null!=(a=t.contextTypes))?Or(e,r):Tr)),e.memoizedState=null!==t.state&&void 0!==t.state?t.state:null,t.updater=Co,(e.stateNode=t)._reactInternalFiber=e,a&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=r,e.__reactInternalMemoizedMaskedChildContext=o)}function Do(e,t,n,a){e=t.state,"function"==typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,a),"function"==typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,a),t.state!==e&&Co.enqueueReplaceState(t,t.state,null)}function Oo(e,t,n,a){var r=e.stateNode,o=(r.props=n,r.state=e.memoizedState,r.refs=Eo,yo(e),t.contextType);"object"==typeof o&&null!==o?r.context=v(o):(o=m(t)?Dr:p.current,r.context=Or(e,o)),Mo(e,n,r,a),r.state=e.memoizedState,"function"==typeof(o=t.getDerivedStateFromProps)&&(xo(e,0,o,n),r.state=e.memoizedState),"function"==typeof t.getDerivedStateFromProps||"function"==typeof r.getSnapshotBeforeUpdate||"function"!=typeof r.UNSAFE_componentWillMount&&"function"!=typeof r.componentWillMount||(t=r.state,"function"==typeof r.componentWillMount&&r.componentWillMount(),"function"==typeof r.UNSAFE_componentWillMount&&r.UNSAFE_componentWillMount(),t!==r.state&&Co.enqueueReplaceState(r,r.state,null),Mo(e,n,r,a),r.state=e.memoizedState),"function"==typeof r.componentDidMount&&(e.effectTag|=4)}var No=Array.isArray;function Po(e,t,n){if(null!==(e=n.ref)&&"function"!=typeof e&&"object"!=typeof e){if(n._owner){if(n=n._owner){if(1!==n.tag)throw Error(R(309));var a=n.stateNode}if(!a)throw Error(R(147,e));var r=""+e;return null!==t&&null!==t.ref&&"function"==typeof t.ref&&t.ref._stringRef===r?t.ref:((t=function(e){var t=a.refs;t===Eo&&(t=a.refs={}),null===e?delete t[r]:t[r]=e})._stringRef=r,t)}if("string"!=typeof e)throw Error(R(284));if(!n._owner)throw Error(R(290,e))}return e}function jo(e,t){if("textarea"!==e.type)throw Error(R(31,"[object Object]"===Object.prototype.toString.call(t)?"object with keys {"+Object.keys(t).join(", ")+"}":t,""))}function Yo(C){function L(e,t){var n;C&&(null!==(n=e.lastEffect)?(n.nextEffect=t,e.lastEffect=t):e.firstEffect=e.lastEffect=t,t.nextEffect=null,t.effectTag=8)}function T(e,t){if(C)for(;null!==t;)L(e,t),t=t.sibling;return null}function D(e,t){for(e=new Map;null!==t;)null!==t.key?e.set(t.key,t):e.set(t.index,t),t=t.sibling;return e}function O(e,t){return(e=_s(e,t)).index=0,e.sibling=null,e}function N(e,t,n){if(e.index=n,C){if(null!==(n=e.alternate))return(n=n.index)<t?(e.effectTag=2,t):n;e.effectTag=2}return t}function P(e){return C&&null===e.alternate&&(e.effectTag=2),e}function o(e,t,n,a){return null===t||6!==t.tag?(t=Ms(n,e.mode,a)).return=e:(t=O(t,n)).return=e,t}function i(e,t,n,a){return null!==t&&t.elementType===n.type?((a=O(t,n.props)).ref=Po(0,t,n),a.return=e):((a=bs(n.type,n.key,n.props,null,e.mode,a)).ref=Po(0,t,n),a.return=e),a}function l(e,t,n,a){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?(t=ks(n,e.mode,a)).return=e:(t=O(t,n.children||[])).return=e,t}function s(e,t,n,a,r){return null===t||7!==t.tag?(t=ws(n,e.mode,a,r)).return=e:(t=O(t,n)).return=e,t}function j(e,t,n){if("string"==typeof t||"number"==typeof t)return(t=Ms(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case Ce:return(n=bs(t.type,t.key,t.props,null,e.mode,n)).ref=Po(0,null,t),n.return=e,n;case Le:return(t=ks(t,e.mode,n)).return=e,t}if(No(t)||We(t))return(t=ws(t,e.mode,n,null)).return=e,t;jo(e,t)}return null}function Y(e,t,n,a){var r=null!==t?t.key:null;if("string"==typeof n||"number"==typeof n)return null!==r?null:o(e,t,""+n,a);if("object"==typeof n&&null!==n){switch(n.$$typeof){case Ce:return n.key===r?n.type===Te?s(e,t,n.props.children,a,r):i(e,t,n,a):null;case Le:return n.key===r?l(e,t,n,a):null}if(No(n)||We(n))return null!==r?null:s(e,t,n,a,null);jo(e,n)}return null}function I(e,t,n,a,r){if("string"==typeof a||"number"==typeof a)return o(t,e=e.get(n)||null,""+a,r);if("object"==typeof a&&null!==a){switch(a.$$typeof){case Ce:return e=e.get(null===a.key?n:a.key)||null,a.type===Te?s(t,e,a.props.children,r,a.key):i(t,e,a,r);case Le:return l(t,e=e.get(null===a.key?n:a.key)||null,a,r)}if(No(a)||We(a))return s(t,e=e.get(n)||null,a,r,null);jo(t,a)}return null}return function(e,t,n,a){var r="object"==typeof n&&null!==n&&n.type===Te&&null===n.key,o="object"==typeof(n=r?n.props.children:n)&&null!==n;if(o)switch(n.$$typeof){case Ce:e:{for(o=n.key,r=t;null!==r;){if(r.key===o){switch(r.tag){case 7:if(n.type!==Te)break;T(e,r.sibling),(t=O(r,n.props.children)).return=e,e=t;break e;default:if(r.elementType===n.type){T(e,r.sibling),(t=O(r,n.props)).ref=Po(0,r,n),t.return=e,e=t;break e}}T(e,r);break}L(e,r),r=r.sibling}e=n.type===Te?((t=ws(n.props.children,e.mode,a,n.key)).return=e,t):((a=bs(n.type,n.key,n.props,null,e.mode,a)).ref=Po(0,t,n),a.return=e,a)}return P(e);case Le:e:{for(r=n.key;null!==t;){if(t.key===r){if(4===t.tag&&t.stateNode.containerInfo===n.containerInfo&&t.stateNode.implementation===n.implementation){T(e,t.sibling),(t=O(t,n.children||[])).return=e,e=t;break e}T(e,t);break}L(e,t),t=t.sibling}(t=ks(n,e.mode,a)).return=e,e=t}return P(e)}if("string"==typeof n||"number"==typeof n)return n=""+n,(t=null!==t&&6===t.tag?(T(e,t.sibling),O(t,n)):(T(e,t),Ms(n,e.mode,a))).return=e,P(e=t);if(No(n)){for(var i=e,l=t,s=n,u=a,d=null,c=null,f=l,p=l=0,h=null;null!==f&&p<s.length;p++){f.index>p?(h=f,f=null):h=f.sibling;var m=Y(i,f,s[p],u);if(null===m){null===f&&(f=h);break}C&&f&&null===m.alternate&&L(i,f),l=N(m,l,p),null===c?d=m:c.sibling=m,c=m,f=h}if(p===s.length)T(i,f);else if(null===f)for(;p<s.length;p++)null!==(f=j(i,s[p],u))&&(l=N(f,l,p),null===c?d=f:c.sibling=f,c=f);else{for(f=D(i,f);p<s.length;p++)null!==(h=I(f,i,p,s[p],u))&&(C&&null!==h.alternate&&f.delete(null===h.key?p:h.key),l=N(h,l,p),null===c?d=h:c.sibling=h,c=h);C&&f.forEach(function(e){return L(i,e)})}return d}if(We(n)){var g=e,y=t,v=n,_=a,b=We(v);if("function"!=typeof b)throw Error(R(150));if(null==(v=b.call(v)))throw Error(R(151));for(var w=b=null,M=y,k=y=0,S=null,E=v.next();null!==M&&!E.done;k++,E=v.next()){M.index>k?(S=M,M=null):S=M.sibling;var x=Y(g,M,E.value,_);if(null===x){null===M&&(M=S);break}C&&M&&null===x.alternate&&L(g,M),y=N(x,y,k),null===w?b=x:w.sibling=x,w=x,M=S}if(E.done)T(g,M);else if(null===M)for(;!E.done;k++,E=v.next())null!==(E=j(g,E.value,_))&&(y=N(E,y,k),null===w?b=E:w.sibling=E,w=E);else{for(M=D(g,M);!E.done;k++,E=v.next())null!==(E=I(M,g,k,E.value,_))&&(C&&null!==E.alternate&&M.delete(null===E.key?k:E.key),y=N(E,y,k),null===w?b=E:w.sibling=E,w=E);C&&M.forEach(function(e){return L(g,e)})}return b}if(o&&jo(e,n),void 0===n&&!r)switch(e.tag){case 1:case 0:throw e=e.type,Error(R(152,e.displayName||e.name||"Component"))}return T(e,t)}}var Io=Yo(!0),Ro=Yo(!1),Ao={},Ho={current:Ao},Fo={current:Ao},zo={current:Ao};function Wo(e){if(e===Ao)throw Error(R(174));return e}function Vo(e,t){switch(f(zo,t),f(Fo,e),f(Ho,Ao),e=t.nodeType){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:ut(null,"");break;default:t=ut(t=(e=8===e?t.parentNode:t).namespaceURI||null,e=e.tagName)}c(Ho),f(Ho,t)}function Bo(){c(Ho),c(Fo),c(zo)}function Uo(e){Wo(zo.current);var t=Wo(Ho.current),n=ut(t,e.type);t!==n&&(f(Fo,e),f(Ho,n))}function Ko(e){Fo.current===e&&(c(Ho),c(Fo))}var M={current:0};function Go(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||n.data===Hn||n.data===Fn))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(0!=(64&t.effectTag))return t}else if(null!==t.child){t=(t.child.return=t).child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}function qo(e,t){return{responder:e,props:t}}var $o=t.ReactCurrentDispatcher,s=t.ReactCurrentBatchConfig,Jo=0,k=null,S=null,C=null,Xo=!1;function u(){throw Error(R(321))}function Qo(e,t){if(null!==t){for(var n=0;n<t.length&&n<e.length;n++)if(!rr(e[n],t[n]))return;return 1}}function Zo(e,t,n,a,r,o){if(Jo=o,(k=t).memoizedState=null,t.updateQueue=null,t.expirationTime=0,$o.current=null===e||null===e.memoizedState?Mi:ki,e=n(a,r),t.expirationTime===Jo){o=0;do{if(t.expirationTime=0,!(o<25))throw Error(R(301))}while(o+=1,C=S=null,t.updateQueue=null,$o.current=Si,e=n(a,r),t.expirationTime===Jo)}if($o.current=wi,t=null!==S&&null!==S.next,Jo=0,C=S=k=null,Xo=!1,t)throw Error(R(300));return e}function ei(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===C?k.memoizedState=C=e:C=C.next=e,C}function ti(){e=null===S?null!==(e=k.alternate)?e.memoizedState:null:S.next;var e,t=null===C?k.memoizedState:C.next;if(null!==t)C=t,S=e;else{if(null===e)throw Error(R(310));e={memoizedState:(S=e).memoizedState,baseState:S.baseState,baseQueue:S.baseQueue,queue:S.queue,next:null},null===C?k.memoizedState=C=e:C=C.next=e}return C}function ni(e,t){return"function"==typeof t?t(e):t}function ai(e){var t=ti(),n=t.queue;if(null===n)throw Error(R(311));n.lastRenderedReducer=e;var a,r=(i=S).baseQueue,o=n.pending;if(null!==o&&(null!==r&&(a=r.next,r.next=o.next,o.next=a),i.baseQueue=r=o,n.pending=null),null!==r){var r=r.next,i=i.baseState,l=a=o=null,s=r;do{var u,d=s.expirationTime}while(d<Jo?(u={expirationTime:s.expirationTime,suspenseConfig:s.suspenseConfig,action:s.action,eagerReducer:s.eagerReducer,eagerState:s.eagerState,next:null},null===l?(a=l=u,o=i):l=l.next=u,d>k.expirationTime&&as(k.expirationTime=d)):(null!==l&&(l=l.next={expirationTime:1073741823,suspenseConfig:s.suspenseConfig,action:s.action,eagerReducer:s.eagerReducer,eagerState:s.eagerState,next:null}),ns(d,s.suspenseConfig),i=s.eagerReducer===e?s.eagerState:e(i,s.action)),null!==(s=s.next)&&s!==r);null===l?o=i:l.next=a,rr(i,t.memoizedState)||(Yi=!0),t.memoizedState=i,t.baseState=o,t.baseQueue=l,n.lastRenderedState=i}return[t.memoizedState,n.dispatch]}function ri(e){var t=ti(),n=t.queue;if(null===n)throw Error(R(311));n.lastRenderedReducer=e;var a=n.dispatch,r=n.pending,o=t.memoizedState;if(null!==r){n.pending=null;for(var i=r=r.next;o=e(o,i.action),(i=i.next)!==r;);rr(o,t.memoizedState)||(Yi=!0),t.memoizedState=o,null===t.baseQueue&&(t.baseState=o),n.lastRenderedState=o}return[o,a]}function oi(e){var t=ei();return"function"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e=(e=t.queue={pending:null,dispatch:null,lastRenderedReducer:ni,lastRenderedState:e}).dispatch=bi.bind(null,k,e),[t.memoizedState,e]}function ii(e,t,n,a){return e={tag:e,create:t,destroy:n,deps:a,next:null},null===(t=k.updateQueue)?(k.updateQueue=t={lastEffect:null}).lastEffect=e.next=e:null===(n=t.lastEffect)?t.lastEffect=e.next=e:(a=n.next,(n.next=e).next=a,t.lastEffect=e),e}function li(){return ti().memoizedState}function si(e,t,n,a){var r=ei();k.effectTag|=e,r.memoizedState=ii(1|t,n,void 0,void 0===a?null:a)}function ui(e,t,n,a){var r=ti(),o=(a=void 0===a?null:a,void 0);if(null!==S){var i=S.memoizedState,o=i.destroy;if(null!==a&&Qo(a,i.deps))return void ii(t,n,o,a)}k.effectTag|=e,r.memoizedState=ii(1|t,n,o,a)}function di(e,t){return si(516,4,e,t)}function ci(e,t){return ui(516,4,e,t)}function fi(e,t){return ui(4,2,e,t)}function pi(e,t){return"function"==typeof t?(e=e(),t(e),function(){t(null)}):null!=t?(e=e(),t.current=e,function(){t.current=null}):void 0}function hi(e,t,n){return n=null!=n?n.concat([e]):null,ui(4,2,pi.bind(null,t,e),n)}function mi(){}function gi(e,t){return ei().memoizedState=[e,void 0===t?null:t],e}function yi(e,t){var n=ti(),a=(t=void 0===t?null:t,n.memoizedState);return null!==a&&null!==t&&Qo(t,a[1])?a[0]:(n.memoizedState=[e,t],e)}function vi(e,t){var n=ti(),a=(t=void 0===t?null:t,n.memoizedState);return null!==a&&null!==t&&Qo(t,a[1])?a[0]:(e=e(),n.memoizedState=[e,t],e)}function _i(t,n,a){var e=eo();no(e<98?98:e,function(){t(!0)}),no(97<e?97:e,function(){var e=s.suspense;s.suspense=void 0===n?null:n;try{t(!1),a()}finally{s.suspense=e}})}function bi(e,t,n){var a,r={expirationTime:a=Ul(Bl(),e,r=So.suspense),suspenseConfig:r,action:n,eagerReducer:null,eagerState:null,next:null},o=t.pending;if(null===o?r.next=r:(r.next=o.next,o.next=r),t.pending=r,o=e.alternate,e===k||null!==o&&o===k)Xo=!0,r.expirationTime=Jo,k.expirationTime=Jo;else{if(0===e.expirationTime&&(null===o||0===o.expirationTime)&&null!==(o=t.lastRenderedReducer))try{var i=t.lastRenderedState,l=o(i,n);if(r.eagerReducer=o,r.eagerState=l,rr(l,i))return}catch(e){}Kl(e,a)}}var wi={readContext:v,useCallback:u,useContext:u,useEffect:u,useImperativeHandle:u,useLayoutEffect:u,useMemo:u,useReducer:u,useRef:u,useState:u,useDebugValue:u,useResponder:u,useDeferredValue:u,useTransition:u},Mi={readContext:v,useCallback:gi,useContext:v,useEffect:di,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,si(4,2,pi.bind(null,t,e),n)},useLayoutEffect:function(e,t){return si(4,2,e,t)},useMemo:function(e,t){var n=ei();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var a=ei();return t=void 0!==n?n(t):t,a.memoizedState=a.baseState=t,e=(e=a.queue={pending:null,dispatch:null,lastRenderedReducer:e,lastRenderedState:t}).dispatch=bi.bind(null,k,e),[a.memoizedState,e]},useRef:function(e){return ei().memoizedState=e={current:e}},useState:oi,useDebugValue:mi,useResponder:qo,useDeferredValue:function(t,n){var e=oi(t),a=e[0],r=e[1];return di(function(){var e=s.suspense;s.suspense=void 0===n?null:n;try{r(t)}finally{s.suspense=e}},[t,n]),a},useTransition:function(e){var t=(n=oi(!1))[0],n=n[1];return[gi(_i.bind(null,n,e),[n,e]),t]}},ki={readContext:v,useCallback:yi,useContext:v,useEffect:ci,useImperativeHandle:hi,useLayoutEffect:fi,useMemo:vi,useReducer:ai,useRef:li,useState:function(){return ai(ni)},useDebugValue:mi,useResponder:qo,useDeferredValue:function(t,n){var e=ai(ni),a=e[0],r=e[1];return ci(function(){var e=s.suspense;s.suspense=void 0===n?null:n;try{r(t)}finally{s.suspense=e}},[t,n]),a},useTransition:function(e){var t=(n=ai(ni))[0],n=n[1];return[yi(_i.bind(null,n,e),[n,e]),t]}},Si={readContext:v,useCallback:yi,useContext:v,useEffect:ci,useImperativeHandle:hi,useLayoutEffect:fi,useMemo:vi,useReducer:ri,useRef:li,useState:function(){return ri(ni)},useDebugValue:mi,useResponder:qo,useDeferredValue:function(t,n){var e=ri(ni),a=e[0],r=e[1];return ci(function(){var e=s.suspense;s.suspense=void 0===n?null:n;try{r(t)}finally{s.suspense=e}},[t,n]),a},useTransition:function(e){var t=(n=ri(ni))[0],n=n[1];return[yi(_i.bind(null,n,e),[n,e]),t]}},Ei=null,xi=null,Ci=!1;function Li(e,t){var n=ys(5,null,null,0);n.elementType="DELETED",n.type="DELETED",n.stateNode=t,n.return=e,n.effectTag=8,null!==e.lastEffect?(e.lastEffect.nextEffect=n,e.lastEffect=n):e.firstEffect=e.lastEffect=n}function Ti(e,t){switch(e.tag){case 5:var n=e.type;return null!==(t=1!==t.nodeType||n.toLowerCase()!==t.nodeName.toLowerCase()?null:t)&&(e.stateNode=t,1);case 6:return null!==(t=""===e.pendingProps||3!==t.nodeType?null:t)&&(e.stateNode=t,1);default:return}}function Di(e){if(Ci){var t=xi;if(t){var n=t;if(!Ti(e,t)){if(!(t=Gn(n.nextSibling))||!Ti(e,t))return e.effectTag=-1025&e.effectTag|2,Ci=!1,void(Ei=e);Li(Ei,n)}Ei=e,xi=Gn(t.firstChild)}else e.effectTag=-1025&e.effectTag|2,Ci=!1,Ei=e}}function Oi(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;Ei=e}function Ni(e){if(e===Ei){if(!Ci)return Oi(e),Ci=!0,0;var t=e.type;if(5!==e.tag||"head"!==t&&"body"!==t&&!Bn(t,e.memoizedProps))for(t=xi;t;)Li(e,t),t=Gn(t.nextSibling);if(Oi(e),13===e.tag){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(R(317));e:{for(e=e.nextSibling,t=0;e;){if(8===e.nodeType){var n=e.data;if(n===An){if(0===t){xi=Gn(e.nextSibling);break e}t--}else n!==Rn&&n!==Fn&&n!==Hn||t++}e=e.nextSibling}xi=null}}else xi=Ei?Gn(e.stateNode.nextSibling):null;return 1}}function Pi(){xi=Ei=null,Ci=!1}var ji=t.ReactCurrentOwner,Yi=!1;function _(e,t,n,a){t.child=null===e?Ro(t,null,n,a):Io(t,e.child,n,a)}function Ii(e,t,n,a,r){n=n.render;var o=t.ref;return mo(t,r),a=Zo(e,t,n,a,o,r),null===e||Yi?(t.effectTag|=1,_(e,t,a,r),t.child):(t.updateQueue=e.updateQueue,t.effectTag&=-517,e.expirationTime<=r&&(e.expirationTime=0),$i(e,t,r))}function Ri(e,t,n,a,r,o){var i;return null===e?"function"!=typeof(i=n.type)||vs(i)||void 0!==i.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=bs(n.type,null,a,null,t.mode,o)).ref=t.ref,(e.return=t).child=e):(t.tag=15,t.type=i,Ai(e,t,i,a,r,o)):(i=e.child,r<o&&(r=i.memoizedProps,(n=null!==(n=n.compare)?n:ir)(r,a)&&e.ref===t.ref)?$i(e,t,o):(t.effectTag|=1,(e=_s(i,a)).ref=t.ref,(e.return=t).child=e))}function Ai(e,t,n,a,r,o){return null!==e&&ir(e.memoizedProps,a)&&e.ref===t.ref&&(Yi=!1,r<o)?(t.expirationTime=e.expirationTime,$i(e,t,o)):Fi(e,t,n,a,o)}function Hi(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.effectTag|=128)}function Fi(e,t,n,a,r){var o=Or(t,m(n)?Dr:p.current);return mo(t,r),n=Zo(e,t,n,a,o,r),null===e||Yi?(t.effectTag|=1,_(e,t,n,r),t.child):(t.updateQueue=e.updateQueue,t.effectTag&=-517,e.expirationTime<=r&&(e.expirationTime=0),$i(e,t,r))}function zi(e,t,n,a,r){var o,i,l,s,u,d,c,f;return m(n)?(o=!0,Yr(t)):o=!1,mo(t,r),a=null===t.stateNode?(null!==e&&(e.alternate=null,t.alternate=null,t.effectTag|=2),To(t,n,a),Oo(t,n,a,r),!0):null===e?(i=t.stateNode,l=t.memoizedProps,i.props=l,s=i.context,u="object"==typeof(u=n.contextType)&&null!==u?v(u):Or(t,u=m(n)?Dr:p.current),(c="function"==typeof(d=n.getDerivedStateFromProps)||"function"==typeof i.getSnapshotBeforeUpdate)||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||l===a&&s===u||Do(0,i,a,u),go=!1,f=t.memoizedState,i.state=f,Mo(t,a,i,r),s=t.memoizedState,l!==a||f!==s||h.current||go?("function"==typeof d&&(xo(t,0,d,a),s=t.memoizedState),(l=go||Lo(t,n,l,a,f,s,u))?(c||"function"!=typeof i.UNSAFE_componentWillMount&&"function"!=typeof i.componentWillMount||("function"==typeof i.componentWillMount&&i.componentWillMount(),"function"==typeof i.UNSAFE_componentWillMount&&i.UNSAFE_componentWillMount()),"function"==typeof i.componentDidMount&&(t.effectTag|=4)):("function"==typeof i.componentDidMount&&(t.effectTag|=4),t.memoizedProps=a,t.memoizedState=s),i.props=a,i.state=s,i.context=u,l):("function"==typeof i.componentDidMount&&(t.effectTag|=4),!1)):(i=t.stateNode,vo(e,t),l=t.memoizedProps,i.props=t.type===t.elementType?l:x(t.type,l),s=i.context,u="object"==typeof(u=n.contextType)&&null!==u?v(u):Or(t,u=m(n)?Dr:p.current),(c="function"==typeof(d=n.getDerivedStateFromProps)||"function"==typeof i.getSnapshotBeforeUpdate)||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||l===a&&s===u||Do(0,i,a,u),go=!1,s=t.memoizedState,i.state=s,Mo(t,a,i,r),f=t.memoizedState,l!==a||s!==f||h.current||go?("function"==typeof d&&(xo(t,0,d,a),f=t.memoizedState),(d=go||Lo(t,n,l,a,s,f,u))?(c||"function"!=typeof i.UNSAFE_componentWillUpdate&&"function"!=typeof i.componentWillUpdate||("function"==typeof i.componentWillUpdate&&i.componentWillUpdate(a,f,u),"function"==typeof i.UNSAFE_componentWillUpdate&&i.UNSAFE_componentWillUpdate(a,f,u)),"function"==typeof i.componentDidUpdate&&(t.effectTag|=4),"function"==typeof i.getSnapshotBeforeUpdate&&(t.effectTag|=256)):("function"!=typeof i.componentDidUpdate||l===e.memoizedProps&&s===e.memoizedState||(t.effectTag|=4),"function"!=typeof i.getSnapshotBeforeUpdate||l===e.memoizedProps&&s===e.memoizedState||(t.effectTag|=256),t.memoizedProps=a,t.memoizedState=f),i.props=a,i.state=f,i.context=u,d):("function"!=typeof i.componentDidUpdate||l===e.memoizedProps&&s===e.memoizedState||(t.effectTag|=4),"function"!=typeof i.getSnapshotBeforeUpdate||l===e.memoizedProps&&s===e.memoizedState||(t.effectTag|=256),!1)),Wi(e,t,n,a,o,r)}function Wi(e,t,n,a,r,o){Hi(e,t);var i=0!=(64&t.effectTag);if(!a&&!i)return r&&Ir(t,n,!1),$i(e,t,o);a=t.stateNode,ji.current=t;var l=i&&"function"!=typeof n.getDerivedStateFromError?null:a.render();return t.effectTag|=1,null!==e&&i?(t.child=Io(t,e.child,null,o),t.child=Io(t,null,l,o)):_(e,t,l,o),t.memoizedState=a.state,r&&Ir(t,n,!0),t.child}function Vi(e){var t=e.stateNode;t.pendingContext?Pr(0,t.pendingContext,t.pendingContext!==t.context):t.context&&Pr(0,t.context,!1),Vo(e,t.containerInfo)}var Bi={dehydrated:null,retryTime:0};function Ui(e,t,n){var a,r=t.mode,o=t.pendingProps,i=M.current,l=!1;if((a=(a=0!=(64&t.effectTag))?a:0!=(2&i)&&(null===e||null!==e.memoizedState))?(l=!0,t.effectTag&=-65):null!==e&&null===e.memoizedState||void 0===o.fallback||!0===o.unstable_avoidThisFallback||(i|=1),f(M,1&i),null===e){if(void 0!==o.fallback&&Di(t),l){if(l=o.fallback,0==(2&((o=ws(null,r,0,null)).return=t).mode))for(e=(null!==t.memoizedState?t.child:t).child,o.child=e;null!==e;)e.return=o,e=e.sibling;return(n=ws(l,r,n,null)).return=t,o.sibling=n,t.memoizedState=Bi,t.child=o,n}return r=o.children,t.memoizedState=null,t.child=Ro(t,null,r,n)}if(null!==e.memoizedState){if(r=(e=e.child).sibling,l){if(o=o.fallback,0==(2&((n=_s(e,e.pendingProps)).return=t).mode)&&(l=(null!==t.memoizedState?t.child:t).child)!==e.child)for(n.child=l;null!==l;)l.return=n,l=l.sibling;return(r=_s(r,o)).return=t,n.sibling=r,n.childExpirationTime=0,t.memoizedState=Bi,t.child=n,r}return n=Io(t,e.child,o.children,n),t.memoizedState=null,t.child=n}if(e=e.child,l){if(l=o.fallback,(o=ws(null,r,0,null)).return=t,null!==(o.child=e)&&(e.return=o),0==(2&t.mode))for(e=(null!==t.memoizedState?t.child:t).child,o.child=e;null!==e;)e.return=o,e=e.sibling;return(n=ws(l,r,n,null)).return=t,(o.sibling=n).effectTag|=2,o.childExpirationTime=0,t.memoizedState=Bi,t.child=o,n}return t.memoizedState=null,t.child=Io(t,e,o.children,n)}function Ki(e,t){e.expirationTime<t&&(e.expirationTime=t);var n=e.alternate;null!==n&&n.expirationTime<t&&(n.expirationTime=t),ho(e.return,t)}function Gi(e,t,n,a,r,o){var i=e.memoizedState;null===i?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:a,tail:n,tailExpiration:0,tailMode:r,lastEffect:o}:(i.isBackwards=t,i.rendering=null,i.renderingStartTime=0,i.last=a,i.tail=n,i.tailExpiration=0,i.tailMode=r,i.lastEffect=o)}function qi(e,t,n){var a=t.pendingProps,r=a.revealOrder,o=a.tail;if(_(e,t,a.children,n),0!=(2&(a=M.current)))a=1&a|2,t.effectTag|=64;else{if(null!==e&&0!=(64&e.effectTag))e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&Ki(e,n);else if(19===e.tag)Ki(e,n);else if(null!==e.child){e=(e.child.return=e).child;continue}if(e===t)break;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}a&=1}if(f(M,a),0==(2&t.mode))t.memoizedState=null;else switch(r){case"forwards":for(n=t.child,r=null;null!==n;)null!==(e=n.alternate)&&null===Go(e)&&(r=n),n=n.sibling;null===(n=r)?(r=t.child,t.child=null):(r=n.sibling,n.sibling=null),Gi(t,!1,r,n,o,t.lastEffect);break;case"backwards":for(r=t.child,t.child=n=null;null!==r;){if(null!==(e=r.alternate)&&null===Go(e)){t.child=r;break}e=r.sibling,r.sibling=n,n=r,r=e}Gi(t,!0,n,null,o,t.lastEffect);break;case"together":Gi(t,!1,null,null,void 0,t.lastEffect);break;default:t.memoizedState=null}return t.child}function $i(e,t,n){null!==e&&(t.dependencies=e.dependencies);var a=t.expirationTime;if(0!==a&&as(a),t.childExpirationTime<n)return null;if(null!==e&&t.child!==e.child)throw Error(R(153));if(null!==t.child){for(n=_s(e=t.child,e.pendingProps),(t.child=n).return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=_s(e,e.pendingProps)).return=t;n.sibling=null}return t.child}function Ji(e,t){switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case"collapsed":for(var n=e.tail,a=null;null!==n;)null!==n.alternate&&(a=n),n=n.sibling;null===a?t||null===e.tail?e.tail=null:e.tail.sibling=null:a.sibling=null}}function Xi(e,t){return{value:e,source:t,stack:Be(t)}}var Qi=function(e,t){for(var n=t.child;null!==n;){if(5===n.tag||6===n.tag)e.appendChild(n.stateNode);else if(4!==n.tag&&null!==n.child){n=(n.child.return=n).child;continue}if(n===t)break;for(;null===n.sibling;){if(null===n.return||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},Zi=function(e,t,n,a,r){var o=e.memoizedProps;if(o!==a){var i,l,s=t.stateNode;switch(Wo(Ho.current),e=null,n){case"input":o=$e(s,o),a=$e(s,a),e=[];break;case"option":o=tt(s,o),a=tt(s,a),e=[];break;case"select":o=y({},o,{value:void 0}),a=y({},a,{value:void 0}),e=[];break;case"textarea":o=at(s,o),a=at(s,a),e=[];break;default:"function"!=typeof o.onClick&&"function"==typeof a.onClick&&(s.onclick=On)}for(i in Cn(n,a),n=null,o)if(!a.hasOwnProperty(i)&&o.hasOwnProperty(i)&&null!=o[i])if("style"===i)for(l in s=o[i],s)s.hasOwnProperty(l)&&(n=n||{},n[l]="");else"dangerouslySetInnerHTML"!==i&&"children"!==i&&"suppressContentEditableWarning"!==i&&"suppressHydrationWarning"!==i&&"autoFocus"!==i&&(ee.hasOwnProperty(i)?e=e||[]:(e=e||[]).push(i,null));for(i in a){var u=a[i],s=null!=o?o[i]:void 0;if(a.hasOwnProperty(i)&&u!==s&&(null!=u||null!=s))if("style"===i)if(s){for(l in s)!s.hasOwnProperty(l)||u&&u.hasOwnProperty(l)||(n=n||{},n[l]="");for(l in u)u.hasOwnProperty(l)&&s[l]!==u[l]&&(n=n||{},n[l]=u[l])}else n||(e=e||[]).push(i,n),n=u;else"dangerouslySetInnerHTML"===i?(u=u?u.__html:void 0,s=s?s.__html:void 0,null!=u&&s!==u&&(e=e||[]).push(i,u)):"children"===i?s===u||"string"!=typeof u&&"number"!=typeof u||(e=e||[]).push(i,""+u):"suppressContentEditableWarning"!==i&&"suppressHydrationWarning"!==i&&(ee.hasOwnProperty(i)?(null!=u&&Dn(r,i),e||s===u||(e=[])):(e=e||[]).push(i,u))}n&&(e=e||[]).push("style",n),r=e,(t.updateQueue=r)&&(t.effectTag|=4)}},el=function(e,t,n,a){n!==a&&(t.effectTag|=4)},tl="function"==typeof WeakSet?WeakSet:Set;function nl(e,t){var n=t.source;null===t.stack&&null!==n&&Be(n),null!==n&&Ve(n.type),t=t.value,null!==e&&1===e.tag&&Ve(e.type);try{console.error(t)}catch(e){setTimeout(function(){throw e})}}function al(t){var e=t.ref;if(null!==e)if("function"==typeof e)try{e(null)}catch(e){cs(t,e)}else e.current=null}function rl(e,t){if(null!==(t=null!==(t=t.updateQueue)?t.lastEffect:null)){var n,a=t=t.next;do{}while((a.tag&e)===e&&(n=a.destroy,(a.destroy=void 0)!==n&&n()),(a=a.next)!==t)}}function ol(e,t){if(null!==(t=null!==(t=t.updateQueue)?t.lastEffect:null)){var n,a=t=t.next;do{}while((a.tag&e)===e&&(n=a.create,a.destroy=n()),(a=a.next)!==t)}}function il(e,a,t){switch("function"==typeof ms&&ms(a),a.tag){case 0:case 11:case 14:case 15:case 22:var r;null!==(e=a.updateQueue)&&null!==(e=e.lastEffect)&&(r=e.next,no(97<t?97:t,function(){var e=r;do{var t=e.destroy;if(void 0!==t){var n=a;try{t()}catch(e){cs(n,e)}}}while((e=e.next)!==r)}));break;case 1:if(al(a),"function"==typeof(t=a.stateNode).componentWillUnmount){var n=a;var o=t;try{o.props=n.memoizedProps,o.state=n.memoizedState,o.componentWillUnmount()}catch(e){cs(n,e)}}break;case 5:al(a);break;case 4:ul(e,a,t)}}function ll(e){return 5===e.tag||3===e.tag||4===e.tag}function sl(e){e:{for(var t=e.return;null!==t;){if(ll(t)){var n=t;break e}t=t.return}throw Error(R(160))}switch(t=n.stateNode,n.tag){case 5:var a=!1;break;case 3:case 4:t=t.containerInfo,a=!0;break;default:throw Error(R(161))}16&n.effectTag&&(pt(t,""),n.effectTag&=-17);e:t:for(n=e;;){for(;null===n.sibling;){if(null===n.return||ll(n.return)){n=null;break e}n=n.return}for(n.sibling.return=n.return,n=n.sibling;5!==n.tag&&6!==n.tag&&18!==n.tag;){if(2&n.effectTag)continue t;if(null===n.child||4===n.tag)continue t;n=(n.child.return=n).child}if(!(2&n.effectTag)){n=n.stateNode;break e}}(a?function e(t,n,a){var r=t.tag,o=5===r||6===r;if(o)t=o?t.stateNode:t.stateNode.instance,n?(8===a.nodeType?a.parentNode:a).insertBefore(t,n):(8===a.nodeType?(n=a.parentNode,n.insertBefore(t,a)):(n=a,n.appendChild(t)),a=a._reactRootContainer,null==a&&null===n.onclick&&(n.onclick=On));else if(4!==r&&(t=t.child,null!==t))for(e(t,n,a),t=t.sibling;null!==t;)e(t,n,a),t=t.sibling}:function e(t,n,a){var r=t.tag,o=5===r||6===r;if(o)t=o?t.stateNode:t.stateNode.instance,n?a.insertBefore(t,n):a.appendChild(t);else if(4!==r&&(t=t.child,null!==t))for(e(t,n,a),t=t.sibling;null!==t;)e(t,n,a),t=t.sibling})(e,n,t)}function ul(e,t,n){for(var a,r,o=t,i=!1;;){if(!i){i=o.return;e:for(;;){if(null===i)throw Error(R(160));switch(a=i.stateNode,i.tag){case 5:r=!1;break e;case 3:case 4:a=a.containerInfo,r=!0;break e}i=i.return}i=!0}if(5===o.tag||6===o.tag){e:for(var l=e,s=o,u=n,d=s;;)if(il(l,d,u),null!==d.child&&4!==d.tag)d.child.return=d,d=d.child;else{if(d===s)break;for(;null===d.sibling;){if(null===d.return||d.return===s)break e;d=d.return}d.sibling.return=d.return,d=d.sibling}r?(l=a,s=o.stateNode,(8===l.nodeType?l.parentNode:l).removeChild(s)):a.removeChild(o.stateNode)}else if(4===o.tag){if(null!==o.child){a=o.stateNode.containerInfo,r=!0,o=(o.child.return=o).child;continue}}else if(il(e,o,n),null!==o.child){o=(o.child.return=o).child;continue}if(o===t)break;for(;null===o.sibling;){if(null===o.return||o.return===t)return;4===(o=o.return).tag&&(i=!1)}o.sibling.return=o.return,o=o.sibling}}function dl(e,t){switch(t.tag){case 0:case 11:case 14:case 15:case 22:return void rl(3,t);case 1:return;case 5:var n=t.stateNode;if(null!=n){var a=t.memoizedProps,r=null!==e?e.memoizedProps:a,o=(e=t.type,t.updateQueue);if((t.updateQueue=null)!==o){for(n[Jn]=a,"input"===e&&"radio"===a.type&&null!=a.name&&Xe(n,a),Ln(e,r),t=Ln(e,a),r=0;r<o.length;r+=2){var i=o[r],l=o[r+1];"style"===i?En(n,l):"dangerouslySetInnerHTML"===i?ft(n,l):"children"===i?pt(n,l):Ee(n,i,l,t)}switch(e){case"input":Qe(n,a);break;case"textarea":ot(n,a);break;case"select":t=n._wrapperState.wasMultiple,n._wrapperState.wasMultiple=!!a.multiple,null!=(e=a.value)?nt(n,!!a.multiple,e,!1):t!==!!a.multiple&&(null!=a.defaultValue?nt(n,!!a.multiple,a.defaultValue,!0):nt(n,!!a.multiple,a.multiple?[]:"",!1))}}}return;case 6:if(null===t.stateNode)throw Error(R(162));return void(t.stateNode.nodeValue=t.memoizedProps);case 3:return void((t=t.stateNode).hydrate&&(t.hydrate=!1,sn(t.containerInfo)));case 12:return;case 13:if(null===(n=t).memoizedState?a=!1:(a=!0,n=t.child,Nl=g()),null!==n)e:for(e=n;;){if(5===e.tag)o=e.stateNode,a?"function"==typeof(o=o.style).setProperty?o.setProperty("display","none","important"):o.display="none":(o=e.stateNode,r=null!=(r=e.memoizedProps.style)&&r.hasOwnProperty("display")?r.display:null,o.style.display=Sn("display",r));else if(6===e.tag)e.stateNode.nodeValue=a?"":e.memoizedProps;else{if(13===e.tag&&null!==e.memoizedState&&null===e.memoizedState.dehydrated){(o=e.child.sibling).return=e,e=o;continue}if(null!==e.child){e=(e.child.return=e).child;continue}}if(e===n)break;for(;null===e.sibling;){if(null===e.return||e.return===n)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}return void cl(t);case 19:return void cl(t);case 17:return}throw Error(R(163))}function cl(n){var a,e=n.updateQueue;null!==e&&((n.updateQueue=null)===(a=n.stateNode)&&(a=n.stateNode=new tl),e.forEach(function(e){var t=function(e,t){var n=e.stateNode;null!==n&&n.delete(t),(t=0)===t&&(t=Ul(t=Bl(),e,null)),null!==(e=Gl(e,t))&&I(e)}.bind(null,n,e);a.has(e)||(a.add(e),e.then(t,t))}))}var fl="function"==typeof WeakMap?WeakMap:Map;function pl(e,t,n){(n=_o(n,null)).tag=3,n.payload={element:null};var a=t.value;return n.callback=function(){jl||(jl=!0,Yl=a),nl(e,t)},n}function hl(t,n,e){(e=_o(e,null)).tag=3;var a,r=t.type.getDerivedStateFromError,o=("function"==typeof r&&(a=n.value,e.payload=function(){return nl(t,n),r(a)}),t.stateNode);return null!==o&&"function"==typeof o.componentDidCatch&&(e.callback=function(){"function"!=typeof r&&(null===Il?Il=new Set([this]):Il.add(this),nl(t,n));var e=n.stack;this.componentDidCatch(n.value,{componentStack:null!==e?e:""})}),e}var ml=Math.ceil,gl=t.ReactCurrentDispatcher,yl=t.ReactCurrentOwner,L=0,vl=8,T=16,_l=32,bl=0,wl=1,Ml=2,kl=3,Sl=4,El=5,D=L,O=null,N=null,P=0,j=bl,xl=null,Cl=1073741823,Ll=1073741823,Tl=null,Dl=0,Ol=!1,Nl=0,Pl=500,Y=null,jl=!1,Yl=null,Il=null,Rl=!1,Al=null,Hl=90,Fl=null,zl=0,Wl=null,Vl=0;function Bl(){return(D&(T|_l))!==L?1073741821-(g()/10|0):0!==Vl?Vl:Vl=1073741821-(g()/10|0)}function Ul(e,t,n){if(0==(2&(t=t.mode)))return 1073741823;var a=eo();if(0==(4&t))return 99===a?1073741823:1073741822;if((D&T)!==L)return P;if(null!==n)e=io(e,0|n.timeoutMs||5e3,250);else switch(a){case 99:e=1073741823;break;case 98:e=io(e,150,100);break;case 97:case 96:e=io(e,5e3,250);break;case 95:e=2;break;default:throw Error(R(326))}return null!==O&&e===P&&--e,e}function Kl(e,t){if(50<zl)throw zl=0,Wl=null,Error(R(185));var n;null!==(e=Gl(e,t))&&(n=eo(),1073741823===t?(D&vl)!==L&&(D&(T|_l))===L?Jl(e):(I(e),D===L&&E()):I(e),(4&D)===L||98!==n&&99!==n||(null===Fl?Fl=new Map([[e,t]]):(void 0===(n=Fl.get(e))||t<n)&&Fl.set(e,t)))}function Gl(e,t){e.expirationTime<t&&(e.expirationTime=t);var n=e.alternate,a=(null!==n&&n.expirationTime<t&&(n.expirationTime=t),e.return),r=null;if(null===a&&3===e.tag)r=e.stateNode;else for(;null!==a;){if(n=a.alternate,a.childExpirationTime<t&&(a.childExpirationTime=t),null!==n&&n.childExpirationTime<t&&(n.childExpirationTime=t),null===a.return&&3===a.tag){r=a.stateNode;break}a=a.return}return null!==r&&(O===r&&(as(t),j===Sl&&xs(r,P)),Cs(r,t)),r}function ql(e){var t=e.lastExpiredTime;if(0!==t)return t;if(!Es(e,t=e.firstPendingTime))return t;var n=e.lastPingedTime;return(e=(e=e.nextKnownPendingLevel)<n?n:e)<=2&&t!==e?0:e}function I(e){if(0!==e.lastExpiredTime)e.callbackExpirationTime=1073741823,e.callbackPriority=99,e.callbackNode=ro(Jl.bind(null,e));else{var t=ql(e),n=e.callbackNode;if(0===t)null!==n&&(e.callbackNode=null,e.callbackExpirationTime=0,e.callbackPriority=90);else{var a=Bl(),a=1073741823===t?99:1===t||2===t?95:(a=10*(1073741821-t)-10*(1073741821-a))<=0?99:a<=250?98:a<=5250?97:95;if(null!==n){var r=e.callbackPriority;if(e.callbackExpirationTime===t&&a<=r)return;n!==Gr&&Hr(n)}e.callbackExpirationTime=t,e.callbackPriority=a,t=1073741823===t?ro(Jl.bind(null,e)):ao(a,$l.bind(null,e),{timeout:10*(1073741821-t)-g()}),e.callbackNode=t}}}function $l(t,e){if(Vl=0,e)Ls(t,e=Bl()),I(t);else{var n=ql(t);if(0!==n){if(e=t.callbackNode,(D&(T|_l))!==L)throw Error(R(327));if(ss(),t===O&&n===P||Zl(t,n),null!==N){for(var a=D,r=(D|=T,ts());;)try{for(;null!==N&&!qr();)N=rs(N);break}catch(e){es(t,e)}if(fo(),D=a,gl.current=r,j===wl)throw e=xl,Zl(t,n),xs(t,n),I(t),e;if(null===N)switch(r=t.finishedWork=t.current.alternate,t.finishedExpirationTime=n,a=j,O=null,a){case bl:case wl:throw Error(R(345));case Ml:Ls(t,2<n?2:n);break;case kl:if(xs(t,n),n===(a=t.lastSuspendedTime)&&(t.nextKnownPendingLevel=is(r)),1073741823===Cl&&10<(r=Nl+Pl-g())){if(Ol){var o=t.lastPingedTime;if(0===o||n<=o){t.lastPingedTime=n,Zl(t,n);break}}if(0!==(o=ql(t))&&o!==n)break;if(0!==a&&a!==n){t.lastPingedTime=a;break}t.timeoutHandle=Un(ls.bind(null,t),r);break}ls(t);break;case Sl:if(xs(t,n),n===(a=t.lastSuspendedTime)&&(t.nextKnownPendingLevel=is(r)),Ol&&(0===(r=t.lastPingedTime)||n<=r)){t.lastPingedTime=n,Zl(t,n);break}if(0!==(r=ql(t))&&r!==n)break;if(0!==a&&a!==n){t.lastPingedTime=a;break}if(1073741823!==Ll?a=10*(1073741821-Ll)-g():1073741823===Cl?a=0:(a=10*(1073741821-Cl)-5e3,(n=10*(1073741821-n)-(r=g()))<(a=((a=(a=r-a)<0?0:a)<120?120:a<480?480:a<1080?1080:a<1920?1920:a<3e3?3e3:a<4320?4320:1960*ml(a/1960))-a)&&(a=n)),10<a){t.timeoutHandle=Un(ls.bind(null,t),a);break}ls(t);break;case El:if(1073741823!==Cl&&null!==Tl){var o=Cl,i=Tl;if(10<(a=(a=0|i.busyMinDurationMs)<=0?0:(r=0|i.busyDelayMs,(o=g()-(10*(1073741821-o)-(0|i.timeoutMs||5e3)))<=r?0:r+a-o))){xs(t,n),t.timeoutHandle=Un(ls.bind(null,t),a);break}}ls(t);break;default:throw Error(R(329))}if(I(t),t.callbackNode===e)return $l.bind(null,t)}}}return null}function Jl(t){var e=0!==(e=t.lastExpiredTime)?e:1073741823;if((D&(T|_l))!==L)throw Error(R(327));if(ss(),t===O&&e===P||Zl(t,e),null!==N){for(var n=D,a=(D|=T,ts());;)try{for(;null!==N;)N=rs(N);break}catch(e){es(t,e)}if(fo(),D=n,gl.current=a,j===wl)throw n=xl,Zl(t,e),xs(t,e),I(t),n;if(null!==N)throw Error(R(261));t.finishedWork=t.current.alternate,t.finishedExpirationTime=e,O=null,ls(t),I(t)}return null}function Xl(e,t){var n=D;D|=1;try{return e(t)}finally{(D=n)===L&&E()}}function Ql(e,t){var n=D;D=-2&D|vl;try{e(t)}finally{(D=n)===L&&E()}}function Zl(e,t){e.finishedWork=null,e.finishedExpirationTime=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,Kn(n)),null!==N)for(n=N.return;null!==n;){var a=n;switch(a.tag){case 1:null!=(a=a.type.childContextTypes)&&Nr();break;case 3:Bo(),c(h),c(p);break;case 5:Ko(a);break;case 4:Bo();break;case 13:case 19:c(M);break;case 10:po(a)}n=n.return}N=_s((O=e).current,null),P=t,j=bl,Ll=Cl=1073741823,Tl=xl=null,Dl=0,Ol=!1}function es(e,t){do{try{if(fo(),$o.current=wi,Xo)for(var n=k.memoizedState;null!==n;){var a=n.queue;null!==a&&(a.pending=null),n=n.next}if(Jo=0,C=S=k=null,Xo=!1,null===N||null===N.return)return j=wl,xl=t,N=null;e:{var r=e,o=N.return,i=t;if(t=P,(v=N).effectTag|=2048,(v.firstEffect=v.lastEffect=null)!==i&&"object"==typeof i&&"function"==typeof i.then){var l,s,u,d,c=i,f=(0==(2&v.mode)&&((l=v.alternate)?(v.updateQueue=l.updateQueue,v.memoizedState=l.memoizedState,v.expirationTime=l.expirationTime):(v.updateQueue=null,v.memoizedState=null)),0!=(1&M.current)),p=o;do{if(d=(d=13===p.tag)?null!==(s=p.memoizedState)?null!==s.dehydrated:void 0!==(u=p.memoizedProps).fallback&&(!0!==u.unstable_avoidThisFallback||!f):d){var h,m,g=p.updateQueue;if(null===g?((h=new Set).add(c),p.updateQueue=h):g.add(c),0==(2&p.mode)){p.effectTag|=64,v.effectTag&=-2981,1===v.tag&&(null===v.alternate?v.tag=17:((m=_o(1073741823,null)).tag=2,bo(v,m))),v.expirationTime=1073741823;break e}var y,i=void 0,v=t,_=r.pingCache;null===_?(_=r.pingCache=new fl,i=new Set,_.set(c,i)):void 0===(i=_.get(c))&&(i=new Set,_.set(c,i)),i.has(v)||(i.add(v),y=fs.bind(null,r,c,v),c.then(y,y)),p.effectTag|=4096,p.expirationTime=t;break e}}while(null!==(p=p.return));i=Error((Ve(v.type)||"A React component")+" suspended while rendering, but no fallback UI was specified.\n\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display."+Be(v))}j!==El&&(j=Ml),i=Xi(i,v),p=o;do{switch(p.tag){case 3:c=i;p.effectTag|=4096,p.expirationTime=t,wo(p,pl(p,c,t));break e;case 1:c=i;var b=p.type,w=p.stateNode;if(0==(64&p.effectTag)&&("function"==typeof b.getDerivedStateFromError||null!==w&&"function"==typeof w.componentDidCatch&&(null===Il||!Il.has(w)))){p.effectTag|=4096,p.expirationTime=t,wo(p,hl(p,c,t));break e}}}while(null!==(p=p.return))}N=os(N)}catch(e){t=e;continue}break}while(1)}function ts(){var e=gl.current;return gl.current=wi,null===e?wi:e}function ns(e,t){e<Cl&&2<e&&(Cl=e),null!==t&&e<Ll&&2<e&&(Ll=e,Tl=t)}function as(e){Dl<e&&(Dl=e)}function rs(e){var t=ps(e.alternate,e,P);return e.memoizedProps=e.pendingProps,null===t&&(t=os(e)),yl.current=null,t}function os(e){N=e;do{var t=N.alternate;if(e=N.return,0==(2048&N.effectTag)){if(t=function(e,t,n){var a=t.pendingProps;switch(t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return null;case 1:return m(t.type)&&Nr(),null;case 3:return Bo(),c(h),c(p),(n=t.stateNode).pendingContext&&(n.context=n.pendingContext,n.pendingContext=null),null!==e&&null!==e.child||!Ni(t)||(t.effectTag|=4),null;case 5:Ko(t),n=Wo(zo.current);var r=t.type;if(null!==e&&null!=t.stateNode)Zi(e,t,r,a,n),e.ref!==t.ref&&(t.effectTag|=128);else{if(!a){if(null===t.stateNode)throw Error(R(166));return null}if(e=Wo(Ho.current),Ni(t)){var o,i,a=t.stateNode,r=t.type,l=t.memoizedProps;switch(a[$n]=t,a[Jn]=l,r){case"iframe":case"object":case"embed":d("load",a);break;case"video":case"audio":for(e=0;e<kt.length;e++)d(kt[e],a);break;case"source":d("error",a);break;case"img":case"image":case"link":d("error",a),d("load",a);break;case"form":d("reset",a),d("submit",a);break;case"details":d("toggle",a);break;case"input":Je(a,l),d("invalid",a),Dn(n,"onChange");break;case"select":a._wrapperState={wasMultiple:!!l.multiple},d("invalid",a),Dn(n,"onChange");break;case"textarea":rt(a,l),d("invalid",a),Dn(n,"onChange")}for(o in Cn(r,l),e=null,l)l.hasOwnProperty(o)&&(i=l[o],"children"===o?"string"==typeof i?a.textContent!==i&&(e=["children",i]):"number"==typeof i&&a.textContent!==""+i&&(e=["children",""+i]):ee.hasOwnProperty(o)&&null!=i&&Dn(n,o));switch(r){case"input":Ge(a),Ze(a,l,!0);break;case"textarea":Ge(a),it(a);break;case"select":case"option":break;default:"function"==typeof l.onClick&&(a.onclick=On)}n=e,null!==(t.updateQueue=n)&&(t.effectTag|=4)}else{switch(o=9===n.nodeType?n:n.ownerDocument,(e=e===Tn?st(r):e)===Tn?"script"===r?((e=o.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):"string"==typeof a.is?e=o.createElement(r,{is:a.is}):(e=o.createElement(r),"select"===r&&(o=e,a.multiple?o.multiple=!0:a.size&&(o.size=a.size))):e=o.createElementNS(e,r),e[$n]=t,e[Jn]=a,Qi(e,t),t.stateNode=e,o=Ln(r,a),r){case"iframe":case"object":case"embed":d("load",e),i=a;break;case"video":case"audio":for(i=0;i<kt.length;i++)d(kt[i],e);i=a;break;case"source":d("error",e),i=a;break;case"img":case"image":case"link":d("error",e),d("load",e),i=a;break;case"form":d("reset",e),d("submit",e),i=a;break;case"details":d("toggle",e),i=a;break;case"input":Je(e,a),i=$e(e,a),d("invalid",e),Dn(n,"onChange");break;case"option":i=tt(e,a);break;case"select":e._wrapperState={wasMultiple:!!a.multiple},i=y({},a,{value:void 0}),d("invalid",e),Dn(n,"onChange");break;case"textarea":rt(e,a),i=at(e,a),d("invalid",e),Dn(n,"onChange");break;default:i=a}Cn(r,i);var s,u=i;for(l in u)u.hasOwnProperty(l)&&(s=u[l],"style"===l?En(e,s):"dangerouslySetInnerHTML"===l?null!=(s=s?s.__html:void 0)&&ft(e,s):"children"===l?"string"==typeof s?"textarea"===r&&""===s||pt(e,s):"number"==typeof s&&pt(e,""+s):"suppressContentEditableWarning"!==l&&"suppressHydrationWarning"!==l&&"autoFocus"!==l&&(ee.hasOwnProperty(l)?null!=s&&Dn(n,l):null!=s&&Ee(e,l,s,o)));switch(r){case"input":Ge(e),Ze(e,a,!1);break;case"textarea":Ge(e),it(e);break;case"option":null!=a.value&&e.setAttribute("value",""+Ue(a.value));break;case"select":e.multiple=!!a.multiple,null!=(n=a.value)?nt(e,!!a.multiple,n,!1):null!=a.defaultValue&&nt(e,!!a.multiple,a.defaultValue,!0);break;default:"function"==typeof i.onClick&&(e.onclick=On)}Vn(r,a)&&(t.effectTag|=4)}null!==t.ref&&(t.effectTag|=128)}return null;case 6:if(e&&null!=t.stateNode)el(0,t,e.memoizedProps,a);else{if("string"!=typeof a&&null===t.stateNode)throw Error(R(166));n=Wo(zo.current),Wo(Ho.current),Ni(t)?(n=t.stateNode,a=t.memoizedProps,n[$n]=t,n.nodeValue!==a&&(t.effectTag|=4)):((n=(9===n.nodeType?n:n.ownerDocument).createTextNode(a))[$n]=t).stateNode=n}return null;case 13:return(c(M),a=t.memoizedState,0!=(64&t.effectTag))?(t.expirationTime=n,t):(n=null!==a,a=!1,null===e?void 0!==t.memoizedProps.fallback&&Ni(t):(a=null!==(r=e.memoizedState),n||null===r||null!==(r=e.child.sibling)&&(null!==(l=t.firstEffect)?(t.firstEffect=r).nextEffect=l:(t.firstEffect=t.lastEffect=r).nextEffect=null,r.effectTag=8)),n&&!a&&0!=(2&t.mode)&&(null===e&&!0!==t.memoizedProps.unstable_avoidThisFallback||0!=(1&M.current)?j===bl&&(j=kl):(j!==bl&&j!==kl||(j=Sl),0!==Dl&&null!==O&&(xs(O,P),Cs(O,Dl)))),(n||a)&&(t.effectTag|=4),null);case 4:return Bo(),null;case 10:return po(t),null;case 17:return m(t.type)&&Nr(),null;case 19:if(c(M),null===(a=t.memoizedState))return null;if(r=0!=(64&t.effectTag),null===(l=a.rendering)){if(r)Ji(a,!1);else if(j!==bl||null!==e&&0!=(64&e.effectTag))for(l=t.child;null!==l;){if(null!==(e=Go(l))){for(t.effectTag|=64,Ji(a,!1),null!==(r=e.updateQueue)&&(t.updateQueue=r,t.effectTag|=4),null===a.lastEffect&&(t.firstEffect=null),t.lastEffect=a.lastEffect,a=t.child;null!==a;)l=n,(r=a).effectTag&=2,r.nextEffect=null,r.firstEffect=null,(r.lastEffect=null)===(e=r.alternate)?(r.childExpirationTime=0,r.expirationTime=l,r.child=null,r.memoizedProps=null,r.memoizedState=null,r.updateQueue=null,r.dependencies=null):(r.childExpirationTime=e.childExpirationTime,r.expirationTime=e.expirationTime,r.child=e.child,r.memoizedProps=e.memoizedProps,r.memoizedState=e.memoizedState,r.updateQueue=e.updateQueue,l=e.dependencies,r.dependencies=null===l?null:{expirationTime:l.expirationTime,firstContext:l.firstContext,responders:l.responders}),a=a.sibling;return f(M,1&M.current|2),t.child}l=l.sibling}}else{if(!r)if(null!==(e=Go(l))){if(t.effectTag|=64,r=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.effectTag|=4),Ji(a,!0),null===a.tail&&"hidden"===a.tailMode&&!l.alternate)return null!==(t=t.lastEffect=a.lastEffect)&&(t.nextEffect=null),null}else 2*g()-a.renderingStartTime>a.tailExpiration&&1<n&&(t.effectTag|=64,Ji(a,!(r=!0)),t.expirationTime=t.childExpirationTime=n-1);a.isBackwards?(l.sibling=t.child,t.child=l):(null!==(n=a.last)?n.sibling=l:t.child=l,a.last=l)}return null!==a.tail?(0===a.tailExpiration&&(a.tailExpiration=g()+500),n=a.tail,a.rendering=n,a.tail=n.sibling,a.lastEffect=t.lastEffect,a.renderingStartTime=g(),n.sibling=null,t=M.current,f(M,r?1&t|2:1&t),n):null}throw Error(R(156,t.tag))}(t,N,P),1===P||1!==N.childExpirationTime){for(var n=0,a=N.child;null!==a;){var r=a.expirationTime,o=a.childExpirationTime;(n=n<r?r:n)<o&&(n=o),a=a.sibling}N.childExpirationTime=n}if(null!==t)return t;null!==e&&0==(2048&e.effectTag)&&(null===e.firstEffect&&(e.firstEffect=N.firstEffect),null!==N.lastEffect&&(null!==e.lastEffect&&(e.lastEffect.nextEffect=N.firstEffect),e.lastEffect=N.lastEffect),1<N.effectTag&&(null!==e.lastEffect?e.lastEffect.nextEffect=N:e.firstEffect=N,e.lastEffect=N))}else{if(null!==(t=function(e){switch(e.tag){case 1:m(e.type)&&Nr();var t=e.effectTag;return 4096&t?(e.effectTag=-4097&t|64,e):null;case 3:if(Bo(),c(h),c(p),0!=(64&(t=e.effectTag)))throw Error(R(285));return e.effectTag=-4097&t|64,e;case 5:return Ko(e),null;case 13:return c(M),4096&(t=e.effectTag)?(e.effectTag=-4097&t|64,e):null;case 19:return c(M),null;case 4:return Bo(),null;case 10:return po(e),null;default:return null}}(N)))return t.effectTag&=2047,t;null!==e&&(e.firstEffect=e.lastEffect=null,e.effectTag|=2048)}if(null!==(t=N.sibling))return t}while(null!==(N=e));return j===bl&&(j=El),null}function is(e){var t=e.expirationTime;return(e=e.childExpirationTime)<t?t:e}function ls(e){var t=eo();return no(99,function(e,t){for(;ss(),null!==Al;);if((D&(T|_l))!==L)throw Error(R(327));var n=e.finishedWork,a=e.finishedExpirationTime;if(null!==n){if(e.finishedWork=null,e.finishedExpirationTime=0,n===e.current)throw Error(R(177));e.callbackNode=null,e.callbackExpirationTime=0,e.callbackPriority=90,e.nextKnownPendingLevel=0;var r=is(n);if(e.firstPendingTime=r,a<=e.lastSuspendedTime?e.firstSuspendedTime=e.lastSuspendedTime=e.nextKnownPendingLevel=0:a<=e.firstSuspendedTime&&(e.firstSuspendedTime=a-1),a<=e.lastPingedTime&&(e.lastPingedTime=0),a<=e.lastExpiredTime&&(e.lastExpiredTime=0),e===O&&(N=O=null,P=0),null!==(r=1<n.effectTag?null!==n.lastEffect?(n.lastEffect.nextEffect=n).firstEffect:n:n.firstEffect)){var o=D,i=(D|=_l,yl.current=null,zn=vn,Yn());if(In(i)){if("selectionStart"in i)var l={start:i.selectionStart,end:i.selectionEnd};else e:{var s=(l=(l=i.ownerDocument)&&l.defaultView||window).getSelection&&l.getSelection();if(s&&0!==s.rangeCount){l=s.anchorNode;var u=s.anchorOffset,d=s.focusNode;s=s.focusOffset;try{l.nodeType,d.nodeType}catch(e){l=null;break e}var c,f=0,p=-1,h=-1,m=0,g=0,y=i,v=null;t:for(;;){for(;y!==l||0!==u&&3!==y.nodeType||(p=f+u),y!==d||0!==s&&3!==y.nodeType||(h=f+s),3===y.nodeType&&(f+=y.nodeValue.length),null!==(c=y.firstChild);)v=y,y=c;for(;;){if(y===i)break t;if(v===l&&++m===u&&(p=f),v===d&&++g===s&&(h=f),null!==(c=y.nextSibling))break;v=(y=v).parentNode}y=c}l=-1===p||-1===h?null:{start:p,end:h}}else l=null}l=l||{start:0,end:0}}else l=null;vn=!(Wn={activeElementDetached:null,focusedElem:i,selectionRange:l}),Y=r;do{try{!function(){for(;null!==Y;){var e=Y.effectTag;0!=(256&e)&&function(e,t){switch(t.tag){case 0:case 11:case 15:case 22:return;case 1:var n,a;return 256&t.effectTag&&null!==e&&(n=e.memoizedProps,a=e.memoizedState,t=(e=t.stateNode).getSnapshotBeforeUpdate(t.elementType===t.type?n:x(t.type,n),a),e.__reactInternalSnapshotBeforeUpdate=t);case 3:case 5:case 6:case 4:case 17:return}throw Error(R(163))}(Y.alternate,Y),0==(512&e)||Rl||(Rl=!0,ao(97,function(){return ss(),null})),Y=Y.nextEffect}}()}catch(e){if(null===Y)throw Error(R(330));cs(Y,e),Y=Y.nextEffect}}while(null!==Y);Y=r;do{try{for(i=e,l=t;null!==Y;){var _,b,w=Y.effectTag;switch(16&w&&pt(Y.stateNode,""),128&w&&null!==(_=Y.alternate)&&null!==(b=_.ref)&&("function"==typeof b?b(null):b.current=null),1038&w){case 2:sl(Y),Y.effectTag&=-3;break;case 6:sl(Y),Y.effectTag&=-3,dl(Y.alternate,Y);break;case 1024:Y.effectTag&=-1025;break;case 1028:Y.effectTag&=-1025,dl(Y.alternate,Y);break;case 4:dl(Y.alternate,Y);break;case 8:ul(i,u=Y,l),function e(t){var n=t.alternate;t.return=null,t.child=null,t.memoizedState=null,t.updateQueue=null,t.dependencies=null,t.alternate=null,t.firstEffect=null,t.lastEffect=null,t.pendingProps=null,t.memoizedProps=null,(t.stateNode=null)!==n&&e(n)}(u)}Y=Y.nextEffect}}catch(e){if(null===Y)throw Error(R(330));cs(Y,e),Y=Y.nextEffect}}while(null!==Y);if(b=Wn,_=Yn(),w=b.focusedElem,l=b.selectionRange,_!==w&&w&&w.ownerDocument&&function e(t,n){return!(!t||!n)&&(t===n||(!t||3!==t.nodeType)&&(n&&3===n.nodeType?e(t,n.parentNode):"contains"in t?t.contains(n):!!t.compareDocumentPosition&&!!(16&t.compareDocumentPosition(n))))}(w.ownerDocument.documentElement,w)){null!==l&&In(w)&&(_=l.start,void 0===(b=l.end)&&(b=_),"selectionStart"in w?(w.selectionStart=_,w.selectionEnd=Math.min(b,w.value.length)):(b=(_=w.ownerDocument||document)&&_.defaultView||window).getSelection&&(b=b.getSelection(),u=w.textContent.length,i=Math.min(l.start,u),l=void 0===l.end?i:Math.min(l.end,u),!b.extend&&l<i&&(u=l,l=i,i=u),u=jn(w,i),d=jn(w,l),u&&d&&(1!==b.rangeCount||b.anchorNode!==u.node||b.anchorOffset!==u.offset||b.focusNode!==d.node||b.focusOffset!==d.offset)&&((_=_.createRange()).setStart(u.node,u.offset),b.removeAllRanges(),l<i?(b.addRange(_),b.extend(d.node,d.offset)):(_.setEnd(d.node,d.offset),b.addRange(_))))),_=[];for(b=w;b=b.parentNode;)1===b.nodeType&&_.push({element:b,left:b.scrollLeft,top:b.scrollTop});for("function"==typeof w.focus&&w.focus(),w=0;w<_.length;w++)(b=_[w]).element.scrollLeft=b.left,b.element.scrollTop=b.top}vn=!!zn,Wn=zn=null,e.current=n,Y=r;do{try{for(w=e;null!==Y;){var M,k,S=Y.effectTag;36&S&&function(e,t,n){switch(n.tag){case 0:case 11:case 15:case 22:return ol(3,n);case 1:var a;return e=n.stateNode,4&n.effectTag&&(null===t?e.componentDidMount():(a=n.elementType===n.type?t.memoizedProps:x(n.type,t.memoizedProps),e.componentDidUpdate(a,t.memoizedState,e.__reactInternalSnapshotBeforeUpdate))),null!==(t=n.updateQueue)&&ko(0,t,e);case 3:if(null!==(t=n.updateQueue)){if((e=null)!==n.child)switch(n.child.tag){case 5:case 1:e=n.child.stateNode}ko(0,t,e)}return;case 5:return e=n.stateNode,null===t&&4&n.effectTag&&Vn(n.type,n.memoizedProps)&&e.focus();case 6:case 4:case 12:return;case 13:return null===n.memoizedState&&null!==(n=n.alternate)&&null!==(n=n.memoizedState)&&null!==(n=n.dehydrated)&&sn(n);case 19:case 17:case 20:case 21:return}throw Error(R(163))}(w,Y.alternate,Y),128&S&&(_=void 0,null!==(M=Y.ref)&&(k=Y.stateNode,Y.tag,_=k,"function"==typeof M?M(_):M.current=_)),Y=Y.nextEffect}}catch(e){if(null===Y)throw Error(R(330));cs(Y,e),Y=Y.nextEffect}}while(null!==Y);Y=null,$r(),D=o}else e.current=n;if(Rl)Rl=!1,Al=e,Hl=t;else for(Y=r;null!==Y;)t=Y.nextEffect,Y.nextEffect=null,Y=t;if(0===(t=e.firstPendingTime)&&(Il=null),1073741823===t?e===Wl?zl++:(zl=0,Wl=e):zl=0,"function"==typeof hs&&hs(n.stateNode,a),I(e),jl)throw jl=!1,e=Yl,Yl=null,e;(D&vl)===L&&E()}return null}.bind(null,e,t)),null}function ss(){var e;if(90!==Hl)return e=97<Hl?97:Hl,Hl=90,no(e,us)}function us(){if(null===Al)return!1;var t=Al;if(Al=null,(D&(T|_l))!==L)throw Error(R(331));var e=D;for(D|=_l,t=t.current.firstEffect;null!==t;){try{var n=t;if(0!=(512&n.effectTag))switch(n.tag){case 0:case 11:case 15:case 22:rl(5,n),ol(5,n)}}catch(e){if(null===t)throw Error(R(330));cs(t,e)}n=t.nextEffect,t.nextEffect=null,t=n}return D=e,E(),!0}function ds(e,t,n){bo(e,t=pl(e,t=Xi(n,t),1073741823)),null!==(e=Gl(e,1073741823))&&I(e)}function cs(e,t){if(3===e.tag)ds(e,e,t);else for(var n=e.return;null!==n;){if(3===n.tag){ds(n,e,t);break}if(1===n.tag){var a=n.stateNode;if("function"==typeof n.type.getDerivedStateFromError||"function"==typeof a.componentDidCatch&&(null===Il||!Il.has(a))){bo(n,e=hl(n,e=Xi(t,e),1073741823)),null!==(n=Gl(n,1073741823))&&I(n);break}}n=n.return}}function fs(e,t,n){var a=e.pingCache;null!==a&&a.delete(t),O===e&&P===n?j===Sl||j===kl&&1073741823===Cl&&g()-Nl<Pl?Zl(e,P):Ol=!0:!Es(e,n)||0!==(t=e.lastPingedTime)&&t<n||(e.lastPingedTime=n,I(e))}var ps=function(e,t,n){var a,r,o=t.expirationTime;if(null!==e){var i=t.pendingProps;if(e.memoizedProps!==i||h.current)Yi=!0;else{if(o<n){switch(Yi=!1,t.tag){case 3:Vi(t),Pi();break;case 5:if(Uo(t),4&t.mode&&1!==n&&i.hidden)return t.expirationTime=t.childExpirationTime=1,null;break;case 1:m(t.type)&&Yr(t);break;case 4:Vo(t,t.stateNode.containerInfo);break;case 10:o=t.memoizedProps.value,i=t.type._context,f(lo,i._currentValue),i._currentValue=o;break;case 13:if(null!==t.memoizedState)return 0!==(o=t.child.childExpirationTime)&&n<=o?Ui(e,t,n):(f(M,1&M.current),null!==(t=$i(e,t,n))?t.sibling:null);f(M,1&M.current);break;case 19:if(o=t.childExpirationTime>=n,0!=(64&e.effectTag)){if(o)return qi(e,t,n);t.effectTag|=64}if(null!==(i=t.memoizedState)&&(i.rendering=null,i.tail=null),f(M,M.current),!o)return null}return $i(e,t,n)}Yi=!1}}else Yi=!1;switch(t.expirationTime=0,t.tag){case 2:o=t.type;return null!==e&&(e.alternate=null,t.alternate=null,t.effectTag|=2),e=t.pendingProps,i=Or(t,p.current),mo(t,n),i=Zo(null,t,o,e,i,n),t.effectTag|=1,t="object"==typeof i&&null!==i&&"function"==typeof i.render&&void 0===i.$$typeof?(t.tag=1,t.memoizedState=null,t.updateQueue=null,m(o)?(l=!0,Yr(t)):l=!1,t.memoizedState=null!==i.state&&void 0!==i.state?i.state:null,yo(t),"function"==typeof(d=o.getDerivedStateFromProps)&&xo(t,0,d,e),i.updater=Co,Oo((t.stateNode=i)._reactInternalFiber=t,o,e,n),Wi(null,t,o,!0,l,n)):(t.tag=0,_(null,t,i,n),t.child);case 16:e:{if(i=t.elementType,null!==e&&(e.alternate=null,t.alternate=null,t.effectTag|=2),e=t.pendingProps,-1===(a=i)._status&&(a._status=0,r=(r=a._ctor)(),(a._result=r).then(function(e){0===a._status&&(e=e.default,a._status=1,a._result=e)},function(e){0===a._status&&(a._status=2,a._result=e)})),1!==i._status)throw i._result;switch(i=i._result,t.type=i,l=t.tag=function(e){if("function"==typeof e)return vs(e)?1:0;if(null!=e){if((e=e.$$typeof)===Ye)return 11;if(e===Ae)return 14}return 2}(i),e=x(i,e),l){case 0:t=Fi(null,t,i,e,n);break e;case 1:t=zi(null,t,i,e,n);break e;case 11:t=Ii(null,t,i,e,n);break e;case 14:t=Ri(null,t,i,x(i.type,e),o,n);break e}throw Error(R(306,i,""))}return t;case 0:return o=t.type,i=t.pendingProps,Fi(e,t,o,i=t.elementType===o?i:x(o,i),n);case 1:return o=t.type,i=t.pendingProps,zi(e,t,o,i=t.elementType===o?i:x(o,i),n);case 3:if(Vi(t),o=t.updateQueue,null===e||null===o)throw Error(R(282));if(o=t.pendingProps,i=null!==(i=t.memoizedState)?i.element:null,vo(e,t),Mo(t,o,null,n),(o=t.memoizedState.element)===i)Pi(),t=$i(e,t,n);else{if((i=t.stateNode.hydrate)&&(xi=Gn(t.stateNode.containerInfo.firstChild),Ei=t,i=Ci=!0),i)for(n=Ro(t,null,o,n),t.child=n;n;)n.effectTag=-3&n.effectTag|1024,n=n.sibling;else _(e,t,o,n),Pi();t=t.child}return t;case 5:return Uo(t),null===e&&Di(t),o=t.type,i=t.pendingProps,l=null!==e?e.memoizedProps:null,d=i.children,Bn(o,i)?d=null:null!==l&&Bn(o,l)&&(t.effectTag|=16),Hi(e,t),t=4&t.mode&&1!==n&&i.hidden?(t.expirationTime=t.childExpirationTime=1,null):(_(e,t,d,n),t.child);case 6:return null===e&&Di(t),null;case 13:return Ui(e,t,n);case 4:return Vo(t,t.stateNode.containerInfo),o=t.pendingProps,null===e?t.child=Io(t,null,o,n):_(e,t,o,n),t.child;case 11:return o=t.type,i=t.pendingProps,Ii(e,t,o,i=t.elementType===o?i:x(o,i),n);case 7:return _(e,t,t.pendingProps,n),t.child;case 8:case 12:return _(e,t,t.pendingProps.children,n),t.child;case 10:e:{o=t.type._context,i=t.pendingProps,d=t.memoizedProps;var l=i.value,s=t.type._context;if(f(lo,s._currentValue),s._currentValue=l,null!==d)if(s=d.value,0===(l=rr(s,l)?0:0|("function"==typeof o._calculateChangedBits?o._calculateChangedBits(s,l):1073741823))){if(d.children===i.children&&!h.current){t=$i(e,t,n);break e}}else for(null!==(s=t.child)&&(s.return=t);null!==s;){var u=s.dependencies;if(null!==u)for(var d=s.child,c=u.firstContext;null!==c;){if(c.context===o&&0!=(c.observedBits&l)){1===s.tag&&((c=_o(n,null)).tag=2,bo(s,c)),s.expirationTime<n&&(s.expirationTime=n),null!==(c=s.alternate)&&c.expirationTime<n&&(c.expirationTime=n),ho(s.return,n),u.expirationTime<n&&(u.expirationTime=n);break}c=c.next}else d=10===s.tag&&s.type===t.type?null:s.child;if(null!==d)d.return=s;else for(d=s;null!==d;){if(d===t){d=null;break}if(null!==(s=d.sibling)){s.return=d.return,d=s;break}d=d.return}s=d}_(e,t,i.children,n),t=t.child}return t;case 9:return i=t.type,o=(l=t.pendingProps).children,mo(t,n),o=o(i=v(i,l.unstable_observedBits)),t.effectTag|=1,_(e,t,o,n),t.child;case 14:return l=x(i=t.type,t.pendingProps),l=x(i.type,l),Ri(e,t,i,l,o,n);case 15:return Ai(e,t,t.type,t.pendingProps,o,n);case 17:return o=t.type,i=t.pendingProps,i=t.elementType===o?i:x(o,i),null!==e&&(e.alternate=null,t.alternate=null,t.effectTag|=2),t.tag=1,m(o)?(e=!0,Yr(t)):e=!1,mo(t,n),To(t,o,i),Oo(t,o,i,n),Wi(null,t,o,!0,e,n);case 19:return qi(e,t,n)}throw Error(R(156,t.tag))},hs=null,ms=null;function gs(e,t,n,a){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=a,this.effectTag=0,this.lastEffect=this.firstEffect=this.nextEffect=null,this.childExpirationTime=this.expirationTime=0,this.alternate=null}function ys(e,t,n,a){return new gs(e,t,n,a)}function vs(e){return(e=e.prototype)&&e.isReactComponent}function _s(e,t){var n=e.alternate;return null===n?((n=ys(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,(n.alternate=e).alternate=n):(n.pendingProps=t,n.effectTag=0,n.nextEffect=null,n.firstEffect=null,n.lastEffect=null),n.childExpirationTime=e.childExpirationTime,n.expirationTime=e.expirationTime,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=null===t?null:{expirationTime:t.expirationTime,firstContext:t.firstContext,responders:t.responders},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function bs(e,t,n,a,r,o){var i=2;if("function"==typeof(a=e))vs(e)&&(i=1);else if("string"==typeof e)i=5;else e:switch(e){case Te:return ws(n.children,r,o,t);case je:i=8,r|=7;break;case De:i=8,r|=1;break;case Oe:return(e=ys(12,n,t,8|r)).elementType=Oe,e.type=Oe,e.expirationTime=o,e;case Ie:return(e=ys(13,n,t,r)).type=Ie,e.elementType=Ie,e.expirationTime=o,e;case Re:return(e=ys(19,n,t,r)).elementType=Re,e.expirationTime=o,e;default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case Ne:i=10;break e;case Pe:i=9;break e;case Ye:i=11;break e;case Ae:i=14;break e;case He:i=16,a=null;break e;case Fe:i=22;break e}throw Error(R(130,null==e?e:typeof e,""))}return(t=ys(i,n,t,r)).elementType=e,t.type=a,t.expirationTime=o,t}function ws(e,t,n,a){return(e=ys(7,e,a,t)).expirationTime=n,e}function Ms(e,t,n){return(e=ys(6,e,null,t)).expirationTime=n,e}function ks(e,t,n){return(t=ys(4,null!==e.children?e.children:[],e.key,t)).expirationTime=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Ss(e,t,n){this.tag=t,this.current=null,this.containerInfo=e,this.pingCache=this.pendingChildren=null,this.finishedExpirationTime=0,this.finishedWork=null,this.timeoutHandle=-1,this.pendingContext=this.context=null,this.hydrate=n,this.callbackNode=null,this.callbackPriority=90,this.lastExpiredTime=this.lastPingedTime=this.nextKnownPendingLevel=this.lastSuspendedTime=this.firstSuspendedTime=this.firstPendingTime=0}function Es(e,t){var n=e.firstSuspendedTime;return e=e.lastSuspendedTime,0!==n&&t<=n&&e<=t}function xs(e,t){var n=e.firstSuspendedTime,a=e.lastSuspendedTime;n<t&&(e.firstSuspendedTime=t),(t<a||0===n)&&(e.lastSuspendedTime=t),t<=e.lastPingedTime&&(e.lastPingedTime=0),t<=e.lastExpiredTime&&(e.lastExpiredTime=0)}function Cs(e,t){t>e.firstPendingTime&&(e.firstPendingTime=t);var n=e.firstSuspendedTime;0!==n&&(n<=t?e.firstSuspendedTime=e.lastSuspendedTime=e.nextKnownPendingLevel=0:t>=e.lastSuspendedTime&&(e.lastSuspendedTime=t+1),t>e.nextKnownPendingLevel&&(e.nextKnownPendingLevel=t))}function Ls(e,t){var n=e.lastExpiredTime;(0===n||t<n)&&(e.lastExpiredTime=t)}function Ts(e,t,n,a){var r=t.current,o=Bl(),i=So.suspense,o=Ul(o,r,i);e:if(n){t:{if(xt(n=n._reactInternalFiber)!==n||1!==n.tag)throw Error(R(170));var l=n;do{switch(l.tag){case 3:l=l.stateNode.context;break t;case 1:if(m(l.type)){l=l.stateNode.__reactInternalMemoizedMergedChildContext;break t}}}while(null!==(l=l.return));throw Error(R(171))}if(1===n.tag){var s=n.type;if(m(s)){n=jr(n,s,l);break e}}n=l}else n=Tr;null===t.context?t.context=n:t.pendingContext=n,(t=_o(o,i)).payload={element:e},null!==(a=void 0===a?null:a)&&(t.callback=a),bo(r,t),Kl(r,o)}function Ds(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function Os(e,t){null!==(e=e.memoizedState)&&null!==e.dehydrated&&e.retryTime<t&&(e.retryTime=t)}function Ns(e,t){Os(e,t),(e=e.alternate)&&Os(e,t)}function Ps(e,t,n){var a,r,o=new Ss(e,t,n=null!=n&&!0===n.hydrate),i=ys(3,null,null,2===t?7:1===t?3:0);(o.current=i).stateNode=o,yo(i),e[Xn]=o.current,n&&0!==t&&(a=9===e.nodeType?e:e.ownerDocument,r=Et(a),Qt.forEach(function(e){zt(e,a,r)}),Zt.forEach(function(e){zt(e,a,r)})),this._internalRoot=o}function js(e){return e&&(1===e.nodeType||9===e.nodeType||11===e.nodeType||8===e.nodeType&&" react-mount-point-unstable "===e.nodeValue)}function Ys(e,t,n,a,r){var o,i,l,s=n._reactRootContainer;return s?(l=s._internalRoot,"function"==typeof r&&(o=r,r=function(){var e=Ds(l);o.call(e)}),Ts(t,l,e,r)):(l=(s=n._reactRootContainer=function(e,t){if(!(t=t?t:!(!(t=e?9===e.nodeType?e.documentElement:e.firstChild:null)||1!==t.nodeType||!t.hasAttribute("data-reactroot"))))for(var n;n=e.lastChild;)e.removeChild(n);return new Ps(e,0,t?{hydrate:!0}:void 0)}(n,a))._internalRoot,"function"==typeof r&&(i=r,r=function(){var e=Ds(l);i.call(e)}),Ql(function(){Ts(t,l,e,r)})),Ds(l)}function Is(e,t){if(js(t))return function(e,t,n,a){return{$$typeof:Le,key:null==(a=3<arguments.length&&void 0!==a?a:null)?null:""+a,children:e,containerInfo:t,implementation:n}}(e,t,null,2<arguments.length&&void 0!==arguments[2]?arguments[2]:null);throw Error(R(200))}Ps.prototype.render=function(e){Ts(e,this._internalRoot,null,null)},Ps.prototype.unmount=function(){var e=this._internalRoot,t=e.containerInfo;Ts(null,e,null,function(){t[Xn]=null})},Wt=function(e){var t;13===e.tag&&(Kl(e,t=io(Bl(),150,100)),Ns(e,t))},Vt=function(e){13===e.tag&&(Kl(e,3),Ns(e,3))},Bt=function(e){var t;13===e.tag&&(Kl(e,t=Ul(Bl(),e,null)),Ns(e,t))},re=function(e,t,n){switch(t){case"input":if(Qe(e,n),t=n.name,"radio"===n.type&&null!=t){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<n.length;t++){var a=n[t];if(a!==e&&a.form===e.form){var r=ta(a);if(!r)throw Error(R(90));qe(a),Qe(a,r)}}}break;case"textarea":ot(e,n);break;case"select":null!=(t=n.value)&&nt(e,!!n.multiple,t,!1)}},de=Xl,ce=function(e,t,n,a,r){var o=D;D|=4;try{return no(98,e.bind(null,t,n,a,r))}finally{(D=o)===L&&E()}};var pe=function(e,t){var n=D;D|=2;try{return e(t)}finally{(D=n)===L&&E()}},ar={Events:[Zn,ea,ta,ne,Z,sa,function(e){Ot(e,la)},se,ue,bn,jt,ss,{current:!(fe=function(){var e;(D&(1|T|_l))===L&&(null!==Fl&&(e=Fl,Fl=null,e.forEach(function(e,t){Ls(t,e),I(t)}),E()),ss())})}]},Rs=(a={findFiberByHostInstance:Qn,bundleType:0,version:"16.14.0",rendererPackageName:"react-dom"}).findFiberByHostInstance,a=y({},a,{overrideHookState:null,overrideProps:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:t.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=Tt(e))?null:e.stateNode},findFiberByHostInstance:function(e){return Rs?Rs(e):null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null});if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var As=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!As.isDisabled&&As.supportsFiber)try{var Hs=As.inject(a);hs=function(e){try{As.onCommitFiberRoot(Hs,e,void 0,64==(64&e.current.effectTag))}catch(e){}},ms=function(e){try{As.onCommitFiberUnmount(Hs,e)}catch(e){}}}catch(e){}}e.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=ar,e.createPortal=Is,e.findDOMNode=function(e){if(null==e)return null;if(1!==e.nodeType){var t=e._reactInternalFiber;if(void 0===t){if("function"==typeof e.render)throw Error(R(188));throw Error(R(268,Object.keys(e)))}e=null===(e=Tt(t))?null:e.stateNode}return e},e.flushSync=function(e,t){if((D&(T|_l))!==L)throw Error(R(187));var n=D;D|=1;try{return no(99,e.bind(null,t))}finally{D=n,E()}},e.hydrate=function(e,t,n){if(js(t))return Ys(null,e,t,!0,n);throw Error(R(200))},e.render=function(e,t,n){if(js(t))return Ys(null,e,t,!1,n);throw Error(R(200))},e.unmountComponentAtNode=function(e){if(js(e))return!!e._reactRootContainer&&(Ql(function(){Ys(null,null,e,!1,function(){e._reactRootContainer=null,e[Xn]=null})}),!0);throw Error(R(40))},e.unstable_batchedUpdates=Xl,e.unstable_createPortal=function(e,t){return Is(e,t,2<arguments.length&&void 0!==arguments[2]?arguments[2]:null)},e.unstable_renderSubtreeIntoContainer=function(e,t,n,a){if(!js(n))throw Error(R(200));if(null==e||void 0===e._reactInternalFiber)throw Error(R(38));return Ys(e,t,n,!1,a)},e.version="16.14.0"},function(e,t,n){"use strict";e.exports=n(453)},function(I,l,R){"use strict";
+/** @license React v0.19.1
+ * scheduler.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */var o,s,u,t,n,a,e,r,i,d,c,f,p,h,m,g,y,v,_,b;function w(e,t){var n=e.length;for(e.push(t);;){var a=n-1>>>1,r=e[a];if(!(void 0!==r&&0<S(r,t)))break;e[a]=t,e[n]=r,n=a}}function M(e){return void 0===(e=e[0])?null:e}function k(e){var t=e[0];if(void 0!==t){var n=e.pop();if(n!==t){e[0]=n;for(var a=0,r=e.length;a<r;){var o=2*(a+1)-1,i=e[o],l=1+o,s=e[l];if(void 0!==i&&S(i,n)<0)a=void 0!==s&&S(s,i)<0?(e[a]=s,e[l]=n,l):(e[a]=i,e[o]=n,o);else{if(!(void 0!==s&&S(s,n)<0))break;e[a]=s,e[l]=n,a=l}}}}}function S(e,t){var n=e.sortIndex-t.sortIndex;return 0!=n?n:e.id-t.id}"undefined"==typeof window||"function"!=typeof MessageChannel?(n=t=null,a=function(){if(null!==t)try{var e=l.unstable_now();t(!0,e),t=null}catch(e){throw setTimeout(a,0),e}},e=Date.now(),l.unstable_now=function(){return Date.now()-e},o=function(e){null!==t?setTimeout(o,0,e):(t=e,setTimeout(a,0))},s=function(e,t){n=setTimeout(e,t)},u=function(){clearTimeout(n)},v=function(){return!1},_=l.unstable_forceFrameRate=function(){}):(r=window.performance,i=window.Date,d=window.setTimeout,c=window.clearTimeout,"undefined"!=typeof console&&(Y=window.cancelAnimationFrame,"function"!=typeof window.requestAnimationFrame&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"),"function"!=typeof Y&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills")),"object"==typeof r&&"function"==typeof r.now?l.unstable_now=function(){return r.now()}:(f=i.now(),l.unstable_now=function(){return i.now()-f}),p=!1,h=null,m=-1,g=5,y=0,v=function(){return l.unstable_now()>=y},_=function(){},l.unstable_forceFrameRate=function(e){e<0||125<e?console.error("forceFrameRate takes a positive int between 0 and 125, forcing framerates higher than 125 fps is not unsupported"):g=0<e?Math.floor(1e3/e):5},Y=new MessageChannel,b=Y.port2,Y.port1.onmessage=function(){if(null!==h){var e=l.unstable_now();y=e+g;try{h(!0,e)?b.postMessage(null):(p=!1,h=null)}catch(e){throw b.postMessage(null),e}}else p=!1},o=function(e){h=e,p||(p=!0,b.postMessage(null))},s=function(e,t){m=d(function(){e(l.unstable_now())},t)},u=function(){c(m),m=-1});var E=[],x=[],A=1,C=null,L=3,T=!1,D=!1,O=!1;function N(e){for(var t=M(x);null!==t;){if(null===t.callback)k(x);else{if(!(t.startTime<=e))break;k(x),t.sortIndex=t.expirationTime,w(E,t)}t=M(x)}}function P(e){var t;O=!1,N(e),D||(null!==M(E)?(D=!0,o(j)):null!==(t=M(x))&&s(P,t.startTime-e))}function j(e,t){D=!1,O&&(O=!1,u()),T=!0;var n=L;try{for(N(t),C=M(E);null!==C&&(!(C.expirationTime>t)||e&&!v());){var a,r=C.callback;null!==r?(C.callback=null,L=C.priorityLevel,a=r(C.expirationTime<=t),t=l.unstable_now(),"function"==typeof a?C.callback=a:C===M(E)&&k(E),N(t)):k(E),C=M(E)}var o,i=null!==C||(null!==(o=M(x))&&s(P,o.startTime-t),!1);return i}finally{C=null,L=n,T=!1}}function H(e){switch(e){case 1:return-1;case 2:return 250;case 5:return 1073741823;case 4:return 1e4;default:return 5e3}}var Y=_;l.unstable_IdlePriority=5,l.unstable_ImmediatePriority=1,l.unstable_LowPriority=4,l.unstable_NormalPriority=3,l.unstable_Profiling=null,l.unstable_UserBlockingPriority=2,l.unstable_cancelCallback=function(e){e.callback=null},l.unstable_continueExecution=function(){D||T||(D=!0,o(j))},l.unstable_getCurrentPriorityLevel=function(){return L},l.unstable_getFirstCallbackNode=function(){return M(E)},l.unstable_next=function(e){switch(L){case 1:case 2:case 3:var t=3;break;default:t=L}var n=L;L=t;try{return e()}finally{L=n}},l.unstable_pauseExecution=function(){},l.unstable_requestPaint=Y,l.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=L;L=e;try{return t()}finally{L=n}},l.unstable_scheduleCallback=function(e,t,n){var a,r=l.unstable_now();return"object"==typeof n&&null!==n?(a="number"==typeof(a=n.delay)&&0<a?r+a:r,n="number"==typeof n.timeout?n.timeout:H(e)):(n=H(e),a=r),e={id:A++,callback:t,priorityLevel:e,startTime:a,expirationTime:n=a+n,sortIndex:-1},r<a?(e.sortIndex=a,w(x,e),null===M(E)&&e===M(x)&&(O?u():O=!0,s(P,a-r))):(e.sortIndex=n,w(E,e),D||T||(D=!0,o(j))),e},l.unstable_shouldYield=function(){var e=l.unstable_now(),t=(N(e),M(E));return t!==C&&null!==C&&null!==t&&null!==t.callback&&t.startTime<=e&&t.expirationTime<C.expirationTime||v()},l.unstable_wrapCallback=function(t){var n=L;return function(){var e=L;L=n;try{return t.apply(this,arguments)}finally{L=e}}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var p=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n,a=arguments[t];for(n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n])}return e},h=(t.default=function(r,o){var e=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},t=e.selectLocationState,n=void 0===t?m:t,t=e.adjustUrlOnReplay,a=void 0===t||t;if(void 0===n(o.getState()))throw new Error("Expected the routing state to be available either as `state.routing` or as the custom expression you can specify as `selectLocationState` in the `syncHistoryWithStore()` options. Ensure you have added the `routerReducer` to your store's reducers via `combineReducers` or whatever method you use to isolate your reducers.");function i(e){return n(o.getState()).locationBeforeTransitions||(e?l:void 0)}var l=void 0,s=void 0,u=void 0,d=void 0,c=void 0;l=i(),a&&(e=function(){var e=i(!0);c!==e&&l!==e&&(s=!0,c=e,r.transitionTo(p({},e,{action:"PUSH"})),s=!1)},u=o.subscribe(e),e());function f(e){s||(c=e,!l&&(l=e,i())||o.dispatch({type:h.LOCATION_CHANGE,payload:e}))}d=r.listen(f),r.getCurrentLocation&&f(r.getCurrentLocation());return p({},r,{listen:function(t){var n=i(!0),a=!1,e=o.subscribe(function(){var e=i(!0);e!==n&&(n=e,a||t(n))});return r.getCurrentLocation||t(n),function(){a=!0,e()}},unsubscribe:function(){a&&u(),d()}})},n(187)),m=function(e){return e.routing}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(a){return function(){return function(n){return function(e){if(e.type!==r.CALL_HISTORY_METHOD)return n(e);var e=e.payload,t=e.method,e=e.args;a[t].apply(a,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 Array.from(e)}}(e))}}}};var r=n(188)},function(e,t,n){"use strict";
+/** @license React v16.13.1
+ * react-is.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */var a="function"==typeof Symbol&&Symbol.for,r=a?Symbol.for("react.element"):60103,o=a?Symbol.for("react.portal"):60106,i=a?Symbol.for("react.fragment"):60107,l=a?Symbol.for("react.strict_mode"):60108,s=a?Symbol.for("react.profiler"):60114,u=a?Symbol.for("react.provider"):60109,d=a?Symbol.for("react.context"):60110,c=a?Symbol.for("react.async_mode"):60111,f=a?Symbol.for("react.concurrent_mode"):60111,p=a?Symbol.for("react.forward_ref"):60112,h=a?Symbol.for("react.suspense"):60113,m=a?Symbol.for("react.suspense_list"):60120,g=a?Symbol.for("react.memo"):60115,y=a?Symbol.for("react.lazy"):60116,v=a?Symbol.for("react.block"):60121,_=a?Symbol.for("react.fundamental"):60117,b=a?Symbol.for("react.responder"):60118,w=a?Symbol.for("react.scope"):60119;function M(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case c:case f:case i:case s:case l:case h:return e;default:switch(e=e&&e.$$typeof){case d:case p:case y:case g:case u:return e;default:return t}}case o:return t}}}function k(e){return M(e)===f}t.AsyncMode=c,t.ConcurrentMode=f,t.ContextConsumer=d,t.ContextProvider=u,t.Element=r,t.ForwardRef=p,t.Fragment=i,t.Lazy=y,t.Memo=g,t.Portal=o,t.Profiler=s,t.StrictMode=l,t.Suspense=h,t.isAsyncMode=function(e){return k(e)||M(e)===c},t.isConcurrentMode=k,t.isContextConsumer=function(e){return M(e)===d},t.isContextProvider=function(e){return M(e)===u},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===r},t.isForwardRef=function(e){return M(e)===p},t.isFragment=function(e){return M(e)===i},t.isLazy=function(e){return M(e)===y},t.isMemo=function(e){return M(e)===g},t.isPortal=function(e){return M(e)===o},t.isProfiler=function(e){return M(e)===s},t.isStrictMode=function(e){return M(e)===l},t.isSuspense=function(e){return M(e)===h},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===i||e===f||e===s||e===l||e===h||e===m||"object"==typeof e&&null!==e&&(e.$$typeof===y||e.$$typeof===g||e.$$typeof===u||e.$$typeof===d||e.$$typeof===p||e.$$typeof===_||e.$$typeof===b||e.$$typeof===w||e.$$typeof===v)},t.typeOf=M},function(e,t,n){"use strict";
+/** @license React v17.0.2
+ * react-is.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */var a=60103,r=60106,o=60107,i=60108,l=60114,s=60109,u=60110,d=60112,c=60113,f=60120,p=60115,h=60116,m=60121,g=60122,y=60117,v=60129,_=60131;function b(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case a:switch(e=e.type){case o:case l:case i:case c:case f:return e;default:switch(e=e&&e.$$typeof){case u:case d:case h:case p:case s:return e;default:return t}}case r:return t}}}"function"==typeof Symbol&&Symbol.for&&(a=(w=Symbol.for)("react.element"),r=w("react.portal"),o=w("react.fragment"),i=w("react.strict_mode"),l=w("react.profiler"),s=w("react.provider"),u=w("react.context"),d=w("react.forward_ref"),c=w("react.suspense"),f=w("react.suspense_list"),p=w("react.memo"),h=w("react.lazy"),m=w("react.block"),g=w("react.server.block"),y=w("react.fundamental"),v=w("react.debug_trace_mode"),_=w("react.legacy_hidden"));var w=s,M=a,k=d,S=o,E=h,x=p,C=r,L=l,T=i,D=c;t.ContextConsumer=u,t.ContextProvider=w,t.Element=M,t.ForwardRef=k,t.Fragment=S,t.Lazy=E,t.Memo=x,t.Portal=C,t.Profiler=L,t.StrictMode=T,t.Suspense=D,t.isAsyncMode=function(){return!1},t.isConcurrentMode=function(){return!1},t.isContextConsumer=function(e){return b(e)===u},t.isContextProvider=function(e){return b(e)===s},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===a},t.isForwardRef=function(e){return b(e)===d},t.isFragment=function(e){return b(e)===o},t.isLazy=function(e){return b(e)===h},t.isMemo=function(e){return b(e)===p},t.isPortal=function(e){return b(e)===r},t.isProfiler=function(e){return b(e)===l},t.isStrictMode=function(e){return b(e)===i},t.isSuspense=function(e){return b(e)===c},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===o||e===l||e===v||e===i||e===c||e===f||e===_||"object"==typeof e&&null!==e&&(e.$$typeof===h||e.$$typeof===p||e.$$typeof===s||e.$$typeof===u||e.$$typeof===d||e.$$typeof===y||e.$$typeof===m||e[0]===g)},t.typeOf=b},function(e,t,n){"use strict";var a,r=n(1),o=void 0;window.edasprefix="acm",window.globalConfig={isParentEdas:function(){return window.parent&&-1!==window.parent.location.host.indexOf("edas")}},r.b.middleWare(function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},t=e.url,t=void 0===t?"":t,n=localStorage.getItem("namespace")?localStorage.getItem("namespace"):"";e.data=-1===t.indexOf("namespaceId=")?Object.assign({},e.data,{namespaceId:n}):e.data;var n="global"===(n=window.nownamespace||Object(r.a)("namespace")||"")?"":n,a=t.split("?");return 1<a.length&&-1!==a[1].indexOf("dataId")&&(t+="&tenant=".concat(n),e.url=t),e}),window.require.config({paths:{vs:"console-ui/public/js/vs"}}),window.require.config({"vs/nls":{availableLanguages:{"*":"zh-cn"}}}),window.require(["vs/editor/editor.main"],function(){window.monaco.languages.register({id:"properties"}),window.monaco.languages.setMonarchTokensProvider("properties",{tokenizer:{root:[[/^\#.*/,"comment"],[/.*\=/,"key"],[/^=.*/,"value"]]}}),window.monaco.editor.defineTheme("properties",{base:"vs",inherit:!1,rules:[{token:"key",foreground:"009968"},{token:"value",foreground:"009968"},{token:"comment",foreground:"666666"}]}),window.monaco.languages.registerCompletionItemProvider("properties",{provideCompletionItems:function(){return[{label:"simpleText",kind:window.monaco.languages.CompletionItemKind.Text},{label:"testing",kind:window.monaco.languages.CompletionItemKind.Keyword,insertText:{value:"testing(${1:condition})"}},{label:"ifelse",kind:window.monaco.languages.CompletionItemKind.Snippet,insertText:{value:["if (${1:condition}) {","\t$0","} else {","\t","}"].join("\n")},documentation:"If-Else Statement"}]}})}),window.importEditor=function(e){window.require(["vs/editor/editor.main"],function(){e&&e()})},window._getLink=(window,a={},function(e){return a[e]||""}),window.addEventListener("resize",function(){try{(void 0).timmer&&clearTimeout((void 0).timmer),o.timmer=setTimeout(function(){var e=800<(e=document.body.clientHeight)?e:800;window.parent.adjustHeight&&window.parent.adjustHeight(e)},500)}catch(e){}}),window.isIntel=function(){return-1!==window.location.host.indexOf("alibabacloud.com")}},function(e,t,n){},function(e,t,n){e.exports={default:n(461),__esModule:!0}},function(e,t,n){n(462),e.exports=n(77).Object.assign},function(e,t,n){var a=n(91);a(a.S+a.F,"Object",{assign:n(464)})},function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,t,n){"use strict";var f=n(78),p=n(121),h=n(148),m=n(124),g=n(149),y=n(194),r=Object.assign;e.exports=!r||n(108)(function(){var e={},t={},n=Symbol(),a="abcdefghijklmnopqrst";return e[n]=7,a.split("").forEach(function(e){t[e]=e}),7!=r({},e)[n]||Object.keys(r({},t)).join("")!=a})?function(e,t){for(var n=g(e),a=arguments.length,r=1,o=h.f,i=m.f;r<a;)for(var l,s=y(arguments[r++]),u=o?p(s).concat(o(s)):p(s),d=u.length,c=0;c<d;)l=u[c++],f&&!i.call(s,l)||(n[l]=s[l]);return n}:r},function(e,t,n){var s=n(94),u=n(466),d=n(467);e.exports=function(l){return function(e,t,n){var a,r=s(e),o=u(r.length),i=d(n,o);if(l&&t!=t){for(;i<o;)if((a=r[i++])!=a)return!0}else for(;i<o;i++)if((l||i in r)&&r[i]===t)return l||i||0;return!l&&-1}}},function(e,t,n){var a=n(144),r=Math.min;e.exports=function(e){return 0<e?r(a(e),9007199254740991):0}},function(e,t,n){var a=n(144),r=Math.max,o=Math.min;e.exports=function(e,t){return(e=a(e))<0?r(e+t,0):o(e,t)}},function(e,t,n){e.exports={default:n(469),__esModule:!0}},function(e,t,n){n(470),n(476),e.exports=n(153).f("iterator")},function(e,t,n){"use strict";var a=n(471)(!0);n(196)(String,"String",function(e){this._t=String(e),this._i=0},function(){var e=this._t,t=this._i;return t>=e.length?{value:void 0,done:!0}:(e=a(e,t),this._i+=e.length,{value:e,done:!1})})},function(e,t,n){var o=n(144),i=n(143);e.exports=function(r){return function(e,t){var n,e=String(i(e)),t=o(t),a=e.length;return t<0||a<=t?r?"":void 0:(n=e.charCodeAt(t))<55296||56319<n||t+1===a||(a=e.charCodeAt(t+1))<56320||57343<a?r?e.charAt(t):n:r?e.slice(t,t+2):a-56320+(n-55296<<10)+65536}}},function(e,t,n){"use strict";var a=n(151),r=n(120),o=n(152),i={};n(92)(i,n(95)("iterator"),function(){return this}),e.exports=function(e,t,n){e.prototype=a(i,{next:r(1,n)}),o(e,t+" Iterator")}},function(e,t,n){var i=n(84),l=n(107),s=n(121);e.exports=n(78)?Object.defineProperties:function(e,t){l(e);for(var n,a=s(t),r=a.length,o=0;o<r;)i.f(e,n=a[o++],t[n]);return e}},function(e,t,n){n=n(76).document;e.exports=n&&n.documentElement},function(e,t,n){var a=n(85),r=n(149),o=n(145)("IE_PROTO"),i=Object.prototype;e.exports=Object.getPrototypeOf||function(e){return e=r(e),a(e,o)?e[o]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?i:null}},function(e,t,n){n(477);for(var a=n(76),r=n(92),o=n(150),i=n(95)("toStringTag"),l="CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,TextTrackList,TouchList".split(","),s=0;s<l.length;s++){var u=l[s],d=a[u],d=d&&d.prototype;d&&!d[i]&&r(d,i,u),o[u]=o.Array}},function(e,t,n){"use strict";var a=n(478),r=n(479),o=n(150),i=n(94);e.exports=n(196)(Array,"Array",function(e,t){this._t=i(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,r(1)):r(0,"keys"==t?n:"values"==t?e[n]:[n,e[n]])},"values"),o.Arguments=o.Array,a("keys"),a("values"),a("entries")},function(e,t){e.exports=function(){}},function(e,t){e.exports=function(e,t){return{value:t,done:!!e}}},function(e,t,n){e.exports={default:n(481),__esModule:!0}},function(e,t,n){n(482),n(487),n(488),n(489),e.exports=n(77).Symbol},function(I,R,e){"use strict";function a(e){var t=L[e]=_(M[E]);return t._k=e,t}function n(e,t){m(e);for(var n,a=V(t=g(t)),r=0,o=a.length;r<o;)Y(e,n=a[r++],t[n]);return e}function t(e){var t=ee.call(this,e=y(e,!0));return!(this===D&&s(L,e)&&!s(T,e))&&(!(t||!s(this,e)||!s(L,e)||s(this,x)&&this[x][e])||t)}function r(e,t){var n;if(e=g(e),t=y(t,!0),e!==D||!s(L,t)||s(T,t))return!(n=X(e,t))||!s(L,t)||s(e,x)&&e[x][t]||(n.enumerable=!0),n}function o(e){for(var t,n=Q(g(e)),a=[],r=0;n.length>r;)s(L,t=n[r++])||t==x||t==H||a.push(t);return a}function i(e){for(var t,n=e===D,a=Q(n?T:g(e)),r=[],o=0;a.length>o;)!s(L,t=a[o++])||n&&!s(D,t)||r.push(L[t]);return r}var l=e(76),s=e(85),u=e(78),d=e(91),A=e(197),H=e(483).KEY,c=e(108),f=e(146),p=e(152),F=e(123),h=e(95),z=e(153),W=e(154),V=e(484),B=e(485),m=e(107),U=e(93),K=e(149),g=e(94),y=e(142),v=e(120),_=e(151),G=e(486),q=e(199),b=e(148),$=e(84),J=e(121),X=q.f,w=$.f,Q=G.f,M=l.Symbol,k=l.JSON,S=k&&k.stringify,E="prototype",x=h("_hidden"),Z=h("toPrimitive"),ee={}.propertyIsEnumerable,C=f("symbol-registry"),L=f("symbols"),T=f("op-symbols"),D=Object[E],f="function"==typeof M&&!!b.f,O=l.QObject,N=!O||!O[E]||!O[E].findChild,P=u&&c(function(){return 7!=_(w({},"a",{get:function(){return w(this,"a",{value:7}).a}})).a})?function(e,t,n){var a=X(D,t);a&&delete D[t],w(e,t,n),a&&e!==D&&w(D,t,a)}:w,j=f&&"symbol"==typeof M.iterator?function(e){return"symbol"==typeof e}:function(e){return e instanceof M},Y=function(e,t,n){return e===D&&Y(T,t,n),m(e),t=y(t,!0),m(n),s(L,t)?(n.enumerable?(s(e,x)&&e[x][t]&&(e[x][t]=!1),n=_(n,{enumerable:v(0,!1)})):(s(e,x)||w(e,x,v(1,{})),e[x][t]=!0),P(e,t,n)):w(e,t,n)};f||(A((M=function(){if(this instanceof M)throw TypeError("Symbol is not a constructor!");var t=F(0<arguments.length?arguments[0]:void 0),n=function(e){this===D&&n.call(T,e),s(this,x)&&s(this[x],t)&&(this[x][t]=!1),P(this,t,v(1,e))};return u&&N&&P(D,t,{configurable:!0,set:n}),a(t)})[E],"toString",function(){return this._k}),q.f=r,$.f=Y,e(198).f=G.f=o,e(124).f=t,b.f=i,u&&!e(122)&&A(D,"propertyIsEnumerable",t,!0),z.f=function(e){return a(h(e))}),d(d.G+d.W+d.F*!f,{Symbol:M});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 ae=J(h.store),re=0;ae.length>re;)W(ae[re++]);d(d.S+d.F*!f,"Symbol",{for:function(e){return s(C,e+="")?C[e]:C[e]=M(e)},keyFor:function(e){if(!j(e))throw TypeError(e+" is not a symbol!");for(var t in C)if(C[t]===e)return t},useSetter:function(){N=!0},useSimple:function(){N=!1}}),d(d.S+d.F*!f,"Object",{create:function(e,t){return void 0===t?_(e):n(_(e),t)},defineProperty:Y,defineProperties:n,getOwnPropertyDescriptor:r,getOwnPropertyNames:o,getOwnPropertySymbols:i});O=c(function(){b.f(1)});d(d.S+d.F*O,"Object",{getOwnPropertySymbols:function(e){return b.f(K(e))}}),k&&d(d.S+d.F*(!f||c(function(){var e=M();return"[null]"!=S([e])||"{}"!=S({a:e})||"{}"!=S(Object(e))})),"JSON",{stringify:function(e){for(var t,n,a=[e],r=1;r<arguments.length;)a.push(arguments[r++]);if(n=t=a[1],(U(t)||void 0!==e)&&!j(e))return B(t)||(t=function(e,t){if("function"==typeof n&&(t=n.call(this,e,t)),!j(t))return t}),a[1]=t,S.apply(k,a)}}),M[E][Z]||e(92)(M[E],Z,M[E].valueOf),p(M,"Symbol"),p(Math,"Math",!0),p(l.JSON,"JSON",!0)},function(e,t,n){function a(e){l(e,r,{value:{i:"O"+ ++s,w:{}}})}var r=n(123)("meta"),o=n(93),i=n(85),l=n(84).f,s=0,u=Object.isExtensible||function(){return!0},d=!n(108)(function(){return u(Object.preventExtensions({}))}),c=e.exports={KEY:r,NEED:!1,fastKey:function(e,t){if(!o(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!i(e,r)){if(!u(e))return"F";if(!t)return"E";a(e)}return e[r].i},getWeak:function(e,t){if(!i(e,r)){if(!u(e))return!0;if(!t)return!1;a(e)}return e[r].w},onFreeze:function(e){return d&&c.NEED&&u(e)&&!i(e,r)&&a(e),e}}},function(e,t,n){var l=n(121),s=n(148),u=n(124);e.exports=function(e){var t=l(e),n=s.f;if(n)for(var a,r=n(e),o=u.f,i=0;r.length>i;)o.call(e,a=r[i++])&&t.push(a);return t}},function(e,t,n){var a=n(195);e.exports=Array.isArray||function(e){return"Array"==a(e)}},function(e,t,n){var a=n(94),r=n(198).f,o={}.toString,i="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){if(!i||"[object Window]"!=o.call(e))return r(a(e));try{return r(e)}catch(e){return i.slice()}}},function(e,t){},function(e,t,n){n(154)("asyncIterator")},function(e,t,n){n(154)("observable")},function(e,t,n){e.exports={default:n(491),__esModule:!0}},function(e,t,n){n(492),e.exports=n(77).Object.setPrototypeOf},function(e,t,n){var a=n(91);a(a.S,"Object",{setPrototypeOf:n(493).set})},function(e,t,r){function o(e,t){if(a(e),!n(t)&&null!==t)throw TypeError(t+": can't set as prototype!")}var n=r(93),a=r(107);e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,n,a){try{(a=r(190)(Function.call,r(199).f(Object.prototype,"__proto__").set,2))(e,[]),n=!(e instanceof Array)}catch(e){n=!0}return function(e,t){return o(e,t),n?e.__proto__=t:a(e,t),e}}({},!1):void 0),check:o}},function(e,t,n){e.exports={default:n(495),__esModule:!0}},function(e,t,n){n(496);var a=n(77).Object;e.exports=function(e,t){return a.create(e,t)}},function(e,t,n){var a=n(91);a(a.S,"Object",{create:n(151)})},function(e,t,n){"use strict";var i=n(498);function a(){}function r(){}r.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,r,o){if(o!==i)throw o=new Error("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"),o.name="Invariant Violation",o}function t(){return e}var n={array:e.isRequired=e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:r,resetWarningCache:a};return n.PropTypes=n}},function(e,t,n){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},function(e,t,n){"use strict";function s(e,t,n,a){e.removeEventListener&&e.removeEventListener(t,n,a||!1)}function a(e,t,n,a){return e.addEventListener&&e.addEventListener(t,n,a||!1),{off:function(){return s(e,t,n,a)}}}t.__esModule=!0,t.on=a,t.once=function(r,o,i,l){return a(r,o,function e(){for(var t=arguments.length,n=Array(t),a=0;a<t;a++)n[a]=arguments[a];i.apply(this,n),s(r,o,e,l)},l)},t.off=s},function(e,t,n){"use strict";t.__esModule=!0,t.prevent=t.noop=void 0,t.makeChain=function(){for(var e=arguments.length,o=Array(e),t=0;t<e;t++)o[t]=arguments[t];return 1!==o.length?function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];for(var a=0,r=o.length;a<r;a++)o[a]&&o[a].apply&&o[a].apply(this,t)}:o[0]},t.bindCtx=function(t,e,n){"string"==typeof e&&(e=[e]);n=n||t,e.forEach(function(e){n[e]=n[e].bind(t)})},t.promiseCall=function(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:o;if((0,a.isPromise)(e))return e.then(function(e){return t(e),e}).catch(function(e){n(e)});return(!1!==e?t:n)(e)},t.invoke=function(e,t,n){e=e&&t in e?e[t]:void 0;return e&&e.apply(void 0,n)},t.renderNode=function(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:[],e=void 0!==e?e:t;n&&!Array.isArray(n)&&(n=[n]);return"function"==typeof e?e.apply(void 0,n):e},t.checkDate=l,t.checkRangeDate=function(t,e,n){var a=!(3<arguments.length&&void 0!==arguments[3])||arguments[3],r=Array.isArray(t)?[0,1].map(function(e){return l(t[e])}):[null,null],o=r[0],r=r[1],n=Array.isArray(n)?n:[n,n],i=n[0],n=n[1];if(a&&o&&r&&o.isAfter(r))return!i&&n||!i&&1===e?[null,r]:[o,null];return[o,r]};var a=n(96),n=n(155),r=(n=n)&&n.__esModule?n:{default:n};var o=t.noop=function(){};t.prevent=function(){return!1};function l(e){return(e=(0,r.default)(e=void 0===e?null:e)).isValid()?e:null}},function(e,t,n){e.exports=function(){"use strict";var s={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},c=/(\[[^[]*\])|([-_:/.,()\s]+)|(A|a|YYYY|YY?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,e=/\d\d/,t=/\d\d?/,n=/\d*[^-_:/,()\s\d]+/,h={},a=function(e){return(e=+e)+(e>68?1900:2e3)},r=function(t){return function(e){this[t]=+e}},o=[/[+-]\d\d:?(\d\d)?|Z/,function(e){(this.zone||(this.zone={})).offset=function(e){if(!e)return 0;if("Z"===e)return 0;var t=e.match(/([+-]|\d\d)/g),n=60*t[1]+(+t[2]||0);return 0===n?0:"+"===t[0]?-n:n}(e)}],i=function(e){var t=h[e];return t&&(t.indexOf?t:t.s.concat(t.f))},l=function(e,t){var n,a=h.meridiem;if(a){for(var r=1;r<=24;r+=1)if(e.indexOf(a(r,0,t))>-1){n=r>12;break}}else n=e===(t?"pm":"PM");return n},f={A:[n,function(e){this.afternoon=l(e,!1)}],a:[n,function(e){this.afternoon=l(e,!0)}],S:[/\d/,function(e){this.milliseconds=100*+e}],SS:[e,function(e){this.milliseconds=10*+e}],SSS:[/\d{3}/,function(e){this.milliseconds=+e}],s:[t,r("seconds")],ss:[t,r("seconds")],m:[t,r("minutes")],mm:[t,r("minutes")],H:[t,r("hours")],h:[t,r("hours")],HH:[t,r("hours")],hh:[t,r("hours")],D:[t,r("day")],DD:[e,r("day")],Do:[n,function(e){var t=h.ordinal,n=e.match(/\d+/);if(this.day=n[0],t)for(var a=1;a<=31;a+=1)t(a).replace(/\[|\]/g,"")===e&&(this.day=a)}],M:[t,r("month")],MM:[e,r("month")],MMM:[n,function(e){var t=i("months"),n=(i("monthsShort")||t.map(function(e){return e.slice(0,3)})).indexOf(e)+1;if(n<1)throw new Error;this.month=n%12||n}],MMMM:[n,function(e){var t=i("months").indexOf(e)+1;if(t<1)throw new Error;this.month=t%12||t}],Y:[/[+-]?\d+/,r("year")],YY:[e,function(e){this.year=a(e)}],YYYY:[/\d{4}/,r("year")],Z:o,ZZ:o};function b(e){var t,r;t=e,r=h&&h.formats;for(var u=(e=t.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g,function(e,t,n){var a=n&&n.toUpperCase();return t||r[n]||s[n]||r[a].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,function(e,t,n){return t||n.slice(1)})})).match(c),d=u.length,n=0;n<d;n+=1){var a=u[n],o=f[a],i=o&&o[0],l=o&&o[1];u[n]=l?{regex:i,parser:l}:a.replace(/^\[|\]$/g,"")}return function(e){for(var t={},n=0,a=0;n<d;n+=1){var r=u[n];if("string"==typeof r)a+=r.length;else{var o=r.regex,i=r.parser,l=e.slice(a),s=o.exec(l)[0];i.call(t,s),e=e.replace(s,"")}}return function(e){var t=e.afternoon;if(void 0!==t){var n=e.hours;t?n<12&&(e.hours+=12):12===n&&(e.hours=0),delete e.afternoon}}(t),t}}return function(e,t,f){f.p.customParseFormat=!0,e&&e.parseTwoDigitYear&&(a=e.parseTwoDigitYear);var n=t.prototype,p=n.parse;n.parse=function(e){var t=e.date,n=e.utc,a=e.args;this.$u=n;var r=a[1];if("string"==typeof r){var o=!0===a[2],i=!0===a[3],l=o||i,s=a[2];i&&(s=a[2]),h=this.$locale(),!o&&s&&(h=f.Ls[s]),this.$d=function(e,t,n){try{if(["x","X"].indexOf(t)>-1)return new Date(("X"===t?1e3:1)*e);var a=b(t)(e),r=a.year,o=a.month,i=a.day,l=a.hours,s=a.minutes,u=a.seconds,d=a.milliseconds,c=a.zone,f=new Date,p=i||(r||o?1:f.getDate()),h=r||f.getFullYear(),m=0;r&&!o||(m=o>0?o-1:f.getMonth());var g=l||0,y=s||0,v=u||0,_=d||0;return c?new Date(Date.UTC(h,m,p,g,y,v,_+60*c.offset*1e3)):n?new Date(Date.UTC(h,m,p,g,y,v,_)):new Date(h,m,p,g,y,v,_)}catch(e){return new Date("")}}(t,r,n),this.init(),s&&!0!==s&&(this.$L=this.locale(s).$L),l&&t!=this.format(r)&&(this.$d=new Date("")),h={}}else if(r instanceof Array)for(var u=r.length,d=1;d<=u;d+=1){a[1]=r[d-1];var c=f.apply(this,a);if(c.isValid()){this.$d=c.$d,this.$L=c.$L,this.init();break}d===u&&(this.$d=new Date(""))}else p.call(this,e)}}}()},function(e,t,n){e.exports=function(){"use strict";return function(e,t,a){a.updateLocale=function(e,t){var n=a.Ls[e];if(n)return(t?Object.keys(t):[]).forEach(function(e){n[e]=t[e]}),n}}}()},function(e,t,n){e.exports=function(e,t,n){function a(e,t,n,a,r){var e=e.name?e:e.$locale(),t=l(e[t]),n=l(e[n]),o=t||n.map(function(e){return e.slice(0,a)});if(!r)return o;var i=e.weekStart;return o.map(function(e,t){return o[(t+(i||0))%7]})}function r(){return n.Ls[n.locale()]}function o(e,t){return e.formats[t]||e.formats[t.toUpperCase()].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,function(e,t,n){return t||n.slice(1)})}var t=t.prototype,l=function(e){return e&&(e.indexOf?e:e.s)};t.localeData=function(){return function(){var t=this;return{months:function(e){return e?e.format("MMMM"):a(t,"months")},monthsShort:function(e){return e?e.format("MMM"):a(t,"monthsShort","months",3)},firstDayOfWeek:function(){return t.$locale().weekStart||0},weekdays:function(e){return e?e.format("dddd"):a(t,"weekdays")},weekdaysMin:function(e){return e?e.format("dd"):a(t,"weekdaysMin","weekdays",2)},weekdaysShort:function(e){return e?e.format("ddd"):a(t,"weekdaysShort","weekdays",3)},longDateFormat:function(e){return o(t.$locale(),e)},meridiem:this.$locale().meridiem,ordinal:this.$locale().ordinal}}.bind(this)()},n.localeData=function(){var t=r();return{firstDayOfWeek:function(){return t.weekStart||0},weekdays:function(){return n.weekdays()},weekdaysShort:function(){return n.weekdaysShort()},weekdaysMin:function(){return n.weekdaysMin()},months:function(){return n.months()},monthsShort:function(){return n.monthsShort()},longDateFormat:function(e){return o(t,e)},meridiem:t.meridiem,ordinal:t.ordinal}},n.months=function(){return a(r(),"months")},n.monthsShort=function(){return a(r(),"monthsShort","months",3)},n.weekdays=function(e){return a(r(),"weekdays",null,null,e)},n.weekdaysShort=function(e){return a(r(),"weekdaysShort","weekdays",3,e)},n.weekdaysMin=function(e){return a(r(),"weekdaysMin","weekdays",2,e)}}},function(e,t,n){e.exports=function(){"use strict";var i="month",l="quarter";return function(e,t){var n=t.prototype;n.quarter=function(e){return this.$utils().u(e)?Math.ceil((this.month()+1)/3):this.month(this.month()%3+3*(e-1))};var a=n.add;n.add=function(e,t){return e=Number(e),this.$utils().p(t)===l?this.add(3*e,i):a.bind(this)(e,t)};var o=n.startOf;n.startOf=function(e,t){var n=this.$utils(),a=!!n.u(t)||t;if(n.p(e)===l){var r=this.quarter()-1;return a?this.month(3*r).startOf(i).startOf("day"):this.month(3*r+2).endOf(i).endOf("day")}return o.bind(this)(e,t)}}}()},function(e,t,n){e.exports=function(){"use strict";return function(e,t,n){var a=t.prototype,o=a.format;n.en.ordinal=function(e){var t=["th","st","nd","rd"],n=e%100;return"["+e+(t[(n-20)%10]||t[n]||t[0])+"]"},a.format=function(e){var t=this,n=this.$locale();if(!this.isValid())return o.bind(this)(e);var a=this.$utils(),r=(e||"YYYY-MM-DDTHH:mm:ssZ").replace(/\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g,function(e){switch(e){case"Q":return Math.ceil((t.$M+1)/3);case"Do":return n.ordinal(t.$D);case"gggg":return t.weekYear();case"GGGG":return t.isoWeekYear();case"wo":return n.ordinal(t.week(),"W");case"w":case"ww":return a.s(t.week(),"w"===e?1:2,"0");case"W":case"WW":return a.s(t.isoWeek(),"W"===e?1:2,"0");case"k":case"kk":return a.s(String(0===t.$H?24:t.$H),"k"===e?1:2,"0");case"X":return Math.floor(t.$d.getTime()/1e3);case"x":return t.$d.getTime();case"z":return"["+t.offsetName()+"]";case"zzz":return"["+t.offsetName("long")+"]";default:return e}});return o.bind(this)(r)}}}()},function(e,t,n){e.exports=function(){"use strict";var l="week",s="year";return function(e,t,i){var n=t.prototype;n.week=function(e){if(void 0===e&&(e=null),null!==e)return this.add(7*(e-this.week()),"day");var t=this.$locale().yearStart||1;if(11===this.month()&&this.date()>25){var n=i(this).startOf(s).add(1,s).date(t),a=i(this).endOf(l);if(n.isBefore(a))return 1}var r=i(this).startOf(s).date(t).startOf(l).subtract(1,"millisecond"),o=this.diff(r,l,!0);return o<0?i(this).startOf("week").week():Math.ceil(o)},n.weeks=function(e){return void 0===e&&(e=null),this.week(e)}}}()},function(e,t,n){e.exports=function(e){"use strict";function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=t(e),a={name:"zh-cn",weekdays:"鏄熸湡鏃鏄熸湡涓�_鏄熸湡浜宊鏄熸湡涓塤鏄熸湡鍥沖鏄熸湡浜擾鏄熸湡鍏�".split("_"),weekdaysShort:"鍛ㄦ棩_鍛ㄤ竴_鍛ㄤ簩_鍛ㄤ笁_鍛ㄥ洓_鍛ㄤ簲_鍛ㄥ叚".split("_"),weekdaysMin:"鏃涓�_浜宊涓塤鍥沖浜擾鍏�".split("_"),months:"涓�鏈坃浜屾湀_涓夋湀_鍥涙湀_浜旀湀_鍏湀_涓冩湀_鍏湀_涔濇湀_鍗佹湀_鍗佷竴鏈坃鍗佷簩鏈�".split("_"),monthsShort:"1鏈坃2鏈坃3鏈坃4鏈坃5鏈坃6鏈坃7鏈坃8鏈坃9鏈坃10鏈坃11鏈坃12鏈�".split("_"),ordinal:function(e,t){return"W"===t?e+"鍛�":e+"鏃�"},weekStart:1,yearStart:4,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY骞碝鏈圖鏃�",LLL:"YYYY骞碝鏈圖鏃h鐐筸m鍒�",LLLL:"YYYY骞碝鏈圖鏃dddAh鐐筸m鍒�",l:"YYYY/M/D",ll:"YYYY骞碝鏈圖鏃�",lll:"YYYY骞碝鏈圖鏃� HH:mm",llll:"YYYY骞碝鏈圖鏃ddd HH:mm"},relativeTime:{future:"%s鍐�",past:"%s鍓�",s:"鍑犵",m:"1 鍒嗛挓",mm:"%d 鍒嗛挓",h:"1 灏忔椂",hh:"%d 灏忔椂",d:"1 澶�",dd:"%d 澶�",M:"1 涓湀",MM:"%d 涓湀",y:"1 骞�",yy:"%d 骞�"},meridiem:function(e,t){var n=100*e+t;return n<600?"鍑屾櫒":n<900?"鏃╀笂":n<1100?"涓婂崍":n<1300?"涓崍":n<1800?"涓嬪崍":"鏅氫笂"}};return n.default.locale(a,null,!0),a}(n(205))},function(e,t,n){"use strict";t.__esModule=!0,t.flex=t.transition=t.animation=void 0;var r=n(201),o=n(96);function a(e){if(!r.hasDOM)return!1;var n=document.createElement("div"),a=!1;return(0,o.each)(e,function(e,t){if(void 0!==n.style[t])return!(a={end:e})}),a}t.animation=a({WebkitAnimation:"webkitAnimationEnd",OAnimation:"oAnimationEnd",animation:"animationend"}),t.transition=a({WebkitTransition:"webkitTransitionEnd",OTransition:"oTransitionEnd",transition:"transitionend"}),t.flex=function(e){if(!r.hasDOM)return!1;var n=document.createElement("div"),a=!1;return(0,o.each)(e,function(e,t){return(0,o.each)(e,function(e){try{n.style[t]=e,a=a||n.style[t]===e}catch(e){}return!a}),!a}),a}({display:["flex","-webkit-flex","-moz-flex","-ms-flexbox"]})},function(e,t,n){"use strict";t.__esModule=!0,t.getFocusNodeList=i,t.saveLastFocusNode=function(){l=document.activeElement},t.clearLastFocusNode=function(){l=null},t.backLastFocusNode=function(){if(l)try{l.focus()}catch(e){}},t.limitTabRange=function(e,t){{var n,a;t.keyCode===r.default.TAB&&(e=i(e),n=e.length-1,-1<(a=e.indexOf(document.activeElement))&&(a=a+(t.shiftKey?-1:1),e[a=n<(a=a<0?n:a)?0:a].focus(),t.preventDefault()))}};var t=n(206),r=(t=t)&&t.__esModule?t:{default:t},a=n(96);function o(e){var t=e.nodeName.toLowerCase(),n=parseInt(e.getAttribute("tabindex"),10),n=!isNaN(n)&&-1<n;return function(e){for(;e;){var t=e.nodeName;if("BODY"===t||"HTML"===t)break;if("none"===e.style.display||"hidden"===e.style.visibility)return;e=e.parentNode}return 1}(e)&&("input"===t?!e.disabled&&"hidden"!==e.type:-1<["select","textarea","button"].indexOf(t)?!e.disabled:"a"===t&&e.getAttribute("href")||n)}function i(e){var n=[],t=e.querySelectorAll("*");return(0,a.each)(t,function(e){var t;o(e)&&(t=e.getAttribute("data-auto-focus")?"unshift":"push",n[t](e))}),o(e)&&n.unshift(e),n}var l=null},function(e,t,n){"use strict";t.__esModule=!0;var n=n(38),a=(n=n)&&n.__esModule?n:{default:n};function r(e){return e?("object"===(void 0===e?"undefined":(0,a.default)(e))?e=JSON.stringify(e):"string"!=typeof e&&(e=String(e)),e.replace(/['"]/gm,"").replace(/[\s'"]/gm,"-")):""}t.randomId=function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:1e6,t=Math.ceil(Math.random()*t);return e?r(e)+"-"+t:t.toString(10)},t.escapeForId=r},function(e,t,n){"use strict";t.__esModule=!0,t.default=function(e){return(e=e||"")+(a++).toString(36)};var a=Date.now();e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var a="accept acceptCharset accessKey action allowFullScreen allowTransparency\nalt async autoComplete autoFocus autoPlay capture cellPadding cellSpacing challenge\ncharSet checked classID className colSpan cols content contentEditable contextMenu\ncontrols coords crossOrigin data dateTime default defer dir disabled download draggable\nencType form formAction formEncType formMethod formNoValidate formTarget frameBorder\nheaders height hidden high href hrefLang htmlFor httpEquiv icon id inputMode integrity\nis keyParams keyType kind label lang list loop low manifest marginHeight marginWidth max maxLength media\nmediaGroup method min minLength multiple muted name noValidate nonce open\noptimum pattern placeholder poster preload radioGroup readOnly rel required\nreversed role rowSpan rows sandbox scope scoped scrolling seamless selected\nshape size sizes span spellCheck src srcDoc srcLang srcSet start step style\nsummary tabIndex target title type useMap value width wmode wrap".replace(/\s+/g," ").replace(/\t|\n|\r/g,"").split(" "),r="onCopy onCut onPaste onCompositionEnd onCompositionStart onCompositionUpdate onKeyDown\n    onKeyPress onKeyUp onFocus onBlur onChange onInput onSubmit onClick onContextMenu onDoubleClick\n    onDrag onDragEnd onDragEnter onDragExit onDragLeave onDragOver onDragStart onDrop onMouseDown\n    onMouseEnter onMouseLeave onMouseMove onMouseOut onMouseOver onMouseUp onSelect onTouchCancel\n    onTouchEnd onTouchMove onTouchStart onScroll onWheel onAbort onCanPlay onCanPlayThrough\n    onDurationChange onEmptied onEncrypted onEnded onError onLoadedData onLoadedMetadata\n    onLoadStart onPause onPlay onPlaying onProgress onRateChange onSeeked onSeeking onStalled onSuspend onTimeUpdate onVolumeChange onWaiting onLoad onError".replace(/\s+/g," ").replace(/\t|\n|\r/g,"").split(" "),o=["data-","aria-"];t.default=function(e){var t,n={};for(t in e)!function(t){(-1<a.indexOf(t)||-1<r.indexOf(t)||o.map(function(e){return new RegExp("^"+e)}).some(function(e){return t.replace(e,"")!==t}))&&(n[t]=e[t])}(t);return n},e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var w=s(n(12)),r=s(n(4)),o=s(n(6)),i=s(n(7)),M=s(n(2));t.initLocales=function(e){(d=e)&&(L=e[c],"boolean"!=typeof T&&(T=L&&L.rtl))},t.setLanguage=function(e){d&&(L=d[c=e],"boolean"!=typeof T&&(T=L&&L.rtl))},t.setLocale=function(e){L=(0,M.default)({},d?d[c]:{},e),"boolean"!=typeof T&&(T=L&&L.rtl)},t.setDirection=function(e){T="rtl"===e},t.getLocale=function(){return L},t.getLanguage=function(){return c},t.getDirection=function(){return T},t.config=function(_){var e,b=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{};S.obj.isClassComponent(_)&&void 0===_.prototype.shouldComponentUpdate&&(_.prototype.shouldComponentUpdate=function(e,t){return!this.props.pure||(!u(this.props,e)||!u(this.state,t))});e=t=function(n){function a(e,t){(0,r.default)(this,a);e=(0,o.default)(this,n.call(this,e,t));return e._getInstance=e._getInstance.bind(e),e._deprecated=e._deprecated.bind(e),e}return(0,i.default)(a,n),a.prototype._getInstance=function(e){var n=this;this._instance=e,this._instance&&b.exportNames&&b.exportNames.forEach(function(e){var t=n._instance[e];n[e]="function"==typeof t?t.bind(n._instance):t})},a.prototype._deprecated=function(){!1!==this.context.nextWarning&&S.log.deprecated.apply(S.log,arguments)},a.prototype.getInstance=function(){return this._instance},a.prototype.render=function(){var e=this.props,t=e.prefix,n=e.locale,a=e.defaultPropsConfig,r=e.pure,o=e.rtl,i=e.device,l=e.popupContainer,s=e.errorBoundary,e=(0,w.default)(e,["prefix","locale","defaultPropsConfig","pure","rtl","device","popupContainer","errorBoundary"]),u=this.context,d=u.nextPrefix,c=u.nextLocale,f=u.nextDefaultPropsConfig,f=void 0===f?{}:f,p=u.nextPure,h=u.nextRtl,m=u.nextDevice,g=u.nextPopupContainer,u=u.nextErrorBoundary,y=b.componentName||C(_),v=(0,E.default)({prefix:t,locale:n,defaultPropsConfig:a,pure:r,device:i,popupContainer:l,rtl:o,errorBoundary:s},{nextPrefix:d,nextLocale:(0,M.default)({},L,void 0===c?{}:c),nextDefaultPropsConfig:f,nextPure:p,nextDevice:m,nextPopupContainer:g,nextRtl:"boolean"==typeof h?h:!0===T||void 0,nextErrorBoundary:u},y),t=["prefix","locale","pure","rtl","device","popupContainer"].reduce(function(e,t){return void 0!==v[t]&&(e[t]=v[t]),e},{}),n=("pure"in t&&t.pure&&S.log.warning("pure of ConfigProvider is deprecated, use Function Component or React.PureComponent"),"popupContainer"in t&&void 0===this.props.container&&-1<["Overlay","Popup"].indexOf(y)&&(t.container=t.popupContainer,delete t.popupContainer),b.transform?b.transform(e,this._deprecated):e),a=k.default.createElement(_,(0,M.default)({},v.defaultPropsConfig[y],n,t,{ref:S.obj.isClassComponent(_)?this._getInstance:null})),r=v.errorBoundary,i=r.open,l=(0,w.default)(r,["open"]);return i?k.default.createElement(x.default,l,a):a},a}(k.default.Component),t.propTypes=(0,M.default)({},_.propTypes||{},{prefix:a.default.string,locale:a.default.object,defaultPropsConfig:a.default.object,pure:a.default.bool,rtl:a.default.bool,device:a.default.oneOf(["tablet","desktop","phone"]),popupContainer:a.default.any,errorBoundary:a.default.oneOfType([a.default.bool,a.default.object])}),t.contextTypes=(0,M.default)({},_.contextTypes||{},{nextPrefix:a.default.string,nextLocale:a.default.object,nextDefaultPropsConfig:a.default.object,nextPure:a.default.bool,nextRtl:a.default.bool,nextWarning:a.default.bool,nextDevice:a.default.oneOf(["tablet","desktop","phone"]),nextPopupContainer:a.default.any,nextErrorBoundary:a.default.oneOfType([a.default.bool,a.default.object])});var t=e;return t.displayName="ConfigedComponent",t.displayName="Config("+C(_)+")",(0,l.default)(t,_),t};var k=s(n(0)),a=s(n(3)),l=s(n(100)),S=n(11),E=s(n(200)),x=s(n(207));function s(e){return e&&e.__esModule?e:{default:e}}var u=S.obj.shallowEqual;function C(e){return e.displayName||e.name||"Component"}var d=void 0,c="zh-cn",L={},T=void 0},function(e,t,n){"use strict";t.__esModule=!0;var n=n(3),n=(n=n)&&n.__esModule?n:{default:n};function a(e,t){return"function"==typeof(e=e.children)?e(r(t,o)):null}var r=function(e,t){var n,a,r={};for(n in e)Object.prototype.hasOwnProperty.call(e,n)&&(r[t(n,a=e[n])]=a);return r},o=function(e){return e.replace(/^(next)([A-Z])/,function(e,t,n){return n.toLowerCase()})};a.propTypes={children:n.default.func},a.contextTypes={nextPrefix:n.default.string,nextLocale:n.default.object,nextPure:n.default.bool,newRtl:n.default.bool,nextWarning:n.default.bool,nextDevice:n.default.oneOf(["tablet","desktop","phone"]),nextPopupContainer:n.default.any},t.default=a,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var n=n(4),a=(n=n)&&n.__esModule?n:{default:n};function r(){(0,a.default)(this,r),this._root=null,this._store=new Map}r.prototype.empty=function(){return 0===this._store.size},r.prototype.has=function(e){return this._store.has(e)},r.prototype.get=function(e,t){e=this.has(e)?this._store.get(e):this.root();return null==e?t:e},r.prototype.add=function(e,t){this.empty()&&(this._root=e),this._store.set(e,t)},r.prototype.update=function(e,t){this.has(e)&&this._store.set(e,t)},r.prototype.remove=function(e){this._store.delete(e),e===this._root&&(e=this._store.keys().next().value,this._root=e)},r.prototype.clear=function(){this._store.clear()},r.prototype.root=function(){return this._store.get(this._root)},t.default=r,e.exports=t.default},function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},function(e,t,n){var a={"./af":208,"./af.js":208,"./ar":209,"./ar-dz":210,"./ar-dz.js":210,"./ar-kw":211,"./ar-kw.js":211,"./ar-ly":212,"./ar-ly.js":212,"./ar-ma":213,"./ar-ma.js":213,"./ar-sa":214,"./ar-sa.js":214,"./ar-tn":215,"./ar-tn.js":215,"./ar.js":209,"./az":216,"./az.js":216,"./be":217,"./be.js":217,"./bg":218,"./bg.js":218,"./bm":219,"./bm.js":219,"./bn":220,"./bn-bd":221,"./bn-bd.js":221,"./bn.js":220,"./bo":222,"./bo.js":222,"./br":223,"./br.js":223,"./bs":224,"./bs.js":224,"./ca":225,"./ca.js":225,"./cs":226,"./cs.js":226,"./cv":227,"./cv.js":227,"./cy":228,"./cy.js":228,"./da":229,"./da.js":229,"./de":230,"./de-at":231,"./de-at.js":231,"./de-ch":232,"./de-ch.js":232,"./de.js":230,"./dv":233,"./dv.js":233,"./el":234,"./el.js":234,"./en-au":235,"./en-au.js":235,"./en-ca":236,"./en-ca.js":236,"./en-gb":237,"./en-gb.js":237,"./en-ie":238,"./en-ie.js":238,"./en-il":239,"./en-il.js":239,"./en-in":240,"./en-in.js":240,"./en-nz":241,"./en-nz.js":241,"./en-sg":242,"./en-sg.js":242,"./eo":243,"./eo.js":243,"./es":244,"./es-do":245,"./es-do.js":245,"./es-mx":246,"./es-mx.js":246,"./es-us":247,"./es-us.js":247,"./es.js":244,"./et":248,"./et.js":248,"./eu":249,"./eu.js":249,"./fa":250,"./fa.js":250,"./fi":251,"./fi.js":251,"./fil":252,"./fil.js":252,"./fo":253,"./fo.js":253,"./fr":254,"./fr-ca":255,"./fr-ca.js":255,"./fr-ch":256,"./fr-ch.js":256,"./fr.js":254,"./fy":257,"./fy.js":257,"./ga":258,"./ga.js":258,"./gd":259,"./gd.js":259,"./gl":260,"./gl.js":260,"./gom-deva":261,"./gom-deva.js":261,"./gom-latn":262,"./gom-latn.js":262,"./gu":263,"./gu.js":263,"./he":264,"./he.js":264,"./hi":265,"./hi.js":265,"./hr":266,"./hr.js":266,"./hu":267,"./hu.js":267,"./hy-am":268,"./hy-am.js":268,"./id":269,"./id.js":269,"./is":270,"./is.js":270,"./it":271,"./it-ch":272,"./it-ch.js":272,"./it.js":271,"./ja":273,"./ja.js":273,"./jv":274,"./jv.js":274,"./ka":275,"./ka.js":275,"./kk":276,"./kk.js":276,"./km":277,"./km.js":277,"./kn":278,"./kn.js":278,"./ko":279,"./ko.js":279,"./ku":280,"./ku.js":280,"./ky":281,"./ky.js":281,"./lb":282,"./lb.js":282,"./lo":283,"./lo.js":283,"./lt":284,"./lt.js":284,"./lv":285,"./lv.js":285,"./me":286,"./me.js":286,"./mi":287,"./mi.js":287,"./mk":288,"./mk.js":288,"./ml":289,"./ml.js":289,"./mn":290,"./mn.js":290,"./mr":291,"./mr.js":291,"./ms":292,"./ms-my":293,"./ms-my.js":293,"./ms.js":292,"./mt":294,"./mt.js":294,"./my":295,"./my.js":295,"./nb":296,"./nb.js":296,"./ne":297,"./ne.js":297,"./nl":298,"./nl-be":299,"./nl-be.js":299,"./nl.js":298,"./nn":300,"./nn.js":300,"./oc-lnc":301,"./oc-lnc.js":301,"./pa-in":302,"./pa-in.js":302,"./pl":303,"./pl.js":303,"./pt":304,"./pt-br":305,"./pt-br.js":305,"./pt.js":304,"./ro":306,"./ro.js":306,"./ru":307,"./ru.js":307,"./sd":308,"./sd.js":308,"./se":309,"./se.js":309,"./si":310,"./si.js":310,"./sk":311,"./sk.js":311,"./sl":312,"./sl.js":312,"./sq":313,"./sq.js":313,"./sr":314,"./sr-cyrl":315,"./sr-cyrl.js":315,"./sr.js":314,"./ss":316,"./ss.js":316,"./sv":317,"./sv.js":317,"./sw":318,"./sw.js":318,"./ta":319,"./ta.js":319,"./te":320,"./te.js":320,"./tet":321,"./tet.js":321,"./tg":322,"./tg.js":322,"./th":323,"./th.js":323,"./tk":324,"./tk.js":324,"./tl-ph":325,"./tl-ph.js":325,"./tlh":326,"./tlh.js":326,"./tr":327,"./tr.js":327,"./tzl":328,"./tzl.js":328,"./tzm":329,"./tzm-latn":330,"./tzm-latn.js":330,"./tzm.js":329,"./ug-cn":331,"./ug-cn.js":331,"./uk":332,"./uk.js":332,"./ur":333,"./ur.js":333,"./uz":334,"./uz-latn":335,"./uz-latn.js":335,"./uz.js":334,"./vi":336,"./vi.js":336,"./x-pseudo":337,"./x-pseudo.js":337,"./yo":338,"./yo.js":338,"./zh-cn":339,"./zh-cn.js":339,"./zh-hk":340,"./zh-hk.js":340,"./zh-mo":341,"./zh-mo.js":341,"./zh-tw":342,"./zh-tw.js":342};function r(e){e=o(e);return n(e)}function o(e){if(n.o(a,e))return a[e];throw(e=new Error("Cannot find module '"+e+"'")).code="MODULE_NOT_FOUND",e}r.keys=function(){return Object.keys(a)},r.resolve=o,(e.exports=r).id=517},function(e,t,n){"use strict";t.__esModule=!0;var u=r(n(2)),d=r(n(12));t.default=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},t=e.scriptUrl,e=e.extraCommonProps,s=void 0===e?{}:e,e=o.has(t);document.querySelector('script[data-namespace="'+t+'"]')&&(e=!0);"undefined"!=typeof document&&"undefined"!=typeof window&&"function"==typeof document.createElement&&"string"==typeof t&&t.length&&!e&&((e=document.createElement("script")).setAttribute("src",t),e.setAttribute("data-namespace",t),o.add(t),document.body.appendChild(e));function n(e){var t=e.type,n=e.size,a=e.children,r=e.className,o=void 0===(o=e.prefix)?"next-":o,i=(0,d.default)(e,["type","size","children","className","prefix"]),l=null,t=(e.type&&(l=c.default.createElement("use",{xlinkHref:"#"+t})),a&&(l=a),(0,f.default)(((e={})[o+"icon-remote"]=!0,e),r));return c.default.createElement(p,{size:n},c.default.createElement("svg",(0,u.default)({className:t,focusable:!1},i,s),l))}return n.displayName="Iconfont",a.default.config(n)};var c=r(n(0)),f=r(n(13)),a=r(n(8)),n=r(n(343));function r(e){return e&&e.__esModule?e:{default:e}}var o=new Set,p=a.default.config(n.default);e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;!function(e){{if(e&&e.__esModule)return;var t,n={};if(null!=e)for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&((t=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,a):{}).get||t.set?Object.defineProperty(n,a,t):n[a]=e[a]);n.default=e}}(n(3));var a=l(n(520)),r=l(n(522)),o=l(n(0)),i=l(n(345));n(346);function l(e){return e&&e.__esModule?e:{default:e}}function s(){return(s=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n,a=arguments[t];for(n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n])}return e}).apply(this,arguments)}function u(t,e){t&&e&&e.split(" ").forEach(function(e){return(0,a.default)(t,e)})}function d(t,e){t&&e&&e.split(" ").forEach(function(e){return(0,r.default)(t,e)})}n=function(a){var e;function t(){for(var r,e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return(r=a.call.apply(a,[this].concat(t))||this).onEnter=function(e,t){var n=r.getClassNames(t?"appear":"enter").className;r.removeClasses(e,"exit"),u(e,n),r.props.onEnter&&r.props.onEnter(e,t)},r.onEntering=function(e,t){var n=r.getClassNames(t?"appear":"enter").activeClassName;r.reflowAndAddClass(e,n),r.props.onEntering&&r.props.onEntering(e,t)},r.onEntered=function(e,t){var n=r.getClassNames("appear").doneClassName,a=r.getClassNames("enter").doneClassName,n=t?n+" "+a:a;r.removeClasses(e,t?"appear":"enter"),u(e,n),r.props.onEntered&&r.props.onEntered(e,t)},r.onExit=function(e){var t=r.getClassNames("exit").className;r.removeClasses(e,"appear"),r.removeClasses(e,"enter"),u(e,t),r.props.onExit&&r.props.onExit(e)},r.onExiting=function(e){var t=r.getClassNames("exit").activeClassName;r.reflowAndAddClass(e,t),r.props.onExiting&&r.props.onExiting(e)},r.onExited=function(e){var t=r.getClassNames("exit").doneClassName;r.removeClasses(e,"exit"),u(e,t),r.props.onExited&&r.props.onExited(e)},r.getClassNames=function(e){var t=r.props.classNames,n="string"==typeof t,a=n?(n&&t?t+"-":"")+e:t[e];return{className:a,activeClassName:n?a+"-active":t[e+"Active"],doneClassName:n?a+"-done":t[e+"Done"]}},r}e=a,(n=t).prototype=Object.create(e.prototype),(n.prototype.constructor=n).__proto__=e;var n=t.prototype;return n.removeClasses=function(e,t){var t=this.getClassNames(t),n=t.className,a=t.activeClassName,t=t.doneClassName;n&&d(e,n),a&&d(e,a),t&&d(e,t)},n.reflowAndAddClass=function(e,t){t&&(e&&e.scrollTop,u(e,t))},n.render=function(){var e=s({},this.props);return delete e.classNames,o.default.createElement(i.default,s({},e,{onEnter:this.onEnter,onEntered:this.onEntered,onEntering:this.onEntering,onExit:this.onExit,onExiting:this.onExiting,onExited:this.onExited}))},t}(o.default.Component);n.defaultProps={classNames:""},n.propTypes={},t.default=n,e.exports=t.default},function(e,t,n){"use strict";var a=n(86),r=(t.__esModule=!0,t.default=function(e,t){e.classList?e.classList.add(t):(0,r.default)(e,t)||("string"==typeof e.className?e.className=e.className+" "+t:e.setAttribute("class",(e.className&&e.className.baseVal||"")+" "+t))},a(n(521)));e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=function(e,t){return e.classList?!!t&&e.classList.contains(t):-1!==(" "+(e.className.baseVal||e.className)+" ").indexOf(" "+t+" ")},e.exports=t.default},function(e,t,n){"use strict";function a(e,t){return e.replace(new RegExp("(^|\\s)"+t+"(?:\\s|$)","g"),"$1").replace(/\s+/g," ").replace(/^\s*|\s*$/g,"")}e.exports=function(e,t){e.classList?e.classList.remove(t):"string"==typeof e.className?e.className=a(e.className,t):e.setAttribute("class",a(e.className&&e.className.baseVal||"",t))}},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;a(n(3));var o=a(n(0)),i=n(23),l=a(n(347));function a(e){return e&&e.__esModule?e:{default:e}}n=function(r){var e;function t(){for(var a,e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return(a=r.call.apply(r,[this].concat(t))||this).handleEnter=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return a.handleLifecycle("onEnter",0,t)},a.handleEntering=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return a.handleLifecycle("onEntering",0,t)},a.handleEntered=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return a.handleLifecycle("onEntered",0,t)},a.handleExit=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return a.handleLifecycle("onExit",1,t)},a.handleExiting=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return a.handleLifecycle("onExiting",1,t)},a.handleExited=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return a.handleLifecycle("onExited",1,t)},a}e=r,(n=t).prototype=Object.create(e.prototype),(n.prototype.constructor=n).__proto__=e;var n=t.prototype;return n.handleLifecycle=function(e,t,n){var a=this.props.children,a=o.default.Children.toArray(a)[t];a.props[e]&&(t=a.props)[e].apply(t,n),this.props[e]&&this.props[e]((0,i.findDOMNode)(this))},n.render=function(){var e=this.props,t=e.children,n=e.in,e=function(e,t){if(null==e)return{};for(var n,a={},r=Object.keys(e),o=0;o<r.length;o++)n=r[o],0<=t.indexOf(n)||(a[n]=e[n]);return a}(e,["children","in"]),t=o.default.Children.toArray(t),a=t[0],t=t[1];return delete e.onEnter,delete e.onEntering,delete e.onEntered,delete e.onExit,delete e.onExiting,delete e.onExited,o.default.createElement(l.default,e,n?o.default.cloneElement(a,{key:"first",onEnter:this.handleEnter,onEntering:this.handleEntering,onEntered:this.handleEntered}):o.default.cloneElement(t,{key:"second",onEnter:this.handleExit,onEntering:this.handleExiting,onEntered:this.handleExited}))},t}(o.default.Component);n.propTypes={},t.default=n,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.getChildMapping=a,t.mergeChildMappings=r,t.getInitialChildMapping=function(t,n){return a(t.children,function(e){return(0,c.cloneElement)(e,{onExited:n.bind(null,e),in:!0,appear:f(e,"appear",t),enter:f(e,"enter",t),exit:f(e,"exit",t)})})},t.getNextChildMapping=function(i,l,s){var u=a(i.children),d=r(l,u);return Object.keys(d).forEach(function(e){var t,n,a,r,o=d[e];(0,c.isValidElement)(o)&&(t=e in l,n=e in u,a=l[e],r=(0,c.isValidElement)(a)&&!a.props.in,!n||t&&!r?n||!t||r?n&&t&&(0,c.isValidElement)(a)&&(d[e]=(0,c.cloneElement)(o,{onExited:s.bind(null,o),in:a.props.in,exit:f(o,"exit",i),enter:f(o,"enter",i)})):d[e]=(0,c.cloneElement)(o,{in:!1}):d[e]=(0,c.cloneElement)(o,{onExited:s.bind(null,o),in:!0,exit:f(o,"exit",i),enter:f(o,"enter",i)}))}),d};var c=n(0);function a(e,t){var n=Object.create(null);return e&&c.Children.map(e,function(e){return e}).forEach(function(e){n[e.key]=(e=e,t&&(0,c.isValidElement)(e)?t(e):e)}),n}function r(t,n){function e(e){return(e in n?n:t)[e]}t=t||{},n=n||{};var a,r,o=Object.create(null),i=[];for(a in t)a in n?i.length&&(o[a]=i,i=[]):i.push(a);var l,s={};for(l in n){if(o[l])for(r=0;r<o[l].length;r++){var u=o[l][r];s[o[l][r]]=e(u)}s[l]=e(l)}for(r=0;r<i.length;r++)s[i[r]]=e(i[r]);return s}function f(e,t,n){return(null!=n[t]?n:e.props)[t]}},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var a=p(n(2)),r=p(n(12)),o=p(n(4)),i=p(n(6)),l=p(n(7)),s=n(0),u=p(s),d=p(n(3)),c=n(157),f=n(11);function p(e){return e&&e.__esModule?e:{default:e}}function h(){}var m=f.events.on,g=f.events.off,y=f.dom.addClass,v=f.dom.removeClass,_=["-webkit-","-moz-","-o-","ms-",""];function b(e,t){for(var n=window.getComputedStyle(e),a="",r=0;r<_.length&&!(a=n.getPropertyValue(_[r]+t));r++);return a}w=s.Component,(0,l.default)(M,w),M.prototype.componentWillUnmount=function(){var n=this;Object.keys(this.endListeners).forEach(function(t){n.endListeners[t].forEach(function(e){g(n.node,t,e)})}),this.endListeners={transitionend:[],animationend:[]}},M.prototype.generateEndListener=function(a,r,o,i){var l=this;return function e(t){var n;t&&t.target===a&&(l.timeoutMap[i]&&(clearTimeout(l.timeoutMap[i]),delete l.timeoutMap[i]),r(),g(a,o,e),-1<(n=(t=l.endListeners[o]).indexOf(e))&&t.splice(n,1))}},M.prototype.addEndListener=function(r,o){var i,e,l=this;f.support.transition||f.support.animation?(i=(0,f.guid)(),this.node=r,f.support.transition&&(e=this.generateEndListener(r,o,"transitionend",i),m(r,"transitionend",e),this.endListeners.transitionend.push(e)),f.support.animation&&(e=this.generateEndListener(r,o,"animationend",i),m(r,"animationend",e),this.endListeners.animationend.push(e)),setTimeout(function(){var e=parseFloat(b(r,"transition-delay"))||0,t=parseFloat(b(r,"transition-duration"))||0,n=parseFloat(b(r,"animation-delay"))||0,a=parseFloat(b(r,"animation-duration"))||0,t=Math.max(t+e,a+n);t&&(l.timeoutMap[i]=setTimeout(function(){o()},1e3*t+200))},15)):o()},M.prototype.removeEndtListener=function(){this.transitionOff&&this.transitionOff(),this.animationOff&&this.animationOff()},M.prototype.removeClassNames=function(t,n){Object.keys(n).forEach(function(e){v(t,n[e])})},M.prototype.handleEnter=function(e,t){var n=this.props.names;n&&(this.removeClassNames(e,n),y(e,n[t?"appear":"enter"])),(t?this.props.onAppear:this.props.onEnter)(e)},M.prototype.handleEntering=function(t,n){var a=this;setTimeout(function(){var e=a.props.names;e&&y(t,e[n?"appearActive":"enterActive"]),(n?a.props.onAppearing:a.props.onEntering)(t)},10)},M.prototype.handleEntered=function(t,e){var n=this.props.names;n&&(e?[n.appear,n.appearActive]:[n.enter,n.enterActive]).forEach(function(e){v(t,e)}),(e?this.props.onAppeared:this.props.onEntered)(t)},M.prototype.handleExit=function(e){var t=this.props.names;t&&(this.removeClassNames(e,t),y(e,t.leave)),this.props.onExit(e)},M.prototype.handleExiting=function(t){var n=this;setTimeout(function(){var e=n.props.names;e&&y(t,e.leaveActive),n.props.onExiting(t)},10)},M.prototype.handleExited=function(t){var e=this.props.names;e&&[e.leave,e.leaveActive].forEach(function(e){v(t,e)}),this.props.onExited(t)},M.prototype.render=function(){var e=this.props,e=(e.names,e.onAppear,e.onAppeared,e.onAppearing,e.onEnter,e.onEntering,e.onEntered,e.onExit,e.onExiting,e.onExited,(0,r.default)(e,["names","onAppear","onAppeared","onAppearing","onEnter","onEntering","onEntered","onExit","onExiting","onExited"]));return u.default.createElement(c.Transition,(0,a.default)({},e,{onEnter:this.handleEnter,onEntering:this.handleEntering,onEntered:this.handleEntered,onExit:this.handleExit,onExiting:this.handleExiting,onExited:this.handleExited,addEndListener:this.addEndListener}))},s=n=M,n.propTypes={names:d.default.oneOfType([d.default.string,d.default.object]),onAppear:d.default.func,onAppearing:d.default.func,onAppeared:d.default.func,onEnter:d.default.func,onEntering:d.default.func,onEntered:d.default.func,onExit:d.default.func,onExiting:d.default.func,onExited:d.default.func},n.defaultProps={onAppear:h,onAppearing:h,onAppeared:h,onEnter:h,onEntering:h,onEntered:h,onExit:h,onExiting:h,onExited:h};var w,l=s;function M(e){(0,o.default)(this,M);e=(0,i.default)(this,w.call(this,e));return f.func.bindCtx(e,["handleEnter","handleEntering","handleEntered","handleExit","handleExiting","handleExited","addEndListener"]),e.endListeners={transitionend:[],animationend:[]},e.timeoutMap={},e}l.displayName="AnimateChild",t.default=l,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var a=p(n(2)),r=p(n(12)),o=p(n(4)),i=p(n(6)),l=p(n(7)),s=n(0),u=p(s),d=p(n(3)),c=n(11),f=p(n(344));function p(e){return e&&e.__esModule?e:{default:e}}function h(){}var m,g=c.dom.getStyle,l=(m=s.Component,(0,l.default)(y,m),y.prototype.beforeEnter=function(e){this.leaving&&this.afterLeave(e),this.cacheCurrentStyle(e),this.cacheComputedStyle(e),this.setCurrentStyleToZero(e),this.props.beforeEnter(e)},y.prototype.onEnter=function(e){this.setCurrentStyleToComputedStyle(e),this.props.onEnter(e)},y.prototype.afterEnter=function(e){this.restoreCurrentStyle(e),this.props.afterEnter(e)},y.prototype.beforeLeave=function(e){this.leaving=!0,this.cacheCurrentStyle(e),this.cacheComputedStyle(e),this.setCurrentStyleToComputedStyle(e),this.props.beforeLeave(e)},y.prototype.onLeave=function(e){this.setCurrentStyleToZero(e),this.props.onLeave(e)},y.prototype.afterLeave=function(e){this.leaving=!1,this.restoreCurrentStyle(e),this.props.afterLeave(e)},y.prototype.cacheCurrentStyle=function(e){this.styleBorderTopWidth=e.style.borderTopWidth,this.stylePaddingTop=e.style.paddingTop,this.styleHeight=e.style.height,this.stylePaddingBottom=e.style.paddingBottom,this.styleBorderBottomWidth=e.style.borderBottomWidth},y.prototype.cacheComputedStyle=function(e){this.borderTopWidth=g(e,"borderTopWidth"),this.paddingTop=g(e,"paddingTop"),this.height=e.offsetHeight,this.paddingBottom=g(e,"paddingBottom"),this.borderBottomWidth=g(e,"borderBottomWidth")},y.prototype.setCurrentStyleToZero=function(e){e.style.borderTopWidth="0px",e.style.paddingTop="0px",e.style.height="0px",e.style.paddingBottom="0px",e.style.borderBottomWidth="0px"},y.prototype.setCurrentStyleToComputedStyle=function(e){e.style.borderTopWidth=this.borderTopWidth+"px",e.style.paddingTop=this.paddingTop+"px",e.style.height=this.height+"px",e.style.paddingBottom=this.paddingBottom+"px",e.style.borderBottomWidth=this.borderBottomWidth+"px"},y.prototype.restoreCurrentStyle=function(e){e.style.borderTopWidth=this.styleBorderTopWidth,e.style.paddingTop=this.stylePaddingTop,e.style.height=this.styleHeight,e.style.paddingBottom=this.stylePaddingBottom,e.style.borderBottomWidth=this.styleBorderBottomWidth},y.prototype.render=function(){var e=this.props,t=e.animation,e=(0,r.default)(e,["animation"]);return u.default.createElement(f.default,(0,a.default)({},e,{animation:t||"expand",beforeEnter:this.beforeEnter,onEnter:this.onEnter,afterEnter:this.afterEnter,beforeLeave:this.beforeLeave,onLeave:this.onLeave,afterLeave:this.afterLeave}))},s=n=y,n.propTypes={animation:d.default.oneOfType([d.default.string,d.default.object]),beforeEnter:d.default.func,onEnter:d.default.func,afterEnter:d.default.func,beforeLeave:d.default.func,onLeave:d.default.func,afterLeave:d.default.func},n.defaultProps={beforeEnter:h,onEnter:h,afterEnter:h,beforeLeave:h,onLeave:h,afterLeave:h},s);function y(e){(0,o.default)(this,y);e=(0,i.default)(this,m.call(this,e));return c.func.bindCtx(e,["beforeEnter","onEnter","afterEnter","beforeLeave","onLeave","afterLeave"]),e}l.displayName="Expand",t.default=l,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var b=a(n(2)),w=a(n(12)),M=a(n(0)),k=n(157),S=a(n(13));function a(e){return e&&e.__esModule?e:{default:e}}t.default=function(t){var e=t.animation,n=t.visible,a=t.children,r=t.timeout,r=void 0===r?300:r,o=t.style,i=t.mountOnEnter,l=t.unmountOnExit,s=t.appear,u=t.enter,d=t.exit,c=t.onEnter,f=t.onEntering,p=t.onEntered,h=t.onExit,m=t.onExiting,g=t.onExited,y=(0,w.default)(t,["animation","visible","children","timeout","style","mountOnEnter","unmountOnExit","appear","enter","exit","onEnter","onEntering","onEntered","onExit","onExiting","onExited"]),v={mountOnEnter:i,unmountOnExit:l,appear:s,enter:u,exit:d,onEnter:c,onEntering:f,onEntered:p,onExit:h,onExiting:m,onExited:g},i=(Object.keys(v).forEach(function(e){e in t&&void 0!==t[e]||delete v[e]}),"string"==typeof e?{in:e,out:e}:e),_=e?{entering:i.in,exiting:i.out}:{};return!1===e&&(_.entering="",_.exiting=""),M.default.createElement(k.Transition,(0,b.default)({},v,{in:n,timeout:e?r:0,appear:!0}),function(e){var e=(0,S.default)(((t={})[a.props.className]=!!a.props.className,t[_[e]]=e in _&&_[e],t)),t=(0,b.default)({},y,{className:e});return o&&a.props&&a.props.style&&(t.style=(0,b.default)({},a.props.style,o)),M.default.cloneElement(a,t)})},e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.withContext=void 0;var a,h=c(n(2)),m=c(n(12)),o=c(n(4)),i=c(n(6)),r=c(n(7)),g=c(n(0)),s=c(n(23)),l=c(n(3)),y=c(n(62)),u=c(n(8)),d=n(11),v=c(n(156));function c(e){return e&&e.__esModule?e:{default:e}}var f,n=u.default.config,p=void 0,_={},l=(f=g.default.Component,(0,r.default)(b,f),b.prototype.componentWillUnmount=function(){var e,t=this.props.timeoutId;t in _&&(e=_[t],clearTimeout(e),delete _[t])},b.prototype.render=function(){var e=this.props,t=e.prefix,n=e.type,a=e.title,r=e.content,o=e.align,i=e.offset,l=e.hasMask,s=e.afterClose,u=e.animation,d=e.overlayProps,c=(e.timeoutId,e.className),f=e.style,e=(0,m.default)(e,["prefix","type","title","content","align","offset","hasMask","afterClose","animation","overlayProps","timeoutId","className","style"]),p=this.state.visible;return g.default.createElement(y.default,(0,h.default)({},d,{prefix:t,animation:u,visible:p,align:o,offset:i,hasMask:l,afterClose:s}),g.default.createElement(v.default,(0,h.default)({},e,{prefix:t,visible:!0,type:n,shape:"toast",title:a,style:f,className:t+"message-wrapper "+c,onClose:this.handleClose}),r))},a=r=b,r.contextTypes={prefix:l.default.string},r.propTypes={prefix:l.default.string,type:l.default.string,title:l.default.node,content:l.default.node,align:l.default.string,offset:l.default.array,hasMask:l.default.bool,afterClose:l.default.func,animation:l.default.oneOfType([l.default.object,l.default.bool]),overlayProps:l.default.object,onClose:l.default.func,timeoutId:l.default.string,style:l.default.object,className:l.default.string},r.defaultProps={prefix:"next-",align:"tc tc",offset:[0,30],hasMask:!1,animation:{in:"pulse",out:"zoomOut"},style:{},className:""},a);function b(){var e,t;(0,o.default)(this,b);for(var n=arguments.length,a=Array(n),r=0;r<n;r++)a[r]=arguments[r];return(e=t=(0,i.default)(this,f.call.apply(f,[this].concat(a)))).state={visible:!0},t.handleClose=function(){var e=0<arguments.length&&void 0!==arguments[0]&&arguments[0];t.setState({visible:!1}),e||t.props.onClose&&t.props.onClose()},(0,i.default)(t,e)}l.displayName="Mask";var w=n(l),M=function(e){e.duration;function t(){var e=o&&o.getInstance();e&&e.handleClose(!0),l=!0}var n=e.afterClose,a=e.contextConfig,e=(0,m.default)(e,["duration","afterClose","contextConfig"]),r=document.createElement("div"),a=(document.body.appendChild(r),(a=a)||u.default.getContext()),o=void 0,i=void 0,l=!1;return s.default.render(g.default.createElement(u.default,a,g.default.createElement(w,(0,h.default)({afterClose:function(){s.default.unmountComponentAtNode(r),document.body.removeChild(r),n&&n()}},e,{ref:function(e){i=e}}))),r,function(){(o=i)&&l&&t()}),{component:o,destroy:t}};function k(e,t){S(),t=t,n={},"string"==typeof(a=e)||g.default.isValidElement(a)?n.title=a:"[object Object]"==={}.toString.call(a)&&(n=(0,h.default)({},a)),"number"!=typeof n.duration&&(n.duration=3e3),t&&(n.type=t),e=n;var n,a=(0,d.guid)();p=M((0,h.default)({},e,{timeoutId:a})),0<e.duration&&(t=setTimeout(S,e.duration),_[a]=t)}function S(){p&&(p.destroy(),p=null)}function E(e){k(e)}function x(){S()}function C(e){k(e,"success")}function L(e){k(e,"warning")}function T(e){k(e,"error")}function D(e){k(e,"help")}function O(e){k(e,"loading")}function N(e){k(e,"notice")}t.default={show:E,hide:x,success:C,warning:L,error:T,help:D,loading:O,notice:N};t.withContext=function(n){return function(t){return g.default.createElement(u.default.Consumer,null,function(e){return g.default.createElement(n,(0,h.default)({},t,{contextMessage:{show:function(){return E((0,h.default)({},0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},{contextConfig:e}))},hide:x,success:function(){return C((0,h.default)({},0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},{contextConfig:e}))},warning:function(){return L((0,h.default)({},0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},{contextConfig:e}))},error:function(){return T((0,h.default)({},0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},{contextConfig:e}))},help:function(){return D((0,h.default)({},0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},{contextConfig:e}))},loading:function(){return O((0,h.default)({},0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},{contextConfig:e}))},notice:function(){return N((0,h.default)({},0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},{contextConfig:e}))}}}))})}}},function(e,t,n){"use strict";t.__esModule=!0;t.default={allOverlays:[],addOverlay:function(e){this.removeOverlay(e),this.allOverlays.unshift(e)},isCurrentOverlay:function(e){return e&&this.allOverlays[0]===e},removeOverlay:function(e){e=this.allOverlays.indexOf(e);-1<e&&this.allOverlays.splice(e,1)}},e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var a,r,o=s(n(4)),i=s(n(38)),y=n(11),l=s(n(125));function s(e){return e&&e.__esModule?e:{default:e}}function u(){return window.pageXOffset||document.documentElement.scrollLeft}function d(){return window.pageYOffset||document.documentElement.scrollTop}var v="viewport";function c(e){return"offsetWidth"in e&&"offsetHeight"in e?{width:e.offsetWidth,height:e.offsetHeight}:{width:(e=e.getBoundingClientRect()).width,height:e.height}}function f(e,t){for(var n=0,a=0,r=0,o=0,i=c(e),l=i.width,i=i.height;isNaN(e.offsetTop)||(n+=e.offsetTop),isNaN(e.offsetLeft)||(a+=e.offsetLeft),e&&e.offsetParent&&(isNaN(e.offsetParent.scrollLeft)||e.offsetParent===document.body||(o+=e.offsetParent.scrollLeft),isNaN(e.offsetParent.scrollTop)||e.offsetParent===document.body||(r+=e.offsetParent.scrollTop)),null!==(e=e.offsetParent)&&e!==t;);var s=!t||t===document.body;return{top:n-r-(s?document.documentElement.scrollTop||document.body.scrollTop:0),left:a-o-(s?document.documentElement.scrollLeft||document.body.scrollLeft:0),width:l,height:i}}function p(e){if(!e||e===document.body)return{width:document.documentElement.clientWidth,height:document.documentElement.clientHeight};e=e.getBoundingClientRect();return{width:e.width,height:e.height}}m.prototype.setPosition=function(){var e=this.pinElement,t=this.baseElement,n=this.pinFollowBaseElementWhenFixed,a=this._getExpectedAlign(),r=void 0,o=void 0,i=void 0;if(e!==v){for(var r="fixed"===y.dom.getStyle(e,"position")||(y.dom.setStyle(e,"position","absolute"),!1),o=t!==v&&"fixed"===y.dom.getStyle(t,"position"),l=0;l<a.length;l++){var s=a[l],u=this._normalizePosition(e,s.split(" ")[0],r),d=this._normalizePosition(t,s.split(" ")[1],r&&!n),c=this._getParentOffset(e),f=this._getParentScrollOffset(e),p=r&&o?this._getLeftTop(t):d.offset(r&&n),h=p.top+d.y-c.top-u.y+f.top,p=p.left+d.x-c.left-u.x+f.left;if(this._setPinElementPostion(e,{left:p,top:h},this.offset),this._isInViewport(e,s))return s;i=i||(this.needAdjust&&!this.autoFit?{left:(d=this._getViewportOffset(e,s).right)<0?p+d:p,top:h}:{left:p,top:h})}var m=this._makeElementInViewport(e,i.left,"Left",r),g=this._makeElementInViewport(e,i.top,"Top",r);return this._setPinElementPostion(e,{left:m,top:g},this._calPinOffset(a[0])),a[0]}},m.prototype._getParentOffset=function(e){var e=e.offsetParent||document.documentElement,t=void 0;return(t=e===document.body&&"static"===y.dom.getStyle(e,"position")?{top:0,left:0}:this._getElementOffset(e)).top+=parseFloat(y.dom.getStyle(e,"border-top-width"),10),t.left+=parseFloat(y.dom.getStyle(e,"border-left-width"),10),t.offsetParent=e,t},m.prototype._makeElementInViewport=function(e,t,n,a){var r=document.documentElement,e=e.offsetParent||document.documentElement;return t<0&&(a?t=0:e===document.body&&"static"===y.dom.getStyle(e,"position")&&(t=Math.max(r["scroll"+n],document.body["scroll"+n]))),t},m.prototype._normalizePosition=function(e,t,n){e=this._normalizeElement(e,n);return this._normalizeXY(e,t),e},m.prototype._normalizeXY=function(e,t){var n=t.split("")[1],t=t.split("")[0];return e.x=this._xyConverter(n,e,"width"),e.y=this._xyConverter(t,e,"height"),e},m.prototype._xyConverter=function(e,n,a){e=e.replace(/t|l/gi,"0%").replace(/c/gi,"50%").replace(/b|r/gi,"100%").replace(/(\d+)%/gi,function(e,t){return n.size()[a]*(t/100)});return parseFloat(e,10)||0},m.prototype._getLeftTop=function(e){return{left:parseFloat(y.dom.getStyle(e,"left"))||0,top:parseFloat(y.dom.getStyle(e,"top"))||0}},m.prototype._normalizeElement=function(t,n){var a=this,e={element:t,x:0,y:0},r=t===v,o=document.documentElement;return e.offset=function(e){return n?{left:0,top:0}:r?{left:u(),top:d()}:a._getElementOffset(t,e)},e.size=function(){return r?{width:o.clientWidth,height:o.clientHeight}:c(t)},e},m.prototype._getElementOffset=function(e,t){var e=e.getBoundingClientRect(),n=document.documentElement,a=document.body,r=n.clientLeft||a.clientLeft||0,n=n.clientTop||a.clientTop||0;return{left:e.left+(t?0:u())-r,top:e.top+(t?0:d())-n}},m.prototype._getExpectedAlign=function(){var e=this.isRtl?this._replaceAlignDir(this.align,/l|r/g,{l:"r",r:"l"}):this.align,t=[e];return this.needAdjust&&(/t|b/g.test(e)&&t.push(this._replaceAlignDir(e,/t|b/g,{t:"b",b:"t"})),/l|r/g.test(e)&&t.push(this._replaceAlignDir(e,/l|r/g,{l:"r",r:"l"})),/c/g.test(e)&&(t.push(this._replaceAlignDir(e,/c(?= |$)/g,{c:"l"})),t.push(this._replaceAlignDir(e,/c(?= |$)/g,{c:"r"}))),t.push(this._replaceAlignDir(e,/l|r|t|b/g,{l:"r",r:"l",t:"b",b:"t"}))),t},m.prototype._replaceAlignDir=function(e,t,n){return e.replace(t,function(e){return n[e]})},m.prototype._isRightAligned=function(e){var e=e.split(" "),t=e[0],e=e[1];return"r"===t[1]&&t[1]===e[1]},m.prototype._isBottomAligned=function(e){var e=e.split(" "),t=e[0],e=e[1];return"b"===t[0]&&t[0]===e[0]},m.prototype._isInViewport=function(e,t){var n=p(this.container),a=f(e,this.container),r=c(e),o=this._isRightAligned(t)?n.width:n.width-1,t=this._isBottomAligned(t)?n.height:n.height-1;return this.autoFit?0<=a.top&&a.top+e.offsetHeight<=t:0<=a.left&&a.left+r.width<=o&&0<=a.top&&a.top+r.height<=t},m.prototype._getViewportOffset=function(e,t){var n=p(this.container),a=f(e,this.container),e=c(e),r=this._isRightAligned(t)?n.width:n.width-1,t=this._isBottomAligned(t)?n.height:n.height-1;return{top:a.top,right:r-(a.left+e.width),bottom:t-(a.top+e.height),left:a.left}},m.prototype._setPinElementPostion=function(e,t){var n,a,r=2<arguments.length&&void 0!==arguments[2]?arguments[2]:[0,0],o=t.top,t=t.left;this.isRtl?(n=f(this._getParentOffset(e).offsetParent).width,a=f(e).width,y.dom.setStyle(e,{left:"auto",right:n-(t+a)+r[0]+"px",top:o+r[1]+"px"})):y.dom.setStyle(e,{left:t+r[0]+"px",top:o+r[1]+"px"})},a=n=m,n.VIEWPORT=v,n.place=function(e){return new h(e).setPosition()},r=function(){var o=this;this._calPinOffset=function(e){var t,n,a,r=[].concat(o.offset);return o.autoFit&&e&&o.container&&o.container!==document.body&&(t=f(o.baseElement,o.container),n=f(o.pinElement,o.container),a=p(o.container),(e=e.split(" ")[0]).charAt(1),e=e.charAt(0),(n.top<0||n.top+n.height>a.height)&&(r[1]=-t.top-("t"===e?t.height:0))),r},this._getParentScrollOffset=function(e){var t=0,n=0;return e&&e.offsetParent&&e.offsetParent!==document.body&&(isNaN(e.offsetParent.scrollTop)||(t+=e.offsetParent.scrollTop),isNaN(e.offsetParent.scrollLeft)||(n+=e.offsetParent.scrollLeft)),{top:t,left:n}}};var h=a;function m(e){(0,o.default)(this,m),r.call(this),this.pinElement=e.pinElement,this.baseElement=e.baseElement,this.pinFollowBaseElementWhenFixed=e.pinFollowBaseElementWhenFixed,this.container=function(e){var t=e.container,e=e.baseElement;if(void 0===("undefined"==typeof document?"undefined":(0,i.default)(document)))return t;for(var n=(n=(0,l.default)(t,e))||document.body;"static"===y.dom.getStyle(n,"position");){if(!n||n===document.body)return document.body;n=n.parentNode}return n}(e),this.autoFit=e.autoFit||!1,this.align=e.align||"tl tl",this.offset=e.offset||[0,0],this.needAdjust=e.needAdjust||!1,this.isRtl=e.isRtl||!1}t.default=h,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var w=a(n(2)),M=a(n(12)),k=n(0),S=a(k),E=a(n(13)),x=a(n(183)),C=a(n(79)),L=n(11);function a(e){return e&&e.__esModule?e:{default:e}}t.default=function(e){if(!k.useState||!k.useRef||!k.useEffect)return L.log.warning("need react version > 16.8.0"),null;var t=e.prefix,t=void 0===t?"next-":t,n=e.animation,a=void 0===n?{in:"expandInDown",out:"expandOutUp"}:n,r=e.visible,n=e.hasMask,o=e.align,i=e.points,o=void 0===i?o?o.split(" "):void 0:i,l=e.onPosition,i=e.children,s=e.className,u=e.style,d=e.wrapperClassName,c=e.beforeOpen,f=e.onOpen,p=e.afterOpen,h=e.beforeClose,m=e.onClose,g=e.afterClose,e=(0,M.default)(e,["prefix","animation","visible","hasMask","align","points","onPosition","children","className","style","wrapperClassName","beforeOpen","onOpen","afterOpen","beforeClose","onClose","afterClose"]),y=(0,k.useState)(!0),v=y[0],_=y[1],b=(0,k.useRef)(null),y=S.default.createElement(C.default.OverlayAnimate,{visible:r,animation:a,onEnter:function(){_(!1),"function"==typeof c&&c(b.current)},onEntering:function(){"function"==typeof f&&f(b.current)},onEntered:function(){"function"==typeof p&&p(b.current)},onExit:function(){"function"==typeof h&&h(b.current)},onExiting:function(){"function"==typeof m&&m(b.current)},onExited:function(){_(!0),"function"==typeof g&&g(b.current)},timeout:300,style:u},i?(0,k.cloneElement)(i,{className:(0,E.default)([t+"overlay-inner",s,i&&i.props&&i.props.className])}):S.default.createElement("span",null)),s=(0,E.default)(((u={})[t+"overlay-wrapper v2"]=!0,u[d]=d,u.opened=r,u));return S.default.createElement(x.default,(0,w.default)({},e,{visible:r,isAnimationEnd:v,hasMask:n,wrapperClassName:s,maskClassName:t+"overlay-backdrop",maskRender:function(e){return S.default.createElement(C.default.OverlayAnimate,{visible:r,animation:!!a&&{in:"fadeIn",out:"fadeOut"},timeout:300,unmountOnExit:!0},e)},points:o,onPosition:function(e){(0,w.default)(e,{align:e.config.points}),"function"==typeof l&&l(e)},ref:b}),y)},e.exports=t.default},function(n,e){function a(e,t){return n.exports=a=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},n.exports.__esModule=!0,n.exports.default=n.exports,a(e,t)}n.exports=a,n.exports.__esModule=!0,n.exports.default=n.exports},function(e,t,n){"use strict";t.__esModule=!0;var a,d=g(n(12)),c=g(n(2)),r=g(n(4)),o=g(n(6)),i=g(n(7)),s=n(0),f=g(s),p=n(23),l=n(30),u=g(n(3)),h=n(11),m=g(n(348));function g(e){return e&&e.__esModule?e:{default:e}}var y,n=h.func.noop,v=h.func.makeChain,_=h.func.bindCtx,u=(y=s.Component,(0,i.default)(b,y),b.getDerivedStateFromProps=function(e,t){return"visible"in e?(0,c.default)({},t,{visible:e.visible}):null},b.prototype.componentWillUnmount=function(){var t=this;["_timer","_hideTimer","_showTimer"].forEach(function(e){t[e]&&clearTimeout(t[e])})},b.prototype.handleVisibleChange=function(e,t,n){"visible"in this.props||this.setState({visible:e}),this.props.onVisibleChange(e,t,n)},b.prototype.handleTriggerClick=function(e){this.state.visible&&!this.props.canCloseByTrigger||this.handleVisibleChange(!this.state.visible,"fromTrigger",e)},b.prototype.handleTriggerKeyDown=function(e){var t=this.props.triggerClickKeycode;(Array.isArray(t)?t:[t]).includes(e.keyCode)&&(e.preventDefault(),this.handleTriggerClick(e))},b.prototype.handleTriggerMouseEnter=function(e){var t=this;this._mouseNotFirstOnMask=!1,this._hideTimer&&(clearTimeout(this._hideTimer),this._hideTimer=null),this._showTimer&&(clearTimeout(this._showTimer),this._showTimer=null),this.state.visible||(this._showTimer=setTimeout(function(){t.handleVisibleChange(!0,"fromTrigger",e)},this.props.delay))},b.prototype.handleTriggerMouseLeave=function(e,t){var n=this;this._showTimer&&(clearTimeout(this._showTimer),this._showTimer=null),this.state.visible&&(this._hideTimer=setTimeout(function(){n.handleVisibleChange(!1,t||"fromTrigger",e)},this.props.delay))},b.prototype.handleTriggerFocus=function(e){this.handleVisibleChange(!0,"fromTrigger",e)},b.prototype.handleTriggerBlur=function(e){this._isForwardContent||this.handleVisibleChange(!1,"fromTrigger",e),this._isForwardContent=!1},b.prototype.handleContentMouseDown=function(){this._isForwardContent=!0},b.prototype.handleContentMouseEnter=function(){clearTimeout(this._hideTimer)},b.prototype.handleContentMouseLeave=function(e){this.handleTriggerMouseLeave(e,"fromContent")},b.prototype.handleMaskMouseEnter=function(){this._mouseNotFirstOnMask||(clearTimeout(this._hideTimer),this._hideTimer=null,this._mouseNotFirstOnMask=!1)},b.prototype.handleMaskMouseLeave=function(){this._mouseNotFirstOnMask=!0},b.prototype.handleRequestClose=function(e,t){this.handleVisibleChange(!1,e,t)},b.prototype.renderTrigger=function(){var e,t,n,a,r,o,i,l=this,s=this.props,u=s.trigger,s=s.disabled,d={key:"trigger","aria-haspopup":!0,"aria-expanded":this.state.visible};return this.state.visible||(d["aria-describedby"]=void 0),s||(s=this.props.triggerType,s=Array.isArray(s)?s:[s],e=u&&u.props||{},t=e.onClick,n=e.onKeyDown,a=e.onMouseEnter,r=e.onMouseLeave,o=e.onFocus,i=e.onBlur,s.forEach(function(e){switch(e){case"click":d.onClick=v(l.handleTriggerClick,t),d.onKeyDown=v(l.handleTriggerKeyDown,n);break;case"hover":d.onMouseEnter=v(l.handleTriggerMouseEnter,a),d.onMouseLeave=v(l.handleTriggerMouseLeave,r);break;case"focus":d.onFocus=v(l.handleTriggerFocus,o),d.onBlur=v(l.handleTriggerBlur,i)}})),u&&f.default.cloneElement(u,d)},b.prototype.renderContent=function(){var t=this,e=this.props,n=e.children,e=e.triggerType,e=Array.isArray(e)?e:[e],n=s.Children.only(n),a=n.props,r=a.onMouseDown,o=a.onMouseEnter,i=a.onMouseLeave,l={key:"portal"};return e.forEach(function(e){switch(e){case"focus":l.onMouseDown=v(t.handleContentMouseDown,r);break;case"hover":l.onMouseEnter=v(t.handleContentMouseEnter,o),l.onMouseLeave=v(t.handleContentMouseLeave,i)}}),f.default.cloneElement(n,l)},b.prototype.renderPortal=function(){function e(){return(0,p.findDOMNode)(t)}var t=this,n=this.props,a=n.target,r=n.safeNode,o=n.followTrigger,i=n.triggerType,l=n.hasMask,s=n.wrapperStyle,n=(0,d.default)(n,["target","safeNode","followTrigger","triggerType","hasMask","wrapperStyle"]),u=this.props.container,r=Array.isArray(r)?[].concat(r):[r],s=(r.unshift(e),s||{});return o&&(u=function(e){return e&&e.parentNode||e},s.position="relative"),"hover"===i&&l&&(n.onMaskMouseEnter=this.handleMaskMouseEnter,n.onMaskMouseLeave=this.handleMaskMouseLeave),f.default.createElement(m.default,(0,c.default)({},n,{key:"overlay",ref:function(e){return t.overlay=e},visible:this.state.visible,target:a||e,container:u,safeNode:r,wrapperStyle:s,triggerType:i,hasMask:l,onRequestClose:this.handleRequestClose}),this.props.children&&this.renderContent())},b.prototype.render=function(){return[this.renderTrigger(),this.renderPortal()]},a=i=b,i.propTypes={children:u.default.node,trigger:u.default.element,triggerType:u.default.oneOfType([u.default.string,u.default.array]),triggerClickKeycode:u.default.oneOfType([u.default.number,u.default.array]),visible:u.default.bool,defaultVisible:u.default.bool,onVisibleChange:u.default.func,disabled:u.default.bool,autoFit:u.default.bool,delay:u.default.number,canCloseByTrigger:u.default.bool,target:u.default.any,safeNode:u.default.any,followTrigger:u.default.bool,container:u.default.any,hasMask:u.default.bool,wrapperStyle:u.default.object,rtl:u.default.bool,v2:u.default.bool,placement:u.default.string,placementOffset:u.default.number},i.defaultProps={triggerType:"hover",triggerClickKeycode:[h.KEYCODE.SPACE,h.KEYCODE.ENTER],defaultVisible:!1,onVisibleChange:n,disabled:!1,autoFit:!1,delay:200,canCloseByTrigger:!0,followTrigger:!1,container:function(){return document.body},rtl:!1},a);function b(e){(0,r.default)(this,b);var t=(0,o.default)(this,y.call(this,e));return t.state={visible:void 0===e.visible?e.defaultVisible:e.visible},_(t,["handleTriggerClick","handleTriggerKeyDown","handleTriggerMouseEnter","handleTriggerMouseLeave","handleTriggerFocus","handleTriggerBlur","handleContentMouseEnter","handleContentMouseLeave","handleContentMouseDown","handleRequestClose","handleMaskMouseEnter","handleMaskMouseLeave"]),t}u.displayName="Popup",t.default=(0,l.polyfill)(u),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var T=a(n(2)),D=a(n(12)),O=n(0),N=a(O),P=a(n(13)),j=a(n(183)),Y=a(n(79)),I=n(11);function a(e){return e&&e.__esModule?e:{default:e}}t.default=function(r){if(!O.useState||!O.useRef||!O.useEffect)return I.log.warning("need react version > 16.8.0"),null;var e=r.prefix,e=void 0===e?"next-":e,t=r.animation,n=void 0===t?{in:"expandInDown",out:"expandOutUp"}:t,t=r.defaultVisible,a=r.onVisibleChange,o=void 0===a?function(){}:a,a=r.trigger,i=r.triggerType,i=void 0===i?"hover":i,l=r.overlay,s=r.onPosition,u=r.children,d=r.className,c=r.style,f=r.wrapperClassName,p=r.triggerClickKeycode,h=r.align,m=r.beforeOpen,g=r.onOpen,y=r.afterOpen,v=r.beforeClose,_=r.onClose,b=r.afterClose,w=(0,D.default)(r,["prefix","animation","defaultVisible","onVisibleChange","trigger","triggerType","overlay","onPosition","children","className","style","wrapperClassName","triggerClickKeycode","align","beforeOpen","onOpen","afterOpen","beforeClose","onClose","afterClose"]),t=(0,O.useState)(t),M=t[0],k=t[1],t=(0,O.useState)(n),S=t[0],E=t[1],t=(0,O.useState)(!0),x=t[0],C=t[1],L=(0,O.useRef)(null),t=((0,O.useEffect)(function(){"visible"in r&&k(r.visible)},[r.visible]),(0,O.useEffect)(function(){"animation"in r&&S!==n&&E(n)},[n]),l?u:a),a=l||u,a=N.default.createElement(Y.default.OverlayAnimate,{visible:M,animation:S,timeout:200,onEnter:function(){C(!1),"function"==typeof m&&m(L.current)},onEntering:function(){"function"==typeof g&&g(L.current)},onEntered:function(){"function"==typeof y&&y(L.current)},onExit:function(){"function"==typeof v&&v(L.current)},onExiting:function(){"function"==typeof _&&_(L.current)},onExited:function(){C(!0),"function"==typeof b&&b(L.current)},style:c},a?(0,O.cloneElement)(a,{className:(0,P.default)([e+"overlay-inner",d,a&&a.props&&a.props.className])}):N.default.createElement("span",null)),u=(0,P.default)(((l={})[e+"overlay-wrapper v2"]=!0,l[f]=f,l.opened=M,l)),c={};h&&(c.points=h.split(" "));return N.default.createElement(j.default.Popup,(0,T.default)({},w,c,{wrapperClassName:u,overlay:a,visible:M,isAnimationEnd:x,triggerType:i,onVisibleChange:function(e){for(var t=arguments.length,n=Array(1<t?t-1:0),a=1;a<t;a++)n[a-1]=arguments[a];"visible"in r||k(e),o.apply(void 0,[e].concat(n))},onPosition:function(e){(0,T.default)(e,{align:e.config.points});var t=e.config.placement;t&&"string"==typeof t&&("expandInDown"===S.in&&"expandOutUp"===S.out&&t.match(/t/)?E({in:"expandInUp",out:"expandOutDown"}):"expandInUp"===S.in&&"expandOutDown"===S.out&&t.match(/b/)&&E({in:"expandInDown",out:"expandOutUp"})),"function"==typeof s&&s(e)},triggerClickKeyCode:p,maskRender:function(e){return N.default.createElement(Y.default.OverlayAnimate,{visible:M,animation:!!S&&{in:"fadeIn",out:"fadeOut"},timeout:200,unmountOnExit:!0},e)},ref:L}),t)},e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var s=a(n(2)),u=a(n(12)),o=n(0),d=a(o),i=a(n(23)),l=a(n(8)),c=a(n(79)),f=a(n(156)),p=n(11);function a(e){return e&&e.__esModule?e:{default:e}}var h={top:8,maxCount:0,duration:3e3},m=l.default.config(function(e){var t=e.prefix,l=void 0===t?"next-":t,t=e.dataSource,a=void 0===t?[]:t,r=(0,o.useState)()[1];return a.forEach(function(n){n.timer||(n.timer=setTimeout(function(){var e,t=a.indexOf(n);-1<t&&("function"==typeof(e=a[t]).onClose&&e.onClose(),a.splice(t,1),r({}))},n.duration))}),d.default.createElement("div",{className:l+"message-wrapper-v2",style:{top:h.top}},d.default.createElement(c.default,{animationAppear:!0,animation:{appear:"pulse",enter:"pulse",leave:l+"message-fade-leave"},singleMode:!1},a.map(function(e){var t=e.key,n=e.className,a=e.type,r=e.title,o=e.content,i=e.style,e=(0,u.default)(e,["key","className","type","title","content","style"]);return d.default.createElement("div",{className:l+"message-list",key:t},d.default.createElement(f.default,(0,s.default)({},e,{className:n,prefix:l,visible:!0,type:a,shape:"toast",title:r,style:i}),o))})))}),g=void 0,y=[];function r(o){return function(e){var t,n,a,r;return n=o,a={},"string"==typeof(t=e)||d.default.isValidElement(t)?a.title=t:"Object"===p.obj.typeOf(t)&&(a=(0,s.default)({},t)),n&&(a.type=n),n=void 0===(n=(t=e=a).key)?(0,p.guid)("message-"):n,t=(0,u.default)(t,["key"]),g||(g=document.createElement("div"),document.body.appendChild(g)),a=h.maxCount,e=h.duration,r=(0,s.default)({key:n,duration:e},t),y.push(r),a&&y.length>a&&y.shift(),i.default.render(d.default.createElement(l.default,l.default.getContext(),d.default.createElement(m,{dataSource:y})),g),{key:n,close:function(){r.timer&&clearTimeout(r.timer);var e=y.indexOf(r);-1<e&&("function"==typeof r.onClose&&r.onClose(),y.splice(e,1),i.default.render(d.default.createElement(l.default,l.default.getContext(),d.default.createElement(m,{dataSource:y})),g))}}}}t.default={open:r(),success:r("success"),warning:r("warning"),error:r("error"),help:r("help"),loading:r("loading"),notice:r("notice"),close:function(t){var e;t?(e=y.findIndex(function(e){return e.key===t}),y.splice(e,1)):y=[],g&&i.default.render(d.default.createElement(l.default,l.default.getContext(),d.default.createElement(m,{dataSource:y})),g)},destory:function(){g&&(i.default.unmountComponentAtNode(g),g.parentNode.removeChild(g),g=null)},config:function(){if(o.useState){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return s.default.apply(void 0,[h].concat(t))}p.log.warning("need react version > 16.8.0")}},e.exports=t.default},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){"use strict";n(546)},function(e,t,n){},function(e,t,n){},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var p=s(n(2)),r=s(n(4)),o=s(n(6)),a=s(n(7)),h=s(n(38)),m=s(n(0)),i=s(n(3)),g=s(n(13)),y=n(11),l=s(n(27)),v=s(n(355));function s(e){return e&&e.__esModule?e:{default:e}}function _(e,r){var o=r.size,i=r.device,l=r.labelAlign,s=r.labelTextAlign,u=r.labelCol,d=r.wrapperCol,c=r.responsive,f=r.colon;return m.default.Children.map(e,function(e){return y.obj.isReactFragment(e)?_(e.props.children,r):e&&-1<["function","object"].indexOf((0,h.default)(e.type))&&"form_item"===e.type._typeMark?(t={labelCol:e.props.labelCol||u,wrapperCol:e.props.wrapperCol||d,labelAlign:e.props.labelAlign||("phone"===i?"top":l),labelTextAlign:e.props.labelTextAlign||s,colon:"colon"in e.props?e.props.colon:f,size:e.props.size||o,responsive:c},m.default.cloneElement(e,(n=t,a={},Object.keys(n).forEach(function(e){void 0!==n[e]&&(a[e]=n[e])}),a))):e;var t,n,a})}u=m.default.Component,(0,a.default)(b,u),b.prototype.getChildContext=function(){return{_formField:this.props.field||this._formField,_formSize:this.props.size,_formDisabled:this.props.disabled,_formPreview:this.props.isPreview,_formFullWidth:this.props.fullWidth,_formLabelForErrorMessage:this.props.useLabelForErrorMessage}},b.prototype.componentDidUpdate=function(e){var t=this.props;this._formField&&("value"in t&&t.value!==e.value&&this._formField.setValues(t.value),"error"in t&&t.error!==e.error&&this._formField.setValues(t.error))},b.prototype.render=function(){var e=this.props,t=e.className,n=e.inline,a=e.size,r=(e.device,e.labelAlign,e.labelTextAlign,e.onSubmit),o=e.children,i=(e.labelCol,e.wrapperCol,e.style),l=e.prefix,s=e.rtl,u=e.isPreview,d=e.component,c=e.responsive,f=e.gap,n=(e.colon,(0,g.default)(((e={})[l+"form"]=!0,e[l+"inline"]=n,e[""+l+a]=a,e[l+"form-responsive-grid"]=c,e[l+"form-preview"]=u,e[t]=!!t,e))),a=_(o,this.props);return m.default.createElement(d,(0,p.default)({role:"grid"},y.obj.pickOthers(b.propTypes,this.props),{className:n,style:i,dir:s?"rtl":void 0,onSubmit:r}),c?m.default.createElement(v.default,{gap:f},a):a)},a=n=b,n.propTypes={prefix:i.default.string,inline:i.default.bool,size:i.default.oneOf(["large","medium","small"]),fullWidth:i.default.bool,labelAlign:i.default.oneOf(["top","left","inset"]),labelTextAlign:i.default.oneOf(["left","right"]),field:i.default.any,saveField:i.default.func,labelCol:i.default.object,wrapperCol:i.default.object,onSubmit:i.default.func,children:i.default.any,className:i.default.string,style:i.default.object,value:i.default.object,onChange:i.default.func,component:i.default.oneOfType([i.default.string,i.default.func]),fieldOptions:i.default.object,rtl:i.default.bool,device:i.default.oneOf(["phone","tablet","desktop"]),responsive:i.default.bool,isPreview:i.default.bool,useLabelForErrorMessage:i.default.bool,colon:i.default.bool,disabled:i.default.bool,gap:i.default.oneOfType([i.default.arrayOf(i.default.number),i.default.number])},n.defaultProps={prefix:"next-",onSubmit:function(e){e.preventDefault()},size:"medium",labelAlign:"left",onChange:y.func.noop,component:"form",saveField:y.func.noop,device:"desktop",colon:!1,disabled:!1},n.childContextTypes={_formField:i.default.object,_formSize:i.default.string,_formDisabled:i.default.bool,_formPreview:i.default.bool,_formFullWidth:i.default.bool,_formLabelForErrorMessage:i.default.bool};var u,n=a;function b(e){(0,r.default)(this,b);var t,n,a=(0,o.default)(this,u.call(this,e));return a.onChange=function(e,t){a.props.onChange(a._formField.getValues(),{name:e,value:t,field:a._formField})},a._formField=null,!1!==e.field&&(t=(0,p.default)({},e.fieldOptions,{onChange:a.onChange}),e.field?(a._formField=e.field,n=a._formField.options.onChange,t.onChange=y.func.makeChain(n,a.onChange),a._formField.setOptions&&a._formField.setOptions(t)):("value"in e&&(t.values=e.value),a._formField=new l.default(a,t)),e.locale&&e.locale.Validate&&a._formField.setOptions({messages:e.locale.Validate}),e.saveField(a._formField)),a}n.displayName="Form",t.default=n,e.exports=t.default},function(e,t,n){"use strict";var a=n(86),m=(Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,a(n(160))),i=a(n(551)),r=a(n(162)),o=a(n(161)),b=a(n(163)),w=a(n(73)),l=a(n(352)),s=a(n(353)),g=a(n(557)),M=n(566),u={state:"",valueName:"value",trigger:"onChange",inputValues:[]},a=function(){function a(e){var t=this,n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{};(0,l.default)(this,a),e||(0,M.warning)("`this` is missing in `Field`, you should use like `new Field(this)`"),this.com=e,this.fieldsMeta={},this.cachedBind={},this.instance={},this.instanceCount={},this.values=(0,w.default)({},n.values),this.processErrorMessage=n.processErrorMessage,this.afterValidateRerender=n.afterValidateRerender,this.options=(0,w.default)({parseName:!1,forceUpdate:!1,scrollToFirstError:!0,first:!1,onChange:function(){},autoUnmount:!0,autoValidate:!0},n),["init","getValue","getValues","setValue","setValues","getError","getErrors","setError","setErrors","validateCallback","validatePromise","getState","reset","resetToDefault","remove","spliceArray","addArrayValue","deleteArrayValue","getNames"].forEach(function(e){t[e]=t[e].bind(t)})}var n;return(0,s.default)(a,[{key:"setOptions",value:function(e){(0,w.default)(this.options,e)}},{key:"init",value:function(o){var e,i=this,t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},n=2<arguments.length?arguments[2]:void 0,a=t.id,r=t.initValue,l=t.valueName,l=void 0===l?"value":l,s=t.trigger,u=void 0===s?"onChange":s,s=t.rules,s=void 0===s?[]:s,d=t.props,d=void 0===d?{}:d,c=t.getValueFromEvent,c=void 0===c?null:c,f=t.getValueFormatter,f=void 0===f?c:f,p=t.setValueFormatter,t=t.autoValidate,t=void 0===t||t,h=this.options.parseName,m=(c&&(0,M.warning)("`getValueFromEvent` has been deprecated in `Field`, use `getValueFormatter` instead of it"),(0,w.default)({},d,n)),c="default".concat(l[0].toUpperCase()).concat(l.slice(1)),g=(void 0!==r?e=r:void 0!==m[c]&&(e=m[c]),this._getInitMeta(o)),y=((0,w.default)(g,{valueName:l,initValue:e,disabled:"disabled"in m&&m.disabled,getValueFormatter:f,setValueFormatter:p,rules:Array.isArray(s)?s:[s],ref:m.ref}),l in m&&(g.value=m[l],h?this.values=(0,M.setIn)(this.values,o,g.value):this.values[o]=g.value),"value"in g||(h?void 0!==(d=(0,M.getIn)(this.values,o))?g.value=d:(g.value=e,this.values=(0,M.setIn)(this.values,o,g.value)):void 0!==(n=this.values[o])?g.value=n:void 0!==e&&(g.value=e,this.values[o]=g.value)),(0,b.default)({"data-meta":"Field",id:a||o,ref:this._getCacheBind(o,"".concat(o,"__ref"),this._saveRef)},l,p?p(g.value,g.inputValues):g.value)),v={};if(this.options.autoValidate&&!1!==t)for(var _ in v=(0,M.mapValidateRules)(g.rules,u))(function(a){if(a===u)return;var r=v[a];y[a]=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];i._callNativePropsEvent.apply(i,[a,m].concat(t)),i._validate(o,r,a)}})(_);return y[u]=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];i._updateFieldValue.apply(i,[o].concat(t)),i._resetError(o),i._callNativePropsEvent.apply(i,[u,m].concat(t)),i.options.onChange(o,g.value);var a=v[u];a&&i._validate(o,a,u),i._reRender()},delete m[c],(0,w.default)({},m,y)}},{key:"_callNativePropsEvent",value:function(e,t){for(var n=arguments.length,a=new Array(2<n?n-2:0),r=2;r<n;r++)a[r-2]=arguments[r];e in t&&"function"==typeof t[e]&&t[e].apply(t,a)}},{key:"_getInitMeta",value:function(e){return e in this.fieldsMeta||(this.fieldsMeta[e]=(0,w.default)({},u)),this.fieldsMeta[e]}},{key:"_updateFieldValue",value:function(e){for(var t=arguments.length,n=new Array(1<t?t-1:0),a=1;a<t;a++)n[a-1]=arguments[a];var r=n[0],o=this._get(e);o&&(o.value=o.getValueFormatter?o.getValueFormatter.apply(this,n):(0,M.getValueFromEvent)(r),o.inputValues=n,this.options.parseName?this.values=(0,M.setIn)(this.values,e,o.value):this.values[e]=o.value)}},{key:"_getCacheBind",value:function(e,t,n){var a=this.cachedBind[e]=this.cachedBind[e]||{};return a[t]||(a[t]=n.bind(this,e)),a[t]}},{key:"_setCache",value:function(e,t,n){(this.cachedBind[e]=this.cachedBind[e]||{})[t]=n}},{key:"_getCache",value:function(e,t){return(this.cachedBind[e]||{})[t]}},{key:"_saveRef",value:function(e,t){var n="".concat(e,"_field"),a=this.options.autoUnmount;if(!t&&a)this.instanceCount[e]&&this.instanceCount[e]--,0<this.instanceCount[e]||((r=this.fieldsMeta[e])&&this._setCache(e,n,r),delete this.instance[e],this.remove(e));else{a&&!this.fieldsMeta[e]&&this._getCache(e,n)&&(this.fieldsMeta[e]=this._getCache(e,n),this.setValue(e,this.fieldsMeta[e]&&this.fieldsMeta[e].value,!1));var r=this._get(e);if(r){n=r.ref;if(n){if("string"==typeof n)throw new Error("can not set string ref for ".concat(e));"function"==typeof n?n(t):"object"===(0,o.default)(n)&&"current"in n&&(n.current=t)}a&&t&&(r=(r=this.instanceCount[e])||0,this.instanceCount[e]=r+1),this.instance[e]=t}}}},{key:"_validate",value:function(e,t,n){var a,r,o=this,i=this._get(e);i&&(a=i.value,i.state="loading",(r=this._getCache(e,n))&&"function"==typeof r.abort&&r.abort(),r=new g.default((0,b.default)({},e,t),{messages:this.options.messages}),this._setCache(e,n,r),r.validate((0,b.default)({},e,a),function(e){var t,e=e&&e.length?(t=(0,M.getErrorStrs)(e,o.processErrorMessage),"error"):(t=[],"success"),n=!1;e===i.state&&i.errors&&t.length===i.errors.length&&!t.find(function(e,t){return e!==i.errors[t]})||(n=!0),i.errors=t,i.state=e,n&&o._reRender()}))}},{key:"getValue",value:function(e){return this.options.parseName?(0,M.getIn)(this.values,e):this.values[e]}},{key:"getValues",value:function(e){var t=this,n={};return e&&e.length?e.forEach(function(e){n[e]=t.getValue(e)}):(0,w.default)(n,this.values),n}},{key:"setValue",value:function(e,t){var n=!(2<arguments.length&&void 0!==arguments[2])||arguments[2];e in this.fieldsMeta&&(this.fieldsMeta[e].value=t),this.options.parseName?this.values=(0,M.setIn)(this.values,e,t):this.values[e]=t,n&&this._reRender()}},{key:"setValues",value:function(){var n=this,t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},e=!(1<arguments.length&&void 0!==arguments[1])||arguments[1];this.options.parseName?(this.values=(0,w.default)({},this.values,t),this.getNames().forEach(function(e){var t=(0,M.getIn)(n.values,e);void 0!==t?n.fieldsMeta[e].value=t:n.values=(0,M.setIn)(n.values,e,n.fieldsMeta[e].value)})):Object.keys(t).forEach(function(e){n.setValue(e,t[e],!1)}),e&&this._reRender()}},{key:"setError",value:function(e,t){t=Array.isArray(t)?t:t?[t]:[];e in this.fieldsMeta?this.fieldsMeta[e].errors=t:this.fieldsMeta[e]={errors:t},this.fieldsMeta[e].errors&&0<this.fieldsMeta[e].errors.length?this.fieldsMeta[e].state="error":this.fieldsMeta[e].state="",this._reRender()}},{key:"setErrors",value:function(){var t=this,n=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{};Object.keys(n).forEach(function(e){t.setError(e,n[e])})}},{key:"getError",value:function(e){e=this._get(e);return e&&e.errors&&e.errors.length?e.errors:null}},{key:"getErrors",value:function(e){var t=this,e=e||this.getNames(),n={};return e.forEach(function(e){n[e]=t.getError(e)}),n}},{key:"getState",value:function(e){e=this._get(e);return e&&e.state?e.state:""}},{key:"formatGetErrors",value:function(e){var t,n,a=this.getErrors(e),r=null;for(t in a)a.hasOwnProperty(t)&&a[t]&&(n=a[t],(r=r||{})[t]={errors:n});return r}},{key:"validateCallback",value:function(e,t){for(var o=this,e=(0,M.getParams)(e,t),i=e.names,l=e.callback,s=i||this.getNames(),n={},a={},r=!1,u=0;u<s.length;u++){var d=s[u],c=this._get(d);c&&c.rules&&c.rules.length&&(n[d]=c.rules,a[d]=this.getValue(d),r=!0,c.errors=[],c.state="")}r?new g.default(n,{first:this.options.first,messages:this.options.messages}).validate(a,function(e){var n=null,e=(e&&e.length&&(n={},e.forEach(function(e){var t=e.field;n[t]||(n[t]={errors:[]}),n[t].errors.push(e.message)})),n&&Object.keys(n).forEach(function(e){var t=o._get(e);t&&(t.errors=(0,M.getErrorStrs)(n[e].errors,o.processErrorMessage),t.state="error")}),o.formatGetErrors(s));e&&(n=(0,w.default)({},e,n));for(var t=0;t<s.length;t++){var a=s[t],r=o._get(a);!r||!r.rules||n&&a in n||(r.state="success")}l&&l(n,o.getValues(i?s:[])),o._reRender(),"function"==typeof o.afterValidateRerender&&o.afterValidateRerender({errorsGroup:n,options:o.options,instance:o.instance})}):(t=this.formatGetErrors(s),l&&l(t,this.getValues(i?s:[])))}},{key:"validatePromise",value:(n=(0,r.default)(m.default.mark(function e(t,n){var a,r,o,i,l,s,u,d,c,f,p,h;return m.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:r=(0,M.getParams)(t,n),a=r.names,r=r.callback,o=a||this.getNames(),i={},s=!(l={}),u=0;case 6:if(!(u<o.length)){e.next=15;break}if(d=o[u],c=this._get(d)){e.next=11;break}return e.abrupt("continue",12);case 11:c.rules&&c.rules.length&&(i[d]=c.rules,l[d]=this.getValue(d),s=!0,c.errors=[],c.state="");case 12:u++,e.next=6;break;case 15:if(s){e.next=22;break}if(f=this.formatGetErrors(o),r)return e.abrupt("return",r({errors:f,values:this.getValues(a?o:[])}));e.next=21;break;case 21:return e.abrupt("return",{errors:f,values:this.getValues(a?o:[])});case 22:return p=new g.default(i,{first:this.options.first,messages:this.options.messages}),e.next=25,p.validatePromise(l);case 25:if(p=e.sent,h=p&&p.errors||[],h=this._getErrorsGroup({errors:h,fieldNames:o}),h={errors:h,values:this.getValues(a?o:[])},e.prev=29,r)return e.next=33,r(h);e.next=34;break;case 33:h=e.sent;case 34:e.next=39;break;case 36:return e.prev=36,e.t0=e.catch(29),e.abrupt("return",e.t0);case 39:return this._reRender(),e.abrupt("return",h);case 41:case"end":return e.stop()}},e,this,[[29,36]])})),function(e,t){return n.apply(this,arguments)})},{key:"_getErrorsGroup",value:function(e){var n=this,t=e.errors,a=e.fieldNames,r=null,e=(t&&t.length&&(r={},t.forEach(function(e){var t=e.field;r[t]||(r[t]={errors:[]}),r[t].errors.push(e.message)})),r&&Object.keys(r).forEach(function(e){var t=n._get(e);t&&(t.errors=(0,M.getErrorStrs)(r[e].errors,n.processErrorMessage),t.state="error")}),this.formatGetErrors(a));e&&(r=(0,w.default)({},e,r));for(var o=0;o<a.length;o++){var i=a[o],l=this._get(i);!l||!l.rules||r&&i in r||(l.state="success")}return r}},{key:"_reset",value:function(e,n){var a=this,r=!1,t=(e="string"==typeof e?[e]:e)||Object.keys(this.fieldsMeta);e||(this.values={}),t.forEach(function(e){var t=a._get(e);t&&(r=!0,t.value=n?t.initValue:void 0,t.state="",delete t.errors,delete t.rules,delete t.rulesMap,a.options.parseName?a.values=(0,M.setIn)(a.values,e,t.value):a.values[e]=t.value)}),r&&this._reRender()}},{key:"reset",value:function(e){this._reset(e,!1)}},{key:"resetToDefault",value:function(e){this._reset(e,!0)}},{key:"getNames",value:function(){var e=this.fieldsMeta;return Object.keys(e).filter(function(){return!0})}},{key:"remove",value:function(e){var t=this;(e="string"==typeof e?[e]:e)||(this.values={}),(e||Object.keys(this.fieldsMeta)).forEach(function(e){e in t.fieldsMeta&&delete t.fieldsMeta[e],t.options.parseName?t.values=(0,M.deleteIn)(t.values,e):delete t.values[e]})}},{key:"addArrayValue",value:function(e,t){for(var n=arguments.length,a=new Array(2<n?n-2:0),r=2;r<n;r++)a[r-2]=arguments[r];return this._spliceArrayValue.apply(this,[e,t,0].concat(a))}},{key:"deleteArrayValue",value:function(e,t){return this._spliceArrayValue(e,t,2<arguments.length&&void 0!==arguments[2]?arguments[2]:1)}},{key:"_spliceArrayValue",value:function(e,r,o){for(var t=this,n=arguments.length,a=new Array(3<n?n-3:0),i=3;i<n;i++)a[i-3]=arguments[i];var l=a.length,s=o-l,u=r+o,d={},c=new RegExp("^(".concat(e,".)(\\d+)")),f=[],l=(this.getNames().forEach(function(e){var n,t,a=c.exec(e);a&&(n=parseInt(a[2]),u<=n&&(a=d[n],t={from:e,to:e.replace(c,function(e,t){return"".concat(t).concat(n-s)})},a?a.push(t):d[n]=[t]),0<s&&r<=n&&n<r+o&&f.push(e))}),Object.keys(d).map(function(e){return{index:Number(e),list:d[e]}}).sort(function(e,t){return 0<s?e.index-t.index:t.index-e.index})),l=(l.forEach(function(e){e.list.forEach(function(e){t.fieldsMeta[e.to]=t.fieldsMeta[e.from]})}),0<l.length?l.slice(l.length-(s<0?-s:s),l.length).forEach(function(e){e.list.forEach(function(e){delete t.fieldsMeta[e.from]})}):f.forEach(function(e){delete t.fieldsMeta[e]}),this.getValue(e));l&&l.splice.apply(l,[r,o].concat(a)),this._reRender()}},{key:"spliceArray",value:function(r,o,e){var i,l,t,n=this;-1===r.match(/{index}$/)?(0,M.warning)("key should match /{index}$/"):(t=r.replace("{index}","(\\d+)"),i=new RegExp("^".concat(t)),l={},this.getNames().forEach(function(e){var t,n,a=i.exec(e);a&&(t=parseInt(a[1]),o<t&&(n=l[t],e={from:e,to:"".concat(r.replace("{index}",t-1)).concat(e.replace(a[0],""))},n?n.push(e):l[t]=[e]))}),0<(t=Object.keys(l).map(function(e){return{index:Number(e),list:l[e]}}).sort(function(e,t){return e.index<t.index})).length&&t[0].index===o+1&&(t.forEach(function(e){e.list.forEach(function(e){var t=n.getValue(e.from);n.setValue(e.to,t,!1)})}),t[t.length-1].list.forEach(function(e){n.remove(e.from)}),t=(t=r.replace(".{index}","")).replace("[{index}]",""),(t=this.getValue(t))&&t.length--))}},{key:"_resetError",value:function(e){e=this._get(e);e&&(delete e.errors,e.state="")}},{key:"_reRender",value:function(){this.com&&(!this.options.forceUpdate&&this.com.setState?this.com.setState({}):this.com.forceUpdate&&this.com.forceUpdate())}},{key:"_get",value:function(e){return e in this.fieldsMeta?this.fieldsMeta[e]:null}},{key:"get",value:function(e){return e?this._get(e):this.fieldsMeta}}],[{key:"create",value:function(e){return new this(e,1<arguments.length&&void 0!==arguments[1]?arguments[1]:{})}},{key:"getUseField",value:function(e){var a=this,r=e.useState,o=e.useMemo;return function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},t=r(),n=(0,i.default)(t,2)[1];return o(function(){return a.create({setState:n},e)},[n])}}}]),a}();t.default=a},function(k,e,t){var S=t(161).default;function n(){"use strict";
+/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */k.exports=function(){return i},k.exports.__esModule=!0,k.exports.default=k.exports;var i={},e=Object.prototype,s=e.hasOwnProperty,t="function"==typeof Symbol?Symbol:{},a=t.iterator||"@@iterator",n=t.asyncIterator||"@@asyncIterator",r=t.toStringTag||"@@toStringTag";function o(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{o({},"")}catch(e){o=function(e,t,n){return e[t]=n}}function l(e,t,n,a){var r,o,i,l,t=t&&t.prototype instanceof c?t:c,t=Object.create(t.prototype),a=new b(a||[]);return t._invoke=(r=e,o=n,i=a,l="suspendedStart",function(e,t){if("executing"===l)throw new Error("Generator is already running");if("completed"===l){if("throw"===e)throw t;return M()}for(i.method=e,i.arg=t;;){var n=i.delegate;if(n){n=function e(t,n){var a=t.iterator[n.method];if(void 0===a){if(n.delegate=null,"throw"===n.method){if(t.iterator.return&&(n.method="return",n.arg=void 0,e(t,n),"throw"===n.method))return d;n.method="throw",n.arg=new TypeError("The iterator does not provide a 'throw' method")}return d}a=u(a,t.iterator,n.arg);if("throw"===a.type)return n.method="throw",n.arg=a.arg,n.delegate=null,d;a=a.arg;return a?a.done?(n[t.resultName]=a.value,n.next=t.nextLoc,"return"!==n.method&&(n.method="next",n.arg=void 0),n.delegate=null,d):a:(n.method="throw",n.arg=new TypeError("iterator result is not an object"),n.delegate=null,d)}(n,i);if(n){if(n===d)continue;return n}}if("next"===i.method)i.sent=i._sent=i.arg;else if("throw"===i.method){if("suspendedStart"===l)throw l="completed",i.arg;i.dispatchException(i.arg)}else"return"===i.method&&i.abrupt("return",i.arg);l="executing";n=u(r,o,i);if("normal"===n.type){if(l=i.done?"completed":"suspendedYield",n.arg===d)continue;return{value:n.arg,done:i.done}}"throw"===n.type&&(l="completed",i.method="throw",i.arg=n.arg)}}),t}function u(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}i.wrap=l;var d={};function c(){}function f(){}function p(){}var t={},h=(o(t,a,function(){return this}),Object.getPrototypeOf),h=h&&h(h(w([]))),m=(h&&h!==e&&s.call(h,a)&&(t=h),p.prototype=c.prototype=Object.create(t));function g(e){["next","throw","return"].forEach(function(t){o(e,t,function(e){return this._invoke(t,e)})})}function y(i,l){var t;this._invoke=function(n,a){function e(){return new l(function(e,t){!function t(e,n,a,r){var o,e=u(i[e],i,n);if("throw"!==e.type)return(n=(o=e.arg).value)&&"object"==S(n)&&s.call(n,"__await")?l.resolve(n.__await).then(function(e){t("next",e,a,r)},function(e){t("throw",e,a,r)}):l.resolve(n).then(function(e){o.value=e,a(o)},function(e){return t("throw",e,a,r)});r(e.arg)}(n,a,e,t)})}return t=t?t.then(e,e):e()}}function v(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 _(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function b(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(v,this),this.reset(!0)}function w(t){if(t){var n,e=t[a];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length))return n=-1,(e=function e(){for(;++n<t.length;)if(s.call(t,n))return e.value=t[n],e.done=!1,e;return e.value=void 0,e.done=!0,e}).next=e}return{next:M}}function M(){return{value:void 0,done:!0}}return o(m,"constructor",f.prototype=p),o(p,"constructor",f),f.displayName=o(p,r,"GeneratorFunction"),i.isGeneratorFunction=function(e){e="function"==typeof e&&e.constructor;return!!e&&(e===f||"GeneratorFunction"===(e.displayName||e.name))},i.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,p):(e.__proto__=p,o(e,r,"GeneratorFunction")),e.prototype=Object.create(m),e},i.awrap=function(e){return{__await:e}},g(y.prototype),o(y.prototype,n,function(){return this}),i.AsyncIterator=y,i.async=function(e,t,n,a,r){void 0===r&&(r=Promise);var o=new y(l(e,t,n,a),r);return i.isGeneratorFunction(t)?o:o.next().then(function(e){return e.done?e.value:o.next()})},g(m),o(m,r,"Generator"),o(m,a,function(){return this}),o(m,"toString",function(){return"[object Generator]"}),i.keys=function(n){var e,a=[];for(e in n)a.push(e);return a.reverse(),function e(){for(;a.length;){var t=a.pop();if(t in n)return e.value=t,e.done=!1,e}return e.done=!0,e}},i.values=w,b.prototype={constructor:b,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method="next",this.arg=void 0,this.tryEntries.forEach(_),!e)for(var t in this)"t"===t.charAt(0)&&s.call(this,t)&&!isNaN(+t.slice(1))&&(this[t]=void 0)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(n){if(this.done)throw n;var a=this;function e(e,t){return o.type="throw",o.arg=n,a.next=e,t&&(a.method="next",a.arg=void 0),!!t}for(var t=this.tryEntries.length-1;0<=t;--t){var r=this.tryEntries[t],o=r.completion;if("root"===r.tryLoc)return e("end");if(r.tryLoc<=this.prev){var i=s.call(r,"catchLoc"),l=s.call(r,"finallyLoc");if(i&&l){if(this.prev<r.catchLoc)return e(r.catchLoc,!0);if(this.prev<r.finallyLoc)return e(r.finallyLoc)}else if(i){if(this.prev<r.catchLoc)return e(r.catchLoc,!0)}else{if(!l)throw new Error("try statement without catch or finally");if(this.prev<r.finallyLoc)return e(r.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;0<=n;--n){var a=this.tryEntries[n];if(a.tryLoc<=this.prev&&s.call(a,"finallyLoc")&&this.prev<a.finallyLoc){var r=a;break}}var o=(r=r&&("break"===e||"continue"===e)&&r.tryLoc<=t&&t<=r.finallyLoc?null:r)?r.completion:{};return o.type=e,o.arg=t,r?(this.method="next",this.next=r.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;0<=t;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),_(n),d}},catch:function(e){for(var t=this.tryEntries.length-1;0<=t;--t){var n,a,r=this.tryEntries[t];if(r.tryLoc===e)return"throw"===(n=r.completion).type&&(a=n.arg,_(r)),a}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:w(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=void 0),d}},i}k.exports=n,k.exports.__esModule=!0,k.exports.default=k.exports},function(e,t,n){var a=n(552),r=n(553),o=n(554),i=n(556);e.exports=function(e,t){return a(e)||r(e,t)||o(e,t)||i()},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,t){e.exports=function(e){if(Array.isArray(e))return e},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,t){e.exports=function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,o=[],i=!0,l=!1;try{for(n=n.call(e);!(i=(a=n.next()).done)&&(o.push(a.value),!t||o.length!==t);i=!0);}catch(e){l=!0,r=e}finally{try{i||null==n.return||n.return()}finally{if(l)throw r}}return o}},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,t,n){var a=n(555);e.exports=function(e,t){if(e){if("string"==typeof e)return a(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Map"===(n="Object"===n&&e.constructor?e.constructor.name:n)||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?a(e,t):void 0}},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,t){e.exports=function(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=new Array(t);n<t;n++)a[n]=e[n];return a},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,t){e.exports=function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,t,n){"use strict";var a=n(86),o=(Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,a(n(160))),i=a(n(162)),r=a(n(163)),l=a(n(352)),s=a(n(353)),u=n(97),d=a(n(558)),c=n(559);function f(t,e){var n,a=Object.keys(t);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(t),e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),a.push.apply(a,n)),a}function p(t){for(var e=1;e<arguments.length;e++){var n=null!=arguments[e]?arguments[e]:{};e%2?f(Object(n),!0).forEach(function(e){(0,r.default)(t,e,n[e])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):f(Object(n)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))})}return t}function h(){}function m(n,e){var a,r,o={};return Object.keys(e).forEach(function(t){a=e[t],r=n[t],(a=Array.isArray(a)?a:[a]).forEach(function(e){e.validator=(0,c.getValidationMethod)(e),e.field=t,e.validator&&(o[t]=o[t]||[],o[t].push({rule:e,value:r,source:n,field:t}))})}),o}a=function(){function n(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{};(0,l.default)(this,n),this._rules=e,this._options=p(p({},t),{},{messages:p(p({},d.default),t.messages)}),this.complete=[]}var t;return(0,s.default)(n,[{key:"abort",value:function(){for(var e=0;e<this.complete.length;e++)this.complete[e]=h}},{key:"messages",value:function(e){this._options.messages=Object.assign({},this._options.messages,e)}},{key:"validate",value:function(e,i){var t,r=this;if(!i)return this.validatePromise(e);this._rules&&0!==Object.keys(this._rules).length?(e=m(e,this._rules),0===Object.keys(e).length&&i(null),this.complete.push(function(e){var t,n,a,r=[],o={};for(t=0;t<e.length;t++)a=e[t],Array.isArray(a)?r=r.concat(a):r.push(a);if(r.length)for(t=0;t<r.length;t++)o[n=r[t].field]=o[n]||[],o[n].push(r[t]);else o=r=null;i(r,o)}),t=this.complete.length,(0,u.asyncMap)(e,this._options,function(e,t){var n=e.rule;function a(e){"boolean"==typeof e||e||(e=[]),e=(e=(e=Array.isArray(e)?e:[e]).length&&n.message?[].concat(n.message):e).map((0,u.complementError)(n)),t(e)}n.field=e.field;e=n.validator(n,e.value,a,r._options);e&&e.then&&e.then(function(){return a()},a)},function(e){r.complete[t-1](e)})):i&&i(null)}},{key:"validatePromise",value:(t=(0,i.default)(o.default.mark(function e(t){var n,a,r=this;return o.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(this._rules&&0!==Object.keys(this._rules).length){e.next=2;break}return e.abrupt("return",Promise.resolve({errors:null}));case 2:if(n=m(t,this._rules),0===Object.keys(n).length)return e.abrupt("return",Promise.resolve({errors:null}));e.next=5;break;case 5:return e.next=7,(0,u.asyncMapPromise)(n,this._options,function(){var t=(0,i.default)(o.default.mark(function e(t){var n,a;return o.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return(n=t.rule).field=t.field,e.prev=2,e.next=5,n.validator(n,t.value,null,r._options);case 5:a=e.sent,e.next=11;break;case 8:e.prev=8,e.t0=e.catch(2),a=e.t0;case 11:if(a)return(a=Array.isArray(a)?a:[a]).length&&n.message&&(a=[].concat(n.message)),e.abrupt("return",a.map((0,u.complementError)(n)));e.next=17;break;case 17:return e.abrupt("return",[]);case 18:case"end":return e.stop()}},e,null,[[2,8]])}));return function(e){return t.apply(this,arguments)}}());case 7:return a=e.sent,e.abrupt("return",(0,u.processErrorResults)(a));case 9:case"end":return e.stop()}},e,this)})),function(e){return t.apply(this,arguments)})}]),n}();t.default=a},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default={default:"%s 鏍¢獙澶辫触",required:"%s 鏄繀濉瓧娈�",format:{number:"%s 涓嶆槸鍚堟硶鐨勬暟瀛�",email:"%s 涓嶆槸鍚堟硶鐨� email 鍦板潃",url:"%s 涓嶆槸鍚堟硶鐨� URL 鍦板潃",tel:"%s 涓嶆槸鍚堟硶鐨勭數璇濆彿鐮�"},number:{length:"%s 闀垮害蹇呴』鏄� %s",min:"%s 瀛楁鏁板�间笉寰楀皬浜� %s",max:"%s 瀛楁鏁板�间笉寰楀ぇ浜� %s",minLength:"%s 瀛楁瀛楃闀垮害涓嶅緱灏戜簬 %s",maxLength:"%s 瀛楁瀛楃闀垮害涓嶅緱瓒呰繃 %s"},string:{length:"%s 闀垮害蹇呴』鏄� %s",min:"%s 瀛楁鏁板�间笉寰楀皬浜� %s",max:"%s 瀛楁鏁板�间笉寰楀ぇ浜� %s",minLength:"%s 瀛楁瀛楃闀垮害涓嶅緱灏戜簬 %s",maxLength:"%s 瀛楁瀛楃闀垮害涓嶅緱瓒呰繃 %s"},array:{length:"%s 涓暟蹇呴』鏄� %s",minLength:"%s 涓暟涓嶅緱灏戜簬 %s",maxLength:"%s 涓暟涓嶅緱瓒呰繃 %s"},pattern:"%s 瀛楁鏁板�� %s 涓嶅尮閰嶆鍒� %s"}},function(e,t,n){"use strict";var a=n(86),s=(Object.defineProperty(t,"__esModule",{value:!0}),t.validateFunc=r,t.getValidationMethod=function(e){if("function"==typeof e.validator)return e.validator;for(var t=Object.keys(e),n=0;n<t.length;n++){var a=t[n];if("required"!==a&&a in s.default)return r(s.default[a],a)}if("required"in e&&e.required)return r(s.default.required,"required");return null},a(n(560)));function r(i,l){return function(e,t,n,a){var r=[];if("required"!==l){var o=[];if(s.default.required(e,t,o,a),0<o.length)return"required"in e&&e.required?n?n(o):Promise.reject(o):n?n([]):Promise.resolve(null)}return i(e,t,r,a),n?n(r):Promise?Promise.resolve(r):void 0}}},function(e,t,n){"use strict";var a=n(86),r=(Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,a(n(561))),o=a(n(562)),i=a(n(563)),l=a(n(564)),a=a(n(565)),n={required:r.default,format:o.default,min:i.default,max:i.default,minLength:l.default,maxLength:l.default,length:l.default,pattern:a.default};t.default=n},function(e,t,n){"use strict";var a=n(110),r=(Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,a(n(97)));t.default=function(e,t,n,a){null!=t&&""!==t&&0!==t.length||n.push(r.format(a.messages.required,e.aliasName||e.field))}},function(e,t,n){"use strict";var a=n(110),o=(Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,a(n(97))),r={email:/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/,url:new RegExp("^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$","i"),number:/\d*/,tel:/^(1\d{10})$|(((400)-(\d{3})-(\d{4}))|^((\d{7,8})|(\d{3,4})-(\d{7,8})|(\d{7,8})-(\d{1,4}))$)$|^([ ]?)$/},i={number:function(e){return!isNaN(e)&&("number"==typeof e||"string"==typeof e&&!!e.match(r.number))},email:function(e){return"string"==typeof e&&!!e.match(r.email)&&e.length<255},url:function(e){return"string"==typeof e&&!!e.match(r.url)},tel:function(e){return"string"==typeof e&&!!e.match(r.tel)}};t.default=function(e,t,n,a){var r=e.format;-1<["email","number","url","tel"].indexOf(r)&&!i[r](t)&&n.push(o.format(a.messages.format[r],e.aliasName||e.field,e.format))}},function(e,t,n){"use strict";var a=n(110),s=(Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,a(n(97)));t.default=function(e,t,n,a){var r,o,i=null,l="string"==typeof t;if("number"==typeof t?i="number":l&&(i="string"),!i)return!1;void 0===e.min&&void 0===e.max||(t=t,r=Number(e.max),o=Number(e.min),(t=l?Number(t):t)<o?n.push(s.format(a.messages[i].min,e.aliasName||e.field,e.min)):r<t&&n.push(s.format(a.messages[i].max,e.aliasName||e.field,e.max)))}},function(e,t,n){"use strict";var a=n(110),u=(Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,a(n(97)));t.default=function(e,t,n,a){var r=null,o="number"==typeof t,i="string"==typeof t,l=Array.isArray(t);if(o?r="number":i?r="string":l&&(r="array"),!r)return!1;var i=t,l=Number(e.length),t=Number(e.maxLength),s=Number(e.minLength);(s||t||l)&&(i=(i=o?"".concat(i):i).length,l&&i!==e.length?n.push(u.format(a.messages[r].length,e.aliasName||e.field,e.length)):i<s?n.push(u.format(a.messages[r].minLength,e.aliasName||e.field,e.minLength)):t<i&&n.push(u.format(a.messages[r].maxLength,e.aliasName||e.field,e.maxLength)))}},function(e,t,n){"use strict";var a=n(110),r=(Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,a(n(97)));t.default=function(e,t,n,a){e.pattern&&(e.pattern instanceof RegExp?e.pattern.test(t)||n.push(r.format(a.messages.pattern,e.aliasName||e.field,t,e.pattern)):"string"!=typeof e.pattern||new RegExp(e.pattern).test(t)||n.push(r.format(a.messages.pattern,e.aliasName||e.field,t,e.pattern)))}},function(e,n,r){"use strict";!function(e){var t=r(86),i=(Object.defineProperty(n,"__esModule",{value:!0}),n.getIn=function(e,t){if(!e)return e;var n="string"==typeof t?t.replace(/\[/,".").replace(/\]/,"").split("."):"",a=n.length;if(!a)return;for(var r=e,o=0;o<a&&r;++o)r=r[n[o]];return r},n.setIn=function(e,t,n){return a(e,n,"string"==typeof t?t.replace(/\[/,".").replace(/\]/,"").split("."):"",0)},n.deleteIn=function(e,t){if(e){var n="string"==typeof t?t.replace(/\[/,".").replace(/\]/,"").split("."):"",a=n.length;if(a)for(var r=e,o=0;o<a&&r;++o)o===a-1?delete r[n[o]]:r=r[n[o]];return e}},n.getErrorStrs=function(e,t){if(e)return e.map(function(e){e=void 0!==e.message?e.message:e;return"function"==typeof t?t(e):e});return e},n.getParams=function(e,t){var e="string"==typeof e?[e]:e,n=t;void 0===t&&"function"==typeof e&&(n=e,e=void 0);return{names:e,callback:n}},n.getValueFromEvent=function(e){if(!e||!e.target)return e;e=e.target;{if("checkbox"===e.type)return e.checked;if("radio"===e.type&&!e.value)return e.checked}return e.value},n.mapValidateRules=function(e,i){var l={};return e.forEach(function(e){var t=l,n=i,a=(0,s.default)({},e);a.trigger||(a.trigger=[n]),"string"==typeof a.trigger&&(a.trigger=[a.trigger]);for(var r=0;r<a.trigger.length;r++){var o=a.trigger[r];o in t?t[o].push(a):t[o]=[a]}delete a.trigger}),l},n.warning=void 0,t(r(163))),s=t(r(73));var a=function e(t,n,a,r){if(r>=a.length)return n;var o=a[r],n=e(t&&t[o],n,a,r+1);return t?Array.isArray(t)?((a=[].concat(t))[o]=n,a):(0,s.default)({},t,(0,i.default)({},o,n)):((r=isNaN(o)?{}:[])[o]=n,r)};t=function(){};void 0!==e&&e.env,n.warning=t}.call(this,r(354))},function(e,t,n){"use strict";t.__esModule=!0,t.cloneAndAddKey=function(e){{var t;if(e&&(0,a.isValidElement)(e))return t=e.key||"error",(0,a.cloneElement)(e,{key:t})}return e},t.scrollToFirstError=function(e){var t=e.errorsGroup,n=e.options,a=e.instance;if(t&&n.scrollToFirstError){var r,o=void 0,i=void 0;for(r in t)if(t.hasOwnProperty(r)){var l=u.default.findDOMNode(a[r]);if(!l)return;var s=l.offsetTop;(void 0===i||s<i)&&(i=s,o=l)}o&&("number"==typeof n.scrollToFirstError&&window&&"function"==typeof window.scrollTo?(e=document&&document.body&&document.body.offsetLeft?document.body.offsetLeft:0,window.scrollTo(e,i+n.scrollToFirstError)):o.scrollIntoViewIfNeeded&&o.scrollIntoViewIfNeeded(!0))}};var a=n(0),t=n(23),u=(n=t)&&n.__esModule?n:{default:n}},function(e,t,n){"use strict";t.__esModule=!0;var a=d(n(4)),r=d(n(6)),o=d(n(7)),v=d(n(2)),_=d(n(38)),i=n(0),b=d(i),l=d(n(3)),w=d(n(13)),s=d(n(8)),u=n(11),M=n(356),k=d(M);function d(e){return e&&e.__esModule?e:{default:e}}function S(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{};return(0,v.default)({},(0,k.default)((0,v.default)({display:"flex"},arguments[1])),e)}var c,E=u.obj.pickOthers,i=(c=i.Component,(0,o.default)(x,c),x.prototype.render=function(){var i,l,s,u,e=this.props,t=e.prefix,n=e.direction,a=e.justify,r=e.align,o=e.wrap,d=e.flex,c=e.spacing,f=e.padding,p=e.margin,h=e.style,m=e.className,g=e.children,y=e.device,e=e.component,a={direction:n,justify:a,align:r,wrap:o,flex:d,spacing:c,padding:f,margin:p},r=e,d=E(Object.keys(x.propTypes),this.props),f=S(h,a),g=(p=g,i=(e={spacing:c,direction:n,wrap:o,device:y}).spacing,l=e.direction,s=e.wrap,e.device,u=b.default.Children.toArray(p),p?u.map(function(e,t){var n,a,r,o={},o=(0,M.getChildMargin)(i);return s||(n=[0===t,t===u.length-1],a="row"===l?["marginLeft","marginRight"]:["marginTop","marginBottom"],["marginTop","marginRight","marginBottom","marginLeft"].forEach(function(e){e in o&&-1===a.indexOf(e)&&(o[e]=0),a.forEach(function(e,t){e in o&&n[t]&&(o[e]=0)})})),b.default.isValidElement(e)?(t=e.props.margin,t=(0,M.getMargin)(t),r={},-1<["function","object"].indexOf((0,_.default)(e.type))&&"responsive_grid"===e.type._typeMark&&(r=(0,k.default)((0,v.default)({display:"grid"},e.props))),b.default.cloneElement(e,{style:(0,v.default)({},o,t,r,e.props.style||{})})):e}):null),y=(0,w.default)(((n={})[t+"box"]=!0,n),m);return o&&c?(e=function(e,t){e=S(e,t);return(0,M.filterOuterStyle)(e)}(h,a),p=function(e,t){e=S(e,t);return(0,M.filterHelperStyle)((0,v.default)({},e,(0,M.getSpacingHelperMargin)(t.spacing)))}(h,a),n=function(e,t){e=S(e,t);return(0,M.filterInnerStyle)(e)}(h,a),b.default.createElement(r,(0,v.default)({style:e,className:y},d),b.default.createElement("div",{style:p},b.default.createElement("div",{style:n,className:t+"box"},g)))):b.default.createElement(r,(0,v.default)({style:f,className:y},d),g)},u=n=x,n.propTypes={prefix:l.default.string,style:l.default.object,className:l.default.any,flex:l.default.oneOfType([l.default.arrayOf(l.default.oneOfType([l.default.number,l.default.string])),l.default.number]),direction:l.default.oneOf(["row","column","row-reverse"]),wrap:l.default.bool,spacing:l.default.oneOfType([l.default.arrayOf(l.default.number),l.default.number]),margin:l.default.oneOfType([l.default.arrayOf(l.default.number),l.default.number]),padding:l.default.oneOfType([l.default.arrayOf(l.default.number),l.default.number]),justify:l.default.oneOf(["flex-start","center","flex-end","space-between","space-around"]),align:l.default.oneOf(["flex-start","center","flex-end","baseline","stretch"]),device:l.default.oneOf(["phone","tablet","desktop"]),component:l.default.string},n.defaultProps={prefix:"next-",direction:"column",wrap:!1,component:"div"},u);function x(){return(0,a.default)(this,x),(0,r.default)(this,c.apply(this,arguments))}i.displayName="Box",t.default=s.default.config(i),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.filterUndefinedValue=function(n){if(!r(n))return n;var a={};return Object.keys(n).forEach(function(e){var t=n[e];void 0!==t&&(a[e]=t)}),a},t.stripObject=function(t,n){var a={};return Object.keys(t).forEach(function(e){e in n||(a[e]=t[e])}),a};var r=n(11).obj.isPlainObject},function(e,t,n){"use strict";t.__esModule=!0;var a=d(n(4)),r=d(n(6)),o=d(n(7)),i=n(0),l=d(i),s=d(n(3)),u=d(n(8));function d(e){return e&&e.__esModule?e:{default:e}}var c,f=n(11).obj.pickOthers,o=(c=i.Component,(0,o.default)(p,c),p.prototype.render=function(){var e=this.props,t=e.component,e=e.children,n=f(Object.keys(p.propTypes),this.props);return l.default.createElement(t,n,e)},i=n=p,n._typeMark="responsive_grid_cell",n.propTypes={device:s.default.oneOf(["phone","tablet","desktop"]),colSpan:s.default.oneOfType([s.default.number,s.default.object]),rowSpan:s.default.number,component:s.default.elementType},n.defaultProps={component:"div",device:"desktop"},i);function p(){return(0,a.default)(this,p),(0,r.default)(this,c.apply(this,arguments))}o.displayName="Cell",t.default=u.default.config(o),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var h=d(n(38)),m=d(n(2)),a=d(n(4)),r=d(n(6)),o=d(n(7)),g=d(n(0)),i=d(n(3)),p=d(n(13)),l=d(n(41)),s=d(n(355)),y=n(11),u=d(n(357)),v=n(574);function d(e){return e&&e.__esModule?e:{default:e}}var c,_=l.default.Row,b=l.default.Col,w=s.default.Cell,f=y.obj.isNil,s=(c=g.default.Component,(0,o.default)(M,c),M.prototype.getNames=function(e){var t=this.props.name,e=g.default.Children.toArray(e).filter(function(e){return e.props&&("name"in e.props||"data-meta"in e.props)}).map(function(e){return e.props.name||e.props.id});return e.length?e:t?[t]:[]},M.prototype.getHelper=function(e){var t=this.props.help,n=this.context._formField;return g.default.createElement(u.default,{name:void 0===t?this.getNames(e):void 0,field:n},t)},M.prototype.getState=function(e){var t=this.props.validateState;return t||(this.context._formField?(t=this.context._formField.getState,(e=this.getNames(e)).length?t(e[0]):""):void 0)},M.prototype.getSize=function(){return this.props.size||this.context._formSize},M.prototype.getDisabled=function(){return"disabled"in this.props?this.props.disabled:this.context._formDisabled},M.prototype.getIsPreview=function(){return"isPreview"in this.props?this.props.isPreview:this.context._formPreview},M.prototype.getFullWidth=function(){return f(this.props.fullWidth)?!!this.context._formFullWidth:this.props.fullWidth},M.prototype.getLabelForErrorMessage=function(){var e=this.props,t=e.errorMessageName,n=e.label,e=e.useLabelForErrorMessage;if(t)return t;if(!n||"string"!=typeof n)return null;t=n.replace(":","").replace("锛�","");return(e||this.context._formLabelForErrorMessage)&&t?t:null},M.prototype.getItemLabel=function(e){var t=this.props,n=t.id,a=t.required,r=t.asterisk,a=void 0===r?a:r,r=t.label,o=t.labelCol,i=t.wrapperCol,l=t.prefix,s=t.responsive,u=t.labelWidth,d=t.labelTextAlign,t=t.colon,c=this.getLabelAlign(this.props.labelAlign,this.props.device);if(!r)return null;n=g.default.createElement("label",{htmlFor:n||this.getNames(e)[0],required:a,key:"label"},r),a=(0,p.default)(((e={})[l+"form-item-label"]=!0,e["has-colon"]=t,e[l+"left"]="left"===d,e));return s&&u&&"top"!==c?g.default.createElement("div",{className:a,style:{width:u}},n):(i||o)&&"top"!==c?g.default.createElement(b,(0,m.default)({},o,{className:a}),n):g.default.createElement("div",{className:a},n)},M.prototype.getItemWrapper=function(e){var a=this,t=this.props,n=t.hasFeedback,r=t.labelCol,o=t.wrapperCol,i=t.extra,l=t.prefix,s=t.renderPreview,u=t.name,t=this.getLabelAlign(this.props.labelAlign,this.props.device),d=this.getState(e),c=this.getIsPreview(),f={size:this.getSize()},p=(c&&(f.isPreview=!0),"renderPreview"in this.props&&"function"==typeof s&&(f.renderPreview=s),d&&("error"===d||n)&&(f.state=d),"inset"===t&&(f.label=this.getItemLabel(e)),this.getDisabled()&&(f.disabled=!0),this.getLabelForErrorMessage()),c=g.default.Children.map(e,function(e,t){var n;return e&&-1<["function","object"].indexOf((0,h.default)(e.type))&&"form_item"!==e.type._typeMark&&"form_error"!==e.type._typeMark?(n=f,n=!a.context._formField||"data-meta"in e.props||!("name"in e.props||u&&0===t)?(0,m.default)({},e.props,n):(t="name"in e.props&&e.props.name?e.props.name:u,a.context._formField.init(t,(0,m.default)({},(0,v.getFieldInitCfg)(a.props,e.type.displayName,p),{props:(0,m.default)({},e.props,{ref:e.ref})}),f)),g.default.cloneElement(e,n)):e}),s=this.getHelper(e);return(o||r)&&"top"!==t?g.default.createElement(b,(0,m.default)({},o,{className:l+"form-item-control",key:"item"}),c," ",s," ",i):g.default.createElement("div",{className:l+"form-item-control"},c," ",s," ",i)},M.prototype.getLabelAlign=function(e,t){return"phone"===t?"top":e},M.prototype.render=function(){var e,t=this.props,n=t.className,a=t.style,r=t.prefix,o=t.wrapperCol,i=t.labelCol,l=t.responsive,t=t.children,s=this.getLabelAlign(this.props.labelAlign,this.props.device),u=t,t=("function"==typeof t&&this.context._formField&&(u=t(this.context._formField.getValues())),this.getState(u)),d=this.getSize(),c=this.getFullWidth(),f=this.getIsPreview(),t=(0,p.default)(((e={})[r+"form-item"]=!0,e[""+r+s]=s,e["has-"+t]=!!t,e[""+r+d]=!!d,e[r+"form-item-fullwidth"]=c,e[""+n]=!!n,e[r+"form-preview"]=f,e)),d=l?w:(o||i)&&"top"!==s?_:"div",c="inset"===s?null:this.getItemLabel(u);return g.default.createElement(d,(0,m.default)({},y.obj.pickOthers(M.propTypes,this.props),{className:t,style:a}),c,this.getItemWrapper(u))},l=n=M,n.propTypes={prefix:i.default.string,rtl:i.default.bool,label:i.default.node,labelCol:i.default.object,wrapperCol:i.default.object,help:i.default.node,name:i.default.string,extra:i.default.node,validateState:i.default.oneOf(["error","success","loading","warning"]),hasFeedback:i.default.bool,style:i.default.object,id:i.default.string,children:i.default.oneOfType([i.default.node,i.default.func]),size:i.default.oneOf(["large","small","medium"]),fullWidth:i.default.bool,labelAlign:i.default.oneOf(["top","left","inset"]),labelTextAlign:i.default.oneOf(["left","right"]),className:i.default.string,required:i.default.bool,asterisk:i.default.bool,requiredMessage:i.default.string,requiredTrigger:i.default.oneOfType([i.default.string,i.default.array]),min:i.default.number,max:i.default.number,minmaxMessage:i.default.string,minmaxTrigger:i.default.oneOfType([i.default.string,i.default.array]),minLength:i.default.number,maxLength:i.default.number,minmaxLengthMessage:i.default.string,minmaxLengthTrigger:i.default.oneOfType([i.default.string,i.default.array]),length:i.default.number,lengthMessage:i.default.string,lengthTrigger:i.default.oneOfType([i.default.string,i.default.array]),pattern:i.default.any,patternMessage:i.default.string,patternTrigger:i.default.oneOfType([i.default.string,i.default.array]),format:i.default.oneOf(["number","email","url","tel"]),formatMessage:i.default.string,formatTrigger:i.default.oneOfType([i.default.string,i.default.array]),validator:i.default.func,validatorTrigger:i.default.oneOfType([i.default.string,i.default.array]),autoValidate:i.default.bool,device:i.default.oneOf(["phone","tablet","desktop"]),responsive:i.default.bool,colSpan:i.default.number,labelWidth:i.default.oneOfType([i.default.string,i.default.number]),isPreview:i.default.bool,renderPreview:i.default.func,errorMessageName:i.default.string,useLabelForErrorMessage:i.default.bool,colon:i.default.bool,disabled:i.default.bool,valueName:i.default.string},n.defaultProps={prefix:"next-",hasFeedback:!1,labelWidth:100},n.contextTypes={_formField:i.default.object,_formSize:i.default.oneOf(["large","small","medium"]),_formDisabled:i.default.bool,_formPreview:i.default.bool,_formFullWidth:i.default.bool,_formLabelForErrorMessage:i.default.bool},n._typeMark="form_item",l);function M(){return(0,a.default)(this,M),(0,r.default)(this,c.apply(this,arguments))}s.displayName="Item",t.default=s,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var g=l(n(2)),y=l(n(12)),a=l(n(4)),r=l(n(6)),o=l(n(7)),v=n(0),_=l(v),i=l(n(3)),b=l(n(13));function l(e){return e&&e.__esModule?e:{default:e}}s=v.Component,(0,o.default)(u,s),u.prototype.render=function(){var e,t,n=this.props,a=n.prefix,r=(n.pure,n.wrap),o=n.fixed,i=n.gutter,l=n.fixedWidth,s=n.align,u=n.justify,d=n.hidden,c=n.className,f=n.component,p=n.children,h=n.rtl,n=(0,y.default)(n,["prefix","pure","wrap","fixed","gutter","fixedWidth","align","justify","hidden","className","component","children","rtl"]),m=void 0,r=(!0===d?((e={})[a+"row-hidden"]=!0,m=e):"string"==typeof d?((e={})[a+"row-"+d+"-hidden"]=!!d,m=e):Array.isArray(d)&&(m=d.reduce(function(e,t){return e[a+"row-"+t+"-hidden"]=!!t,e},{})),(0,b.default)((0,g.default)(((e={})[a+"row"]=!0,e[a+"row-wrap"]=r,e[a+"row-fixed"]=o,e[a+"row-fixed-"+l]=!!l,e[a+"row-justify-"+u]=!!u,e[a+"row-align-"+s]=!!s,e),m,((d={})[c]=!!c,d)))),o=p,l=parseInt(i,10);return 0!==l&&(n.style=(0,g.default)({marginLeft:"-"+(t=l/2+"px"),marginRight:"-"+t},n.style||{}),o=v.Children.map(p,function(e){return e&&e.type&&"function"==typeof e.type&&e.type.isNextCol?(0,v.cloneElement)(e,{style:(0,g.default)({paddingLeft:t,paddingRight:t},e.style||{})}):e})),_.default.createElement(f,(0,g.default)({dir:h?"rtl":"ltr",role:"row",className:r},n),o)},o=n=u,n.propTypes={prefix:i.default.string,pure:i.default.bool,rtl:i.default.bool,className:i.default.string,style:i.default.object,children:i.default.node,gutter:i.default.oneOfType([i.default.string,i.default.number]),wrap:i.default.bool,fixed:i.default.bool,fixedWidth:i.default.oneOf(["xxs","xs","s","m","l","xl"]),align:i.default.oneOf(["top","center","bottom","baseline","stretch"]),justify:i.default.oneOf(["start","center","end","space-between","space-around"]),hidden:i.default.oneOfType([i.default.bool,i.default.string,i.default.array]),component:i.default.oneOfType([i.default.string,i.default.func])},n.defaultProps={prefix:"next-",pure:!1,fixed:!1,gutter:0,wrap:!1,component:"div"};var s,i=o;function u(){return(0,a.default)(this,u),(0,r.default)(this,s.apply(this,arguments))}i.displayName="Row",t.default=i,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var g=s(n(2)),y=s(n(38)),v=s(n(12)),a=s(n(4)),r=s(n(6)),o=s(n(7)),i=n(0),_=s(i),l=s(n(3)),b=s(n(13));function s(e){return e&&e.__esModule?e:{default:e}}var u,w=["xxs","xs","s","m","l","xl"],o=(u=i.Component,(0,o.default)(d,u),d.prototype.render=function(){var e,a=this,t=this.props,r=t.prefix,n=(t.pure,t.span),o=t.offset,i=t.fixedSpan,l=t.fixedOffset,s=t.hidden,u=t.align,d=(t.xxs,t.xs,t.s,t.m,t.l,t.xl,t.component),c=t.className,f=t.children,p=t.rtl,t=(0,v.default)(t,["prefix","pure","span","offset","fixedSpan","fixedOffset","hidden","align","xxs","xs","s","m","l","xl","component","className","children","rtl"]),h=w.reduce(function(e,t){var n={};return"object"===(0,y.default)(a.props[t])?n=a.props[t]:n.span=a.props[t],e[r+"col-"+t+"-"+n.span]=!!n.span,e[r+"col-"+t+"-offset-"+n.offset]=!!n.offset,e},{}),m=void 0,n=(!0===s?((e={})[r+"col-hidden"]=!0,m=e):"string"==typeof s?((e={})[r+"col-"+s+"-hidden"]=!!s,m=e):Array.isArray(s)&&(m=s.reduce(function(e,t){return e[r+"col-"+t+"-hidden"]=!!t,e},{})),(0,b.default)((0,g.default)(((e={})[r+"col"]=!0,e[r+"col-"+n]=!!n,e[r+"col-fixed-"+i]=!!i,e[r+"col-offset-"+o]=!!o,e[r+"col-offset-fixed-"+l]=!!l,e[r+"col-"+u]=!!u,e),h,m,((s={})[c]=c,s))));return _.default.createElement(d,(0,g.default)({dir:p?"rtl":"ltr",role:"gridcell",className:n},t),f)},i=n=d,n.isNextCol=!0,n.propTypes={prefix:l.default.string,pure:l.default.bool,rtl:l.default.bool,className:l.default.string,children:l.default.node,span:l.default.oneOfType([l.default.string,l.default.number]),fixedSpan:l.default.oneOfType([l.default.string,l.default.number]),offset:l.default.oneOfType([l.default.string,l.default.number]),fixedOffset:l.default.oneOfType([l.default.string,l.default.number]),align:l.default.oneOf(["top","center","bottom","baseline","stretch"]),hidden:l.default.oneOfType([l.default.bool,l.default.string,l.default.array]),xxs:l.default.oneOfType([l.default.string,l.default.number,l.default.object]),xs:l.default.oneOfType([l.default.string,l.default.number,l.default.object]),s:l.default.oneOfType([l.default.string,l.default.number,l.default.object]),m:l.default.oneOfType([l.default.string,l.default.number,l.default.object]),l:l.default.oneOfType([l.default.string,l.default.number,l.default.object]),xl:l.default.oneOfType([l.default.string,l.default.number,l.default.object]),component:l.default.oneOfType([l.default.string,l.default.func])},n.defaultProps={prefix:"next-",pure:!1,component:"div"},i);function d(){return(0,a.default)(this,d),(0,r.default)(this,u.apply(this,arguments))}o.displayName="Col",t.default=o,e.exports=t.default},function(e,t,n){"use strict";function o(e,t){if(t in e)return e[t]}function i(e,t){var n={};return n[e]=t[e],n.message=o(t,e+"Message"),n.trigger=o(t,e+"Trigger"),n}function a(e,t){var n=[],a=(e.required&&n.push(i("required",e)),Number(e.maxLength)),r=Number(e.minLength),r=((r||a)&&n.push({minLength:r,maxLength:a,message:o(e,"minmaxLengthMessage")||o(e,"minLengthMessage")||o(e,"maxLengthMessage"),trigger:o(e,"minmaxLengthTrigger")||o(e,"minLengthTrigger")||o(e,"maxLengthTrigger")}),e.length&&n.push(i("length",e)),e.pattern&&n.push(i("pattern",e)),-1<["number","tel","url","email"].indexOf(e.format)&&n.push(i("format",e)),Number(e.max)),a=Number(e.min);return(r||a)&&n.push({min:a,max:r,message:o(e,"minmaxMessage")||o(e,"minMessage")||o(e,"maxMessage"),trigger:o(e,"minmaxTrigger")||o(e,"minTrigger")||o(e,"maxTrigger")}),e.validator&&"function"==typeof e.validator&&n.push({validator:e.validator,trigger:o(e,"validatorTrigger")}),t&&n.forEach(function(e){e.aliasName=t}),n}t.__esModule=!0,t.getRules=a,t.getFieldInitCfg=function(e,t,n){return{valueName:function(e,t){if(e.valueName)return e.valueName;if("string"==typeof t){e=t.replace(/Config\(/g,"").replace(/\)/g,"");if(-1!==["Switch","Checkbox","Radio"].indexOf(e))return"checked"}return"value"}(e,t),trigger:e.trigger||"onChange",autoValidate:e.autoValidate,rules:a(e,n)}}},function(e,t,n){"use strict";t.__esModule=!0;var a=c(n(2)),o=c(n(4)),i=c(n(6)),r=c(n(7)),l=c(n(0)),s=c(n(3)),u=c(n(18)),d=n(11);function c(e){return e&&e.__esModule?e:{default:e}}f=l.default.Component,(0,r.default)(p,f),p.prototype.render=function(){var e=this.props.children;return l.default.createElement(u.default,(0,a.default)({},d.obj.pickOthers(p.propTypes,this.props),{onClick:this.handleClick}),e)},r=n=p,n.propTypes={onClick:s.default.func,validate:s.default.oneOfType([s.default.bool,s.default.array]),field:s.default.object,children:s.default.node},n.defaultProps={onClick:d.func.noop},n.contextTypes={_formField:s.default.object};var f,n=r;function p(){var e,a;(0,o.default)(this,p);for(var t=arguments.length,n=Array(t),r=0;r<t;r++)n[r]=arguments[r];return(e=a=(0,i.default)(this,f.call.apply(f,[this].concat(n)))).handleClick=function(){var e=a.props,t=e.onClick,e=e.validate,n=a.context._formField||a.props.field;n?!0===e?n.validate(function(e){t(n.getValues(),e,n)}):Array.isArray(e)?n.validate(e,function(e){t(n.getValues(),e,n)}):t(n.getValues(),null,n):t()},(0,i.default)(a,e)}n.displayName="Submit",t.default=n,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var b=s(n(2)),w=s(n(38)),M=s(n(12)),o=s(n(4)),i=s(n(6)),a=s(n(7)),k=n(0),S=s(k),r=s(n(3)),E=s(n(13)),l=s(n(8)),x=n(11);function s(e){return e&&e.__esModule?e:{default:e}}function C(e){return{large:"small",medium:"xs",small:"xs"}[e]}u=k.Component,(0,a.default)(L,u),L.prototype.render=function(){var e=this.props,a=e.prefix,t=e.className,n=e.type,r=e.size,o=e.htmlType,i=e.loading,l=e.text,s=e.warning,u=e.ghost,d=e.component,c=e.iconSize,f=e.icons,p=e.disabled,h=e.onClick,m=e.children,g=e.rtl,e=(0,M.default)(e,["prefix","className","type","size","htmlType","loading","text","warning","ghost","component","iconSize","icons","disabled","onClick","children","rtl"]),y=0<=["light","dark"].indexOf(u)?u:"dark",n=((_={})[a+"btn"]=!0,_[""+a+r]=r,_[a+"btn-"+n]=n&&!u,_[a+"btn-text"]=l,_[a+"btn-warning"]=s,_[a+"btn-loading"]=i,_[a+"btn-ghost"]=u,_[a+"btn-"+y]=u,_[t]=t,_),l=null,v=(f&&f.loading&&(0,k.isValidElement)(f.loading)&&(i&&(delete n[a+"btn-loading"],n[a+"btn-custom-loading"]=!0),s=c||C(r),l=S.default.cloneElement(f.loading,{className:(0,E.default)(((y={})[a+"btn-custom-loading-icon"]=!0,y.show=i,y)),size:s})),k.Children.count(m)),u=k.Children.map(m,function(e,t){var n;return e&&-1<["function","object"].indexOf((0,w.default)(e.type))&&"icon"===e.type._typeMark?(t=(0,E.default)(((n={})[a+"btn-icon"]=!c,n[a+"icon-first"]=1<v&&0===t,n[a+"icon-last"]=1<v&&t===v-1,n[a+"icon-alone"]=1===v,n[e.props.className]=!!e.props.className,n)),"size"in e.props&&x.log.warning('The size of Icon will not take effect, when Icon is the [direct child element] of Button(<Button><Icon size="'+e.props.size+'" /></Button>), use <Button iconSize="'+e.props.size+'"> or <Button><div><Icon size="'+e.props.size+'" /></div></Button> instead of.'),S.default.cloneElement(e,{className:t,size:c||C(r)})):(0,k.isValidElement)(e)?e:S.default.createElement("span",{className:a+"btn-helper"},e)}),t=d,_=(0,b.default)({},x.obj.pickOthers(Object.keys(L.propTypes),e),{type:o,disabled:p,onClick:h,className:(0,E.default)(n)});return"button"!==t&&(delete _.type,_.disabled&&(delete _.onClick,_.href&&delete _.href)),S.default.createElement(t,(0,b.default)({},_,{dir:g?"rtl":void 0,onMouseUp:this.onMouseUp,ref:this.buttonRefHandler}),l,u)},a=n=L,n.propTypes=(0,b.default)({},l.default.propTypes,{prefix:r.default.string,rtl:r.default.bool,type:r.default.oneOf(["primary","secondary","normal"]),size:r.default.oneOf(["small","medium","large"]),icons:r.default.shape({loading:r.default.node}),iconSize:r.default.oneOfType([r.default.oneOf(["xxs","xs","small","medium","large","xl","xxl","xxxl","inherit"]),r.default.number]),htmlType:r.default.oneOf(["submit","reset","button"]),component:r.default.oneOf(["button","a","div","span"]),loading:r.default.bool,ghost:r.default.oneOf([!0,!1,"light","dark"]),text:r.default.bool,warning:r.default.bool,disabled:r.default.bool,onClick:r.default.func,className:r.default.string,onMouseUp:r.default.func,children:r.default.node}),n.defaultProps={prefix:"next-",type:"normal",size:"medium",icons:{},htmlType:"button",component:"button",loading:!1,ghost:!1,text:!1,warning:!1,disabled:!1,onClick:function(){}};var u,l=a;function L(){var e,t;(0,o.default)(this,L);for(var n=arguments.length,a=Array(n),r=0;r<n;r++)a[r]=arguments[r];return(e=t=(0,i.default)(this,u.call.apply(u,[this].concat(a)))).onMouseUp=function(e){t.button.blur(),t.props.onMouseUp&&t.props.onMouseUp(e)},t.buttonRefHandler=function(e){t.button=e},(0,i.default)(t,e)}l.displayName="Button",t.default=l,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var a,l=p(n(2)),s=p(n(12)),r=p(n(4)),o=p(n(6)),i=p(n(7)),u=n(0),d=p(u),c=p(n(3)),f=p(n(13)),n=p(n(8));function p(e){return e&&e.__esModule?e:{default:e}}h=u.Component,(0,i.default)(m,h),m.prototype.render=function(){var e,t=this.props,n=t.prefix,a=t.className,r=t.size,o=t.children,i=t.rtl,t=(0,s.default)(t,["prefix","className","size","children","rtl"]),n=(0,f.default)(((e={})[n+"btn-group"]=!0,e[a]=a,e)),a=u.Children.map(o,function(e){if(e)return d.default.cloneElement(e,{size:r})});return i&&(t.dir="rtl"),d.default.createElement("div",(0,l.default)({},t,{className:n}),a)},a=i=m,i.propTypes=(0,l.default)({},n.default.propTypes,{rtl:c.default.bool,prefix:c.default.string,size:c.default.string,className:c.default.string,children:c.default.node}),i.defaultProps={prefix:"next-",size:"medium"};var h,c=a;function m(){return(0,r.default)(this,m),(0,o.default)(this,h.apply(this,arguments))}c.displayName="ButtonGroup",t.default=n.default.config(c),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var a=c(n(2)),o=c(n(4)),i=c(n(6)),r=c(n(7)),l=c(n(0)),s=c(n(3)),u=c(n(18)),d=n(11);function c(e){return e&&e.__esModule?e:{default:e}}f=l.default.Component,(0,r.default)(p,f),p.prototype.render=function(){var e=this.props.children;return l.default.createElement(u.default,(0,a.default)({},d.obj.pickOthers(p.propTypes,this.props),{onClick:this.handleClick}),e)},r=n=p,n.propTypes={names:s.default.array,onClick:s.default.func,toDefault:s.default.bool,field:s.default.object,children:s.default.node},n.defaultProps={onClick:d.func.noop},n.contextTypes={_formField:s.default.object};var f,n=r;function p(){var e,r;(0,o.default)(this,p);for(var t=arguments.length,n=Array(t),a=0;a<t;a++)n[a]=arguments[a];return(e=r=(0,i.default)(this,f.call.apply(f,[this].concat(n)))).handleClick=function(){var e=r.props,t=e.names,n=e.toDefault,e=e.onClick,a=r.context._formField||r.props.field;a&&(n?a.resetToDefault(t):a.reset(t)),e()},(0,i.default)(r,e)}n.displayName="Reset",t.default=n,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var r=n(11),i=[];t.default={lock:function(e,t){var n=e.getAttribute("style"),a=(0,r.guid)();return i.push({uuid:a,container:e,originStyle:n}),r.dom.setStyle(e,t),a},unlock:function(t,n){var e,a,r=i.filter(function(e){return e.container===t}),o=r.find(function(e){return e.uuid===n});o&&(-1!==(e=r.indexOf(o))&&e<r.length-1?(a=o.originStyle,r[e+1].originStyle=a,i.splice(i.indexOf(o),1)):(t.setAttribute("style",o.originStyle||""),i.pop()))}},e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.withContext=t.confirm=t.help=t.warning=t.notice=t.error=t.success=t.alert=t.show=t.ModalInner=void 0;var y=p(n(12)),o=p(n(4)),i=p(n(6)),a=p(n(7)),v=p(n(2)),r=n(0),_=p(r),l=p(n(23)),s=p(n(3)),b=p(n(13)),u=p(n(8)),d=p(n(25)),c=p(n(44)),f=p(n(358)),n=p(n(359));function p(e){return e&&e.__esModule?e:{default:e}}function w(){}var h,M=u.default.config(f.default),k=u.default.config(n.default),m={alert:"warning",confirm:"help",success:"success",error:"error",warning:"warning",notice:"notice",help:"help"},S=t.ModalInner=function(e){var t=e.type,n=e.messageProps,n=void 0===n?{}:n,a=e.title,r=e.rtl,o=e.prefix,e=e.content;return _.default.createElement(d.default,(0,v.default)({size:"large",shape:"addon",type:m[t]},n,{title:a,rtl:r,className:(0,b.default)((void 0===o?"next-":o)+"dialog-message",n.className)}),e)},r=(h=r.Component,(0,a.default)(g,h),g.prototype.wrapper=function(t,n){var a=this;return function(){var e=t.apply(void 0,arguments);if(e&&e.then)a.loading(!0),e.then(function(e){if(a.loading(!1),!1!==e)return n()}).catch(function(e){throw a.loading(!1),e});else if(!1!==e)return n()}},g.prototype.render=function(){var e=this.props,t=e.prefix,n=e.type,a=e.title,r=e.content,o=e.messageProps,i=e.footerActions,l=e.onOk,s=e.onCancel,u=e.onClose,d=e.okProps,c=e.needWrapper,f=e.rtl,p=e.className,h=e.v2,m=e.width,m=void 0===m?420:m,e=(0,y.default)(e,["prefix","type","title","content","messageProps","footerActions","onOk","onCancel","onClose","okProps","needWrapper","rtl","className","v2","width"]),g=c&&n?null:a,c=c&&n?_.default.createElement(S,{type:n,messageProps:o,title:a,rtl:f,prefix:t,content:r}):r,o=i||("confirm"===n?["ok","cancel"]:-1<["alert","success","error","notice","warning","help"].indexOf(n)?["ok"]:void 0),a=this.wrapper(l,this.close),r=this.wrapper(s,this.close),i=this.wrapper(u,this.close),n=this.state,l=n.visible,s=n.loading,u=(0,v.default)({},d),n=("loading"in d||(u.loading=s),(0,b.default)(t+"dialog-quick",p));return _.default.createElement(h?k:M,(0,v.default)({prefix:t,role:"alertdialog"},e,{visible:l,title:g,rtl:f,footerActions:o,onOk:this.state.loading?w:a,onCancel:r,onClose:i,okProps:u,className:n,width:h?m:void 0}),c)},n=f=g,f.propTypes={prefix:s.default.string,pure:s.default.bool,rtl:s.default.bool,type:s.default.oneOf(["alert","confirm","success","error","notice","warning","help"]),title:s.default.node,content:s.default.node,messageProps:s.default.object,footerActions:s.default.array,onOk:s.default.func,onCancel:s.default.func,onClose:s.default.func,okProps:s.default.object,locale:s.default.object,needWrapper:s.default.bool,className:s.default.string},f.defaultProps={prefix:"next-",pure:!1,messageProps:{},onOk:w,onCancel:w,onClose:w,okProps:{},locale:c.default.Dialog,needWrapper:!0},n);function g(){var e,t;(0,o.default)(this,g);for(var n=arguments.length,a=Array(n),r=0;r<n;r++)a[r]=arguments[r];return(e=t=(0,i.default)(this,h.call.apply(h,[this].concat(a)))).state={visible:!0,loading:!1},t.close=function(){t.setState({visible:!1})},t.loading=function(e){t.setState({loading:e})},(0,i.default)(t,e)}r.displayName="Modal";function E(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},t=document.createElement("div"),n=(document.body.appendChild(t),(n=e.contextConfig)||u.default.getContext()),a=void 0,r=void 0;return l.default.render(_.default.createElement(u.default,n,_.default.createElement(C,(0,v.default)({},e,{afterClose:function(){e.afterClose&&e.afterClose(),l.default.unmountComponentAtNode(t),t.parentNode.removeChild(t)},ref:function(e){r=e}}))),t,function(){a=r}),{hide:function(){var e=a&&a.getInstance();e&&e.close()}}}function x(t){return function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{};return e.type=t,E(e)}}var C=u.default.config(r,{componentName:"Dialog"}),L=(t.show=E,x("alert")),T=(t.alert=L,x("success")),D=(t.success=T,x("error")),O=(t.error=D,x("notice")),N=(t.notice=O,x("warning")),P=(t.warning=N,x("help")),j=(t.help=P,x("confirm"));t.confirm=j,t.withContext=function(n){return function(t){return _.default.createElement(u.default.Consumer,null,function(e){return _.default.createElement(n,(0,v.default)({},t,{contextDialog:{show:function(){return E((0,v.default)({},0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},{contextConfig:e}))},alert:function(){return L((0,v.default)({},0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},{contextConfig:e}))},confirm:function(){return j((0,v.default)({},0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},{contextConfig:e}))},success:function(){return T((0,v.default)({},0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},{contextConfig:e}))},error:function(){return D((0,v.default)({},0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},{contextConfig:e}))},warning:function(){return N((0,v.default)({},0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},{contextConfig:e}))},notice:function(){return O((0,v.default)({},0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},{contextConfig:e}))},help:function(){return P((0,v.default)({},0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},{contextConfig:e}))}}}))})}}},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var r=f(n(2)),o=f(n(12)),i=f(n(4)),l=f(n(6)),a=f(n(7)),s=f(n(0)),u=f(n(3)),d=f(n(360)),c=f(n(24));function f(e){return e&&e.__esModule?e:{default:e}}function p(e){e.preventDefault()}h=d.default,(0,a.default)(m,h),m.prototype.render=function(){var e=this.props,t=e.showToggle,e=(0,o.default)(e,["showToggle"]),n=this.state,a=n.hint,n=n.htmlType,t=t?s.default.createElement(c.default,{type:a,onClick:this.toggleEye,onMouseDown:p}):null;return s.default.createElement(d.default,(0,r.default)({},e,{extra:t,htmlType:n}))},a=n=m,n.getDerivedStateFromProps=d.default.getDerivedStateFromProps,n.propTypes=(0,r.default)({},d.default.propTypes,{showToggle:u.default.bool}),n.defaultProps=(0,r.default)({},d.default.defaultProps,{showToggle:!0});var h,u=a;function m(){var e,t;(0,i.default)(this,m);for(var n=arguments.length,a=Array(n),r=0;r<n;r++)a[r]=arguments[r];return(e=t=(0,l.default)(this,h.call.apply(h,[this].concat(a)))).state={hint:"eye-close",htmlType:"password"},t.toggleEye=function(e){e.preventDefault(),t.props.disabled||(e="eye"===t.state.hint,t.setState({hint:e?"eye-close":"eye",htmlType:e||!t.props.showToggle?"password":"text"}))},(0,l.default)(t,e)}t.default=u,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var a,r,m=c(n(2)),o=c(n(38)),i=c(n(4)),l=c(n(6)),s=c(n(7)),g=c(n(0)),u=c(n(23)),d=c(n(3)),y=c(n(13)),v=n(11),n=c(n(361));function c(e){return e&&e.__esModule?e:{default:e}}var f,p=!("undefined"==typeof navigator||!navigator||!navigator.userAgent)&&navigator.userAgent.match(/^((?!chrome|android|windows).)*safari/i),_={visibility:"hidden",position:"absolute",zIndex:"-1000",top:"-1000px",overflowY:"hidden",left:0,right:0},d=(f=n.default,(0,s.default)(b,f),b.prototype.componentDidMount=function(){var e=this.props.autoHeight;e&&("object"===(void 0===e?"undefined":(0,o.default)(e))?this.setState(this._getMinMaxHeight(e,this.state.value)):this.setState({height:this._getHeight(this.state.value),overflowY:"hidden"}))},b.prototype.componentDidUpdate=function(e){this.props.autoHeight&&this.props.value!==e.value&&this._resizeTextArea(this.props.value)},b.prototype._getMinMaxHeight=function(e,t){var n=e.minRows,e=e.maxRows,a=u.default.findDOMNode(this.helpRef);if(!a)return{};a.setAttribute("rows",n);n=a.clientHeight,a.setAttribute("rows",e),e=a.clientHeight,a.setAttribute("rows","1"),a=this._getHeight(t);return{minHeight:n,maxHeight:e,height:a,overflowY:a<=e?"hidden":void 0}},b.prototype._getHeight=function(e){var t=u.default.findDOMNode(this.helpRef);return t?(t.value=e,t.scrollHeight):0},b.prototype.ieHack=function(e){var t;return 9===v.env.ieVersion&&this.props.maxLength&&(t=parseInt(this.props.maxLength))<this.getValueLength(e,!0)&&this.props.cutString&&(e=(e=(e=e.replace(/\n/g,"\n\n")).substr(0,t)).replace(/\n\n/g,"\n")),this.props.autoHeight&&this._resizeTextArea(e),e},b.prototype.getValueLength=function(e){var t=this.props,n=t.maxLength,t=t.cutString,e=""+e,a=this.props.getValueLength(e);return"number"!=typeof a&&(a=e.length),a=(v.env.ieVersion||p)&&n<(a=a+e.split("\n").length-1)&&t?n:a},b.prototype.saveTextAreaRef=function(e){this.inputRef=e},b.prototype.saveHelpRef=function(e){this.helpRef=e},b.prototype.render=function(){var e,t=this.props,n=t.rows,a=t.style,r=t.className,o=t.autoHeight,i=t.isPreview,l=t.renderPreview,s=t.prefix,u=t.rtl,d=t.hasBorder,c=t.size,t=t.composition,c=(0,y.default)(this.getClass(),((f={})[""+s+c]="large"===c||!1,f[s+"input-textarea"]=!0,f[s+"noborder"]=!d,f[r]=!!r,f)),d=this.getProps(),f=v.obj.pickAttrsWith(this.props,"data-"),p=v.obj.pickOthers((0,m.default)({},f,b.propTypes),this.props),h=(0,m.default)({},d.style,{height:this.state.height,minHeight:this.state.minHeight,maxHeight:this.state.maxHeight,overflowY:this.state.overflowY}),s=(0,y.default)(((e={})[s+"input-textarea"]=!0,e[s+"form-preview"]=!0,e[r]=!!r,e)),r=o?(0,m.default)({},a,{position:"relative"}):a;if(i)return e=d.value,"renderPreview"in this.props?g.default.createElement("div",(0,m.default)({},p,{className:s}),l(e,this.props)):g.default.createElement("div",(0,m.default)({},p,{className:s}),e.split("\n").map(function(e,t){return g.default.createElement("p",{key:"p-"+t},e)}));a={};return t&&(a.onCompositionStart=this.handleCompositionStart,a.onCompositionEnd=this.handleCompositionEnd),g.default.createElement("span",(0,m.default)({className:c,style:r,dir:u?"rtl":void 0},f),g.default.createElement("textarea",(0,m.default)({},p,d,a,{"data-real":!0,rows:n,style:h,ref:this.saveRef.bind(this),onKeyDown:this.onKeyDown.bind(this)})),o?g.default.createElement("textarea",{"data-fake":!0,ref:this.saveHelpRef.bind(this),style:(0,m.default)({},d.style,_),rows:"1"}):null,this.renderControl())},a=s=b,s.getDerivedStateFromProps=n.default.getDerivedStateFromProps,s.propTypes=(0,m.default)({},n.default.propTypes,{hasBorder:d.default.bool,state:d.default.oneOf(["error","warning"]),autoHeight:d.default.oneOfType([d.default.bool,d.default.object]),rows:d.default.number,isPreview:d.default.bool,renderPreview:d.default.func}),s.defaultProps=(0,m.default)({},n.default.defaultProps,{hasBorder:!0,isPreview:!1,rows:4,autoHeight:!1}),r=function(){var a=this;this._resizeTextArea=function(n){var e;a.nextFrameActionId&&(e=a.nextFrameActionId,window.cancelAnimationFrame?window.cancelAnimationFrame(e):window.clearTimeout(e)),a.nextFrameActionId=(e=function(){var e=a._getHeight(n),t=a.state.maxHeight||1/0;a.setState({height:a._getHeight(n),overflowY:e<=t?"hidden":void 0})},window.requestAnimationFrame?window.requestAnimationFrame(e):window.setTimeout(e,1))}},a);function b(e){(0,i.default)(this,b);var t=(0,l.default)(this,f.call(this,e)),n=(r.call(t),void 0),n="value"in e?e.value:e.defaultValue;return t.state={value:void 0===n?"":n},t}t.default=d,e.exports=t.default},function(e,t,n){"use strict";var a=n(56),r=n(363),o=n(584),i=n(369);function l(e){var e=new o(e),t=r(o.prototype.request,e);return a.extend(t,o.prototype,e),a.extend(t,e),t}var s=l(n(165));s.Axios=o,s.create=function(e){return l(i(s.defaults,e))},s.Cancel=n(370),s.CancelToken=n(598),s.isCancel=n(368),s.all=function(e){return Promise.all(e)},s.spread=n(599),s.isAxiosError=n(600),e.exports=s,e.exports.default=s},function(e,t,n){"use strict";var a=n(56),r=n(364),o=n(585),d=n(586),c=n(369),f=n(596),p=f.validators;function i(e){this.defaults=e,this.interceptors={request:new o,response:new o}}i.prototype.request=function(t){"string"==typeof t?(t=arguments[1]||{}).url=arguments[0]:t=t||{},(t=c(this.defaults,t)).method?t.method=t.method.toLowerCase():this.defaults.method?t.method=this.defaults.method.toLowerCase():t.method="get";var e,n=t.transitional,a=(void 0!==n&&f.assertOptions(n,{silentJSONParsing:p.transitional(p.boolean,"1.0.0"),forcedJSONParsing:p.transitional(p.boolean,"1.0.0"),clarifyTimeoutError:p.transitional(p.boolean,"1.0.0")},!1),[]),r=!0,o=(this.interceptors.request.forEach(function(e){"function"==typeof e.runWhen&&!1===e.runWhen(t)||(r=r&&e.synchronous,a.unshift(e.fulfilled,e.rejected))}),[]);if(this.interceptors.response.forEach(function(e){o.push(e.fulfilled,e.rejected)}),r){for(var i=t;a.length;){var l=a.shift(),s=a.shift();try{i=l(i)}catch(e){s(e);break}}try{e=d(i)}catch(e){return Promise.reject(e)}for(;o.length;)e=e.then(o.shift(),o.shift())}else{var u=[d,void 0];for(Array.prototype.unshift.apply(u,a),u=u.concat(o),e=Promise.resolve(t);u.length;)e=e.then(u.shift(),u.shift())}return e},i.prototype.getUri=function(e){return e=c(this.defaults,e),r(e.url,e.params,e.paramsSerializer).replace(/^\?/,"")},a.forEach(["delete","get","head","options"],function(n){i.prototype[n]=function(e,t){return this.request(c(t||{},{method:n,url:e,data:(t||{}).data}))}}),a.forEach(["post","put","patch"],function(a){i.prototype[a]=function(e,t,n){return this.request(c(n||{},{method:a,url:e,data:t}))}}),e.exports=i},function(e,t,n){"use strict";var a=n(56);function r(){this.handlers=[]}r.prototype.use=function(e,t,n){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!n&&n.synchronous,runWhen:n?n.runWhen:null}),this.handlers.length-1},r.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},r.prototype.forEach=function(t){a.forEach(this.handlers,function(e){null!==e&&t(e)})},e.exports=r},function(e,t,n){"use strict";var a=n(56),r=n(587),o=n(368),i=n(165);function l(e){e.cancelToken&&e.cancelToken.throwIfRequested()}e.exports=function(t){return l(t),t.headers=t.headers||{},t.data=r.call(t,t.data,t.headers,t.transformRequest),t.headers=a.merge(t.headers.common||{},t.headers[t.method]||{},t.headers),a.forEach(["delete","get","head","post","put","patch","common"],function(e){delete t.headers[e]}),(t.adapter||i.adapter)(t).then(function(e){return l(t),e.data=r.call(t,e.data,e.headers,t.transformResponse),e},function(e){return o(e)||(l(t),e&&e.response&&(e.response.data=r.call(t,e.response.data,e.response.headers,t.transformResponse))),Promise.reject(e)})}},function(e,t,n){"use strict";var r=n(56),o=n(165);e.exports=function(t,n,e){var a=this||o;return r.forEach(e,function(e){t=e.call(a,t,n)}),t}},function(e,t,n){"use strict";var r=n(56);e.exports=function(n,a){r.forEach(n,function(e,t){t!==a&&t.toUpperCase()===a.toUpperCase()&&(n[a]=e,delete n[t])})}},function(e,t,n){"use strict";var r=n(367);e.exports=function(e,t,n){var a=n.config.validateStatus;n.status&&a&&!a(n.status)?t(r("Request failed with status code "+n.status,n.config,null,n.request,n)):e(n)}},function(e,t,n){"use strict";var l=n(56);e.exports=l.isStandardBrowserEnv()?{write:function(e,t,n,a,r,o){var i=[];i.push(e+"="+encodeURIComponent(t)),l.isNumber(n)&&i.push("expires="+new Date(n).toGMTString()),l.isString(a)&&i.push("path="+a),l.isString(r)&&i.push("domain="+r),!0===o&&i.push("secure"),document.cookie=i.join("; ")},read:function(e){e=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return e?decodeURIComponent(e[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},function(e,t,n){"use strict";var a=n(592),r=n(593);e.exports=function(e,t){return e&&!a(t)?r(e,t):t}},function(e,t,n){"use strict";e.exports=function(e){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(e)}},function(e,t,n){"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},function(e,t,n){"use strict";var r=n(56),o=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,n,a={};return e&&r.forEach(e.split("\n"),function(e){n=e.indexOf(":"),t=r.trim(e.substr(0,n)).toLowerCase(),n=r.trim(e.substr(n+1)),!t||a[t]&&0<=o.indexOf(t)||(a[t]="set-cookie"===t?(a[t]||[]).concat([n]):a[t]?a[t]+", "+n:n)}),a}},function(e,t,n){"use strict";var a,r,o,i=n(56);function l(e){return r&&(o.setAttribute("href",e),e=o.href),o.setAttribute("href",e),{href:o.href,protocol:o.protocol?o.protocol.replace(/:$/,""):"",host:o.host,search:o.search?o.search.replace(/^\?/,""):"",hash:o.hash?o.hash.replace(/^#/,""):"",hostname:o.hostname,port:o.port,pathname:"/"===o.pathname.charAt(0)?o.pathname:"/"+o.pathname}}e.exports=i.isStandardBrowserEnv()?(r=/(msie|trident)/i.test(navigator.userAgent),o=document.createElement("a"),a=l(window.location.href),function(e){e=i.isString(e)?l(e):e;return e.protocol===a.protocol&&e.host===a.host}):function(){return!0}},function(e,t,n){"use strict";var l=n(597),a={},s=(["object","boolean","number","function","string","symbol"].forEach(function(t,n){a[t]=function(e){return typeof e===t||"a"+(n<1?"n ":" ")+t}}),{}),o=l.version.split(".");function u(e,t){for(var n=t?t.split("."):o,a=e.split("."),r=0;r<3;r++){if(n[r]>a[r])return!0;if(n[r]<a[r])return!1}return!1}a.transitional=function(a,r,n){var o=r&&u(r);function i(e,t){return"[Axios v"+l.version+"] Transitional option '"+e+"'"+t+(n?". "+n:"")}return function(e,t,n){if(!1===a)throw new Error(i(t," has been removed in "+r));return o&&!s[t]&&(s[t]=!0,console.warn(i(t," has been deprecated since v"+r+" and will be removed in the near future"))),!a||a(e,t,n)}},e.exports={isOlderVersion:u,assertOptions:function(e,t,n){if("object"!=typeof e)throw new TypeError("options must be an object");for(var a=Object.keys(e),r=a.length;0<r--;){var o=a[r],i=t[o];if(i){var l=e[o],i=void 0===l||i(l,o,e);if(!0!==i)throw new TypeError("option "+o+" must be "+i)}else if(!0!==n)throw Error("Unknown option "+o)}},validators:a}},function(e){e.exports=JSON.parse('{"_from":"axios@0.21.4","_id":"axios@0.21.4","_inBundle":false,"_integrity":"sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==","_location":"/axios","_phantomChildren":{},"_requested":{"type":"version","registry":true,"raw":"axios@0.21.4","name":"axios","escapedName":"axios","rawSpec":"0.21.4","saveSpec":null,"fetchSpec":"0.21.4"},"_requiredBy":["/"],"_resolved":"https://registry.npmjs.org/axios/-/axios-0.21.4.tgz","_shasum":"c67b90dc0568e5c1cf2b0b858c43ba28e2eda575","_spec":"axios@0.21.4","_where":"/Users/xiweng.yy/Documents/java/opensource/nacos/console-ui","author":{"name":"Matt Zabriskie"},"browser":{"./lib/adapters/http.js":"./lib/adapters/xhr.js"},"bugs":{"url":"https://github.com/axios/axios/issues"},"bundleDependencies":false,"bundlesize":[{"path":"./dist/axios.min.js","threshold":"5kB"}],"dependencies":{"follow-redirects":"^1.14.0"},"deprecated":false,"description":"Promise based HTTP client for the browser and node.js","devDependencies":{"coveralls":"^3.0.0","es6-promise":"^4.2.4","grunt":"^1.3.0","grunt-banner":"^0.6.0","grunt-cli":"^1.2.0","grunt-contrib-clean":"^1.1.0","grunt-contrib-watch":"^1.0.0","grunt-eslint":"^23.0.0","grunt-karma":"^4.0.0","grunt-mocha-test":"^0.13.3","grunt-ts":"^6.0.0-beta.19","grunt-webpack":"^4.0.2","istanbul-instrumenter-loader":"^1.0.0","jasmine-core":"^2.4.1","karma":"^6.3.2","karma-chrome-launcher":"^3.1.0","karma-firefox-launcher":"^2.1.0","karma-jasmine":"^1.1.1","karma-jasmine-ajax":"^0.1.13","karma-safari-launcher":"^1.0.0","karma-sauce-launcher":"^4.3.6","karma-sinon":"^1.0.5","karma-sourcemap-loader":"^0.3.8","karma-webpack":"^4.0.2","load-grunt-tasks":"^3.5.2","minimist":"^1.2.0","mocha":"^8.2.1","sinon":"^4.5.0","terser-webpack-plugin":"^4.2.3","typescript":"^4.0.5","url-search-params":"^0.10.0","webpack":"^4.44.2","webpack-dev-server":"^3.11.0"},"homepage":"https://axios-http.com","jsdelivr":"dist/axios.min.js","keywords":["xhr","http","ajax","promise","node"],"license":"MIT","main":"index.js","name":"axios","repository":{"type":"git","url":"git+https://github.com/axios/axios.git"},"scripts":{"build":"NODE_ENV=production grunt build","coveralls":"cat coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js","examples":"node ./examples/server.js","fix":"eslint --fix lib/**/*.js","postversion":"git push && git push --tags","preversion":"npm test","start":"node ./sandbox/server.js","test":"grunt test","version":"npm run build && grunt version && git add -A dist && git add CHANGELOG.md bower.json package.json"},"typings":"./index.d.ts","unpkg":"dist/axios.min.js","version":"0.21.4"}')},function(e,t,n){"use strict";var a=n(370);function r(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");this.promise=new Promise(function(e){t=e});var t,n=this;e(function(e){n.reason||(n.reason=new a(e),t(n.reason))})}r.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},r.source=function(){var t;return{token:new r(function(e){t=e}),cancel:t}},e.exports=r},function(e,t,n){"use strict";e.exports=function(t){return function(e){return t.apply(null,e)}}},function(e,t,n){"use strict";e.exports=function(e){return"object"==typeof e&&!0===e.isAxiosError}},function(e,t,n){"use strict";function l(e,t){for(var n,a=e;null!==(n=a.next);a=n)if(n.key===t)return a.next=n.next,n.next=e.next,e.next=n}var a=n(166),r=n(606),s=n(608),u=a("%TypeError%"),d=a("%WeakMap%",!0),c=a("%Map%",!0),f=r("WeakMap.prototype.get",!0),p=r("WeakMap.prototype.set",!0),h=r("WeakMap.prototype.has",!0),m=r("Map.prototype.get",!0),g=r("Map.prototype.set",!0),y=r("Map.prototype.has",!0);e.exports=function(){var r,o,i,t={assert:function(e){if(!t.has(e))throw new u("Side channel does not contain "+s(e))},get:function(e){if(d&&e&&("object"==typeof e||"function"==typeof e)){if(r)return f(r,e)}else if(c){if(o)return m(o,e)}else{var t;if(i)return(t=l(t=i,e))&&t.value}},has:function(e){if(d&&e&&("object"==typeof e||"function"==typeof e)){if(r)return h(r,e)}else if(c){if(o)return y(o,e)}else if(i)return!!l(i,e);return!1},set:function(e,t){var n,a;d&&e&&("object"==typeof e||"function"==typeof e)?(r=r||new d,p(r,e,t)):c?(o=o||new c,g(o,e,t)):(t=t,(a=l(n=i=i||{key:{},next:null},e=e))?a.value=t:n.next={key:e,next:n.next,value:t})}};return t}},function(e,t,n){"use strict";var a="undefined"!=typeof Symbol&&Symbol,r=n(603);e.exports=function(){return"function"==typeof a&&("function"==typeof Symbol&&("symbol"==typeof a("foo")&&("symbol"==typeof Symbol("bar")&&r())))}},function(e,t,n){"use strict";e.exports=function(){if("function"!=typeof Symbol||"function"!=typeof Object.getOwnPropertySymbols)return!1;if("symbol"!=typeof Symbol.iterator){var e={},t=Symbol("test"),n=Object(t);if("string"==typeof t)return!1;if("[object Symbol]"!==Object.prototype.toString.call(t))return!1;if("[object Symbol]"!==Object.prototype.toString.call(n))return!1;for(t in e[t]=42,e)return!1;if("function"==typeof Object.keys&&0!==Object.keys(e).length)return!1;if("function"==typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(e).length)return!1;n=Object.getOwnPropertySymbols(e);if(1!==n.length||n[0]!==t)return!1;if(!Object.prototype.propertyIsEnumerable.call(e,t))return!1;if("function"==typeof Object.getOwnPropertyDescriptor){n=Object.getOwnPropertyDescriptor(e,t);if(42!==n.value||!0!==n.enumerable)return!1}}return!0}},function(e,t,n){"use strict";var s=Array.prototype.slice,u=Object.prototype.toString;e.exports=function(t){var n=this;if("function"!=typeof n||"[object Function]"!==u.call(n))throw new TypeError("Function.prototype.bind called on incompatible "+n);for(var a,e,r=s.call(arguments,1),o=Math.max(0,n.length-r.length),i=[],l=0;l<o;l++)i.push("$"+l);return a=Function("binder","return function ("+i.join(",")+"){ return binder.apply(this,arguments); }")(function(){var e;return this instanceof a?(e=n.apply(this,r.concat(s.call(arguments))),Object(e)===e?e:this):n.apply(t,r.concat(s.call(arguments)))}),n.prototype&&((e=function(){}).prototype=n.prototype,a.prototype=new e,e.prototype=null),a}},function(e,t,n){"use strict";n=n(167);e.exports=n.call(Function.call,Object.prototype.hasOwnProperty)},function(e,t,n){"use strict";var a=n(166),r=n(607),o=r(a("String.prototype.indexOf"));e.exports=function(e,t){t=a(e,!!t);return"function"==typeof t&&-1<o(e,".prototype.")?r(t):t}},function(e,t,n){"use strict";var a=n(167),n=n(166),r=n("%Function.prototype.apply%"),o=n("%Function.prototype.call%"),i=n("%Reflect.apply%",!0)||a.call(o,r),l=n("%Object.getOwnPropertyDescriptor%",!0),s=n("%Object.defineProperty%",!0),u=n("%Math.max%");if(s)try{s({},"a",{value:1})}catch(e){s=null}e.exports=function(e){var t=i(a,o,arguments);return l&&s&&l(t,"length").configurable&&s(t,"length",{value:1+u(0,e.length-(arguments.length-1))}),t};function d(){return i(a,r,arguments)}s?s(e.exports,"apply",{value:d}):e.exports.apply=d},function(n,a,o){var e="function"==typeof Map&&Map.prototype,t=Object.getOwnPropertyDescriptor&&e?Object.getOwnPropertyDescriptor(Map.prototype,"size"):null,_=e&&t&&"function"==typeof t.get?t.get:null,J=e&&Map.prototype.forEach,t="function"==typeof Set&&Set.prototype,e=Object.getOwnPropertyDescriptor&&t?Object.getOwnPropertyDescriptor(Set.prototype,"size"):null,b=t&&e&&"function"==typeof e.get?e.get:null,X=t&&Set.prototype.forEach,w="function"==typeof WeakMap&&WeakMap.prototype?WeakMap.prototype.has:null,M="function"==typeof WeakSet&&WeakSet.prototype?WeakSet.prototype.has:null,k="function"==typeof WeakRef&&WeakRef.prototype?WeakRef.prototype.deref:null,Q=Boolean.prototype.valueOf,i=Object.prototype.toString,Z=Function.prototype.toString,ee=String.prototype.match,S=String.prototype.slice,E=String.prototype.replace,l=String.prototype.toUpperCase,x=String.prototype.toLowerCase,d=RegExp.prototype.test,C=Array.prototype.concat,L=Array.prototype.join,te=Array.prototype.slice,r=Math.floor,T="function"==typeof BigInt?BigInt.prototype.valueOf:null,c=Object.getOwnPropertySymbols,D="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?Symbol.prototype.toString:null,O="function"==typeof Symbol&&"object"==typeof Symbol.iterator,N="function"==typeof Symbol&&Symbol.toStringTag&&(typeof Symbol.toStringTag===O||"symbol")?Symbol.toStringTag:null,P=Object.prototype.propertyIsEnumerable,j=("function"==typeof Reflect?Reflect:Object).getPrototypeOf||([].__proto__===Array.prototype?function(e){return e.__proto__}:null);function Y(e,t){if(e===1/0||e===-1/0||e!=e||e&&-1e3<e&&e<1e3||d.call(/e/,t))return t;var n=/[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;if("number"==typeof e){var a=e<0?-r(-e):r(e);if(a!==e)return e=String(a),a=S.call(t,e.length+1),E.call(e,n,"$&_")+"."+E.call(E.call(a,/([0-9]{3})/g,"$&_"),/_$/,"")}return E.call(t,n,"$&_")}var I=o(609),e=I.custom,R=z(e)?e:null;function A(e,t,n){n="double"===(n.quoteStyle||t)?'"':"'";return n+e+n}function H(e){return!("[object Array]"!==V(e)||N&&"object"==typeof e&&N in e)}function F(e){return!("[object RegExp]"!==V(e)||N&&"object"==typeof e&&N in e)}function z(e){if(O)return e&&"object"==typeof e&&e instanceof Symbol;if("symbol"==typeof e)return 1;if(e&&"object"==typeof e&&D)try{return D.call(e),1}catch(e){}}n.exports=function a(n,e,r,o){var i=e||{};if(W(i,"quoteStyle")&&"single"!==i.quoteStyle&&"double"!==i.quoteStyle)throw new TypeError('option "quoteStyle" must be "single" or "double"');if(W(i,"maxStringLength")&&("number"==typeof i.maxStringLength?i.maxStringLength<0&&i.maxStringLength!==1/0:null!==i.maxStringLength))throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');e=!W(i,"customInspect")||i.customInspect;if("boolean"!=typeof e&&"symbol"!==e)throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`");if(W(i,"indent")&&null!==i.indent&&"\t"!==i.indent&&!(parseInt(i.indent,10)===i.indent&&0<i.indent))throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');if(W(i,"numericSeparator")&&"boolean"!=typeof i.numericSeparator)throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');var t=i.numericSeparator;if(void 0===n)return"undefined";if(null===n)return"null";if("boolean"==typeof n)return n?"true":"false";if("string"==typeof n)return function e(t,n){if(t.length>n.maxStringLength)return a=t.length-n.maxStringLength,a="... "+a+" more character"+(1<a?"s":""),e(S.call(t,0,n.maxStringLength),n)+a;var a=E.call(E.call(t,/(['\\])/g,"\\$1"),/[\x00-\x1f]/g,ne);return A(a,"single",n)}(n,i);if("number"==typeof n){if(0===n)return 0<1/0/n?"0":"-0";var l=String(n);return t?Y(n,l):l}if("bigint"==typeof n)return l=String(n)+"n",t?Y(n,l):l;t=void 0===i.depth?5:i.depth;if(t<=(r=void 0===r?0:r)&&0<t&&"object"==typeof n)return H(n)?"[Array]":"[Object]";var s,u,d,c,f,p,l=function(e,t){var n;if("\t"===e.indent)n="\t";else{if(!("number"==typeof e.indent&&0<e.indent))return null;n=L.call(Array(e.indent+1)," ")}return{base:n,prev:L.call(Array(t+1),n)}}(i,r);if(void 0===o)o=[];else if(0<=B(o,n))return"[Circular]";function h(e,t,n){return t&&(o=te.call(o)).push(t),n?(t={depth:i.depth},W(i,"quoteStyle")&&(t.quoteStyle=i.quoteStyle),a(e,t,r+1,o)):a(e,i,r+1,o)}if("function"==typeof n&&!F(n))return"[Function"+((v=function(e){if(e.name)return e.name;e=ee.call(Z.call(e),/^function\s*([\w$]+)/);if(e)return e[1];return null}(n))?": "+v:" (anonymous)")+"]"+(0<(v=$(n,h)).length?" { "+L.call(v,", ")+" }":"");if(z(n))return v=O?E.call(String(n),/^(Symbol\(.*\))_[^)]*$/,"$1"):D.call(n),"object"!=typeof n||O?v:U(v);if(function(e){if(!e||"object"!=typeof e)return;if("undefined"!=typeof HTMLElement&&e instanceof HTMLElement)return 1;return"string"==typeof e.nodeName&&"function"==typeof e.getAttribute}(n)){for(var m="<"+x.call(String(n.nodeName)),g=n.attributes||[],y=0;y<g.length;y++)m+=" "+g[y].name+"="+A((s=g[y].value,E.call(String(s),/"/g,"&quot;")),"double",i);return m+=">",n.childNodes&&n.childNodes.length&&(m+="..."),m+="</"+x.call(String(n.nodeName))+">"}if(H(n)){if(0===n.length)return"[]";var v=$(n,h);return l&&!function(e){for(var t=0;t<e.length;t++)if(0<=B(e[t],"\n"))return;return 1}(v)?"["+q(v,l)+"]":"[ "+L.call(v,", ")+" ]"}if(!("[object Error]"!==V(v=n)||N&&"object"==typeof v&&N in v))return c=$(n,h),"cause"in Error.prototype||!("cause"in n)||P.call(n,"cause")?0===c.length?"["+String(n)+"]":"{ ["+String(n)+"] "+L.call(c,", ")+" }":"{ ["+String(n)+"] "+L.call(C.call("[cause]: "+h(n.cause),c),", ")+" }";if("object"==typeof n&&e){if(R&&"function"==typeof n[R]&&I)return I(n,{depth:t-r});if("symbol"!==e&&"function"==typeof n.inspect)return n.inspect()}return function(e){if(_&&e&&"object"==typeof e)try{_.call(e);try{b.call(e)}catch(e){return 1}return e instanceof Map}catch(e){}return}(n)?(u=[],J.call(n,function(e,t){u.push(h(t,n,!0)+" => "+h(e,n))}),G("Map",_.call(n),u,l)):function(e){if(b&&e&&"object"==typeof e)try{b.call(e);try{_.call(e)}catch(e){return 1}return e instanceof Set}catch(e){}return}(n)?(d=[],X.call(n,function(e){d.push(h(e,n))}),G("Set",b.call(n),d,l)):function(e){if(w&&e&&"object"==typeof e)try{w.call(e,w);try{M.call(e,M)}catch(e){return 1}return e instanceof WeakMap}catch(e){}return}(n)?K("WeakMap"):function(e){if(M&&e&&"object"==typeof e)try{M.call(e,M);try{w.call(e,w)}catch(e){return 1}return e instanceof WeakSet}catch(e){}return}(n)?K("WeakSet"):function(e){if(k&&e&&"object"==typeof e)try{return k.call(e),1}catch(e){}return}(n)?K("WeakRef"):"[object Number]"!==V(c=n)||N&&"object"==typeof c&&N in c?function(e){if(e&&"object"==typeof e&&T)try{return T.call(e),1}catch(e){}return}(n)?U(h(T.call(n))):"[object Boolean]"!==V(t=n)||N&&"object"==typeof t&&N in t?"[object String]"!==V(e=n)||N&&"object"==typeof e&&N in e?("[object Date]"!==V(t=n)||N&&"object"==typeof t&&N in t)&&!F(n)?(e=$(n,h),t=j?j(n)===Object.prototype:n instanceof Object||n.constructor===Object,f=n instanceof Object?"":"null prototype",p=!t&&N&&Object(n)===n&&N in n?S.call(V(n),8,-1):f?"Object":"",t=(!t&&"function"==typeof n.constructor&&n.constructor.name?n.constructor.name+" ":"")+(p||f?"["+L.call(C.call([],p||[],f||[]),": ")+"] ":""),0===e.length?t+"{}":l?t+"{"+q(e,l)+"}":t+"{ "+L.call(e,", ")+" }"):String(n):U(h(String(n))):U(Q.call(n)):U(h(Number(n)))};var s=Object.prototype.hasOwnProperty||function(e){return e in this};function W(e,t){return s.call(e,t)}function V(e){return i.call(e)}function B(e,t){if(e.indexOf)return e.indexOf(t);for(var n=0,a=e.length;n<a;n++)if(e[n]===t)return n;return-1}function ne(e){var e=e.charCodeAt(0),t={8:"b",9:"t",10:"n",12:"f",13:"r"}[e];return t?"\\"+t:"\\x"+(e<16?"0":"")+l.call(e.toString(16))}function U(e){return"Object("+e+")"}function K(e){return e+" { ? }"}function G(e,t,n,a){return e+" ("+t+") {"+(a?q(n,a):L.call(n,", "))+"}"}function q(e,t){if(0===e.length)return"";var n="\n"+t.prev+t.base;return n+L.call(e,","+n)+"\n"+t.prev}function $(e,t){var n=H(e),a=[];if(n){a.length=e.length;for(var r=0;r<e.length;r++)a[r]=W(e,r)?t(e[r],e):""}var o,i="function"==typeof c?c(e):[];if(O)for(var l={},s=0;s<i.length;s++)l["$"+i[s]]=i[s];for(o in e)!W(e,o)||n&&String(Number(o))===o&&o<e.length||O&&l["$"+o]instanceof Symbol||(d.call(/[^\w$]/,o)?a.push(t(o,e)+": "+t(e[o],e)):a.push(o+": "+t(e[o],e)));if("function"==typeof c)for(var u=0;u<i.length;u++)P.call(e,i[u])&&a.push("["+t(i[u])+"]: "+t(e[i[u]],e));return a}},function(e,t){},function(e,t,n){"use strict";function s(e,t){var n,a,r,o,i={},e=t.ignoreQueryPrefix?e.replace(/^\?/,""):e,l=t.parameterLimit===1/0?void 0:t.parameterLimit,s=e.split(t.delimiter,l),u=-1,d=t.charset;if(t.charsetSentinel)for(n=0;n<s.length;++n)0===s[n].indexOf("utf8=")&&("utf8=%E2%9C%93"===s[n]?d="utf-8":"utf8=%26%2310003%3B"===s[n]&&(d="iso-8859-1"),u=n,n=s.length);for(n=0;n<s.length;++n)n!==u&&((o=-1===(o=-1===(o=(a=s[n]).indexOf("]="))?a.indexOf("="):o+1)?(r=t.decoder(a,p.decoder,d,"key"),t.strictNullHandling?null:""):(r=t.decoder(a.slice(0,o),p.decoder,d,"key"),c.maybeMap(v(a.slice(o+1),t),function(e){return t.decoder(e,p.decoder,d,"value")})))&&t.interpretNumericEntities&&"iso-8859-1"===d&&(o=o.replace(/&#(\d+);/g,function(e,t){return String.fromCharCode(parseInt(t,10))})),-1<a.indexOf("[]=")&&(o=f(o)?[o]:o),y.call(i,r)?i[r]=c.combine(i[r],o):i[r]=o);return i}function u(e,t,n,a){if(e){var r=n.allowDots?e.replace(/\.([^.[]+)/g,"[$1]"):e,o=/(\[[^[\]]*])/g,i=0<n.depth&&/(\[[^[\]]*])/.exec(r),e=i?r.slice(0,i.index):r,l=[];if(e){if(!n.plainObjects&&y.call(Object.prototype,e)&&!n.allowPrototypes)return;l.push(e)}for(var s=0;0<n.depth&&null!==(i=o.exec(r))&&s<n.depth;){if(s+=1,!n.plainObjects&&y.call(Object.prototype,i[1].slice(1,-1))&&!n.allowPrototypes)return;l.push(i[1])}i&&l.push("["+r.slice(i.index)+"]");for(var u=l,e=t,d=n,c=a?e:v(e,d),f=u.length-1;0<=f;--f){var p,h,m,g=u[f];"[]"===g&&d.parseArrays?p=[].concat(c):(p=d.plainObjects?Object.create(null):{},h="["===g.charAt(0)&&"]"===g.charAt(g.length-1)?g.slice(1,-1):g,m=parseInt(h,10),d.parseArrays||""!==h?!isNaN(m)&&g!==h&&String(m)===h&&0<=m&&d.parseArrays&&m<=d.arrayLimit?(p=[])[m]=c:"__proto__"!==h&&(p[h]=c):p={0:c}),c=p}return c}}var c=n(372),y=Object.prototype.hasOwnProperty,f=Array.isArray,p={allowDots:!1,allowPrototypes:!1,allowSparse:!1,arrayLimit:20,charset:"utf-8",charsetSentinel:!1,comma:!1,decoder:c.decode,delimiter:"&",depth:5,ignoreQueryPrefix:!1,interpretNumericEntities:!1,parameterLimit:1e3,parseArrays:!0,plainObjects:!1,strictNullHandling:!1},v=function(e,t){return e&&"string"==typeof e&&t.comma&&-1<e.indexOf(",")?e.split(","):e};e.exports=function(e,t){var n=function(e){if(!e)return p;if(null!==e.decoder&&void 0!==e.decoder&&"function"!=typeof e.decoder)throw new TypeError("Decoder has to be a function.");if(void 0!==e.charset&&"utf-8"!==e.charset&&"iso-8859-1"!==e.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var t=(void 0===e.charset?p:e).charset;return{allowDots:void 0===e.allowDots?p.allowDots:!!e.allowDots,allowPrototypes:("boolean"==typeof e.allowPrototypes?e:p).allowPrototypes,allowSparse:("boolean"==typeof e.allowSparse?e:p).allowSparse,arrayLimit:("number"==typeof e.arrayLimit?e:p).arrayLimit,charset:t,charsetSentinel:("boolean"==typeof e.charsetSentinel?e:p).charsetSentinel,comma:("boolean"==typeof e.comma?e:p).comma,decoder:("function"==typeof e.decoder?e:p).decoder,delimiter:("string"==typeof e.delimiter||c.isRegExp(e.delimiter)?e:p).delimiter,depth:"number"==typeof e.depth||!1===e.depth?+e.depth:p.depth,ignoreQueryPrefix:!0===e.ignoreQueryPrefix,interpretNumericEntities:("boolean"==typeof e.interpretNumericEntities?e:p).interpretNumericEntities,parameterLimit:("number"==typeof e.parameterLimit?e:p).parameterLimit,parseArrays:!1!==e.parseArrays,plainObjects:("boolean"==typeof e.plainObjects?e:p).plainObjects,strictNullHandling:("boolean"==typeof e.strictNullHandling?e:p).strictNullHandling}}(t);if(""===e||null==e)return n.plainObjects?Object.create(null):{};for(var a="string"==typeof e?s(e,n):e,r=n.plainObjects?Object.create(null):{},o=Object.keys(a),i=0;i<o.length;++i)var l=o[i],l=u(l,a[l],n,"string"==typeof e),r=c.merge(r,l,n);return!0===n.allowSparse?r:c.compact(r)}},function(e,t,n){},function(e,t){e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var o=c(n(2)),a=c(n(4)),r=c(n(6)),i=c(n(7)),l=n(0),s=c(l),u=c(n(3)),d=c(n(62)),n=n(11);function c(e){return e&&e.__esModule?e:{default:e}}var f,p=n.func.noop,h=n.func.makeChain,m=n.func.bindCtx,g=d.default.Popup,i=(f=l.Component,(0,i.default)(y,f),y.getDerivedStateFromProps=function(e){var t={};return"visible"in e&&(t.visible=e.visible),t},y.prototype.getVisible=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:this.props;return("visible"in e?e:this.state).visible},y.prototype.onMenuClick=function(){var e=this.props.autoClose;"visible"in this.props||!e||this.setState({visible:!1}),this.onVisibleChange(!1,"fromContent")},y.prototype.onVisibleChange=function(e,t){this.setState({visible:e}),this.props.onVisibleChange(e,t)},y.prototype.onTriggerKeyDown=function(){var e=!0;"autoFocus"in this.props&&(e=this.props.autoFocus),this.setState({autoFocus:e})},y.prototype.render=function(){var e=this.props,t=e.trigger,n=e.rtl,e=e.autoClose,a=l.Children.only(this.props.children),r=a,e=("function"==typeof a.type&&a.type.isNextMenu?r=s.default.cloneElement(a,{onItemClick:h(this.onMenuClick,a.props.onItemClick)}):e&&(r=s.default.cloneElement(a,{onClick:h(this.onMenuClick,a.props.onClick)})),s.default.cloneElement(t,{onKeyDown:h(this.onTriggerKeyDown,t.props.onKeyDown)}));return s.default.createElement(g,(0,o.default)({},this.props,{rtl:n,autoFocus:this.state.autoFocus,trigger:e,visible:this.getVisible(),onVisibleChange:this.onVisibleChange,canCloseByOutSideClick:!0}),r)},d=n=y,n.propTypes={prefix:u.default.string,pure:u.default.bool,rtl:u.default.bool,className:u.default.string,children:u.default.node,visible:u.default.bool,defaultVisible:u.default.bool,onVisibleChange:u.default.func,trigger:u.default.node,triggerType:u.default.oneOfType([u.default.string,u.default.array]),disabled:u.default.bool,align:u.default.string,offset:u.default.array,delay:u.default.number,autoFocus:u.default.bool,hasMask:u.default.bool,autoClose:u.default.bool,cache:u.default.bool,animation:u.default.oneOfType([u.default.object,u.default.bool])},n.defaultProps={prefix:"next-",pure:!1,defaultVisible:!1,autoClose:!1,onVisibleChange:p,triggerType:"hover",disabled:!1,align:"tl bl",offset:[0,0],delay:200,hasMask:!1,cache:!1,onPosition:p},d);function y(e){(0,a.default)(this,y);var t=(0,r.default)(this,f.call(this,e));return t.state={visible:"visible"in e?e.visible:e.defaultVisible||!1,autoFocus:"autoFocus"in e&&e.autoFocus},m(t,["onTriggerKeyDown","onMenuClick","onVisibleChange"]),t}i.displayName="Dropdown",t.default=i,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var a=f(n(2)),r=f(n(12)),o=f(n(4)),i=f(n(6)),l=f(n(7)),s=n(0),u=f(s),d=f(n(3)),c=f(n(376));function f(e){return e&&e.__esModule?e:{default:e}}p=s.Component,(0,l.default)(h,p),h.prototype.render=function(){var e=this.props,t=e.checkboxDisabled,e=(0,r.default)(e,["checkboxDisabled"]);return u.default.createElement(c.default,(0,a.default)({role:"menuitemcheckbox",checkType:"checkbox",checkDisabled:t},e))},s=n=h,n.menuChildType="item",n.propTypes={checked:d.default.bool,indeterminate:d.default.bool,disabled:d.default.bool,onChange:d.default.func,helper:d.default.node,children:d.default.node,checkboxDisabled:d.default.bool},n.defaultProps={checked:!1,indeterminate:!1,disabled:!1,onChange:function(){},checkboxDisabled:!1};var p,l=s;function h(){return(0,o.default)(this,h),(0,i.default)(this,p.apply(this,arguments))}l.displayName="CheckboxItem",t.default=l,e.exports=t.default},function(e,t,n){e.exports={default:n(616),__esModule:!0}},function(e,t,n){n(617);var a=n(77).Object;e.exports=function(e,t,n){return a.defineProperty(e,t,n)}},function(e,t,n){var a=n(91);a(a.S+a.F*!n(78),"Object",{defineProperty:n(84).f})},function(e,t,n){"use strict";t.__esModule=!0;var a=u(n(2)),r=u(n(4)),o=u(n(6)),i=u(n(7));t.default=function(n){var e,t;return t=e=function(e){function t(){return(0,r.default)(this,t),(0,o.default)(this,e.apply(this,arguments))}return(0,i.default)(t,e),t.prototype.render=function(){return l.default.createElement(n,(0,a.default)({},this.props,{context:this.context}))},t}(l.default.Component),e.displayName="Checkbox",e.contextTypes={onChange:s.default.func,__group__:s.default.bool,selectedValue:s.default.array,disabled:s.default.bool,prefix:s.default.string},t};var l=u(n(0)),s=u(n(3));function u(e){return e&&e.__esModule?e:{default:e}}e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var f=d(n(2)),p=d(n(38)),a=d(n(4)),r=d(n(6)),o=d(n(7)),i=n(0),h=d(i),l=d(n(3)),m=d(n(13)),s=n(30),u=n(11),g=d(n(377));function d(e){return e&&e.__esModule?e:{default:e}}var c,y=u.obj.pickOthers,i=(c=i.Component,(0,o.default)(v,c),v.prototype.getChildContext=function(){return{__group__:!0,onChange:this.onChange,selectedValue:this.state.value,disabled:this.props.disabled}},v.getDerivedStateFromProps=function(e){return"value"in e?(e=e.value,{value:e=Array.isArray(e)?e:null==e?[]:[e]}):null},v.prototype.onChange=function(e,t){var n=this.state.value,a=n.indexOf(e),n=[].concat(n);-1===a?n.push(e):n.splice(a,1),"value"in this.props||this.setState({value:n}),this.props.onChange(n,t)},v.prototype.render=function(){var a=this,e=this.props,t=e.className,n=e.style,r=e.prefix,o=e.disabled,i=e.direction,l=e.rtl,s=e.isPreview,e=e.renderPreview,u=y(v.propTypes,this.props),d=void 0,c=[],d=this.props.children?h.default.Children.map(this.props.children,function(e){return h.default.isValidElement(e)?(a.state.value&&-1<a.state.value.indexOf(e.props.value)&&c.push({label:e.props.children,value:e.props.value}),h.default.cloneElement(e,void 0===e.props.rtl?{rtl:l}:null)):e}):this.props.dataSource.map(function(e,t){var n=e,e=("object"!==(void 0===e?"undefined":(0,p.default)(e))&&(n={label:e,value:e,disabled:o}),a.state.value&&-1<a.state.value.indexOf(n.value));return e&&c.push({label:n.label,value:n.value}),h.default.createElement(g.default,{key:t,value:n.value,checked:e,rtl:l,disabled:o||n.disabled,label:n.label})});if(s)return s=(0,m.default)(t,r+"form-preview"),"renderPreview"in this.props?h.default.createElement("div",(0,f.default)({},u,{dir:l?"rtl":void 0,className:s}),e(c,this.props)):h.default.createElement("p",(0,f.default)({},u,{dir:l?"rtl":void 0,className:s}),c.map(function(e){return e.label}).join(", "));s=(0,m.default)(((e={})[r+"checkbox-group"]=!0,e[r+"checkbox-group-"+i]=!0,e[t]=!!t,e.disabled=o,e));return h.default.createElement("span",(0,f.default)({dir:l?"rtl":void 0},u,{className:s,style:n}),d)},u=n=v,n.propTypes={prefix:l.default.string,rtl:l.default.bool,className:l.default.string,style:l.default.object,disabled:l.default.bool,dataSource:l.default.oneOfType([l.default.arrayOf(l.default.string),l.default.arrayOf(l.default.object)]),value:l.default.oneOfType([l.default.array,l.default.string,l.default.number]),defaultValue:l.default.oneOfType([l.default.array,l.default.string,l.default.number]),children:l.default.arrayOf(l.default.element),onChange:l.default.func,direction:l.default.oneOf(["hoz","ver"]),isPreview:l.default.bool,renderPreview:l.default.func},n.defaultProps={dataSource:[],onChange:function(){},prefix:"next-",direction:"hoz",isPreview:!1},n.childContextTypes={onChange:l.default.func,__group__:l.default.bool,selectedValue:l.default.array,disabled:l.default.bool},u);function v(e){(0,a.default)(this,v);var t=(0,r.default)(this,c.call(this,e)),n=[];return"value"in e?n=e.value:"defaultValue"in e&&(n=e.defaultValue),Array.isArray(n)||(n=null==n?[]:[n]),t.state={value:[].concat(n)},t.onChange=t.onChange.bind(t),t}i.displayName="CheckboxGroup",t.default=(0,s.polyfill)(i),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var a=u(n(2)),r=u(n(4)),o=u(n(6)),i=u(n(7));t.default=function(n){var e,t;return t=e=function(e){function t(){return(0,r.default)(this,t),(0,o.default)(this,e.apply(this,arguments))}return(0,i.default)(t,e),t.prototype.render=function(){return l.default.createElement(n,(0,a.default)({},this.props,{context:this.context}))},t}(l.default.Component),e.displayName="Radio",e.contextTypes={onChange:s.default.func,__group__:s.default.bool,isButton:s.default.bool,selectedValue:s.default.oneOfType([s.default.string,s.default.number,s.default.bool]),disabled:s.default.bool},t};var l=u(n(0)),s=u(n(3));function u(e){return e&&e.__esModule?e:{default:e}}e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var m=c(n(2)),g=c(n(38)),a=c(n(4)),r=c(n(6)),o=c(n(7)),i=n(0),y=c(i),l=c(n(3)),v=c(n(13)),s=n(30),u=c(n(8)),d=n(11),_=c(n(380));function c(e){return e&&e.__esModule?e:{default:e}}var f,b=d.obj.pickOthers,i=(f=i.Component,(0,o.default)(w,f),w.getDerivedStateFromProps=function(e,t){return"value"in e&&e.value!==t.value?{value:e.value}:null},w.prototype.getChildContext=function(){var e=this.props.disabled;return{__group__:!0,isButton:"button"===this.props.shape,onChange:this.onChange,selectedValue:this.state.value,disabled:e}},w.prototype.onChange=function(e,t){"value"in this.props||this.setState({value:e}),e!==this.state.value&&this.props.onChange(e,t)},w.prototype.render=function(){var r=this,e=this.props,o=e.rtl,t=e.className,a=e.disabled,n=e.shape,i=e.size,l=e.style,s=e.prefix,u=e.direction,d=e.component,c=e.isPreview,e=e.renderPreview,f=b(Object.keys(w.propTypes),this.props),p=(o&&(f.dir="rtl"),void 0),h={},p=this.props.children?y.default.Children.map(this.props.children,function(e,t){if(!y.default.isValidElement(e))return e;var n=r.state.value===e.props.value,t=(n&&(h.label=e.props.children,h.value=e.props.value),0===t&&!r.state.value||n?0:-1),a=void 0===e.props.rtl?o:e.props.rtl;return e.type&&"Config(Radio)"===e.type.displayName?y.default.cloneElement(e,{checked:n,tabIndex:t,rtl:a}):y.default.cloneElement(e,{checked:n,rtl:a})}):this.props.dataSource.map(function(e,t){var n=e,e=("object"!==(void 0===e?"undefined":(0,g.default)(e))&&(n={label:e,value:e,disabled:a}),r.state.value===n.value);return e&&(h.label=n.label,h.value=n.value),y.default.createElement(_.default,{key:t,tabIndex:0===t&&!r.state.value||e?0:-1,value:n.value,checked:e,label:n.label,disabled:a||n.disabled})});if(c)return c=(0,v.default)(t,s+"form-preview"),"renderPreview"in this.props?y.default.createElement("div",(0,m.default)({},f,{className:c}),e(h,this.props)):y.default.createElement("p",(0,m.default)({},f,{className:c}),h.label);e="button"===n,n=(0,v.default)(((c={})[s+"radio-group"]=!0,c[s+"radio-group-"+u]=!e,c[s+"radio-button"]=e,c[s+"radio-button-"+i]=e,c[t]=!!t,c.disabled=a,c));return y.default.createElement(d,(0,m.default)({},f,{"aria-disabled":a,role:"radiogroup",className:n,style:l}),p)},d=n=w,n.propTypes=(0,m.default)({},u.default.propTypes,{prefix:l.default.string,className:l.default.string,style:l.default.object,name:l.default.string,value:l.default.oneOfType([l.default.string,l.default.number,l.default.bool]),defaultValue:l.default.oneOfType([l.default.string,l.default.number,l.default.bool]),component:l.default.oneOfType([l.default.string,l.default.func]),onChange:l.default.func,disabled:l.default.bool,shape:l.default.oneOf(["normal","button"]),size:l.default.oneOf(["large","medium","small"]),dataSource:l.default.oneOfType([l.default.arrayOf(l.default.string),l.default.arrayOf(l.default.object)]),children:l.default.oneOfType([l.default.arrayOf(l.default.element),l.default.element]),direction:l.default.oneOf(["hoz","ver"]),isPreview:l.default.bool,renderPreview:l.default.func}),n.defaultProps={dataSource:[],size:"medium",onChange:function(){},prefix:"next-",component:"div",direction:"hoz",isPreview:!1},n.childContextTypes={onChange:l.default.func,__group__:l.default.bool,isButton:l.default.bool,selectedValue:l.default.oneOfType([l.default.string,l.default.number,l.default.bool]),disabled:l.default.bool},d);function w(e){(0,a.default)(this,w);var t=(0,r.default)(this,f.call(this,e)),n="";return"value"in e?n=e.value:"defaultValue"in e&&(n=e.defaultValue),t.state={value:n},t.onChange=t.onChange.bind(t),t}i.displayName="RadioGroup",t.default=(0,s.polyfill)(i),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var a=c(n(2)),r=c(n(4)),o=c(n(6)),i=c(n(7)),l=n(0),s=c(l),u=c(n(3)),d=c(n(376));function c(e){return e&&e.__esModule?e:{default:e}}f=l.Component,(0,i.default)(p,f),p.prototype.render=function(){return s.default.createElement(d.default,(0,a.default)({role:"menuitemradio",checkType:"radio"},this.props))},l=n=p,n.menuChildType="item",n.propTypes={checked:u.default.bool,disabled:u.default.bool,onChange:u.default.func,helper:u.default.node,children:u.default.node},n.defaultProps={checked:!1,disabled:!1,onChange:function(){}};var f,i=l;function p(){return(0,r.default)(this,p),(0,o.default)(this,f.apply(this,arguments))}i.displayName="RadioItem",t.default=i,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var s=l(n(2)),u=l(n(38)),d=l(n(12)),a=l(n(4)),r=l(n(6)),o=l(n(7)),c=n(0),f=l(c),i=l(n(3)),p=l(n(13)),h=l(n(98));function l(e){return e&&e.__esModule?e:{default:e}}m=c.Component,(0,o.default)(g,m),g.prototype.render=function(){var e=this.props,t=e.root,n=e.className,a=e.label,r=e.children,o=e.parentMode,e=(0,d.default)(e,["root","className","label","children","parentMode"]),i=t.props.prefix,n=(0,p.default)(((l={})[i+"menu-group-label"]=!0,l[n]=!!n,l)),l=r.map(function(e){var t;if("function"!=typeof e&&"object"!==(void 0===e?"undefined":(0,u.default)(e)))return e;var n=e.props.className,n=(0,p.default)(((t={})[i+"menu-group-item"]=!0,t[n]=!!n,t));return(0,c.cloneElement)(e,{parentMode:o,className:n})});return[f.default.createElement(h.default,(0,s.default)({key:"menu-group-label",className:n,replaceClassName:!0,root:t,parentMode:o},e),a)].concat(l)},o=n=g,n.menuChildType="group",n.propTypes={root:i.default.object,className:i.default.string,label:i.default.node,children:i.default.node,parentMode:i.default.oneOf(["inline","popup"])};var m,n=o;function g(){return(0,a.default)(this,g),(0,r.default)(this,m.apply(this,arguments))}n.displayName="Group",t.default=n,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var r=f(n(2)),o=f(n(12)),a=f(n(4)),i=f(n(6)),l=f(n(7)),s=n(0),u=f(s),d=f(n(3)),c=f(n(13));function f(e){return e&&e.__esModule?e:{default:e}}p=s.Component,(0,l.default)(h,p),h.prototype.render=function(){var e,t=this.props,n=t.root,a=t.className,t=(t.parentMode,t.parent,(0,o.default)(t,["root","className","parentMode","parent"])),n=n.props.prefix,n=(0,c.default)(((e={})[n+"menu-divider"]=!0,e[a]=!!a,e));return u.default.createElement("li",(0,r.default)({role:"separator",className:n},t))},s=n=h,n.menuChildType="divider",n.propTypes={root:d.default.object,className:d.default.string};var p,l=s;function h(){return(0,a.default)(this,h),(0,i.default)(this,p.apply(this,arguments))}l.displayName="Divider",t.default=l,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var c=g(n(2)),f=g(n(12)),a=g(n(4)),r=g(n(6)),o=g(n(7)),i=(t.default=function(e){w&&w.destroy();var t=e.afterClose,e=(0,f.default)(e,["afterClose"]),n=document.createElement("div"),a=(document.body.appendChild(n),d.default.getContext()),r=void 0;return(0,l.render)(p.default.createElement(d.default,a,p.default.createElement(M,(0,c.default)({ref:function(e){r=e},afterClose:function(){(0,l.unmountComponentAtNode)(n),document.body.removeChild(n),t&&t()}},e))),n),w={destroy:function(){r&&r.close()}}},n(0)),p=g(i),l=n(23),s=g(n(3)),h=g(n(13)),m=g(n(62)),u=n(11),d=g(n(8)),n=g(n(373));function g(e){return e&&e.__esModule?e:{default:e}}var y,v=u.func.bindCtx,_=d.default.getContextProps,b=d.default.config(n.default),w=void 0,M=(y=i.Component,(0,o.default)(k,y),k.prototype.getOverlay=function(e){this.overlay=e},k.prototype.close=function(){this.setState({visible:!1}),w=null},k.prototype.handleOverlayClose=function(e,t){if(!("docClick"===e&&this.popupNodes.some(function(e){return e.contains(t.target)}))){this.close();var n=this.props.overlayProps;if(n&&n.onRequestClose){for(var a=arguments.length,r=Array(2<a?a-2:0),o=2;o<a;o++)r[o-2]=arguments[o];n.onRequestClose.apply(n,[e,t].concat(r))}}},k.prototype.handleOverlayOpen=function(){this.popupNodes=this.overlay.getInstance().getContent().getInstance().popupNodes;var e=this.props.overlayProps;e&&e.onOpen&&e.onOpen()},k.prototype.handleItemClick=function(){var e;this.close(),this.props.onItemClick&&(e=this.props).onItemClick.apply(e,arguments)},k.prototype.render=function(){var e=this.props,t=e.className,n=e.popupClassName,a=e.target,r=e.align,o=e.offset,i=e.afterClose,l=e.overlayProps,l=void 0===l?{}:l,e=(0,f.default)(e,["className","popupClassName","target","align","offset","afterClose","overlayProps"]),s=_(this.props),u=s.prefix,d=this.state.visible,l=(0,c.default)({},s,l,{target:a,align:r,offset:o,afterClose:i,visible:d,onRequestClose:this.handleOverlayClose,onOpen:this.handleOverlayOpen,ref:this.getOverlay}),o=(0,c.default)({},s,{triggerType:"hover"},e,{className:(0,h.default)(((a={})[u+"context"]=!0,a[t]=!!t,a)),popupClassName:(0,h.default)(((r={})[u+"context"]=!0,r[n]=!!n,r)),onItemClick:this.handleItemClick});return l.rtl=!1,p.default.createElement(m.default,l,p.default.createElement(b,o))},n=u=k,u.propTypes={className:s.default.string,popupClassName:s.default.string,target:s.default.any,align:s.default.string,offset:s.default.array,overlayProps:s.default.object,afterClose:s.default.func,mode:s.default.oneOf(["inline","popup"]),onOpen:s.default.func,onItemClick:s.default.func},u.defaultProps={prefix:"next-",align:"tl tl",mode:"popup"},n);function k(e){(0,a.default)(this,k);e=(0,r.default)(this,y.call(this,e));return e.state={visible:!0},v(e,["handleOverlayClose","handleOverlayOpen","handleItemClick","getOverlay"]),e}M.displayName="ContextMenu",e.exports=t.default},function(e,t,n){},function(e,t,n){},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var m=s(n(2)),a=s(n(4)),r=s(n(6)),o=s(n(7)),g=s(n(0)),i=s(n(3)),y=s(n(13)),l=s(n(8)),v=s(n(381)),_=s(n(382)),b=s(n(383)),w=s(n(384));function s(e){return e&&e.__esModule?e:{default:e}}var u,M=n(11).obj.pickOthers,l=(u=g.default.Component,(0,o.default)(k,u),k.prototype.render=function(){var e,t=this.props,n=t.prefix,a=t.className,r=t.title,o=t.subTitle,i=t.extra,l=t.showTitleBullet,s=t.showHeadDivider,u=t.children,d=t.rtl,c=t.contentHeight,f=t.free,p=t.actions,h=t.hasBorder,t=t.media,h=(0,y.default)(((e={})[n+"card"]=!0,e[n+"card-free"]=f,e[n+"card-noborder"]=!h,e[n+"card-show-divider"]=s,e[n+"card-hide-divider"]=!s,e),a),n=M(Object.keys(k.propTypes),this.props);return n.dir=d?"rtl":void 0,g.default.createElement("div",(0,m.default)({},n,{className:h}),t&&g.default.createElement(b.default,null,t),g.default.createElement(v.default,{title:r,subTitle:o,extra:i,showTitleBullet:l}),f?u:g.default.createElement(_.default,{contentHeight:c},u),p&&g.default.createElement(w.default,null,p))},o=n=k,n.displayName="Card",n.propTypes=(0,m.default)({},l.default.propTypes,{prefix:i.default.string,rtl:i.default.bool,media:i.default.node,title:i.default.node,subTitle:i.default.node,actions:i.default.node,showTitleBullet:i.default.bool,showHeadDivider:i.default.bool,contentHeight:i.default.oneOfType([i.default.string,i.default.number]),extra:i.default.node,free:i.default.bool,hasBorder:i.default.bool,className:i.default.string,children:i.default.node}),n.defaultProps={prefix:"next-",free:!1,showTitleBullet:!0,showHeadDivider:!0,hasBorder:!0,contentHeight:120},o);function k(){return(0,a.default)(this,k),(0,r.default)(this,u.apply(this,arguments))}l.displayName="Card",t.default=l,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var l=f(n(2)),s=f(n(12)),a=f(n(4)),r=f(n(6)),o=f(n(7)),i=n(0),u=f(i),d=f(n(3)),c=f(n(13)),n=f(n(8));function f(e){return e&&e.__esModule?e:{default:e}}p=i.Component,(0,o.default)(h,p),h.prototype.render=function(){var e=this.props,t=e.prefix,n=e.title,a=e.subTitle,r=e.extra,o=e.className,i=e.component,e=(0,s.default)(e,["prefix","title","subTitle","extra","className","component"]);return u.default.createElement(i,(0,l.default)({},e,{className:(0,c.default)(t+"card-header",o)}),r&&u.default.createElement("div",{className:t+"card-header-extra"},r),u.default.createElement("div",{className:t+"card-header-titles"},n&&u.default.createElement("div",{className:t+"card-header-title"},n),a&&u.default.createElement("div",{className:t+"card-header-subtitle"},a)))},o=i=h,i.propTypes={prefix:d.default.string,title:d.default.node,subTitle:d.default.node,extra:d.default.node,component:d.default.elementType,className:d.default.string},i.defaultProps={prefix:"next-",component:"div"};var p,d=o;function h(){return(0,a.default)(this,h),(0,r.default)(this,p.apply(this,arguments))}d.displayName="CardHeader",t.default=n.default.config(d),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var i=f(n(2)),l=f(n(12)),a=f(n(4)),r=f(n(6)),o=f(n(7)),s=n(0),u=f(s),d=f(n(3)),c=f(n(13)),n=f(n(8));function f(e){return e&&e.__esModule?e:{default:e}}p=s.Component,(0,o.default)(h,p),h.prototype.render=function(){var e,t=this.props,n=t.prefix,a=t.component,r=t.inset,o=t.className,t=(0,l.default)(t,["prefix","component","inset","className"]),n=(0,c.default)(n+"card-divider",((e={})[n+"card-divider--inset"]=r,e),o);return u.default.createElement(a,(0,i.default)({},t,{className:n}))},o=s=h,s.propTypes={prefix:d.default.string,component:d.default.elementType,inset:d.default.bool,className:d.default.string},s.defaultProps={prefix:"next-",component:"hr"};var p,d=o;function h(){return(0,a.default)(this,h),(0,r.default)(this,p.apply(this,arguments))}d.displayName="CardDivider",t.default=n.default.config(d),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var r=f(n(2)),o=f(n(12)),a=f(n(4)),i=f(n(6)),l=f(n(7)),s=n(0),u=f(s),d=f(n(3)),c=f(n(13)),n=f(n(8));function f(e){return e&&e.__esModule?e:{default:e}}p=s.Component,(0,l.default)(h,p),h.prototype.render=function(){var e=this.props,t=e.prefix,n=e.className,a=e.component,e=(0,o.default)(e,["prefix","className","component"]);return u.default.createElement(a,(0,r.default)({},e,{className:(0,c.default)(t+"card-content-container",n)}))},l=s=h,s.propTypes={prefix:d.default.string,component:d.default.elementType,className:d.default.string},s.defaultProps={prefix:"next-",component:"div"};var p,d=l;function h(){return(0,a.default)(this,h),(0,i.default)(this,p.apply(this,arguments))}d.displayName="CardContent",t.default=n.default.config(d),e.exports=t.default},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){"use strict";t.__esModule=!0;var a,m=S(n(12)),r=S(n(38)),g=S(n(2)),i=S(n(4)),l=S(n(6)),o=S(n(7)),L=S(n(0)),s=S(n(3)),u=n(23),y=S(n(13)),d=S(n(172)),c=n(30),v=S(n(33)),f=S(n(8)),p=S(n(44)),_=n(11),T=S(n(127)),D=S(n(385)),O=S(n(641)),h=S(n(128)),b=S(n(129)),w=S(n(386)),M=S(n(387)),k=S(n(173)),n=S(n(642));function S(e){return e&&e.__esModule?e:{default:e}}function E(){}var x,C=L.default.Children,k=(x=L.default.Component,(0,o.default)(N,x),N.prototype.getChildContext=function(){return{notRenderCellIndex:this.notRenderCellIndex||[],lockType:this.props.lockType}},N.getDerivedStateFromProps=function(e){var t={};return void 0!==e.sort&&(t.sort=e.sort),t},N.prototype.componentDidMount=function(){this.notRenderCellIndex=[]},N.prototype.shouldComponentUpdate=function(e,t,n){return!e.pure||!((0,d.default)(e,this.props)&&_.obj.shallowEqual(t,this.state)&&_.obj.shallowEqual(n,this.context))},N.prototype.componentDidUpdate=function(){this.notRenderCellIndex=[]},N.prototype.normalizeChildrenState=function(e){var t=e.columns;return e.children&&(t=this.normalizeChildren(e)),this.fetchInfoFromBinaryChildren(t)},N.prototype.normalizeChildren=function(e){var t=e.columns;return t=e.children?function n(e){var a=[];return C.forEach(e,function(e){var t;e&&(t=(0,g.default)({},e.props),e.ref&&(t.ref=e.ref),e&&-1<["function","object"].indexOf((0,r.default)(e.type))&&("column"===e.type._typeMark||"columnGroup"===e.type._typeMark)||_.log.warning("Use <Table.Column/>, <Table.ColumnGroup/> as child."),a.push(t),e.props.children&&(t.children=n(e.props.children)))}),a}(e.children):t},N.prototype.fetchInfoFromBinaryChildren=function(e){function r(e,t){return t=t||0,e.forEach(function(e){e.children?t=r(e.children,t):t+=1}),t}var a=!1,o=[],i=[],e=(function t(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:[],n=arguments[1];i[n]=i[n]||[],e.forEach(function(e){e.children?(a=!0,t(e.children,n+1)):o.push(e),i[n].push(e)})}(e,0),i.forEach(function(e,a){e.forEach(function(e,t){var n=e.children;n&&(n=r(n),e.colSpan=n,i[a][t]=e)})}),this.props),t=e.lockType,e=e.lengths,t="right"===t?e.origin-e.right:0;return this.addColIndex(o,t),{flatChildren:o,groupChildren:i,hasGroupHeader:a}},N.prototype.renderColGroup=function(e){e=e.map(function(e,t){e=e.width,e=e?{width:e}:{};return L.default.createElement("col",{style:e,key:t})});return L.default.createElement("colgroup",{key:"table-colgroup"},e)},N.prototype.renderTable=function(e,t){var n,a,r,o,i,l,s,u,d,c,f,p,h,m,g,y,v,_,b,w,M,k,S,E,x,C;return t.length||!t.length&&!this.props.lockType?(n=(M=this.props).hasHeader,a=M.components,r=M.prefix,o=M.wrapperContent,i=M.filterParams,l=M.locale,s=M.dataSource,u=M.emptyContent,d=M.loading,c=M.primaryKey,f=M.cellProps,p=M.rowProps,h=M.onRowClick,m=M.onRowMouseEnter,g=M.onRowMouseLeave,y=M.expandedIndexSimulate,v=M.pure,_=M.rtl,b=M.crossline,w=M.sortIcons,M=M.tableWidth,k=this.state.sort,S=void 0===(S=a.Header)?D.default:S,E=void 0===(E=a.Wrapper)?O.default:E,x=void 0===(x=a.Body)?T.default:x,C=this.renderColGroup(t),[L.default.createElement("div",{key:r+"table-column-resize-proxy",ref:this.getResizeProxyDomRef,className:r+"table-column-resize-proxy"}),L.default.createElement(E,{key:r+"table-wrapper",colGroup:C,ref:this.getWrapperRef,prefix:r,tableWidth:M},n?L.default.createElement(S,{prefix:r,rtl:_,pure:v,affixRef:this.getAffixRef,colGroup:C,className:r+"table-header",filterParams:i,tableEl:this.tableEl,columns:e,locale:l,headerCellRef:this.getHeaderCellRef,components:a,onFilter:this.onFilter,sort:k,onResizeChange:this.onResizeChange,onSort:this.onSort,sortIcons:w,tableWidth:M,resizeProxyDomRef:this.resizeProxyDomRef}):null,L.default.createElement(x,{prefix:r,rtl:_,pure:v,crossline:b,colGroup:C,className:r+"table-body",components:a,loading:d,emptyContent:u,getCellProps:f,primaryKey:c,getRowProps:p,columns:t,rowRef:this.getRowRef,cellRef:this.getCellRef,onRowClick:h,expandedIndexSimulate:y,tableEl:this.tableEl,onRowMouseEnter:m,onRowMouseLeave:g,dataSource:s,locale:l,onBodyMouseOver:this.onBodyMouseOver,onBodyMouseOut:this.onBodyMouseOut,tableWidth:M}),o)]):null},N.prototype.render=function(){var e,t=this.normalizeChildrenState(this.props),t=(this.groupChildren=t.groupChildren,this.flatChildren=t.flatChildren,this.renderTable(t.groupChildren,t.flatChildren)),n=this.props,a=n.className,r=n.style,o=n.hasBorder,i=n.isZebra,l=n.loading,s=n.size,u=n.hasHeader,d=n.prefix,c=(n.dataSource,n.entireDataSource,n.onSort,n.onResizeChange,n.onRowClick,n.onRowMouseEnter,n.onRowMouseLeave,n.onFilter,n.rowProps,n.cellProps,n.scrollToRow,n.primaryKey,n.components,n.wrapperContent,n.lockType,n.locale,n.expandedIndexSimulate,n.refs,n.pure,n.rtl),f=(n.emptyContent,n.filterParams,n.columns,n.sortIcons,n.loadingComponent),f=void 0===f?v.default:f,p=n.tableLayout,h=(n.tableWidth,n.ref),n=(0,m.default)(n,["className","style","hasBorder","isZebra","loading","size","hasHeader","prefix","dataSource","entireDataSource","onSort","onResizeChange","onRowClick","onRowMouseEnter","onRowMouseLeave","onFilter","rowProps","cellProps","scrollToRow","primaryKey","components","wrapperContent","lockType","locale","expandedIndexSimulate","refs","pure","rtl","emptyContent","filterParams","columns","sortIcons","loadingComponent","tableLayout","tableWidth","ref"]),s=(0,y.default)(((e={})[d+"table"]=!0,e[d+"table-"+s]=s,e[d+"table-layout-"+p]=p,e["only-bottom-border"]=!o,e["no-header"]=!u,e.zebra=i,e[a]=a,e)),p=(c&&(n.dir="rtl"),L.default.createElement("div",(0,g.default)({className:s,style:r,ref:h||this.getTableEl},_.obj.pickOthers(Object.keys(N.propTypes),n)),t));return l?L.default.createElement(f,{className:d+"table-loading"},p):p},a=o=N,o.Column=k.default,o.ColumnGroup=n.default,o.Header=D.default,o.Body=T.default,o.Wrapper=O.default,o.Row=h.default,o.Cell=b.default,o.Filter=w.default,o.Sort=M.default,o.propTypes=(0,g.default)({},f.default.propTypes,{prefix:s.default.string,pure:s.default.bool,rtl:s.default.bool,tableLayout:s.default.oneOf(["fixed","auto"]),tableWidth:s.default.number,className:s.default.string,style:s.default.object,size:s.default.oneOf(["small","medium"]),dataSource:s.default.array,entireDataSource:s.default.array,onRowClick:s.default.func,onRowMouseEnter:s.default.func,onRowMouseLeave:s.default.func,onSort:s.default.func,onFilter:s.default.func,onResizeChange:s.default.func,rowProps:s.default.func,cellProps:s.default.func,hasBorder:s.default.bool,hasHeader:s.default.bool,isZebra:s.default.bool,loading:s.default.bool,loadingComponent:s.default.func,filterParams:s.default.object,sort:s.default.object,sortIcons:s.default.object,locale:s.default.object,components:s.default.object,columns:s.default.array,emptyContent:s.default.node,primaryKey:s.default.oneOfType([s.default.symbol,s.default.string]),lockType:s.default.oneOf(["left","right"]),wrapperContent:s.default.any,refs:s.default.object,expandedRowRender:s.default.func,rowExpandable:s.default.func,expandedRowIndent:s.default.array,hasExpandedRowCtrl:s.default.bool,getExpandedColProps:s.default.func,openRowKeys:s.default.array,defaultOpenRowKeys:s.default.array,onRowOpen:s.default.func,onExpandedRowClick:s.default.func,fixedHeader:s.default.bool,maxBodyHeight:s.default.oneOfType([s.default.number,s.default.string]),rowSelection:s.default.object,stickyHeader:s.default.bool,offsetTop:s.default.number,affixProps:s.default.object,indent:s.default.number,isTree:s.default.bool,useVirtual:s.default.bool,rowHeight:s.default.oneOfType([s.default.number,s.default.func]),scrollToRow:s.default.number,onBodyScroll:s.default.func,expandedIndexSimulate:s.default.bool,crossline:s.default.bool,lengths:s.default.object}),o.defaultProps={dataSource:[],onRowClick:E,onRowMouseEnter:E,onRowMouseLeave:E,onSort:E,onFilter:E,onResizeChange:E,size:"medium",rowProps:E,cellProps:E,prefix:"next-",hasBorder:!0,hasHeader:!0,isZebra:!1,loading:!1,expandedIndexSimulate:!1,primaryKey:"id",components:{},locale:p.default.Table,crossline:!1},o.childContextTypes={notRenderCellIndex:s.default.array,lockType:s.default.oneOf(["left","right"])},o.contextTypes={getTableInstance:s.default.func,getTableInstanceForFixed:s.default.func,getTableInstanceForVirtual:s.default.func,getTableInstanceForExpand:s.default.func},a);function N(e,t){(0,i.default)(this,N);var o=(0,l.default)(this,x.call(this,e,t)),t=(o.state={sort:o.props.sort||{}},o.onSort=function(e,t,n){void 0===o.props.sort?o.setState({sort:n},function(){o.props.onSort(e,t,n)}):o.props.onSort(e,t,n)},o.onFilter=function(e){o.props.onFilter(e)},o.onResizeChange=function(e,t){o.props.onResizeChange(e,t)},o.getResizeProxyDomRef=function(e){if(!e)return o.resizeProxyDomRef;o.resizeProxyDomRef=e},o.getWrapperRef=function(e){if(!e)return o.wrapper;o.wrapper=e},o.getAffixRef=function(e){if(!e)return o.affixRef;o.affixRef=e},o.getHeaderCellRef=function(e,t,n){e="header_cell_"+e+"_"+t;if(!n)return o[e];o[e]=n},o.getRowRef=function(e,t){e="row_"+e;if(!t)return o[e];o[e]=t},o.getCellRef=function(e,t,n){e="cell_"+e+"_"+t;if(!n)return o[e];o[e]=n},o.handleColHoverClass=function(e,a,t){var n=o.props.crossline,r=t?"addClass":"removeClass";n&&o.props.entireDataSource.forEach(function(e,t){try{var n=(0,u.findDOMNode)(o.getCellRef(t,a));n&&_.dom[r](n,"hovered")}catch(e){return null}})},o.findEventTarget=function(e){var t=o.props.prefix,e=_.dom.getClosest(e.target,"td."+t+"table-cell"),t=e&&e.getAttribute("data-next-table-col"),n=e&&e.getAttribute("data-next-table-row");try{if((0,u.findDOMNode)(o.getCellRef(n,t))===e)return{colIndex:t,rowIndex:n}}catch(e){}return{}},o.onBodyMouseOver=function(e){var t;o.props.crossline&&(t=(e=o.findEventTarget(e)).colIndex,e=e.rowIndex,t&&e&&(o.handleColHoverClass(e,t,!0),o.colIndex=t,o.rowIndex=e))},o.onBodyMouseOut=function(e){var t;o.props.crossline&&(t=(e=o.findEventTarget(e)).colIndex,e=e.rowIndex,t&&e&&(o.handleColHoverClass(o.rowIndex,o.colIndex,!1),o.colIndex=-1,o.rowIndex=-1))},o.addColIndex=function(e){var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:0;e.forEach(function(e,t){e.__colIndex=n+t})},o.getTableEl=function(e){o.tableEl=e},o.context),n=t.getTableInstance,a=t.getTableInstanceForVirtual,r=t.getTableInstanceForFixed,t=t.getTableInstanceForExpand;return n&&n(e.lockType,o),r&&r(e.lockType,o),a&&a(e.lockType,o),t&&t(o),o.notRenderCellIndex=[],o}k.displayName="Table",t.default=(0,c.polyfill)(k),e.exports=t.default},function(e,t){var i=Object.prototype.hasOwnProperty;function l(e,t){if(!e&&!t||e===t)return 1;if(!e==!t&&e.length===t.length){for(var n=0;n<e.length;n++)if(!function(e,t){for(var n in e)if(i.call(e,n))return e[n]===t[n]}(e[n],t[n]))return;return 1}}e.exports=function e(t,n){if(!t&&!n||t===n)return!0;if(!t!=!n)return!1;if("object"!=typeof t)return t===n;if(t instanceof Array){for(var a=0;a<t.length;a++)if(!e(t[a],n[a]))return!1;return t.length===n.length}return function e(t,n){var a,r=0,o=0;for(a in t)if(i.call(t,a)){switch(a){case"transform":if(l(t[a],n[a]))break;return!1;case"shadowOffset":if(e(t[a],n[a]))break;return!1;default:if(t[a]!==n[a])return!1}r++}for(a in n)i.call(n,a)&&o++;return r===o}(t,n)}},function(e,t,n){"use strict";t.__esModule=!0;var a=u(n(4)),o=u(n(6)),r=u(n(7)),i=u(n(0)),l=(n(23),u(n(3))),s=n(11);function u(e){return e&&e.__esModule?e:{default:e}}d=i.default.Component,(0,r.default)(c,d),c.prototype.componentWillUnmount=function(){this.destory()},c.prototype.destory=function(){s.events.off(document,"mousemove",this.onMouseMove),s.events.off(document,"mouseup",this.onMouseUp),this.select()},c.prototype.unSelect=function(){s.dom.setStyle(document.body,{userSelect:"none",cursor:"ew-resize"}),document.body.setAttribute("unselectable","on")},c.prototype.select=function(){s.dom.setStyle(document.body,{userSelect:"",cursor:""}),document.body.removeAttribute("unselectable")},c.prototype.render=function(){var e=this.props.prefix;return i.default.createElement("a",{className:e+"table-resize-handler",onMouseDown:this.onMouseDown})},r=n=c,n.propTypes={prefix:l.default.string,rtl:l.default.bool,onChange:l.default.func,dataIndex:l.default.string,tableEl:l.default.any,resizeProxyDomRef:l.default.any,cellDomRef:l.default.any,col:l.default.any,hasLock:l.default.bool,asyncResizable:l.default.bool},n.defaultProps={onChange:function(){}};var d,l=r;function c(){(0,a.default)(this,c);var r=(0,o.default)(this,d.call(this));return r.showResizeProxy=function(){r.props.resizeProxyDomRef.style.cssText="display:block;left:"+r.startLeft+"px;"},r.moveResizeProxy=function(){var e=r.startLeft+r.changedPageX;r.props.resizeProxyDomRef.style.cssText="left:"+e+"px;display:block;"},r.resetResizeProxy=function(){r.asyncResizeFlag&&r.props.onChange(r.props.dataIndex,r.changedPageX),r.changedPageX=0,r.tRight=0,r.asyncResizeFlag=!1,r.props.resizeProxyDomRef.style.cssText="display:none;"},r.movingLimit=function(){var e=r.startLeft+r.changedPageX;e>r.tRight&&(e=r.tRight,r.changedPageX=r.tRight-r.startLeft),e-r.cellLeft<r.cellMinWidth&&(r.changedPageX=r.cellLeft+r.cellMinWidth-r.startLeft),e<0&&(r.changedPageX=0-r.startLeft),r.props.col.width+r.changedPageX<r.cellMinWidth&&(r.changedPageX=r.cellMinWidth-r.props.col.width)},r.onMouseDown=function(e){var t,n=r.props.tableEl.getBoundingClientRect(),a=n.left,n=n.width;r.props.cellDomRef&&(t=r.props.cellDomRef.getBoundingClientRect().left,r.lastPageX=e.pageX,r.tLeft=a,r.tRight=n,r.startLeft=e.pageX-a,r.cellLeft=t-a,r.props.asyncResizable&&r.showResizeProxy(),s.events.on(document,"mousemove",r.onMouseMove),s.events.on(document,"mouseup",r.onMouseUp),r.unSelect())},r.onMouseMove=function(e){e=e.pageX;r.changedPageX=e-r.lastPageX,r.props.rtl&&(r.changedPageX=-r.changedPageX),r.props.hasLock&&!r.props.asyncResizable&&(r.cellLeft=r.props.cellDomRef.getBoundingClientRect().left-r.tLeft),r.movingLimit(),r.props.asyncResizable?(r.asyncResizeFlag=!0,r.moveResizeProxy()):(r.props.onChange(r.props.dataIndex,r.changedPageX),r.lastPageX=e)},r.onMouseUp=function(){r.props.asyncResizable&&r.resetResizeProxy(),r.startLeft=0,r.destory()},r.cellMinWidth=40,r.lastPageX=0,r.tRight=0,r.tLeft=0,r.cellLeft=0,r.startLeft=0,r.changedPageX=0,r.asyncResizeFlag=!1,r}l.displayName="Resize",t.default=l,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var a=s(n(4)),r=s(n(6)),o=s(n(7)),i=n(0),l=s(i),n=s(n(3));function s(e){return e&&e.__esModule?e:{default:e}}u=i.Component,(0,o.default)(d,u),d.prototype.render=function(){var e=this.props,t=e.colGroup,n=e.children,a=e.tableWidth,e=e.component;return l.default.createElement(e,{role:"table",style:{width:a}},t,n)},d.propTypes={tableWidth:n.default.number};var u,i=d;function d(){return(0,a.default)(this,d),(0,r.default)(this,u.apply(this,arguments))}i.displayName="Wrapper",(t.default=i).defaultProps={component:"table"},i.propTypes={children:n.default.any,prefix:n.default.string,colGroup:n.default.any,component:n.default.string},e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var a=l(n(4)),r=l(n(6)),o=l(n(7)),i=l(n(0)),n=l(n(3));function l(e){return e&&e.__esModule?e:{default:e}}s=i.default.Component,(0,o.default)(u,s),u.prototype.getChildContext=function(){return{parent:this}},u.prototype.render=function(){return null},o=i=u,i.propTypes={title:n.default.oneOfType([n.default.element,n.default.node,n.default.func])},i.childContextTypes={parent:n.default.any},i.defaultProps={title:"column-group"},i._typeMark="columnGroup";var s,n=o;function u(){return(0,a.default)(this,u),(0,r.default)(this,s.apply(this,arguments))}n.displayName="ColumnGroup",t.default=n,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var o=r(n(2)),i=r(n(12)),l=r(n(4)),s=r(n(6)),u=r(n(7));t.default=function(r){e=t=function(n){function a(e,t){(0,l.default)(this,a);var i=(0,s.default)(this,n.call(this,e,t));return i.onTreeNodeClick=function(e){var r=i.props.primaryKey,t=e[r],o=i.ds,n=[].concat(i.state.openRowKeys),a=n.indexOf(t);-1<a?function(t){function n(e){e.forEach(function(e){a.push(e[r]),e.children&&n(e.children)})}var a=[t];return o.forEach(function(e){e[r]===t&&e.children&&n(e.children)}),a}(t).forEach(function(e){e=n.indexOf(e);-1<e&&n.splice(e,1)}):n.push(t),"openRowKeys"in i.props||i.setState({openRowKeys:n}),i.props.onRowOpen(n,t,-1===a,e)},i.state={openRowKeys:e.openRowKeys||e.defaultOpenRowKeys||[]},i}return(0,u.default)(a,n),a.prototype.getChildContext=function(){return{openTreeRowKeys:this.state.openRowKeys,indent:this.props.indent,treeStatus:this.getTreeNodeStatus(this.ds),onTreeNodeClick:this.onTreeNodeClick,isTree:this.props.isTree}},a.getDerivedStateFromProps=function(e){return"openRowKeys"in e?{openRowKeys:e.openRowKeys||[]}:null},a.prototype.normalizeDataSource=function(e){var r=this.state.openRowKeys,o=this.props.primaryKey,i=[];return function t(e,n){var a=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;e.forEach(function(e){0===(e.__level=n)||-1<r.indexOf(a)?e.__hidden=!1:e.__hidden=!0,i.push(e),e.children&&t(e.children,n+1,e[o])})}(e,0),this.ds=i},a.prototype.getTreeNodeStatus=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:[],t=this.state.openRowKeys,n=this.props.primaryKey,a=[];return t.forEach(function(t){e.forEach(function(e){e[n]===t&&e.children&&e.children.forEach(function(e){a.push(e[n])})})}),a},a.prototype.render=function(){var e=this.props,t=e.components,n=e.isTree,a=e.dataSource,e=(e.indent,(0,i.default)(e,["components","isTree","dataSource","indent"]));return n&&((t=(0,o.default)({},t)).Row||(t.Row=f.default),t.Cell||(t.Cell=p.default),a=this.normalizeDataSource(a)),d.default.createElement(r,(0,o.default)({},e,{dataSource:a,components:t}))},a}(d.default.Component),t.TreeRow=f.default,t.TreeCell=p.default,t.propTypes=(0,o.default)({openRowKeys:a.default.array,defaultOpenRowKeys:a.default.array,onRowOpen:a.default.func,primaryKey:a.default.oneOfType([a.default.symbol,a.default.string]),indent:a.default.number,isTree:a.default.bool,locale:a.default.object},r.propTypes),t.defaultProps=(0,o.default)({},r.defaultProps,{primaryKey:"id",onRowOpen:m,components:{},indent:12}),t.childContextTypes={openTreeRowKeys:a.default.array,indent:a.default.number,treeStatus:a.default.array,onTreeNodeClick:a.default.func,isTree:a.default.bool};var e,t=e;return t.displayName="TreeTable",(0,h.statics)(t,r),(0,c.polyfill)(t)};var d=r(n(0)),a=r(n(3)),c=n(30),f=r(n(644)),p=r(n(645)),h=n(67);function r(e){return e&&e.__esModule?e:{default:e}}var m=function(){};e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var l=f(n(2)),s=f(n(12)),a=f(n(4)),r=f(n(6)),o=f(n(7)),u=f(n(0)),i=f(n(3)),d=f(n(13)),c=f(n(388));function f(e){return e&&e.__esModule?e:{default:e}}p=u.default.Component,(0,o.default)(h,p),h.prototype.render=function(){var e=this.props,t=e.className,n=e.record,a=e.primaryKey,r=e.prefix,e=(0,s.default)(e,["className","record","primaryKey","prefix"]),o=this.context,i=o.treeStatus,o=o.openRowKeys,o=(0,d.default)(((i={hidden:!(-1<i.indexOf(n[a]))&&0!==n.__level})[r+"table-row-level-"+n.__level]=!0,i.opened=-1<o.indexOf(n[a]),i[t]=t,i));return u.default.createElement(c.default,(0,l.default)({},e,{record:n,className:o,primaryKey:a,prefix:r}))},o=n=h,n.propTypes=(0,l.default)({},c.default.propTypes),n.defaultProps=(0,l.default)({},c.default.defaultProps),n.contextTypes={treeStatus:i.default.array,openRowKeys:i.default.array};var p,n=o;function h(){return(0,a.default)(this,h),(0,r.default)(this,p.apply(this,arguments))}n.displayName="TreeRow",t.default=n,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var h=s(n(2)),o=s(n(4)),i=s(n(6)),a=s(n(7)),m=s(n(0)),r=s(n(3)),g=s(n(24)),l=n(11),y=s(n(129));function s(e){return e&&e.__esModule?e:{default:e}}u=m.default.Component,(0,a.default)(d,u),d.prototype.render=function(){var t=this,e=this.props,n=e.colIndex,a=e.record,r=e.prefix,o=e.primaryKey,i=e.locale,l=e.rtl,e=e.children,s=this.context,u=s.openTreeRowKeys,d=s.indent,c=s.isTree,f=void 0,p=void 0;return n===(s.rowSelection?1:0)&&(c&&((n={})[l?"paddingRight":"paddingLeft"]=d*(a.__level+1),f=n,p=m.default.createElement(g.default,{size:"xs",rtl:l,className:r+"table-tree-placeholder",type:"arrow-right"}),a.children&&a.children.length&&(s=-1<u.indexOf(a[o]),p=m.default.createElement(g.default,{className:r+"table-tree-arrow",type:s?"arrow-down":"arrow-right",size:"xs",rtl:l,onClick:function(e){return t.onTreeNodeClick(a,e)},onKeyDown:function(e){return t.expandedKeydown(a,e)},role:"button",tabIndex:"0","aria-expanded":s,"aria-label":s?i.expanded:i.folded})))),m.default.createElement(y.default,(0,h.default)({},this.props,{innerStyle:f,isIconLeft:!!p}),e,p)},a=n=d,n.propTypes=(0,h.default)({indent:r.default.number,locale:r.default.object},y.default.propTypes),n.defaultProps=(0,h.default)({},y.default.defaultProps,{component:"td",indent:20}),n.contextTypes={openTreeRowKeys:r.default.array,indent:r.default.number,onTreeNodeClick:r.default.func,isTree:r.default.bool,rowSelection:r.default.object};var u,n=a;function d(){var e,n;(0,o.default)(this,d);for(var t=arguments.length,a=Array(t),r=0;r<t;r++)a[r]=arguments[r];return(e=n=(0,i.default)(this,u.call.apply(u,[this].concat(a)))).onTreeNodeClick=function(e,t){t.stopPropagation(),n.context.onTreeNodeClick(e)},n.expandedKeydown=function(e,t){t.preventDefault(),t.stopPropagation(),t.keyCode===l.KEYCODE.ENTER&&n.onTreeNodeClick(e,t)},(0,i.default)(n,e)}n.displayName="TreeCell",t.default=n,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var s=l(n(2)),u=l(n(12)),i=l(n(4)),d=l(n(6)),a=l(n(7));t.default=function(l,e){t=n=function(r){function o(){var e,s;(0,i.default)(this,o);for(var t=arguments.length,n=Array(t),a=0;a<t;a++)n[a]=arguments[a];return(e=s=(0,d.default)(this,r.call.apply(r,[this].concat(n)))).state={},s.getNode=function(e,t,n){n=n?n.charAt(0).toUpperCase()+n.substr(1):"",s[""+e+n+"Node"]=t},s.getTableInstance=function(e,t){s.tableInc=t},s.onFixedScrollSync=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{currentTarget:{}},t=e.currentTarget||{},n=s.headerNode,a=s.bodyNode,r=t.scrollLeft,o=!(r<t.scrollWidth-t.clientWidth),i=s.props,l=i.prefix;i.loading||o===s.scrollToRightEnd||(s.scrollToRightEnd=o,i=s.getTableNode(),h.dom[o?"removeClass":"addClass"](i,l+"table-scrolling-to-right")),e.currentTarget===e.target&&(t===a?n&&r!==n.scrollLeft&&(n.scrollLeft=r):t===n&&a&&r!==a.scrollLeft&&(a.scrollLeft=r))},(0,d.default)(s,e)}return(0,a.default)(o,r),o.prototype.getChildContext=function(){return{fixedHeader:this.props.fixedHeader,maxBodyHeight:this.props.maxBodyHeight,getTableInstanceForFixed:this.getTableInstance,onFixedScrollSync:this.onFixedScrollSync,getNode:this.getNode}},o.prototype.componentDidMount=function(){this.adjustFixedHeaderSize(),this.scrollToRightEnd=void 0,this.onFixedScrollSync({currentTarget:this.bodyNode,target:this.bodyNode})},o.prototype.componentDidUpdate=function(){this.adjustFixedHeaderSize(),this.onFixedScrollSync({currentTarget:this.bodyNode,target:this.bodyNode})},o.prototype.getTableNode=function(){var e=this.tableInc;try{return(0,f.findDOMNode)(e.tableEl)}catch(e){return null}},o.prototype.adjustFixedHeaderSize=function(){var e,t=this.props,n=t.hasHeader,a=t.rtl,t=t.prefix,r=a?"paddingLeft":"paddingRight",a=a?"marginLeft":"marginRight",o=this.bodyNode,i=+h.dom.scrollbar().width||0;n&&!this.props.lockType&&o&&(e=o.scrollHeight>o.clientHeight,o.scrollWidth,o.clientWidth,o={},e||(o[r]=0,o[a]=0),+i&&(o.marginBottom=-i,o.paddingBottom=i,e&&(o[a]=i)),h.dom.setStyle(this.headerNode,o)),n&&!this.props.lockType&&this.headerNode&&(r=this.headerNode.querySelector("."+t+"table-header-fixer"),e=h.dom.getStyle(this.headerNode,"height"),a=h.dom.getStyle(this.headerNode,"paddingBottom"),h.dom.setStyle(r,{width:i,height:e-a}))},o.prototype.render=function(){var e=this.props,t=e.components,n=e.className,a=e.prefix,r=e.fixedHeader,o=e.lockType,i=e.dataSource,e=(e.maxBodyHeight,(0,u.default)(e,["components","className","prefix","fixedHeader","lockType","dataSource","maxBodyHeight"]));return r&&((t=(0,s.default)({},t)).Header||(t.Header=m.default),t.Body||(t.Body=g.default),t.Wrapper||(t.Wrapper=y.default),n=(0,p.default)(((r={})[a+"table-fixed"]=!0,r[a+"table-wrap-empty"]=!i.length,r[n]=n,r))),c.default.createElement(l,(0,s.default)({},e,{dataSource:i,lockType:o,components:t,className:n,prefix:a}))},o}(c.default.Component),n.FixedHeader=m.default,n.FixedBody=g.default,n.FixedWrapper=y.default,n.propTypes=(0,s.default)({hasHeader:r.default.bool,fixedHeader:r.default.bool,maxBodyHeight:r.default.oneOfType([r.default.number,r.default.string])},l.propTypes),n.defaultProps=(0,s.default)({},l.defaultProps,{hasHeader:!0,fixedHeader:!1,maxBodyHeight:200,components:{},refs:{},prefix:"next-"}),n.childContextTypes={fixedHeader:r.default.bool,getNode:r.default.func,onFixedScrollSync:r.default.func,getTableInstanceForFixed:r.default.func,maxBodyHeight:r.default.oneOfType([r.default.number,r.default.string])};var t,n=t;return n.displayName="FixedTable",(0,o.statics)(n,l),n};var c=l(n(0)),r=l(n(3)),f=n(23),p=l(n(13)),h=n(11),m=l(n(130)),g=l(n(390)),y=l(n(131)),o=n(67);function l(e){return e&&e.__esModule?e:{default:e}}e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var i=o(n(12)),f=o(n(2)),r=o(n(4)),l=o(n(6)),s=o(n(7)),u=(t.default=function(o){e=t=function(n){function a(e,t){(0,r.default)(this,a);var c=(0,l.default)(this,n.call(this,e,t));return c.addSelection=function(e){var t=c.props,n=t.prefix,a=t.rowSelection,t=t.size,a=a.columnProps&&a.columnProps()||{};e.find(function(e){return"selection"===e.key})||e.unshift((0,f.default)({key:"selection",title:c.renderSelectionHeader.bind(c),cell:c.renderSelectionBody.bind(c),width:"small"===t?34:50,className:n+"table-selection "+n+"table-prerow",__normalized:!0},a))},c.renderSelectionHeader=function(){var e=c.selectAllRow,t={},n=c.props,a=n.rowSelection,r=n.primaryKey,o=n.dataSource,i=n.entireDataSource,n=n.locale,l=c.state.selectedRowKeys,s=a.mode||"multiple",u=!!l.length,d=!1,i=(c.flatDataSource(i||o).filter(function(e,t){return!a.getProps||!(a.getProps(e,t)||{}).disabled}).map(function(e){return e[r]}).forEach(function(e){-1===l.indexOf(e)?u=!1:d=!0}),t.onClick=b(function(e){e.stopPropagation()},t.onClick),a.titleProps&&a.titleProps()||{});return u&&(d=!1),["multiple"===s?p.default.createElement(h.default,(0,f.default)({key:"_total",indeterminate:d,"aria-label":n.selectAll,checked:u,onChange:e},t,i)):null,a.titleAddons&&a.titleAddons()]},c.renderSelectionBody=function(e,t,n){var a=c.props,r=a.rowSelection,a=a.primaryKey,o=c.state.selectedRowKeys,i=r.mode||"multiple",o=-1<o.indexOf(n[a]),a=c.selectOneRow.bind(c,t,n),r=r.getProps&&r.getProps(n,t)||{};return r.onClick=b(function(e){e.stopPropagation()},r.onClick),"multiple"===i?p.default.createElement(h.default,(0,f.default)({checked:o,onChange:a},r)):p.default.createElement(m.default,(0,f.default)({checked:o,onChange:a},r))},c.selectAllRow=function(a,e){var r=[].concat(c.state.selectedRowKeys),t=c.props,n=t.rowSelection,o=t.primaryKey,i=t.dataSource,t=t.entireDataSource,l=c.state.selectedRowKeys,s=n.getProps,u={},d=[];c.flatDataSource(t||i).forEach(function(e,t){var n=e[o];s&&(u=s(e,t)||{}),a&&(!u.disabled||-1<l.indexOf(n))||u.disabled&&-1<l.indexOf(n)?(r.push(n),d.push(e)):-1<(t=r.indexOf(n))&&r.splice(t,1)}),d=w(d,o),"function"==typeof n.onSelectAll&&n.onSelectAll(a,d),c.triggerSelection(n,w(r),d),e.stopPropagation()},c.state={selectedRowKeys:e.rowSelection&&"selectedRowKeys"in e.rowSelection&&e.rowSelection.selectedRowKeys||[]},c}return(0,s.default)(a,n),a.prototype.getChildContext=function(){return{rowSelection:this.props.rowSelection,selectedRowKeys:this.state.selectedRowKeys}},a.getDerivedStateFromProps=function(e){return e.rowSelection&&"selectedRowKeys"in e.rowSelection?{selectedRowKeys:e.rowSelection.selectedRowKeys||[]}:null},a.prototype.normalizeChildren=function(e){var t=this.props,n=t.prefix,a=t.rowSelection,t=t.size;return a&&(e=u.Children.map(e,function(e,t){return p.default.cloneElement(e,{key:t})}),a=a.columnProps&&a.columnProps()||{},e.unshift(p.default.createElement(v.default,(0,f.default)({key:"selection",title:this.renderSelectionHeader.bind(this),cell:this.renderSelectionBody.bind(this),width:"small"===t?34:50,className:n+"table-selection "+n+"table-prerow",__normalized:!0},a)))),e},a.prototype.selectOneRow=function(e,t,n,a){var r=[].concat(this.state.selectedRowKeys),o=this.props,i=o.primaryKey,l=o.rowSelection,s=o.dataSource,o=o.entireDataSource,u=l.mode||"multiple",d=t[i],u=(d||c.log.warning("Can't get value from record using given "+i+" as primaryKey."),"multiple"===u?n?r.push(d):(u=r.indexOf(d),r.splice(u,1)):n&&(r=[d]),s),d=(Array.isArray(o)&&o.length>s.length&&(u=o),w(u.filter(function(e){return-1<r.indexOf(e[i])}),i));"function"==typeof l.onSelect&&l.onSelect(n,t,d),this.triggerSelection(l,r,d),a.stopPropagation()},a.prototype.triggerSelection=function(e,t,n){"selectedRowKeys"in e||this.setState({selectedRowKeys:t}),"function"==typeof e.onChange&&e.onChange(t,n)},a.prototype.flatDataSource=function(e){var n,a,r=e,t=this.context.listHeader;return t&&(r=[],n=t.hasChildrenSelection,a=t.hasSelection,e.forEach(function(e){var t=e.children;a&&r.push(e),t&&n&&(r=r.concat(t))})),r},a.prototype.render=function(){var e=this.props,t=e.rowSelection,n=e.components,a=e.children,r=e.columns,e=(0,i.default)(e,["rowSelection","components","children","columns"]);return t&&(r&&!a?this.addSelection(r):a=this.normalizeChildren(a||[]),(n=(0,f.default)({},n)).Row=n.Row||y.default),p.default.createElement(o,(0,f.default)({},e,{columns:r,components:n,children:a}))},a}(p.default.Component),t.SelectionRow=y.default,t.propTypes=(0,f.default)({rowSelection:a.default.object,primaryKey:a.default.oneOfType([a.default.symbol,a.default.string]),dataSource:a.default.array,entireDataSource:a.default.array},o.propTypes),t.defaultProps=(0,f.default)({},o.defaultProps,{locale:g.default.Table,primaryKey:"id",prefix:"next-"}),t.contextTypes={listHeader:a.default.any},t.childContextTypes={rowSelection:a.default.object,selectedRowKeys:a.default.array};var e,t=e;return t.displayName="SelectionTable",(0,_.statics)(t,o),(0,d.polyfill)(t)},n(0)),p=o(u),a=o(n(3)),d=n(30),h=o(n(71)),m=o(n(88)),c=n(11),g=o(n(44)),y=o(n(388)),v=o(n(173)),_=n(67);function o(e){return e&&e.__esModule?e:{default:e}}var b=c.func.makeChain,w=function(e){var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:"this",a={},r=[];return e.forEach(function(e){var t=void 0,t="this"===n?e:e[n];a[t]||(r.push(e),a[t]=!0)}),r};e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var u=s(n(12)),d=s(n(2)),i=s(n(4)),l=s(n(6)),a=s(n(7)),c=(t.default=function(s,e){t=n=function(r){function o(){var e,u;(0,i.default)(this,o);for(var t=arguments.length,n=Array(t),a=0;a<t;a++)n[a]=arguments[a];return(e=u=(0,l.default)(this,r.call.apply(r,[this].concat(n)))).state={openRowKeys:u.props.openRowKeys||u.props.defaultOpenRowKeys||[]},u.saveExpandedRowRef=function(e,t){u.expandedRowRefs||(u.expandedRowRefs={}),u.expandedRowRefs[e]=t},u.setExpandedWidth=function(){var e=u.props.prefix,t=u.getTableNode(),n=+(t&&t.clientWidth)-1||"100%",a=t&&t.querySelector("."+e+"table-body");Object.keys(u.expandedRowRefs||{}).forEach(function(e){g.dom.setStyle(u.expandedRowRefs[e],{width:a&&a.clientWidth||n})})},u.getTableInstance=function(e){u.tableInc=e},u.expandedKeydown=function(e,t,n,a){a.preventDefault(),a.stopPropagation(),a.keyCode===g.KEYCODE.ENTER&&u.onExpandedClick(e,t,n,a)},u.renderExpandedCell=function(e,t,n){var a,r=u.props,o=r.getExpandedColProps,i=r.prefix,l=r.locale,r=r.rowExpandable;if("function"==typeof r&&!r(n,t))return"";var r=u.state.openRowKeys,s=u.props.primaryKey,r=-1<r.indexOf(n[s]),s=r?f.default.createElement(m.default,{type:"minus",size:"xs",className:i+"table-expand-unfold"}):f.default.createElement(m.default,{type:"add",size:"xs",className:i+"table-expand-fold"}),o=o(n,t)||{},i=(0,h.default)(((a={})[i+"table-expanded-ctrl"]=!0,a.disabled=o.disabled,a[o.className]=o.className,a));return o.disabled||(o.onClick=u.onExpandedClick.bind(u,e,n,t)),f.default.createElement("span",(0,d.default)({},o,{role:"button",tabIndex:"0",onKeyDown:u.expandedKeydown.bind(u,e,n,t),"aria-label":r?l.expanded:l.folded,"aria-expanded":r,className:i}),s)},u.addExpandCtrl=function(e){var t=u.props,n=t.prefix,t=t.size;e.find(function(e){return"expanded"===e.key})||e.unshift({key:"expanded",title:"",cell:u.renderExpandedCell.bind(u),width:"small"===t?34:50,className:n+"table-expanded "+n+"table-prerow",__normalized:!0})},(0,l.default)(u,e)}return(0,a.default)(o,r),o.prototype.getChildContext=function(){return{openRowKeys:this.state.openRowKeys,expandedRowRender:this.props.expandedRowRender,expandedIndexSimulate:this.props.expandedIndexSimulate,expandedRowWidthEquals2Table:e,getExpandedRowRef:this.saveExpandedRowRef,getTableInstanceForExpand:this.getTableInstance,expandedRowIndent:e?[0,0]:this.props.expandedRowIndent}},o.getDerivedStateFromProps=function(e){return"openRowKeys"in e?{openRowKeys:e.openRowKeys||[]}:null},o.prototype.componentDidMount=function(){this.setExpandedWidth(),g.events.on(window,"resize",this.setExpandedWidth)},o.prototype.componentDidUpdate=function(){this.setExpandedWidth()},o.prototype.componentWillUnmount=function(){g.events.off(window,"resize",this.setExpandedWidth)},o.prototype.getTableNode=function(){var e=this.tableInc;try{return(0,p.findDOMNode)(e.tableEl)}catch(e){return null}},o.prototype.onExpandedClick=function(e,t,n,a){var r=[].concat(this.state.openRowKeys),o=t[this.props.primaryKey],i=r.indexOf(o);-1<i?r.splice(i,1):r.push(o),"openRowKeys"in this.props||this.setState({openRowKeys:r}),this.props.onRowOpen(r,o,-1===i,t),a.stopPropagation()},o.prototype.normalizeChildren=function(e){var t=this.props,n=t.prefix,t=t.size,e=c.Children.map(e,function(e,t){return f.default.cloneElement(e,{key:t})});return e.unshift(f.default.createElement(v.default,{title:"",key:"expanded",cell:this.renderExpandedCell.bind(this),width:"small"===t?34:50,className:n+"table-expanded "+n+"table-prerow",__normalized:!0})),e},o.prototype.normalizeDataSource=function(e){var n=[];return e.forEach(function(e){var t=(0,d.default)({},e);t.__expanded=!0,n.push(e,t)}),n},o.prototype.render=function(){var e=this.props,t=e.components,n=(e.openRowKeys,e.expandedRowRender),a=(e.rowExpandable,e.hasExpandedRowCtrl),r=e.children,o=e.columns,i=e.dataSource,l=e.entireDataSource,e=(e.getExpandedColProps,e.expandedRowIndent,e.onRowOpen,e.onExpandedRowClick,(0,u.default)(e,["components","openRowKeys","expandedRowRender","rowExpandable","hasExpandedRowCtrl","children","columns","dataSource","entireDataSource","getExpandedColProps","expandedRowIndent","onRowOpen","onExpandedRowClick"]));return n&&!t.Row&&((t=(0,d.default)({},t)).Row=y.default,i=this.normalizeDataSource(i),l=this.normalizeDataSource(l)),n&&a&&(o&&!r?this.addExpandCtrl(o):r=this.normalizeChildren(r||[])),f.default.createElement(s,(0,d.default)({},e,{columns:o,dataSource:i,entireDataSource:l,components:t}),r)},o}(f.default.Component),n.ExpandedRow=y.default,n.propTypes=(0,d.default)({expandedRowRender:r.default.func,rowExpandable:r.default.func,expandedRowIndent:r.default.array,openRowKeys:r.default.array,defaultOpenRowKeys:r.default.array,hasExpandedRowCtrl:r.default.bool,getExpandedColProps:r.default.func,onRowOpen:r.default.func,onExpandedRowClick:r.default.func,locale:r.default.object},s.propTypes),n.defaultProps=(0,d.default)({},s.defaultProps,{getExpandedColProps:b,onRowOpen:b,hasExpandedRowCtrl:!0,components:{},expandedRowIndent:e?[0,0]:[1,0],prefix:"next-"}),n.childContextTypes={openRowKeys:r.default.array,expandedRowRender:r.default.func,expandedIndexSimulate:r.default.bool,expandedRowWidthEquals2Table:r.default.bool,expandedRowIndent:r.default.array,getExpandedRowRef:r.default.func,getTableInstanceForExpand:r.default.func};var t,n=t;return n.displayName="ExpandedTable",(0,_.statics)(n,s),(0,o.polyfill)(n)},n(0)),f=s(c),p=n(23),r=s(n(3)),h=s(n(13)),o=n(30),m=s(n(24)),g=n(11),y=s(n(389)),v=s(n(173)),_=n(67);function s(e){return e&&e.__esModule?e:{default:e}}var b=function(){};e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var f=c(n(2)),p=c(n(12)),o=c(n(4)),i=c(n(6)),l=c(n(7));t.default=function(c){e=t=function(a){function r(e,t){(0,o.default)(this,r);var n=(0,i.default)(this,a.call(this,e,t)),t=(n.onScroll=function(){var e,t=n.bodyNode.scrollTop;t!==n.lastScrollTop&&(e=n.computeScrollToRow(t),"scrollToRow"in n.props||n.setState({scrollToRow:e}),n.props.onBodyScroll(e),n.lastScrollTop=t)},n.getBodyNode=function(e,t){t=t?t.charAt(0).toUpperCase()+t.substr(1):"",n["body"+t+"Node"]=e},n.getTableInstance=function(e,t){e=e?e.charAt(0).toUpperCase()+e.substr(1):"",n["table"+e+"Inc"]=t},e.useVirtual),e=e.dataSource,t=t&&e&&0<e.length;return n.state={rowHeight:n.props.rowHeight,scrollToRow:n.props.scrollToRow,height:n.props.maxBodyHeight,hasVirtualData:t},n}return(0,l.default)(r,a),r.prototype.getChildContext=function(){return{onVirtualScroll:this.onScroll,bodyHeight:this.computeBodyHeight(),innerTop:this.computeInnerTop(),getBodyNode:this.getBodyNode,getTableInstanceForVirtual:this.getTableInstance,rowSelection:this.rowSelection}},r.getDerivedStateFromProps=function(e,t){var n={};return"maxBodyHeight"in e&&t.height!==e.maxBodyHeight&&(n.height=e.maxBodyHeight),"scrollToRow"in e&&(n.scrollToRow=e.scrollToRow),t.useVirtual===e.useVirtual&&t.dataSource===e.dataSource||(n.hasVirtualData=e.useVirtual&&e.dataSource&&0<e.dataSource.length),n},r.prototype.componentDidMount=function(){this.state.hasVirtualData&&this.bodyNode&&(this.lastScrollTop=this.bodyNode.scrollTop),this.adjustScrollTop(),this.adjustSize(),this.reComputeSize()},r.prototype.componentDidUpdate=function(){this.adjustScrollTop(),this.adjustSize(),this.reComputeSize()},r.prototype.reComputeSize=function(){var e=this.state,t=e.rowHeight,e=e.hasVirtualData;"function"==typeof t&&e&&(e=(t=this.getRowNode())&&t.clientHeight)!==this.state.rowHeight&&this.setState({rowHeight:e})},r.prototype.computeBodyHeight=function(){var e=this.state.rowHeight,t=this.props.dataSource;if("function"==typeof e)return 0;var n=0;return t.forEach(function(e){e.__hidden||(n+=1)}),n*e},r.prototype.computeInnerTop=function(){var e=this.state.rowHeight;return"function"==typeof e?0:Math.max(this.start-y,0)*e},r.prototype.getVisibleRange=function(e){var t=this.state,n=t.height,t=t.rowHeight,a=this.props.dataSource.length,r=void 0,o=0,i=0,r="function"==typeof t?1:(o=parseInt(u.dom.getPixels(n)/t,10),"number"==typeof e&&(i=e<a?e:0),Math.min(+i+1+o+10,a));return this.end=r,this.visibleCount=o,{start:i,end:r}},r.prototype.adjustScrollTop=function(){this.state.hasVirtualData&&this.bodyNode&&(this.bodyNode.scrollTop=this.lastScrollTop%this.state.rowHeight+this.state.rowHeight*this.state.scrollToRow)},r.prototype.adjustSize=function(){var e,t,n,a,r;this.state.hasVirtualData&&this.bodyNode&&(e=(r=this.bodyNode).querySelector("div"),t=r.clientHeight,r=r.clientWidth,n=this.tableInc,n=(0,s.findDOMNode)(n),a=this.props.prefix,r<(n=(r=n.querySelector("."+a+"table-header table"))&&r.clientWidth)?(u.dom.setStyle(e,"min-width",n),a=this.bodyLeftNode,r=this.bodyRightNode,a&&u.dom.setStyle(a,"max-height",t),r&&u.dom.setStyle(r,"max-height",t)):u.dom.setStyle(e,"min-width","auto"))},r.prototype.computeScrollToRow=function(e){var t=this.state.rowHeight,e=parseInt(e/t);return this.start=e},r.prototype.getRowNode=function(){try{return(0,s.findDOMNode)(this.tableInc.getRowRef(0))}catch(e){return null}},r.prototype.render=function(){var e,a,r,o,t=this.props,n=(t.useVirtual,t.components),i=t.dataSource,l=t.fixedHeader,s=(t.rowHeight,t.scrollToRow),t=(t.onBodyScroll,(0,p.default)(t,["useVirtual","components","dataSource","fixedHeader","rowHeight","scrollToRow","onBodyScroll"])),u=i,d=i;return this.rowSelection=this.props.rowSelection,this.state.hasVirtualData&&(d=[],n=(0,f.default)({},n),e=this.getVisibleRange(this.state.scrollToRow),a=e.start,r=e.end,o=-1,i.forEach(function(e,t,n){e.__hidden||(o+=1)>=Math.max(a-y,0)&&o<r&&d.push(e),e.__rowIndex=t}),n.Body||(n.Body=m.default),l=!0),h.default.createElement(c,(0,f.default)({},t,{scrollToRow:s,dataSource:d,entireDataSource:u,components:n,fixedHeader:l}))},r}(h.default.Component),t.VirtualBody=m.default,t.propTypes=(0,f.default)({useVirtual:a.default.bool,rowHeight:a.default.oneOfType([a.default.number,a.default.func]),maxBodyHeight:a.default.oneOfType([a.default.number,a.default.string]),primaryKey:a.default.oneOfType([a.default.symbol,a.default.string]),dataSource:a.default.array,onBodyScroll:a.default.func},c.propTypes),t.defaultProps=(0,f.default)({},c.defaultProps,{primaryKey:"id",rowHeight:g,maxBodyHeight:200,components:{},prefix:"next-",onBodyScroll:g}),t.childContextTypes={onVirtualScroll:a.default.func,bodyHeight:a.default.number,innerTop:a.default.number,getBodyNode:a.default.func,getTableInstanceForVirtual:a.default.func,rowSelection:a.default.object};var e,t=e;return t.displayName="VirtualTable",(0,d.statics)(t,c),(0,r.polyfill)(t)};var h=c(n(0)),s=n(23),a=c(n(3)),r=n(30),u=n(11),m=c(n(650)),d=n(67);function c(e){return e&&e.__esModule?e:{default:e}}var g=function(){},y=10;e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var u=s(n(2)),d=s(n(12)),o=s(n(4)),i=s(n(6)),a=s(n(7)),c=s(n(0)),r=n(23),l=s(n(3)),f=s(n(127));function s(e){return e&&e.__esModule?e:{default:e}}p=c.default.Component,(0,a.default)(h,p),h.prototype.componentDidMount=function(){var e=(0,r.findDOMNode)(this);this.context.getNode("body",e),this.context.getBodyNode(e,this.context.lockType),this.context.getLockNode("body",e,this.context.lockType)},h.prototype.render=function(){var e=this.props,t=e.prefix,n=e.className,a=e.colGroup,r=e.tableWidth,e=(0,d.default)(e,["prefix","className","colGroup","tableWidth"]),o=this.context,i=o.maxBodyHeight,l=o.bodyHeight,o=o.innerTop,r={width:r},s={position:"relative"};return i<l&&(s.height=l),c.default.createElement("div",{style:{maxHeight:i},className:n,onScroll:this.onScroll},c.default.createElement("div",{style:s,ref:this.virtualScrollRef},c.default.createElement("div",{style:{position:"relative",transform:"translateY("+o+"px)",willChange:"transform"}},c.default.createElement("table",{ref:this.tableRef,style:r},a,c.default.createElement(f.default,(0,u.default)({},e,{prefix:t}))))))},a=n=h,n.propTypes={children:l.default.any,prefix:l.default.string,className:l.default.string,colGroup:l.default.any,tableWidth:l.default.number},n.contextTypes={maxBodyHeight:l.default.oneOfType([l.default.number,l.default.string]),onBodyScroll:l.default.func,onFixedScrollSync:l.default.func,onVirtualScroll:l.default.func,onLockBodyScroll:l.default.func,bodyHeight:l.default.number,innerTop:l.default.number,getNode:l.default.func,getBodyNode:l.default.func,getLockNode:l.default.func,lockType:l.default.oneOf(["left","right"])};var p,n=a;function h(){var e,t;(0,o.default)(this,h);for(var n=arguments.length,a=Array(n),r=0;r<n;r++)a[r]=arguments[r];return(e=t=(0,i.default)(this,p.call.apply(p,[this].concat(a)))).tableRef=function(e){t.tableNode=e},t.virtualScrollRef=function(e){t.virtualScrollNode=e},t.onScroll=function(e){t.context.onFixedScrollSync(e),t.context.onLockBodyScroll(e),t.context.onVirtualScroll()},(0,i.default)(t,e)}n.displayName="VirtualBody",t.default=n,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var f=c(n(12)),r=c(n(38)),p=c(n(2)),o=c(n(4)),i=c(n(6)),l=c(n(7)),s=(t.default=function(c){e=t=function(n){function a(e,t){(0,o.default)(this,a);var r=(0,i.default)(this,n.call(this,e,t));return r.state={},r.getTableInstance=function(e,t){e=e?e.charAt(0).toUpperCase()+e.substr(1):"",r["table"+e+"Inc"]=t},r.getNode=function(e,t,n){n=n?n.charAt(0).toUpperCase()+n.substr(1):"",r[""+e+n+"Node"]=t,"header"!==e||r.innerHeaderNode||n||(r.innerHeaderNode=r.headerNode.querySelector("div"))},r.onRowMouseEnter=function(e,t){r.isLock()&&[r.getRowNode(t),r.getRowNode(t,"left"),r.getRowNode(t,"right")].forEach(function(e){e&&g.dom.addClass(e,"hovered")})},r.onRowMouseLeave=function(e,t){r.isLock()&&[r.getRowNode(t),r.getRowNode(t,"left"),r.getRowNode(t,"right")].forEach(function(e){e&&g.dom.removeClass(e,"hovered")})},r.onLockBodyScrollTop=function(e){var t,n=e.target;e.currentTarget===n&&(t=n.scrollTop,r.isLock()&&t!==r.lastScrollTop&&(e=r.bodyRightNode,[r.bodyLeftNode,e,r.bodyNode].forEach(function(e){e&&e.scrollTop!==t&&(e.scrollTop=t)}),r.lastScrollTop=t))},r.onLockBodyScrollLeft=function(){var e,t,n,a;r.isLock()&&(e=(t=r.props.rtl)?r.getWrapperNode("left"):r.getWrapperNode("right"),t=t?r.getWrapperNode("right"):r.getWrapperNode("left"),n="shadow",0===(a=r.bodyNode.scrollLeft)?(t&&g.dom.removeClass(t,n),e&&g.dom.addClass(e,n)):a===r.bodyNode.scrollWidth-r.bodyNode.clientWidth?(t&&g.dom.addClass(t,n),e&&g.dom.removeClass(e,n)):(t&&g.dom.addClass(t,n),e&&g.dom.addClass(e,n)))},r.onLockBodyScroll=function(e){r.onLockBodyScrollTop(e),r.onLockBodyScrollLeft()},r.adjustSize=function(){r.adjustIfTableNotNeedLock()||(r.adjustHeaderSize(),r.adjustBodySize(),r.adjustRowHeight(),r.onLockBodyScrollLeft())},r.getFlatenChildrenLength=function(){return function t(e){var n=[];return e.forEach(function(e){e&&e.children?n.push.apply(n,t(e.children)):n.push(e)}),n}(0<arguments.length&&void 0!==arguments[0]?arguments[0]:[]).length},r.saveLockLeftRef=function(e){r.lockLeftEl=e},r.saveLockRightRef=function(e){r.lockRightEl=e},r.lockLeftChildren=[],r.lockRightChildren=[],r}return(0,l.default)(a,n),a.prototype.getChildContext=function(){return{getTableInstance:this.getTableInstance,getLockNode:this.getNode,onLockBodyScroll:this.onLockBodyScroll,onRowMouseEnter:this.onRowMouseEnter,onRowMouseLeave:this.onRowMouseLeave}},a.prototype.componentDidMount=function(){g.events.on(window,"resize",this.adjustSize),this.scroll(),this.adjustSize(),this.forceUpdate()},a.prototype.shouldComponentUpdate=function(e,t,n){return!e.pure||!((0,d.default)(e,this.props)&&g.obj.shallowEqual(n,this.context))},a.prototype.componentDidUpdate=function(){this.adjustSize(),this._isLock=!1},a.prototype.componentWillUnmount=function(){g.events.off(window,"resize",this.adjustSize)},a.prototype.normalizeChildrenState=function(e){e=this.normalizeChildren(e),e=this.splitFromNormalizeChildren(e);return{lockLeftChildren:e.lockLeftChildren,lockRightChildren:e.lockRightChildren,children:this.mergeFromSplitLockChildren(e)}},a.prototype.normalizeChildren=function(e){var t=e.children,e=e.columns,n=!1,a=void 0,r=function(e){-1<[!0,"left","right"].indexOf(e.lock)&&("width"in e||g.log.warning("Should config width for lock column named [ "+e.dataIndex+" ]."),n=!0)};return e&&!t?function t(e){e.forEach(function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{};r(e),e.children&&t(e.children)})}(a=e):a=function n(e){var a=[];return s.Children.forEach(e,function(e){var t;e&&(t=(0,p.default)({},e.props),r(t),a.push(t),e.props.children&&(t.children=n(e.props.children)))}),a}(t),a.forEach(function(e){e.__normalized&&n&&(e.lock=e.lock||"left",delete e.__normalized)}),this._isLock=n,a},a.prototype.splitFromNormalizeChildren=function(e){function r(t,n){var a=[];return t.forEach(function(e){e.children?r(e.children,n).length||a.push(e):n(e)||a.push(e)}),a.forEach(function(e){e=t.indexOf(e);t.splice(e,1)}),t}var t=k(e),n=k(e),e=k(e);return r(n,function(e){if(!0===e.lock||"left"===e.lock)return"left"}),r(e,function(e){if("right"===e.lock)return"right"}),r(t,function(e){return!0!==e.lock&&"left"!==e.lock&&"right"!==e.lock}),{lockLeftChildren:n,lockRightChildren:e,originChildren:t}},a.prototype.mergeFromSplitLockChildren=function(e){var t=e.lockLeftChildren,n=e.lockRightChildren,e=e.originChildren;return Array.prototype.unshift.apply(e,t),e=e.concat(n)},a.prototype.scroll=function(){var e,t=this.props,n=t.scrollToCol,n=void 0===n?0:n,t=t.scrollToRow,t=void 0===t?0:t;(n||t)&&this.bodyNode&&(n=this.getCellNode(0,n),t=this.getCellNode(t,0),e=this.bodyNode.getBoundingClientRect()||{},n&&(n=n.getBoundingClientRect().left-e.left,this.bodyNode.scrollLeft=n),t&&(n=t.getBoundingClientRect().top-e.top,this.bodyNode.scrollTop=n))},a.prototype.isLock=function(){return this.lockLeftChildren.length||this.lockRightChildren.length},a.prototype.isOriginLock=function(){return this._isLock},a.prototype.removeLockTable=function(){var e=this.lockLeftChildren.length,t=this.lockRightChildren.length;if(e&&(this._notNeedAdjustLockLeft=!0),t&&(this._notNeedAdjustLockRight=!0),t||e)return this.forceUpdate(),!0},a.prototype.adjustIfTableNotNeedLock=function(){var a=this;if(this.isOriginLock()){var e=this.tableInc.flatChildren.map(function(e,t){var n=a.getCellNode(0,t)||{},t=a.getHeaderCellNode(0,t)||{};try{return{cellWidths:parseFloat(getComputedStyle(n).width)||0,headerWidths:parseFloat(getComputedStyle(t).width)||0}}catch(e){return{cellWidths:n.clientWidth||0,headerWidths:t.clientWidth||0}}}).reduce(function(e,t){return{cellWidths:e.cellWidths+t.cellWidths,headerWidths:e.headerWidths+t.headerWidths}},{cellWidths:0,headerWidths:0}),t=void 0;try{t=(0,u.findDOMNode)(this).clientWidth}catch(e){t=0}if(0===t)return!0;e=parseInt(e.cellWidths)||parseInt(e.headerWidths);if(e<=t&&0<e)this.removeLockTable();else{if(!this._notNeedAdjustLockLeft&&!this._notNeedAdjustLockRight)return this._notNeedAdjustLockLeft=this._notNeedAdjustLockRight=!1;this._notNeedAdjustLockLeft=this._notNeedAdjustLockRight=!1,this.forceUpdate()}}return!1},a.prototype.adjustBodySize=function(){var e,t,n,a,r,o=this.props,i=o.rtl,o=o.hasHeader,l=this.headerNode,s=i?"paddingLeft":"paddingRight",u=i?"marginLeft":"marginRight",d=+g.dom.scrollbar().width||0,c=((r={})[s]=d,r[u]=d,this.bodyNode),f=c&&c.scrollHeight>c.clientHeight;this.isLock()?(e=this.bodyLeftNode,t=this.bodyRightNode,n=this.getWrapperNode("right"),a=f?d:0,c=c.offsetHeight-d,f||(r[s]=0,r[u]=0),+d?(r.marginBottom=-d,r.paddingBottom=d):(r.marginBottom=-20,r.paddingBottom=20),c={"max-height":c},o||+d||(c[u]=0),+d&&(c[u]=-d),e&&g.dom.setStyle(e,c),t&&g.dom.setStyle(t,c),n&&+d&&g.dom.setStyle(n,i?"left":"right",a+"px")):(r.marginBottom=-d,r.paddingBottom=d,r[u]=0,f||(r[s]=0)),l&&g.dom.setStyle(l,r)},a.prototype.adjustHeaderSize=function(){var o=this;this.isLock()&&this.tableInc.groupChildren.forEach(function(e,t){var n=o.tableInc.groupChildren[t].length-1,n=o.getHeaderCellNode(t,n),a=o.getHeaderCellNode(t,0),r=o.getHeaderCellNode(t,0,"right"),t=o.getHeaderCellNode(t,0,"left");n&&r&&(n=n.offsetHeight,g.dom.setStyle(r,"height",n),setTimeout(function(){var e=o.tableRightInc.affixRef;return e&&e.getInstance()&&e.getInstance().updatePosition()})),a&&t&&(r=a.offsetHeight,g.dom.setStyle(t,"height",r),setTimeout(function(){var e=o.tableLeftInc.affixRef;return e&&e.getInstance()&&e.getInstance().updatePosition()}))})},a.prototype.adjustRowHeight=function(){var n=this;this.isLock()&&this.tableInc.props.dataSource.forEach(function(e,t){t=""+("object"===(void 0===e?"undefined":(0,r.default)(e))&&"__rowIndex"in e?e.__rowIndex:t)+(e.__expanded?"_expanded":"");n.setRowHeight(t,"left"),n.setRowHeight(t,"right")})},a.prototype.setRowHeight=function(e,t){var t=this.getRowNode(e,t),e=this.getRowNode(e),e=(M?e&&e.offsetHeight:e&&parseFloat(getComputedStyle(e).height))||"auto",n=(M?t&&t.offsetHeight:t&&parseFloat(getComputedStyle(t).height))||"auto";t&&e!==n&&g.dom.setStyle(t,"height",e)},a.prototype.getWrapperNode=function(e){e=e?e.charAt(0).toUpperCase()+e.substr(1):"";try{return(0,u.findDOMNode)(this["lock"+e+"El"])}catch(e){return null}},a.prototype.getRowNode=function(e,t){t=this["table"+(t=t?t.charAt(0).toUpperCase()+t.substr(1):"")+"Inc"];try{return(0,u.findDOMNode)(t.getRowRef(e))}catch(e){return null}},a.prototype.getHeaderCellNode=function(e,t,n){n=this["table"+(n=n?n.charAt(0).toUpperCase()+n.substr(1):"")+"Inc"];try{return(0,u.findDOMNode)(n.getHeaderCellRef(e,t))}catch(e){return null}},a.prototype.getCellNode=function(e,t,n){n=this["table"+(n=n?n.charAt(0).toUpperCase()+n.substr(1):"")+"Inc"];try{return(0,u.findDOMNode)(n.getCellRef(e,t))}catch(e){return null}},a.prototype.render=function(){var e,t=this.props,n=(t.children,t.columns,t.prefix),a=t.components,r=t.className,o=t.dataSource,i=t.tableWidth,t=(0,f.default)(t,["children","columns","prefix","components","className","dataSource","tableWidth"]),l=this.normalizeChildrenState(this.props),s=l.lockLeftChildren,u=l.lockRightChildren,l=l.children,d={left:this.getFlatenChildrenLength(s),right:this.getFlatenChildrenLength(u),origin:this.getFlatenChildrenLength(l)};return this._notNeedAdjustLockLeft&&(s=[]),this._notNeedAdjustLockRight&&(u=[]),this.lockLeftChildren=s,this.lockRightChildren=u,this.isOriginLock()?((a=(0,p.default)({},a)).Body=a.Body||v.default,a.Header=a.Header||_.default,a.Wrapper=a.Wrapper||b.default,a.Row=a.Row||y.default,r=(0,m.default)(((e={})[n+"table-lock"]=!0,e[n+"table-wrap-empty"]=!o.length,e[r]=r,e)),e=[h.default.createElement(c,(0,p.default)({},t,{dataSource:o,key:"lock-left",columns:s,className:n+"table-lock-left",lengths:d,prefix:n,lockType:"left",components:a,ref:this.saveLockLeftRef,loading:!1,"aria-hidden":!0})),h.default.createElement(c,(0,p.default)({},t,{dataSource:o,key:"lock-right",columns:u,className:n+"table-lock-right",lengths:d,prefix:n,lockType:"right",components:a,ref:this.saveLockRightRef,loading:!1,"aria-hidden":!0}))],h.default.createElement(c,(0,p.default)({},t,{tableWidth:i,dataSource:o,columns:l,prefix:n,lengths:d,wrapperContent:e,components:a,className:r}))):h.default.createElement(c,this.props)},a}(h.default.Component),t.LockRow=y.default,t.LockBody=v.default,t.LockHeader=_.default,t.propTypes=(0,p.default)({scrollToCol:a.default.number,scrollToRow:a.default.number},c.propTypes),t.defaultProps=(0,p.default)({},c.defaultProps),t.childContextTypes={getTableInstance:a.default.func,getLockNode:a.default.func,onLockBodyScroll:a.default.func,onRowMouseEnter:a.default.func,onRowMouseLeave:a.default.func};var e,t=e;return t.displayName="LockTable",(0,w.statics)(t,c),t},n(0)),h=c(s),u=n(23),a=c(n(3)),m=c(n(13)),d=c(n(172)),g=n(11),y=c(n(174)),v=c(n(391)),_=c(n(392)),b=c(n(131)),w=n(67);function c(e){return e&&e.__esModule?e:{default:e}}var M=g.env.ieVersion;function k(e){return function n(e){return e.map(function(e){var t=(0,p.default)({},e);return e.children&&(e.children=n(e.children)),t})}(e)}e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var s=l(n(12)),u=l(n(2)),r=l(n(4)),o=l(n(6)),i=l(n(7)),d=(t.default=function(l){e=t=function(n){function a(e,t){(0,r.default)(this,a);var d=(0,o.default)(this,n.call(this,e));return d.state={},d.updateOffsetArr=function(){var e=d.splitChildren||{},t=e.lockLeftChildren,n=e.lockRightChildren,e=e.originChildren,a=d.getFlatenChildren(t).length,r=d.getFlatenChildren(n).length,e=a+r+d.getFlatenChildren(e).length,a=0<a,r=0<r,t=d.getStickyWidth(t,"left",e),n=d.getStickyWidth(n,"right",e),e={};""+t!=""+d.state.leftOffsetArr&&(e.leftOffsetArr=t),""+n!=""+d.state.rightOffsetArr&&(e.rightOffsetArr=n),a!==d.state.hasLockLeft&&(e.hasLockLeft=a),r!==d.state.hasLockRight&&(e.hasLockRight=r),0<Object.keys(e).length&&d.setState(e)},d.onLockBodyScroll=function(e,t){var e=e.currentTarget||{},n=e.scrollLeft,a=e.scrollWidth,e=e.clientWidth,r=d.pingRight,o=d.pingLeft,i=0<n&&d.state.hasLockLeft,n=n<a-e&&d.state.hasLockRight;!t&&o===i&&r===n||(a=d.props.prefix,e=d.getTableNode(),d.pingLeft=i,d.pingRight=n,m.dom[i?"addClass":"removeClass"](e,a+"table-ping-left"),m.dom[n?"addClass":"removeClass"](e,a+"table-ping-right"))},d.getStickyWidth=function(e,o,i){var t=d.props,l=t.dataSource,s=t.scrollToRow,t=[],e=d.getFlatenChildren(e),u=e.length;return e.reduce(function(e,t,n){var a="left"===o?n:u-1-n,r="left"===o?a-1:a+1,n="left"===o?a-1:i-n;return"left"===o&&0===a?e[0]=0:"right"===o&&a===u-1?e[a]=0:(n=(n=!(l&&0<l.length)?d.getHeaderCellNode(0,n):d.getCellNode(s||l[0]&&l[0].__rowIndex||0,n))&&parseFloat(getComputedStyle(n).width)||0,e[a]=(e[r]||0)+n),e},t),t},d.getTableInstance=function(e,t){d.tableInc=t},d.getNode=function(e,t){d[e+"Node"]=t},d.getFlatenChildren=function(){return function t(e){var n=[];return e.forEach(function(e){e.children?n.push.apply(n,t(e.children)):n.push(e)}),n}(0<arguments.length&&void 0!==arguments[0]?arguments[0]:[])},d.state={hasLockLeft:!0,hasLockRight:!0},d.pingLeft=!1,d.pingRight=!1,d}return(0,i.default)(a,n),a.prototype.getChildContext=function(){return{getTableInstance:this.getTableInstance,getLockNode:this.getNode,onLockBodyScroll:this.onLockBodyScroll}},a.prototype.componentDidMount=function(){var e=this.props.dataSource,e=!(e&&0<e.length);this.updateOffsetArr(),this.onLockBodyScroll(e?{currentTarget:this.headerNode}:{currentTarget:this.bodyNode}),this.forceUpdate(),m.events.on(window,"resize",this.updateOffsetArr)},a.prototype.shouldComponentUpdate=function(e,t,n){return!e.pure||!((0,h.default)(e,this.props)&&m.obj.shallowEqual(n,this.context))},a.prototype.componentDidUpdate=function(){this.updateOffsetArr(),this.onLockBodyScroll(this.bodyNode?{currentTarget:this.bodyNode}:{currentTarget:this.headerNode},!0)},a.prototype.componentWillUnmount=function(){this.pingLeft=!1,this.pingRight=!1,m.events.off(window,"resize",this.updateOffsetArr)},a.prototype.normalizeChildrenState=function(e){var t=this.normalizeChildren(e);return this.splitChildren=this.splitFromNormalizeChildren(t),this.mergeFromSplitLockChildren(this.splitChildren,e.prefix)},a.prototype.normalizeChildren=function(e){function a(e){var n=[];return d.Children.forEach(e,function(e){var t;e&&(t=(0,u.default)({},e.props),-1<[!0,"left","right"].indexOf(t.lock)&&(r=!0,"width"in t||m.log.warning("Should config width for lock column named [ "+t.dataIndex+" ].")),n.push(t),e.props.children&&(t.children=a(e.props.children)))}),n}var t=e.children,e=e.columns,r=!1,n=void 0;return e&&!t?r=(n=e).find(function(e){return-1<[!0,"left","right"].indexOf(e.lock)}):n=a(t),n.forEach(function(e){e.__normalized&&r&&(e.lock=e.lock||"left",delete e.__normalized)}),n},a.prototype.splitFromNormalizeChildren=function(e){function r(t,n){var a=[];return t.forEach(function(e){e.children?r(e.children,n).length||a.push(e):n(e)||a.push(e)}),a.forEach(function(e){e=t.indexOf(e);t.splice(e,1)}),t}var t=w(e),n=w(e),e=w(e);return r(n,function(e){if(!0===e.lock||"left"===e.lock)return"left"}),r(e,function(e){if("right"===e.lock)return"right"}),r(t,function(e){return!0!==e.lock&&"left"!==e.lock&&"right"!==e.lock}),{lockLeftChildren:n,lockRightChildren:e,originChildren:t}},a.prototype.mergeFromSplitLockChildren=function(e,t){var n=e.lockLeftChildren,a=e.lockRightChildren,e=e.originChildren,r=this.getFlatenChildren(n),o=this.getFlatenChildren(a);return(0,b.setStickyStyle)(n,r,"left",this.state.leftOffsetArr,t),(0,b.setStickyStyle)(a,o,"right",this.state.rightOffsetArr,t),[].concat(n,e,a)},a.prototype.getCellNode=function(e,t){var n=this.tableInc;try{return(0,f.findDOMNode)(n.getCellRef(e,t))}catch(e){return null}},a.prototype.getTableNode=function(){var e=this.tableInc;try{return(0,f.findDOMNode)(e.tableEl)}catch(e){return null}},a.prototype.getHeaderCellNode=function(e,t){var n=this.tableInc;try{return(0,f.findDOMNode)(n.getHeaderCellRef(e,t))}catch(e){return null}},a.prototype.render=function(){var e,t=this.props,n=(t.children,t.columns,t.prefix),a=t.components,r=(t.scrollToRow,t.className),o=t.dataSource,t=(0,s.default)(t,["children","columns","prefix","components","scrollToRow","className","dataSource"]),i=this.normalizeChildrenState(this.props);return(a=(0,u.default)({},a)).Body=a.Body||y.default,a.Header=a.Header||v.default,a.Wrapper=a.Wrapper||_.default,a.Row=a.Row||g.default,r=(0,p.default)(((e={})[n+"table-lock"]=!0,e[n+"table-stickylock"]=!0,e[n+"table-wrap-empty"]=!o.length,e[r]=r,e)),c.default.createElement(l,(0,u.default)({},t,{dataSource:o,columns:i,prefix:n,components:a,className:r}))},a}(c.default.Component),t.LockRow=g.default,t.LockBody=y.default,t.LockHeader=v.default,t.propTypes=(0,u.default)({scrollToCol:a.default.number,scrollToRow:a.default.number},l.propTypes),t.defaultProps=(0,u.default)({},l.defaultProps),t.childContextTypes={getTableInstance:a.default.func,getLockNode:a.default.func,onLockBodyScroll:a.default.func};var e,t=e;return t.displayName="LockTable",(0,b.statics)(t,l),t},n(0)),c=l(d),f=n(23),a=l(n(3)),p=l(n(13)),h=l(n(172)),m=n(11),g=l(n(174)),y=l(n(391)),v=l(n(392)),_=l(n(131)),b=n(67);function l(e){return e&&e.__esModule?e:{default:e}}function w(e){return function n(e){return e.map(function(e){var t=(0,u.default)({},e);return e.children&&(e.children=n(e.children)),t})}(e)}e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var u=s(n(38)),d=s(n(12)),c=s(n(2)),l=s(n(4)),f=s(n(6)),a=s(n(7)),p=(t.default=function(s){e=t=function(o){function i(){var e,t;(0,l.default)(this,i);for(var n=arguments.length,a=Array(n),r=0;r<n;r++)a[r]=arguments[r];return(e=t=(0,f.default)(this,o.call.apply(o,[this].concat(a)))).state={},(0,f.default)(t,e)}return(0,a.default)(i,o),i.prototype.getChildContext=function(){return{listHeader:this.listHeader,listFooter:this.listFooter,rowSelection:this.rowSelection}},i.prototype.normalizeDataSource=function(e){var a=[];return function t(e,n){e.forEach(function(e){e=(0,c.default)({},e);e.__level=n,a.push(e),e.children&&t(e.children,n+1)})}(e,0),this.ds=a},i.prototype.render=function(){var t=this,e=this.props,n=e.components,a=e.children,r=e.className,o=e.prefix,e=(0,d.default)(e,["components","children","className","prefix"]),i=!1,l=[];return p.Children.forEach(a,function(e){e&&(-1<["function","object"].indexOf((0,u.default)(e.type))?"listHeader"===e.type._typeMark?(t.listHeader=e.props,i=!0):"listFooter"===e.type._typeMark?t.listFooter=e.props:l.push(e):l.push(e))}),this.rowSelection=this.props.rowSelection,i&&((n=(0,c.default)({},n)).Row=n.Row||g.default,n.Body=n.Body||y.default,n.Header=n.Header||v.default,n.Wrapper=n.Wrapper||_.default,r=(0,m.default)(((a={})[o+"table-group"]=!0,a[r]=r,a))),h.default.createElement(s,(0,c.default)({},e,{components:n,children:0<l.length?l:void 0,className:r,prefix:o}))},i}(h.default.Component),t.ListHeader=o.default,t.ListFooter=i.default,t.ListRow=g.default,t.ListBody=y.default,t.propTypes=(0,c.default)({},s.propTypes),t.defaultProps=(0,c.default)({},s.defaultProps),t.childContextTypes={listHeader:r.default.any,listFooter:r.default.any,rowSelection:r.default.object};var e,t=e;return t.displayName="ListTable",(0,b.statics)(t,s),t},n(0)),h=s(p),r=s(n(3)),m=s(n(13)),o=s(n(393)),i=s(n(394)),g=s(n(654)),y=s(n(655)),v=s(n(130)),_=s(n(131)),b=n(67);function s(e){return e&&e.__esModule?e:{default:e}}e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var o=f(n(2)),i=f(n(12)),a=f(n(4)),r=f(n(6)),l=f(n(7)),s=f(n(0)),u=f(n(3)),d=f(n(13)),c=n(11),n=f(n(128));function f(e){return e&&e.__esModule?e:{default:e}}p=n.default,(0,l.default)(h,p),h.prototype.render=function(){var e,t=this.props,n=t.prefix,a=t.className,r=(t.onClick,t.onMouseEnter,t.onMouseLeave,t.columns,t.Cell,t.rowIndex,t.__rowIndex,t.record,t.children,t.primaryKey,t.colGroup),t=(t.cellRef,t.getCellProps,t.locale,t.wrapper,t.rtl,(0,i.default)(t,["prefix","className","onClick","onMouseEnter","onMouseLeave","columns","Cell","rowIndex","__rowIndex","record","children","primaryKey","colGroup","cellRef","getCellProps","locale","wrapper","rtl"])),n=(0,d.default)(((e={})[n+"table-row"]=!0,e[a]=a,e));return this.context.notRenderCellIndex=[],s.default.createElement("table",(0,o.default)({className:n,role:"row"},t,{onClick:this.onClick,onMouseEnter:this.onMouseEnter,onMouseLeave:this.onMouseLeave}),r,s.default.createElement("tbody",null,this.renderContent("header"),this.renderChildren(),this.renderContent("footer")))},h.prototype.isChildrenSelection=function(){return this.context.listHeader&&this.context.listHeader.hasChildrenSelection},h.prototype.isFirstLevelDataWhenNoChildren=function(){return this.context.listHeader&&this.context.listHeader.useFirstLevelDataWhenNoChildren},h.prototype.isSelection=function(){return this.context.listHeader&&this.context.listHeader.hasSelection},h.prototype.renderChildren=function(){var a=this,e=this.props,t=e.record,r=e.primaryKey,e=t.children,n=e;return this.isFirstLevelDataWhenNoChildren()&&(c.log.warning("useFirstLevelDataWhenNoChildren is deprecated, change your dataSource structure, make sure there is 'children' in your dataSource."),n=e||[t]),n?n.map(function(e,t){var n=a.renderCells(e,t);return a.isChildrenSelection()?(e[r]||c.log.warning("record.children/recored should contains primaryKey when childrenSelection is true."),s.default.createElement("tr",{key:e[r]},n)):(a.context.rowSelection&&(n.shift(),n[0]=n[0]&&s.default.cloneElement(n[0],(0,o.default)({colSpan:2},n[0].props))),s.default.createElement("tr",{key:t},n))}):null},h.prototype.renderContent=function(e){var t=this.props,n=t.columns,a=t.prefix,r=t.record,t=t.rowIndex,o=e.charAt(0).toUpperCase()+e.substr(1),o=this.context["list"+o],i=void 0;return o&&(s.default.isValidElement(o.cell)?i=s.default.cloneElement(o.cell,{record:r,index:t}):"function"==typeof o.cell&&(i=o.cell(r,t)),i&&(o=this.renderCells(r),i="header"===e&&this.context.rowSelection&&this.isSelection()?((o=o.slice(0,1)).push(s.default.createElement("td",{colSpan:n.length-1,key:"listNode"},s.default.createElement("div",{className:a+"table-cell-wrapper"},i))),s.default.createElement("tr",{className:a+"table-group-"+e},o)):s.default.createElement("tr",{className:a+"table-group-"+e},s.default.createElement("td",{colSpan:n.length},s.default.createElement("div",{className:a+"table-cell-wrapper"},i))))),i},(n=h).contextTypes={listHeader:u.default.any,listFooter:u.default.any,rowSelection:u.default.object,notRenderCellIndex:u.default.array,lockType:u.default.oneOf(["left","right"])};var p,l=n;function h(){return(0,a.default)(this,h),(0,r.default)(this,p.apply(this,arguments))}t.default=l,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var a=i(n(2));t.default=function(e){return r.default.createElement(o.default,(0,a.default)({component:"div"},e))};var r=i(n(0)),o=i(n(127));function i(e){return e&&e.__esModule?e:{default:e}}e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var s=i(n(2)),u=i(n(12)),d=i(n(4)),c=i(n(6)),a=i(n(7));t.default=function(l){e=t=function(o){function i(){var e,t;(0,d.default)(this,i);for(var n=arguments.length,a=Array(n),r=0;r<n;r++)a[r]=arguments[r];return(e=t=(0,c.default)(this,o.call.apply(o,[this].concat(a)))).state={},(0,c.default)(t,e)}return(0,a.default)(i,o),i.prototype.getChildContext=function(){return{Header:this.props.components.Header||p.default,offsetTop:this.props.offsetTop,affixProps:this.props.affixProps}},i.prototype.render=function(){var e=this.props,t=e.stickyHeader,e=(e.offsetTop,e.affixProps,(0,u.default)(e,["stickyHeader","offsetTop","affixProps"])),n=this.props,a=n.components,r=n.maxBodyHeight,n=n.fixedHeader;return t&&((a=(0,s.default)({},a)).Header=h.default,n=!0,r=Math.max(r,1e4)),f.default.createElement(l,(0,s.default)({},e,{components:a,fixedHeader:n,maxBodyHeight:r}))},i}(f.default.Component),t.StickyHeader=h.default,t.propTypes=(0,s.default)({stickyHeader:r.default.bool,offsetTop:r.default.number,affixProps:r.default.object,components:r.default.object},l.propTypes),t.defaultProps=(0,s.default)({components:{}},l.defaultProps),t.childContextTypes={Header:r.default.any,offsetTop:r.default.number,affixProps:r.default.object};var e,t=e;return t.displayName="StickyTable",(0,o.statics)(t,l),t};var f=i(n(0)),r=i(n(3)),p=i(n(130)),h=i(n(657)),o=n(67);function i(e){return e&&e.__esModule?e:{default:e}}e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var i=f(n(2)),l=f(n(12)),o=f(n(4)),s=f(n(6)),a=f(n(7)),u=f(n(0)),r=f(n(3)),d=f(n(13)),c=f(n(658));function f(e){return e&&e.__esModule?e:{default:e}}p=u.default.Component,(0,a.default)(h,p),h.prototype.render=function(){var e,t=this.props.prefix,n=this.context,a=n.Header,r=n.offsetTop,n=n.affixProps||{},o=n.className,n=(0,l.default)(n,["className"]),t=(0,d.default)(((e={})[t+"table-affix"]=!0,e.className=o,e));return u.default.createElement(c.default,(0,i.default)({ref:this.getAffixRef},n,{className:t,offsetTop:r}),u.default.createElement(a,this.props))},a=n=h,n.propTypes={prefix:r.default.string},n.contextTypes={Header:r.default.any,offsetTop:r.default.number,affixProps:r.default.object};var p,n=a;function h(){var e,t;(0,o.default)(this,h);for(var n=arguments.length,a=Array(n),r=0;r<n;r++)a[r]=arguments[r];return(e=t=(0,s.default)(this,p.call.apply(p,[this].concat(a)))).getAffixRef=function(e){t.props.affixRef&&t.props.affixRef(e)},(0,s.default)(t,e)}n.displayName="StickHeader",t.default=n,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var s=m(n(2)),a=m(n(4)),r=m(n(6)),o=m(n(7)),u=m(n(0)),i=m(n(3)),d=m(n(13)),l=(n(23),n(30)),c=m(n(133)),f=n(11),p=m(n(8)),h=n(659);function m(e){return e&&e.__esModule?e:{default:e}}g=u.default.Component,(0,o.default)(y,g),y._getAffixMode=function(e){var t,n={top:!1,bottom:!1,offset:0};return e&&(t=e.offsetTop,e=e.offsetBottom,"number"!=typeof t&&"number"!=typeof e?n.top=!0:"number"==typeof t?(n.top=!0,n.bottom=!1,n.offset=t):"number"==typeof e&&(n.bottom=!0,n.top=!1,n.offset=e)),n},y.getDerivedStateFromProps=function(e,t){return"offsetTop"in e||"offsetBottom"in e?{affixMode:y._getAffixMode(e)}:null},y.prototype.componentDidMount=function(){var e=this,t=this.props.container;this.timeout=setTimeout(function(){e._updateNodePosition(),e._setEventHandlerForContainer(t)})},y.prototype.componentDidUpdate=function(e,t,n){var a=this;e.container()!==this.props.container()&&(this._clearContainerEvent(),this.timeout=setTimeout(function(){a._setEventHandlerForContainer(a.props.container)})),setTimeout(this._updateNodePosition)},y.prototype.componentWillUnmount=function(){this._clearContainerEvent()},y.prototype._setEventHandlerForContainer=function(e){e=e();e&&(f.events.on(e,"scroll",this._updateNodePosition,!1),this.resizeObserver.observe(this.affixNode))},y.prototype._removeEventHandlerForContainer=function(e){e=e();e&&(f.events.off(e,"scroll",this._updateNodePosition),this.resizeObserver.disconnect())},y.prototype._setAffixStyle=function(e){var t,n=1<arguments.length&&void 0!==arguments[1]&&arguments[1];f.obj.shallowEqual(e,this.state.style)||(this.setState({style:e}),t=this.props.onAffix,n?setTimeout(function(){return t(!0)}):e||setTimeout(function(){return t(!1)}))},y.prototype._setContainerStyle=function(e){f.obj.shallowEqual(e,this.state.containerStyle)||this.setState({containerStyle:e})},y.prototype._getOffset=function(e,t){var e=e.getBoundingClientRect(),n=(0,h.getRect)(t),a=(0,h.getScroll)(t,!0),t=(0,h.getScroll)(t,!1);return{top:e.top-n.top+a,left:e.left-n.left+t,width:e.width,height:e.height}},y.prototype.render=function(){var e,t=this.state,n=t.affixMode,t=t.positionStyle,a=this.props,r=a.prefix,o=a.className,i=a.style,a=a.children,l=this.state,r=(0,d.default)(((e={})[r+"affix"]=l.style,e[r+"affix-top"]=!l.style&&n.top,e[r+"affix-bottom"]=!l.style&&n.bottom,e[o]=o,e)),n=(0,s.default)({},i,{position:t});return u.default.createElement("div",{ref:this._affixNodeRefHandler,style:n},l.style&&u.default.createElement("div",{style:l.containerStyle,"aria-hidden":"true"}),u.default.createElement("div",{ref:this._affixChildNodeRefHandler,className:r,style:l.style},a))},o=n=y,n.propTypes={prefix:i.default.string,container:i.default.func,offsetTop:i.default.number,offsetBottom:i.default.number,onAffix:i.default.func,useAbsolute:i.default.bool,className:i.default.string,style:i.default.object,children:i.default.any},n.defaultProps={prefix:"next-",container:function(){return window},onAffix:f.func.noop};var g,i=o;function y(e,t){(0,a.default)(this,y);var d=(0,r.default)(this,g.call(this,e,t));return d._clearContainerEvent=function(){d.timeout&&(clearTimeout(d.timeout),d.timeout=null);var e=d.props.container;d._removeEventHandlerForContainer(e)},d.updatePosition=function(){d._updateNodePosition()},d._updateNodePosition=function(){var e=d.state.affixMode,t=d.props,n=t.container,t=t.useAbsolute,n=n();if(!n||!d.affixNode)return!1;var a=(0,h.getScroll)(n,!0),r=d._getOffset(d.affixNode,n),o=(0,h.getNodeHeight)(n),i=d.affixNode.offsetHeight,n=(0,h.getRect)(n),l=d.affixChildNode.offsetHeight,s={width:r.width},l={width:r.width,height:l},u=null;e.top&&a>r.top-e.offset?(t?(s.position="absolute",s.top=a-(r.top-e.offset),u="relative"):(s.position="fixed",s.top=e.offset+n.top),d._setAffixStyle(s,!0),d._setContainerStyle(l)):e.bottom&&a<r.top+i+e.offset-o?(s.height=i,t?(s.position="absolute",s.top=a-(r.top+i+e.offset-o),u="relative"):(s.position="fixed",s.bottom=e.offset),d._setAffixStyle(s,!0),d._setContainerStyle(l)):(d._setAffixStyle(null),d._setContainerStyle(null)),d.state.positionStyle!==u&&d.setState({positionStyle:u})},d._affixNodeRefHandler=function(e){d.affixNode=e},d._affixChildNodeRefHandler=function(e){d.affixChildNode=e},d.state={style:null,containerStyle:null,positionStyle:null,affixMode:y._getAffixMode(e)},d.resizeObserver=new c.default(d._updateNodePosition),d}i.displayName="Affix",t.default=p.default.config((0,l.polyfill)(i)),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.getScroll=function(e,t){if("undefined"==typeof window)return 0;var n=t?"pageYOffset":"pageXOffset",t=t?"scrollTop":"scrollLeft";return e===window?e[n]:e[t]},t.getRect=function(e){return e!==window?e.getBoundingClientRect():{top:0,left:0,bottom:0}},t.getNodeHeight=function(e){return e?e!==window?e.clientHeight:window.innerHeight:0}},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){var j,Y,l,p,I;function R(e){this.offset=null!=e?e:0,this.lines=[],this.currentLineNb=-1,this.currentLine="",this.refs={}}j=n(396),p=n(111),I=n(112),Y=n(397),l=n(398),R.prototype.PATTERN_FOLDED_SCALAR_ALL=new p("^(?:(?<type>![^\\|>]*)\\s+)?(?<separator>\\||>)(?<modifiers>\\+|\\-|\\d+|\\+\\d+|\\-\\d+|\\d+\\+|\\d+\\-)?(?<comments> +#.*)?$"),R.prototype.PATTERN_FOLDED_SCALAR_END=new p("(?<separator>\\||>)(?<modifiers>\\+|\\-|\\d+|\\+\\d+|\\-\\d+|\\d+\\+|\\d+\\-)?(?<comments> +#.*)?$"),R.prototype.PATTERN_SEQUENCE_ITEM=new p("^\\-((?<leadspaces>\\s+)(?<value>.+?))?\\s*$"),R.prototype.PATTERN_ANCHOR_VALUE=new p("^&(?<ref>[^ ]+) *(?<value>.*)"),R.prototype.PATTERN_COMPACT_NOTATION=new p("^(?<key>"+j.REGEX_QUOTED_STRING+"|[^ '\"\\{\\[].*?) *\\:(\\s+(?<value>.+?))?\\s*$"),R.prototype.PATTERN_MAPPING_ITEM=new p("^(?<key>"+j.REGEX_QUOTED_STRING+"|[^ '\"\\[\\{].*?) *\\:(\\s+(?<value>.+?))?\\s*$"),R.prototype.PATTERN_DECIMAL=new p("\\d+"),R.prototype.PATTERN_INDENT_SPACES=new p("^ +"),R.prototype.PATTERN_TRAILING_LINES=new p("(\n*)$"),R.prototype.PATTERN_YAML_HEADER=new p("^\\%YAML[: ][\\d\\.]+.*\n","m"),R.prototype.PATTERN_LEADING_COMMENTS=new p("^(\\#.*?\n)+","m"),R.prototype.PATTERN_DOCUMENT_MARKER_START=new p("^\\-\\-\\-.*?\n","m"),R.prototype.PATTERN_DOCUMENT_MARKER_END=new p("^\\.\\.\\.\\s*$","m"),R.prototype.PATTERN_FOLDED_SCALAR_BY_INDENTATION={},R.prototype.CONTEXT_NONE=0,R.prototype.CONTEXT_SEQUENCE=1,R.prototype.CONTEXT_MAPPING=2,R.prototype.parse=function(e,t,n){var a,r,o,i,l,s,u,d,c,f,p,h,m,g,y,v,_,b,w,M,k,S,E,x,C,L,T,D,O,N,P;for(null==t&&(t=!1),null==n&&(n=null),this.currentLineNb=-1,this.currentLine="",this.lines=this.cleanup(e).split("\n"),i=null,o=this.CONTEXT_NONE,r=!1;this.moveToNextLine();)if(!this.isCurrentLineEmpty()){if("\t"===this.currentLine[0])throw new Y("A YAML file cannot contain tabs as indentation.",this.getRealCurrentLineNb()+1,this.currentLine);if(d=k=!1,P=this.PATTERN_SEQUENCE_ITEM.exec(this.currentLine)){if(this.CONTEXT_MAPPING===o)throw new Y("You cannot define a sequence item when in a mapping");o=this.CONTEXT_SEQUENCE,null==i&&(i=[]),null!=P.value&&(M=this.PATTERN_ANCHOR_VALUE.exec(P.value))&&(d=M.ref,P.value=M.value),null==P.value||""===I.trim(P.value," ")||0===I.ltrim(P.value," ").indexOf("#")?this.currentLineNb<this.lines.length-1&&!this.isNextLineUnIndentedCollection()?((L=new R(this.getRealCurrentLineNb()+1)).refs=this.refs,i.push(L.parse(this.getNextEmbedBlock(null,!0),t,n))):i.push(null):null!=(T=P.leadspaces)&&T.length&&(M=this.PATTERN_COMPACT_NOTATION.exec(P.value))?((L=new R(this.getRealCurrentLineNb())).refs=this.refs,T=P.value,b=this.getCurrentLineIndentation(),this.isNextLineIndented(!1)&&(T+="\n"+this.getNextEmbedBlock(b+P.leadspaces.length+1,!0)),i.push(L.parse(T,t,n))):i.push(this.parseValue(P.value,t,n))}else{if(!(P=this.PATTERN_MAPPING_ITEM.exec(this.currentLine))||-1!==P.key.indexOf(" #")){if(1===(b=this.lines.length)||2===b&&I.isEmpty(this.lines[1])){try{e=j.parse(this.lines[0],t,n)}catch(e){throw(l=e).parsedLine=this.getRealCurrentLineNb()+1,l.snippet=this.currentLine,l}if("object"==typeof e){if(e instanceof Array)s=e[0];else for(p in e){s=e[p];break}if("string"==typeof s&&0===s.indexOf("*")){for(i=[],S=0,_=e.length;S<_;S++)a=e[S],i.push(this.refs[a.slice(1)]);e=i}}return e}if("["===(T=I.ltrim(e).charAt(0))||"{"===T)try{return j.parse(e,t,n)}catch(e){throw(l=e).parsedLine=this.getRealCurrentLineNb()+1,l.snippet=this.currentLine,l}throw new Y("Unable to parse.",this.getRealCurrentLineNb()+1,this.currentLine)}if(this.CONTEXT_SEQUENCE===o)throw new Y("You cannot define a mapping item when in a sequence");o=this.CONTEXT_MAPPING,null==i&&(i={}),j.configure(t,n);try{p=j.parseScalar(P.key)}catch(e){throw(l=e).parsedLine=this.getRealCurrentLineNb()+1,l.snippet=this.currentLine,l}if("<<"===p)if(r=k=!0,0===(null!=(D=P.value)?D.indexOf("*"):void 0)){if(D=P.value.slice(1),null==this.refs[D])throw new Y('Reference "'+D+'" does not exist.',this.getRealCurrentLineNb()+1,this.currentLine);if("object"!=typeof(O=this.refs[D]))throw new Y("YAML merge keys used with a scalar value instead of an object.",this.getRealCurrentLineNb()+1,this.currentLine);if(O instanceof Array)for(u=c=0,g=O.length;c<g;u=++c)e=O[u],null==i[E=String(u)]&&(i[E]=e);else for(p in O)e=O[p],null==i[p]&&(i[p]=e)}else{if(e=null!=P.value&&""!==P.value?P.value:this.getNextEmbedBlock(),(L=new R(this.getRealCurrentLineNb()+1)).refs=this.refs,"object"!=typeof(x=L.parse(e,t)))throw new Y("YAML merge keys used with a scalar value instead of an object.",this.getRealCurrentLineNb()+1,this.currentLine);if(x instanceof Array)for(h=0,y=x.length;h<y;h++){if("object"!=typeof(C=x[h]))throw new Y("Merge items must be objects.",this.getRealCurrentLineNb()+1,C);if(C instanceof Array)for(u=w=0,v=C.length;w<v;u=++w)e=C[u],f=String(u),i.hasOwnProperty(f)||(i[f]=e);else for(p in C)e=C[p],i.hasOwnProperty(p)||(i[p]=e)}else for(p in x)e=x[p],i.hasOwnProperty(p)||(i[p]=e)}else null!=P.value&&(M=this.PATTERN_ANCHOR_VALUE.exec(P.value))&&(d=M.ref,P.value=M.value);k||(null==P.value||""===I.trim(P.value," ")||0===I.ltrim(P.value," ").indexOf("#")?this.isNextLineIndented()||this.isNextLineUnIndentedCollection()?((L=new R(this.getRealCurrentLineNb()+1)).refs=this.refs,N=L.parse(this.getNextEmbedBlock(),t,n),!r&&void 0!==i[p]||(i[p]=N)):!r&&void 0!==i[p]||(i[p]=null):(N=this.parseValue(P.value,t,n),!r&&void 0!==i[p]||(i[p]=N)))}if(d)if(i instanceof Array)this.refs[d]=i[i.length-1];else{for(p in m=null,i)m=p;this.refs[d]=i[m]}}return I.isEmpty(i)?null:i},R.prototype.getRealCurrentLineNb=function(){return this.currentLineNb+this.offset},R.prototype.getCurrentLineIndentation=function(){return this.currentLine.length-I.ltrim(this.currentLine," ").length},R.prototype.getNextEmbedBlock=function(e,t){var n,a,r,o,i,l,s;if(null==e&&(e=null),null==t&&(t=!1),this.moveToNextLine(),null==e){if(o=this.getCurrentLineIndentation(),s=this.isStringUnIndentedCollectionItem(this.currentLine),!this.isCurrentLineEmpty()&&0===o&&!s)throw new Y("Indentation problem.",this.getRealCurrentLineNb()+1,this.currentLine)}else o=e;for(n=[this.currentLine.slice(o)],t||(r=this.isStringUnIndentedCollectionItem(this.currentLine)),i=!(l=this.PATTERN_FOLDED_SCALAR_END).test(this.currentLine);this.moveToNextLine();)if(!(i=(a=this.getCurrentLineIndentation())===o?!l.test(this.currentLine):i)||!this.isCurrentLineComment())if(this.isCurrentLineBlank())n.push(this.currentLine.slice(o));else{if(r&&!this.isStringUnIndentedCollectionItem(this.currentLine)&&a===o){this.moveToPreviousLine();break}if(o<=a)n.push(this.currentLine.slice(o));else if("#"!==I.ltrim(this.currentLine).charAt(0)){if(0!==a)throw new Y("Indentation problem.",this.getRealCurrentLineNb()+1,this.currentLine);this.moveToPreviousLine();break}}return n.join("\n")},R.prototype.moveToNextLine=function(){return!(this.currentLineNb>=this.lines.length-1)&&(this.currentLine=this.lines[++this.currentLineNb],!0)},R.prototype.moveToPreviousLine=function(){this.currentLine=this.lines[--this.currentLineNb]},R.prototype.parseValue=function(t,e,n){var a,r,o,i;if(0===t.indexOf("*")){if(t=-1!==(r=t.indexOf("#"))?t.substr(1,r-2):t.slice(1),void 0===this.refs[t])throw new Y('Reference "'+t+'" does not exist.',this.currentLine);return this.refs[t]}if(r=this.PATTERN_FOLDED_SCALAR_ALL.exec(t))return i=null!=(i=r.modifiers)?i:"",o=Math.abs(parseInt(i)),isNaN(o)&&(o=0),i=this.parseFoldedScalar(r.separator,this.PATTERN_DECIMAL.replace(i,""),o),null!=r.type?(j.configure(e,n),j.parseScalar(r.type+" "+i)):i;if("["!==(o=t.charAt(0))&&"{"!==o&&'"'!==o&&"'"!==o)return this.isNextLineIndented()&&(t+="\n"+this.getNextEmbedBlock()),j.parse(t,e,n);for(;;)try{return j.parse(t,e,n)}catch(e){if(!((a=e)instanceof l&&this.moveToNextLine()))throw a.parsedLine=this.getRealCurrentLineNb()+1,a.snippet=this.currentLine,a;t+="\n"+I.trim(this.currentLine," ")}},R.prototype.parseFoldedScalar=function(e,t,n){var a,r,o,i,l,s,u,d,c,f;if(null==t&&(t=""),null==n&&(n=0),!(u=this.moveToNextLine()))return"";for(a=this.isCurrentLineBlank(),f="";u&&a;)(u=this.moveToNextLine())&&(f+="\n",a=this.isCurrentLineBlank());if(0<(n=0===n&&(l=this.PATTERN_INDENT_SPACES.exec(this.currentLine))?l[0].length:n))for(null==(d=this.PATTERN_FOLDED_SCALAR_BY_INDENTATION[n])&&(d=new p("^ {"+n+"}(.*)$"),R.prototype.PATTERN_FOLDED_SCALAR_BY_INDENTATION[n]=d);u&&(a||(l=d.exec(this.currentLine)));)f+=a?this.currentLine.slice(n):l[1],(u=this.moveToNextLine())&&(f+="\n",a=this.isCurrentLineBlank());else u&&(f+="\n");if(u&&this.moveToPreviousLine(),">"===e){for(s="",r=0,o=(c=f.split("\n")).length;r<o;r++)0===(i=c[r]).length||" "===i.charAt(0)?s=I.rtrim(s," ")+i+"\n":s+=i+" ";f=s}return"+"!==t&&(f=I.rtrim(f)),""===t?f=this.PATTERN_TRAILING_LINES.replace(f,"\n"):"-"===t&&(f=this.PATTERN_TRAILING_LINES.replace(f,"")),f},R.prototype.isNextLineIndented=function(e){var t,n;if(null==e&&(e=!0),n=this.getCurrentLineIndentation(),t=!this.moveToNextLine(),e)for(;!t&&this.isCurrentLineEmpty();)t=!this.moveToNextLine();else for(;!t&&this.isCurrentLineBlank();)t=!this.moveToNextLine();return!t&&(e=!1,this.getCurrentLineIndentation()>n&&(e=!0),this.moveToPreviousLine(),e)},R.prototype.isCurrentLineEmpty=function(){var e=I.trim(this.currentLine," ");return 0===e.length||"#"===e.charAt(0)},R.prototype.isCurrentLineBlank=function(){return""===I.trim(this.currentLine," ")},R.prototype.isCurrentLineComment=function(){return"#"===I.ltrim(this.currentLine," ").charAt(0)},R.prototype.cleanup=function(e){var t,n,a,r,o,i,l,s,u,d,c;for(-1!==e.indexOf("\r")&&(e=e.split("\r\n").join("\n").split("\r").join("\n")),e=(u=this.PATTERN_YAML_HEADER.replaceAll(e,""))[0],u=u[1],this.offset+=u,c=(u=this.PATTERN_LEADING_COMMENTS.replaceAll(e,"",1))[0],1===u[1]&&(this.offset+=I.subStrCount(e,"\n")-I.subStrCount(c,"\n"),e=c),c=(u=this.PATTERN_DOCUMENT_MARKER_START.replaceAll(e,"",1))[0],1===u[1]&&(this.offset+=I.subStrCount(e,"\n")-I.subStrCount(c,"\n"),e=c,e=this.PATTERN_DOCUMENT_MARKER_END.replace(e,"")),d=-1,a=0,o=(s=e.split("\n")).length;a<o;a++)l=s[a],0!==I.trim(l," ").length&&(n=l.length-I.ltrim(l).length,(-1===d||n<d)&&(d=n));if(0<d){for(t=r=0,i=s.length;r<i;t=++r)l=s[t],s[t]=l.slice(d);e=s.join("\n")}return e},R.prototype.isNextLineUnIndentedCollection=function(e){var t,n;for(null==(e=null==e?null:e)&&(e=this.getCurrentLineIndentation()),t=this.moveToNextLine();t&&this.isCurrentLineEmpty();)t=this.moveToNextLine();return!1!==t&&(n=!1,this.getCurrentLineIndentation()===e&&this.isStringUnIndentedCollectionItem(this.currentLine)&&(n=!0),this.moveToPreviousLine(),n)},R.prototype.isStringUnIndentedCollectionItem=function(){return"-"===this.currentLine||"- "===this.currentLine.slice(0,2)},e.exports=R},function(e,t,n){var a;function r(){}a=n(112),n=n(111),r.PATTERN_ESCAPED_CHARACTER=new n('\\\\([0abt\tnvfre "\\/\\\\N_LP]|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8})'),r.unescapeSingleQuotedString=function(e){return e.replace(/\'\'/g,"'")},r.unescapeDoubleQuotedString=function(e){var t;return null==this._unescapeCallback&&(this._unescapeCallback=(t=this,function(e){return t.unescapeCharacter(e)})),this.PATTERN_ESCAPED_CHARACTER.replace(e,this._unescapeCallback)},r.unescapeCharacter=function(e){var t=String.fromCharCode;switch(e.charAt(1)){case"0":return t(0);case"a":return t(7);case"b":return t(8);case"t":case"\t":return"\t";case"n":return"\n";case"v":return t(11);case"f":return t(12);case"r":return t(13);case"e":return t(27);case" ":return" ";case'"':return'"';case"/":return"/";case"\\":return"\\";case"N":return t(133);case"_":return t(160);case"L":return t(8232);case"P":return t(8233);case"x":return a.utf8chr(a.hexDec(e.substr(2,2)));case"u":return a.utf8chr(a.hexDec(e.substr(2,4)));case"U":return a.utf8chr(a.hexDec(e.substr(2,8)));default:return""}},e.exports=r},function(e,t){},function(e,t,n){var a;function r(){}n=n(111),r.LIST_ESCAPEES=["\\","\\\\",'\\"','"',"\0","","","","","","","","\b","\t","\n","\v","\f","\r","","","","","","","","","","","","","","","","","","",(a=String.fromCharCode)(133),a(160),a(8232),a(8233)],r.LIST_ESCAPED=["\\\\",'\\"','\\"','\\"',"\\0","\\x01","\\x02","\\x03","\\x04","\\x05","\\x06","\\a","\\b","\\t","\\n","\\v","\\f","\\r","\\x0e","\\x0f","\\x10","\\x11","\\x12","\\x13","\\x14","\\x15","\\x16","\\x17","\\x18","\\x19","\\x1a","\\e","\\x1c","\\x1d","\\x1e","\\x1f","\\N","\\_","\\L","\\P"],r.MAPPING_ESCAPEES_TO_ESCAPED=function(){for(var e,t={},n=e=0,a=r.LIST_ESCAPEES.length;0<=a?e<a:a<e;n=0<=a?++e:--e)t[r.LIST_ESCAPEES[n]]=r.LIST_ESCAPED[n];return t}(),r.PATTERN_CHARACTERS_TO_ESCAPE=new n("[\\x00-\\x1f]|脗聟|脗聽|芒聙篓|芒聙漏"),r.PATTERN_MAPPING_ESCAPEES=new n(r.LIST_ESCAPEES.join("|").split("\\").join("\\\\")),r.PATTERN_SINGLE_QUOTING=new n("[\\s'\":{}[\\],&*#?]|^[-?|<>=!%@`]"),r.requiresDoubleQuoting=function(e){return this.PATTERN_CHARACTERS_TO_ESCAPE.test(e)},r.escapeWithDoubleQuotes=function(e){var t;return'"'+this.PATTERN_MAPPING_ESCAPEES.replace(e,(t=this,function(e){return t.MAPPING_ESCAPEES_TO_ESCAPED[e]}))+'"'},r.requiresSingleQuoting=function(e){return this.PATTERN_SINGLE_QUOTING.test(e)},r.escapeWithSingleQuotes=function(e){return"'"+e.replace(/'/g,"''")+"'"},e.exports=r},function(e,t){var i={}.hasOwnProperty,n=function(e){var t,n=o,a=e;for(t in a)i.call(a,t)&&(n[t]=a[t]);function r(){this.constructor=n}function o(e,t,n){this.message=e,this.parsedLine=t,this.snippet=n}return r.prototype=a.prototype,n.prototype=new r,n.__super__=a.prototype,o.prototype.toString=function(){return null!=this.parsedLine&&null!=this.snippet?"<DumpException> "+this.message+" (line "+this.parsedLine+": '"+this.snippet+"')":"<DumpException> "+this.message},o}(Error);e.exports=n},function(e,t,n){var f,p;function a(){}p=n(112),f=n(396),a.indentation=4,a.prototype.dump=function(e,t,n,a,r){var o,i,l,s,u,d,c;if(null==t&&(t=0),null==a&&(a=!1),null==r&&(r=null),s="",u=(n=null==n?0:n)?p.strRepeat(" ",n):"",t<=0||"object"!=typeof e||e instanceof Date||p.isEmpty(e))s+=u+f.dump(e,a,r);else if(e instanceof Array)for(o=0,l=e.length;o<l;o++)d=e[o],s+=u+"-"+((c=t-1<=0||"object"!=typeof d||p.isEmpty(d))?" ":"\n")+this.dump(d,t-1,c?0:n+this.indentation,a,r)+(c?"\n":"");else for(i in e)d=e[i],c=t-1<=0||"object"!=typeof d||p.isEmpty(d),s+=u+f.dump(i,a,r)+":"+(c?" ":"\n")+this.dump(d,t-1,c?0:n+this.indentation,a,r)+(c?"\n":"");return s},e.exports=a},function(e,t,n){},function(e,t,n){"use strict";t.__esModule=!0;var a,h=f(n(38)),x=f(n(2)),r=f(n(4)),o=f(n(6)),i=f(n(7)),C=f(n(0)),l=f(n(3)),L=f(n(13)),s=n(30),T=n(11),m=f(n(74)),D=f(n(10)),u=f(n(24)),d=f(n(44)),c=f(n(399)),g=n(177);function f(e){return e&&e.__esModule?e:{default:e}}var p,y=T.func.bindCtx,n=T.func.noop,O=9===T.env.ieVersion,l=(p=c.default,(0,i.default)(N,p),N.getDerivedStateFromProps=function(e,t){var n,a={};return"value"in e&&e.value!==t.value&&(0,x.default)(a,{value:e.value}),"highlightKey"in e&&e.highlightKey!==t.highlightKey?(0,x.default)(a,{highlightKey:e.highlightKey}):"value"in e&&e.value!==t.value&&"single"===e.mode&&(0,x.default)(a,{highlightKey:e.value}),"searchValue"in e&&e.searchValue!==t.searchValue&&(n=e.searchValue,(0,x.default)(a,{searchValue:null==n?"":n})),"visible"in e&&e.visible!==t.visible&&(0,x.default)(a,{visible:e.visible}),Object.keys(a).length?a:null},N.prototype.componentDidUpdate=function(e,t){var n=this.props;"searchValue"in n&&this.state.searchValue!==t.searchValue&&this.dataStore.setOptions({key:this.state.searchValue}),n.mode!==e.mode&&this.dataStore.setOptions({addonKey:"tag"===n.mode}),n.mode!==e.mode&&this.dataStore.setOptions({addonKey:"tag"===n.mode}),n.filter!==e.filter&&this.dataStore.setOptions({filter:n.filter}),n.filterLocal!==e.filterLocal&&this.dataStore.setOptions({filterLocal:n.filterLocal}),e.children===n.children&&e.dataSource===n.dataSource||(this.setState({dataSource:this.setDataSource(n)}),n.popupContent||this.setFirstHightLightKeyForMenu(this.state.searchValue)),"value"in n?(this.valueDataSource=(0,g.getValueDataSource)(n.value,this.valueDataSource.mapValueDS,this.dataStore.getMapDS()),this.updateSelectAllYet(this.valueDataSource.value)):"defaultValue"in n&&n.defaultValue===this.valueDataSource.value&&(n.children!==e.children||n.dataSource!==e.dataSource)&&(this.valueDataSource=(0,g.getValueDataSource)(n.defaultValue,this.valueDataSource.mapValueDS,this.dataStore.getMapDS())),e.label===this.props.label&&t.value===this.state.value&&n.searchValue===this.state.searchValue||this.syncWidth()},N.prototype.componentDidMount=function(){O&&this.ie9Hack(),p.prototype.componentDidMount.call(this)},N.prototype.ie9Hack=function(){try{var e=this.selectDOM.currentStyle.width;this.setState({fixWidth:"auto"!==e})}catch(e){}},N.prototype.useDetailValue=function(){var e=this.props,t=e.popupContent,n=e.useDetailValue,e=e.dataSource;return n||t&&!e},N.prototype.hasSearch=function(){var e=this.props,t=e.showSearch,e=e.mode;return t||"tag"===e},N.prototype.getTagSize=function(){var e=this.props,t=e.size;return e.adjustTagSize?t:"large"===t?"medium":"small"},N.prototype.handleMenuSelect=function(e,t){var n=this.props,a=n.mode,r=n.readOnly,n=n.disabled;return!r&&!n&&("single"===a?this.handleSingleSelect(e[0],"itemClick"):this.handleMultipleSelect(e,"itemClick",t.props&&t.props._key))},N.prototype.handleItemClick=function(e){this.props.popupAutoFocus||this.focusInput(),"single"===this.props.mode&&e===String(this.state.value)&&this.setVisible(!1,"itemClick")},N.prototype.handleSingleSelect=function(e,t){var n=this.props.cacheValue,n=(0,g.getValueDataSource)(e,n?this.valueDataSource.mapValueDS:{},this.dataStore.getMapDS());if(this.valueDataSource=n,this.setVisible(!1,t),this.setState({highlightKey:e}),this.useDetailValue())return this.handleChange(n.valueDS,t);this.handleChange(n.value,t,n.valueDS),"searchValue"in this.props||!this.state.searchValue||this.handleSearchClear(t)},N.prototype.handleMultipleSelect=function(e,t,n,a){var r=this,e=(0,g.getValueDataSource)(e,this.valueDataSource.mapValueDS,this.dataStore.getMapDS()),o=this.props,i=o.cacheValue,l=o.mode,o=o.hiddenSelected;!i&&"tag"!==l||(this.valueDataSource=e),o&&this.setVisible(!1,t),n&&this.state.visible&&this.setState({highlightKey:n}),this.useDetailValue()?this.handleChange(e.valueDS,t):this.handleChange(e.value,t,e.valueDS),this.updateSelectAllYet(e.value),"searchValue"in this.props||!this.state.searchValue||a||setTimeout(function(){r.handleSearchClear(t)})},N.prototype.updateSelectAllYet=function(t){var e,n=this;this.selectAllYet=!1,this.props.hasSelectAll&&Array.isArray(t)&&((e=this.dataStore.getEnableDS().map(function(e){return e.value})).length<=t.length&&(this.selectAllYet=!0,e.forEach(function(e){-1===t.indexOf(e)&&(n.selectAllYet=!1)})))},N.prototype.handleSearchValue=function(e){this.state.searchValue!==e&&(this.props.filterLocal?"searchValue"in this.props||(this.setState({searchValue:e,dataSource:this.dataStore.updateByKey(e)}),this.setFirstHightLightKeyForMenu(e)):"searchValue"in this.props||this.setState({searchValue:e}))},N.prototype.handleSearch=function(e,t){this.handleSearchValue(e),!this.state.visible&&e&&this.setVisible(!0),this.props.onSearch(e,t)},N.prototype.handleSearchClear=function(e){this.handleSearchValue(""),this.props.onSearchClear(e)},N.prototype.handleSearchKeyDown=function(e){var t=this.props,n=t.popupContent,a=t.onKeyDown,r=t.showSearch,o=t.mode,i=t.hasClear,l=t.onToggleHighlightItem,s=t.readOnly,u=t.disabled,d=this.hasSearch();if(n)return d&&e.keyCode===T.KEYCODE.SPACE&&e.stopPropagation(),a(e);var c;switch(e.keyCode){case T.KEYCODE.UP:e.preventDefault(),l(this.toggleHighlightItem(-1,e),"up");break;case T.KEYCODE.DOWN:e.preventDefault(),l(this.toggleHighlightItem(1,e),"down");break;case T.KEYCODE.ENTER:if(e.preventDefault(),s||u)break;this.chooseHighlightItem("search",e);break;case T.KEYCODE.ESC:e.preventDefault(),this.state.visible&&this.setVisible(!1,"keyDown");break;case T.KEYCODE.SPACE:e.stopPropagation(),d||e.preventDefault();break;case T.KEYCODE.BACKSPACE:if(s||u)break;"multiple"===o&&r||"tag"===o?(c=this.valueDataSource.valueDS)&&c.length&&!c[c.length-1].disabled&&this.handleDeleteTag(e):"single"===o&&i&&!this.state.visible&&this.handleClear(e)}a(e)},N.prototype.chooseMultipleItem=function(e){var t=(this.state.value||[]).map(function(e){return(0,g.valueToSelectKey)(e)}),n=!1,a=t.map(function(e){return""+e}).indexOf(e);-1<a?(t.splice(a,1),n=!0):t.push(e),this.handleMultipleSelect(t,"enter",null,n)},N.prototype.chooseHighlightItem=function(e,t){var n=this.props.mode;if(!this.state.visible)return"tag"===n&&this.state.searchValue&&this.chooseMultipleItem(this.state.searchValue),!1;var a=this.state.highlightKey;null!==a&&this.dataStore.getMenuDS().length&&("single"===n?this.handleSingleSelect(a,"enter"):(this.chooseMultipleItem(a),t&&t.stopPropagation()))},N.prototype.handleTagClose=function(t){var e;return this.props.readOnly||(this.useDetailValue()?(e=this.state.value.filter(function(e){return t.value!==e.value}),this.handleChange(e,"tag")):(e=this.state.value.filter(function(e){return t.value!==e}),this.handleMultipleSelect(e,"tag")),this.props.onRemove(t)),!1},N.prototype.handleDeleteTag=function(e){var t=this.state.value;if(this.state.searchValue||!t||!t.length)return!1;e.preventDefault();e=t.slice(0,t.length-1);this.useDetailValue()?this.handleChange(e,"tag"):this.handleMultipleSelect(e,"tag")},N.prototype.handleSelectAll=function(e){e&&e.preventDefault();e=void 0,e=this.selectAllYet?[]:this.dataStore.getEnableDS().map(function(e){return e.value});this.handleMultipleSelect(e,"selectAll")},N.prototype.handleVisibleChange=function(e,t){this.setVisible(e,t)},N.prototype.afterClose=function(){this.hasSearch()&&this.handleSearchClear("popupClose")},N.prototype.maxTagPlaceholder=function(e,t){var n=this.props.locale;return""+T.str.template(n.maxTagPlaceholder,{selected:e.length,total:t.length})},N.prototype.renderValues=function(){var e,t,n=this,a=this.props,r=a.prefix,o=a.mode,i=a.valueRender,l=a.fillProps,s=a.disabled,u=a.maxTagCount,d=a.maxTagPlaceholder,c=a.tagInline,f=a.tagClosable,p=this.getTagSize(),a=this.state.value;if((0,g.isNull)(a))return null;if(this.useDetailValue()||(a=(a===this.valueDataSource.value?this.valueDataSource:(0,g.getValueDataSource)(a,this.valueDataSource.mapValueDS,this.dataStore.getMapDS())).valueDS),"single"!==o)return a?(o=a,e=void 0,t=this.dataStore.getFlattenDS(),d="maxTagPlaceholder"in this.props?d:this.maxTagPlaceholder,void 0!==u&&a.length>u&&!c&&(o=o.slice(0,u),e=C.default.createElement(m.default,{key:"_count",type:"primary",size:p,animation:!1},d(a,t))),0<a.length&&c&&(e=C.default.createElement("div",{className:r+"select-tag-compact",key:"_count"},d(a,t))),a=o,u=(a=Array.isArray(a)?a:[a]).map(function(e){if(!e)return null;var t=l?e[l]:i(e);return C.default.createElement(m.default,{key:e.value,disabled:s||e.disabled,type:"primary",size:p,animation:!1,onClose:n.handleTagClose.bind(n,e),closable:f},t)}),e&&(c?u.unshift(e):u.push(e)),u):null;if(!a)return null;r=l&&"object"===(void 0===a?"undefined":(0,h.default)(a))&&l in a?a[l]:i(a);return"number"==typeof r?r.toString():r},N.prototype.hasClear=function(){var e=this.props,t=e.hasClear,n=e.readOnly,a=e.disabled,e=e.showSearch,r=this.state,o=r.value,r=r.visible;return null!=o&&(!Array.isArray(o)||0<o.length)&&t&&!n&&!a&&!(e&&r)},N.prototype.renderExtraNode=function(){var e=this.props,t=e.hasArrow,n=e.hasClear,e=e.prefix,a=[];return t&&a.push(C.default.createElement("span",{key:"arrow","aria-hidden":!0,onClick:this.handleArrowClick,className:e+"select-arrow"},C.default.createElement(u.default,{type:"arrow-down",className:e+"select-symbol-fold"}))),n&&a.push(C.default.createElement("span",{key:"clear","aria-hidden":!0,onClick:this.handleClear,className:e+"select-clear"},C.default.createElement(u.default,{type:"delete-filling"}))),a},N.prototype.renderSelect=function(){var t=this,e=this.props,n=e.prefix,a=e.showSearch,r=e.placeholder,o=e.mode,i=e.size,l=e.className,s=e.style,u=e.readOnly,d=e.disabled,c=e.hasBorder,f=e.label,p=e.locale,h=e.state,m=e.onBlur,g=e.onFocus,y=e.onMouseEnter,v=e.onMouseLeave,e=e.rtl,_=T.obj.pickOthers(N.propTypes,this.props),b=T.obj.pickAttrsWith(_,"data-"),w=this.state.visible,M="single"===o,k=this.hasSearch(),S=this.renderValues(),E=r||p.selectPlaceholder||p.selectPlaceHolder,r=(S&&S.length&&(E=null),a&&w&&M&&"string"==typeof S&&(E=S),this.renderExtraNode()),a=(0,L.default)([n+"select",n+"select-trigger",n+"select-"+o,""+n+i,l],((p={})[n+"active"]=w,p[n+"inactive"]=!w,p[n+"no-search"]=!k,p[n+"has-search"]=k,p[n+"select-in-ie"]=O,p[n+"select-in-ie-fixwidth"]=this.state.fixWidth,p[n+"has-clear"]=this.hasClear(),p)),M=this.valueDataSource.valueDS?this.valueDataSource.valueDS.label:"";return C.default.createElement("span",(0,x.default)({},b,{className:a,style:s,dir:e?"rtl":void 0,ref:this.saveSelectRef,onClick:this.handleWrapClick,onMouseEnter:y,onMouseLeave:v,onMouseDown:this.handleWrapClick}),C.default.createElement(D.default,(0,x.default)({"aria-valuetext":M},T.obj.pickOthers(b,_),{role:"combobox",tabIndex:0,"aria-expanded":this.state.visible,"aria-disabled":d,state:h,label:f,extra:r,value:this.state.searchValue,size:i,readOnly:!this.hasSearch()||u,disabled:d,placeholder:E,hasBorder:c,hasClear:!1,htmlSize:"1",inputRender:function(e){return t.renderSearchInput(S,E,e)},onChange:this.handleSearch,onKeyDown:this.handleSearchKeyDown,onFocus:g,onBlur:m,className:n+"select-inner",ref:this.saveInputRef})),C.default.createElement("span",{className:n+"sr-only","aria-live":"polite"},this.state.srReader))},N.prototype.renderSearchInput=function(e,t,n){var a=this.props,r=a.prefix,o=a.mode,a=a.tagInline,o="single"===o,i=this.state.searchValue,l=(0,L.default)(((l={})[r+"select-values"]=!0,l[r+"input-text-field"]=!0,l[r+"select-compact"]=!o&&a,l)),e=[o&&e?C.default.createElement("em",{title:"string"==typeof e?e:"",key:"select-value"},e):e],r=C.default.createElement("span",{key:"trigger-search",className:r+"select-trigger-search"},n,C.default.createElement("span",{"aria-hidden":!0},C.default.createElement("span",null,i||t),C.default.createElement("span",{style:{display:"inline-block",width:1}},"聽")));return!o&&a?e.unshift(r):e.push(r),C.default.createElement("span",{className:l},e)},N.prototype.renderMenuHeader=function(){var e=this.props,t=e.prefix,n=e.hasSelectAll,a=e.mode,r=e.locale,e=e.menuProps;if(e&&"header"in e)return e.header;e=this.dataStore.getEnableDS().length;if(!n||"single"===a||!e)return null;a="boolean"==typeof n?r.selectAll:n,e=this.selectAllYet,n=(0,L.default)(((r={})[t+"select-all"]=!0,r[t+"selected"]=e,r)),r=(0,L.default)(((r={})[t+"select-all-inner"]=!0,r));return C.default.createElement("div",{key:"all",onClick:this.handleSelectAll,className:n,style:{lineHeight:"unset"}},e?C.default.createElement(u.default,{className:t+"menu-icon-selected",style:{display:"none"},type:"select"}):null,C.default.createElement("span",{className:r},a))},N.prototype.render=function(){var e=this.props.mode,t=(0,x.default)({},this.props);return this.hasSearch()&&(t.canCloseByTrigger=!1),"single"===e&&(t.cache=!0),p.prototype.render.call(this,t)},a=i=N,i.propTypes=(0,x.default)({},c.default.propTypes,{mode:l.default.oneOf(["single","multiple","tag"]),value:l.default.any,defaultValue:l.default.any,onChange:l.default.func,dataSource:l.default.arrayOf(l.default.oneOfType([l.default.shape({value:l.default.any,label:l.default.any,disabled:l.default.bool,children:l.default.array}),l.default.bool,l.default.number,l.default.string])),hasBorder:l.default.bool,hasArrow:l.default.bool,showSearch:l.default.bool,onSearch:l.default.func,onSearchClear:l.default.func,hasSelectAll:l.default.oneOfType([l.default.bool,l.default.string]),fillProps:l.default.string,useDetailValue:l.default.bool,cacheValue:l.default.bool,valueRender:l.default.func,itemRender:l.default.func,notFoundContent:l.default.node,style:l.default.object,searchValue:l.default.string,tagInline:l.default.bool,tagClosable:l.default.bool,adjustTagSize:l.default.bool,maxTagCount:l.default.number,maxTagPlaceholder:l.default.func,hiddenSelected:l.default.bool,onRemove:l.default.func,onFocus:l.default.func,onBlur:l.default.func,onMouseEnter:l.default.func,onMouseLeave:l.default.func,onKeyDown:l.default.func,locale:l.default.object,popupAutoFocus:l.default.bool,showDataSourceChildren:l.default.bool}),i.defaultProps=(0,x.default)({},c.default.defaultProps,{locale:d.default.Select,mode:"single",showSearch:!1,cacheValue:!0,tagInline:!1,adjustTagSize:!1,onSearch:n,onSearchClear:n,hasArrow:!0,onRemove:n,valueRender:function(e){return e.label||e.value},onKeyDown:n,onFocus:n,onBlur:n,onMouseEnter:n,onMouseLeave:n,popupAutoFocus:!1,tagClosable:!0}),i.displayName="Select",a);function N(e){(0,r.default)(this,N);var t=(0,o.default)(this,p.call(this,e)),n=(t.handleWrapClick=function(e){"INPUT"!==e.target.nodeName&&e.preventDefault(),t.focusInput()},t.handleArrowClick=function(e){e.preventDefault(),t.focusInput(),t.state.visible&&t.hasSearch()&&t.setVisible(!1)},t.handleClear=function(e){e.stopPropagation(),t.selectAllYet=!1,t.handleChange(void 0,"clear")},t.valueDataSource={valueDS:[],mapValueDS:{}},"searchValue"in e?e.searchValue:"");return t.dataStore.setOptions({key:n,addonKey:"tag"===e.mode}),(0,x.default)(t.state,{searchValue:n,dataSource:t.setDataSource(e)}),void 0!==t.state.value&&(t.valueDataSource=(0,g.getValueDataSource)(t.state.value,t.valueDataSource.mapValueDS,t.dataStore.getMapDS())),y(t,["handleMenuSelect","handleItemClick","handleSearch","handleSearchKeyDown","handleSelectAll","maxTagPlaceholder"]),t}t.default=(0,s.polyfill)(l),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var o=f(n(2)),i=f(n(12)),a=f(n(4)),r=f(n(6)),l=f(n(7)),s=n(0),u=f(s),d=f(n(3)),c=f(n(13));function f(e){return e&&e.__esModule?e:{default:e}}p=s.Component,(0,l.default)(h,p),h.prototype.render=function(){var e=this.props,t=e.className,n=e.prefix,a=e.children,r=e.rtl,e=(0,i.default)(e,["className","prefix","children","rtl"]),n=(0,c.default)((n||"next-")+"tag-group",t);return u.default.createElement("div",(0,o.default)({className:n,dir:r?"rtl":void 0},e),a)},s=n=h,n.propTypes={prefix:d.default.string,className:d.default.any,children:d.default.node,rtl:d.default.bool},n.defaultProps={prefix:"next-",rtl:!1};var p,l=s;function h(){return(0,a.default)(this,h),(0,r.default)(this,p.apply(this,arguments))}l.displayName="Group",t.default=l,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var a=h(n(2)),r=h(n(4)),o=h(n(6)),i=h(n(7)),l=n(0),s=h(l),u=h(n(3)),d=h(n(13)),c=n(30),f=n(11),p=h(n(176));function h(e){return e&&e.__esModule?e:{default:e}}var m,n=f.func.noop,g=f.func.bindCtx,u=(m=l.Component,(0,i.default)(y,m),y.getDerivedStateFromProps=function(e,t){return void 0!==e.checked&&e.checked!==t.checked?{checked:e.checked}:null},y.prototype.handleClick=function(e){if(e&&e.preventDefault(),this.props.disabled)return!1;var t=this.state.checked;this.setState({checked:!t}),this.props.onChange(!t,e)},y.prototype.render=function(){var e=f.obj.pickOthers(["checked","defaultChecked","onChange","className","_shape","closable"],this.props),t=("checked"in this.props?this.props:this.state).checked,n=(0,d.default)(this.props.className,{checked:t});return s.default.createElement(p.default,(0,a.default)({},e,{role:"checkbox",_shape:"checkable","aria-checked":t,className:n,onClick:this.handleClick}))},i=l=y,l.propTypes={checked:u.default.bool,defaultChecked:u.default.bool,onChange:u.default.func,disabled:u.default.bool,className:u.default.any},l.defaultProps={onChange:n},i);function y(e){(0,r.default)(this,y);var t=(0,o.default)(this,m.call(this,e));return t.state={checked:"checked"in e?e.checked:e.defaultChecked||!1},g(t,["handleClick"]),t}u.displayName="Selectable",t.default=(0,c.polyfill)(u),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var c=s(n(2)),f=s(n(12)),a=s(n(4)),r=s(n(6)),o=s(n(7)),i=n(0),p=s(i),l=s(n(3)),h=s(n(176));function s(e){return e&&e.__esModule?e:{default:e}}u=i.Component,(0,o.default)(d,u),d.prototype.render=function(){var e=this.props,t=e.disabled,n=e.className,a=e.closeArea,r=e.onClose,o=e.afterClose,i=e.onClick,l=e.type,s=e.size,u=e.children,d=e.rtl,e=(0,f.default)(e,["disabled","className","closeArea","onClose","afterClose","onClick","type","size","children","rtl"]);return p.default.createElement(h.default,(0,c.default)({},e,{rtl:d,disabled:t,className:n,closeArea:a,onClose:r,afterClose:o,onClick:i,type:l,size:s,closable:!0}),u)},i=n=d,n.propTypes={disabled:l.default.bool,className:l.default.any,closeArea:l.default.oneOf(["tag","tail"]),onClose:l.default.func,afterClose:l.default.func,onClick:l.default.func,type:l.default.oneOf(["normal","primary"]),size:l.default.oneOf(["small","medium","large"]),children:l.default.any,rtl:l.default.bool},n.defaultProps={disabled:!1,type:"normal"};var u,o=i;function d(){return(0,a.default)(this,d),(0,r.default)(this,u.apply(this,arguments))}o.displayName="Closeable",t.default=o,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var a=i(n(2)),r=i(n(4)),o=n(177);function i(e){return e&&e.__esModule?e:{default:e}}function l(e){(0,r.default)(this,l),this.options=(0,a.default)({filter:o.filter,key:void 0,addonKey:!1,filterLocal:!0,showDataSourceChildren:!0},e),this.dataSource=[],this.menuDataSource=[],this.mapDataSource={},this.enabledDataSource=[],this.flattenDataSource=[]}l.prototype.setOptions=function(e){(0,a.default)(this.options,e)},l.prototype.updateByDS=function(e){return this.dataSource=1<arguments.length&&void 0!==arguments[1]&&arguments[1]?(0,o.parseDataSourceFromChildren)(e):(0,o.normalizeDataSource)(e,0,this.options.showDataSourceChildren),this.updateAll()},l.prototype.updateByKey=function(e){return e===this.options.key?this.getMenuDS():(this.options.key=e,this.updateAll())},l.prototype.getOriginDS=function(){return this.dataSource},l.prototype.getMenuDS=function(){return this.menuDataSource},l.prototype.getFlattenDS=function(){return this.flattenDataSource},l.prototype.getEnableDS=function(){return this.enabledDataSource},l.prototype.getMapDS=function(){return this.mapDataSource},l.prototype.updateAll=function(){var t=this,e=this.options,n=e.key,a=e.filter,r=e.filterLocal,e=e.showDataSourceChildren;return this.menuDataSource=(0,o.filterDataSource)(this.dataSource,r?n:"",a,this.options.addonKey),this.flattenDataSource=e?(0,o.flattingDataSource)(this.menuDataSource):this.menuDataSource,this.mapDataSource={},this.flattenDataSource.forEach(function(e){t.mapDataSource[""+e.value]=e}),this.enabledDataSource=this.flattenDataSource.filter(function(e){return!e.disabled}),this.menuDataSource},t.default=l,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var a=p(n(4)),r=p(n(6)),o=p(n(7)),i=p(n(3)),l=n(0),s=p(l),u=p(n(13)),d=n(30),c=n(23),f=n(11);function p(e){return e&&e.__esModule?e:{default:e}}function h(){}function m(e){for(var t=e.clientLeft||0;t+=e.offsetTop||0,e=e.offsetParent;);return t}function g(e,t,n){var a=n.children,n=n.minSize;return(a=a&&a.length)<(t=Math.max(t,n))&&(t=a),{from:e=e?Math.max(Math.min(e,a-t),0):0,size:t}}y=l.Component,(0,o.default)(v,y),v.getDerivedStateFromProps=function(e,t){var n=t.from,t=t.size;return g(n,t,e)},v.prototype.componentDidMount=function(){var e=this.props.jumpIndex;this.updateFrameAndClearCache=this.updateFrameAndClearCache.bind(this),f.events.on(window,"resize",this.updateFrameAndClearCache),this.updateFrame(this.scrollTo.bind(this,e))},v.prototype.componentDidUpdate=function(e){var t=this,e=e.jumpIndex,n=this.props.jumpIndex;e!==n&&this.updateFrame(this.scrollTo.bind(this,n)),this.unstable||(40<++this.updateCounter&&(this.unstable=!0),this.updateCounterTimeoutId||(this.updateCounterTimeoutId=setTimeout(function(){t.updateCounter=0,delete t.updateCounterTimeoutId},0)),this.updateFrame())},v.prototype.componentWillUnmount=function(){f.events.off(window,"resize",this.updateFrameAndClearCache),f.events.off(this.scrollParent,"scroll",this.updateFrameAndClearCache),f.events.off(this.scrollParent,"mousewheel",h)},v.prototype.maybeSetState=function(e,t){if(function(e,t){for(var n in t)if(e[n]!==t[n])return!1;return!0}(this.state,e))return t();this.setState(e,t)},v.prototype.getEl=function(){return this.el||this.items||{}},v.prototype.getScrollParent=function(){var e=this.getEl().parentElement;switch(window.getComputedStyle(e).overflowY){case"auto":case"scroll":case"overlay":case"visible":return e}return window},v.prototype.getScroll=function(){var e=this.scrollParent,t="scrollTop",t=e===window?document.body[t]||document.documentElement[t]:e[t],n=this.getScrollSize()-this.getViewportSize(),t=Math.max(0,Math.min(t,n)),n=this.getEl();return this.cachedScroll=m(e)+t-m(n),this.cachedScroll},v.prototype.setScroll=function(e){var t=this.scrollParent;if(e+=m(this.getEl()),t===window)return window.scrollTo(0,e);e-=m(this.scrollParent),t.scrollTop=e},v.prototype.getViewportSize=function(){var e=this.scrollParent;return e===window?window.innerHeight:e.clientHeight},v.prototype.getScrollSize=function(){var e=this.scrollParent,t=document,n=t.body,t=t.documentElement,a="scrollHeight";return e===window?Math.max(n[a],t[a]):e[a]},v.prototype.getStartAndEnd=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:this.props.threshold,t=this.getScroll();return{start:Math.max(0,t-e),end:t+this.getViewportSize()+e}},v.prototype.updateFrameAndClearCache=function(e){return this.cachedScroll=null,this.updateFrame(e)},v.prototype.updateFrame=function(e){return this.updateScrollParent(),this.updateVariableFrame(e="function"!=typeof e?h:e)},v.prototype.updateScrollParent=function(){var e=this.scrollParent;this.scrollParent=this.getScrollParent(),e!==this.scrollParent&&(e&&(f.events.off(e,"scroll",this.updateFrameAndClearCache),f.events.off(e,"mousewheel",h)),f.events.on(this.scrollParent,"scroll",this.updateFrameAndClearCache),f.events.on(this.scrollParent,"mousewheel",h))},v.prototype.updateVariableFrame=function(e){this.props.itemSizeGetter||this.cacheSizes();for(var t=this.getStartAndEnd(),n=t.start,a=t.end,t=this.props,r=t.pageSize,t=t.children.length,o=0,i=0,l=0,s=t-1;i<s;){var u=this.getSizeOf(i);if(null==u||n<o+u)break;o+=u,++i}for(var d=t-i;l<d&&o<a;){var c=this.getSizeOf(i+l);if(null==c){l=Math.min(l+r,d);break}o+=c,++l}this.maybeSetState({from:i,size:l},e)},v.prototype.getSpaceBefore=function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{};if(!e)return 0;if(null===t[e]||void 0===t[e]){for(var n=e;0<n&&(null===t[n]||void 0===t[n]);)n--;for(var a=t[n]||0,r=n;r<e;++r){t[r]=a;var o=this.getSizeOf(r);if(null==o)break;a+=o}t[e]=a}return t[e]||0},v.prototype.cacheSizes=function(){var e=this.cache,t=this.state.from,n=this.items,a=n.children,n=n.props,a=a||(void 0===n?{}:n).children||[];try{for(var r=0,o=a.length;r<o;++r){var i=(0,c.findDOMNode)(this.items).children[r].offsetHeight;0<i&&(e[t+r]=i)}}catch(e){}},v.prototype.getSizeOf=function(e){var t=this.cache,n=this.props,a=n.itemSizeGetter,n=n.jumpIndex;return e in t?t[e]:a?a(e):(!this.defaultItemHeight&&-1<n&&(t=Object.keys(this.cache).length,a=this.cache[t-1],this.defaultItemHeight=a),this.defaultItemHeight||void 0)},v.prototype.scrollTo=function(e){this.setScroll(this.getSpaceBefore(e,this.cacheAdd))},v.prototype.renderMenuItems=function(){for(var t=this,e=this.props,n=e.children,e=e.itemsRenderer,a=this.state,r=a.from,o=a.size,i=[],l=0;l<o;++l)i.push(n[r+l]);return e(i,function(e){return t.items=e,t.items})},v.prototype.render=function(){var t=this,e=this.props,n=e.children,a=e.prefix,e=e.className,n=(void 0===n?[]:n).length,r=this.state.from,o=this.renderMenuItems(),i={position:"relative"},n=this.getSpaceBefore(n,{});n&&(i.height=n);n="translate(0px, "+this.getSpaceBefore(r,this.cacheAdd)+"px)",r={msTransform:n,WebkitTransform:n,transform:n},a=(0,u.default)(((n={})[a+"virtual-list-wrapper"]=!0,n[e]=!!e,n));return s.default.createElement("div",{className:a,style:i,ref:function(e){return t.el=e,t.el}},s.default.createElement("div",{style:r},o))},l=n=v,n.displayName="VirtualList",n.propTypes={prefix:i.default.string,children:i.default.any,minSize:i.default.number,pageSize:i.default.number,itemsRenderer:i.default.func,threshold:i.default.number,itemSizeGetter:i.default.func,jumpIndex:i.default.number,className:i.default.string},n.defaultProps={prefix:"next-",itemsRenderer:function(e,t){return s.default.createElement("ul",{ref:t},e)},minSize:1,pageSize:10,jumpIndex:0,threshold:100};var y,o=l;function v(e){(0,a.default)(this,v);var t=(0,r.default)(this,y.call(this,e)),n=e.jumpIndex,n=g(n,0,e),e=n.from,n=n.size;return t.state={from:e,size:n},t.cache={},t.cacheAdd={},t.scrollTo=t.scrollTo.bind(t),t.cachedScroll=null,t.unstable=!1,t.updateCounter=0,t}o.displayName="VirtualList",t.default=(0,d.polyfill)(o),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var a,y=u(n(2)),r=u(n(4)),o=u(n(6)),i=u(n(7)),v=u(n(0)),l=u(n(3)),_=u(n(13)),s=n(30),b=n(11),w=u(n(10)),n=u(n(399));function u(e){return e&&e.__esModule?e:{default:e}}var d,c=b.func.bindCtx,f=b.func.noop,l=(d=n.default,(0,i.default)(M,d),M.getDerivedStateFromProps=function(e,t){var n={};return"value"in e&&e.value!==t.value&&(0,y.default)(n,{value:e.value}),"visible"in e&&e.visible!==t.visible&&(0,y.default)(n,{visible:e.visible}),Object.keys(n).length?n:null},M.prototype.componentDidUpdate=function(e,t){var n=this.props;"value"in n&&this.dataStore.setOptions({key:n.value}),n.filter!==e.filter&&this.dataStore.setOptions({filter:n.filter}),n.filterLocal!==e.filterLocal&&this.dataStore.setOptions({filterLocal:n.filterLocal}),e.children===n.children&&e.dataSource===n.dataSource||(this.setState({dataSource:this.setDataSource(n)}),!n.filterLocal&&this.isInputing&&this.shouldControlPopup(n,"update"),n.filterLocal||n.popupContent||this.setFirstHightLightKeyForMenu())},M.prototype.shouldControlPopup=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:this.props,t=arguments[1];e.popupContent||this.dataStore.getMenuDS().length?this.setVisible(!0,t):this.setVisible(!1,t)},M.prototype.handleMenuSelect=function(e){var e=e[0],t=this.dataStore.getMapDS();e in t&&(t=t[e],this.handleSelectEvent(e,t,"itemClick"))},M.prototype.handleItemClick=function(){this.setVisible(!1,"itemClick")},M.prototype.handleSelectEvent=function(e,t,n){e=t&&t[this.props.fillProps]||e;"itemClick"!==n&&"enter"!==n||this.setVisible(!1,n),this.handleChange(e,n,t)},M.prototype.handleVisibleChange=function(e,t){("visible"in this.props||!e||this.props.popupContent||this.dataStore.getMenuDS().length)&&this.setVisible(e,t)},M.prototype.beforeClose=function(){this.isInputing=!1},M.prototype.handleTriggerKeyDown=function(e){var t=this.props,n=t.popupContent,a=t.onToggleHighlightItem,t=t.onKeyDown;if(n)return e.stopPropagation(),t(e);switch(e.keyCode){case b.KEYCODE.UP:e.preventDefault(),a(this.toggleHighlightItem(-1,e),"up");break;case b.KEYCODE.DOWN:e.preventDefault(),a(this.toggleHighlightItem(1,e),"down");break;case b.KEYCODE.ENTER:e.preventDefault(),this.chooseHighlightItem(e);break;case b.KEYCODE.SPACE:e.stopPropagation();break;case b.KEYCODE.ESC:e.preventDefault(),this.state.visible&&this.setVisible(!1,"esc")}t(e)},M.prototype.chooseHighlightItem=function(){if(!this.state.visible)return!1;var t=this.state.highlightKey,e=this.dataStore.getEnableDS().find(function(e){return t===""+e.value});e&&this.handleSelectEvent(t,e,"enter")},M.prototype.hasClear=function(){var e=this.props,t=e.hasClear,n=e.readOnly,e=e.disabled;return this.state.value&&t&&!n&&!e},M.prototype.renderSelect=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:this.props,t=e.placeholder,n=e.size,a=e.prefix,r=e.className,o=e.style,i=e.label,l=e.readOnly,s=e.disabled,u=e.highlightHolder,d=e.locale,c=e.hasClear,f=e.state,p=e.rtl,e=b.obj.pickOthers(M.propTypes,e),h=b.obj.pickAttrsWith(e,"data-"),m=this.state.value,g=this.state.visible,r=(0,_.default)([a+"select",a+"select-auto-complete",a+"size-"+n,r],((r={})[a+"active"]=g,r[a+"disabled"]=s,r)),t=t||d.autoCompletePlaceholder||d.autoCompletePlaceHolder,d=(u&&g&&(t=this.state.highlightKey||t),(0,y.default)({},b.obj.pickOthers(h,e),{state:f,ref:this.saveInputRef,hasClear:c,value:m,size:n,disabled:s,readOnly:l,placeholder:t,label:i,onChange:this.handleChange,onKeyDown:this.handleTriggerKeyDown}));return v.default.createElement("span",(0,y.default)({},h,{className:r,style:o,dir:p?"rtl":void 0,ref:this.saveSelectRef,onClick:this.focusInput}),v.default.createElement(w.default,(0,y.default)({role:"combobox","aria-autocomplete":"list","aria-disabled":s,"aria-expanded":this.state.visible},d)),v.default.createElement("span",{className:a+"sr-only","aria-live":"polite"},this.state.srReader))},M.prototype.render=function(){var e,t=this;return this.hasClear()&&(e=this.props.popupProps.safeNode||[],(e=Array.isArray(e)?e:[e]).push(function(){return t.clearNode}),this.props.popupProps.safeNode=e),d.prototype.render.call(this,(0,y.default)({},this.props,{canCloseByTrigger:!1}))},a=i=M,i.propTypes=(0,y.default)({},n.default.propTypes,{value:l.default.oneOfType([l.default.string,l.default.number]),defaultValue:l.default.oneOfType([l.default.string,l.default.number]),onChange:l.default.func,dataSource:l.default.arrayOf(l.default.oneOfType([l.default.shape({value:l.default.string,label:l.default.any,disabled:l.default.bool,children:l.default.array}),l.default.string])),fillProps:l.default.string,itemRender:l.default.func,onKeyDown:l.default.func,highlightHolder:l.default.bool,style:l.default.object}),i.defaultProps=(0,y.default)({},n.default.defaultProps,{onKeyDown:f,fillProps:"value"}),a);function M(e){(0,r.default)(this,M);var i=(0,o.default)(this,d.call(this,e));return i.handleChange=function(e,t,n){var a=i.props,r=a.disabled,o=a.readOnly,a=a.filterLocal;if(r||o)return!1;r="string"==typeof t?t:"change";i.isInputing="change"===r,a&&(i.setState({dataSource:i.dataStore.updateByKey(e)}),i.shouldControlPopup(i.props,r),i.setFirstHightLightKeyForMenu(e)),"value"in i.props||i.setState({value:e}),i.props.autoHighlightFirstItem||i.setState({highlightKey:e}),i.props.onChange(e,r,n),"itemClick"!==r&&"enter"!==r||i.setVisible(!1,r)},i.isAutoComplete=!0,i.isInputing=!1,i.dataStore.setOptions({key:i.state.value}),(0,y.default)(i.state,{dataSource:i.setDataSource(e)}),c(i,["handleTriggerKeyDown","handleMenuSelect","handleItemClick"]),i}t.default=(0,s.polyfill)(l),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var a=l(n(4)),r=l(n(6)),o=l(n(7)),i=l(n(0)),n=l(n(3));function l(e){return e&&e.__esModule?e:{default:e}}s=i.default.Component,(0,o.default)(u,s),u.prototype.render=function(){return this.props.children},o=i=u,i.propTypes={value:n.default.any.isRequired,disabled:n.default.bool,children:n.default.any},i._typeMark="next_select_option";var s,n=o;function u(){return(0,a.default)(this,u),(0,r.default)(this,s.apply(this,arguments))}n.displayName="Option",t.default=n,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var a=l(n(4)),r=l(n(6)),o=l(n(7)),i=l(n(0)),n=l(n(3));function l(e){return e&&e.__esModule?e:{default:e}}s=i.default.Component,(0,o.default)(u,s),u.prototype.render=function(){return this.props.children},o=i=u,i.propTypes={label:n.default.node,children:n.default.any},i._typeMark="next_select_option_group";var s,n=o;function u(){return(0,a.default)(this,u),(0,r.default)(this,s.apply(this,arguments))}n.displayName="OptionGroup",t.default=n,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var Y=u(n(2)),I=u(n(12)),a=u(n(4)),r=u(n(6)),o=u(n(7)),R=u(n(0)),i=u(n(3)),l=n(30),s=u(n(62)),A=n(11),H=u(n(178)),F=n(179),z=n(401);function u(e){return e&&e.__esModule?e:{default:e}}var d,n=A.func.noop,W=s.default.Popup,c=["t","r","b","l","tl","tr","bl","br","lt","lb","rt","rb"],V=F.normalMap,i=(d=R.default.Component,(0,o.default)(B,d),B.getDerivedStateFromProps=function(e,t){var n={};return"visible"in e&&(n.visible=e.visible),!t.innerAlign&&"align"in e&&c.includes(e.align)&&e.align!==t.align&&(n.align=e.align,n.innerAlign=!1),n},B.prototype._onVisibleChange=function(e,t){"visible"in this.props||this.setState({visible:e}),this.props.onVisibleChange(e,t),e||this.props.onClose()},B.prototype._onClose=function(e){this._onVisibleChange(!1,"closeClick"),e.preventDefault()},B.prototype._onPosition=function(e){var t,n=this.props.rtl,a=(V=this.props.alignEdge?F.edgeMap:F.normalMap,e.align.join(" ")),r=void 0,o=n?"rtlAlign":"align";for(t in V)if(V[t][o]===a){r=t;break}(r=r||this.state.align)!==this.state.align&&this.setState({align:r,innerAlign:!0})},B.prototype.render=function(){var e=this.props,t=e.id,n=e.type,a=e.prefix,r=e.className,o=e.title,i=e.alignEdge,l=e.trigger,s=e.triggerType,u=e.children,d=e.closable,c=e.shouldUpdatePosition,f=e.delay,p=e.needAdjust,h=e.autoAdjust,m=e.safeId,g=e.autoFocus,y=e.safeNode,v=e.onClick,_=e.onHover,b=e.animation,w=e.offset,M=e.style,k=e.container,S=e.popupContainer,E=e.cache,x=e.popupStyle,C=e.popupClassName,L=e.popupProps,T=e.followTrigger,D=e.rtl,O=e.v2,N=(e.arrowPointToCenter,e.placementOffset),N=void 0===N?0:N,e=(0,I.default)(e,["id","type","prefix","className","title","alignEdge","trigger","triggerType","children","closable","shouldUpdatePosition","delay","needAdjust","autoAdjust","safeId","autoFocus","safeNode","onClick","onHover","animation","offset","style","container","popupContainer","cache","popupStyle","popupClassName","popupProps","followTrigger","rtl","v2","arrowPointToCenter","placementOffset"]),P=(k&&A.log.deprecated("container","popupContainer","Balloon"),this.state.align),a=(V=i||O?F.edgeMap:F.normalMap,this.context.prefix||a),j="trOrigin",w=[V[P].offset[0]+w[0],V[P].offset[1]+w[1]],j=V[P][j=D?"rtlTrOrigin":j],j=(0,Y.default)({transformOrigin:j},M),M=R.default.createElement(H.default,(0,Y.default)({},A.obj.pickOthers(Object.keys(B.propTypes),e),{id:t,title:o,prefix:a,closable:d,onClose:this._onClose,className:r,style:j,align:P,type:n,rtl:D,alignEdge:i,v2:O}),u),e={},o=(e["aria-describedby"]=t,e.tabIndex="0",t?R.default.cloneElement(l,e):l),a=(0,z.getDisabledCompatibleTrigger)(R.default.isValidElement(o)?o:R.default.createElement("span",null,o)),d={delay:f,shouldUpdatePosition:c,needAdjust:p,align:V[P].align,offset:w,safeId:m,onHover:_,onPosition:this._onPosition};return O&&(delete d.align,delete d.shouldUpdatePosition,delete d.needAdjust,delete d.offset,delete d.safeId,delete d.onHover,delete d.onPosition,(0,Y.default)(d,{placement:P,placementOffset:N+12,v2:!0,beforePosition:this.beforePosition,autoAdjust:h})),R.default.createElement(W,(0,Y.default)({},L,{followTrigger:T,trigger:a,cache:E,triggerType:s,visible:this.state.visible,onClick:v,afterClose:this.props.afterClose,onVisibleChange:this._onVisibleChange,animation:b,autoFocus:"focus"!==s&&g,safeNode:y,container:S||k,className:C,style:x,rtl:D},d),M)},o=s=B,s.contextTypes={prefix:i.default.string},s.propTypes={prefix:i.default.string,pure:i.default.bool,rtl:i.default.bool,className:i.default.string,style:i.default.object,children:i.default.any,size:i.default.string,type:i.default.oneOf(["normal","primary"]),title:i.default.node,visible:i.default.bool,defaultVisible:i.default.bool,onVisibleChange:i.default.func,alignEdge:i.default.bool,v2:i.default.bool,arrowPointToCenter:i.default.bool,placementOffset:i.default.number,closable:i.default.bool,align:i.default.oneOf(c),offset:i.default.array,trigger:i.default.any,triggerType:i.default.oneOfType([i.default.string,i.default.array]),onClick:i.default.func,onClose:i.default.func,onHover:i.default.func,autoAdjust:i.default.bool,needAdjust:i.default.bool,delay:i.default.number,afterClose:i.default.func,shouldUpdatePosition:i.default.bool,autoFocus:i.default.bool,safeNode:i.default.string,safeId:i.default.string,animation:i.default.oneOfType([i.default.object,i.default.bool]),cache:i.default.bool,popupContainer:i.default.any,container:i.default.any,popupStyle:i.default.object,popupClassName:i.default.string,popupProps:i.default.object,followTrigger:i.default.bool,id:i.default.string},s.defaultProps={prefix:"next-",pure:!1,type:"normal",closable:!0,defaultVisible:!1,size:"medium",alignEdge:!1,arrowPointToCenter:!1,align:"b",offset:[0,0],trigger:R.default.createElement("span",null),onClose:n,afterClose:n,onVisibleChange:n,needAdjust:!1,triggerType:"hover",safeNode:void 0,safeId:null,autoFocus:!0,animation:{in:"zoomIn zoomInBig",out:"zoomOut zoomOutBig"},cache:!1,popupStyle:{},popupClassName:"",popupProps:{}},o);function B(e,t){(0,a.default)(this,B);var l=(0,r.default)(this,d.call(this,e,t));return l.beforePosition=function(e,t){var n=e.config.placement;if(n!==l.state.align&&l.setState({align:n,innerAlign:!0}),l.props.arrowPointToCenter){var t=t.target,a=t.width,r=t.height;if(2===n.length){var o=F.normalMap[n].offset;switch(n[0]){case"b":case"t":var i=0<o[0]?1:-1;e.style.left=e.style.left+i*a/2-o[0];break;case"l":case"r":i=0<o[0]?1:-1;e.style.top=e.style.top+i*r/2-o[1]}}}return e},l.state={align:c.includes(e.align)?e.align:"b",visible:"visible"in e?e.visible:e.defaultVisible},l._onClose=l._onClose.bind(l),l._onPosition=l._onPosition.bind(l),l._onVisibleChange=l._onVisibleChange.bind(l),l}i.displayName="Balloon",t.default=(0,l.polyfill)(i),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var M=s(n(2)),k=s(n(12)),a=s(n(4)),r=s(n(6)),o=s(n(7)),S=s(n(0)),i=s(n(3)),l=s(n(62)),E=s(n(178)),x=n(179),C=n(401);function s(e){return e&&e.__esModule?e:{default:e}}var L,u,T=l.default.Popup,o=(x.normalMap,u=S.default.Component,(0,o.default)(d,u),d.getDerivedStateFromProps=function(e,t){return e.v2&&!t.innerAlign&&"align"in e&&e.align!==t.align?{align:e.align,innerAlign:!1}:null},d.prototype.render=function(){var e=this.props,t=e.id,n=e.className,a=e.align,r=e.style,o=e.prefix,i=e.trigger,l=e.children,s=e.popupContainer,u=e.popupProps,d=e.popupClassName,c=e.popupStyle,f=e.followTrigger,p=e.triggerType,h=e.autoFocus,m=e.alignEdge,g=e.autoAdjust,y=e.rtl,v=e.delay,_=e.v2,e=(e.arrowPointToCenter,(0,k.default)(e,["id","className","align","style","prefix","trigger","children","popupContainer","popupProps","popupClassName","popupStyle","followTrigger","triggerType","autoFocus","alignEdge","autoAdjust","rtl","delay","v2","arrowPointToCenter"])),b="trOrigin",a=(y&&(e.rtl=!0,b="rtlTrOrigin"),L=m||_?x.edgeMap:x.normalMap,_?this.state.align:a),b=L[a][b],w=L[a].offset,b=(0,M.default)({transformOrigin:b},r),r=S.default.createElement(E.default,(0,M.default)({},e,{id:t,prefix:o,closable:!1,isTooltip:!0,className:n,style:b,align:a,rtl:y,alignEdge:m,v2:_}),l),e={},o=(e["aria-describedby"]=t,e.tabIndex="0",p),n=("hover"===p&&t&&(o=["focus","hover"]),t?S.default.cloneElement(i,e):i),b=(0,C.getDisabledCompatibleTrigger)(S.default.isValidElement(n)?n:S.default.createElement("span",null,n)),m={delay:v,shouldUpdatePosition:!0,needAdjust:!1,align:L[a].align,offset:w};return _&&(delete m.align,delete m.shouldUpdatePosition,delete m.needAdjust,delete m.offset,(0,M.default)(m,{placement:a,placementOffset:12,v2:!0,beforePosition:this.beforePosition,autoAdjust:g})),S.default.createElement(T,(0,M.default)({role:"tooltip",animation:{in:"zoomIn",out:"zoomOut"},className:d,container:s,followTrigger:f,trigger:b,triggerType:o,style:c,rtl:y,autoFocus:"focus"!==p&&h},m,u),r)},l=n=d,n.propTypes={prefix:i.default.string,className:i.default.string,style:i.default.object,children:i.default.any,align:i.default.oneOf(["t","r","b","l","tl","tr","bl","br","lt","lb","rt","rb"]),trigger:i.default.any,triggerType:i.default.oneOfType([i.default.string,i.default.array]),popupStyle:i.default.object,popupClassName:i.default.string,popupProps:i.default.object,pure:i.default.bool,popupContainer:i.default.any,followTrigger:i.default.bool,id:i.default.string,delay:i.default.number,v2:i.default.bool,arrowPointToCenter:i.default.bool},n.defaultProps={triggerType:"hover",prefix:"next-",align:"b",delay:50,trigger:S.default.createElement("span",null),arrowPointToCenter:!1},l);function d(e){(0,a.default)(this,d);var l=(0,r.default)(this,u.call(this,e));return l.beforePosition=function(e,t){var n=e.config.placement;if(n!==l.state.align&&l.setState({align:n,innerAlign:!0}),l.props.arrowPointToCenter){var t=t.target,a=t.width,r=t.height;if(2===n.length){var o=x.normalMap[n].offset;switch(n[0]){case"b":case"t":var i=0<o[0]?1:-1;e.style.left=e.style.left+i*a/2-o[0];break;case"l":case"r":i=0<o[0]?1:-1;e.style.top=e.style.top+i*r/2-o[1]}}}return e},l.state={align:e.placement||e.align,innerAlign:!1},l}o.displayName="Tooltip",t.default=o,e.exports=t.default},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){"use strict";t.__esModule=!0;var x=u(n(2)),C=u(n(12)),a=u(n(4)),r=u(n(6)),o=u(n(7)),i=n(0),L=u(i),l=u(n(3)),T=u(n(13)),s=n(30),D=n(11),O=u(n(687)),N=u(n(688)),P=n(402),n=u(n(44));function u(e){return e&&e.__esModule?e:{default:e}}function d(){}c=i.Component,(0,o.default)(j,c),j.getDerivedStateFromProps=function(e,t){return void 0!==e.activeKey&&t.activeKey!==""+e.activeKey?{activeKey:""+e.activeKey}:{}},j.prototype.componentDidUpdate=function(e){var e=e.children&&e.children.length||0,t=this.props.children&&this.props.children.length||0;0!==e&&0!==t&&!("activeKey"in this.props)&!this.isActiveKeyExist(this.state.activeKey)&&((e=this.getDefaultActiveKey(this.props))&&this.setState({activeKey:e}))},j.prototype.getDefaultActiveKey=function(e){var n=void 0===e.activeKey?e.defaultActiveKey:e.activeKey;return void 0===n&&L.default.Children.forEach(e.children,function(e,t){void 0===n&&L.default.isValidElement(e)&&!e.props.disabled&&(n=e.key||t)}),void 0!==n?""+n:void 0},j.prototype.getNextActiveKey=function(t){var n=this,a=[],r=(L.default.Children.forEach(this.props.children,function(e){!L.default.isValidElement(e)||e.props.disabled||(t?a.push(e):a.unshift(e))}),a.length),o=r&&a[0].key;return a.forEach(function(e,t){e.key===n.state.activeKey&&(o=(t===r-1?a[0]:a[t+1]).key)}),o},j.prototype.isActiveKeyExist=function(n){var a=!1;return L.default.Children.forEach(this.props.children,function(e,t){a||L.default.isValidElement(e)&&!e.props.disabled&&(e=e.key||t,n===""+e&&(a=!0))}),a},j.prototype.setActiveKey=function(e){e===this.state.activeKey||"activeKey"in this.props||this.setState({activeKey:e})},j.prototype.render=function(){var e=this.props,t=e.prefix,n=e.animation,a=e.shape,r=e.size,o=e.extra,i=e.excessMode,l=e.tabPosition,s=e.tabRender,u=e.triggerType,d=e.lazyLoad,c=e.unmountInactiveTabs,f=e.popupProps,p=e.navStyle,h=e.navClassName,m=e.contentStyle,g=e.contentClassName,y=e.className,v=e.onClose,_=e.children,b=e.rtl,w=(e.device,e.locale),M=e.icons,e=(0,C.default)(e,["prefix","animation","shape","size","extra","excessMode","tabPosition","tabRender","triggerType","lazyLoad","unmountInactiveTabs","popupProps","navStyle","navClassName","contentStyle","contentClassName","className","onClose","children","rtl","device","locale","icons"]),k=this.state.activeKey,_=(0,P.toArray)(_),S=l,S=(b&&0<=["left","right"].indexOf(l)&&(S="left"===l?"right":"left"),(0,T.default)(((E={})[t+"tabs"]=!0,E[t+"tabs-"+a]=a,E[t+"tabs-vertical"]="wrapped"===a&&0<=["left","right"].indexOf(l),E[t+"tabs-scrollable"]=!0,E[t+"tabs-"+S]="wrapped"===a,E[""+(t+r)]=r,E),y)),a={prefix:t,rtl:b,animation:n,activeKey:k,excessMode:i,extra:o,tabs:_,tabPosition:l,tabRender:s,triggerType:u,popupProps:f,onClose:v,onTriggerEvent:this.handleTriggerEvent,onKeyDown:this.onNavKeyDown,style:p,className:h,locale:w,icons:M},r={prefix:t,activeKey:k,lazyLoad:d,unmountInactiveTabs:c,style:m,className:g},E=[L.default.createElement(O.default,(0,x.default)({key:"tab-nav"},a)),L.default.createElement(N.default,(0,x.default)({key:"tab-content"},r),_)];return"bottom"===l&&E.reverse(),L.default.createElement("div",(0,x.default)({dir:b?"rtl":void 0,className:S},D.obj.pickOthers(j.propTypes,e)),E)},o=i=j,i.propTypes={prefix:l.default.string,rtl:l.default.bool,device:l.default.oneOf(["tablet","desktop","phone"]),activeKey:l.default.oneOfType([l.default.number,l.default.string]),defaultActiveKey:l.default.oneOfType([l.default.number,l.default.string]),shape:l.default.oneOf(["pure","wrapped","text","capsule"]),animation:l.default.bool,excessMode:l.default.oneOf(["slide","dropdown"]),tabPosition:l.default.oneOf(["top","bottom","left","right"]),size:l.default.oneOf(["small","medium"]),triggerType:l.default.oneOf(["hover","click"]),lazyLoad:l.default.bool,unmountInactiveTabs:l.default.bool,navStyle:l.default.object,navClassName:l.default.string,contentStyle:l.default.object,contentClassName:l.default.string,extra:l.default.node,disableKeyboard:l.default.bool,onClick:l.default.func,onChange:l.default.func,onClose:l.default.func,tabRender:l.default.func,popupProps:l.default.object,children:l.default.any,className:l.default.string,locale:l.default.object,icons:l.default.shape({prev:l.default.oneOfType([l.default.node,l.default.string]),next:l.default.oneOfType([l.default.node,l.default.string]),dropdown:l.default.oneOfType([l.default.node,l.default.string])})},i.defaultProps={prefix:"next-",shape:"pure",size:"medium",animation:!0,tabPosition:"top",excessMode:"slide",triggerType:"click",lazyLoad:!0,unmountInactiveTabs:!1,disableKeyboard:!1,onClick:d,onChange:d,onClose:d,locale:n.default.Tab,icons:{}};var c,l=o;function j(e,t){(0,a.default)(this,j);var o=(0,r.default)(this,c.call(this,e,t));return o.handleTriggerEvent=function(e,t){var n=o.props,a=n.triggerType,r=n.onClick,n=n.onChange;a===e&&(r(t),o.setActiveKey(t),o.state.activeKey!==t&&n(t))},o.onNavKeyDown=function(e){var t=e.keyCode;o.props.disableKeyboard||(t>=D.KEYCODE.LEFT&&t<=D.KEYCODE.DOWN&&e.preventDefault(),e=void 0,t===D.KEYCODE.RIGHT||t===D.KEYCODE.DOWN?(e=o.getNextActiveKey(!0),o.handleTriggerEvent(o.props.triggerType,e)):t!==D.KEYCODE.LEFT&&t!==D.KEYCODE.UP||(e=o.getNextActiveKey(!1),o.handleTriggerEvent(o.props.triggerType,e)))},o.state={activeKey:o.getDefaultActiveKey(e)},o}l.displayName="Tab",t.default=(0,s.polyfill)(l),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var h=f(n(2)),a=f(n(4)),r=f(n(6)),o=f(n(7)),m=f(n(0)),i=n(23),l=f(n(3)),g=f(n(13)),s=f(n(24)),u=f(n(62)),d=f(n(50)),y=f(n(79)),v=n(11),c=n(402);function f(e){return e&&e.__esModule?e:{default:e}}var p,_={float:"right",zIndex:1},b={float:"left",zIndex:1},w={dropdown:"arrow-down",prev:"arrow-left",next:"arrow-right"},M=u.default.Popup,u=(p=m.default.Component,(0,o.default)(k,p),k.prototype.componentDidMount=function(){this.props.animation||this.initialSettings(),v.events.on(window,"resize",this.onWindowResized)},k.prototype.componentDidUpdate=function(e){var t=this;clearTimeout(this.scrollTimer),this.scrollTimer=setTimeout(function(){t.scrollToActiveTab()},410),clearTimeout(this.slideTimer),this.slideTimer=setTimeout(function(){t.setSlideBtn()},410),"dropdown"!==this.props.excessMode||(0,c.tabsArrayShallowEqual)(this.props.tabs,e.tabs)||this.getDropdownItems(this.props)},k.prototype.componentWillUnmount=function(){v.events.off(window,"resize",this.onWindowResized)},k.prototype.initialSettings=function(){this.setSlideBtn(),this.getDropdownItems(this.props)},k.prototype.setOffset=function(e){var t=!(1<arguments.length&&void 0!==arguments[1])||arguments[1],n=!(2<arguments.length&&void 0!==arguments[2])||arguments[2],a=this.props,r=a.tabPosition,a=a.rtl,o=(0,c.getOffsetWH)(this.nav,r),i=(0,c.getOffsetWH)(this.wrapper),o=(e=(e=0<=e?0:e)<=i-o&&i-o<0?i-o:e)-this.offset,l=(this.activeTab&&"slide"===this.props.excessMode&&n&&(n=(0,c.getOffsetWH)(this.activeTab),o=(0,c.getOffsetLT)(this.activeTab)+o,l=(0,c.getOffsetLT)(this.wrapper),e=this._adjustTarget({wrapperOffset:l,wrapperWH:i,activeTabWH:n,activeTabOffset:o,rtl:a,target:e})),1),i=e/(l=this.nav&&this.nav.offsetWidth?(0,c.getOffsetWH)(this.nav)/this.nav.offsetWidth:l),n=isNaN(i)?e:i;this.offset!==e&&this.nav&&(this.offset=e,o=this.nav.parentElement,"left"===r||"right"===r?o.scrollTo({top:-n,left:0,behavior:"smooth"}):this.props.rtl?o.scrollTo({top:0,left:n,behavior:"smooth"}):o.scrollTo({top:0,left:-n,behavior:"smooth"}),t&&this.setSlideBtn())},k.prototype._adjustTarget=function(e){var t=e.wrapperOffset,n=e.wrapperWH,a=e.activeTabWH,r=e.activeTabOffset,o=e.rtl,e=e.target;return t+n<r+a&&r<t+n?o?e+=r+a-(t+n):e-=r+a-(t+n)+1:t<r+a&&r<t&&(o?e-=t-r+1:e+=t-r),e},k.prototype._setBtnStyle=function(e,t){var n;this.prevBtn&&this.nextBtn&&(n="disabled",this.prevBtn.disabled=!e,this.nextBtn.disabled=!t,e?v.dom.removeClass(this.prevBtn,n):v.dom.addClass(this.prevBtn,n),t?v.dom.removeClass(this.nextBtn,n):v.dom.addClass(this.nextBtn,n))},k.prototype.setSlideBtn=function(){var e=this.props.tabPosition,t=(0,c.getOffsetWH)(this.nav,e),e=(0,c.getOffsetWH)(this.wrapper,e),n=e-t,a=void 0,r=void 0;0<=n||t<=e?this.setOffset(0,r=a=!1):a=this.offset<0&&this.offset<=n?!(r=!0):0<=this.offset?!(r=!1):r=!0,(r||a)!==this.state.showBtn?this.setState({showBtn:r||a}):this._setBtnStyle(r,a)},k.prototype.getDropdownItems=function(e){var t=e.excessMode,n=e.tabs;if("dropdown"===t){for(var a=this.wrapper.offsetWidth,r=this.nav.childNodes,o=void 0,i=0,o=0;o<n.length&&!(a<(i+=r[o].offsetWidth));o++);o===n.length?this.setState({dropdownTabs:[]}):this.setState({dropdownTabs:n})}},k.prototype.renderTabList=function(e){var u=this,d=e.prefix,t=e.tabs,c=e.activeKey,f=e.tabRender||this.defaultTabTemplateRender,p=[];return m.default.Children.forEach(t,function(e){var t=e.props,n=t.disabled,a=t.className,r=t.onClick,o=t.onMouseEnter,i=t.onMouseLeave,t=t.style,l=c===e.key,s=(0,g.default)(((s={})[d+"tabs-tab"]=!0,s.disabled=n,s.active=l,s),a),a={},r=(n||(a={onClick:u.onNavItemClick.bind(u,e.key,r),onMouseEnter:u.onNavItemMouseEnter.bind(u,e.key,o),onMouseLeave:u.onNavItemMouseLeave.bind(u,e.key,i)}),v.obj.pickAttrsWith(e.props,"data-"));p.push(m.default.createElement("li",(0,h.default)({},r,{role:"tab",key:e.key,ref:l?u.activeTabRefHandler:null,"aria-hidden":n?"true":"false","aria-selected":l?"true":"false",tabIndex:l?0:-1,className:s,style:t},a),f(e.key,e.props)))}),p},k.prototype.onNavItemClick=function(e,t,n){if(this.props.onTriggerEvent(c.triggerEvents.CLICK,e),t)return t(e,n)},k.prototype.onNavItemMouseEnter=function(e,t,n){if(this.props.onTriggerEvent(c.triggerEvents.HOVER,e),t)return t(e,n)},k.prototype.onNavItemMouseLeave=function(e,t,n){if(t)return t(e,n)},k.prototype.getIcon=function(e){var t=this.props,n=t.prefix,a=t.icons,t=t.rtl,n=m.default.createElement(s.default,{type:w[e],rtl:t,className:n+"tab-icon-"+e});return n=a[e]?"string"==typeof a[e]?m.default.createElement(s.default,{rtl:t,type:a[e]}):a[e]:n},k.prototype.renderDropdownTabs=function(){var i=this,e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:[];if(!e.length)return null;var t=this.props,n=t.prefix,a=t.activeKey,r=t.triggerType,o=t.popupProps,t=t.rtl,l=this.getIcon("dropdown"),l=m.default.createElement("button",{className:n+"tabs-btn-down"},l);return m.default.createElement(M,(0,h.default)({rtl:t,triggerType:r,trigger:l,container:function(e){return e.parentNode},className:n+"tabs-bar-popup"},o),m.default.createElement(d.default,{rtl:t,selectedKeys:[a],onSelect:this.onSelectMenuItem,selectMode:"single"},e.map(function(e){var t=e.props,n=t.disabled,a=t.onClick,r=t.onMouseEnter,t=t.onMouseLeave,o={};return n||(o={onClick:i.onNavItemClick.bind(i,e.key,a),onMouseEnter:i.onNavItemMouseEnter.bind(i,e.key,r),onMouseLeave:i.onNavItemMouseLeave.bind(i,e.key,t)}),m.default.createElement(d.default.Item,(0,h.default)({key:e.key},o),e.props.title)})))},k.prototype.render=function(){var e=this.props,t=e.prefix,n=e.tabPosition,a=e.excessMode,r=e.extra,o=e.onKeyDown,i=e.animation,l=e.style,s=e.className,e=e.rtl,u=this.state,d=void 0,c=void 0,f=void 0,p=u.showBtn,u=("dropdown"===a&&p&&u.dropdownTabs.length?(f=this.renderDropdownTabs(u.dropdownTabs),d=c=null):f=p?(a=this.getIcon("prev"),c=m.default.createElement("button",{onClick:this.onPrevClick,className:t+"tabs-btn-prev",ref:this.prevBtnHandler,type:"button"},a),u=this.getIcon("next"),d=m.default.createElement("button",{onClick:this.onNextClick,className:t+"tabs-btn-next",ref:this.nextBtnHandler,type:"button"},u),null):c=d=null,(0,g.default)(((a={})[t+"tabs-nav-container"]=!0,a[t+"tabs-nav-container-scrolling"]=p,a))),p=t+"tabs-nav",a=this.renderTabList(this.props),u=[m.default.createElement("div",{className:u,onKeyDown:o,key:"nav-container"},m.default.createElement("div",{className:t+"tabs-nav-wrap",ref:this.wrapperRefHandler},m.default.createElement("div",{className:t+"tabs-nav-scroll"},i?m.default.createElement(y.default,{role:"tablist","aria-multiselectable":!1,component:"ul",className:p,animation:p,singleMode:!1,ref:this.navRefHandler,afterAppear:this.initialSettings.bind(this)},a):m.default.createElement("ul",{role:"tablist",className:p+" "+t+"disable-animation",ref:this.navRefHandler},a))),c,d,f)],i=(r&&(o={className:t+"tabs-nav-extra",key:"nav-extra"},"top"===n||"bottom"===n?u.unshift(m.default.createElement("div",(0,h.default)({},o,{style:e?b:_}),r)):u.push(m.default.createElement("div",o,r))),(0,g.default)(t+"tabs-bar",s));return m.default.createElement("div",{className:i,style:l,ref:this.navbarRefHandler},u)},(n=k).propTypes={prefix:l.default.string,rtl:l.default.bool,animation:l.default.bool,activeKey:l.default.oneOfType([l.default.string,l.default.number]),excessMode:l.default.string,extra:l.default.any,tabs:l.default.oneOfType([l.default.array,l.default.object]),tabPosition:l.default.string,tabRender:l.default.func,triggerType:l.default.string,popupProps:l.default.object,onTriggerEvent:l.default.func,onKeyDown:l.default.func,onClose:l.default.func,style:l.default.object,className:l.default.string,locale:l.default.object,icons:l.default.object},n);function k(e,t){(0,a.default)(this,k);var o=(0,r.default)(this,p.call(this,e,t));return o.removeTab=function(e,t){t&&t.stopPropagation(),o.props.onClose(e)},o.onCloseKeyDown=function(e,t){t.keyCode===v.KEYCODE.ENTER&&(t.stopPropagation(),t.preventDefault(),o.props.onClose(e))},o.defaultTabTemplateRender=function(t,e){var n=e.title,e=e.closeable,a=o.props,r=a.locale,a=a.prefix,e=e?m.default.createElement(s.default,{"aria-label":r.closeAriaLabel,type:"close",tabIndex:"0",onKeyDown:function(e){return o.onCloseKeyDown(t,e)},onClick:function(e){return o.removeTab(t,e)},className:a+"tabs-tab-close"}):null;return m.default.createElement("div",{className:a+"tabs-tab-inner"},n,e)},o.scrollToActiveTab=function(){var e,t,n,a,r;o.activeTab&&["slide","dropdown"].includes(o.props.excessMode)&&(e=(0,c.getOffsetWH)(o.activeTab),t=(0,c.getOffsetWH)(o.wrapper),n=(0,c.getOffsetLT)(o.activeTab),a=(0,c.getOffsetLT)(o.wrapper),r=o.offset,a+t<=n+e||n<a?o.setOffset(o.offset+a-n,!0,!0):o.setOffset(r,!0,!0))},o.onPrevClick=function(){var e=(0,c.getOffsetWH)(o.wrapper);o.setOffset(o.offset+e,!0,!1)},o.onNextClick=function(){var e=(0,c.getOffsetWH)(o.wrapper);o.setOffset(o.offset-e,!0,!1)},o.onSelectMenuItem=function(e){var t=o.props;(0,t.onTriggerEvent)(t.triggerType,e[0])},o.onWindowResized=function(){o.updateTimer&&clearTimeout(o.updateTimer),o.updateTimer=setTimeout(function(){o.setSlideBtn(),o.getDropdownItems(o.props)},100)},o.navRefHandler=function(e){o.nav=(0,i.findDOMNode)(e)},o.wrapperRefHandler=function(e){o.wrapper=e},o.navbarRefHandler=function(e){o.navbar=e},o.activeTabRefHandler=function(e){o.activeTab=e},o.prevBtnHandler=function(e){o.prevBtn=(0,i.findDOMNode)(e)},o.nextBtnHandler=function(e){o.nextBtn=(0,i.findDOMNode)(e)},o.state={showBtn:!1,dropdownTabs:[]},o.offset=0,o}u.displayName="Nav",t.default=u,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var s=f(n(2)),u=f(n(12)),a=f(n(4)),r=f(n(6)),o=f(n(7)),i=n(0),d=f(i),l=f(n(3)),c=f(n(13));function f(e){return e&&e.__esModule?e:{default:e}}p=i.PureComponent,(0,o.default)(h,p),h.prototype.render=function(){var e=this.props,n=e.prefix,a=e.activeKey,r=e.lazyLoad,o=e.unmountInactiveTabs,t=e.children,i=e.className,e=(0,u.default)(e,["prefix","activeKey","lazyLoad","unmountInactiveTabs","children","className"]),l=[],t=(d.default.Children.forEach(t,function(e){var t=a==e.key;l.push(d.default.cloneElement(e,{prefix:n,active:t,lazyLoad:r,unmountInactiveTabs:o}))}),(0,c.default)(((t={})[n+"tabs-content"]=!0,t),i));return d.default.createElement("div",(0,s.default)({},e,{className:t}),l)},(n=h).propTypes={prefix:l.default.string,activeKey:l.default.oneOfType([l.default.string,l.default.number]),lazyLoad:l.default.bool,children:l.default.any};var p,i=n;function h(){return(0,a.default)(this,h),(0,r.default)(this,p.apply(this,arguments))}t.default=i,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var a,r=d(n(4)),o=d(n(6)),i=d(n(7)),l=d(n(0)),s=d(n(3)),u=d(n(13)),n=n(30);function d(e){return e&&e.__esModule?e:{default:e}}c=l.default.Component,(0,i.default)(f,c),f.prototype.render=function(){var e=this.props,t=e.prefix,n=e.active,a=e.lazyLoad,r=e.unmountInactiveTabs,e=e.children;if(this._actived=this._actived||n,a&&!this._actived)return null;if(r&&!n)return null;r=(0,u.default)(((a={})[t+"tabs-tabpane"]=!0,a[n?"active":"hidden"]=!0,a));return l.default.createElement("div",{role:"tabpanel","aria-hidden":n?"false":"true",className:r},e)},a=i=f,i.propTypes={prefix:s.default.string,title:s.default.node,closeable:s.default.bool,disabled:s.default.bool,active:s.default.bool,lazyLoad:s.default.bool,unmountInactiveTabs:s.default.bool,children:s.default.any},i.defaultProps={prefix:"next-",closeable:!1};var c,s=a;function f(){return(0,r.default)(this,f),(0,o.default)(this,c.apply(this,arguments))}s.displayName="TabItem",t.default=(0,n.polyfill)(s),e.exports=t.default},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){"use strict";t.__esModule=!0;var D=h(n(12)),O=h(n(2)),a=h(n(4)),r=h(n(6)),o=h(n(7)),i=n(0),N=h(i),l=h(n(3)),s=n(30),P=h(n(13)),u=h(n(8)),d=h(n(24)),c=h(n(18)),f=h(n(10)),p=h(n(29)),j=n(11),n=h(n(44));function h(e){return e&&e.__esModule?e:{default:e}}function m(){}var g=p.default.Option;function Y(e,t){e=Math.ceil(e/t);return e<=0?1:e}y=i.Component,(0,o.default)(I,y),I.getDerivedStateFromProps=function(e,t){var n=e.current,a=e.total,e=e.pageSize,r={},a=(n=n||t.current,(a=Y(a=a,e))<n?a:n);return t.current!==a&&(r.current=a),t.currentPageSize!==e&&(r.currentPageSize=e),r},I.prototype.onPageItemClick=function(e,t){"current"in this.props||this.setState({current:e}),this.props.onChange(e,t)},I.prototype.onInputChange=function(e){this.setState({inputValue:e})},I.prototype.onSelectSize=function(e){var t={currentPageSize:e},n=Y(this.props.total,e);this.state.current>n&&(t.current=n),this.setState(t),this.props.onPageSizeChange(e)},I.prototype.renderPageTotal=function(){var e=this.props,t=e.prefix,n=e.total,e=e.totalRender,a=this.state,r=a.currentPageSize,a=a.current;return N.default.createElement("div",{className:t+"pagination-total"},e(n,[(a-1)*r+1,a*r]))},I.prototype.renderPageItem=function(e){var t=this.props,n=t.prefix,a=t.size,r=t.link,o=t.pageNumberRender,i=t.total,l=t.pageSize,t=t.locale,s=this.state.current,i=Y(i,l),l=parseInt(e,10)===s,a={size:a,className:(0,P.default)(((s={})[n+"pagination-item"]=!0,s[n+"current"]=l,s)),onClick:l?m:this.onPageItemClick.bind(this,e)};return r&&(a.component="a",a.href=r.replace("{page}",e)),N.default.createElement(c.default,(0,O.default)({"aria-label":j.str.template(t.total,{current:e,total:i})},a,{key:e}),o(e))},I.prototype.renderPageFirst=function(e){var t=this.props,n=t.prefix,a=t.size,r=t.shape,t=t.locale,a={disabled:e<=1,size:a,className:(0,P.default)(((a={})[n+"pagination-item"]=!0,a[n+"prev"]=!0,a)),onClick:this.onPageItemClick.bind(this,e-1)},n=N.default.createElement(d.default,{type:"arrow-left",className:n+"pagination-icon-prev"});return N.default.createElement(c.default,(0,O.default)({},a,{"aria-label":j.str.template(t.labelPrev,{current:e})}),n,"arrow-only"===r||"arrow-prev-only"===r||"no-border"===r?"":t.prev)},I.prototype.renderPageLast=function(e,t){var n=this.props,a=n.prefix,r=n.size,o=n.shape,n=n.locale,r={disabled:t<=e,size:r,className:(0,P.default)(((t={})[a+"pagination-item"]=!0,t[a+"next"]=!0,t)),onClick:this.onPageItemClick.bind(this,e+1)},t=N.default.createElement(d.default,{type:"arrow-right",className:a+"pagination-icon-next"});return N.default.createElement(c.default,(0,O.default)({},r,{"aria-label":j.str.template(n.labelNext,{current:e})}),"arrow-only"===o||"no-border"===o?"":n.next,t)},I.prototype.renderPageEllipsis=function(e){var t=this.props.prefix;return N.default.createElement(d.default,{className:t+"pagination-ellipsis "+t+"pagination-icon-ellipsis",type:"ellipsis",key:"ellipsis-"+e})},I.prototype.renderPageJump=function(){var t=this,e=this.props,n=e.prefix,a=e.size,e=e.locale,r=this.state.inputValue;return[N.default.createElement("span",{className:n+"pagination-jump-text"},e.goTo),N.default.createElement(f.default,{className:n+"pagination-jump-input",type:"text","aria-label":e.inputAriaLabel,size:a,value:r,onChange:this.onInputChange.bind(this),onKeyDown:function(e){e.keyCode===j.KEYCODE.ENTER&&t.handleJump(e)}}),N.default.createElement("span",{className:n+"pagination-jump-text"},e.page),N.default.createElement(c.default,{className:n+"pagination-jump-go",size:a,onClick:this.handleJump},e.go)]},I.prototype.renderPageDisplay=function(e,t){var n=this.props,a=n.prefix,n=n.pageNumberRender;return N.default.createElement("span",{className:a+"pagination-display"},N.default.createElement("em",null,n(e)),"/",n(t))},I.prototype.renderPageList=function(e,t){var n=this.props,a=n.prefix,n=n.pageShowCount,r=[];if(t<=n)for(var o=1;o<=t;o++)r.push(this.renderPageItem(o));else{var n=n-3,i=parseInt(n/2,10),l=void 0,s=void 0;r.push(this.renderPageItem(1)),s=e+i,(l=e-i)<=1&&(s=(l=2)+n),2<l&&r.push(this.renderPageEllipsis(1));for(var u=l=t-1<=s?(s=t-1)-n:l;u<=s;u++)r.push(this.renderPageItem(u));s<t-1&&r.push(this.renderPageEllipsis(2)),r.push(this.renderPageItem(t))}return N.default.createElement("div",{className:a+"pagination-list"},r)},I.prototype.renderPageSizeSelector=function(){var e=this.props,t=e.prefix,n=e.pageSizeSelector,e=e.locale,a=N.default.createElement("span",{className:t+"pagination-size-selector-title"},e.pageSize);switch(n){case"filter":return N.default.createElement("div",{className:t+"pagination-size-selector"},a,this.renderPageSizeFilter());case"dropdown":return N.default.createElement("div",{className:t+"pagination-size-selector"},a,this.renderPageSizeDropdown());default:return null}},I.prototype.renderPageSizeFilter=function(){var r=this,e=this.props,o=e.prefix,i=e.size,e=e.pageSizeList,l=this.state.currentPageSize;return N.default.createElement("div",{className:o+"pagination-size-selector-filter"},e.map(function(e,t){var n=void 0,a=void 0,e=(e.value?(n=e.label,a=e.value):n=a=e,(0,P.default)(((e={})[o+"pagination-size-selector-btn"]=!0,e[o+"current"]=a===l,e)));return N.default.createElement(c.default,{key:t,text:!0,size:i,className:e,onClick:a!==l?r.onSelectSize.bind(r,a):null},n)}))},I.prototype.renderPageSizeDropdown=function(){var e=this.props,t=e.prefix,n=e.size,a=e.pageSizeList,r=e.locale,o=e.popupProps,e=e.selectProps,i=this.state.currentPageSize;return N.default.createElement(p.default,(0,O.default)({className:t+"pagination-size-selector-dropdown",popupClassName:t+"pagination-size-selector-popup",popupProps:o,"aria-label":r.selectAriaLabel,autoWidth:!1,size:n,value:i,onChange:this.onSelectSize.bind(this)},e),a.map(function(e,t){var n=void 0,a=void 0;return e.value?(n=e.label,a=e.value):n=a=e,N.default.createElement(g,{key:t,value:a},n)}))},I.prototype.render=function(){function e(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return N.default.createElement("div",(0,O.default)({className:x},j.obj.pickOthers(Object.keys(I.propTypes),_)),E&&S,c?a.renderPageTotal():null,N.default.createElement("div",{className:r+"pagination-pages"},t.map(function(e,t){return e&&N.default.cloneElement(e,{key:t})})),!E&&S)}var a=this,t=this.props,r=t.prefix,n=(t.pure,t.rtl),o=t.device,i=t.type,l=t.size,s=t.shape,u=t.className,d=t.total,c=t.totalRender,f=t.pageSize,p=t.pageSizeSelector,h=(t.pageSizeList,t.pageSizePosition),m=t.useFloatLayout,g=(t.onPageSizeChange,t.hideOnlyOnePage),y=t.showJump,v=(t.locale,t.current,t.defaultCurrent,t.pageShowCount),_=(t.pageNumberRender,t.link,t.onChange,t.popupProps,t.selectProps,(0,D.default)(t,["prefix","pure","rtl","device","type","size","shape","className","total","totalRender","pageSize","pageSizeSelector","pageSizeList","pageSizePosition","useFloatLayout","onPageSizeChange","hideOnlyOnePage","showJump","locale","current","defaultCurrent","pageShowCount","pageNumberRender","link","onChange","popupProps","selectProps"])),t=this.state,b=t.current,w=Y(d,t.currentPageSize),M=this.renderPageFirst(b),k=this.renderPageLast(b,w),S=this.renderPageSizeSelector(),E="start"===h,t=i,x=("phone"===o&&"normal"===t&&(t="simple"),(0,P.default)(((h={})[r+"pagination"]=!0,h[""+r+l]=l,h[""+r+t]=t,h[""+r+s]=s,h[r+"start"]=!!p&&E&&m,h[r+"end"]=!!p&&!E&&m,h[r+"hide"]=w<=1&&g,h[u]=!!u,h)));n&&(_.dir="rtl");switch(t){case"mini":return e(M,k);case"simple":return e(M,this.renderPageDisplay(b,w),k);case"normal":var C=this.renderPageList(b,w),L=y&&f*v<d?this.renderPageDisplay(b,w):null,T=y&&f*v<d?this.renderPageJump(b,w):null;return e.apply(void 0,[M,C,k,L].concat(T));default:return null}},o=i=I,i.propTypes=(0,O.default)({},u.default.propTypes,{prefix:l.default.string,pure:l.default.bool,rtl:l.default.bool,device:l.default.oneOf(["desktop","tablet","phone"]),className:l.default.string,locale:l.default.object,type:l.default.oneOf(["normal","simple","mini"]),shape:l.default.oneOf(["normal","arrow-only","arrow-prev-only","no-border"]),size:l.default.oneOf(["small","medium","large"]),current:l.default.number,defaultCurrent:l.default.number,onChange:l.default.func,total:l.default.number,totalRender:l.default.func,pageShowCount:l.default.number,pageSize:l.default.number,pageSizeSelector:l.default.oneOf([!1,"filter","dropdown"]),pageSizeList:l.default.oneOfType([l.default.arrayOf(l.default.number),l.default.arrayOf(l.default.shape({label:l.default.string,value:l.default.number}))]),pageNumberRender:l.default.func,pageSizePosition:l.default.oneOf(["start","end"]),useFloatLayout:l.default.bool,onPageSizeChange:l.default.func,hideOnlyOnePage:l.default.bool,showJump:l.default.bool,link:l.default.string,popupProps:l.default.object,selectProps:l.default.object}),i.defaultProps={prefix:"next-",pure:!1,rtl:!1,locale:n.default.Pagination,type:"normal",shape:"normal",size:"medium",defaultCurrent:1,onChange:m,pageSize:10,pageSizeSelector:!1,pageSizeList:[5,10,20],pageSizePosition:"start",onPageSizeChange:m,useFloatLayout:!1,total:100,pageShowCount:5,hideOnlyOnePage:!1,showJump:!0,pageNumberRender:function(e){return e}};var y,l=o;function I(e,t){(0,a.default)(this,I);var o=(0,r.default)(this,y.call(this,e,t));return o.handleJump=function(e){var t=o.props.total,n=o.state,a=n.current,r=n.currentPageSize,n=n.inputValue,t=Y(t,r),r=parseInt(n,10);isNaN(r)?r="":r<1?r=1:t<r&&(r=t),r&&r!==a&&o.onPageItemClick(r,e),o.setState({inputValue:""})},o.state={current:e.defaultCurrent||1,currentPageSize:0,inputValue:""},o}l.displayName="Pagination",t.default=u.default.config((0,s.polyfill)(l)),e.exports=t.default},function(e,t,n){},function(e,t,n){},function(e,t,n){"use strict";n(43),n(32),n(700),n(702)},function(e,t,n){"use strict";n(701)},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){"use strict";n(43),n(32),n(80),n(75),n(705)},function(e,t,n){},function(e,t,n){"use strict";n(32),n(80),n(707),n(709)},function(e,t,n){"use strict";n(36),n(59),n(32),n(43),n(708)},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){"use strict";t.__esModule=!0;var T=h(n(2)),u=h(n(4)),d=h(n(6)),a=h(n(7)),r=n(0),D=h(r),O=h(n(13)),o=h(n(3)),i=n(30),c=h(n(24)),f=h(n(18)),l=h(n(44)),s=n(11),p=h(n(8)),N=h(n(712));function h(e){return e&&e.__esModule?e:{default:e}}function m(e,t){return e.map(function(e){return e.value}).filter(function(e){return-1===t.indexOf(e)})}function g(t,n,e){var a={left:[],right:[]};return(t.length||n.length)&&e.map(function(e){return e.value}).forEach(function(e){-1<t.indexOf(e)?a.left.push(e):-1<n.indexOf(e)&&a.right.push(e)}),a}var y,n=p.default.config,v=s.func.bindCtx,P=s.obj.pickOthers,a=(y=r.Component,(0,a.default)(j,y),j.normalizeValue=function(e){return e?Array.isArray(e)?e:[e]:[]},j.getDerivedStateFromProps=function(e,t){var n=t.innerUpdate,a=t.value,r=t.leftValue;if(n)return{innerUpdate:!1,value:a,leftValue:r};n={},a=void 0,a="value"in e?(r=j.normalizeValue(e.value),n.value=r):t.value,n.leftValue=m(e.dataSource,a),r=g(t.leftCheckedValue,t.rightCheckedValue,e.dataSource),a=r.left,t=r.right;return n.leftCheckedValue=a,n.rightCheckedValue=t,n},j.prototype.groupDatasource=function(e,n,a){return e.reduce(function(e,t){t=n.indexOf(t);return-1<t&&e.push(a[t]),e},[])},j.prototype.handlePanelChange=function(e,t){var n,a=this.state,r=a.leftCheckedValue,a=a.rightCheckedValue,o=this.props.onSelect;this.setState(((n={innerUpdate:!0})["left"===e?"leftCheckedValue":"rightCheckedValue"]=t,n)),o&&o("left"===e?t:r,"left"===e?a:t,"left"===e?"source":"target")},j.prototype.handlePanelSort=function(e,t,n,a){var r=this,o=this.state,i=o.value,o=o.leftValue,l="right"===e?i:o,s=l.indexOf(t),n=l.indexOf(n),a="before"===a?n:n+1;s!==a&&(l.splice(s,1),s<a&&(a-=1),l.splice(a,0,t),this.setState({innerUpdate:!0,value:i,leftValue:o},function(){r.props.onSort(l,e)}))},j.prototype.handleMoveItem=function(e){var t=void 0,n=void 0,a=void 0,r=this.state,o=r.value,i=r.leftValue,l=r.leftCheckedValue,s=r.rightCheckedValue;(r={})["right"===e?(t=l.concat(o),n=i.filter(function(e){return-1===l.indexOf(e)}),a=l,"leftCheckedValue"):(t=o.filter(function(e){return-1===s.indexOf(e)}),n=s.concat(i),a=s,"rightCheckedValue")]=[],this.setValueState(r,t,n,a,e)},j.prototype.handleSimpleMove=function(e,t){var n=void 0,a=void 0,r=this.state,o=r.value,r=r.leftValue,a="right"===e?(n=[t].concat(o),r.filter(function(e){return e!==t})):(n=o.filter(function(e){return e!==t}),[t].concat(r));this.setValueState({},n,a,[t],e)},j.prototype.handleSimpleMoveAll=function(e){var t=void 0,n=void 0,a=void 0,r=this.props.dataSource,o=this.state,i=o.value,o=o.leftValue,l=r.reduce(function(e,t){return t.disabled&&e.push(t.value),e},[]),n="right"===e?(t=(a=o.filter(function(e){return-1===l.indexOf(e)})).concat(i),o.filter(function(e){return-1<l.indexOf(e)})):(a=i.filter(function(e){return-1===l.indexOf(e)}),t=i.filter(function(e){return-1<l.indexOf(e)}),a.concat(o));this.setValueState({},t,n,a,e)},j.prototype.setValueState=function(e,a,r,o,i){function t(){var e,t,n;"onChange"in l.props&&(n=s.map(function(e){return e.value}),e=l.groupDatasource(a,n,s),t=l.groupDatasource(r,n,s),n=l.groupDatasource(o,n,s),l.props.onChange(a,e,{leftValue:r,leftData:t,movedValue:o,movedData:n,direction:i}))}var l=this,s=this.props.dataSource;"value"in this.props||(e.value=a,e.leftValue=r),Object.keys(e).length?this.setState(e,t):t()},j.prototype.renderCenter=function(){var e=this.props,t=e.prefix,n=e.mode,a=e.operations,r=e.disabled,o=e.leftDisabled,i=e.rightDisabled,e=e.locale,l=this.state,s=l.leftCheckedValue,l=l.rightCheckedValue;return D.default.createElement("div",{className:t+"transfer-operations"},"simple"===n?D.default.createElement(c.default,{className:t+"transfer-move",size:"large",type:"switch"}):[D.default.createElement(f.default,{"aria-label":e.moveToRight,key:"l2r",className:t+"transfer-operation",type:s.length?"primary":"normal",disabled:o||r||!s.length,onClick:this.handleMoveItem.bind(this,"right")},a[0]),D.default.createElement(f.default,{"aria-label":e.moveToLeft,key:"r2l",className:t+"transfer-operation",type:l.length?"primary":"normal",disabled:i||r||!l.length,onClick:this.handleMoveItem.bind(this,"left")},a[1])])},j.prototype.render=function(){var e=this.props,t=e.prefix,n=e.mode,a=e.disabled,r=e.className,o=e.dataSource,i=e.locale,l=e.showSearch,l=void 0!==l&&l,s=e.searchProps,s=void 0===s?{}:s,u=e.filter,d=e.onSearch,c=e.leftDisabled,f=e.rightDisabled,p=e.searchPlaceholder,h=e.notFoundContent,m=e.titles,g=e.listClassName,y=e.listStyle,v=e.itemRender,_=e.sortable,b=e.useVirtual,w=e.rtl,M=e.id,k=e.children,e=e.showCheckAll,S=this.state,E=S.value,x=S.leftValue,C=S.leftCheckedValue,S=S.rightCheckedValue,L=o.map(function(e){return e.value}),x=this.groupDatasource(x,L,o),E=this.groupDatasource(E,L,o),L={prefix:t,mode:n,locale:i,filter:u,onSearch:d,searchPlaceholder:p,listClassName:g,listStyle:y,itemRender:v,onMove:this.handleSimpleMove,onMoveAll:this.handleSimpleMoveAll,onChange:this.handlePanelChange,sortable:_,useVirtual:b,onSort:this.handlePanelSort,baseId:M,customerList:k,showCheckAll:e},o=P(Object.keys(j.propTypes),this.props),n=(w&&(o.dir="rtl"),Array.isArray(l)?l:[l,l]),i=Array.isArray(s)?s:[s,s],u=Array.isArray(h)?h:[h,h];return D.default.createElement("div",(0,T.default)({className:(0,O.default)(t+"transfer",r),id:M},o),D.default.createElement(N.default,(0,T.default)({},L,{position:"left",dataSource:x,disabled:c||a,value:C,showSearch:n[0],searchProps:i[0],notFoundContent:u[0],title:m[0]})),this.renderCenter(),D.default.createElement(N.default,(0,T.default)({},L,{position:"right",dataSource:E,disabled:f||a,value:S,showSearch:n[1],searchProps:i[1],notFoundContent:u[1],title:m[1]})))},r=s=j,s.contextTypes={prefix:o.default.string},s.propTypes=(0,T.default)({},p.default.propTypes,{prefix:o.default.string,pure:o.default.bool,rtl:o.default.bool,className:o.default.string,mode:o.default.oneOf(["normal","simple"]),dataSource:o.default.arrayOf(o.default.object),value:o.default.arrayOf(o.default.string),defaultValue:o.default.arrayOf(o.default.string),onChange:o.default.func,onSelect:o.default.func,disabled:o.default.bool,leftDisabled:o.default.bool,rightDisabled:o.default.bool,itemRender:o.default.func,filter:o.default.func,onSearch:o.default.func,searchPlaceholder:o.default.string,showSearch:o.default.oneOfType([o.default.bool,o.default.arrayOf(o.default.bool)]),searchProps:o.default.oneOfType([o.default.object,o.default.arrayOf(o.default.object)]),notFoundContent:o.default.oneOfType([o.default.node,o.default.arrayOf(o.default.node)]),titles:o.default.arrayOf(o.default.node),operations:o.default.arrayOf(o.default.node),defaultLeftChecked:o.default.arrayOf(o.default.string),defaultRightChecked:o.default.arrayOf(o.default.string),listClassName:o.default.string,listStyle:o.default.object,sortable:o.default.bool,onSort:o.default.func,locale:o.default.object,id:o.default.string,children:o.default.func,useVirtual:o.default.bool,showCheckAll:o.default.bool}),s.defaultProps={prefix:"next-",pure:!1,mode:"normal",dataSource:[],defaultValue:[],disabled:!1,leftDisabled:!1,rightDisabled:!1,showCheckAll:!0,itemRender:function(e){return e.label},showSearch:!1,filter:function(e,t){var n="";return function e(t){D.default.isValidElement(t)&&t.props.children?D.default.Children.forEach(t.props.children,e):"string"==typeof t&&(n+=t)}(t.label),n.length>=e.length&&-1<n.indexOf(e)},onSearch:function(){},notFoundContent:"Not Found",titles:[],operations:[],defaultLeftChecked:[],defaultRightChecked:[],sortable:!1,onSort:function(){},locale:l.default.Transfer},r);function j(e,t){(0,u.default)(this,j);var t=(0,d.default)(this,y.call(this,e,t)),n=e.value,a=e.defaultValue,r=e.defaultLeftChecked,o=e.defaultRightChecked,i=e.dataSource,l=e.rtl,s=e.operations,s=(0===s.length&&(s.push(D.default.createElement(c.default,{rtl:l,type:"arrow-right"})),s.push(D.default.createElement(c.default,{rtl:l,type:"arrow-left"}))),g(j.normalizeValue(r),j.normalizeValue(o),i)),l=s.left,r=s.right,o=j.normalizeValue("value"in e?n:a);return t.state={value:o,leftCheckedValue:l,rightCheckedValue:r,leftValue:m(i,o)},v(t,["handlePanelChange","handlePanelSort","handleMoveItem","handleSimpleMove","handleSimpleMoveAll"]),t}a.displayName="Transfer",t.default=n((0,i.polyfill)(a)),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var m=f(n(2)),a=f(n(4)),r=f(n(6)),o=f(n(7)),i=n(0),g=f(i),l=f(n(3)),p=f(n(13)),h=f(n(71)),s=f(n(713)),u=f(n(50)),d=n(11),y=f(n(715)),c=f(n(400));function f(e){return e&&e.__esModule?e:{default:e}}var v,_=d.func.bindCtx,i=(v=i.Component,(0,o.default)(b,v),b.prototype.componentDidMount=function(){this.firstRender=!1},b.prototype.componentDidUpdate=function(e){e.dataSource.length!==this.props.dataSource.length&&this.list&&0<this.list.scrollTop&&(this.list.scrollTop=0),this.searched=!1},b.prototype.getListDOM=function(e){this.list=e},b.prototype.getListData=function(e,n){var a=this,t=this.props,r=t.prefix,o=t.position,i=t.mode,l=t.value,s=t.onMove,u=t.disabled,d=t.itemRender,c=t.sortable,t=this.state,f=t.dragPosition,p=t.dragValue,h=t.dragOverValue;return e.map(function(e){var t="title"in e?{title:e.title}:{};return g.default.createElement(y.default,(0,m.default)({key:e.value,prefix:r,mode:i,checked:-1<l.indexOf(e.value),disabled:u||e.disabled,item:e,onCheck:a.handleCheck,onClick:s,needHighlight:!a.firstRender&&!a.searched&&!n,itemRender:d,draggable:c,onDragStart:a.handleItemDragStart,onDragOver:a.handleItemDragOver,onDragEnd:a.handleItemDragEnd,onDrop:a.handleItemDrop,dragPosition:f,dragValue:p,dragOverValue:h,panelPosition:o},t))})},b.prototype.handleAllCheck=function(e){var t=this.props,n=t.position,a=t.onChange,r=t.filter,o=this.state.searchedValue,t=void 0,t=e?o?this.enabledDatasource.filter(function(e){return r(o,e)}).map(function(e){return e.value}):this.enabledDatasource.map(function(e){return e.value}):[];a&&a(n,t)},b.prototype.handleCheck=function(e,t){var n=this.props,a=n.position,r=n.value,n=n.onChange,o=[].concat(r),r=r.indexOf(e);t&&-1===r?o.push(e):!t&&-1<r&&o.splice(r,1),n&&n(a,o)},b.prototype.handleSearch=function(e){this.setState({searchedValue:e}),this.searched=!0;var t=this.props;(0,t.onSearch)(e,t.position)},b.prototype.handleItemDragStart=function(e,t){this.setState({dragPosition:e,dragValue:t})},b.prototype.handleItemDragOver=function(e){this.setState({dragOverValue:e})},b.prototype.handleItemDragEnd=function(){this.setState({dragOverValue:null})},b.prototype.handleItemDrop=function(){var e;this.setState({dragOverValue:null}),(e=this.props).onSort.apply(e,arguments)},b.prototype.renderHeader=function(){var e=this.props,t=e.title,e=e.prefix;return g.default.createElement("div",{id:this.headerId,className:e+"transfer-panel-header"},t)},b.prototype.renderSearch=function(){var e=this.props,t=e.prefix,n=e.searchPlaceholder,a=e.locale,e=e.searchProps;return g.default.createElement(s.default,(0,m.default)({"aria-labelledby":this.headerId,shape:"simple"},void 0===e?{}:e,{className:t+"transfer-panel-search",placeholder:n||a.searchPlaceholder,onChange:this.handleSearch}))},b.prototype.renderList=function(e){var t,n=this.props,a=n.prefix,r=n.listClassName,o=n.listStyle,i=n.customerList,n=n.useVirtual,a=(0,p.default)(((t={})[a+"transfer-panel-list"]=!0,t[r]=!!r,t)),r=i&&i(this.props);return r?g.default.createElement("div",{className:a,style:o,ref:this.getListDOM},r):e.length?n?g.default.createElement("div",{className:a,style:(0,m.default)({position:"relative"},o)},g.default.createElement(c.default,{itemsRenderer:function(e,t){return g.default.createElement(u.default,{style:{border:"none"},ref:t},e)}},this.getListData(e,!0))):g.default.createElement(u.default,{className:a,style:o,ref:this.getListDOM},this.getListData(e)):g.default.createElement("div",{className:a,style:o},this.renderNotFoundContent())},b.prototype.renderNotFoundContent=function(){var e=this.props,t=e.prefix,e=e.notFoundContent;return g.default.createElement("div",{className:t+"transfer-panel-not-found-container"},g.default.createElement("div",{className:t+"transfer-panel-not-found"},e))},b.prototype.renderFooter=function(){var e=this.props,t=e.prefix,n=e.position,a=e.mode,r=e.disabled,o=e.locale,e=e.showCheckAll;if("simple"===a)return a=this.props.onMoveAll,i=(0,p.default)(((i={})[t+"transfer-panel-move-all"]=!0,i[t+"disabled"]=r,i)),g.default.createElement("div",{className:t+"transfer-panel-footer"},g.default.createElement("a",{className:i,onClick:a.bind(this,"left"===n?"right":"left")},o.moveAll));var i=this.props,l=i.value,a=i.showSearch,s=i.filter,n=i.dataSource,u=this.state.searchedValue,i=n.length,d=n,c=l.length,f=c,a=(a&&u&&(i=(d=n.filter(function(e){return s(u,e)})).length,f=d.filter(function(e){return l.includes(e.value)}).length),Math.min(i,this.enabledDatasource.length)),n=1<i?o.items:o.item,d=0===c?i+" "+n:c+"/"+i+" "+n;return g.default.createElement("div",{className:t+"transfer-panel-footer"},e&&g.default.createElement(h.default,{disabled:r,checked:0<c&&a<=c,indeterminate:0<c&&0<=f&&f<a,onChange:this.handleAllCheck,"aria-labelledby":this.footerId}),g.default.createElement("span",{className:t+"transfer-panel-count",id:this.footerId},d))},b.prototype.render=function(){var e=this.props,t=e.prefix,n=e.title,a=e.showSearch,r=e.filter,e=e.dataSource,o=this.state.searchedValue,i=this.props.dataSource;return this.enabledDatasource=e.filter(function(e){return!e.disabled}),a&&o&&(i=e.filter(function(e){return r(o,e)})),g.default.createElement("div",{className:t+"transfer-panel"},n?this.renderHeader():null,a?this.renderSearch():null,this.renderList(i),this.renderFooter())},(n=b).propTypes={prefix:l.default.string,position:l.default.oneOf(["left","right"]),mode:l.default.oneOf(["normal","simple"]),dataSource:l.default.array,value:l.default.array,onChange:l.default.func,onMove:l.default.func,onMoveAll:l.default.func,disabled:l.default.bool,locale:l.default.object,title:l.default.node,showSearch:l.default.bool,searchProps:l.default.object,filter:l.default.func,onSearch:l.default.func,searchPlaceholder:l.default.string,notFoundContent:l.default.node,listClassName:l.default.string,listStyle:l.default.object,itemRender:l.default.func,sortable:l.default.bool,onSort:l.default.func,baseId:l.default.string,customerList:l.default.func,useVirtual:l.default.bool,showCheckAll:l.default.bool},n);function b(e,t){(0,a.default)(this,b);t=(0,r.default)(this,v.call(this,e,t));return t.state={searchedValue:"",dragValue:null,dragOverValue:null},t.footerId=e.baseId?d.htmlId.escapeForId(e.baseId+"-panel-footer-"+e.position):"",t.headerId=e.baseId?d.htmlId.escapeForId(e.baseId+"-panel-header-"+e.position):"",_(t,["handleCheck","handleAllCheck","handleSearch","handleItemDragStart","handleItemDragOver","handleItemDragEnd","handleItemDrop","getListDOM"]),t.firstRender=!0,t}i.displayName="TransferPanel",t.default=i,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var i=r(n(12)),a=r(n(8)),n=r(n(714));function r(e){return e&&e.__esModule?e:{default:e}}t.default=a.default.config(n.default,{transfrom:function(e,t){var n=e.onInputFocus,a=e.overlayVisible,r=e.combox,o=(0,i.default)(e,["onInputFocus","overlayVisible","combox"]);return n&&(t("onInputFocus","onFocus","Search"),o.onFocus=n),"overlayVisible"in e&&(t("overlayVisible","visible","Search"),o.visible=a),r&&(t("combox","popupContent","Search"),o.popupContent=r),o}}),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var a,r,C=c(n(2)),L=c(n(12)),o=c(n(4)),i=c(n(6)),l=c(n(7)),T=n(0),D=c(T),s=c(n(3)),O=c(n(13)),u=n(30),d=c(n(10)),N=c(n(29)),P=c(n(18)),j=c(n(24)),Y=n(11),n=c(n(44));function c(e){return e&&e.__esModule?e:{default:e}}var f,I=d.default.Group,R=N.default.AutoComplete,d=Y.func.noop,s=(f=D.default.Component,(0,l.default)(A,f),A.getDerivedStateFromProps=function(e,t){var n,a={};return"value"in e&&e.value!==t.value&&(n=e.value,a.value=null==n?"":e.value),"filterValue"in e&&e.filterValue!==t.filterValue&&(n=e.filterValue,a.filterValue=void 0===n?"":n),0<Object.keys(a).length?a:null},A.prototype.focus=function(){var e;(e=this.inputRef).focus.apply(e,arguments)},A.prototype.render=function(){var e=this.props,t=e.shape,n=e.filter,a=e.hasIcon,r=e.disabled,o=e.placeholder,i=e.type,l=e.className,s=e.style,u=e.size,d=e.prefix,c=e.searchText,f=e.dataSource,p=e.filterProps,h=e.buttonProps,m=e.fillProps,g=e.popupContent,y=e.followTrigger,v=e.hasClear,_=e.visible,b=e.locale,w=e.rtl,M=e.icons,k=e.autoHighlightFirstItem,e=(0,L.default)(e,["shape","filter","hasIcon","disabled","placeholder","type","className","style","size","prefix","searchText","dataSource","filterProps","buttonProps","fillProps","popupContent","followTrigger","hasClear","visible","locale","rtl","icons","autoHighlightFirstItem"]),i=(0,O.default)(((S={})[d+"search"]=!0,S[d+"search-"+t]=!0,S[""+d+i]=i,S[""+d+u]=u,S[d+"disabled"]=!!r,S[l]=!!l,S)),l=null,S=null,E=null,x=M.search,M=(!(0,T.isValidElement)(M.search)&&M.search&&(x=D.default.createElement("span",null,M.search)),"simple"===t?(t=(0,O.default)(((M={})[d+"search-icon"]=!0,M[h.className]=!!h.className,M[d+"search-symbol-icon"]=!x,M)),a&&(l=D.default.cloneElement(x||D.default.createElement(j.default,{type:"search"}),(0,C.default)({role:"button","aria-disabled":r,"aria-label":b.buttonText},h,{className:t,onClick:this.onSearch,onKeyDown:this.onKeyDown})))):(t=(0,O.default)(((M={})[d+"search-btn"]=!0,M[h.className]=!!h.className,M)),E=D.default.createElement(P.default,(0,C.default)({tabIndex:"0","aria-disabled":r,"aria-label":b.buttonText,className:t,disabled:r},h,{onClick:this.onSearch,onKeyDown:this.onKeyDown}),a?x||D.default.createElement(j.default,{type:"search",className:d+"search-symbol-icon"}):null,c?D.default.createElement("span",{className:d+"search-btn-text"},c):null)),0<n.length&&(S=D.default.createElement(N.default,(0,C.default)({},p,{followTrigger:y,hasBorder:!1,dataSource:n,size:u,disabled:r,value:this.state.filterValue,onChange:this.onFilterChange}))),Y.obj.pickOthers(A.propTypes,e)),t=(void 0!==_&&(M.visible=Boolean(_)),Y.obj.pickAttrsWith(e,"data-")),h=D.default.createElement(I,{addonBefore:S,className:d+"search-left",addonBeforeClassName:d+"search-left-addon"},D.default.createElement(R,(0,C.default)({"aria-label":b.buttonText},M,{followTrigger:y,role:"searchbox",hasClear:v,className:d+"search-input",size:u,fillProps:m,placeholder:o,dataSource:f,innerAfter:l,onPressEnter:this.onPressEnter,value:this.state.value,onChange:this.onChange,onToggleHighlightItem:this.onToggleHighlightItem,autoHighlightFirstItem:k,popupContent:g,disabled:r,ref:this.saveInputRef})));return D.default.createElement("span",(0,C.default)({className:i,style:s},t,{dir:w?"rtl":void 0}),E?D.default.createElement(I,{addonAfter:E},h):h)},a=l=A,l.propTypes={prefix:s.default.string,shape:s.default.oneOf(["normal","simple"]),type:s.default.oneOf(["primary","secondary","normal","dark"]),size:s.default.oneOf(["large","medium"]),defaultValue:s.default.string,value:s.default.oneOfType([s.default.string,s.default.number]),onChange:s.default.func,onSearch:s.default.func,defaultFilterValue:s.default.string,fillProps:s.default.string,filter:s.default.array,filterValue:s.default.string,onFilterChange:s.default.func,dataSource:s.default.array,placeholder:s.default.string,searchText:s.default.node,style:s.default.object,className:s.default.string,filterProps:s.default.object,buttonProps:s.default.object,popupContent:s.default.node,followTrigger:s.default.bool,visible:s.default.bool,hasClear:s.default.bool,hasIcon:s.default.bool,disabled:s.default.bool,locale:s.default.object,rtl:s.default.bool,icons:s.default.object,autoHighlightFirstItem:s.default.bool,onToggleHighlightItem:s.default.func},l.defaultProps={prefix:"next-",shape:"normal",type:"normal",size:"medium",hasIcon:!0,filter:[],locale:n.default.Search,buttonProps:{},onChange:d,onSearch:d,onFilterChange:d,onToggleHighlightItem:d,hasClear:!1,disabled:!1,icons:{},autoHighlightFirstItem:!0},r=function(){var i=this;this.onChange=function(e,t){for(var n,a=arguments.length,r=Array(2<a?a-2:0),o=2;o<a;o++)r[o-2]=arguments[o];i.props.disabled||("value"in i.props||i.setState({value:e}),(n=i.props).onChange.apply(n,[e,t].concat(r)),"enter"===t&&(i.highlightKey="",i.props.onSearch(e,i.state.filterValue)))},this.onPressEnter=function(){i.highlightKey||i.onSearch()},this.onSearch=function(){i.props.disabled||i.props.onSearch(i.state.value,i.state.filterValue)},this.onFilterChange=function(e){"filterValue"in i.props||i.setState({filterValue:e}),i.props.onFilterChange(e)},this.onToggleHighlightItem=function(e){for(var t,n=arguments.length,a=Array(1<n?n-1:0),r=1;r<n;r++)a[r-1]=arguments[r];i.highlightKey=e,(t=i.props).onToggleHighlightItem.apply(t,[e].concat(a))},this.onKeyDown=function(e){i.props.disabled||e.keyCode===Y.KEYCODE.ENTER&&i.onSearch()},this.saveInputRef=function(e){e&&e.getInstance()&&(i.inputRef=e.getInstance())}},a);function A(e){(0,o.default)(this,A);var t=(0,i.default)(this,f.call(this,e)),n=(r.call(t),"value"in e?e.value:e.defaultValue),e="filterValue"in e?e.filterValue:e.defaultFilterValue;return t.state={value:void 0===n?"":n,filterValue:e},t.highlightKey=null,t}s.displayName="Search",t.default=(0,u.polyfill)(s),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var h=u(n(2)),a=u(n(4)),r=u(n(6)),o=u(n(7)),i=n(0),m=u(i),l=u(n(3)),g=u(n(13)),s=u(n(50)),n=n(11);function u(e){return e&&e.__esModule?e:{default:e}}var d,y=s.default.Item,v=s.default.CheckboxItem,c=n.func.bindCtx,_=n.obj.pickOthers,f=n.dom.getOffset,i=(d=i.Component,(0,o.default)(b,d),b.prototype.componentDidMount=function(){var e=this;this.props.needHighlight&&(this.addHighlightTimer=setTimeout(function(){e.setState({highlight:!0})},1),this.removeHighlightTimer=setTimeout(function(){e.setState({highlight:!1})},201))},b.prototype.componentWillUnmount=function(){clearTimeout(this.addHighlightTimer),clearTimeout(this.removeHighlightTimer)},b.prototype.getItemDOM=function(e){this.item=e},b.prototype.handleClick=function(){var e=this.props;(0,e.onClick)("left"===e.panelPosition?"right":"left",e.item.value)},b.prototype.handleDragStart=function(e){e&&e.dataTransfer&&"function"==typeof e.dataTransfer.setData&&e.dataTransfer.setData("text/plain",e.target.id);e=this.props;(0,e.onDragStart)(e.panelPosition,e.item.value)},b.prototype.getDragGap=function(e){var t=f(e.currentTarget).top,n=e.currentTarget.offsetHeight;return e.pageY<=t+n/2?"before":"after"},b.prototype.handleDragOver=function(e){var t=this.props,n=t.panelPosition,a=t.dragPosition,r=t.onDragOver,t=t.item;n===a&&(e.preventDefault(),n=this.getDragGap(e),this.dragGap!==n&&(this.dragGap=n,r(t.value)))},b.prototype.handleDragEnd=function(){(0,this.props.onDragEnd)()},b.prototype.handleDrop=function(e){e.preventDefault();var e=this.props,t=e.onDrop,n=e.item;t(e.panelPosition,e.dragValue,n.value,this.dragGap)},b.prototype.render=function(){var e,t=this.props,n=t.prefix,a=t.mode,r=t.checked,o=t.disabled,i=t.item,l=t.onCheck,s=t.itemRender,u=t.draggable,d=t.dragOverValue,c=t.panelPosition,t=t.dragPosition,f=_(Object.keys(b.propTypes),this.props),p=this.state.highlight,a="simple"===a,d=(0,g.default)(((e={})[n+"transfer-panel-item"]=!0,e[n+"insert-"+this.dragGap]=d===i.value&&c===t,e[n+"focused"]=p,e[n+"simple"]=a,e)),c=s(i),t=(0,h.default)({ref:this.getItemDOM,className:d,children:c,disabled:o,draggable:u&&!o,onDragStart:this.handleDragStart,onDragOver:this.handleDragOver,onDragEnd:this.handleDragEnd,onDrop:this.handleDrop},f),p="string"==typeof c?c:void 0;return a?(t.disabled||(t.onClick=this.handleClick),m.default.createElement(y,(0,h.default)({title:p},t))):m.default.createElement(v,(0,h.default)({checked:r,onChange:l.bind(this,i.value),title:p},t))},n=s=b,s.menuChildType=v.menuChildType,s.propTypes={prefix:l.default.string,mode:l.default.oneOf(["normal","simple"]),value:l.default.array,disabled:l.default.bool,item:l.default.object,onCheck:l.default.func,onClick:l.default.func,needHighlight:l.default.bool,itemRender:l.default.func,draggable:l.default.bool,onDragStart:l.default.func,onDragOver:l.default.func,onDragEnd:l.default.func,onDrop:l.default.func,dragPosition:l.default.oneOf(["left","right"]),dragValue:l.default.string,dragOverValue:l.default.string,panelPosition:l.default.oneOf(["left","right"])},n);function b(e){(0,a.default)(this,b);e=(0,r.default)(this,d.call(this,e));return e.state={highlight:!1},c(e,["getItemDOM","handleClick","handleDragStart","handleDragOver","handleDragEnd","handleDrop"]),e}i.displayName="TransferItem",t.default=i,e.exports=t.default},function(e,t,n){},function(e,t,n){"use strict";n(43),n(70),n(718)},function(e,t,n){},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var u=s(n(2)),o=s(n(4)),i=s(n(6)),a=s(n(7)),r=n(0),d=s(r),c=s(n(13)),l=s(n(3)),f=n(11),p=s(n(720)),h=s(n(8));function s(e){return e&&e.__esModule?e:{default:e}}m=r.Component,(0,a.default)(g,m),g.prototype.render=function(){var t=this,e=this.props,n=e.prefix,a=e.arrowPosition,r=e.slideDirection,o=e.style,i=e.className,e=e.children,l={},s=(Object.keys(h.default.propTypes).forEach(function(e){l[e]=t.props[e]}),f.obj.pickOthers(["className","style","slideDirection"],this.props)),e=d.default.Children.count(e);if(0===e)return null;1===e&&(s.arrows=!1,s.autoplay=!1,s.draggable=!1);e=(0,c.default)([n+"slick",n+"slick-"+a,n+"slick-"+r],i);return"ver"===r&&(s.vertical=!0,s.verticalSwiping=!0),d.default.createElement(h.default,(0,u.default)({},l,{rtl:!1}),d.default.createElement("div",(0,u.default)({dir:"ltr",className:e,style:o},f.obj.pickOthers((0,u.default)({},g.propTypes,p.default.propTypes),s)),d.default.createElement(p.default,(0,u.default)({ref:function(e){return t.innerSlider=e}},s))))},r=n=g,n.propTypes={prefix:l.default.string,rtl:l.default.bool,className:l.default.any,adaptiveHeight:l.default.bool,animation:l.default.oneOfType([l.default.string,l.default.bool]),arrows:l.default.bool,arrowSize:l.default.oneOf(["medium","large"]),arrowPosition:l.default.oneOf(["inner","outer"]),arrowDirection:l.default.oneOf(["hoz","ver"]),autoplay:l.default.bool,autoplaySpeed:l.default.number,nextArrow:l.default.element,prevArrow:l.default.element,centerMode:l.default.bool,dots:l.default.bool,dotsDirection:l.default.oneOf(["hoz","ver"]),dotsClass:l.default.string,dotsRender:l.default.func,draggable:l.default.bool,infinite:l.default.bool,defaultActiveIndex:l.default.number,lazyLoad:l.default.bool,slide:l.default.string,slideDirection:l.default.oneOf(["hoz","ver"]),slidesToShow:l.default.number,slidesToScroll:l.default.number,speed:l.default.number,activeIndex:l.default.number,triggerType:l.default.oneOf(["click","hover"]),onChange:l.default.func,onBeforeChange:l.default.func,children:l.default.any,style:l.default.object,centerPadding:l.default.string,cssEase:l.default.string,edgeFriction:l.default.number,focusOnSelect:l.default.bool,pauseOnHover:l.default.bool,swipe:l.default.bool,swipeToSlide:l.default.bool,touchMove:l.default.bool,touchThreshold:l.default.number,useCSS:l.default.bool,variableWidth:l.default.bool,waitForAnimate:l.default.bool,edgeEvent:l.default.any,swipeEvent:l.default.any},n.defaultProps={prefix:"next-",animation:"slide",arrowSize:"medium",arrowPosition:"inner",vertical:!1,verticalSwiping:!1,dots:!0,dotsDirection:"hoz",arrows:!0,arrowDirection:"hoz",infinite:!0,autoplay:!1,autoplaySpeed:3e3,speed:600,adaptiveHeight:!1,centerMode:!1,centerPadding:"50px",cssEase:"ease",draggable:!0,edgeFriction:.35,focusOnSelect:!1,defaultActiveIndex:0,lazyLoad:!1,pauseOnHover:!1,rtl:!1,slide:"div",slideDirection:"hoz",slidesToShow:1,slidesToScroll:1,swipe:!0,swipeToSlide:!1,touchMove:!0,touchThreshold:5,useCSS:!0,variableWidth:!1,waitForAnimate:!0,onChange:function(){},onBeforeChange:function(){},edgeEvent:null,swipeEvent:null,nextArrow:null,prevArrow:null,style:null,dotsRender:null,triggerType:"click"};var m,a=r;function g(){var e,t;(0,o.default)(this,g);for(var n=arguments.length,a=Array(n),r=0;r<n;r++)a[r]=arguments[r];return(e=t=(0,i.default)(this,m.call.apply(m,[this].concat(a)))).resize=function(){t.innerSlider.onWindowResized()},(0,i.default)(t,e)}a.displayName="Slider",t.default=a,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var P=c(n(2)),a=c(n(4)),r=c(n(6)),o=c(n(7)),j=c(n(0)),i=c(n(3)),l=n(30),s=n(11),u=c(n(721)),d=c(n(722)),Y=c(n(723)),I=c(n(724)),R=c(n(725));function c(e){return e&&e.__esModule?e:{default:e}}var f,A=s.func.noop,i=(f=j.default.Component,(0,o.default)(p,f),p.getDerivedStateFromProps=function(e,t){var n={},a=e.lazyLoad,r=e.children,o=e.slidesToShow,i=(e.activeIndex,t.currentSlide),l=[];if(r!==t.children&&(n.children=r),a){for(var s,u=0,d=j.default.Children.count(r);u<d;u++)i<=u&&u<i+o&&(l.push(u),s=d<=u+1?0:u+1,l.push(u-1<0?d-1:u-1),l.push(s));0===t.lazyLoadedList.length&&(n.lazyLoadedList=l)}return n},p.prototype.componentDidMount=function(){this.hasMounted=!0,this.initialize(this.props),this.adaptHeight(),this.props.activeIndex&&this.slickGoTo(this.props.activeIndex),window&&s.events.on(window,"resize",this.onWindowResized)},p.prototype.componentDidUpdate=function(e,t){e.activeIndex!==this.props.activeIndex?this.slickGoTo(this.props.activeIndex):t.currentSlide>=this.props.children.length?(this.update(this.props),this.changeSlide({message:"index",index:this.props.children.length-this.props.slidesToShow,currentSlide:this.state.currentSlide})):s.obj.shallowEqual(e,this.props)||this.update(this.props),this.adaptHeight()},p.prototype.componentWillUnmount=function(){this.animationEndCallback&&clearTimeout(this.animationEndCallback),s.events.off(window,"resize",this.onWindowResized),this.state.autoPlayTimer&&clearInterval(this.state.autoPlayTimer)},p.prototype.onWindowResized=function(){this.update(this.props),this.setState({animating:!1}),clearTimeout(this.animationEndCallback),delete this.animationEndCallback},p.prototype.slickGoTo=function(e){"number"==typeof e&&this.changeSlide({message:"index",index:e,currentSlide:this.state.currentSlide})},p.prototype.onEnterArrow=function(e){this.arrowHoverHandler(e)},p.prototype.onLeaveArrow=function(){this.arrowHoverHandler()},p.prototype._instanceRefHandler=function(e,t){this[e]=t},p.prototype.render=function(){var e=this.props,t=e.prefix,n=e.animation,a=e.arrows,r=e.arrowSize,o=e.arrowPosition,i=e.arrowDirection,l=e.dots,s=e.dotsClass,u=e.cssEase,d=e.speed,c=e.infinite,f=e.centerMode,p=e.centerPadding,h=e.lazyLoad,m=e.dotsDirection,g=e.rtl,y=e.slidesToShow,v=e.slidesToScroll,_=e.variableWidth,b=e.vertical,w=e.verticalSwiping,M=e.focusOnSelect,k=e.children,S=e.dotsRender,e=e.triggerType,E=this.state,x=E.currentSlide,C=E.lazyLoadedList,L=E.slideCount,T=E.slideWidth,D=E.slideHeight,O=E.trackStyle,N=E.listHeight,E=E.dragging,u={prefix:t,animation:n,cssEase:u,speed:d,infinite:c,centerMode:f,focusOnSelect:M?this.selectHandler:null,currentSlide:x,lazyLoad:h,lazyLoadedList:C,rtl:g,slideWidth:T,slideHeight:D,slidesToShow:y,slidesToScroll:v,slideCount:L,trackStyle:O,variableWidth:_,vertical:b,verticalSwiping:w,triggerType:e},d=void 0,h=(!0===l&&y<L&&(M={prefix:t,rtl:g,dotsClass:s,slideCount:L,slidesToShow:y,currentSlide:x,slidesToScroll:v,dotsDirection:m,changeSlide:this.changeSlide,dotsRender:S,triggerType:e},d=j.default.createElement(R.default,M)),void 0),C=void 0,T={prefix:t,rtl:g,arrowSize:r,arrowPosition:o,arrowDirection:i,infinite:c,centerMode:f,currentSlide:x,slideCount:L,slidesToShow:y,clickHandler:this.changeSlide},D=(a&&(h=j.default.createElement(Y.default,(0,P.default)({},T,{type:"prev","aria-label":"Previous",ref:this._instanceRefHandler.bind(this,"pArrow"),onMouseEnter:n?this.onEnterArrow.bind(this,"prev"):A,onMouseLeave:n?this.onLeaveArrow.bind(this,"prev"):A}),this.props.prevArrow),C=j.default.createElement(Y.default,(0,P.default)({},T,{type:"next","aria-label":"Next",ref:this._instanceRefHandler.bind(this,"nArrow"),onMouseEnter:n?this.onEnterArrow.bind(this,"next"):A,onMouseLeave:n?this.onLeaveArrow.bind(this,"next"):A}),this.props.nextArrow)),b?{height:N}:null),O=f?b?{padding:p+" 0px"}:{padding:"0px "+p}:void 0;return j.default.createElement("div",{className:t+"slick-container "+t+"slick-initialized",onMouseEnter:this.onInnerSliderEnter,onMouseLeave:this.onInnerSliderLeave},j.default.createElement("div",{ref:this._instanceRefHandler.bind(this,"list"),className:t+"slick-list",style:(0,P.default)({},D,O),onMouseDown:this.swipeStart,onMouseUp:this.swipeEnd,onTouchStart:this.swipeStart,onTouchEnd:this.swipeEnd,onMouseMove:E?this.swipeMove:null,onMouseLeave:E?this.swipeEnd:null,onTouchMove:E?this.swipeMove:null,onTouchCancel:E?this.swipeEnd:null},j.default.createElement(I.default,(0,P.default)({ref:this._instanceRefHandler.bind(this,"track")},u),k)),h,C,d)},o=n=p,n.propTypes={prefix:i.default.string,animation:i.default.oneOfType([i.default.string,i.default.bool]),arrows:i.default.bool,arrowSize:i.default.oneOf(["medium","large"]),arrowPosition:i.default.oneOf(["inner","outer"]),arrowDirection:i.default.oneOf(["hoz","ver"]),centerPadding:i.default.any,children:i.default.any,centerMode:i.default.bool,dots:i.default.bool,dotsDirection:i.default.oneOf(["hoz","ver"]),dotsClass:i.default.string,focusOnSelect:i.default.bool,cssEase:i.default.string,speed:i.default.number,infinite:i.default.bool,defaultActiveIndex:i.default.number,rtl:i.default.bool,slidesToShow:i.default.number,lazyLoad:i.default.bool,activeIndex:i.default.number,slidesToScroll:i.default.number,variableWidth:i.default.bool,vertical:i.default.bool,verticalSwiping:i.default.bool,prevArrow:i.default.element,nextArrow:i.default.element,dotsRender:i.default.func,triggerType:i.default.string},n.defaultProps={prefix:"next-",arrowDirection:"hoz",triggerType:"click"},o);function p(e){(0,a.default)(this,p);var t=(0,r.default)(this,f.call(this,e));return t.state={animating:!1,dragging:!1,autoPlayTimer:null,currentDirection:0,currentLeft:null,currentSlide:"activeIndex"in e?e.activeIndex:e.defaultActiveIndex,direction:1,listWidth:null,listHeight:null,slideCount:null,slideWidth:null,slideHeight:null,swipeLeft:null,touchObject:{startX:0,startY:0,curX:0,curY:0},lazyLoadedList:[],initialized:!1,edgeDragged:!1,swiped:!1,trackStyle:{},trackWidth:0},s.func.bindCtx(t,["onWindowResized","selectHandler","changeSlide","onInnerSliderEnter","onInnerSliderLeave","swipeStart","swipeMove","swipeEnd"]),t}i.displayName="InnerSlider",(0,P.default)(i.prototype,d.default),(0,P.default)(i.prototype,u.default),t.default=(0,l.polyfill)(i),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var a=n(2),s=(a=a)&&a.__esModule?a:{default:a},r=n(23),u=n(405);t.default={changeSlide:function(e){var t=void 0,n=void 0,a=this.state.slideCount%this.props.slidesToScroll!=0?0:(this.state.slideCount-this.state.currentSlide)%this.props.slidesToScroll;if("previous"===e.message)t=0==a?this.props.slidesToScroll:this.props.slidesToShow-a,n=this.state.currentSlide-t;else if("next"===e.message)t=0==a?this.props.slidesToScroll:a,n=this.state.currentSlide+t;else if("dots"===e.message||"children"===e.message){if((n=e.index*e.slidesToScroll)===e.currentSlide)return}else if("index"===e.message&&(n=e.index)===e.currentSlide)return;this.slideHandler(n)},keyHandler:function(e){e.target.tagName.match("TEXTAREA|INPUT|SELECT")||(37===e.keyCode&&!0===this.props.accessibility?this.changeSlide({message:!0===this.props.rtl?"next":"previous"}):39===e.keyCode&&!0===this.props.accessibility&&this.changeSlide({message:!0===this.props.rtl?"previous":"next"}))},selectHandler:function(e){this.changeSlide(e)},swipeStart:function(e){var t;!1===this.props.swipe||"ontouchend"in document&&!1===this.props.swipe||!1===this.props.draggable&&-1!==e.type.indexOf("mouse")||(t=void 0!==e.touches?e.touches[0].pageX:e.clientX,e=void 0!==e.touches?e.touches[0].pageY:e.clientY,this.setState({dragging:!0,touchObject:{startX:t,startY:e,curX:t,curY:e}}))},swipeMove:function(e){var t,n,a,r,o,i,l;this.state.dragging&&!this.state.animating&&(t=this.state.touchObject,n=(0,u.getTrackLeft)((0,s.default)({slideIndex:this.state.currentSlide,trackRef:this.refs.track},this.props,this.state)),t.curX=e.touches?e.touches[0].pageX:e.clientX,t.curY=e.touches?e.touches[0].pageY:e.clientY,t.swipeLength=Math.round(Math.sqrt(Math.pow(t.curX-t.startX,2))),a=(!1===this.props.rtl?1:-1)*(t.curX>t.startX?1:-1),!0===this.props.verticalSwiping&&(t.swipeLength=Math.round(Math.sqrt(Math.pow(t.curY-t.startY,2))),a=t.curY>t.startY?1:-1),r=this.state.currentSlide,l=Math.ceil(this.state.slideCount/this.props.slidesToScroll),o=this.swipeDirection(this.state.touchObject),i=t.swipeLength,!1===this.props.infinite&&(0===r&&"right"===o||l<=r+1&&"left"===o)&&(i=t.swipeLength*this.props.edgeFriction,!1===this.state.edgeDragged&&this.props.edgeEvent&&(this.props.edgeEvent(o),this.setState({edgeDragged:!0}))),!1===this.state.swiped&&this.props.swipeEvent&&(this.props.swipeEvent(o),this.setState({swiped:!0})),this.setState({touchObject:t,swipeLeft:l=n+i*a,trackStyle:(0,u.getTrackCSS)((0,s.default)({left:l},this.props,this.state))}),Math.abs(t.curX-t.startX)<.8*Math.abs(t.curY-t.startY)||4<t.swipeLength&&e.preventDefault())},getNavigableIndexes:function(){for(var e=void 0,t=0,n=0,a=[],e=this.props.infinite?(t=-1*this.props.slidesToShow,n=-1*this.props.slidesToShow,2*this.state.slideCount):this.state.slideCount;t<e;)a.push(t),t=n+this.props.slidesToScroll,n+=this.props.slidesToScroll<=this.props.slidesToShow?this.props.slidesToScroll:this.props.slidesToShow;return a},checkNavigable:function(e){var t=this.getNavigableIndexes(),n=0;if(e>t[t.length-1])e=t[t.length-1];else for(var a in t){if(e<t[a]){e=n;break}n=t[a]}return e},getSlideCount:function(){var t,e,n=this,a=this.props.centerMode?this.state.slideWidth*Math.floor(this.props.slidesToShow/2):0;return this.props.swipeToSlide?(e=(t=void 0,r.findDOMNode)(this.list).querySelectorAll(this.props.prefix+"slick-slide"),Array.from(e).every(function(e){if(n.props.vertical){if(e.offsetTop+(n.getHeight(e)||0)/2>-1*n.state.swipeLeft)return t=e,!1}else if(e.offsetLeft-a+(n.getWidth(e)||0)/2>-1*n.state.swipeLeft)return t=e,!1;return!0}),Math.abs(t.dataset.index-this.state.currentSlide)||1):this.props.slidesToScroll},swipeEnd:function(e){if(this.state.dragging){var t=this.state.touchObject,n=this.state.listWidth/this.props.touchThreshold,a=this.swipeDirection(t);if(this.props.verticalSwiping&&(n=this.state.listHeight/this.props.touchThreshold),this.setState({dragging:!1,edgeDragged:!1,swiped:!1,swipeLeft:null,touchObject:{}}),t.swipeLength)if(t.swipeLength>n){e.preventDefault();var r=void 0,o=void 0;switch(a){case"left":case"down":o=this.state.currentSlide+this.getSlideCount(),r=this.props.swipeToSlide?this.checkNavigable(o):o,this.setState({currentDirection:0});break;case"right":case"up":o=this.state.currentSlide-this.getSlideCount(),r=this.props.swipeToSlide?this.checkNavigable(o):o,this.setState({currentDirection:1});break;default:r=this.state.currentSlide}this.slideHandler(r)}else{t=(0,u.getTrackLeft)((0,s.default)({slideIndex:this.state.currentSlide,trackRef:this.track},this.props,this.state));this.setState({trackStyle:(0,u.getTrackAnimateCSS)((0,s.default)({left:t},this.props,this.state))})}}else this.props.swipe&&e.preventDefault()},onInnerSliderEnter:function(){this.props.autoplay&&this.props.pauseOnHover&&this.pause()},onInnerSliderLeave:function(){this.props.autoplay&&this.props.pauseOnHover&&this.autoPlay()}},e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var g=a(n(2)),d=a(n(0)),c=a(n(23)),y=n(405);function a(e){return e&&e.__esModule?e:{default:e}}t.default={initialize:function(t){var n=this,e=c.default.findDOMNode(this.list),a=d.default.Children.count(t.children),r=this.getWidth(e)||0,o=this.getWidth(c.default.findDOMNode(this.track))||0,i=void 0,e=(i=t.vertical?r:(r-(t.centerMode&&2*parseInt(t.centerPadding)))/t.slidesToShow,this.getHeight(e.querySelector('[data-index="0"]'))||0),l=e*t.slidesToShow,s=t.slidesToShow||1,u="activeIndex"in t?t.activeIndex:t.defaultActiveIndex,s=t.rtl?a-1-(s-1)-u:u;this.setState({slideCount:a,slideWidth:i,listWidth:r,trackWidth:o,currentSlide:s,slideHeight:e,listHeight:l},function(){var e=(0,y.getTrackLeft)((0,g.default)({slideIndex:n.state.currentSlide,trackRef:n.track},t,n.state)),e=(0,y.getTrackCSS)((0,g.default)({left:e},t,n.state));n.setState({trackStyle:e}),n.autoPlay()})},update:function(e){this.initialize(e)},getWidth:function(e){return"clientWidth"in e?e.clientWidth:e&&e.getBoundingClientRect().width},getHeight:function(e){return"clientHeight"in e?e.clientHeight:e&&e.getBoundingClientRect().height},adaptHeight:function(){var e,t;this.props.adaptiveHeight&&(t='[data-index="'+this.state.currentSlide+'"]',this.list&&(t=(e=c.default.findDOMNode(this.list)).querySelector(t).offsetHeight,e.style.height=t+"px"))},canGoNext:function(e){var t=!0;return e.infinite||(e.centerMode?e.currentSlide>=e.slideCount-1&&(t=!1):(e.slideCount<=e.slidesToShow||e.currentSlide>=e.slideCount-e.slidesToShow)&&(t=!1)),t},slideHandler:function(e){var t=this,n=this.props.rtl,a=void 0,r=void 0,o=void 0;if(!this.props.waitForAnimate||!this.state.animating){if("fade"===this.props.animation)return r=this.state.currentSlide,!1===this.props.infinite&&(e<0||e>=this.state.slideCount)?void 0:(a=e<0?e+this.state.slideCount:e>=this.state.slideCount?e-this.state.slideCount:e,this.props.lazyLoad&&this.state.lazyLoadedList.indexOf(a)<0&&this.setState({lazyLoadedList:this.state.lazyLoadedList.concat(a)}),o=function(){t.setState({animating:!1}),t.props.onChange(a),delete t.animationEndCallback},this.props.onBeforeChange(this.state.currentSlide,a),this.setState({animating:!0,currentSlide:a},function(){this.animationEndCallback=setTimeout(o,this.props.speed+20)}),void this.autoPlay());a=e,n?a<0?!1===this.props.infinite?r=0:this.state.slideCount%this.props.slidesToScroll!=0?a+this.props.slidesToScroll<=0?(r=this.state.slideCount+a,a=this.state.slideCount-this.props.slidesToScroll):r=a=0:r=this.state.slideCount+a:r=a>=this.state.slideCount?!1===this.props.infinite?this.state.slideCount-this.props.slidesToShow:this.state.slideCount%this.props.slidesToScroll!=0?0:a-this.state.slideCount:a:r=a<0?!1===this.props.infinite?0:this.state.slideCount%this.props.slidesToScroll!=0?this.state.slideCount-this.state.slideCount%this.props.slidesToScroll:this.state.slideCount+a:a>=this.state.slideCount?!1===this.props.infinite?this.state.slideCount-this.props.slidesToShow:this.state.slideCount%this.props.slidesToScroll!=0?0:a-this.state.slideCount:a;var i,e=(0,y.getTrackLeft)((0,g.default)({slideIndex:a,trackRef:this.track},this.props,this.state)),l=(0,y.getTrackLeft)((0,g.default)({slideIndex:r,trackRef:this.track},this.props,this.state));if(!1===this.props.infinite&&(e=l),this.props.lazyLoad){for(var s=!0,u=[],d=this.state.slideCount,c=a<0?d+a:r,f=c;f<c+this.props.slidesToShow;f++){var p=f,h=(p=n?d<=f?2*d-f-1:d-f-1:p)-1<0?d-1:p-1,m=d<=p+1?0:p+1;this.state.lazyLoadedList.indexOf(p)<0&&u.push(p),this.state.lazyLoadedList.indexOf(h)<0&&u.push(h),this.state.lazyLoadedList.indexOf(m)<0&&u.push(m)}u.forEach(function(e){t.state.lazyLoadedList.indexOf(e)<0&&(s=!1)}),s||this.setState({lazyLoadedList:this.state.lazyLoadedList.concat(u)})}this.props.onBeforeChange(this.state.currentSlide,r),!1===this.props.useCSS?this.setState({currentSlide:r,trackStyle:(0,y.getTrackCSS)((0,g.default)({left:l},this.props,this.state))},function(){t.props.onChange(r)}):(i={animating:!1,currentSlide:r,trackStyle:(0,y.getTrackCSS)((0,g.default)({left:l},this.props,this.state)),swipeLeft:null},o=function(){t.setState(i),t.props.onChange(r),delete t.animationEndCallback},this.setState({animating:!0,currentSlide:r,trackStyle:(0,y.getTrackAnimateCSS)((0,g.default)({left:e},this.props,this.state))},function(){this.animationEndCallback=setTimeout(o,this.props.speed+20)})),this.autoPlay()}},arrowHoverHandler:function(e){var t=(0,y.getTrackLeft)((0,g.default)({slideIndex:this.state.currentSlide,trackRef:this.track},this.props,this.state)),n=void 0,n="next"===e?t-30:"prev"===e?t+30:t;this.setState({trackStyle:(0,y.getTrackAnimateCSS)((0,g.default)({left:n},this.props,this.state))})},swipeDirection:function(e){var t=void 0,n=e.startX-e.curX,e=e.startY-e.curY,e=Math.atan2(e,n);return(t=(t=Math.round(180*e/Math.PI))<0?360-Math.abs(t):t)<=45&&0<=t||t<=360&&315<=t?!1===this.props.rtl?"left":"right":135<=t&&t<=225?!1===this.props.rtl?"right":"left":!0===this.props.verticalSwiping?35<=t&&t<=135?"down":"up":"vertical"},play:function(){var e=void 0;if(!this.hasMounted)return!1;if(this.props.rtl)e=this.state.currentSlide-this.props.slidesToScroll;else{if(!this.canGoNext((0,g.default)({},this.props,this.state)))return!1;e=this.state.currentSlide+this.props.slidesToScroll}this.slideHandler(e)},autoPlay:function(){this.state.autoPlayTimer&&clearTimeout(this.state.autoPlayTimer),this.props.autoplay&&this.setState({autoPlayTimer:setTimeout(this.play.bind(this),this.props.autoplaySpeed)})},pause:function(){this.state.autoPlayTimer&&(clearTimeout(this.state.autoPlayTimer),this.setState({autoPlayTimer:null}))}},e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var c=s(n(2)),a=s(n(4)),r=s(n(6)),o=s(n(7)),i=n(0),f=s(i),l=s(n(3)),p=s(n(13)),h=s(n(24)),m=n(11);function s(e){return e&&e.__esModule?e:{default:e}}var u,n=m.func.noop,l=(u=i.Component,(0,o.default)(g,u),g.isDisabled=function(e){var t=e.infinite,n=e.type,a=e.centerMode,r=e.currentSlide,o=e.slideCount,e=e.slidesToShow;return!t&&("prev"===n?r<=0:!!(a&&o-1<=r)||o-e<=r)},g.prototype.handleClick=function(e,t){t&&t.preventDefault(),"prev"===e.message&&(e.message="previous"),this.props.clickHandler(e,t)},g.prototype.render=function(){var e=this.props,t=e.prefix,n=e.type,a=e.arrowSize,r=e.arrowPosition,o=e.arrowDirection,i=e.onMouseEnter,l=e.onMouseLeave,e=e.children,s=m.obj.pickOthers(g.propTypes,this.props),u=g.ARROW_ICON_TYPES[o][n],d=g.isDisabled(this.props),t=(0,p.default)([t+"slick-arrow",t+"slick-"+n,r,a,o],{disabled:d}),r=(0,c.default)({},s,{key:n,"data-role":"none",className:t,style:{display:"block"},onClick:d?null:this.handleClick.bind(this,{message:n}),onMouseEnter:d?null:i,onMouseLeave:d?null:l});return e?f.default.cloneElement(f.default.Children.only(e),r):f.default.createElement("button",(0,c.default)({type:"button",role:"button"},r),f.default.createElement(h.default,{type:u}))},o=i=g,i.propTypes={prefix:l.default.string,rtl:l.default.bool,type:l.default.oneOf(["prev","next"]).isRequired,centerMode:l.default.bool,currentSlide:l.default.number,infinite:l.default.bool,clickHandler:l.default.func,slideCount:l.default.number,slidesToShow:l.default.number,arrow:l.default.element,arrowSize:l.default.string,arrowPosition:l.default.string,arrowDirection:l.default.oneOf(["hoz","ver"]),onMouseEnter:l.default.func,onMouseLeave:l.default.func,children:l.default.node},i.defaultProps={onMouseEnter:n,onMouseLeave:n},i.ARROW_ICON_TYPES={hoz:{prev:"arrow-left",next:"arrow-right"},ver:{prev:"arrow-up",next:"arrow-down"}},o);function g(){return(0,a.default)(this,g),(0,r.default)(this,u.apply(this,arguments))}l.displayName="Arrow",t.default=l,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var a=s(n(4)),r=s(n(6)),o=s(n(7)),v=s(n(2)),i=n(0),_=s(i),l=s(n(3)),b=s(n(13)),w=n(11);function s(e){return e&&e.__esModule?e:{default:e}}function M(e,t){return null===e.key||void 0===e.key?t:e.key}function u(c){var f=void 0,p=[],h=[],m=[],g=_.default.Children.count(c.children),y=void 0;return _.default.Children.forEach(c.children,function(t,e){var n,a,r,o,i,l={message:"children",index:e,slidesToScroll:c.slidesToScroll,currentSlide:c.currentSlide},s=(y=!c.lazyLoad|(c.lazyLoad&&0<=c.lazyLoadedList.indexOf(e))?t:t.key?_.default.createElement("div",{key:t.key}):_.default.createElement("div",null),s=(0,v.default)({},c,{activeIndex:e}),d={},void 0!==s.variableWidth&&!1!==s.variableWidth||(d.width=s.slideWidth),"fade"===s.animation&&(d.position="relative",d.opacity=s.currentSlide===s.activeIndex?1:0,d.visibility=s.currentSlide>=s.activeIndex?"visible":"hidden",d.transition="opacity "+s.speed+"ms "+s.cssEase,d.WebkitTransition="opacity "+s.speed+"ms "+s.cssEase,s.vertical?d.top=-s.activeIndex*s.slideHeight:d.left=-s.activeIndex*s.slideWidth),s.vertical&&(d.width="100%"),d),u=(d=(0,v.default)({activeIndex:e},c),a=d.prefix,u=r=i=void 0,o=(u=d.rtl?d.slideCount-1-d.activeIndex:d.activeIndex)<0||u>=d.slideCount,d.centerMode?(n=Math.floor(d.slidesToShow/2),r=(u-d.currentSlide)%d.slideCount==0,u>d.currentSlide-n-1&&u<=d.currentSlide+n&&(i=!0)):i=d.currentSlide<=u&&u<d.currentSlide+d.slidesToShow,(0,b.default)(a+"slick-slide",((n={})[a+"slick-active"]=i,n[a+"slick-center"]=r,n[a+"slick-cloned"]=o,n))),d=void 0,d=y.props.className?(0,b.default)(u,y.props.className):u;p.push(_.default.cloneElement(y,{key:"original"+M(y,e),"data-index":e,className:d,tabIndex:"-1","aria-posinset":e,"aria-setsize":g,role:"listitem",dir:c.rtl?"rtl":"ltr",style:w.dom.hasDOM?(0,v.default)({outline:"none"},y.props.style,s):(0,v.default)({outline:"none"},s,y.props.style),onClick:function(e){y.props&&y.props.onClick&&t.props.onClick(e),c.focusOnSelect&&c.focusOnSelect(l)}})),c.infinite&&"fade"!==c.animation&&(i=c.variableWidth?c.slidesToShow+1:c.slidesToShow,g-i<=e&&(f=-(g-e),h.push(_.default.cloneElement(y,{key:"precloned"+M(y,f),"data-index":f,className:d,style:(0,v.default)({},y.props.style,s)}))),e<i&&(f=g+e,m.push(_.default.cloneElement(y,{key:"postcloned"+M(y,f),"data-index":f,className:d,style:(0,v.default)({},y.props.style,s)}))))}),w.dom.hasDOM?c.rtl?h.concat(p,m).reverse():h.concat(p,m):p.slice(c.currentSlide,c.currentSlide+c.slidesToShow)}d=i.Component,(0,o.default)(c,d),c.prototype.render=function(){var e=u(this.props);return _.default.createElement("div",{role:"list",className:this.props.prefix+"slick-track",style:this.props.trackStyle},e)},i=n=c,n.propTypes={prefix:l.default.string,trackStyle:l.default.object},n.defaultProps={prefix:"next-"};var d,o=i;function c(){return(0,a.default)(this,c),(0,r.default)(this,d.apply(this,arguments))}o.displayName="Track",t.default=o,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var a,y=s(n(2)),r=s(n(4)),o=s(n(6)),i=s(n(7)),v=s(n(0)),l=s(n(3)),_=s(n(13));function s(e){return e&&e.__esModule?e:{default:e}}var u,n=n(11).func.noop,l=(u=v.default.Component,(0,i.default)(d,u),d.prototype.handleChangeSlide=function(e,t){t.preventDefault(),this.props.changeSlide(e)},d.prototype.render=function(){for(var e=this.props,t=e.prefix,n=e.slideCount,a=e.slidesToScroll,r=e.currentSlide,o=e.dotsClass,i=e.dotsDirection,l=e.dotsRender,s=e.triggerType,u=e.rtl,e=(0,_.default)(t+"slick-dots",i,o),d=Math.ceil(n/a),c=[],f=0;f<d;f++){var p,h=f*a,h=(0,_.default)(t+"slick-dots-item",{active:h<=r&&r<=h+a-1}),m={message:"dots",index:f,slidesToScroll:a,currentSlide:r};(p={})["hover"===s.toLowerCase()?"onMouseEnter":"onClick"]=this.handleChangeSlide.bind(this,m);var m=f,g=r;u&&(m=d-1-f,g=d-1-r),c.push(v.default.createElement("li",(0,y.default)({key:f,className:h},p),l instanceof Function?v.default.createElement("span",null,l(m,g)):v.default.createElement("button",{tabIndex:"-1"})))}return v.default.createElement("ul",{className:e,"aria-hidden":"true"},c)},a=i=d,i.propTypes={prefix:l.default.string,currentSlide:l.default.number,changeSlide:l.default.func,dotsClass:l.default.string,slideCount:l.default.number,slidesToScroll:l.default.number,dotsDirection:l.default.oneOf(["hoz","ver"]),dotsRender:l.default.func,triggerType:l.default.string},i.defaultProps={changeSlide:n},a);function d(){return(0,r.default)(this,d),(0,o.default)(this,u.apply(this,arguments))}l.displayName="Dots",t.default=l,e.exports=t.default},function(e,t,n){},function(e,t,n){"use strict";t.__esModule=!0;var s=h(n(2)),a=h(n(4)),r=h(n(6)),o=h(n(7)),u=h(n(0)),i=h(n(3)),d=h(n(13)),l=n(30),c=h(n(8)),f=n(11),p=h(n(406));function h(e){return e&&e.__esModule?e:{default:e}}m=u.default.Component,(0,o.default)(g,m),g.getDerivedStateFromProps=function(e){return"expandedKeys"in e?{expandedKeys:void 0===e.expandedKeys?[]:e.expandedKeys}:null},g.prototype.onItemClick=function(e){var t,n,a=this.state.expandedKeys;this.props.accordion?a=String(a[0])===String(e)?[]:[e]:(a=[].concat(a),t=String(e),-1<(n=a.findIndex(function(e){return String(e)===t}))?a.splice(n,1):a.push(e)),this.setExpandedKey(a)},g.prototype.genratePanelId=function(e,t){var n=this.props.id,a=void 0;return e?a=e:n&&(a=n+"-panel-"+t),a},g.prototype.getProps=function(e,t,n){var a=this,r=this.state.expandedKeys,o=e.title,i=(i=this.props.disabled)||e.disabled,l=!1,l=this.props.accordion?String(r[0])===String(n):r.some(function(e){return null!=e&&null!=n&&(e===n||e.toString()===n.toString())}),r=this.genratePanelId(e.id,t);return{key:n,title:o,isExpanded:l,disabled:i,id:r,onClick:i?null:function(){a.onItemClick(n),"onClick"in e&&e.onClick(n)}}},g.prototype.getItemsByDataSource=function(){var a=this,e=this.props.dataSource,r=e.some(function(e){return"key"in e});return e.map(function(e,t){var n=r?e.key:""+t;return u.default.createElement(p.default,(0,s.default)({},a.getProps(e,t,n),{key:n}),e.content)})},g.prototype.getItemsByChildren=function(){var a=this,e=u.default.Children.map(this.props.children,function(e){return e&&e.key}),r=Boolean(e&&e.length);return u.default.Children.map(this.props.children,function(e,t){var n;return e&&"function"==typeof e.type&&e.type.isNextPanel?(n=r?e.key:""+t,u.default.cloneElement(e,a.getProps(e.props,t,n))):e})},g.prototype.setExpandedKey=function(e){"expandedKeys"in this.props||this.setState({expandedKeys:e}),this.props.onExpand(this.props.accordion?e[0]:e)},g.prototype.render=function(){var e,t=this.props,n=t.prefix,a=t.className,r=t.style,o=t.disabled,i=t.dataSource,l=t.id,t=t.rtl,n=(0,d.default)(((e={})[n+"collapse"]=!0,e[n+"collapse-disabled"]=o,e[a]=Boolean(a),e)),o=f.obj.pickOthers(g.propTypes,this.props);return u.default.createElement("div",(0,s.default)({id:l,className:n,style:r},o,{role:"presentation",dir:t?"rtl":void 0}),i?this.getItemsByDataSource():this.getItemsByChildren())},o=n=g,n.propTypes={prefix:i.default.string,style:i.default.object,dataSource:i.default.array,defaultExpandedKeys:i.default.array,expandedKeys:i.default.array,onExpand:i.default.func,disabled:i.default.bool,className:i.default.string,accordion:i.default.bool,children:i.default.node,id:i.default.string,rtl:i.default.bool},n.defaultProps={accordion:!1,prefix:"next-",onExpand:f.func.noop},n.contextTypes={prefix:i.default.string};var m,n=o;function g(e){(0,a.default)(this,g);var t=(0,r.default)(this,m.call(this,e)),n=void 0,n="expandedKeys"in e?e.expandedKeys:e.defaultExpandedKeys;return t.state={expandedKeys:void 0===n?[]:n},t}n.displayName="Collapse",t.default=(0,l.polyfill)(c.default.config(n)),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var a=d(n(2)),o=d(n(4)),i=d(n(6)),r=d(n(7)),l=d(n(0)),s=d(n(409)),u=d(n(730));function d(e){return e&&e.__esModule?e:{default:e}}c=l.default.Component,(0,r.default)(f,c),f.prototype.componentDidMount=function(){"undefined"==typeof File&&this.setState({Component:u.default})},f.prototype.abort=function(e){this.uploaderRef.abort(e)},f.prototype.startUpload=function(e){this.uploaderRef.startUpload(e)},f.prototype.render=function(){var e=this.state.Component;return l.default.createElement(e,(0,a.default)({},this.props,{ref:this.saveUploaderRef}))};var c,n=f;function f(){var e,t;(0,o.default)(this,f);for(var n=arguments.length,a=Array(n),r=0;r<n;r++)a[r]=arguments[r];return(e=t=(0,i.default)(this,c.call.apply(c,[this].concat(a)))).state={Component:s.default},t.saveUploaderRef=function(e){t.uploaderRef=e},(0,i.default)(t,e)}n.displayName="Uploader",t.default=n,e.exports=t.default},function(e,t,n){"use strict";function i(e,t,n){n=n||"cannot post "+e.action+" "+t.status+"'";n=new Error(n);return n.status=t.status,n.method=e.method,n.url=e.action,n}function l(t){t=t.responseText||t.response;if(!t)return t;try{return JSON.parse(t)}catch(e){return t}}t.__esModule=!0,t.default=function(t){var e=new XMLHttpRequest;t.onProgress&&e.upload&&(e.upload.onprogress=function(e){0<e.total&&(e.percent=e.loaded/e.total*100),t.onProgress(e)});var n=new FormData;t.data&&Object.keys(t.data).forEach(function(e){n.append(e,t.data[e])});t.file instanceof Blob?n.append(t.filename,t.file,t.file.name):n.append(t.filename,t.file);e.onerror=function(e){t.onError(e)},e.onload=function(){if(e.status<200||300<=e.status)return t.onError(i(t,e),l(e));t.onSuccess(l(e),e)},t.method=t.method||"POST",e.open(t.method,t.action,!0);var a=t.timeout;"number"==typeof a&&0<a&&(e.timeout=a,e.ontimeout=function(){t.onError(i(t,e,"Upload abort for exceeding time (timeout: "+a+"ms)"),l(e))});t.withCredentials&&"withCredentials"in e&&(e.withCredentials=!0);var r,o=t.headers||{};null!==o["X-Requested-With"]&&e.setRequestHeader("X-Requested-With","XMLHttpRequest");for(r in o)o.hasOwnProperty(r)&&null!==o[r]&&e.setRequestHeader(r,o[r]);return e.send(n),{abort:function(){e.abort()}}},e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var a,l=p(n(2)),r=p(n(4)),o=p(n(6)),i=p(n(7)),s=p(n(0)),u=p(n(3)),d=p(n(23)),c=n(11),f=n(99);function p(e){return e&&e.__esModule?e:{default:e}}var h,m={position:"absolute",top:0,right:0,fontSize:9999,zIndex:9999,opacity:0,outline:"none",cursor:"pointer"},u=(h=s.default.Component,(0,i.default)(g,h),g.prototype.componentDidMount=function(){this.updateInputWH()},g.prototype.componentDidUpdate=function(){this.updateInputWH()},g.prototype.startUpload=function(){this.upload(this.file)},g.prototype.upload=function(t){var n=this,e=(this.state.uploading||(this.state.uploading=!0,this.setState({uploading:!0})),this.props),a=e.beforeUpload,r=e.action,o=e.name,e=e.data;if(!a)return this.post(t);a=a(t,{action:r,name:o,data:e});a&&a.then?a.then(function(e){n.post(t,e)},function(){n.endUpload()}):!1!==a?this.post(t,c.obj.isPlainObject(a)?a:void 0):this.endUpload()},g.prototype.endUpload=function(){this.file={},this.state.uploading&&(this.state.uploading=!1,this.setState({uploading:!1}))},g.prototype.updateInputWH=function(){var e=d.default.findDOMNode(this),t=this.inputEl;t.style.height=e.offsetHeight+"px",t.style.width=e.offsetWidth+"px"},g.prototype.abort=function(e){e&&(e&&e.uid?e.uid:e)!==this.file.uid||this.endUpload()},g.prototype.post=function(e){var t,n,a=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=this.formEl,o=this.dataEl,i=this.inputEl,l=this.props.data,s=("function"==typeof l&&(l=l(e)),a.action),u=a.name,d=a.data,c=(u&&i.setAttribute("name",u),s&&r.setAttribute("action",s),d&&(l=d),document.createDocumentFragment());for(t in l)d.hasOwnProperty(t)&&((n=document.createElement("input")).setAttribute("name",t),n.value=l[t],c.appendChild(n));o.appendChild(c),r.submit(),o.innerHTML="",this.props.onStart(e)},g.prototype.render=function(){var e=this.props,t=e.disabled,n=e.className,a=e.children,r=e.accept,o=e.name,e=e.style,i=o+"-"+this.uid+"-iframe";return s.default.createElement("span",{className:n,style:(0,l.default)({position:"relative",zIndex:0,display:"inline-block"},e)},t?null:s.default.createElement("iframe",{ref:this.saveIFrameRef,name:i,onLoad:this.onLoad,style:{display:"none"}}),s.default.createElement("form",{ref:this.saveFormRef,method:"post",action:this.props.action,encType:"multipart/form-data",target:i},s.default.createElement("input",{name:"_documentDomain",value:this.domain,type:"hidden"}),s.default.createElement("span",{ref:this.saveDataRef}),s.default.createElement("input",{ref:this.saveInputRef,type:"file",accept:r,name:o,onChange:this.onSelect,style:m})),a)},i=n=g,n.propTypes={style:u.default.object,action:u.default.string.isRequired,name:u.default.string.isRequired,data:u.default.oneOfType([u.default.object,u.default.func]),disabled:u.default.bool,className:u.default.string,children:u.default.node,headers:u.default.object,autoUpload:u.default.bool,onSelect:u.default.func,beforeUpload:u.default.func,onStart:u.default.func,onSuccess:u.default.func,onError:u.default.func,accept:u.default.string},n.defaultProps={name:"file",onSelect:c.func.noop,beforeUpload:c.func.noop,onStart:c.func.noop,onSuccess:c.func.noop,onError:c.func.noop,onAbort:c.func.noop},a=function(){var o=this;this.state={uploading:!1},this.file={},this.uid="",this.onLoad=function(){if(o.state.uploading){var t=o.props,n=o.file,a=void 0;try{var e=o.iFrameEl.contentDocument,r=e.getElementsByTagName("script")[0];r&&r.parentNode===e.body&&e.body.removeChild(r),a=e.body.innerHTML,t.onSuccess(a,n)}catch(e){c.log.warning("cross domain error for Upload. Maybe server should return document.domain script."),a="cross-domain",t.onError(e,null,n)}o.endUpload()}},this.onSelect=function(e){o.file={uid:(0,f.uid)(),name:e.target.value},o.props.onSelect([o.file])},this.saveIFrameRef=function(e){o.iFrameEl=e},this.saveFormRef=function(e){o.formEl=e},this.saveDataRef=function(e){o.dataEl=e},this.saveInputRef=function(e){o.inputEl=e}},i);function g(e){(0,r.default)(this,g);e=(0,o.default)(this,h.call(this,e));return a.call(e),e.domain="undefined"!=typeof document&&document.domain?document.domain:"",e.uid=(0,f.uid)(),e}u.displayName="IframeUploader",t.default=u,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var o=r(n(2)),i=r(n(12)),a=r(n(8)),n=r(n(732));function r(e){return e&&e.__esModule?e:{default:e}}t.default=a.default.config(n.default,{transform:function(e,t){var n,a,r;return"type"in e&&(t("type","progressive","Progress"),r=(n=e).type,n=(0,i.default)(n,["type"]),e=(0,o.default)({progressive:"progressive"===r},n)),"showInfo"in e&&(t("showInfo","textRender","Progress"),n=(r=e).showInfo,r=(0,i.default)(r,["showInfo"]),e=n?r:(0,o.default)({textRender:function(){return!1}},r)),"suffix"in e&&(t("suffix","textRender","Progress"),a=(n=e).suffix,r=(0,i.default)(n,["suffix"]),e=(0,o.default)({textRender:function(){return a}},r)),e}}),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var a=p(n(2)),r=p(n(12)),o=p(n(4)),i=p(n(6)),l=p(n(7)),s=n(0),u=p(s),d=p(n(3)),c=p(n(733)),f=p(n(734));function p(e){return e&&e.__esModule?e:{default:e}}h=s.Component,(0,l.default)(m,h),m.prototype.render=function(){var e=this.props,t=e.shape,n=e.hasBorder,e=(0,r.default)(e,["shape","hasBorder"]);return"circle"===t?u.default.createElement(f.default,e):u.default.createElement(c.default,(0,a.default)({},e,{hasBorder:n}))},s=n=m,n.propTypes={prefix:d.default.string,shape:d.default.oneOf(["circle","line"]),size:d.default.oneOf(["small","medium","large"]),percent:d.default.number,state:d.default.oneOf(["normal","success","error"]),progressive:d.default.bool,hasBorder:d.default.bool,textRender:d.default.func,color:d.default.string,backgroundColor:d.default.string,rtl:d.default.bool},n.defaultProps={prefix:"next-",shape:"line",state:"normal",size:"medium",percent:0,progressive:!1,hasBorder:!1,textRender:function(e){return Math.floor(e)+"%"}},n.contextTypes={prefix:d.default.string};var h,l=s;function m(){return(0,o.default)(this,m),(0,i.default)(this,h.apply(this,arguments))}l.displayName="Progress",t.default=l,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var p=l(n(2)),h=l(n(12)),a=l(n(4)),r=l(n(6)),o=l(n(7)),m=l(n(0)),i=l(n(3)),g=l(n(13));function l(e){return e&&e.__esModule?e:{default:e}}s=m.default.PureComponent,(0,o.default)(u,s),u.prototype.render=function(){var e=this.props,t=e.prefix,n=e.size,a=e.state,r=e.color,o=e.percent,i=e.progressive,l=e.hasBorder,s=e.textRender,u=e.className,d=e.rtl,c=e.backgroundColor,e=(0,h.default)(e,["prefix","size","state","color","percent","progressive","hasBorder","textRender","className","rtl","backgroundColor"]),s=s(o,{rtl:d}),l=(0,g.default)(((f={})[t+"progress-line"]=!0,f[t+"progress-line-show-info"]=s,f[t+"progress-line-show-border"]=l,f[""+(t+n)]=n,f[u]=u,f)),u=(0,g.default)(((n={})[t+"progress-line-overlay"]=!0,n[t+"progress-line-overlay-"+a]=!r&&!i&&a,n[t+"progress-line-overlay-started"]=!r&&i&&o<=30,n[t+"progress-line-overlay-middle"]=!r&&i&&30<o&&o<80,n[t+"progress-line-overlay-finishing"]=!r&&i&&80<=o,n)),f={width:(100<o?100:o<0?0:o)+"%",backgroundColor:r},a={backgroundColor:c};return m.default.createElement("div",(0,p.default)({dir:d?"rtl":void 0,role:"progressbar","aria-valuenow":o,"aria-valuemin":"0","aria-valuemax":"100",className:l},e),m.default.createElement("div",{className:t+"progress-line-container"},m.default.createElement("div",{className:t+"progress-line-underlay",style:a},m.default.createElement("div",{className:u,style:f}))),s?m.default.createElement("div",{className:t+"progress-line-text"},s):null)},(n=u).propTypes={size:i.default.oneOf(["small","medium","large"]),percent:i.default.number,state:i.default.oneOf(["normal","success","error"]),progressive:i.default.bool,hasBorder:i.default.bool,textRender:i.default.func,color:i.default.string,backgroundColor:i.default.string,rtl:i.default.bool,prefix:i.default.string,className:i.default.oneOfType([i.default.string,i.default.object])};var s,o=n;function u(){return(0,a.default)(this,u),(0,r.default)(this,s.apply(this,arguments))}t.default=o,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var g=s(n(2)),y=s(n(12)),a=s(n(4)),r=s(n(6)),o=s(n(7)),i=n(0),v=s(i),l=s(n(3)),_=s(n(13));function s(e){return e&&e.__esModule?e:{default:e}}u=i.Component,(0,o.default)(d,u),d.prototype.componentDidMount=function(){this.underlay&&this.overlay&&this.setState({underlayStrokeWidth:this._getCssValue(this.underlay,"stroke-width")||8,overlayStrokeWidth:this._getCssValue(this.overlay,"stroke-width")||8})},d.prototype._getCssValue=function(e,t){e=window.getComputedStyle(e).getPropertyValue(t),t=/(\d*)px/g.exec(e);return Array.isArray(t)?Number(t[1]):0},d.prototype._computeOverlayStrokeDashOffset=function(){var e=this.state,t=e.underlayStrokeWidth,e=e.overlayStrokeWidth,t=2*Math.PI*(50-e/2-(t-e)/2);return(100-this.props.percent)/100*t},d.prototype._getPath=function(e){return"M 50,50 m 0,-"+e+" a "+e+","+e+" 0 1 1 0,"+2*e+" a "+e+","+e+" 0 1 1 0,-"+2*e},d.prototype.render=function(){var e=this.props,t=e.prefix,n=e.size,a=e.state,r=e.percent,o=e.className,i=e.textRender,l=e.progressive,s=e.color,u=e.backgroundColor,d=e.rtl,e=(0,y.default)(e,["prefix","size","state","percent","className","textRender","progressive","color","backgroundColor","rtl"]),c=this.state,f=c.underlayStrokeWidth,c=c.overlayStrokeWidth,p=this._getPath(50-f/2),f=50-c/2-(f-c)/2,c=this._getPath(f),f=2*Math.PI*f,f=f+"px "+f+"px",h=this._computeOverlayStrokeDashOffset()+"px",i=i(r,{rtl:d}),n=(0,_.default)(((m={})[t+"progress-circle"]=!0,m[t+"progress-circle-show-info"]=i,m[""+(t+n)]=n,m[o]=o,m)),m=(0,_.default)(((o={})[t+"progress-circle-overlay"]=!0,o[t+"progress-circle-overlay-"+a]=!s&&!l&&a,o[t+"progress-circle-overlay-started"]=!s&&l&&r<=30,o[t+"progress-circle-overlay-middle"]=!s&&l&&30<r&&r<80,o[t+"progress-circle-overlay-finishing"]=!s&&l&&80<=r,o)),a={stroke:u};return v.default.createElement("div",(0,g.default)({className:n,dir:d?"rtl":void 0,role:"progressbar","aria-valuenow":r,"aria-valuemin":"0","aria-valuemax":"100"},e),v.default.createElement("svg",{className:t+"progress-circle-container",viewBox:"0 0 100 100"},v.default.createElement("path",{className:t+"progress-circle-underlay",d:p,fillOpacity:"0",ref:this._underlayRefHandler,style:a}),v.default.createElement("path",{className:m,d:c,fillOpacity:"0",strokeDasharray:f,strokeDashoffset:h,ref:this._overlayRefHandler,stroke:s})),i?v.default.createElement("div",{className:t+"progress-circle-text"},i):null)},(n=d).propTypes={size:l.default.oneOf(["small","medium","large"]),percent:l.default.number,state:l.default.oneOf(["normal","success","error"]),progressive:l.default.bool,textRender:l.default.func,prefix:l.default.string,className:l.default.string,color:l.default.string,backgroundColor:l.default.string,rtl:l.default.bool};var u,i=n;function d(e){(0,a.default)(this,d);var t=(0,r.default)(this,u.call(this,e));return t._underlayRefHandler=function(e){t.underlay=e},t._overlayRefHandler=function(e){t.overlay=e},t.state={underlayStrokeWidth:8,overlayStrokeWidth:8},t}i.displayName="Circle",t.default=i,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var a,w=c(n(2)),r=c(n(4)),o=c(n(6)),i=c(n(7)),M=c(n(0)),l=c(n(3)),k=c(n(13)),s=n(30),u=c(n(44)),S=n(11),d=c(n(408)),E=c(n(182)),x=c(n(180));function c(e){return e&&e.__esModule?e:{default:e}}f=d.default,(0,i.default)(C,f),C.prototype.componentDidMount=function(){this.updateUploaderRef(this.uploaderRef)},C.prototype.componentDidUpdate=function(){!this.state.uploaderRef&&this.uploaderRef&&this.updateUploaderRef(this.uploaderRef)},C.getDerivedStateFromProps=function(e,t){var n=t.uploaderRef&&t.uploaderRef.isUploading();return"value"in e&&e.value!==t.value&&!n?{value:Array.isArray(e.value)?[].concat(e.value):[]}:null},C.prototype.isUploading=function(){return this.uploaderRef.isUploading()},C.prototype.saveRef=function(e){this.saveUploaderRef(e)},C.prototype.updateUploaderRef=function(e){this.setState({uploaderRef:e})},C.prototype.render=function(){var e,t=this,n=this.props,a=n.action,r=n.disabled,o=n.prefix,i=n.locale,l=n.className,s=n.style,u=n.limit,d=n.onPreview,c=n.onRemove,f=n.onCancel,p=n.timeout,h=n.isPreview,m=n.renderPreview,g=n.itemRender,y=n.reUpload,n=n.showDownload,u=this.state.value.length>=u,u=(0,k.default)(((v={})[o+"upload-list-item"]=!0,v[o+"hidden"]=u,v)),v=this.props.children||i.card.addPhoto,c=r?S.func.prevent:c,_=S.obj.pickOthers(C.propTypes,this.props),b=S.obj.pickOthers(E.default.propTypes,_);if(h&&"function"==typeof m)return e=(0,k.default)(((e={})[o+"form-preview"]=!0,e[l]=!!l,e)),M.default.createElement("div",{style:s,className:e},m(this.state.value,this.props));return M.default.createElement(E.default,(0,w.default)({className:l,style:s,listType:"card",closable:!0,locale:i,value:this.state.value,onRemove:c,onCancel:f,onPreview:d,itemRender:g,isPreview:h,uploader:this.uploaderRef,reUpload:y,showDownload:n},_),M.default.createElement(x.default,(0,w.default)({},b,{shape:"card",prefix:o,disabled:r,action:a,timeout:p,isPreview:h,value:this.state.value,onProgress:this.onProgress,onChange:this.onChange,ref:function(e){return t.saveRef(e)},className:u}),v))},d=n=C,n.displayName="Card",n.propTypes={prefix:l.default.string,locale:l.default.object,children:l.default.object,value:l.default.oneOfType([l.default.array,l.default.object]),defaultValue:l.default.oneOfType([l.default.array,l.default.object]),onPreview:l.default.func,onChange:l.default.func,onRemove:l.default.func,onCancel:l.default.func,itemRender:l.default.func,reUpload:l.default.bool,showDownload:l.default.bool,onProgress:l.default.func,isPreview:l.default.bool,renderPreview:l.default.func},n.defaultProps={prefix:"next-",locale:u.default.Upload,showDownload:!0,onChange:S.func.noop,onPreview:S.func.noop,onProgress:S.func.noop},a=function(){var n=this;this.onProgress=function(e,t){n.setState({value:e}),n.props.onProgress(e,t)},this.onChange=function(e,t){"value"in n.props||n.setState({value:e}),n.props.onChange(e,t)}};var f,i=d;function C(e){(0,r.default)(this,C);var t=(0,o.default)(this,f.call(this,e)),n=(a.call(t),void 0),n="value"in e?e.value:e.defaultValue;return t.state={value:Array.isArray(n)?n:[],uploaderRef:t.uploaderRef},t}t.default=(0,s.polyfill)(i),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var u=m(n(2)),d=m(n(12)),o=m(n(4)),i=m(n(6)),a=m(n(7)),c=m(n(0)),r=m(n(3)),f=m(n(13)),p=m(n(24)),l=n(11),s=m(n(44)),h=m(n(180));function m(e){return e&&e.__esModule?e:{default:e}}g=c.default.Component,(0,a.default)(y,g),y.prototype.abort=function(e){this.uploaderRef.abort(e)},y.prototype.startUpload=function(){this.uploaderRef.startUpload()},y.prototype.render=function(){var e=this.props,t=e.className,n=e.style,a=e.shape,r=e.locale,o=e.prefix,i=e.listType,e=(0,d.default)(e,["className","style","shape","locale","prefix","listType"]),l=o+"upload-drag",t=(0,f.default)(((s={})[l]=!0,s[l+"-over"]=this.state.dragOver,s[t]=!!t,s)),s=this.props.children||c.default.createElement("div",{className:t},c.default.createElement("p",{className:l+"-icon"},c.default.createElement(p.default,{size:"large",className:l+"-upload-icon"})),c.default.createElement("p",{className:l+"-text"},r.drag.text),c.default.createElement("p",{className:l+"-hint"},r.drag.hint));return c.default.createElement(h.default,(0,u.default)({},e,{prefix:o,shape:a,listType:i,dragable:!0,style:n,onDragOver:this.onDragOver,onDragLeave:this.onDragLeave,onDrop:this.onDrop,ref:this.saveUploaderRef}),s)},a=n=y,n.propTypes={prefix:r.default.string,locale:r.default.object,shape:r.default.string,onDragOver:r.default.func,onDragLeave:r.default.func,onDrop:r.default.func,limit:r.default.number,className:r.default.string,style:r.default.object,defaultValue:r.default.array,children:r.default.node,listType:r.default.string,timeout:r.default.number},n.defaultProps={prefix:"next-",onDragOver:l.func.noop,onDragLeave:l.func.noop,onDrop:l.func.noop,locale:s.default.Upload};var g,r=a;function y(){var e,t;(0,o.default)(this,y);for(var n=arguments.length,a=Array(n),r=0;r<n;r++)a[r]=arguments[r];return(e=t=(0,i.default)(this,g.call.apply(g,[this].concat(a)))).state={dragOver:!1},t.onDragOver=function(e){t.state.dragOver||t.setState({dragOver:!0}),t.props.onDragOver(e)},t.onDragLeave=function(e){t.setState({dragOver:!1}),t.props.onDragLeave(e)},t.onDrop=function(e){t.setState({dragOver:!1}),t.props.onDrop(e)},t.saveUploaderRef=function(e){e&&"function"==typeof e.getInstance?t.uploaderRef=e.getInstance():t.uploaderRef=e},(0,i.default)(t,e)}r.displayName="Dragger",t.default=r,e.exports=t.default},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){}]);
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/resources/static/login.html b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/login.html
new file mode 100644
index 0000000..d5932c7
--- /dev/null
+++ b/ruoyi-visual/ruoyi-nacos/src/main/resources/static/login.html
@@ -0,0 +1,43 @@
+<!--
+  ~ Copyright 1999-2018 Alibaba Group Holding Ltd.
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title>鐧诲綍</title>
+</head>
+<body>
+<h3>鐧诲綍</h3>
+<form action="/nacos/login" method="post">
+    <table>
+        <tr>
+            <td>鐢ㄦ埛鍚�:</td>
+            <td><input type="text" name="username"></td>
+        </tr>
+        <tr>
+            <td>瀵嗙爜:</td>
+            <td><input type="password" name="password"></td>
+        </tr>
+        <tr>
+            <td colspan="2">
+                <button type="submit">鐧诲綍</button>
+            </td>
+        </tr>
+    </table>
+</form>
+</body>
+</html>
diff --git a/ruoyi-visual/ruoyi-powerjob-server/Dockerfile b/ruoyi-visual/ruoyi-powerjob-server/Dockerfile
new file mode 100644
index 0000000..729bb22
--- /dev/null
+++ b/ruoyi-visual/ruoyi-powerjob-server/Dockerfile
@@ -0,0 +1,17 @@
+#FROM findepi/graalvm:java17-native
+FROM openjdk:17.0.2-oraclelinux8
+
+MAINTAINER Lion Li
+
+RUN mkdir -p /ruoyi/powerjob/logs
+
+WORKDIR /ruoyi/powerjob
+
+ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="-Xms512m -Xmx1024m"
+
+EXPOSE 7700
+
+ADD ./target/ruoyi-powerjob-server.jar ./app.jar
+
+ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -jar app.jar \
+           -XX:+HeapDumpOnOutOfMemoryError -Xlog:gc*,:time,tags,level -XX:+UseZGC ${JAVA_OPTS}
diff --git a/ruoyi-visual/ruoyi-powerjob-server/pom.xml b/ruoyi-visual/ruoyi-powerjob-server/pom.xml
new file mode 100644
index 0000000..a097da9
--- /dev/null
+++ b/ruoyi-visual/ruoyi-powerjob-server/pom.xml
@@ -0,0 +1,89 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <parent>
+        <groupId>org.dromara</groupId>
+        <artifactId>ruoyi-visual</artifactId>
+        <version>${revision}</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <packaging>jar</packaging>
+    <artifactId>ruoyi-powerjob-server</artifactId>
+
+    <properties>
+        <spring-boot.version>2.7.18</spring-boot.version>
+        <spring-cloud.version>2021.0.7</spring-cloud.version>
+        <spring-cloud-alibaba.version>2021.0.4.0</spring-cloud-alibaba.version>
+    </properties>
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-dependencies</artifactId>
+                <version>${spring-cloud.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>com.alibaba.cloud</groupId>
+                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
+                <version>${spring-cloud-alibaba.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+
+        <!-- PowerJob server-->
+        <dependency>
+            <groupId>tech.powerjob</groupId>
+            <artifactId>powerjob-server-starter</artifactId>
+            <version>${powerjob.version}</version>
+        </dependency>
+
+        <!-- SpringCloud Alibaba Nacos -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+
+        <!-- SpringCloud Alibaba Nacos Config -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <finalName>${project.artifactId}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>${spring-boot.version}</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/ruoyi-visual/ruoyi-powerjob-server/src/main/java/org/dromara/powerjob/PowerJobServerApplication.java b/ruoyi-visual/ruoyi-powerjob-server/src/main/java/org/dromara/powerjob/PowerJobServerApplication.java
new file mode 100644
index 0000000..3898639
--- /dev/null
+++ b/ruoyi-visual/ruoyi-powerjob-server/src/main/java/org/dromara/powerjob/PowerJobServerApplication.java
@@ -0,0 +1,25 @@
+package org.dromara.powerjob;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import tech.powerjob.server.common.utils.PropertyUtils;
+
+/**
+ * powerjob 鍚姩绋嬪簭
+ *
+ * @author yhan219
+ */
+@Slf4j
+@EnableScheduling
+@SpringBootApplication(scanBasePackages = "tech.powerjob.server")
+public class PowerJobServerApplication {
+
+    public static void main(String[] args) {
+        PropertyUtils.init();
+        SpringApplication.run(tech.powerjob.server.PowerJobServerApplication.class, args);
+        log.info("鏂囨。鍦板潃: https://www.yuque.com/powerjob/guidence/problem");
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-powerjob-server/src/main/resources/application.properties b/ruoyi-visual/ruoyi-powerjob-server/src/main/resources/application.properties
new file mode 100644
index 0000000..8f09cfc
--- /dev/null
+++ b/ruoyi-visual/ruoyi-powerjob-server/src/main/resources/application.properties
@@ -0,0 +1,41 @@
+# Http server port
+server.port=7700
+
+spring.profiles.active=@profiles.active@
+spring.main.banner-mode=log
+spring.jpa.open-in-view=false
+spring.data.mongodb.repositories.type=none
+logging.level.org.mongodb=warn
+logging.level.tech.powerjob.server=warn
+logging.level.MONITOR_LOGGER_DB_OPERATION=warn
+logging.level.MONITOR_LOGGER_WORKER_HEART_BEAT=warn
+logging.config=classpath:logback-plus.xml
+
+# Configuration for uploading files.
+spring.servlet.multipart.enabled=true
+spring.servlet.multipart.file-size-threshold=0
+spring.servlet.multipart.max-file-size=209715200
+spring.servlet.multipart.max-request-size=209715200
+
+###### PowerJob transporter configuration  ######
+oms.transporter.active.protocols=AKKA,HTTP
+oms.transporter.main.protocol=HTTP
+oms.akka.port=10086
+oms.http.port=10010
+# Prefix for all tables. Default empty string. Config if you have needs, i.e. pj_
+oms.table-prefix=pj_
+
+spring.application.name=ruoyi-powerjob-server
+management.endpoints.web.exposure.include=*
+management.endpoint.health.show-details=ALWAYS
+management.endpoint.logfile.external-file=./logs/ruoyi-powerjob-server.log
+management.health.mongo.enabled=${oms.mongodb.enable}
+
+# nacos 閰嶇疆
+spring.cloud.nacos.server-addr=@nacos.server@
+spring.cloud.nacos.discovery.group=@nacos.discovery.group@
+spring.cloud.nacos.discovery.namespace=${spring.profiles.active}
+spring.cloud.nacos.config.group=@nacos.config.group@
+spring.cloud.nacos.config.namespace=${spring.profiles.active}
+spring.config.import[0]=optional:nacos:datasource.yml
+spring.config.import[1]=optional:nacos:${spring.application.name}.properties
diff --git a/ruoyi-visual/ruoyi-powerjob-server/src/main/resources/banner.txt b/ruoyi-visual/ruoyi-powerjob-server/src/main/resources/banner.txt
new file mode 100644
index 0000000..c0fac79
--- /dev/null
+++ b/ruoyi-visual/ruoyi-powerjob-server/src/main/resources/banner.txt
@@ -0,0 +1,11 @@
+Application Version: ${revision}
+Spring Boot Version: ${spring-boot.version}
+                              _       _
+                             (_)     | |
+ _ __   _____      _____ _ __ _  ___ | |__ ______ ___  ___ _ ____   _____ _ __
+| '_ \ / _ \ \ /\ / / _ \ '__| |/ _ \| '_ \______/ __|/ _ \ '__\ \ / / _ \ '__|
+| |_) | (_) \ V  V /  __/ |  | | (_) | |_) |     \__ \  __/ |   \ V /  __/ |
+| .__/ \___/ \_/\_/ \___|_|  | |\___/|_.__/      |___/\___|_|    \_/ \___|_|
+| |                         _/ |
+|_|                        |__/
+
diff --git a/ruoyi-visual/ruoyi-powerjob-server/src/main/resources/logback-common.xml b/ruoyi-visual/ruoyi-powerjob-server/src/main/resources/logback-common.xml
new file mode 100644
index 0000000..89eaa97
--- /dev/null
+++ b/ruoyi-visual/ruoyi-powerjob-server/src/main/resources/logback-common.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<included>
+
+    <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"/>
+
+    <!-- 鎺у埗鍙拌緭鍑� -->
+    <appender name="file_console" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/console.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 鏃ュ織鏂囦欢鍚嶆牸寮� -->
+            <fileNamePattern>${log.path}/console.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 鏃ュ織鏈�澶� 1澶� -->
+            <maxHistory>1</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <!-- 杩囨护鐨勭骇鍒� -->
+            <level>INFO</level>
+        </filter>
+    </appender>
+
+    <!-- 绯荤粺鏃ュ織杈撳嚭 -->
+    <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/info.log</file>
+        <!-- 寰幆鏀跨瓥锛氬熀浜庢椂闂村垱寤烘棩蹇楁枃浠� -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 鏃ュ織鏂囦欢鍚嶆牸寮� -->
+            <fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 鏃ュ織鏈�澶х殑鍘嗗彶 60澶� -->
+            <maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 杩囨护鐨勭骇鍒� -->
+            <level>INFO</level>
+            <!-- 鍖归厤鏃剁殑鎿嶄綔锛氭帴鏀讹紙璁板綍锛� -->
+            <onMatch>ACCEPT</onMatch>
+            <!-- 涓嶅尮閰嶆椂鐨勬搷浣滐細鎷掔粷锛堜笉璁板綍锛� -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/error.log</file>
+        <!-- 寰幆鏀跨瓥锛氬熀浜庢椂闂村垱寤烘棩蹇楁枃浠� -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 鏃ュ織鏂囦欢鍚嶆牸寮� -->
+            <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 鏃ュ織鏈�澶х殑鍘嗗彶 60澶� -->
+            <maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 杩囨护鐨勭骇鍒� -->
+            <level>ERROR</level>
+            <!-- 鍖归厤鏃剁殑鎿嶄綔锛氭帴鏀讹紙璁板綍锛� -->
+            <onMatch>ACCEPT</onMatch>
+            <!-- 涓嶅尮閰嶆椂鐨勬搷浣滐細鎷掔粷锛堜笉璁板綍锛� -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- info寮傛杈撳嚭 -->
+    <appender name="async_info" class="ch.qos.logback.classic.AsyncAppender">
+        <!-- 涓嶄涪澶辨棩蹇�.榛樿鐨�,濡傛灉闃熷垪鐨�80%宸叉弧,鍒欎細涓㈠純TRACT銆丏EBUG銆両NFO绾у埆鐨勬棩蹇� -->
+        <discardingThreshold>0</discardingThreshold>
+        <!-- 鏇存敼榛樿鐨勯槦鍒楃殑娣卞害,璇ュ�间細褰卞搷鎬ц兘.榛樿鍊间负256 -->
+        <queueSize>512</queueSize>
+        <!-- 娣诲姞闄勫姞鐨刟ppender,鏈�澶氬彧鑳芥坊鍔犱竴涓� -->
+        <appender-ref ref="file_info"/>
+    </appender>
+
+    <!-- error寮傛杈撳嚭 -->
+    <appender name="async_error" class="ch.qos.logback.classic.AsyncAppender">
+        <!-- 涓嶄涪澶辨棩蹇�.榛樿鐨�,濡傛灉闃熷垪鐨�80%宸叉弧,鍒欎細涓㈠純TRACT銆丏EBUG銆両NFO绾у埆鐨勬棩蹇� -->
+        <discardingThreshold>0</discardingThreshold>
+        <!-- 鏇存敼榛樿鐨勯槦鍒楃殑娣卞害,璇ュ�间細褰卞搷鎬ц兘.榛樿鍊间负256 -->
+        <queueSize>512</queueSize>
+        <!-- 娣诲姞闄勫姞鐨刟ppender,鏈�澶氬彧鑳芥坊鍔犱竴涓� -->
+        <appender-ref ref="file_error"/>
+    </appender>
+
+    <!--绯荤粺鎿嶄綔鏃ュ織-->
+    <root level="info">
+        <appender-ref ref="async_info"/>
+        <appender-ref ref="async_error"/>
+        <appender-ref ref="file_console"/>
+    </root>
+</included>
diff --git a/ruoyi-visual/ruoyi-powerjob-server/src/main/resources/logback-plus.xml b/ruoyi-visual/ruoyi-powerjob-server/src/main/resources/logback-plus.xml
new file mode 100644
index 0000000..51ef03e
--- /dev/null
+++ b/ruoyi-visual/ruoyi-powerjob-server/src/main/resources/logback-plus.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+
+    <!-- 鏃ュ織瀛樻斁璺緞 -->
+    <property name="log.path" value="logs/${project.artifactId}"/>
+    <!-- 鏃ュ織杈撳嚭鏍煎紡 -->
+    <property name="console.log.pattern"
+              value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/>
+
+    <!-- 鎺у埗鍙拌緭鍑� -->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>${console.log.pattern}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+    </appender>
+
+    <include resource="logback-common.xml" />
+
+    <include resource="logback-logstash.xml" />
+
+    <!-- 寮�鍚� skywalking 鏃ュ織鏀堕泦 -->
+    <include resource="logback-skylog.xml" />
+
+    <!--绯荤粺鎿嶄綔鏃ュ織-->
+    <root level="info">
+        <appender-ref ref="console"/>
+    </root>
+
+</configuration>
diff --git a/ruoyi-visual/ruoyi-seata-server/Dockerfile b/ruoyi-visual/ruoyi-seata-server/Dockerfile
new file mode 100644
index 0000000..0aea120
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/Dockerfile
@@ -0,0 +1,23 @@
+#FROM findepi/graalvm:java17-native
+FROM openjdk:17.0.2-oraclelinux8
+
+MAINTAINER Lion Li
+
+RUN mkdir -p /ruoyi/seata-server/logs \
+    /ruoyi/skywalking/agent
+
+WORKDIR /ruoyi/seata-server
+
+ENV TZ=PRC LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS=""
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+
+EXPOSE 7091
+EXPOSE 8091
+
+ADD ./target/ruoyi-seata-server.jar ./app.jar
+
+ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom \
+           #-Dskywalking.agent.service_name=ruoyi-seata-server", \
+           #-Dskywalking.plugin.seata.server=true", \
+           #-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar", \
+           -jar app.jar ${JAVA_OPTS}
diff --git a/ruoyi-visual/ruoyi-seata-server/pom.xml b/ruoyi-visual/ruoyi-seata-server/pom.xml
new file mode 100644
index 0000000..8ad5181
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/pom.xml
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~  Copyright 1999-2019 Seata.io Group.
+  ~
+  ~  Licensed under the Apache License, Version 2.0 (the "License");
+  ~  you may not use this file except in compliance with the License.
+  ~  You may obtain a copy of the License at
+  ~
+  ~       http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~  Unless required by applicable law or agreed to in writing, software
+  ~  distributed under the License is distributed on an "AS IS" BASIS,
+  ~  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~  See the License for the specific language governing permissions and
+  ~  limitations under the License.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.dromara</groupId>
+        <artifactId>ruoyi-visual</artifactId>
+        <version>${revision}</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>ruoyi-seata-server</artifactId>
+    <packaging>jar</packaging>
+
+    <properties>
+        <seata.version>1.7.1</seata.version>
+        <jcommander.version>1.82</jcommander.version>
+        <druid.version>1.2.12</druid.version>
+        <spring-boot.version>2.7.18</spring-boot.version>
+        <native-build-tools-plugin.version>0.9.20</native-build-tools-plugin.version>
+        <logstash-logback-encoder.version>7.2</logstash-logback-encoder.version>
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <!-- SpringBoot 渚濊禆閰嶇疆 -->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-bom</artifactId>
+                <version>${seata.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-dependencies</artifactId>
+                <version>${seata.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <!-- SpringBoot Web瀹瑰櫒 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>spring-boot-starter-tomcat</artifactId>
+                    <groupId>org.springframework.boot</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>*</artifactId>
+                    <groupId>org.apache.logging.log4j</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!-- web 瀹瑰櫒浣跨敤 undertow 鎬ц兘鏇村己 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-undertow</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-spring-autoconfigure-server</artifactId>
+            <version>${seata.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-config-all</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>log4j</artifactId>
+                    <groupId>log4j</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-discovery-all</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-serializer-all</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-compressor-all</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-metrics-all</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-console</artifactId>
+            <version>${seata.version}</version>
+        </dependency>
+
+        <!-- for database -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid</artifactId>
+            <version>${druid.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-dbcp2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.zaxxer</groupId>
+            <artifactId>HikariCP</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.h2database</groupId>
+            <artifactId>h2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.mysql</groupId>
+            <artifactId>mysql-connector-j</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+        </dependency>
+        <!-- Copyright restrictions, do not reference this dependency.
+             You can add this dependency to the '/seata/lib' directory of the seata-server when necessary.
+        <dependency>
+            <groupId>com.oracle.ojdbc</groupId>
+            <artifactId>ojdbc8</artifactId>
+            <version>${ojdbc.version}</version>
+        </dependency>-->
+
+        <dependency>
+            <groupId>com.beust</groupId>
+            <artifactId>jcommander</artifactId>
+            <version>${jcommander.version}</version>
+        </dependency>
+
+        <!-- only for event bus -->
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+        </dependency>
+
+        <!-- jedis -->
+        <dependency>
+            <groupId>redis.clients</groupId>
+            <artifactId>jedis</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
+
+        <!-- logback -->
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-core</artifactId>
+        </dependency>
+        <!-- logback appenders -->
+        <dependency>
+            <groupId>net.logstash.logback</groupId>
+            <artifactId>logstash-logback-encoder</artifactId>
+            <version>${logstash-logback-encoder.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.codehaus.janino</groupId>
+            <artifactId>janino</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>${project.artifactId}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>${spring-boot.version}</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/AbstractTCInboundHandler.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/AbstractTCInboundHandler.java
new file mode 100644
index 0000000..fdf0d28
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/AbstractTCInboundHandler.java
@@ -0,0 +1,327 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server;
+
+import io.seata.common.exception.StoreException;
+import io.seata.core.exception.AbstractExceptionHandler;
+import io.seata.core.exception.TransactionException;
+import io.seata.core.exception.TransactionExceptionCode;
+import io.seata.core.model.GlobalStatus;
+import io.seata.core.protocol.transaction.*;
+import io.seata.core.rpc.RpcContext;
+import io.seata.server.session.GlobalSession;
+import io.seata.server.session.SessionHolder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * The type Abstract tc inbound handler.
+ *
+ * @author sharajava
+ */
+public abstract class AbstractTCInboundHandler extends AbstractExceptionHandler implements TCInboundHandler {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(AbstractTCInboundHandler.class);
+
+    @Override
+    public GlobalBeginResponse handle(GlobalBeginRequest request, final RpcContext rpcContext) {
+        GlobalBeginResponse response = new GlobalBeginResponse();
+        exceptionHandleTemplate(new AbstractCallback<GlobalBeginRequest, GlobalBeginResponse>() {
+            @Override
+            public void execute(GlobalBeginRequest request, GlobalBeginResponse response) throws TransactionException {
+                try {
+                    doGlobalBegin(request, response, rpcContext);
+                } catch (StoreException e) {
+                    throw new TransactionException(TransactionExceptionCode.FailedStore,
+                        String.format("begin global request failed. xid=%s, msg=%s", response.getXid(), e.getMessage()),
+                        e);
+                }
+            }
+        }, request, response);
+        return response;
+    }
+
+    /**
+     * Do global begin.
+     *
+     * @param request    the request
+     * @param response   the response
+     * @param rpcContext the rpc context
+     * @throws TransactionException the transaction exception
+     */
+    protected abstract void doGlobalBegin(GlobalBeginRequest request, GlobalBeginResponse response,
+                                          RpcContext rpcContext) throws TransactionException;
+
+    @Override
+    public GlobalCommitResponse handle(GlobalCommitRequest request, final RpcContext rpcContext) {
+        GlobalCommitResponse response = new GlobalCommitResponse();
+        response.setGlobalStatus(GlobalStatus.Committing);
+        exceptionHandleTemplate(new AbstractCallback<GlobalCommitRequest, GlobalCommitResponse>() {
+            @Override
+            public void execute(GlobalCommitRequest request, GlobalCommitResponse response)
+                throws TransactionException {
+                try {
+                    doGlobalCommit(request, response, rpcContext);
+                } catch (StoreException e) {
+                    throw new TransactionException(TransactionExceptionCode.FailedStore,
+                        String.format("global commit request failed. xid=%s, msg=%s", request.getXid(), e.getMessage()),
+                        e);
+                }
+            }
+            @Override
+            public void onTransactionException(GlobalCommitRequest request, GlobalCommitResponse response,
+                                               TransactionException tex) {
+                super.onTransactionException(request, response, tex);
+                checkTransactionStatus(request, response);
+            }
+
+            @Override
+            public void onException(GlobalCommitRequest request, GlobalCommitResponse response, Exception rex) {
+                super.onException(request, response, rex);
+                checkTransactionStatus(request, response);
+            }
+
+
+        }, request, response);
+        return response;
+    }
+
+    /**
+     * Do global commit.
+     *
+     * @param request    the request
+     * @param response   the response
+     * @param rpcContext the rpc context
+     * @throws TransactionException the transaction exception
+     */
+    protected abstract void doGlobalCommit(GlobalCommitRequest request, GlobalCommitResponse response,
+                                           RpcContext rpcContext) throws TransactionException;
+
+    @Override
+    public GlobalRollbackResponse handle(GlobalRollbackRequest request, final RpcContext rpcContext) {
+        GlobalRollbackResponse response = new GlobalRollbackResponse();
+        response.setGlobalStatus(GlobalStatus.Rollbacking);
+        exceptionHandleTemplate(new AbstractCallback<GlobalRollbackRequest, GlobalRollbackResponse>() {
+            @Override
+            public void execute(GlobalRollbackRequest request, GlobalRollbackResponse response)
+                throws TransactionException {
+                try {
+                    doGlobalRollback(request, response, rpcContext);
+                } catch (StoreException e) {
+                    throw new TransactionException(TransactionExceptionCode.FailedStore, String
+                        .format("global rollback request failed. xid=%s, msg=%s", request.getXid(), e.getMessage()), e);
+                }
+            }
+
+            @Override
+            public void onTransactionException(GlobalRollbackRequest request, GlobalRollbackResponse response,
+                                               TransactionException tex) {
+                super.onTransactionException(request, response, tex);
+                // may be appears StoreException outer layer method catch
+                checkTransactionStatus(request, response);
+            }
+
+            @Override
+            public void onException(GlobalRollbackRequest request, GlobalRollbackResponse response, Exception rex) {
+                super.onException(request, response, rex);
+                // may be appears StoreException outer layer method catch
+                checkTransactionStatus(request, response);
+            }
+        }, request, response);
+        return response;
+    }
+
+    /**
+     * Do global rollback.
+     *
+     * @param request    the request
+     * @param response   the response
+     * @param rpcContext the rpc context
+     * @throws TransactionException the transaction exception
+     */
+    protected abstract void doGlobalRollback(GlobalRollbackRequest request, GlobalRollbackResponse response,
+                                             RpcContext rpcContext) throws TransactionException;
+
+    @Override
+    public BranchRegisterResponse handle(BranchRegisterRequest request, final RpcContext rpcContext) {
+        BranchRegisterResponse response = new BranchRegisterResponse();
+        exceptionHandleTemplate(new AbstractCallback<BranchRegisterRequest, BranchRegisterResponse>() {
+            @Override
+            public void execute(BranchRegisterRequest request, BranchRegisterResponse response)
+                throws TransactionException {
+                try {
+                    doBranchRegister(request, response, rpcContext);
+                } catch (StoreException e) {
+                    throw new TransactionException(TransactionExceptionCode.FailedStore, String
+                        .format("branch register request failed. xid=%s, msg=%s", request.getXid(), e.getMessage()), e);
+                }
+            }
+        }, request, response);
+        return response;
+    }
+
+    /**
+     * Do branch register.
+     *
+     * @param request    the request
+     * @param response   the response
+     * @param rpcContext the rpc context
+     * @throws TransactionException the transaction exception
+     */
+    protected abstract void doBranchRegister(BranchRegisterRequest request, BranchRegisterResponse response,
+                                             RpcContext rpcContext) throws TransactionException;
+
+    @Override
+    public BranchReportResponse handle(BranchReportRequest request, final RpcContext rpcContext) {
+        BranchReportResponse response = new BranchReportResponse();
+        exceptionHandleTemplate(new AbstractCallback<BranchReportRequest, BranchReportResponse>() {
+            @Override
+            public void execute(BranchReportRequest request, BranchReportResponse response)
+                throws TransactionException {
+                try {
+                    doBranchReport(request, response, rpcContext);
+                } catch (StoreException e) {
+                    throw new TransactionException(TransactionExceptionCode.FailedStore, String
+                        .format("branch report request failed. xid=%s, branchId=%s, msg=%s", request.getXid(),
+                            request.getBranchId(), e.getMessage()), e);
+                }
+            }
+        }, request, response);
+        return response;
+    }
+
+    /**
+     * Do branch report.
+     *
+     * @param request    the request
+     * @param rpcContext the rpc context
+     * @throws TransactionException the transaction exception
+     */
+    protected abstract void doBranchReport(BranchReportRequest request, BranchReportResponse response,
+                                           RpcContext rpcContext) throws TransactionException;
+
+    @Override
+    public GlobalLockQueryResponse handle(GlobalLockQueryRequest request, final RpcContext rpcContext) {
+        GlobalLockQueryResponse response = new GlobalLockQueryResponse();
+        exceptionHandleTemplate(new AbstractCallback<GlobalLockQueryRequest, GlobalLockQueryResponse>() {
+            @Override
+            public void execute(GlobalLockQueryRequest request, GlobalLockQueryResponse response)
+                throws TransactionException {
+                try {
+                    doLockCheck(request, response, rpcContext);
+                } catch (StoreException e) {
+                    throw new TransactionException(TransactionExceptionCode.FailedStore, String
+                        .format("global lock query request failed. xid=%s, msg=%s", request.getXid(), e.getMessage()),
+                        e);
+                }
+            }
+        }, request, response);
+        return response;
+    }
+
+    /**
+     * Do lock check.
+     *
+     * @param request    the request
+     * @param response   the response
+     * @param rpcContext the rpc context
+     * @throws TransactionException the transaction exception
+     */
+    protected abstract void doLockCheck(GlobalLockQueryRequest request, GlobalLockQueryResponse response,
+                                        RpcContext rpcContext) throws TransactionException;
+
+    @Override
+    public GlobalStatusResponse handle(GlobalStatusRequest request, final RpcContext rpcContext) {
+        GlobalStatusResponse response = new GlobalStatusResponse();
+        response.setGlobalStatus(GlobalStatus.UnKnown);
+        exceptionHandleTemplate(new AbstractCallback<GlobalStatusRequest, GlobalStatusResponse>() {
+            @Override
+            public void execute(GlobalStatusRequest request, GlobalStatusResponse response)
+                throws TransactionException {
+                try {
+                    doGlobalStatus(request, response, rpcContext);
+                } catch (StoreException e) {
+                    throw new TransactionException(TransactionExceptionCode.FailedStore,
+                        String.format("global status request failed. xid=%s, msg=%s", request.getXid(), e.getMessage()),
+                        e);
+                }
+            }
+
+            @Override
+            public void onTransactionException(GlobalStatusRequest request, GlobalStatusResponse response,
+                                               TransactionException tex) {
+                super.onTransactionException(request, response, tex);
+                checkTransactionStatus(request, response);
+            }
+
+            @Override
+            public void onException(GlobalStatusRequest request, GlobalStatusResponse response, Exception rex) {
+                super.onException(request, response, rex);
+                checkTransactionStatus(request, response);
+            }
+        }, request, response);
+        return response;
+    }
+
+    /**
+     * Do global status.
+     *
+     * @param request    the request
+     * @param response   the response
+     * @param rpcContext the rpc context
+     * @throws TransactionException the transaction exception
+     */
+    protected abstract void doGlobalStatus(GlobalStatusRequest request, GlobalStatusResponse response,
+                                           RpcContext rpcContext) throws TransactionException;
+
+    @Override
+    public GlobalReportResponse handle(GlobalReportRequest request, final RpcContext rpcContext) {
+        GlobalReportResponse response = new GlobalReportResponse();
+        response.setGlobalStatus(request.getGlobalStatus());
+        exceptionHandleTemplate(new AbstractCallback<GlobalReportRequest, GlobalReportResponse>() {
+            @Override
+            public void execute(GlobalReportRequest request, GlobalReportResponse response)
+                throws TransactionException {
+                doGlobalReport(request, response, rpcContext);
+            }
+        }, request, response);
+        return response;
+    }
+
+    /**
+     * Do global report.
+     *
+     * @param request    the request
+     * @param response   the response
+     * @param rpcContext the rpc context
+     * @throws TransactionException the transaction exception
+     */
+    protected abstract void doGlobalReport(GlobalReportRequest request, GlobalReportResponse response,
+                                           RpcContext rpcContext) throws TransactionException;
+
+    private void checkTransactionStatus(AbstractGlobalEndRequest request, AbstractGlobalEndResponse response) {
+        try {
+            GlobalSession globalSession = SessionHolder.findGlobalSession(request.getXid(), false);
+            if (globalSession != null) {
+                response.setGlobalStatus(globalSession.getStatus());
+            } else {
+                response.setGlobalStatus(GlobalStatus.Finished);
+            }
+        } catch (Exception exx) {
+            LOGGER.error("check transaction status error,{}]", exx.getMessage());
+        }
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/ParameterParser.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/ParameterParser.java
new file mode 100644
index 0000000..55690fc
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/ParameterParser.java
@@ -0,0 +1,200 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.ParameterException;
+import io.seata.common.util.StringUtils;
+import io.seata.config.Configuration;
+import io.seata.config.ConfigurationFactory;
+import io.seata.server.env.ContainerHelper;
+import io.seata.server.store.StoreConfig;
+
+import static io.seata.config.ConfigurationFactory.ENV_PROPERTY_KEY;
+
+/**
+ * The type Parameter parser.
+ *
+ * @author xingfudeshi @gmail.com
+ */
+public class ParameterParser {
+
+    private static final String PROGRAM_NAME
+        = "sh seata-server.sh(for linux and mac) or cmd seata-server.bat(for windows)";
+
+    private static final Configuration CONFIG = ConfigurationFactory.getInstance();
+
+    @Parameter(names = "--help", help = true)
+    private boolean help;
+    @Parameter(names = {"--host", "-h"}, description = "The ip to register to registry center.", order = 1)
+    private String host;
+    @Parameter(names = {"--port", "-p"}, description = "The port to listen.", order = 2)
+    private int port;
+    @Parameter(names = {"--storeMode", "-m"}, description = "log store mode : file, db, redis", order = 3)
+    private String storeMode;
+    @Parameter(names = {"--serverNode", "-n"}, description = "server node id, such as 1, 2, 3.it will be generated according to the snowflake by default", order = 4)
+    private Long serverNode;
+    @Parameter(names = {"--seataEnv", "-e"}, description = "The name used for multi-configuration isolation.",
+        order = 5)
+    private String seataEnv;
+    @Parameter(names = {"--sessionStoreMode", "-ssm"}, description = "session log store mode : file, db, redis",
+        order = 6)
+    private String sessionStoreMode;
+    @Parameter(names = {"--lockStoreMode", "-lsm"}, description = "lock log store mode : file, db, redis", order = 7)
+    private String lockStoreMode;
+
+    /**
+     * Instantiates a new Parameter parser.
+     *
+     * @param args the args
+     */
+    public ParameterParser(String... args) {
+        this.init(args);
+    }
+
+    /**
+     * startup args > docker env
+     * @param args
+     */
+    private void init(String[] args) {
+        try {
+            getCommandParameters(args);
+            getEnvParameters();
+            if (StringUtils.isNotBlank(seataEnv)) {
+                System.setProperty(ENV_PROPERTY_KEY, seataEnv);
+            }
+            StoreConfig.setStartupParameter(storeMode, sessionStoreMode, lockStoreMode);
+        } catch (ParameterException e) {
+            printError(e);
+        }
+
+    }
+
+    private void getCommandParameters(String[] args) {
+        JCommander jCommander = JCommander.newBuilder().addObject(this).build();
+        jCommander.parse(args);
+        if (help) {
+            jCommander.setProgramName(PROGRAM_NAME);
+            jCommander.usage();
+            System.exit(0);
+        }
+    }
+
+    private void getEnvParameters() {
+        if (StringUtils.isBlank(seataEnv)) {
+            seataEnv = ContainerHelper.getEnv();
+        }
+        if (StringUtils.isBlank(host)) {
+            host = ContainerHelper.getHost();
+        }
+        if (port == 0) {
+            port = ContainerHelper.getPort();
+        }
+        if (serverNode == null) {
+            serverNode = ContainerHelper.getServerNode();
+        }
+    }
+
+    private void printError(ParameterException e) {
+        System.err.println("Option error " + e.getMessage());
+        e.getJCommander().setProgramName(PROGRAM_NAME);
+        e.usage();
+        System.exit(0);
+    }
+
+    /**
+     * Gets host.
+     *
+     * @return the host
+     */
+    public String getHost() {
+        return host;
+    }
+
+    /**
+     * Gets port.
+     *
+     * @return the port
+     */
+    public int getPort() {
+        return port;
+    }
+
+    /**
+     * Gets store mode.
+     *
+     * @return the store mode
+     */
+    public String getStoreMode() {
+        return storeMode;
+    }
+
+    /**
+     * Gets lock store mode.
+     *
+     * @return the store mode
+     */
+    public String getLockStoreMode() {
+        return lockStoreMode;
+    }
+
+    /**
+     * Gets session store mode.
+     *
+     * @return the store mode
+     */
+    public String getSessionStoreMode() {
+        return sessionStoreMode;
+    }
+
+    /**
+     * Is help boolean.
+     *
+     * @return the boolean
+     */
+    public boolean isHelp() {
+        return help;
+    }
+
+    /**
+     * Gets server node.
+     *
+     * @return the server node
+     */
+    public Long getServerNode() {
+        return serverNode;
+    }
+
+    /**
+     * Gets seata env
+     *
+     * @return the name used for multi-configuration isolation.
+     */
+    public String getSeataEnv() {
+        return seataEnv;
+    }
+
+    /**
+     * Clean up.
+     */
+    public void cleanUp() {
+        if (null != System.getProperty(ENV_PROPERTY_KEY)) {
+            System.clearProperty(ENV_PROPERTY_KEY);
+        }
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/SeataServerApplication.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/SeataServerApplication.java
new file mode 100644
index 0000000..729e32e
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/SeataServerApplication.java
@@ -0,0 +1,49 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server;
+
+import io.seata.common.aot.NativeUtils;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * @author spilledyear@outlook.com
+ */
+@SpringBootApplication(scanBasePackages = {"io.seata"})
+public class SeataServerApplication {
+
+    public static void main(String[] args) throws Throwable {
+        try {
+            // run the spring-boot application
+            SpringApplication.run(SeataServerApplication.class, args);
+        } catch (Throwable t) {
+            // This exception is used to end `spring-boot-maven-plugin:process-aot`, so ignore it.
+            if ("org.springframework.boot.SpringApplication$AbandonedRunException".equals(t.getClass().getName())) {
+                throw t;
+            }
+
+            // In the `native-image`, if an exception occurs prematurely during the startup process, the exception log will not be recorded,
+            // so here we sleep for 20 seconds to observe the exception information.
+            if (NativeUtils.inNativeImage()) {
+                t.printStackTrace();
+                Thread.sleep(20000);
+            }
+
+            throw t;
+        }
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/Server.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/Server.java
new file mode 100644
index 0000000..81eb111
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/Server.java
@@ -0,0 +1,89 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server;
+
+import io.seata.common.XID;
+import io.seata.common.thread.NamedThreadFactory;
+import io.seata.common.util.NetUtil;
+import io.seata.common.util.StringUtils;
+import io.seata.config.ConfigurationFactory;
+import io.seata.core.rpc.netty.NettyRemotingServer;
+import io.seata.core.rpc.netty.NettyServerConfig;
+import io.seata.server.coordinator.DefaultCoordinator;
+import io.seata.server.lock.LockerManagerFactory;
+import io.seata.server.metrics.MetricsManager;
+import io.seata.server.session.SessionHolder;
+
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import static io.seata.spring.boot.autoconfigure.StarterConstants.REGEX_SPLIT_CHAR;
+import static io.seata.spring.boot.autoconfigure.StarterConstants.REGISTRY_PREFERED_NETWORKS;
+
+/**
+ * The type Server.
+ *
+ * @author slievrly
+ */
+public class Server {
+    /**
+     * The entry point of application.
+     *
+     * @param args the input arguments
+     */
+    public static void start(String[] args) {
+        //initialize the parameter parser
+        //Note that the parameter parser should always be the first line to execute.
+        //Because, here we need to parse the parameters needed for startup.
+        ParameterParser parameterParser = new ParameterParser(args);
+
+        //initialize the metrics
+        MetricsManager.get().init();
+
+        ThreadPoolExecutor workingThreads = new ThreadPoolExecutor(NettyServerConfig.getMinServerPoolSize(),
+                NettyServerConfig.getMaxServerPoolSize(), NettyServerConfig.getKeepAliveTime(), TimeUnit.SECONDS,
+                new LinkedBlockingQueue<>(NettyServerConfig.getMaxTaskQueueSize()),
+                new NamedThreadFactory("ServerHandlerThread", NettyServerConfig.getMaxServerPoolSize()), new ThreadPoolExecutor.CallerRunsPolicy());
+
+        //127.0.0.1 and 0.0.0.0 are not valid here.
+        if (NetUtil.isValidIp(parameterParser.getHost(), false)) {
+            XID.setIpAddress(parameterParser.getHost());
+        } else {
+            String preferredNetworks = ConfigurationFactory.getInstance().getConfig(REGISTRY_PREFERED_NETWORKS);
+            if (StringUtils.isNotBlank(preferredNetworks)) {
+                XID.setIpAddress(NetUtil.getLocalIp(preferredNetworks.split(REGEX_SPLIT_CHAR)));
+            } else {
+                XID.setIpAddress(NetUtil.getLocalIp());
+            }
+        }
+
+        NettyRemotingServer nettyRemotingServer = new NettyRemotingServer(workingThreads);
+        XID.setPort(nettyRemotingServer.getListenPort());
+        UUIDGenerator.init(parameterParser.getServerNode());
+        //log store mode : file, db, redis
+        SessionHolder.init();
+        LockerManagerFactory.init();
+        DefaultCoordinator coordinator = DefaultCoordinator.getInstance(nettyRemotingServer);
+        coordinator.init();
+        nettyRemotingServer.setHandler(coordinator);
+
+        // let ServerRunner do destroy instead ShutdownHook, see https://github.com/seata/seata/issues/4028
+        ServerRunner.addDisposable(coordinator);
+
+        nettyRemotingServer.init();
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/ServerRunner.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/ServerRunner.java
new file mode 100644
index 0000000..3034340
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/ServerRunner.java
@@ -0,0 +1,105 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server;
+
+import io.seata.core.rpc.Disposable;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.DisposableBean;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.web.context.WebServerInitializedEvent;
+import org.springframework.context.ApplicationEvent;
+import org.springframework.context.ApplicationListener;
+import org.springframework.core.Ordered;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+
+/**
+ * @author spilledyear@outlook.com
+ */
+@Component
+public class ServerRunner implements CommandLineRunner, DisposableBean,
+    ApplicationListener<ApplicationEvent>, Ordered {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ServerRunner.class);
+
+    private boolean started = Boolean.FALSE;
+
+    private int port;
+
+    @Value("${logging.file.path}")
+    private String logPath;
+
+    private static final List<Disposable> DISPOSABLE_LIST = new CopyOnWriteArrayList<>();
+
+    public static void addDisposable(Disposable disposable) {
+        DISPOSABLE_LIST.add(disposable);
+    }
+
+    @Override
+    public void run(String... args) {
+        try {
+            long start = System.currentTimeMillis();
+            Server.start(args);
+            started = true;
+
+            long cost = System.currentTimeMillis() - start;
+            LOGGER.info("\r\n you can visit seata console UI on http://127.0.0.1:{}. \r\n log path: {}.", this.port, this.logPath);
+            LOGGER.info("seata server started in {} millSeconds", cost);
+        } catch (Throwable e) {
+            started = Boolean.FALSE;
+            LOGGER.error("seata server start error: {} ", e.getMessage(), e);
+            System.exit(-1);
+        }
+    }
+
+
+    public boolean started() {
+        return started;
+    }
+
+    @Override
+    public void destroy() throws Exception {
+
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.debug("destoryAll starting");
+        }
+
+        for (Disposable disposable : DISPOSABLE_LIST) {
+            disposable.destroy();
+        }
+
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.debug("destoryAll finish");
+        }
+    }
+
+    @Override
+    public void onApplicationEvent(ApplicationEvent event) {
+        if (event instanceof WebServerInitializedEvent) {
+            this.port = ((WebServerInitializedEvent)event).getWebServer().getPort();
+        }
+    }
+
+    @Override
+    public int getOrder() {
+        return Ordered.LOWEST_PRECEDENCE;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/UUIDGenerator.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/UUIDGenerator.java
new file mode 100644
index 0000000..11aa492
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/UUIDGenerator.java
@@ -0,0 +1,51 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server;
+
+import io.seata.common.util.IdWorker;
+
+/**
+ * The type Uuid generator.
+ *
+ * @author sharajava
+ */
+public class UUIDGenerator {
+
+    private static volatile IdWorker idWorker;
+
+    /**
+     * generate UUID using snowflake algorithm
+     * @return UUID
+     */
+    public static long generateUUID() {
+        if (idWorker == null) {
+            synchronized (UUIDGenerator.class) {
+                if (idWorker == null) {
+                    init(null);
+                }
+            }
+        }
+        return idWorker.nextId();
+    }
+
+    /**
+     * init IdWorker
+     * @param serverNode the server node id, consider as machine id in snowflake
+     */
+    public static void init(Long serverNode) {
+        idWorker = new IdWorker(serverNode);
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/auth/AbstractCheckAuthHandler.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/auth/AbstractCheckAuthHandler.java
new file mode 100644
index 0000000..ecfbfc1
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/auth/AbstractCheckAuthHandler.java
@@ -0,0 +1,53 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.auth;
+
+import io.seata.config.ConfigurationFactory;
+import io.seata.core.constants.ConfigurationKeys;
+import io.seata.core.protocol.RegisterRMRequest;
+import io.seata.core.protocol.RegisterTMRequest;
+import io.seata.core.rpc.RegisterCheckAuthHandler;
+
+import static io.seata.common.DefaultValues.DEFAULT_SERVER_ENABLE_CHECK_AUTH;
+
+/**
+ * @author slievrly
+ */
+public abstract class AbstractCheckAuthHandler implements RegisterCheckAuthHandler {
+
+    private static final Boolean ENABLE_CHECK_AUTH = ConfigurationFactory.getInstance().getBoolean(
+        ConfigurationKeys.SERVER_ENABLE_CHECK_AUTH, DEFAULT_SERVER_ENABLE_CHECK_AUTH);
+
+    @Override
+    public boolean regTransactionManagerCheckAuth(RegisterTMRequest request) {
+        if (!ENABLE_CHECK_AUTH) {
+            return true;
+        }
+        return doRegTransactionManagerCheck(request);
+    }
+
+    public abstract boolean doRegTransactionManagerCheck(RegisterTMRequest request);
+
+    @Override
+    public boolean regResourceManagerCheckAuth(RegisterRMRequest request) {
+        if (!ENABLE_CHECK_AUTH) {
+            return true;
+        }
+        return doRegResourceManagerCheck(request);
+    }
+
+    public abstract boolean doRegResourceManagerCheck(RegisterRMRequest request);
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/auth/DefaultCheckAuthHandler.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/auth/DefaultCheckAuthHandler.java
new file mode 100644
index 0000000..ed3e934
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/auth/DefaultCheckAuthHandler.java
@@ -0,0 +1,37 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.auth;
+
+import io.seata.common.loader.LoadLevel;
+import io.seata.core.protocol.RegisterRMRequest;
+import io.seata.core.protocol.RegisterTMRequest;
+
+/**
+ * @author slievrly
+ */
+@LoadLevel(name = "defaultCheckAuthHandler", order = 100)
+public class DefaultCheckAuthHandler extends AbstractCheckAuthHandler {
+
+    @Override
+    public boolean doRegTransactionManagerCheck(RegisterTMRequest request) {
+        return true;
+    }
+
+    @Override
+    public boolean doRegResourceManagerCheck(RegisterRMRequest request) {
+        return true;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/controller/BranchSessionController.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/controller/BranchSessionController.java
new file mode 100644
index 0000000..f3ebf3f
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/controller/BranchSessionController.java
@@ -0,0 +1,36 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.console.controller;
+
+import io.seata.server.console.service.BranchSessionService;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * Branch Session Controller
+ *
+ * @author zhongxiang.wang
+ */
+@RestController
+@RequestMapping("console/branchSession")
+public class BranchSessionController {
+
+    @Resource(type = BranchSessionService.class)
+    private BranchSessionService branchSessionService;
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/controller/GlobalLockController.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/controller/GlobalLockController.java
new file mode 100644
index 0000000..e5fc3d0
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/controller/GlobalLockController.java
@@ -0,0 +1,52 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.console.controller;
+
+import io.seata.console.result.PageResult;
+import io.seata.server.console.param.GlobalLockParam;
+import io.seata.server.console.service.GlobalLockService;
+import io.seata.server.console.vo.GlobalLockVO;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * Global Lock Controller
+ *
+ * @author zhongxiang.wang
+ */
+@RestController
+@RequestMapping("/api/v1/console/globalLock")
+public class GlobalLockController {
+
+    @Resource(type = GlobalLockService.class)
+    private GlobalLockService globalLockService;
+
+    /**
+     * Query locks by param
+     *
+     * @param param the param
+     * @return the list of GlobalLockVO
+     */
+    @GetMapping("query")
+    public PageResult<GlobalLockVO> query(@ModelAttribute GlobalLockParam param) {
+        return globalLockService.query(param);
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/controller/GlobalSessionController.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/controller/GlobalSessionController.java
new file mode 100644
index 0000000..1433547
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/controller/GlobalSessionController.java
@@ -0,0 +1,52 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.console.controller;
+
+import io.seata.console.result.PageResult;
+import io.seata.server.console.param.GlobalSessionParam;
+import io.seata.server.console.service.GlobalSessionService;
+import io.seata.server.console.vo.GlobalSessionVO;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * Global Session Controller
+ *
+ * @author zhongxiang.wang
+ */
+@RestController
+@RequestMapping("/api/v1/console/globalSession")
+public class GlobalSessionController {
+
+    @Resource(type = GlobalSessionService.class)
+    private GlobalSessionService globalSessionService;
+
+    /**
+     * Query all globalSession
+     *
+     * @param param param for query globalSession
+     * @return the list of GlobalSessionVO
+     */
+    @GetMapping("query")
+    public PageResult<GlobalSessionVO> query(@ModelAttribute GlobalSessionParam param) {
+        return globalSessionService.query(param);
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/db/BranchSessionDBServiceImpl.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/db/BranchSessionDBServiceImpl.java
new file mode 100644
index 0000000..963b273
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/db/BranchSessionDBServiceImpl.java
@@ -0,0 +1,101 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.console.impl.db;
+
+import io.seata.common.ConfigurationKeys;
+import io.seata.common.exception.StoreException;
+import io.seata.common.loader.EnhancedServiceLoader;
+import io.seata.common.util.IOUtil;
+import io.seata.common.util.StringUtils;
+import io.seata.config.Configuration;
+import io.seata.config.ConfigurationFactory;
+import io.seata.console.result.PageResult;
+import io.seata.core.store.db.DataSourceProvider;
+import io.seata.core.store.db.sql.log.LogStoreSqlsFactory;
+import io.seata.server.console.service.BranchSessionService;
+import io.seata.server.console.vo.BranchSessionVO;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
+import org.springframework.stereotype.Component;
+
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import static io.seata.common.DefaultValues.DEFAULT_STORE_DB_BRANCH_TABLE;
+
+/**
+ * Branch Session DataBase ServiceImpl
+ *
+ * @author zhongxiang.wang
+ * @author lvekee 734843455@qq.com
+ */
+@Component
+@org.springframework.context.annotation.Configuration
+@ConditionalOnExpression("#{'db'.equals('${sessionMode}')}")
+public class BranchSessionDBServiceImpl implements BranchSessionService {
+
+    private String branchTable;
+
+    private String dbType;
+
+    private DataSource dataSource;
+
+    public BranchSessionDBServiceImpl() {
+        Configuration configuration = ConfigurationFactory.getInstance();
+        branchTable = configuration.getConfig(ConfigurationKeys.STORE_DB_BRANCH_TABLE, DEFAULT_STORE_DB_BRANCH_TABLE);
+        dbType = configuration.getConfig(ConfigurationKeys.STORE_DB_TYPE);
+        if (StringUtils.isBlank(dbType)) {
+            throw new IllegalArgumentException(ConfigurationKeys.STORE_DB_TYPE + " should not be blank");
+        }
+        String dbDataSource = configuration.getConfig(ConfigurationKeys.STORE_DB_DATASOURCE_TYPE);
+        if (StringUtils.isBlank(dbDataSource)) {
+            throw new IllegalArgumentException(ConfigurationKeys.STORE_DB_DATASOURCE_TYPE + " should not be blank");
+        }
+        dataSource = EnhancedServiceLoader.load(DataSourceProvider.class, dbDataSource).provide();
+    }
+
+    @Override
+    public PageResult<BranchSessionVO> queryByXid(String xid) {
+        if (StringUtils.isBlank(xid)) {
+            throw new IllegalArgumentException("xid should not be blank");
+        }
+
+        String whereCondition = " where xid = ? ";
+        String branchSessionSQL = LogStoreSqlsFactory.getLogStoreSqls(dbType).getAllBranchSessionSQL(branchTable, whereCondition);
+
+        List<BranchSessionVO> list = new ArrayList<>();
+        ResultSet rs = null;
+
+        try (Connection conn = dataSource.getConnection();
+             PreparedStatement ps = conn.prepareStatement(branchSessionSQL)) {
+            ps.setObject(1, xid);
+            rs = ps.executeQuery();
+            while (rs.next()) {
+                list.add(BranchSessionVO.convert(rs));
+            }
+        } catch (SQLException e) {
+            throw new StoreException(e);
+        } finally {
+            IOUtil.close(rs);
+        }
+        return PageResult.success(list, list.size(), 0, 0, 0);
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/db/GlobalLockDBServiceImpl.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/db/GlobalLockDBServiceImpl.java
new file mode 100644
index 0000000..41d61ef
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/db/GlobalLockDBServiceImpl.java
@@ -0,0 +1,145 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.console.impl.db;
+
+import io.seata.common.ConfigurationKeys;
+import io.seata.common.exception.StoreException;
+import io.seata.common.loader.EnhancedServiceLoader;
+import io.seata.common.util.IOUtil;
+import io.seata.common.util.PageUtil;
+import io.seata.common.util.StringUtils;
+import io.seata.config.Configuration;
+import io.seata.config.ConfigurationFactory;
+import io.seata.console.result.PageResult;
+import io.seata.core.store.db.DataSourceProvider;
+import io.seata.core.store.db.sql.lock.LockStoreSqlFactory;
+import io.seata.server.console.param.GlobalLockParam;
+import io.seata.server.console.service.GlobalLockService;
+import io.seata.server.console.vo.GlobalLockVO;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
+import org.springframework.stereotype.Component;
+
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import static io.seata.common.DefaultValues.DEFAULT_LOCK_DB_TABLE;
+
+
+/**
+ * Global Lock DB ServiceImpl
+ *
+ * @author zhongxiang.wang
+ * @author lvekee 734843455@qq.com
+ */
+@Component
+@org.springframework.context.annotation.Configuration
+@ConditionalOnExpression("#{'db'.equals('${lockMode}')}")
+public class GlobalLockDBServiceImpl implements GlobalLockService {
+
+    private String lockTable;
+
+    private String dbType;
+
+    private DataSource dataSource;
+
+    public GlobalLockDBServiceImpl() {
+        Configuration configuration = ConfigurationFactory.getInstance();
+        lockTable = configuration.getConfig(ConfigurationKeys.LOCK_DB_TABLE, DEFAULT_LOCK_DB_TABLE);
+        dbType = configuration.getConfig(ConfigurationKeys.STORE_DB_TYPE);
+        if (StringUtils.isBlank(dbType)) {
+            throw new IllegalArgumentException(ConfigurationKeys.STORE_DB_TYPE + " should not be blank");
+        }
+        String dbDataSource = configuration.getConfig(ConfigurationKeys.STORE_DB_DATASOURCE_TYPE);
+        if (StringUtils.isBlank(dbDataSource)) {
+            throw new IllegalArgumentException(ConfigurationKeys.STORE_DB_DATASOURCE_TYPE + " should not be blank");
+        }
+        dataSource = EnhancedServiceLoader.load(DataSourceProvider.class, dbDataSource).provide();
+    }
+
+    @Override
+    public PageResult<GlobalLockVO> query(GlobalLockParam param) {
+        PageUtil.checkParam(param.getPageNum(), param.getPageSize());
+
+        List<Object> sqlParamList = new ArrayList<>();
+        String whereCondition = this.getWhereConditionByParam(param, sqlParamList);
+
+        String sourceSql = LockStoreSqlFactory.getLogStoreSql(dbType).getAllLockSql(lockTable, whereCondition);
+        String queryLockSql = PageUtil.pageSql(sourceSql, dbType, param.getPageNum(), param.getPageSize());
+        String lockCountSql = PageUtil.countSql(sourceSql, dbType);
+
+        List<GlobalLockVO> list = new ArrayList<>();
+        int count = 0;
+
+        ResultSet rs = null;
+        ResultSet countRs = null;
+
+        try (Connection conn = dataSource.getConnection();
+             PreparedStatement ps = conn.prepareStatement(queryLockSql);
+             PreparedStatement countPs = conn.prepareStatement(lockCountSql)) {
+            PageUtil.setObject(ps, sqlParamList);
+            rs = ps.executeQuery();
+            while (rs.next()) {
+                list.add(GlobalLockVO.convert(rs));
+            }
+            PageUtil.setObject(countPs, sqlParamList);
+            countRs = countPs.executeQuery();
+            if (countRs.next()) {
+                count = countRs.getInt(1);
+            }
+        } catch (SQLException e) {
+            throw new StoreException(e);
+        } finally {
+            IOUtil.close(rs, countRs);
+        }
+        return PageResult.success(list, count, param.getPageNum(), param.getPageSize());
+    }
+
+    private String getWhereConditionByParam(GlobalLockParam param, List<Object> sqlParamList) {
+        StringBuilder whereConditionBuilder = new StringBuilder();
+        if (StringUtils.isNotBlank(param.getXid())) {
+            whereConditionBuilder.append(" and xid = ? ");
+            sqlParamList.add(param.getXid());
+        }
+        if (StringUtils.isNotBlank(param.getTableName())) {
+            whereConditionBuilder.append(" and table_name = ? ");
+            sqlParamList.add(param.getTableName());
+        }
+        if (StringUtils.isNotBlank(param.getTransactionId())) {
+            whereConditionBuilder.append(" and transaction_id = ? ");
+            sqlParamList.add(param.getTransactionId());
+        }
+        if (StringUtils.isNotBlank(param.getBranchId())) {
+            whereConditionBuilder.append(" and branch_id = ? ");
+            sqlParamList.add(param.getBranchId());
+        }
+        if (param.getTimeStart() != null) {
+            whereConditionBuilder.append(" and gmt_create >= ? ");
+            sqlParamList.add(param.getTimeStart());
+        }
+        if (param.getTimeEnd() != null) {
+            whereConditionBuilder.append(" and gmt_create <= ? ");
+            sqlParamList.add(param.getTimeEnd());
+        }
+        String whereCondition = whereConditionBuilder.toString();
+        return whereCondition.replaceFirst("and", "where");
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/db/GlobalSessionDBServiceImpl.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/db/GlobalSessionDBServiceImpl.java
new file mode 100644
index 0000000..3187734
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/db/GlobalSessionDBServiceImpl.java
@@ -0,0 +1,160 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.console.impl.db;
+
+import io.seata.common.ConfigurationKeys;
+import io.seata.common.exception.StoreException;
+import io.seata.common.loader.EnhancedServiceLoader;
+import io.seata.common.util.IOUtil;
+import io.seata.common.util.PageUtil;
+import io.seata.common.util.StringUtils;
+import io.seata.config.Configuration;
+import io.seata.config.ConfigurationFactory;
+import io.seata.console.result.PageResult;
+import io.seata.core.store.db.DataSourceProvider;
+import io.seata.core.store.db.sql.log.LogStoreSqlsFactory;
+import io.seata.server.console.param.GlobalSessionParam;
+import io.seata.server.console.service.BranchSessionService;
+import io.seata.server.console.service.GlobalSessionService;
+import io.seata.server.console.vo.BranchSessionVO;
+import io.seata.server.console.vo.GlobalSessionVO;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+
+import static io.seata.common.DefaultValues.DEFAULT_STORE_DB_GLOBAL_TABLE;
+
+/**
+ * Global Session DataBase ServiceImpl
+ *
+ * @author zhongxiang.wang
+ * @author lvekee 734843455@qq.com
+ */
+@Component
+@org.springframework.context.annotation.Configuration
+@ConditionalOnExpression("#{'db'.equals('${sessionMode}')}")
+public class GlobalSessionDBServiceImpl implements GlobalSessionService {
+
+    private String globalTable;
+
+    private String dbType;
+
+    private DataSource dataSource;
+
+    @Resource(type = BranchSessionService.class)
+    private BranchSessionService branchSessionService;
+
+    public GlobalSessionDBServiceImpl() {
+        Configuration configuration = ConfigurationFactory.getInstance();
+        globalTable = configuration.getConfig(ConfigurationKeys.STORE_DB_GLOBAL_TABLE, DEFAULT_STORE_DB_GLOBAL_TABLE);
+        dbType = configuration.getConfig(ConfigurationKeys.STORE_DB_TYPE);
+        if (StringUtils.isBlank(dbType)) {
+            throw new IllegalArgumentException(ConfigurationKeys.STORE_DB_TYPE + " should not be blank");
+        }
+        String dbDataSource = configuration.getConfig(ConfigurationKeys.STORE_DB_DATASOURCE_TYPE);
+        if (StringUtils.isBlank(dbDataSource)) {
+            throw new IllegalArgumentException(ConfigurationKeys.STORE_DB_DATASOURCE_TYPE + " should not be blank");
+        }
+        dataSource = EnhancedServiceLoader.load(DataSourceProvider.class, dbDataSource).provide();
+    }
+
+    @Override
+    public PageResult<GlobalSessionVO> query(GlobalSessionParam param) {
+        PageUtil.checkParam(param.getPageNum(), param.getPageSize());
+
+        List<Object> sqlParamList = new ArrayList<>();
+        String whereCondition = getWhereConditionByParam(param, sqlParamList);
+
+        String sourceSql = LogStoreSqlsFactory.getLogStoreSqls(dbType).getAllGlobalSessionSql(globalTable, whereCondition);
+        String querySessionSql = PageUtil.pageSql(sourceSql, dbType, param.getPageNum(), param.getPageSize());
+        String sessionCountSql = PageUtil.countSql(sourceSql, dbType);
+
+        List<GlobalSessionVO> list = new ArrayList<>();
+        int count = 0;
+
+
+        ResultSet rs = null;
+        ResultSet countRs = null;
+
+        try (Connection conn = dataSource.getConnection();
+             PreparedStatement ps = conn.prepareStatement(querySessionSql);
+             PreparedStatement countPs = conn.prepareStatement(sessionCountSql)) {
+            PageUtil.setObject(ps, sqlParamList);
+            rs = ps.executeQuery();
+            while (rs.next()) {
+                list.add(GlobalSessionVO.convert(rs));
+            }
+
+            PageUtil.setObject(countPs, sqlParamList);
+            countRs = countPs.executeQuery();
+            if (countRs.next()) {
+                count = countRs.getInt(1);
+            }
+            if (param.isWithBranch()) {
+                for (GlobalSessionVO globalSessionVO : list) {
+                    PageResult<BranchSessionVO> pageResp = branchSessionService.queryByXid(globalSessionVO.getXid());
+                    globalSessionVO.setBranchSessionVOs(new HashSet<>(pageResp.getData()));
+                }
+            }
+        } catch (SQLException e) {
+            throw new StoreException(e);
+        } finally {
+            IOUtil.close(rs, countRs);
+        }
+        return PageResult.success(list, count, param.getPageNum(), param.getPageSize());
+    }
+
+    private String getWhereConditionByParam(GlobalSessionParam param, List<Object> sqlParamList) {
+        StringBuilder whereConditionBuilder = new StringBuilder();
+        if (StringUtils.isNotBlank(param.getXid())) {
+            whereConditionBuilder.append(" and xid = ? ");
+            sqlParamList.add(param.getXid());
+        }
+        if (StringUtils.isNotBlank(param.getApplicationId())) {
+            whereConditionBuilder.append(" and application_id = ? ");
+            sqlParamList.add(param.getApplicationId());
+        }
+        if (param.getStatus() != null) {
+            whereConditionBuilder.append(" and status = ? ");
+            sqlParamList.add(param.getStatus());
+        }
+        if (StringUtils.isNotBlank(param.getTransactionName())) {
+            whereConditionBuilder.append(" and transaction_name = ? ");
+            sqlParamList.add(param.getTransactionName());
+        }
+        if (param.getTimeStart() != null) {
+            whereConditionBuilder.append(" and gmt_create >= ? ");
+            sqlParamList.add(new Date(param.getTimeStart()));
+        }
+        if (param.getTimeEnd() != null) {
+            whereConditionBuilder.append(" and gmt_create <= ? ");
+            sqlParamList.add(new Date(param.getTimeEnd()));
+        }
+        String whereCondition = whereConditionBuilder.toString();
+        return whereCondition.replaceFirst("and", "where");
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/file/BranchSessionFileServiceImpl.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/file/BranchSessionFileServiceImpl.java
new file mode 100644
index 0000000..2f710d0
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/file/BranchSessionFileServiceImpl.java
@@ -0,0 +1,39 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.console.impl.file;
+
+import io.seata.common.exception.NotSupportYetException;
+import io.seata.console.result.PageResult;
+import io.seata.server.console.service.BranchSessionService;
+import io.seata.server.console.vo.BranchSessionVO;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
+import org.springframework.stereotype.Component;
+
+/**
+ * Branch Session File ServiceImpl
+ *
+ * @author zhongxiang.wang
+ */
+@Component
+@org.springframework.context.annotation.Configuration
+@ConditionalOnExpression("#{'file'.equals('${sessionMode}')}")
+public class BranchSessionFileServiceImpl implements BranchSessionService {
+
+    @Override
+    public PageResult<BranchSessionVO> queryByXid(String xid) {
+        throw new NotSupportYetException();
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/file/GlobalLockFileServiceImpl.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/file/GlobalLockFileServiceImpl.java
new file mode 100644
index 0000000..d3c3f18
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/file/GlobalLockFileServiceImpl.java
@@ -0,0 +1,173 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.console.impl.file;
+
+import io.seata.common.util.CollectionUtils;
+import io.seata.common.util.StringUtils;
+import io.seata.console.result.PageResult;
+import io.seata.core.lock.RowLock;
+import io.seata.server.console.param.GlobalLockParam;
+import io.seata.server.console.service.GlobalLockService;
+import io.seata.server.console.vo.GlobalLockVO;
+import io.seata.server.lock.LockerManagerFactory;
+import io.seata.server.session.BranchSession;
+import io.seata.server.session.GlobalSession;
+import io.seata.server.session.SessionHolder;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
+import org.springframework.stereotype.Component;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static io.seata.common.util.StringUtils.isBlank;
+import static io.seata.server.console.vo.GlobalLockVO.convert;
+import static java.util.Objects.isNull;
+
+/**
+ * Global Lock File ServiceImpl
+ *
+ * @author zhongxiang.wang
+ * @author miaoxueyu
+ */
+@Component
+@org.springframework.context.annotation.Configuration
+@ConditionalOnExpression("#{'file'.equals('${lockMode}')}")
+public class GlobalLockFileServiceImpl implements GlobalLockService {
+
+    @Override
+    public PageResult<GlobalLockVO> query(GlobalLockParam param) {
+        checkParam(param);
+
+        final Collection<GlobalSession> allSessions = SessionHolder.getRootSessionManager().allSessions();
+
+        final AtomicInteger total = new AtomicInteger();
+        List<RowLock> result = allSessions
+                .parallelStream()
+                .filter(obtainGlobalSessionPredicate(param))
+                .flatMap(globalSession -> globalSession.getBranchSessions().stream())
+                .filter(obtainBranchSessionPredicate(param))
+                .flatMap(branchSession -> filterAndMap(param, branchSession))
+                .peek(globalSession -> total.incrementAndGet())
+                .collect(Collectors.toList());
+
+        return PageResult.build(convert(result), param.getPageNum(), param.getPageSize());
+
+    }
+
+    /**
+     * filter with tableName and generate RowLock
+     *
+     * @param param the query param
+     * @param branchSession the branch session
+     * @return the RowLock list
+     */
+    private Stream<RowLock> filterAndMap(GlobalLockParam param, BranchSession branchSession) {
+        if (CollectionUtils.isEmpty(branchSession.getLockHolder())) {
+            return Stream.empty();
+        }
+
+        final String tableName = param.getTableName();
+
+        // get rowLock from branchSession
+        final List<RowLock> rowLocks = LockerManagerFactory.getLockManager().collectRowLocks(branchSession);
+
+        if (StringUtils.isNotBlank(tableName)) {
+            return rowLocks.parallelStream().filter(rowLock -> rowLock.getTableName().contains(param.getTableName()));
+        }
+
+        return rowLocks.stream();
+    }
+
+
+    /**
+     * check the param
+     *
+     * @param param the param
+     */
+    private void checkParam(GlobalLockParam param) {
+        if (param.getPageSize() <= 0 || param.getPageNum() <= 0) {
+            throw new IllegalArgumentException("wrong pageSize or pageNum");
+        }
+
+        // verification data type
+        try {
+            Long.parseLong(param.getTransactionId());
+        } catch (NumberFormatException e) {
+            param.setTransactionId(null);
+        }
+        try {
+            Long.parseLong(param.getBranchId());
+        } catch (NumberFormatException e) {
+            param.setBranchId(null);
+        }
+
+
+    }
+
+    /**
+     * obtain the branch session condition
+     *
+     * @param param condition for query branch session
+     * @return the filter condition
+     */
+    private Predicate<? super BranchSession> obtainBranchSessionPredicate(GlobalLockParam param) {
+        return branchSession -> {
+            // transactionId
+            return (isBlank(param.getTransactionId()) ||
+                    String.valueOf(branchSession.getTransactionId()).contains(param.getTransactionId()))
+
+                    &&
+                    // branch id
+                    (isBlank(param.getBranchId()) ||
+                            String.valueOf(branchSession.getBranchId()).contains(param.getBranchId()))
+                    ;
+        };
+    }
+
+
+    /**
+     * obtain the global session condition
+     *
+     * @param param condition for query global session
+     * @return the filter condition
+     */
+    private Predicate<? super GlobalSession> obtainGlobalSessionPredicate(GlobalLockParam param) {
+
+        return globalSession -> {
+            // first, there must be withBranchSession
+            return CollectionUtils.isNotEmpty(globalSession.getBranchSessions())
+
+                    &&
+                    // The second is other conditions
+                    // xid
+                    (isBlank(param.getXid()) || globalSession.getXid().contains(param.getXid()))
+
+                    &&
+                    // timeStart
+                    (isNull(param.getTimeStart()) || param.getTimeStart() <= globalSession.getBeginTime())
+
+                    &&
+                    // timeEnd
+                    (isNull(param.getTimeEnd()) || param.getTimeEnd() >= globalSession.getBeginTime());
+        };
+    }
+
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/file/GlobalSessionFileServiceImpl.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/file/GlobalSessionFileServiceImpl.java
new file mode 100644
index 0000000..51ece1d
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/file/GlobalSessionFileServiceImpl.java
@@ -0,0 +1,102 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.console.impl.file;
+
+import io.seata.console.result.PageResult;
+import io.seata.server.console.param.GlobalSessionParam;
+import io.seata.server.console.service.GlobalSessionService;
+import io.seata.server.console.vo.GlobalSessionVO;
+import io.seata.server.session.GlobalSession;
+import io.seata.server.session.SessionHolder;
+import io.seata.server.storage.SessionConverter;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
+import org.springframework.stereotype.Component;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+
+import static io.seata.common.util.StringUtils.isBlank;
+import static java.util.Objects.isNull;
+
+/**
+ * Global Session File ServiceImpl
+ *
+ * @author zhongxiang.wang
+ * @author miaoxueyu
+ */
+@Component
+@org.springframework.context.annotation.Configuration
+@ConditionalOnExpression("#{'file'.equals('${sessionMode}')}")
+public class GlobalSessionFileServiceImpl implements GlobalSessionService {
+
+    @Override
+    public PageResult<GlobalSessionVO> query(GlobalSessionParam param) {
+        if (param.getPageSize() <= 0 || param.getPageNum() <= 0) {
+            throw new IllegalArgumentException("wrong pageSize or pageNum");
+        }
+
+        final Collection<GlobalSession> allSessions = SessionHolder.getRootSessionManager().allSessions();
+
+        final List<GlobalSession> filteredSessions = allSessions
+                .parallelStream()
+                .filter(obtainPredicate(param))
+                .collect(Collectors.toList());
+
+        return PageResult.build(SessionConverter.convertGlobalSession(filteredSessions), param.getPageNum(), param.getPageSize());
+    }
+
+
+
+    /**
+     * obtain the condition
+     *
+     * @param param condition for query global session
+     * @return the filter condition
+     */
+    private Predicate<? super GlobalSession> obtainPredicate(GlobalSessionParam param) {
+
+        return session -> {
+            return
+                // xid
+                (isBlank(param.getXid()) || session.getXid().contains(param.getXid()))
+
+                &&
+                // applicationId
+                (isBlank(param.getApplicationId()) || session.getApplicationId().contains(param.getApplicationId()))
+
+                &&
+                // status
+                (isNull(param.getStatus()) || Objects.equals(session.getStatus().getCode(), param.getStatus()))
+
+                &&
+                // transactionName
+                (isBlank(param.getTransactionName()) || session.getTransactionName().contains(param.getTransactionName()))
+
+                &&
+                // timeStart
+                (isNull(param.getTimeStart()) || param.getTimeStart() <= session.getBeginTime())
+
+                &&
+                // timeEnd
+                (isNull(param.getTimeEnd()) || param.getTimeEnd() >= session.getBeginTime());
+
+        };
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/redis/BranchSessionRedisServiceImpl.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/redis/BranchSessionRedisServiceImpl.java
new file mode 100644
index 0000000..c8e9e91
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/redis/BranchSessionRedisServiceImpl.java
@@ -0,0 +1,65 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.console.impl.redis;
+
+import io.seata.common.util.CollectionUtils;
+import io.seata.common.util.StringUtils;
+import io.seata.console.result.PageResult;
+import io.seata.core.store.BranchTransactionDO;
+import io.seata.server.console.service.BranchSessionService;
+import io.seata.server.console.vo.BranchSessionVO;
+import io.seata.server.storage.redis.store.RedisTransactionStoreManager;
+import org.springframework.beans.BeanUtils;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Branch Session Redis ServiceImpl
+ *
+ * @author zhongxiang.wang
+ * @author doubleDimple
+ */
+@Component
+@org.springframework.context.annotation.Configuration
+@ConditionalOnExpression("#{'redis'.equals('${sessionMode}')}")
+public class BranchSessionRedisServiceImpl implements BranchSessionService {
+
+    @Override
+    public PageResult<BranchSessionVO> queryByXid(String xid) {
+        if (StringUtils.isBlank(xid)) {
+            return PageResult.success();
+        }
+
+        List<BranchSessionVO> branchSessionVos = new ArrayList<>();
+
+        RedisTransactionStoreManager instance = RedisTransactionStoreManager.getInstance();
+
+        List<BranchTransactionDO> branchSessionDos = instance.findBranchSessionByXid(xid);
+
+        if (CollectionUtils.isNotEmpty(branchSessionDos)) {
+            for (BranchTransactionDO branchSessionDo : branchSessionDos) {
+                BranchSessionVO branchSessionVO = new BranchSessionVO();
+                BeanUtils.copyProperties(branchSessionDo, branchSessionVO);
+                branchSessionVos.add(branchSessionVO);
+            }
+        }
+
+        return PageResult.success(branchSessionVos, branchSessionVos.size(), 0, branchSessionVos.size());
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/redis/GlobalLockRedisServiceImpl.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/redis/GlobalLockRedisServiceImpl.java
new file mode 100644
index 0000000..17f30b8
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/redis/GlobalLockRedisServiceImpl.java
@@ -0,0 +1,119 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.console.impl.redis;
+
+import io.seata.common.util.BeanUtils;
+import io.seata.common.util.CollectionUtils;
+import io.seata.console.result.PageResult;
+import io.seata.server.console.param.GlobalLockParam;
+import io.seata.server.console.service.GlobalLockService;
+import io.seata.server.console.vo.GlobalLockVO;
+import io.seata.server.storage.redis.JedisPooledFactory;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
+import org.springframework.stereotype.Component;
+import redis.clients.jedis.Jedis;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import static io.seata.common.Constants.ROW_LOCK_KEY_SPLIT_CHAR;
+import static io.seata.common.exception.FrameworkErrorCode.ParameterRequired;
+import static io.seata.common.util.StringUtils.isNotBlank;
+import static io.seata.console.result.PageResult.checkPage;
+import static io.seata.core.constants.RedisKeyConstants.*;
+
+/**
+ * Global Lock Redis Service Impl
+ * @author zhongxiang.wang
+ * @author doubleDimple
+ */
+@Component
+@org.springframework.context.annotation.Configuration
+@ConditionalOnExpression("#{'redis'.equals('${lockMode}')}")
+public class GlobalLockRedisServiceImpl implements GlobalLockService {
+
+    @Override
+    public PageResult<GlobalLockVO> query(GlobalLockParam param) {
+
+        int total = 0;
+        List<GlobalLockVO> globalLockVos;
+        checkPage(param);
+        if (isNotBlank(param.getXid())) {
+            globalLockVos = queryGlobalByXid(param.getXid());
+            total = globalLockVos.size();
+            return PageResult.success(globalLockVos,total,param.getPageNum(),param.getPageSize());
+        } else if (isNotBlank(param.getTableName()) && isNotBlank(param.getPk()) && isNotBlank(param.getResourceId())) {
+            //SEATA_ROW_LOCK_jdbc:mysql://116.62.62.26/seata-order^^^order^^^2188
+            String tableName = param.getTableName();
+            String pk = param.getPk();
+            String resourceId = param.getResourceId();
+            globalLockVos = queryGlobalLockByRowKey(buildRowKey(tableName,pk,resourceId));
+            total = globalLockVos.size();
+            return PageResult.success(globalLockVos,total,param.getPageNum(),param.getPageSize());
+        } else {
+            return PageResult.failure(ParameterRequired.getErrCode(),"only three parameters of tableName,pk,resourceId or Xid are supported");
+        }
+    }
+
+    private List<GlobalLockVO> queryGlobalLockByRowKey(String buildRowKey) {
+        return readGlobalLockByRowKey(buildRowKey);
+    }
+
+    private String buildRowKey(String tableName, String pk,String resourceId) {
+        return DEFAULT_REDIS_SEATA_ROW_LOCK_PREFIX + resourceId + SPLIT + tableName + SPLIT + pk;
+    }
+
+
+    private List<GlobalLockVO> queryGlobalByXid(String xid) {
+        return readGlobalLockByXid(DEFAULT_REDIS_SEATA_GLOBAL_LOCK_PREFIX + xid);
+    }
+
+    private List<GlobalLockVO> readGlobalLockByXid(String key) {
+        List<GlobalLockVO> vos = new ArrayList<>();
+        try (Jedis jedis = JedisPooledFactory.getJedisInstance()) {
+            Map<String, String> mapGlobalKeys = jedis.hgetAll(key);
+            if (CollectionUtils.isNotEmpty(mapGlobalKeys)) {
+                List<String> rowLockKeys = new ArrayList<>();
+                mapGlobalKeys.forEach((k,v) -> rowLockKeys.addAll(Arrays.asList(v.split(ROW_LOCK_KEY_SPLIT_CHAR))));
+                for (String rowLoclKey : rowLockKeys) {
+                    Map<String, String> mapRowLockKey = jedis.hgetAll(rowLoclKey);
+                    GlobalLockVO vo = (GlobalLockVO)BeanUtils.mapToObject(mapRowLockKey, GlobalLockVO.class);
+                    if (vo != null) {
+                        vos.add(vo);
+                    }
+                }
+            }
+        }
+
+        return vos;
+    }
+
+
+    private List<GlobalLockVO> readGlobalLockByRowKey(String key) {
+        List<GlobalLockVO> vos = new ArrayList<>();
+        try (Jedis jedis = JedisPooledFactory.getJedisInstance()) {
+            Map<String, String> map = jedis.hgetAll(key);
+            GlobalLockVO vo = (GlobalLockVO)BeanUtils.mapToObject(map, GlobalLockVO.class);
+            if (vo != null) {
+                vos.add(vo);
+            }
+        }
+        return vos;
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/redis/GlobalSessionRedisServiceImpl.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/redis/GlobalSessionRedisServiceImpl.java
new file mode 100644
index 0000000..9ca2fdb
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/redis/GlobalSessionRedisServiceImpl.java
@@ -0,0 +1,110 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.console.impl.redis;
+
+import io.seata.common.util.CollectionUtils;
+import io.seata.console.result.PageResult;
+import io.seata.core.model.GlobalStatus;
+import io.seata.server.console.param.GlobalSessionParam;
+import io.seata.server.console.service.GlobalSessionService;
+import io.seata.server.console.vo.GlobalSessionVO;
+import io.seata.server.session.GlobalSession;
+import io.seata.server.session.SessionCondition;
+import io.seata.server.storage.redis.store.RedisTransactionStoreManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static io.seata.common.exception.FrameworkErrorCode.ParameterRequired;
+import static io.seata.common.util.StringUtils.isBlank;
+import static io.seata.common.util.StringUtils.isNotBlank;
+import static io.seata.console.result.PageResult.checkPage;
+import static io.seata.server.storage.SessionConverter.convertToGlobalSessionVo;
+
+/**
+ * Global Session Redis ServiceImpl
+ * @author zhongxiang.wang
+ * @author doubleDimple
+ */
+@Component
+@org.springframework.context.annotation.Configuration
+@ConditionalOnExpression("#{'redis'.equals('${sessionMode}')}")
+public class GlobalSessionRedisServiceImpl implements GlobalSessionService {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(GlobalSessionRedisServiceImpl.class);
+
+    @Override
+    public PageResult<GlobalSessionVO> query(GlobalSessionParam param) {
+        List<GlobalSessionVO> result = new ArrayList<>();
+        Long total = 0L;
+        if (param.getTimeStart() != null || param.getTimeEnd() != null) {
+            //not support time range query
+            LOGGER.debug("not supported according to time range query");
+            return PageResult.failure(ParameterRequired.getErrCode(),"not supported according to time range query");
+        }
+        List<GlobalSession> globalSessions = new ArrayList<>();
+
+        RedisTransactionStoreManager instance = RedisTransactionStoreManager.getInstance();
+
+        checkPage(param);
+
+        if (isBlank(param.getXid()) && param.getStatus() == null) {
+            total = instance.countByGlobalSessions(GlobalStatus.values());
+            globalSessions = instance.findGlobalSessionByPage(param.getPageNum(), param.getPageSize(),param.isWithBranch());
+        } else {
+            List<GlobalSession> globalSessionsNew = new ArrayList<>();
+            if (isNotBlank(param.getXid())) {
+                SessionCondition sessionCondition = new SessionCondition();
+                sessionCondition.setXid(param.getXid());
+                sessionCondition.setLazyLoadBranch(!param.isWithBranch());
+                globalSessions = instance.readSession(sessionCondition);
+                total = (long)globalSessions.size();
+            }
+
+            if (param.getStatus() != null && GlobalStatus.get(param.getStatus()) != null) {
+                if (CollectionUtils.isNotEmpty(globalSessions)) {
+                    globalSessionsNew = globalSessions.stream().filter(globalSession -> globalSession.getStatus().getCode() == (param.getStatus())).collect(Collectors.toList());
+                    total = (long)globalSessionsNew.size();
+                } else {
+                    total = instance.countByGlobalSessions(new GlobalStatus[] {GlobalStatus.get(param.getStatus())});
+                    globalSessionsNew = instance.readSessionStatusByPage(param);
+                }
+            }
+
+            if (LOGGER.isDebugEnabled()) {
+                if (isNotBlank(param.getApplicationId())) {
+                    //not support
+                    LOGGER.debug("not supported according to applicationId query");
+                }
+                if (isNotBlank(param.getTransactionName())) {
+                    //not support
+                    LOGGER.debug("not supported according to transactionName query");
+                }
+            }
+            globalSessions = globalSessionsNew.size() > 0 ? globalSessionsNew : globalSessions;
+        }
+
+        convertToGlobalSessionVo(result,globalSessions);
+
+        return PageResult.success(result,total.intValue(),param.getPageNum(),param.getPageSize());
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/param/GlobalLockParam.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/param/GlobalLockParam.java
new file mode 100644
index 0000000..dcc4301
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/param/GlobalLockParam.java
@@ -0,0 +1,114 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.console.param;
+
+import io.seata.console.param.BaseParam;
+
+import java.io.Serializable;
+
+/**
+ * Global lock param
+ * @author zhongxiang.wang
+ */
+public class GlobalLockParam extends BaseParam implements Serializable {
+
+    private static final long serialVersionUID = 615412528070131284L;
+
+    /**
+     * the xid
+     */
+    private String xid;
+    /**
+     * the table name
+     */
+    private String tableName;
+    /**
+     * the transaction id
+     */
+    private String transactionId;
+    /**
+     * the branch id
+     */
+    private String branchId;
+    /**
+     * the primary Key
+     */
+    private String pk;
+    /**
+     * the resourceId
+     */
+    private String resourceId;
+
+    public String getTransactionId() {
+        return transactionId;
+    }
+
+    public void setTransactionId(String transactionId) {
+        this.transactionId = transactionId;
+    }
+
+    public String getBranchId() {
+        return branchId;
+    }
+
+    public void setBranchId(String branchId) {
+        this.branchId = branchId;
+    }
+
+    public String getXid() {
+        return xid;
+    }
+
+    public void setXid(String xid) {
+        this.xid = xid;
+    }
+
+    public String getTableName() {
+        return tableName;
+    }
+
+    public void setTableName(String tableName) {
+        this.tableName = tableName;
+    }
+
+    public String getPk() {
+        return pk;
+    }
+
+    public void setPk(String pk) {
+        this.pk = pk;
+    }
+
+    public String getResourceId() {
+        return resourceId;
+    }
+
+    public void setResourceId(String resourceId) {
+        this.resourceId = resourceId;
+    }
+
+    @Override
+    public String toString() {
+        return "GlobalLockParam{" +
+                "xid='" + xid + '\'' +
+                ", tableName='" + tableName + '\'' +
+                ", transactionId='" + transactionId + '\'' +
+                ", branchId='" + branchId + '\'' +
+                ", pk='" + pk + '\'' +
+                ", resourceId='" + resourceId + '\'' +
+                '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/param/GlobalSessionParam.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/param/GlobalSessionParam.java
new file mode 100644
index 0000000..8867303
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/param/GlobalSessionParam.java
@@ -0,0 +1,102 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.console.param;
+
+import io.seata.console.param.BaseParam;
+
+import java.io.Serializable;
+
+/**
+ * Global session param
+ * @author zhongxiang.wang
+ */
+public class GlobalSessionParam extends BaseParam implements Serializable {
+
+    private static final long serialVersionUID = 115488252809011284L;
+    /**
+     * the xid
+     */
+    private String xid;
+    /**
+     * the application id
+     */
+    private String applicationId;
+    /**
+     * the global session status
+     */
+    private Integer status;
+    /**
+     * the transaction name
+     */
+    private String transactionName;
+    /**
+     * if with branch
+     * true: with branch session
+     * false: no branch session
+     */
+    private boolean withBranch;
+
+    public String getXid() {
+        return xid;
+    }
+
+    public void setXid(String xid) {
+        this.xid = xid;
+    }
+
+    public String getTransactionName() {
+        return transactionName;
+    }
+
+    public void setTransactionName(String transactionName) {
+        this.transactionName = transactionName;
+    }
+
+    public String getApplicationId() {
+        return applicationId;
+    }
+
+    public void setApplicationId(String applicationId) {
+        this.applicationId = applicationId;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public boolean isWithBranch() {
+        return withBranch;
+    }
+
+    public void setWithBranch(boolean withBranch) {
+        this.withBranch = withBranch;
+    }
+
+    @Override
+    public String toString() {
+        return "GlobalSessionParam{" +
+                "xid='" + xid + '\'' +
+                ", applicationId='" + applicationId + '\'' +
+                ", status=" + status +
+                ", transactionName='" + transactionName + '\'' +
+                ", withBranch=" + withBranch +
+                '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/service/BranchSessionService.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/service/BranchSessionService.java
new file mode 100644
index 0000000..5f1b3fd
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/service/BranchSessionService.java
@@ -0,0 +1,34 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.console.service;
+
+import io.seata.console.result.PageResult;
+import io.seata.server.console.vo.BranchSessionVO;
+
+/**
+ * Branch session service
+ * @author wangzhongxiang
+ */
+public interface BranchSessionService {
+
+    /**
+     * Query branch session by xid
+     * @param xid the xid
+     * @return the BranchSessionVO list
+     */
+    PageResult<BranchSessionVO> queryByXid(String xid);
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/service/GlobalLockService.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/service/GlobalLockService.java
new file mode 100644
index 0000000..87b3a79
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/service/GlobalLockService.java
@@ -0,0 +1,37 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.console.service;
+
+import io.seata.console.result.PageResult;
+import io.seata.server.console.param.GlobalLockParam;
+import io.seata.server.console.vo.GlobalLockVO;
+
+
+/**
+ * Global lock service
+ * @author wangzhongxiang
+ */
+public interface GlobalLockService {
+
+    /**
+     * Query locks by param
+     * @param param the param
+     * @return the list of GlobalLockVO
+     */
+    PageResult<GlobalLockVO> query(GlobalLockParam param);
+
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/service/GlobalSessionService.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/service/GlobalSessionService.java
new file mode 100644
index 0000000..4526053
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/service/GlobalSessionService.java
@@ -0,0 +1,35 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.console.service;
+
+import io.seata.console.result.PageResult;
+import io.seata.server.console.param.GlobalSessionParam;
+import io.seata.server.console.vo.GlobalSessionVO;
+
+/**
+ * Global session service
+ * @author wangzhongxiang
+ */
+public interface GlobalSessionService {
+
+    /**
+     * Query global session
+     * @param param the param
+     * @return the GlobalSessionVO list
+     */
+    PageResult<GlobalSessionVO> query(GlobalSessionParam param);
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/vo/BranchSessionVO.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/vo/BranchSessionVO.java
new file mode 100644
index 0000000..fa1e7b8
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/vo/BranchSessionVO.java
@@ -0,0 +1,241 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.console.vo;
+
+import io.seata.core.constants.ServerTableColumnsName;
+
+import java.sql.Date;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Objects;
+
+/**
+ * BranchSessionVO
+ * @author zhongxiang.wang
+ */
+public class BranchSessionVO {
+
+    private String xid;
+
+    private String transactionId;
+
+    private String branchId;
+
+    private String resourceGroupId;
+
+    private String resourceId;
+
+    private String branchType;
+
+    private Integer status;
+
+    private String clientId;
+
+    private String applicationData;
+
+    private Long gmtCreate;
+
+    private Long gmtModified;
+
+
+    public BranchSessionVO(){
+
+    }
+
+    public BranchSessionVO(String xid,
+                           Long transactionId,
+                           Long branchId,
+                           String resourceGroupId,
+                           String resourceId,
+                           String branchType,
+                           Integer status,
+                           String clientId,
+                           String applicationData) {
+        this.xid = xid;
+        this.transactionId = String.valueOf(transactionId);
+        this.branchId = String.valueOf(branchId);
+        this.resourceGroupId = resourceGroupId;
+        this.resourceId = resourceId;
+        this.branchType = branchType;
+        this.status = status;
+        this.clientId = clientId;
+        this.applicationData = applicationData;
+    }
+
+    public String getXid() {
+        return xid;
+    }
+
+    public void setXid(String xid) {
+        this.xid = xid;
+    }
+
+    public String getTransactionId() {
+        return transactionId;
+    }
+
+    public void setTransactionId(Long transactionId) {
+        this.transactionId = String.valueOf(transactionId);
+    }
+
+    public String getBranchId() {
+        return branchId;
+    }
+
+    public void setBranchId(Long branchId) {
+        this.branchId = String.valueOf(branchId);
+    }
+
+    public String getResourceGroupId() {
+        return resourceGroupId;
+    }
+
+    public void setResourceGroupId(String resourceGroupId) {
+        this.resourceGroupId = resourceGroupId;
+    }
+
+    public String getResourceId() {
+        return resourceId;
+    }
+
+    public void setResourceId(String resourceId) {
+        this.resourceId = resourceId;
+    }
+
+    public String getBranchType() {
+        return branchType;
+    }
+
+    public void setBranchType(String branchType) {
+        this.branchType = branchType;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public String getClientId() {
+        return clientId;
+    }
+
+    public void setClientId(String clientId) {
+        this.clientId = clientId;
+    }
+
+    public String getApplicationData() {
+        return applicationData;
+    }
+
+    public void setApplicationData(String applicationData) {
+        this.applicationData = applicationData;
+    }
+
+    public Long getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Long gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+
+    public Long getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Long gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    public static BranchSessionVO convert(ResultSet rs) throws SQLException {
+        BranchSessionVO branchSessionVO = new BranchSessionVO();
+        branchSessionVO.setXid(rs.getString(ServerTableColumnsName.BRANCH_TABLE_XID));
+        branchSessionVO.setTransactionId(rs.getLong(ServerTableColumnsName.BRANCH_TABLE_TRANSACTION_ID));
+        branchSessionVO.setBranchId(rs.getLong(ServerTableColumnsName.BRANCH_TABLE_BRANCH_ID));
+        branchSessionVO.setResourceGroupId(rs.getString(ServerTableColumnsName.BRANCH_TABLE_RESOURCE_GROUP_ID));
+        branchSessionVO.setResourceId(rs.getString(ServerTableColumnsName.BRANCH_TABLE_RESOURCE_ID));
+        branchSessionVO.setBranchType(rs.getString(ServerTableColumnsName.BRANCH_TABLE_BRANCH_TYPE));
+        branchSessionVO.setStatus(rs.getInt(ServerTableColumnsName.BRANCH_TABLE_STATUS));
+        branchSessionVO.setClientId(rs.getString(ServerTableColumnsName.BRANCH_TABLE_CLIENT_ID));
+        branchSessionVO.setApplicationData(rs.getString(ServerTableColumnsName.BRANCH_TABLE_APPLICATION_DATA));
+        Date gmtCreateTimestamp = rs.getDate(ServerTableColumnsName.BRANCH_TABLE_GMT_CREATE);
+        if (gmtCreateTimestamp != null) {
+            branchSessionVO.setGmtCreate(gmtCreateTimestamp.getTime());
+        }
+        Date gmtModifiedTimestamp = rs.getDate(ServerTableColumnsName.BRANCH_TABLE_GMT_MODIFIED);
+        if (gmtModifiedTimestamp != null) {
+            branchSessionVO.setGmtModified(gmtModifiedTimestamp.getTime());
+        }
+        return branchSessionVO;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        BranchSessionVO that = (BranchSessionVO) o;
+        return Objects.equals(xid, that.xid)
+                && Objects.equals(transactionId, that.transactionId)
+                && Objects.equals(branchId, that.branchId)
+                && Objects.equals(resourceGroupId, that.resourceGroupId)
+                && Objects.equals(resourceId, that.resourceId)
+                && Objects.equals(branchType, that.branchType)
+                && Objects.equals(status, that.status)
+                && Objects.equals(clientId, that.clientId)
+                && Objects.equals(applicationData, that.applicationData)
+                && Objects.equals(gmtCreate, that.gmtCreate)
+                && Objects.equals(gmtModified, that.gmtModified);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(xid,
+                transactionId,
+                branchId,
+                resourceGroupId,
+                resourceId,
+                branchType,
+                status,
+                clientId,
+                applicationData,
+                gmtCreate,
+                gmtModified);
+    }
+
+    @Override
+    public String toString() {
+        return "BranchSessionVO{" +
+                "xid='" + xid + '\'' +
+                ", transactionId=" + transactionId +
+                ", branchId=" + branchId +
+                ", resourceGroupId='" + resourceGroupId + '\'' +
+                ", resourceId='" + resourceId + '\'' +
+                ", branchType='" + branchType + '\'' +
+                ", status=" + status +
+                ", clientId='" + clientId + '\'' +
+                ", applicationData='" + applicationData + '\'' +
+                ", gmtCreate=" + gmtCreate +
+                ", gmtModified=" + gmtModified +
+                '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/vo/GlobalLockVO.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/vo/GlobalLockVO.java
new file mode 100644
index 0000000..265cc77
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/vo/GlobalLockVO.java
@@ -0,0 +1,196 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.console.vo;
+
+import io.seata.common.util.CollectionUtils;
+import io.seata.core.constants.ServerTableColumnsName;
+import io.seata.core.lock.RowLock;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * GlobalLockVO
+ * @author zhongxiang.wang
+ * @author miaoxueyu
+ */
+public class GlobalLockVO {
+
+    private String xid;
+
+    private String transactionId;
+
+    private String branchId;
+
+    private String resourceId;
+
+    private String tableName;
+
+    private String pk;
+
+    private String rowKey;
+
+    private Long gmtCreate;
+
+    private Long gmtModified;
+
+    /**
+     * convert RowLock list to GlobalLockVO list
+     * @param rowLocks the RowLock list
+     * @return the GlobalLockVO list
+     */
+    public static List<GlobalLockVO> convert(List<RowLock> rowLocks) {
+        if (CollectionUtils.isEmpty(rowLocks)) {
+            return Collections.emptyList();
+        }
+        final List<GlobalLockVO> result = new ArrayList<>(rowLocks.size());
+        for (RowLock rowLock : rowLocks) {
+            result.add(convert(rowLock));
+        }
+
+        return result;
+    }
+
+
+    /**
+     * convert RowLock to GlobalLockVO
+     * @param rowLock the RowLock
+     * @return the GlobalLockVO
+     */
+    public static GlobalLockVO convert(RowLock rowLock) {
+        final GlobalLockVO globalLockVO = new GlobalLockVO();
+        globalLockVO.setXid(rowLock.getXid());
+        globalLockVO.setTransactionId(rowLock.getTransactionId());
+        globalLockVO.setBranchId(rowLock.getBranchId());
+        globalLockVO.setResourceId(rowLock.getResourceId());
+        globalLockVO.setTableName(rowLock.getTableName());
+        globalLockVO.setPk(rowLock.getPk());
+        globalLockVO.setRowKey(rowLock.getRowKey());
+        return globalLockVO;
+    }
+
+
+    public String getXid() {
+        return xid;
+    }
+
+    public void setXid(String xid) {
+        this.xid = xid;
+    }
+
+    public String getTransactionId() {
+        return transactionId;
+    }
+
+    public void setTransactionId(Long transactionId) {
+        this.transactionId = String.valueOf(transactionId);
+    }
+
+    public String getBranchId() {
+        return branchId;
+    }
+
+    public void setBranchId(Long branchId) {
+        this.branchId = String.valueOf(branchId);
+    }
+
+    public String getResourceId() {
+        return resourceId;
+    }
+
+    public void setResourceId(String resourceId) {
+        this.resourceId = resourceId;
+    }
+
+    public String getTableName() {
+        return tableName;
+    }
+
+    public void setTableName(String tableName) {
+        this.tableName = tableName;
+    }
+
+    public String getPk() {
+        return pk;
+    }
+
+    public void setPk(String pk) {
+        this.pk = pk;
+    }
+
+    public String getRowKey() {
+        return rowKey;
+    }
+
+    public void setRowKey(String rowKey) {
+        this.rowKey = rowKey;
+    }
+
+    public Long getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Long gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+
+    public Long getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Long gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    public static GlobalLockVO convert(ResultSet rs) throws SQLException {
+        GlobalLockVO globalLockVO = new GlobalLockVO();
+        globalLockVO.setRowKey(rs.getString(ServerTableColumnsName.LOCK_TABLE_ROW_KEY));
+        globalLockVO.setXid(rs.getString(ServerTableColumnsName.LOCK_TABLE_XID));
+        globalLockVO.setTransactionId(rs.getLong(ServerTableColumnsName.LOCK_TABLE_TRANSACTION_ID));
+        globalLockVO.setBranchId(rs.getLong(ServerTableColumnsName.LOCK_TABLE_BRANCH_ID));
+        globalLockVO.setResourceId(rs.getString(ServerTableColumnsName.LOCK_TABLE_RESOURCE_ID));
+        globalLockVO.setTableName(rs.getString(ServerTableColumnsName.LOCK_TABLE_TABLE_NAME));
+        globalLockVO.setPk(rs.getString(ServerTableColumnsName.LOCK_TABLE_PK));
+        Timestamp gmtCreateTimestamp = rs.getTimestamp(ServerTableColumnsName.LOCK_TABLE_GMT_CREATE);
+        if (gmtCreateTimestamp != null) {
+            globalLockVO.setGmtCreate(gmtCreateTimestamp.getTime());
+        }
+        Timestamp gmtModifiedTimestamp = rs.getTimestamp(ServerTableColumnsName.LOCK_TABLE_GMT_MODIFIED);
+        if (gmtModifiedTimestamp != null) {
+            globalLockVO.setGmtModified(gmtModifiedTimestamp.getTime());
+        }
+        return globalLockVO;
+    }
+
+    @Override
+    public String toString() {
+        return "GlobalLockVO{" +
+                "xid='" + xid + '\'' +
+                ", transactionId=" + transactionId +
+                ", branchId=" + branchId +
+                ", resourceId='" + resourceId + '\'' +
+                ", tableName='" + tableName + '\'' +
+                ", pk='" + pk + '\'' +
+                ", rowKey='" + rowKey + '\'' +
+                ", gmtCreate=" + gmtCreate +
+                ", gmtModified=" + gmtModified +
+                '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/vo/GlobalSessionVO.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/vo/GlobalSessionVO.java
new file mode 100644
index 0000000..b040cb5
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/vo/GlobalSessionVO.java
@@ -0,0 +1,217 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.console.vo;
+
+import io.seata.core.constants.ServerTableColumnsName;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Timestamp;
+import java.util.Set;
+
+/**
+ * GlobalSessionVO
+ * @author zhongxiang.wang
+ */
+public class GlobalSessionVO {
+
+    private String xid;
+
+    private String transactionId;
+
+    private Integer status;
+
+    private String applicationId;
+
+    private String transactionServiceGroup;
+
+    private String transactionName;
+
+    private Long timeout;
+
+    private Long beginTime;
+
+    private String applicationData;
+
+    private Long gmtCreate;
+
+    private Long gmtModified;
+
+    private Set<BranchSessionVO> branchSessionVOs;
+
+
+    public GlobalSessionVO() {
+
+    }
+
+    public GlobalSessionVO(String xid,
+                           Long transactionId,
+                           Integer status,
+                           String applicationId,
+                           String transactionServiceGroup,
+                           String transactionName,
+                           Long timeout,
+                           Long beginTime,
+                           String applicationData,
+                           Set<BranchSessionVO> branchSessionVOs) {
+        this.xid = xid;
+        this.transactionId = String.valueOf(transactionId);
+        this.status = status;
+        this.applicationId = applicationId;
+        this.transactionServiceGroup = transactionServiceGroup;
+        this.transactionName = transactionName;
+        this.timeout = timeout;
+        this.beginTime = beginTime;
+        this.applicationData = applicationData;
+        this.branchSessionVOs = branchSessionVOs;
+    }
+
+    public String getXid() {
+        return xid;
+    }
+
+    public void setXid(String xid) {
+        this.xid = xid;
+    }
+
+    public String getTransactionId() {
+        return transactionId;
+    }
+
+    public void setTransactionId(Long transactionId) {
+        this.transactionId = String.valueOf(transactionId);
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public String getApplicationId() {
+        return applicationId;
+    }
+
+    public void setApplicationId(String applicationId) {
+        this.applicationId = applicationId;
+    }
+
+    public String getTransactionServiceGroup() {
+        return transactionServiceGroup;
+    }
+
+    public void setTransactionServiceGroup(String transactionServiceGroup) {
+        this.transactionServiceGroup = transactionServiceGroup;
+    }
+
+    public String getTransactionName() {
+        return transactionName;
+    }
+
+    public void setTransactionName(String transactionName) {
+        this.transactionName = transactionName;
+    }
+
+    public Long getTimeout() {
+        return timeout;
+    }
+
+    public void setTimeout(Long timeout) {
+        this.timeout = timeout;
+    }
+
+    public Long getBeginTime() {
+        return beginTime;
+    }
+
+    public void setBeginTime(Long beginTime) {
+        this.beginTime = beginTime;
+    }
+
+    public String getApplicationData() {
+        return applicationData;
+    }
+
+    public void setApplicationData(String applicationData) {
+        this.applicationData = applicationData;
+    }
+
+    public Long getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Long gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+
+    public Long getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Long gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    public Set<BranchSessionVO> getBranchSessionVOs() {
+        return branchSessionVOs;
+    }
+
+    public void setBranchSessionVOs(Set<BranchSessionVO> branchSessionVOs) {
+        this.branchSessionVOs = branchSessionVOs;
+    }
+
+    public static GlobalSessionVO convert(ResultSet rs) throws SQLException {
+        GlobalSessionVO globalSessionVO = new GlobalSessionVO();
+        globalSessionVO.setXid(rs.getString(ServerTableColumnsName.GLOBAL_TABLE_XID));
+        globalSessionVO.setTransactionId(rs.getLong(ServerTableColumnsName.GLOBAL_TABLE_TRANSACTION_ID));
+        globalSessionVO.setStatus(rs.getInt(ServerTableColumnsName.GLOBAL_TABLE_STATUS));
+        globalSessionVO.setApplicationId(rs.getString(ServerTableColumnsName.GLOBAL_TABLE_APPLICATION_ID));
+        globalSessionVO.setTransactionServiceGroup(rs.getString(ServerTableColumnsName.GLOBAL_TABLE_TRANSACTION_SERVICE_GROUP));
+        globalSessionVO.setTransactionName(rs.getString(ServerTableColumnsName.GLOBAL_TABLE_TRANSACTION_NAME));
+        globalSessionVO.setTimeout(rs.getLong(ServerTableColumnsName.GLOBAL_TABLE_TIMEOUT));
+        globalSessionVO.setBeginTime(rs.getLong(ServerTableColumnsName.GLOBAL_TABLE_BEGIN_TIME));
+        globalSessionVO.setApplicationData(rs.getString(ServerTableColumnsName.GLOBAL_TABLE_APPLICATION_DATA));
+        Timestamp gmtCreateTimestamp = rs.getTimestamp(ServerTableColumnsName.GLOBAL_TABLE_GMT_CREATE);
+        if (gmtCreateTimestamp != null) {
+            globalSessionVO.setGmtCreate(gmtCreateTimestamp.getTime());
+        }
+        Timestamp gmtModifiedTimestamp = rs.getTimestamp(ServerTableColumnsName.GLOBAL_TABLE_GMT_MODIFIED);
+        if (gmtModifiedTimestamp != null) {
+            globalSessionVO.setGmtModified(gmtModifiedTimestamp.getTime());
+        }
+        return globalSessionVO;
+    }
+
+    @Override
+    public String toString() {
+        return "GlobalSessionVO{" +
+                "xid='" + xid + '\'' +
+                ", transactionId=" + transactionId +
+                ", status=" + status +
+                ", applicationId='" + applicationId + '\'' +
+                ", transactionServiceGroup='" + transactionServiceGroup + '\'' +
+                ", transactionName='" + transactionName + '\'' +
+                ", timeout=" + timeout +
+                ", beginTime=" + beginTime +
+                ", applicationData='" + applicationData + '\'' +
+                ", gmtCreate=" + gmtCreate +
+                ", gmtModified=" + gmtModified +
+                ", branchSessionVOs=" + branchSessionVOs +
+                '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/controller/HealthController.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/controller/HealthController.java
new file mode 100644
index 0000000..155045a
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/controller/HealthController.java
@@ -0,0 +1,43 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.controller;
+
+import io.seata.server.ServerRunner;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+/**
+ * @author spilledyear@outlook.com
+ */
+@Controller
+@RequestMapping
+public class HealthController {
+
+    private static final String OK = "ok";
+    private static final String NOT_OK = "not_ok";
+
+    @Autowired
+    private ServerRunner serverRunner;
+
+
+    @RequestMapping("/health")
+    @ResponseBody
+    String healthCheck() {
+        return serverRunner.started() ? OK : NOT_OK;
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/AbstractCore.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/AbstractCore.java
new file mode 100644
index 0000000..70477c3
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/AbstractCore.java
@@ -0,0 +1,241 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.coordinator;
+
+import io.seata.core.context.RootContext;
+import io.seata.core.exception.BranchTransactionException;
+import io.seata.core.exception.GlobalTransactionException;
+import io.seata.core.exception.TransactionException;
+import io.seata.core.exception.TransactionExceptionCode;
+import io.seata.core.model.BranchStatus;
+import io.seata.core.model.BranchType;
+import io.seata.core.model.GlobalStatus;
+import io.seata.core.protocol.transaction.BranchCommitRequest;
+import io.seata.core.protocol.transaction.BranchCommitResponse;
+import io.seata.core.protocol.transaction.BranchRollbackRequest;
+import io.seata.core.protocol.transaction.BranchRollbackResponse;
+import io.seata.core.rpc.RemotingServer;
+import io.seata.server.lock.LockManager;
+import io.seata.server.lock.LockerManagerFactory;
+import io.seata.server.session.BranchSession;
+import io.seata.server.session.GlobalSession;
+import io.seata.server.session.SessionHelper;
+import io.seata.server.session.SessionHolder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.MDC;
+
+import java.io.IOException;
+import java.util.concurrent.TimeoutException;
+
+import static io.seata.core.exception.TransactionExceptionCode.*;
+
+/**
+ * The type abstract core.
+ *
+ * @author ph3636
+ */
+public abstract class AbstractCore implements Core {
+
+    protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractCore.class);
+
+    protected LockManager lockManager = LockerManagerFactory.getLockManager();
+
+    protected RemotingServer remotingServer;
+
+    public AbstractCore(RemotingServer remotingServer) {
+        if (remotingServer == null) {
+            throw new IllegalArgumentException("remotingServer must be not null");
+        }
+        this.remotingServer = remotingServer;
+    }
+
+    public abstract BranchType getHandleBranchType();
+
+    @Override
+    public Long branchRegister(BranchType branchType, String resourceId, String clientId, String xid,
+                               String applicationData, String lockKeys) throws TransactionException {
+        GlobalSession globalSession = assertGlobalSessionNotNull(xid, false);
+        return SessionHolder.lockAndExecute(globalSession, () -> {
+            globalSessionStatusCheck(globalSession);
+            globalSession.addSessionLifecycleListener(SessionHolder.getRootSessionManager());
+            BranchSession branchSession = SessionHelper.newBranchByGlobal(globalSession, branchType, resourceId,
+                    applicationData, lockKeys, clientId);
+            MDC.put(RootContext.MDC_KEY_BRANCH_ID, String.valueOf(branchSession.getBranchId()));
+            branchSessionLock(globalSession, branchSession);
+            try {
+                globalSession.addBranch(branchSession);
+            } catch (RuntimeException ex) {
+                branchSessionUnlock(branchSession);
+                throw new BranchTransactionException(FailedToAddBranch, String
+                        .format("Failed to store branch xid = %s branchId = %s", globalSession.getXid(),
+                                branchSession.getBranchId()), ex);
+            }
+            if (LOGGER.isInfoEnabled()) {
+                LOGGER.info("Register branch successfully, xid = {}, branchId = {}, resourceId = {} ,lockKeys = {}",
+                        globalSession.getXid(), branchSession.getBranchId(), resourceId, lockKeys);
+            }
+            return branchSession.getBranchId();
+        });
+    }
+
+    protected void globalSessionStatusCheck(GlobalSession globalSession) throws GlobalTransactionException {
+        if (!globalSession.isActive()) {
+            throw new GlobalTransactionException(GlobalTransactionNotActive, String.format(
+                "Could not register branch into global session xid = %s status = %s, cause by globalSession not active",
+                globalSession.getXid(), globalSession.getStatus()));
+        }
+        if (globalSession.getStatus() != GlobalStatus.Begin) {
+            throw new GlobalTransactionException(GlobalTransactionStatusInvalid, String
+                    .format("Could not register branch into global session xid = %s status = %s while expecting %s",
+                            globalSession.getXid(), globalSession.getStatus(), GlobalStatus.Begin));
+        }
+    }
+
+    protected void branchSessionLock(GlobalSession globalSession, BranchSession branchSession) throws TransactionException {
+
+    }
+
+    protected void branchSessionUnlock(BranchSession branchSession) throws TransactionException {
+
+    }
+
+    private GlobalSession assertGlobalSessionNotNull(String xid, boolean withBranchSessions)
+            throws TransactionException {
+        GlobalSession globalSession = SessionHolder.findGlobalSession(xid, withBranchSessions);
+        if (globalSession == null) {
+            throw new GlobalTransactionException(TransactionExceptionCode.GlobalTransactionNotExist,
+                    String.format("Could not found global transaction xid = %s, may be has finished.", xid));
+        }
+        return globalSession;
+    }
+
+    @Override
+    public void branchReport(BranchType branchType, String xid, long branchId, BranchStatus status,
+                             String applicationData) throws TransactionException {
+        GlobalSession globalSession = assertGlobalSessionNotNull(xid, true);
+        BranchSession branchSession = globalSession.getBranch(branchId);
+        if (branchSession == null) {
+            throw new BranchTransactionException(BranchTransactionNotExist,
+                    String.format("Could not found branch session xid = %s branchId = %s", xid, branchId));
+        }
+        branchSession.setApplicationData(applicationData);
+        globalSession.addSessionLifecycleListener(SessionHolder.getRootSessionManager());
+        globalSession.changeBranchStatus(branchSession, status);
+
+        if (LOGGER.isInfoEnabled()) {
+            LOGGER.info("Report branch status successfully, xid = {}, branchId = {}", globalSession.getXid(),
+                branchSession.getBranchId());
+        }
+    }
+
+    @Override
+    public boolean lockQuery(BranchType branchType, String resourceId, String xid, String lockKeys)
+            throws TransactionException {
+        return true;
+    }
+
+    @Override
+    public BranchStatus branchCommit(GlobalSession globalSession, BranchSession branchSession) throws TransactionException {
+        try {
+            BranchCommitRequest request = new BranchCommitRequest();
+            request.setXid(branchSession.getXid());
+            request.setBranchId(branchSession.getBranchId());
+            request.setResourceId(branchSession.getResourceId());
+            request.setApplicationData(branchSession.getApplicationData());
+            request.setBranchType(branchSession.getBranchType());
+            return branchCommitSend(request, globalSession, branchSession);
+        } catch (IOException | TimeoutException e) {
+            throw new BranchTransactionException(FailedToSendBranchCommitRequest,
+                    String.format("Send branch commit failed, xid = %s branchId = %s", branchSession.getXid(),
+                            branchSession.getBranchId()), e);
+        }
+    }
+
+    protected BranchStatus branchCommitSend(BranchCommitRequest request, GlobalSession globalSession,
+                                            BranchSession branchSession) throws IOException, TimeoutException {
+
+        BranchCommitResponse response = (BranchCommitResponse) remotingServer.sendSyncRequest(
+            branchSession.getResourceId(), branchSession.getClientId(), request, branchSession.isAT());
+        return response.getBranchStatus();
+    }
+
+    @Override
+    public BranchStatus branchRollback(GlobalSession globalSession, BranchSession branchSession) throws TransactionException {
+        try {
+            BranchRollbackRequest request = new BranchRollbackRequest();
+            request.setXid(branchSession.getXid());
+            request.setBranchId(branchSession.getBranchId());
+            request.setResourceId(branchSession.getResourceId());
+            request.setApplicationData(branchSession.getApplicationData());
+            request.setBranchType(branchSession.getBranchType());
+            return branchRollbackSend(request, globalSession, branchSession);
+        } catch (IOException | TimeoutException e) {
+            throw new BranchTransactionException(FailedToSendBranchRollbackRequest,
+                    String.format("Send branch rollback failed, xid = %s branchId = %s",
+                            branchSession.getXid(), branchSession.getBranchId()), e);
+        }
+    }
+
+    protected BranchStatus branchRollbackSend(BranchRollbackRequest request, GlobalSession globalSession,
+                                              BranchSession branchSession) throws IOException, TimeoutException {
+
+        BranchRollbackResponse response = (BranchRollbackResponse) remotingServer.sendSyncRequest(
+            branchSession.getResourceId(), branchSession.getClientId(), request, branchSession.isAT());
+        return response.getBranchStatus();
+    }
+
+    @Override
+    public String begin(String applicationId, String transactionServiceGroup, String name, int timeout)
+            throws TransactionException {
+        return null;
+    }
+
+    @Override
+    public GlobalStatus commit(String xid) throws TransactionException {
+        return null;
+    }
+
+    @Override
+    public boolean doGlobalCommit(GlobalSession globalSession, boolean retrying) throws TransactionException {
+        return true;
+    }
+
+    @Override
+    public GlobalStatus globalReport(String xid, GlobalStatus globalStatus) throws TransactionException {
+        return null;
+    }
+
+    @Override
+    public GlobalStatus rollback(String xid) throws TransactionException {
+        return null;
+    }
+
+    @Override
+    public boolean doGlobalRollback(GlobalSession globalSession, boolean retrying) throws TransactionException {
+        return true;
+    }
+
+    @Override
+    public GlobalStatus getStatus(String xid) throws TransactionException {
+        return null;
+    }
+
+    @Override
+    public void doGlobalReport(GlobalSession globalSession, String xid, GlobalStatus globalStatus) throws TransactionException {
+
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/Core.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/Core.java
new file mode 100644
index 0000000..8ad19cb
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/Core.java
@@ -0,0 +1,59 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.coordinator;
+
+import io.seata.core.exception.TransactionException;
+import io.seata.core.model.GlobalStatus;
+import io.seata.server.session.GlobalSession;
+
+/**
+ * The interface Core.
+ *
+ * @author sharajava
+ */
+public interface Core extends TransactionCoordinatorInbound, TransactionCoordinatorOutbound {
+
+    /**
+     * Do global commit.
+     *
+     * @param globalSession the global session
+     * @param retrying      the retrying
+     * @return is global commit.
+     * @throws TransactionException the transaction exception
+     */
+    boolean doGlobalCommit(GlobalSession globalSession, boolean retrying) throws TransactionException;
+
+    /**
+     * Do global rollback.
+     *
+     * @param globalSession the global session
+     * @param retrying      the retrying
+     * @return is global rollback.
+     * @throws TransactionException the transaction exception
+     */
+    boolean doGlobalRollback(GlobalSession globalSession, boolean retrying) throws TransactionException;
+
+    /**
+     * Do global report.
+     *
+     * @param globalSession the global session
+     * @param xid           Transaction id.
+     * @param param         the global status
+     * @throws TransactionException the transaction exception
+     */
+    void doGlobalReport(GlobalSession globalSession, String xid, GlobalStatus param) throws TransactionException;
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/DefaultCoordinator.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/DefaultCoordinator.java
new file mode 100644
index 0000000..910af84
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/DefaultCoordinator.java
@@ -0,0 +1,609 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.coordinator;
+
+import io.netty.channel.Channel;
+import io.seata.common.thread.NamedThreadFactory;
+import io.seata.common.util.CollectionUtils;
+import io.seata.config.ConfigurationFactory;
+import io.seata.core.constants.ConfigurationKeys;
+import io.seata.core.context.RootContext;
+import io.seata.core.exception.TransactionException;
+import io.seata.core.model.GlobalStatus;
+import io.seata.core.protocol.AbstractMessage;
+import io.seata.core.protocol.AbstractResultMessage;
+import io.seata.core.protocol.transaction.*;
+import io.seata.core.rpc.Disposable;
+import io.seata.core.rpc.RemotingServer;
+import io.seata.core.rpc.RpcContext;
+import io.seata.core.rpc.TransactionMessageHandler;
+import io.seata.core.rpc.netty.ChannelManager;
+import io.seata.core.rpc.netty.NettyRemotingServer;
+import io.seata.server.AbstractTCInboundHandler;
+import io.seata.server.metrics.MetricsPublisher;
+import io.seata.server.session.*;
+import io.seata.server.store.StoreConfig;
+import org.apache.commons.lang.time.DateFormatUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.MDC;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import static io.seata.common.Constants.*;
+import static io.seata.common.DefaultValues.*;
+
+/**
+ * The type Default coordinator.
+ */
+public class DefaultCoordinator extends AbstractTCInboundHandler implements TransactionMessageHandler, Disposable {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultCoordinator.class);
+
+    private static final int TIMED_TASK_SHUTDOWN_MAX_WAIT_MILLS = 5000;
+
+    /**
+     * The constant COMMITTING_RETRY_PERIOD.
+     */
+    protected static final long COMMITTING_RETRY_PERIOD = CONFIG.getLong(ConfigurationKeys.COMMITING_RETRY_PERIOD,
+            DEFAULT_COMMITING_RETRY_PERIOD);
+
+    /**
+     * The constant ASYNC_COMMITTING_RETRY_PERIOD.
+     */
+    protected static final long ASYNC_COMMITTING_RETRY_PERIOD = CONFIG.getLong(
+            ConfigurationKeys.ASYNC_COMMITING_RETRY_PERIOD, DEFAULT_ASYNC_COMMITTING_RETRY_PERIOD);
+
+    /**
+     * The constant ROLLBACKING_RETRY_PERIOD.
+     */
+    protected static final long ROLLBACKING_RETRY_PERIOD = CONFIG.getLong(ConfigurationKeys.ROLLBACKING_RETRY_PERIOD,
+            DEFAULT_ROLLBACKING_RETRY_PERIOD);
+
+    /**
+     * The constant TIMEOUT_RETRY_PERIOD.
+     */
+    protected static final long TIMEOUT_RETRY_PERIOD = CONFIG.getLong(ConfigurationKeys.TIMEOUT_RETRY_PERIOD,
+            DEFAULT_TIMEOUT_RETRY_PERIOD);
+
+    /**
+     * The Transaction undo log delete period.
+     */
+    protected static final long UNDO_LOG_DELETE_PERIOD = CONFIG.getLong(
+            ConfigurationKeys.TRANSACTION_UNDO_LOG_DELETE_PERIOD, DEFAULT_UNDO_LOG_DELETE_PERIOD);
+
+    /**
+     * The Transaction undo log delay delete period
+     */
+    protected static final long UNDO_LOG_DELAY_DELETE_PERIOD = 3 * 60 * 1000;
+
+    private static final int ALWAYS_RETRY_BOUNDARY = 0;
+
+    /**
+     * default branch async queue size
+     */
+    private static final int DEFAULT_BRANCH_ASYNC_QUEUE_SIZE = 5000;
+
+    /**
+     * the pool size of branch asynchronous remove thread pool
+     */
+    private static final int BRANCH_ASYNC_POOL_SIZE = Runtime.getRuntime().availableProcessors() * 2;
+
+    private static final long MAX_COMMIT_RETRY_TIMEOUT = ConfigurationFactory.getInstance().getLong(
+            ConfigurationKeys.MAX_COMMIT_RETRY_TIMEOUT, DEFAULT_MAX_COMMIT_RETRY_TIMEOUT);
+
+    private static final long MAX_ROLLBACK_RETRY_TIMEOUT = ConfigurationFactory.getInstance().getLong(
+            ConfigurationKeys.MAX_ROLLBACK_RETRY_TIMEOUT, DEFAULT_MAX_ROLLBACK_RETRY_TIMEOUT);
+
+    private static final boolean ROLLBACK_RETRY_TIMEOUT_UNLOCK_ENABLE = ConfigurationFactory.getInstance().getBoolean(
+            ConfigurationKeys.ROLLBACK_RETRY_TIMEOUT_UNLOCK_ENABLE, DEFAULT_ROLLBACK_RETRY_TIMEOUT_UNLOCK_ENABLE);
+
+    private final ScheduledThreadPoolExecutor retryRollbacking =
+        new ScheduledThreadPoolExecutor(1, new NamedThreadFactory(RETRY_ROLLBACKING, 1));
+
+    private final ScheduledThreadPoolExecutor retryCommitting =
+        new ScheduledThreadPoolExecutor(1, new NamedThreadFactory(RETRY_COMMITTING, 1));
+
+    private final ScheduledThreadPoolExecutor asyncCommitting =
+        new ScheduledThreadPoolExecutor(1, new NamedThreadFactory(ASYNC_COMMITTING, 1));
+
+    private final ScheduledThreadPoolExecutor timeoutCheck =
+        new ScheduledThreadPoolExecutor(1, new NamedThreadFactory(TX_TIMEOUT_CHECK, 1));
+
+    private final ScheduledThreadPoolExecutor undoLogDelete =
+        new ScheduledThreadPoolExecutor(1, new NamedThreadFactory(UNDOLOG_DELETE, 1));
+
+    private final GlobalStatus[] rollbackingStatuses = new GlobalStatus[] {GlobalStatus.TimeoutRollbacking,
+        GlobalStatus.TimeoutRollbackRetrying, GlobalStatus.RollbackRetrying, GlobalStatus.Rollbacking};
+
+    private final GlobalStatus[] retryCommittingStatuses = new GlobalStatus[] {GlobalStatus.Committing, GlobalStatus.CommitRetrying, GlobalStatus.Committed};
+
+    private final ThreadPoolExecutor branchRemoveExecutor;
+
+    private RemotingServer remotingServer;
+
+    private final DefaultCore core;
+
+    private static volatile DefaultCoordinator instance;
+
+    /**
+     * Instantiates a new Default coordinator.
+     *
+     * @param remotingServer the remoting server
+     */
+    private DefaultCoordinator(RemotingServer remotingServer) {
+        if (remotingServer == null) {
+            throw new IllegalArgumentException("RemotingServer not allowed be null.");
+        }
+        this.remotingServer = remotingServer;
+        this.core = new DefaultCore(remotingServer);
+        boolean enableBranchAsyncRemove = CONFIG.getBoolean(
+                ConfigurationKeys.ENABLE_BRANCH_ASYNC_REMOVE, DEFAULT_ENABLE_BRANCH_ASYNC_REMOVE);
+        // create branchRemoveExecutor
+        if (enableBranchAsyncRemove && StoreConfig.getSessionMode() != StoreConfig.SessionMode.FILE) {
+            branchRemoveExecutor = new ThreadPoolExecutor(BRANCH_ASYNC_POOL_SIZE, BRANCH_ASYNC_POOL_SIZE,
+                    Integer.MAX_VALUE, TimeUnit.MILLISECONDS,
+                    new ArrayBlockingQueue<>(
+                            CONFIG.getInt(ConfigurationKeys.SESSION_BRANCH_ASYNC_QUEUE_SIZE, DEFAULT_BRANCH_ASYNC_QUEUE_SIZE)
+                    ), new NamedThreadFactory("branchSessionRemove", BRANCH_ASYNC_POOL_SIZE),
+                    new ThreadPoolExecutor.CallerRunsPolicy());
+        } else {
+            branchRemoveExecutor = null;
+        }
+    }
+
+    public static DefaultCoordinator getInstance(RemotingServer remotingServer) {
+        if (null == instance) {
+            synchronized (DefaultCoordinator.class) {
+                if (null == instance) {
+                    instance = new DefaultCoordinator(remotingServer);
+                }
+            }
+        }
+        return instance;
+    }
+
+    public static DefaultCoordinator getInstance() {
+        if (null == instance) {
+            throw new IllegalArgumentException("The instance has not been created.");
+        }
+        return instance;
+    }
+
+    /**
+     * Asynchronous remove branch
+     *
+     * @param globalSession the globalSession
+     * @param branchSession the branchSession
+     */
+    public void doBranchRemoveAsync(GlobalSession globalSession, BranchSession branchSession) {
+        if (globalSession == null) {
+            return;
+        }
+        branchRemoveExecutor.execute(new BranchRemoveTask(globalSession, branchSession));
+    }
+
+    /**
+     * Asynchronous remove all branch
+     *
+     * @param globalSession the globalSession
+     */
+    public void doBranchRemoveAllAsync(GlobalSession globalSession) {
+        if (globalSession == null) {
+            return;
+        }
+        branchRemoveExecutor.execute(new BranchRemoveTask(globalSession));
+    }
+
+    @Override
+    protected void doGlobalBegin(GlobalBeginRequest request, GlobalBeginResponse response, RpcContext rpcContext)
+            throws TransactionException {
+        response.setXid(core.begin(rpcContext.getApplicationId(), rpcContext.getTransactionServiceGroup(),
+                request.getTransactionName(), request.getTimeout()));
+        if (LOGGER.isInfoEnabled()) {
+            LOGGER.info("Begin new global transaction applicationId: {},transactionServiceGroup: {}, transactionName: {},timeout:{},xid:{}",
+                    rpcContext.getApplicationId(), rpcContext.getTransactionServiceGroup(), request.getTransactionName(), request.getTimeout(), response.getXid());
+        }
+    }
+
+    @Override
+    protected void doGlobalCommit(GlobalCommitRequest request, GlobalCommitResponse response, RpcContext rpcContext)
+            throws TransactionException {
+        MDC.put(RootContext.MDC_KEY_XID, request.getXid());
+        response.setGlobalStatus(core.commit(request.getXid()));
+    }
+
+    @Override
+    protected void doGlobalRollback(GlobalRollbackRequest request, GlobalRollbackResponse response,
+                                    RpcContext rpcContext) throws TransactionException {
+        MDC.put(RootContext.MDC_KEY_XID, request.getXid());
+        response.setGlobalStatus(core.rollback(request.getXid()));
+    }
+
+    @Override
+    protected void doGlobalStatus(GlobalStatusRequest request, GlobalStatusResponse response, RpcContext rpcContext)
+            throws TransactionException {
+        MDC.put(RootContext.MDC_KEY_XID, request.getXid());
+        response.setGlobalStatus(core.getStatus(request.getXid()));
+    }
+
+    @Override
+    protected void doGlobalReport(GlobalReportRequest request, GlobalReportResponse response, RpcContext rpcContext)
+            throws TransactionException {
+        MDC.put(RootContext.MDC_KEY_XID, request.getXid());
+        response.setGlobalStatus(core.globalReport(request.getXid(), request.getGlobalStatus()));
+    }
+
+    @Override
+    protected void doBranchRegister(BranchRegisterRequest request, BranchRegisterResponse response,
+                                    RpcContext rpcContext) throws TransactionException {
+        MDC.put(RootContext.MDC_KEY_XID, request.getXid());
+        response.setBranchId(
+                core.branchRegister(request.getBranchType(), request.getResourceId(), rpcContext.getClientId(),
+                        request.getXid(), request.getApplicationData(), request.getLockKey()));
+    }
+
+    @Override
+    protected void doBranchReport(BranchReportRequest request, BranchReportResponse response, RpcContext rpcContext)
+            throws TransactionException {
+        MDC.put(RootContext.MDC_KEY_XID, request.getXid());
+        MDC.put(RootContext.MDC_KEY_BRANCH_ID, String.valueOf(request.getBranchId()));
+        core.branchReport(request.getBranchType(), request.getXid(), request.getBranchId(), request.getStatus(),
+                request.getApplicationData());
+    }
+
+    @Override
+    protected void doLockCheck(GlobalLockQueryRequest request, GlobalLockQueryResponse response, RpcContext rpcContext)
+            throws TransactionException {
+        MDC.put(RootContext.MDC_KEY_XID, request.getXid());
+        response.setLockable(
+                core.lockQuery(request.getBranchType(), request.getResourceId(), request.getXid(), request.getLockKey()));
+    }
+
+    /**
+     * Timeout check.
+     */
+    protected void timeoutCheck() {
+        SessionCondition sessionCondition = new SessionCondition(GlobalStatus.Begin);
+        sessionCondition.setLazyLoadBranch(true);
+        Collection<GlobalSession> beginGlobalsessions =
+            SessionHolder.getRootSessionManager().findGlobalSessions(sessionCondition);
+        if (CollectionUtils.isEmpty(beginGlobalsessions)) {
+            return;
+        }
+        if (!beginGlobalsessions.isEmpty() && LOGGER.isDebugEnabled()) {
+            LOGGER.debug("Global transaction timeout check begin, size: {}", beginGlobalsessions.size());
+        }
+        SessionHelper.forEach(beginGlobalsessions, globalSession -> {
+            if (LOGGER.isDebugEnabled()) {
+                LOGGER.debug(
+                        globalSession.getXid() + " " + globalSession.getStatus() + " " + globalSession.getBeginTime() + " "
+                                + globalSession.getTimeout());
+            }
+            SessionHolder.lockAndExecute(globalSession, () -> {
+                if (globalSession.getStatus() != GlobalStatus.Begin || !globalSession.isTimeout()) {
+                    return false;
+                }
+
+                LOGGER.warn("Global transaction[{}] is timeout and will be rollback,transaction begin time:{} and now:{}", globalSession.getXid(),
+                    DateFormatUtils.ISO_DATE_FORMAT.format(globalSession.getBeginTime()), DateFormatUtils.ISO_DATE_FORMAT.format(System.currentTimeMillis()));
+
+                globalSession.addSessionLifecycleListener(SessionHolder.getRootSessionManager());
+                globalSession.close();
+                globalSession.setStatus(GlobalStatus.TimeoutRollbacking);
+
+                globalSession.addSessionLifecycleListener(SessionHolder.getRetryRollbackingSessionManager());
+                SessionHolder.getRetryRollbackingSessionManager().addGlobalSession(globalSession);
+
+                // transaction timeout and start rollbacking event
+                MetricsPublisher.postSessionDoingEvent(globalSession, GlobalStatus.TimeoutRollbacking.name(), false, false);
+
+                return true;
+            });
+        });
+        if (!beginGlobalsessions.isEmpty() && LOGGER.isDebugEnabled()) {
+            LOGGER.debug("Global transaction timeout check end. ");
+        }
+
+    }
+
+
+    /**
+     * Handle retry rollbacking.
+     */
+    protected void handleRetryRollbacking() {
+        SessionCondition sessionCondition = new SessionCondition(rollbackingStatuses);
+        sessionCondition.setLazyLoadBranch(true);
+        Collection<GlobalSession> rollbackingSessions =
+            SessionHolder.getRetryRollbackingSessionManager().findGlobalSessions(sessionCondition);
+        if (CollectionUtils.isEmpty(rollbackingSessions)) {
+            return;
+        }
+        long now = System.currentTimeMillis();
+        SessionHelper.forEach(rollbackingSessions, rollbackingSession -> {
+            try {
+                // prevent repeated rollback
+                if (rollbackingSession.getStatus() == GlobalStatus.Rollbacking
+                    && !rollbackingSession.isDeadSession()) {
+                    // The function of this 'return' is 'continue'.
+                    return;
+                }
+                if (isRetryTimeout(now, MAX_ROLLBACK_RETRY_TIMEOUT, rollbackingSession.getBeginTime())) {
+                    if (ROLLBACK_RETRY_TIMEOUT_UNLOCK_ENABLE) {
+                        rollbackingSession.clean();
+                    }
+
+                    SessionHelper.endRollbackFailed(rollbackingSession, true, true);
+
+                    //The function of this 'return' is 'continue'.
+                    return;
+                }
+                rollbackingSession.addSessionLifecycleListener(SessionHolder.getRootSessionManager());
+                core.doGlobalRollback(rollbackingSession, true);
+            } catch (TransactionException ex) {
+                LOGGER.error("Failed to retry rollbacking [{}] {} {}", rollbackingSession.getXid(), ex.getCode(), ex.getMessage());
+            }
+        });
+    }
+
+    /**
+     * Handle retry committing.
+     */
+    protected void handleRetryCommitting() {
+        SessionCondition retryCommittingSessionCondition = new SessionCondition(retryCommittingStatuses);
+        retryCommittingSessionCondition.setLazyLoadBranch(true);
+        Collection<GlobalSession> committingSessions =
+            SessionHolder.getRetryCommittingSessionManager().findGlobalSessions(retryCommittingSessionCondition);
+        if (CollectionUtils.isEmpty(committingSessions)) {
+            return;
+        }
+        long now = System.currentTimeMillis();
+        SessionHelper.forEach(committingSessions, committingSession -> {
+            try {
+                // prevent repeated commit
+                if (GlobalStatus.Committing.equals(committingSession.getStatus()) && !committingSession.isDeadSession()) {
+                    // The function of this 'return' is 'continue'.
+                    return;
+                }
+                if (isRetryTimeout(now, MAX_COMMIT_RETRY_TIMEOUT, committingSession.getBeginTime())) {
+
+                    // commit retry timeout event
+                    SessionHelper.endCommitFailed(committingSession, true, true);
+
+                    //The function of this 'return' is 'continue'.
+                    return;
+                }
+                if (GlobalStatus.Committed.equals(committingSession.getStatus())
+                    && committingSession.getBranchSessions().isEmpty()) {
+                    SessionHelper.endCommitted(committingSession,true);
+                }
+                committingSession.addSessionLifecycleListener(SessionHolder.getRootSessionManager());
+                core.doGlobalCommit(committingSession, true);
+            } catch (TransactionException ex) {
+                LOGGER.error("Failed to retry committing [{}] {} {}", committingSession.getXid(), ex.getCode(), ex.getMessage());
+            }
+        });
+    }
+
+    /**
+     * Handle async committing.
+     */
+    protected void handleAsyncCommitting() {
+        SessionCondition sessionCondition = new SessionCondition(GlobalStatus.AsyncCommitting);
+        Collection<GlobalSession> asyncCommittingSessions =
+                SessionHolder.getAsyncCommittingSessionManager().findGlobalSessions(sessionCondition);
+        if (CollectionUtils.isEmpty(asyncCommittingSessions)) {
+            return;
+        }
+        SessionHelper.forEach(asyncCommittingSessions, asyncCommittingSession -> {
+            try {
+                asyncCommittingSession.addSessionLifecycleListener(SessionHolder.getRootSessionManager());
+                core.doGlobalCommit(asyncCommittingSession, true);
+            } catch (TransactionException ex) {
+                LOGGER.error("Failed to async committing [{}] {} {}", asyncCommittingSession.getXid(), ex.getCode(), ex.getMessage(), ex);
+            }
+        });
+    }
+
+    /**
+     * Undo log delete.
+     */
+    protected void undoLogDelete() {
+        Map<String, Channel> rmChannels = ChannelManager.getRmChannels();
+        if (rmChannels == null || rmChannels.isEmpty()) {
+            if (LOGGER.isDebugEnabled()) {
+                LOGGER.debug("no active rm channels to delete undo log");
+            }
+            return;
+        }
+        short saveDays = CONFIG.getShort(ConfigurationKeys.TRANSACTION_UNDO_LOG_SAVE_DAYS,
+                UndoLogDeleteRequest.DEFAULT_SAVE_DAYS);
+        for (Map.Entry<String, Channel> channelEntry : rmChannels.entrySet()) {
+            String resourceId = channelEntry.getKey();
+            UndoLogDeleteRequest deleteRequest = new UndoLogDeleteRequest();
+            deleteRequest.setResourceId(resourceId);
+            deleteRequest.setSaveDays(saveDays > 0 ? saveDays : UndoLogDeleteRequest.DEFAULT_SAVE_DAYS);
+            try {
+                remotingServer.sendAsyncRequest(channelEntry.getValue(), deleteRequest);
+            } catch (Exception e) {
+                LOGGER.error("Failed to async delete undo log resourceId = {}, exception: {}", resourceId, e.getMessage());
+            }
+        }
+    }
+
+    private boolean isRetryTimeout(long now, long timeout, long beginTime) {
+        return timeout >= ALWAYS_RETRY_BOUNDARY && now - beginTime > timeout;
+    }
+
+    /**
+     * Init.
+     */
+    public void init() {
+        retryRollbacking.scheduleAtFixedRate(
+            () -> SessionHolder.distributedLockAndExecute(RETRY_ROLLBACKING, this::handleRetryRollbacking), 0,
+            ROLLBACKING_RETRY_PERIOD, TimeUnit.MILLISECONDS);
+
+        retryCommitting.scheduleAtFixedRate(
+            () -> SessionHolder.distributedLockAndExecute(RETRY_COMMITTING, this::handleRetryCommitting), 0,
+            COMMITTING_RETRY_PERIOD, TimeUnit.MILLISECONDS);
+
+        asyncCommitting.scheduleAtFixedRate(
+            () -> SessionHolder.distributedLockAndExecute(ASYNC_COMMITTING, this::handleAsyncCommitting), 0,
+            ASYNC_COMMITTING_RETRY_PERIOD, TimeUnit.MILLISECONDS);
+
+        timeoutCheck.scheduleAtFixedRate(
+            () -> SessionHolder.distributedLockAndExecute(TX_TIMEOUT_CHECK, this::timeoutCheck), 0,
+            TIMEOUT_RETRY_PERIOD, TimeUnit.MILLISECONDS);
+
+        undoLogDelete.scheduleAtFixedRate(
+            () -> SessionHolder.distributedLockAndExecute(UNDOLOG_DELETE, this::undoLogDelete),
+            UNDO_LOG_DELAY_DELETE_PERIOD, UNDO_LOG_DELETE_PERIOD, TimeUnit.MILLISECONDS);
+    }
+
+    @Override
+    public AbstractResultMessage onRequest(AbstractMessage request, RpcContext context) {
+        if (!(request instanceof AbstractTransactionRequestToTC)) {
+            throw new IllegalArgumentException();
+        }
+        AbstractTransactionRequestToTC transactionRequest = (AbstractTransactionRequestToTC) request;
+        transactionRequest.setTCInboundHandler(this);
+
+        return transactionRequest.handle(context);
+    }
+
+    @Override
+    public void onResponse(AbstractResultMessage response, RpcContext context) {
+        if (!(response instanceof AbstractTransactionResponse)) {
+            throw new IllegalArgumentException();
+        }
+
+    }
+
+    @Override
+    public void destroy() {
+        // 1. first shutdown timed task
+        retryRollbacking.shutdown();
+        retryCommitting.shutdown();
+        asyncCommitting.shutdown();
+        timeoutCheck.shutdown();
+        undoLogDelete.shutdown();
+        if (branchRemoveExecutor != null) {
+            branchRemoveExecutor.shutdown();
+        }
+        try {
+            retryRollbacking.awaitTermination(TIMED_TASK_SHUTDOWN_MAX_WAIT_MILLS, TimeUnit.MILLISECONDS);
+            retryCommitting.awaitTermination(TIMED_TASK_SHUTDOWN_MAX_WAIT_MILLS, TimeUnit.MILLISECONDS);
+            asyncCommitting.awaitTermination(TIMED_TASK_SHUTDOWN_MAX_WAIT_MILLS, TimeUnit.MILLISECONDS);
+            timeoutCheck.awaitTermination(TIMED_TASK_SHUTDOWN_MAX_WAIT_MILLS, TimeUnit.MILLISECONDS);
+            undoLogDelete.awaitTermination(TIMED_TASK_SHUTDOWN_MAX_WAIT_MILLS, TimeUnit.MILLISECONDS);
+            if (branchRemoveExecutor != null) {
+                branchRemoveExecutor.awaitTermination(TIMED_TASK_SHUTDOWN_MAX_WAIT_MILLS, TimeUnit.MILLISECONDS);
+            }
+        } catch (InterruptedException ignore) {
+
+        }
+        // 2. second close netty flow
+        if (remotingServer instanceof NettyRemotingServer) {
+            ((NettyRemotingServer) remotingServer).destroy();
+        }
+        // 3. third destroy SessionHolder
+        SessionHolder.destroy();
+        instance = null;
+    }
+
+    /**
+     * only used for mock test
+     * @param remotingServer
+     */
+    public void setRemotingServer(RemotingServer remotingServer) {
+        this.remotingServer = remotingServer;
+    }
+
+    /**
+     * the task to remove branchSession
+     */
+    static class BranchRemoveTask implements Runnable {
+
+        /**
+         * the globalSession
+         */
+        private final GlobalSession globalSession;
+
+        /**
+         * the branchSession
+         */
+        private final BranchSession branchSession;
+
+        /**
+         * If you use this construct, the task will remove the branchSession provided by the parameter
+         * @param globalSession the globalSession
+         */
+        public BranchRemoveTask(GlobalSession globalSession, BranchSession branchSession) {
+            this.globalSession = globalSession;
+            if (branchSession == null) {
+                throw new IllegalArgumentException("BranchSession can`t be null!");
+            }
+            this.branchSession = branchSession;
+        }
+
+        /**
+         * If you use this construct, the task will remove all branchSession
+         * @param globalSession the globalSession
+         */
+        public BranchRemoveTask(GlobalSession globalSession) {
+            this.globalSession = globalSession;
+            this.branchSession = null;
+        }
+
+        @Override
+        public void run() {
+            if (globalSession == null) {
+                return;
+            }
+            try {
+                MDC.put(RootContext.MDC_KEY_XID, globalSession.getXid());
+                if (branchSession != null) {
+                    doRemove(branchSession);
+                } else {
+                    globalSession.getSortedBranches().forEach(this::doRemove);
+                }
+            } catch (Exception unKnowException) {
+                LOGGER.error("Asynchronous delete branchSession error, xid = {}", globalSession.getXid(), unKnowException);
+            } finally {
+                MDC.remove(RootContext.MDC_KEY_XID);
+            }
+        }
+
+        private void doRemove(BranchSession bt) {
+            try {
+                MDC.put(RootContext.MDC_KEY_BRANCH_ID, String.valueOf(bt.getBranchId()));
+                globalSession.removeBranch(bt);
+                LOGGER.info("Asynchronous delete branchSession successfully, xid = {}, branchId = {}",
+                        globalSession.getXid(), bt.getBranchId());
+            } catch (TransactionException transactionException) {
+                LOGGER.error("Asynchronous delete branchSession error, xid = {}, branchId = {}",
+                        globalSession.getXid(), bt.getBranchId(), transactionException);
+            } finally {
+                MDC.remove(RootContext.MDC_KEY_BRANCH_ID);
+            }
+        }
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/DefaultCore.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/DefaultCore.java
new file mode 100644
index 0000000..bfd5271
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/DefaultCore.java
@@ -0,0 +1,399 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.coordinator;
+
+import io.seata.common.DefaultValues;
+import io.seata.common.exception.NotSupportYetException;
+import io.seata.common.loader.EnhancedServiceLoader;
+import io.seata.common.util.CollectionUtils;
+import io.seata.config.ConfigurationFactory;
+import io.seata.core.context.RootContext;
+import io.seata.core.exception.TransactionException;
+import io.seata.core.logger.StackTraceLogger;
+import io.seata.core.model.BranchStatus;
+import io.seata.core.model.BranchType;
+import io.seata.core.model.GlobalStatus;
+import io.seata.core.rpc.RemotingServer;
+import io.seata.server.metrics.MetricsPublisher;
+import io.seata.server.session.BranchSession;
+import io.seata.server.session.GlobalSession;
+import io.seata.server.session.SessionHelper;
+import io.seata.server.session.SessionHolder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.MDC;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import static io.seata.core.constants.ConfigurationKeys.XAER_NOTA_RETRY_TIMEOUT;
+import static io.seata.server.session.BranchSessionHandler.CONTINUE;
+
+/**
+ * The type Default core.
+ *
+ * @author sharajava
+ */
+public class DefaultCore implements Core {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultCore.class);
+
+    private static final int RETRY_XAER_NOTA_TIMEOUT = ConfigurationFactory.getInstance().getInt(XAER_NOTA_RETRY_TIMEOUT,
+            DefaultValues.DEFAULT_XAER_NOTA_RETRY_TIMEOUT);
+
+    private static Map<BranchType, AbstractCore> coreMap = new ConcurrentHashMap<>();
+
+    /**
+     * get the Default core.
+     *
+     * @param remotingServer the remoting server
+     */
+    public DefaultCore(RemotingServer remotingServer) {
+        List<AbstractCore> allCore = EnhancedServiceLoader.loadAll(AbstractCore.class,
+            new Class[] {RemotingServer.class}, new Object[] {remotingServer});
+        if (CollectionUtils.isNotEmpty(allCore)) {
+            for (AbstractCore core : allCore) {
+                coreMap.put(core.getHandleBranchType(), core);
+            }
+        }
+    }
+
+    /**
+     * get core
+     *
+     * @param branchType the branchType
+     * @return the core
+     */
+    public AbstractCore getCore(BranchType branchType) {
+        AbstractCore core = coreMap.get(branchType);
+        if (core == null) {
+            throw new NotSupportYetException("unsupported type:" + branchType.name());
+        }
+        return core;
+    }
+
+    /**
+     * only for mock
+     *
+     * @param branchType the branchType
+     * @param core       the core
+     */
+    public void mockCore(BranchType branchType, AbstractCore core) {
+        coreMap.put(branchType, core);
+    }
+
+    @Override
+    public Long branchRegister(BranchType branchType, String resourceId, String clientId, String xid,
+                               String applicationData, String lockKeys) throws TransactionException {
+        return getCore(branchType).branchRegister(branchType, resourceId, clientId, xid,
+            applicationData, lockKeys);
+    }
+
+    @Override
+    public void branchReport(BranchType branchType, String xid, long branchId, BranchStatus status,
+                             String applicationData) throws TransactionException {
+        getCore(branchType).branchReport(branchType, xid, branchId, status, applicationData);
+    }
+
+    @Override
+    public boolean lockQuery(BranchType branchType, String resourceId, String xid, String lockKeys)
+        throws TransactionException {
+        return getCore(branchType).lockQuery(branchType, resourceId, xid, lockKeys);
+    }
+
+    @Override
+    public BranchStatus branchCommit(GlobalSession globalSession, BranchSession branchSession) throws TransactionException {
+        return getCore(branchSession.getBranchType()).branchCommit(globalSession, branchSession);
+    }
+
+    @Override
+    public BranchStatus branchRollback(GlobalSession globalSession, BranchSession branchSession) throws TransactionException {
+        return getCore(branchSession.getBranchType()).branchRollback(globalSession, branchSession);
+    }
+
+    @Override
+    public String begin(String applicationId, String transactionServiceGroup, String name, int timeout)
+        throws TransactionException {
+        GlobalSession session = GlobalSession.createGlobalSession(applicationId, transactionServiceGroup, name, timeout);
+        MDC.put(RootContext.MDC_KEY_XID, session.getXid());
+        session.addSessionLifecycleListener(SessionHolder.getRootSessionManager());
+
+        session.begin();
+
+        // transaction start event
+        MetricsPublisher.postSessionDoingEvent(session, false);
+
+        return session.getXid();
+    }
+
+
+
+    @Override
+    public GlobalStatus commit(String xid) throws TransactionException {
+        GlobalSession globalSession = SessionHolder.findGlobalSession(xid);
+        if (globalSession == null) {
+            return GlobalStatus.Finished;
+        }
+
+        if (globalSession.isTimeout()) {
+            LOGGER.info("TC detected timeout, xid = {}", globalSession.getXid());
+            return GlobalStatus.TimeoutRollbacking;
+        }
+
+        globalSession.addSessionLifecycleListener(SessionHolder.getRootSessionManager());
+        // just lock changeStatus
+
+        boolean shouldCommit = SessionHolder.lockAndExecute(globalSession, () -> {
+            if (globalSession.getStatus() == GlobalStatus.Begin) {
+                // Highlight: Firstly, close the session, then no more branch can be registered.
+                globalSession.closeAndClean();
+                if (globalSession.canBeCommittedAsync()) {
+                    globalSession.asyncCommit();
+                    MetricsPublisher.postSessionDoneEvent(globalSession, GlobalStatus.Committed, false, false);
+                    return false;
+                } else {
+                    globalSession.changeGlobalStatus(GlobalStatus.Committing);
+                    return true;
+                }
+            }
+            return false;
+        });
+
+        if (shouldCommit) {
+            boolean success = doGlobalCommit(globalSession, false);
+            //If successful and all remaining branches can be committed asynchronously, do async commit.
+            if (success && globalSession.hasBranch() && globalSession.canBeCommittedAsync()) {
+                globalSession.asyncCommit();
+                return GlobalStatus.Committed;
+            } else {
+                return globalSession.getStatus();
+            }
+        } else {
+            return globalSession.getStatus() == GlobalStatus.AsyncCommitting ? GlobalStatus.Committed : globalSession.getStatus();
+        }
+    }
+
+    @Override
+    public boolean doGlobalCommit(GlobalSession globalSession, boolean retrying) throws TransactionException {
+        boolean success = true;
+        // start committing event
+        MetricsPublisher.postSessionDoingEvent(globalSession, retrying);
+
+        if (globalSession.isSaga()) {
+            success = getCore(BranchType.SAGA).doGlobalCommit(globalSession, retrying);
+        } else {
+            Boolean result = SessionHelper.forEach(globalSession.getSortedBranches(), branchSession -> {
+                // if not retrying, skip the canBeCommittedAsync branches
+                if (!retrying && branchSession.canBeCommittedAsync()) {
+                    return CONTINUE;
+                }
+
+                BranchStatus currentStatus = branchSession.getStatus();
+                if (currentStatus == BranchStatus.PhaseOne_Failed) {
+                    SessionHelper.removeBranch(globalSession, branchSession, !retrying);
+                    return CONTINUE;
+                }
+                try {
+                    BranchStatus branchStatus = getCore(branchSession.getBranchType()).branchCommit(globalSession, branchSession);
+                    if (isXaerNotaTimeout(globalSession,branchStatus)) {
+                        LOGGER.info("Commit branch XAER_NOTA retry timeout, xid = {} branchId = {}", globalSession.getXid(), branchSession.getBranchId());
+                        branchStatus = BranchStatus.PhaseTwo_Committed;
+                    }
+                    switch (branchStatus) {
+                        case PhaseTwo_Committed:
+                            SessionHelper.removeBranch(globalSession, branchSession, !retrying);
+                            LOGGER.info("Commit branch transaction successfully, xid = {} branchId = {}", globalSession.getXid(), branchSession.getBranchId());
+                            return CONTINUE;
+                        case PhaseTwo_CommitFailed_Unretryable:
+                            //not at branch
+                            SessionHelper.endCommitFailed(globalSession, retrying);
+                            LOGGER.error("Committing global transaction[{}] finally failed, caused by branch transaction[{}] commit failed.", globalSession.getXid(), branchSession.getBranchId());
+                            return false;
+
+                        default:
+                            if (!retrying) {
+                                globalSession.queueToRetryCommit();
+                                return false;
+                            }
+                            if (globalSession.canBeCommittedAsync()) {
+                                LOGGER.error("Committing branch transaction[{}], status:{} and will retry later",
+                                    branchSession.getBranchId(), branchStatus);
+                                return CONTINUE;
+                            } else {
+                                LOGGER.error(
+                                    "Committing global transaction[{}] failed, caused by branch transaction[{}] commit failed, will retry later.", globalSession.getXid(), branchSession.getBranchId());
+                                return false;
+                            }
+                    }
+                } catch (Exception ex) {
+                    StackTraceLogger.error(LOGGER, ex, "Committing branch transaction exception: {}",
+                        new String[] {branchSession.toString()});
+                    if (!retrying) {
+                        globalSession.queueToRetryCommit();
+                        throw new TransactionException(ex);
+                    }
+                }
+                return CONTINUE;
+            });
+            // Return if the result is not null
+            if (result != null) {
+                return result;
+            }
+            //If has branch and not all remaining branches can be committed asynchronously,
+            //do print log and return false
+            if (globalSession.hasBranch() && !globalSession.canBeCommittedAsync()) {
+                LOGGER.info("Committing global transaction is NOT done, xid = {}.", globalSession.getXid());
+                return false;
+            }
+        }
+        // if it succeeds and there is no branch, retrying=true is the asynchronous state when retrying. EndCommitted is
+        // executed to improve concurrency performance, and the global transaction ends..
+        if (success && globalSession.getBranchSessions().isEmpty()) {
+            if (!retrying) {
+                //contains not AT branch
+                globalSession.setStatus(GlobalStatus.Committed);
+            }
+            SessionHelper.endCommitted(globalSession, retrying);
+            LOGGER.info("Committing global transaction is successfully done, xid = {}.", globalSession.getXid());
+        }
+        return success;
+    }
+
+    @Override
+    public GlobalStatus rollback(String xid) throws TransactionException {
+        GlobalSession globalSession = SessionHolder.findGlobalSession(xid);
+        if (globalSession == null) {
+            return GlobalStatus.Finished;
+        }
+        globalSession.addSessionLifecycleListener(SessionHolder.getRootSessionManager());
+        // just lock changeStatus
+        boolean shouldRollBack = SessionHolder.lockAndExecute(globalSession, () -> {
+            globalSession.close(); // Highlight: Firstly, close the session, then no more branch can be registered.
+            if (globalSession.getStatus() == GlobalStatus.Begin) {
+                globalSession.changeGlobalStatus(GlobalStatus.Rollbacking);
+                return true;
+            }
+            return false;
+        });
+        if (!shouldRollBack) {
+            return globalSession.getStatus();
+        }
+
+        boolean rollbackSuccess = doGlobalRollback(globalSession, false);
+        return rollbackSuccess ? GlobalStatus.Rollbacked : globalSession.getStatus();
+    }
+
+    @Override
+    public boolean doGlobalRollback(GlobalSession globalSession, boolean retrying) throws TransactionException {
+        boolean success = true;
+        // start rollback event
+        MetricsPublisher.postSessionDoingEvent(globalSession, retrying);
+
+        if (globalSession.isSaga()) {
+            success = getCore(BranchType.SAGA).doGlobalRollback(globalSession, retrying);
+        } else {
+            Boolean result = SessionHelper.forEach(globalSession.getReverseSortedBranches(), branchSession -> {
+                BranchStatus currentBranchStatus = branchSession.getStatus();
+                if (currentBranchStatus == BranchStatus.PhaseOne_Failed) {
+                    SessionHelper.removeBranch(globalSession, branchSession, !retrying);
+                    return CONTINUE;
+                }
+                try {
+                    BranchStatus branchStatus = branchRollback(globalSession, branchSession);
+                    if (isXaerNotaTimeout(globalSession, branchStatus)) {
+                        LOGGER.info("Rollback branch XAER_NOTA retry timeout, xid = {} branchId = {}", globalSession.getXid(), branchSession.getBranchId());
+                        branchStatus = BranchStatus.PhaseTwo_Rollbacked;
+                    }
+                    switch (branchStatus) {
+                        case PhaseTwo_Rollbacked:
+                            SessionHelper.removeBranch(globalSession, branchSession, !retrying);
+                            LOGGER.info("Rollback branch transaction successfully, xid = {} branchId = {}", globalSession.getXid(), branchSession.getBranchId());
+                            return CONTINUE;
+                        case PhaseTwo_RollbackFailed_Unretryable:
+                            SessionHelper.endRollbackFailed(globalSession, retrying);
+                            LOGGER.error("Rollback branch transaction fail and stop retry, xid = {} branchId = {}", globalSession.getXid(), branchSession.getBranchId());
+                            return false;
+                        default:
+                            LOGGER.error("Rollback branch transaction fail and will retry, xid = {} branchId = {}", globalSession.getXid(), branchSession.getBranchId());
+                            if (!retrying) {
+                                globalSession.queueToRetryRollback();
+                            }
+                            return false;
+                    }
+                } catch (Exception ex) {
+                    StackTraceLogger.error(LOGGER, ex,
+                        "Rollback branch transaction exception, xid = {} branchId = {} exception = {}",
+                        new String[] {globalSession.getXid(), String.valueOf(branchSession.getBranchId()), ex.getMessage()});
+                    if (!retrying) {
+                        globalSession.queueToRetryRollback();
+                    }
+                    throw new TransactionException(ex);
+                }
+            });
+            // Return if the result is not null
+            if (result != null) {
+                return result;
+            }
+        }
+
+        // In db mode, lock and branch data residual problems may occur.
+        // Therefore, execution needs to be delayed here and cannot be executed synchronously.
+        if (success) {
+            SessionHelper.endRollbacked(globalSession, retrying);
+            LOGGER.info("Rollback global transaction successfully, xid = {}.", globalSession.getXid());
+        }
+        return success;
+    }
+
+    @Override
+    public GlobalStatus getStatus(String xid) throws TransactionException {
+        GlobalSession globalSession = SessionHolder.findGlobalSession(xid, false);
+        if (globalSession == null) {
+            return GlobalStatus.Finished;
+        } else {
+            return globalSession.getStatus();
+        }
+    }
+
+    @Override
+    public GlobalStatus globalReport(String xid, GlobalStatus globalStatus) throws TransactionException {
+        GlobalSession globalSession = SessionHolder.findGlobalSession(xid);
+        if (globalSession == null) {
+            return globalStatus;
+        }
+        globalSession.addSessionLifecycleListener(SessionHolder.getRootSessionManager());
+        doGlobalReport(globalSession, xid, globalStatus);
+        return globalSession.getStatus();
+    }
+
+    @Override
+    public void doGlobalReport(GlobalSession globalSession, String xid, GlobalStatus globalStatus) throws TransactionException {
+        if (globalSession.isSaga()) {
+            getCore(BranchType.SAGA).doGlobalReport(globalSession, xid, globalStatus);
+        }
+    }
+
+    private boolean isXaerNotaTimeout(GlobalSession globalSession, BranchStatus branchStatus) {
+        if (BranchStatus.PhaseTwo_CommitFailed_XAER_NOTA_Retryable.equals(branchStatus) ||
+                BranchStatus.PhaseTwo_RollbackFailed_XAER_NOTA_Retryable.equals(branchStatus)) {
+            return System.currentTimeMillis() > globalSession.getBeginTime() + globalSession.getTimeout() +
+                    Math.max(RETRY_XAER_NOTA_TIMEOUT, globalSession.getTimeout());
+        } else {
+            return false;
+        }
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/TransactionCoordinatorInbound.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/TransactionCoordinatorInbound.java
new file mode 100644
index 0000000..d8c9932
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/TransactionCoordinatorInbound.java
@@ -0,0 +1,29 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.coordinator;
+
+import io.seata.core.model.ResourceManagerOutbound;
+import io.seata.core.model.TransactionManager;
+
+/**
+ * receive inbound request from RM or TM.
+ *
+ * @author zhangchenghui.dev@gmail.com
+ * @since 1.1.0
+ */
+public interface TransactionCoordinatorInbound extends ResourceManagerOutbound, TransactionManager {
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/TransactionCoordinatorOutbound.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/TransactionCoordinatorOutbound.java
new file mode 100644
index 0000000..a213bd4
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/TransactionCoordinatorOutbound.java
@@ -0,0 +1,54 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.coordinator;
+
+import io.seata.core.exception.TransactionException;
+import io.seata.core.model.BranchStatus;
+import io.seata.server.session.BranchSession;
+import io.seata.server.session.GlobalSession;
+
+/**
+ * send outbound request to RM.
+ *
+ * @author zhangchenghui.dev@gmail.com
+ * @since 1.1.0
+ */
+public interface TransactionCoordinatorOutbound {
+
+    /**
+     * Commit a branch transaction.
+     *
+     * @param globalSession the global session
+     * @param branchSession the branch session
+     * @return Status of the branch after committing.
+     * @throws TransactionException Any exception that fails this will be wrapped with TransactionException and thrown
+     *                              out.
+     */
+    BranchStatus branchCommit(GlobalSession globalSession, BranchSession branchSession) throws TransactionException;
+
+    /**
+     * Rollback a branch transaction.
+     *
+     * @param globalSession the global session
+     * @param branchSession the branch session
+     * @return Status of the branch after rollbacking.
+     * @throws TransactionException Any exception that fails this will be wrapped with TransactionException and thrown
+     *                              out.
+     */
+    BranchStatus branchRollback(GlobalSession globalSession, BranchSession branchSession) throws TransactionException;
+
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/env/ContainerHelper.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/env/ContainerHelper.java
new file mode 100644
index 0000000..a95242d
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/env/ContainerHelper.java
@@ -0,0 +1,103 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.env;
+
+import io.seata.common.util.NumberUtils;
+import io.seata.common.util.StringUtils;
+
+import static io.seata.core.constants.ConfigurationKeys.ENV_SEATA_PORT_KEY;
+
+/**
+ * @author xingfudeshi@gmail.com
+ * @author wang.liang
+ */
+public class ContainerHelper {
+
+    private static final String C_GROUP_PATH = "/proc/1/cgroup";
+    private static final String DOCKER_PATH = "/docker";
+    private static final String KUBEPODS_PATH = "/kubepods";
+
+    private static final String ENV_SYSTEM_KEY = "SEATA_ENV";
+    private static final String ENV_SEATA_IP_KEY = "SEATA_IP";
+    private static final String ENV_SERVER_NODE_KEY = "SERVER_NODE";
+    private static final String ENV_STORE_MODE_KEY = "STORE_MODE";
+    private static final String ENV_LOCK_STORE_MODE_KEY = "LOCK_STORE_MODE";
+    private static final String ENV_SESSION_STORE_MODE_KEY = "SESSION_STORE_MODE";
+
+    /**
+     * Gets env from container.
+     *
+     * @return the env
+     */
+    public static String getEnv() {
+        return StringUtils.trimToNull(System.getenv(ENV_SYSTEM_KEY));
+    }
+
+    /**
+     * Gets host from container.
+     *
+     * @return the env
+     */
+    public static String getHost() {
+        return StringUtils.trimToNull(System.getenv(ENV_SEATA_IP_KEY));
+    }
+
+    /**
+     * Gets port from container.
+     *
+     * @return the env
+     */
+    public static int getPort() {
+        return NumberUtils.toInt(System.getenv(ENV_SEATA_PORT_KEY), 0);
+    }
+
+    /**
+     * Gets server node from container.
+     *
+     * @return the env
+     */
+    public static Long getServerNode() {
+        return NumberUtils.toLong(System.getenv(ENV_SERVER_NODE_KEY));
+    }
+
+    /**
+     * Gets store mode from container.
+     *
+     * @return the env
+     */
+    public static String getStoreMode() {
+        return StringUtils.trimToNull(System.getenv(ENV_STORE_MODE_KEY));
+    }
+
+    /**
+     * Gets session store mode from container.
+     *
+     * @return the env
+     */
+    public static String getSessionStoreMode() {
+        return StringUtils.trimToNull(System.getenv(ENV_SESSION_STORE_MODE_KEY));
+    }
+
+    /**
+     * Gets lock store mode from container.
+     *
+     * @return the env
+     */
+    public static String getLockStoreMode() {
+        return StringUtils.trimToNull(System.getenv(ENV_LOCK_STORE_MODE_KEY));
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/env/PortHelper.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/env/PortHelper.java
new file mode 100644
index 0000000..e3c2473
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/env/PortHelper.java
@@ -0,0 +1,130 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.env;
+
+import io.seata.common.util.CollectionUtils;
+import io.seata.common.util.MapUtil;
+import io.seata.common.util.NumberUtils;
+import io.seata.common.util.StringUtils;
+import org.springframework.util.ResourceUtils;
+import org.yaml.snakeyaml.Yaml;
+
+import java.io.*;
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * @author wang.liang
+ */
+public class PortHelper {
+
+    public static int getPortFromEnvOrStartup(String[] args) {
+        int port = 0;
+        if (args != null && args.length >= 2) {
+            for (int i = 0; i < args.length; ++i) {
+                if ("-p".equalsIgnoreCase(args[i]) && i < args.length - 1) {
+                    port = NumberUtils.toInt(args[i + 1], 0);
+                }
+            }
+        }
+        if (port == 0) {
+            port = ContainerHelper.getPort();
+        }
+        return port;
+    }
+
+    /**
+     * get config from configFile
+     * -Dspring.config.location > classpath:application.properties > classpath:application.yml
+     *
+     * @return the port
+     * @throws IOException the io exception
+     */
+    public static int getPortFromConfigFile() throws IOException {
+
+        int port = 8080;
+        File configFile = null;
+        File startupConfigFile = getConfigFromStartup();
+        if (null != startupConfigFile) {
+            configFile = startupConfigFile;
+        } else {
+            try {
+                File propertiesFile = ResourceUtils.getFile("classpath:application.properties");
+                configFile = propertiesFile;
+            } catch (FileNotFoundException exx) {
+                File ymlFile = ResourceUtils.getFile("classpath:application.yml");
+                configFile = ymlFile;
+            }
+        }
+        InputStream inputStream = null;
+        try {
+            inputStream = new FileInputStream(configFile);
+            String fileName = configFile.getName();
+            String portNum = null;
+            if (fileName.endsWith("yml")) {
+                Map<String, Object> yamlMap = new Yaml().load(inputStream);
+                Map<String, Object> configMap =  MapUtil.getFlattenedMap(yamlMap);
+                if (CollectionUtils.isNotEmpty(configMap)) {
+                    Object serverPort = configMap.get("server.port");
+                    if (null != serverPort) {
+                        portNum = serverPort.toString();
+                    }
+                }
+            } else {
+                Properties properties = new Properties();
+                properties.load(inputStream);
+                portNum = properties.getProperty("server.port");
+            }
+            if (null != portNum) {
+                try {
+                    port = Integer.parseInt(portNum);
+                } catch (NumberFormatException exx) {
+                    //ignore
+                }
+            }
+        } finally {
+            if (null != inputStream) {
+                inputStream.close();
+            }
+        }
+        return port;
+
+    }
+    private static File getConfigFromStartup() {
+
+        String configLocation = System.getProperty("spring.config.location");
+        if (StringUtils.isNotBlank(configLocation)) {
+            try {
+                File configFile = ResourceUtils.getFile(configLocation);
+                if (!configFile.isFile()) {
+                    return null;
+                }
+                String fileName = configFile.getName();
+                if (!(fileName.endsWith("yml") || fileName.endsWith("properties"))) {
+                    return null;
+                }
+                return configFile;
+            } catch (FileNotFoundException e) {
+                return null;
+            }
+        }
+        return null;
+
+    }
+
+
+}
+
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/event/EventBusManager.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/event/EventBusManager.java
new file mode 100644
index 0000000..5500bc7
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/event/EventBusManager.java
@@ -0,0 +1,34 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.event;
+
+import io.seata.core.event.EventBus;
+import io.seata.core.event.GuavaEventBus;
+
+/**
+ * Manager hold the singleton event bus instance.
+ *
+ * @author zhengyangyong
+ */
+public class EventBusManager {
+    private static class SingletonHolder {
+        private static EventBus INSTANCE = new GuavaEventBus("tc",true);
+    }
+
+    public static EventBus get() {
+        return SingletonHolder.INSTANCE;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/lock/AbstractLockManager.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/lock/AbstractLockManager.java
new file mode 100644
index 0000000..91bb7b6
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/lock/AbstractLockManager.java
@@ -0,0 +1,198 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.lock;
+
+import io.seata.common.XID;
+import io.seata.common.util.CollectionUtils;
+import io.seata.common.util.StringUtils;
+import io.seata.core.exception.TransactionException;
+import io.seata.core.lock.Locker;
+import io.seata.core.lock.RowLock;
+import io.seata.core.model.LockStatus;
+import io.seata.server.session.BranchSession;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * The type Abstract lock manager.
+ *
+ * @author zhangsen
+ */
+public abstract class AbstractLockManager implements LockManager {
+
+    /**
+     * The constant LOGGER.
+     */
+    protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractLockManager.class);
+
+    @Override
+    public boolean acquireLock(BranchSession branchSession) throws TransactionException {
+        return acquireLock(branchSession, true, false);
+    }
+
+    @Override
+    public boolean acquireLock(BranchSession branchSession, boolean autoCommit, boolean skipCheckLock) throws TransactionException {
+        if (branchSession == null) {
+            throw new IllegalArgumentException("branchSession can't be null for memory/file locker.");
+        }
+        String lockKey = branchSession.getLockKey();
+        if (StringUtils.isNullOrEmpty(lockKey)) {
+            // no lock
+            return true;
+        }
+        // get locks of branch
+        List<RowLock> locks = collectRowLocks(branchSession);
+        if (CollectionUtils.isEmpty(locks)) {
+            // no lock
+            return true;
+        }
+        return getLocker(branchSession).acquireLock(locks, autoCommit, skipCheckLock);
+    }
+
+    @Override
+    public boolean releaseLock(BranchSession branchSession) throws TransactionException {
+        if (branchSession == null) {
+            throw new IllegalArgumentException("branchSession can't be null for memory/file locker.");
+        }
+        List<RowLock> locks = collectRowLocks(branchSession);
+        try {
+            return getLocker(branchSession).releaseLock(locks);
+        } catch (Exception t) {
+            LOGGER.error("unLock error, branchSession:{}", branchSession, t);
+            return false;
+        }
+    }
+
+    @Override
+    public boolean isLockable(String xid, String resourceId, String lockKey) throws TransactionException {
+        if (StringUtils.isBlank(lockKey)) {
+            // no lock
+            return true;
+        }
+        List<RowLock> locks = collectRowLocks(lockKey, resourceId, xid);
+        try {
+            return getLocker().isLockable(locks);
+        } catch (Exception t) {
+            LOGGER.error("isLockable error, xid:{} resourceId:{}, lockKey:{}", xid, resourceId, lockKey, t);
+            return false;
+        }
+    }
+
+
+    @Override
+    public void cleanAllLocks() throws TransactionException {
+        getLocker().cleanAllLocks();
+    }
+
+    /**
+     * Gets locker.
+     *
+     * @return the locker
+     */
+    protected Locker getLocker() {
+        return getLocker(null);
+    }
+
+    /**
+     * Gets locker.
+     *
+     * @param branchSession the branch session
+     * @return the locker
+     */
+    protected abstract Locker getLocker(BranchSession branchSession);
+
+    @Override
+    public List<RowLock> collectRowLocks(BranchSession branchSession) {
+        if (branchSession == null || StringUtils.isBlank(branchSession.getLockKey())) {
+            return Collections.emptyList();
+        }
+
+        String lockKey = branchSession.getLockKey();
+        String resourceId = branchSession.getResourceId();
+        String xid = branchSession.getXid();
+        long transactionId = branchSession.getTransactionId();
+        long branchId = branchSession.getBranchId();
+
+        return collectRowLocks(lockKey, resourceId, xid, transactionId, branchId);
+    }
+
+    /**
+     * Collect row locks list.
+     *
+     * @param lockKey    the lock key
+     * @param resourceId the resource id
+     * @param xid        the xid
+     * @return the list
+     */
+    protected List<RowLock> collectRowLocks(String lockKey, String resourceId, String xid) {
+        return collectRowLocks(lockKey, resourceId, xid, XID.getTransactionId(xid), null);
+    }
+
+    /**
+     * Collect row locks list.
+     *
+     * @param lockKey       the lock key
+     * @param resourceId    the resource id
+     * @param xid           the xid
+     * @param transactionId the transaction id
+     * @param branchID      the branch id
+     * @return the list
+     */
+    protected List<RowLock> collectRowLocks(String lockKey, String resourceId, String xid, Long transactionId,
+        Long branchID) {
+        List<RowLock> locks = new ArrayList<>();
+
+        String[] tableGroupedLockKeys = lockKey.split(";");
+        for (String tableGroupedLockKey : tableGroupedLockKeys) {
+            int idx = tableGroupedLockKey.indexOf(":");
+            if (idx < 0) {
+                return locks;
+            }
+            String tableName = tableGroupedLockKey.substring(0, idx);
+            String mergedPKs = tableGroupedLockKey.substring(idx + 1);
+            if (StringUtils.isBlank(mergedPKs)) {
+                return locks;
+            }
+            String[] pks = mergedPKs.split(",");
+            if (pks == null || pks.length == 0) {
+                return locks;
+            }
+            for (String pk : pks) {
+                if (StringUtils.isNotBlank(pk)) {
+                    RowLock rowLock = new RowLock();
+                    rowLock.setXid(xid);
+                    rowLock.setTransactionId(transactionId);
+                    rowLock.setBranchId(branchID);
+                    rowLock.setTableName(tableName);
+                    rowLock.setPk(pk);
+                    rowLock.setResourceId(resourceId);
+                    locks.add(rowLock);
+                }
+            }
+        }
+        return locks;
+    }
+
+    @Override
+    public void updateLockStatus(String xid, LockStatus lockStatus) {
+        this.getLocker().updateLockStatus(xid, lockStatus);
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/lock/LockManager.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/lock/LockManager.java
new file mode 100644
index 0000000..a655d93
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/lock/LockManager.java
@@ -0,0 +1,106 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.lock;
+
+import io.seata.core.exception.TransactionException;
+import io.seata.core.lock.RowLock;
+import io.seata.core.model.LockStatus;
+import io.seata.server.session.BranchSession;
+import io.seata.server.session.GlobalSession;
+
+import java.util.List;
+
+/**
+ * The interface Lock manager.
+ *
+ * @author sharajava
+ */
+public interface LockManager {
+
+    /**
+     * Acquire lock boolean.
+     *
+     * @param branchSession the branch session
+     * @return the boolean
+     * @throws TransactionException the transaction exception
+     */
+    boolean acquireLock(BranchSession branchSession) throws TransactionException;
+
+    /**
+     * Acquire lock boolean.
+     *
+     * @param branchSession the branch session
+     * @param autoCommit the auto commit
+     * @param skipCheckLock whether skip check lock or not
+     * @return the boolean
+     * @throws TransactionException the transaction exception
+     */
+    boolean acquireLock(BranchSession branchSession, boolean autoCommit, boolean skipCheckLock) throws TransactionException;
+
+    /**
+     * Un lock boolean.
+     *
+     * @param branchSession the branch session
+     * @return the boolean
+     * @throws TransactionException the transaction exception
+     */
+    boolean releaseLock(BranchSession branchSession) throws TransactionException;
+
+    /**
+     * Un lock boolean.
+     *
+     * @param globalSession the global session
+     * @return the boolean
+     * @throws TransactionException the transaction exception
+     */
+    boolean releaseGlobalSessionLock(GlobalSession globalSession) throws TransactionException;
+
+    /**
+     * Is lockable boolean.
+     *
+     * @param xid        the xid
+     * @param resourceId the resource id
+     * @param lockKey    the lock key
+     * @return the boolean
+     * @throws TransactionException the transaction exception
+     */
+    boolean isLockable(String xid, String resourceId, String lockKey) throws TransactionException;
+
+    /**
+     * Clean all locks.
+     *
+     * @throws TransactionException the transaction exception
+     */
+    void cleanAllLocks() throws TransactionException;
+
+    /**
+     * Collect row locks list.`
+     *
+     * @param branchSession the branch session
+     * @return the list
+     */
+    List<RowLock> collectRowLocks(BranchSession branchSession);
+
+    /**
+     * update lock status.
+     * @param xid the xid
+     * @param lockStatus the lock status
+     * @throws TransactionException the transaction exception
+     *
+     */
+    void updateLockStatus(String xid, LockStatus lockStatus) throws TransactionException;
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/lock/LockerManagerFactory.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/lock/LockerManagerFactory.java
new file mode 100644
index 0000000..b4aef84
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/lock/LockerManagerFactory.java
@@ -0,0 +1,74 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.lock;
+
+import io.seata.common.loader.EnhancedServiceLoader;
+import io.seata.config.Configuration;
+import io.seata.config.ConfigurationFactory;
+import io.seata.server.store.StoreConfig;
+import io.seata.server.store.StoreConfig.LockMode;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * The type Lock manager factory.
+ *
+ * @author sharajava
+ */
+public class LockerManagerFactory {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(LockerManagerFactory.class);
+    private static final Configuration CONFIG = ConfigurationFactory.getInstance();
+
+    /**
+     * the lock manager
+     */
+    private static volatile LockManager LOCK_MANAGER;
+
+    /**
+     * Get lock manager.
+     *
+     * @return the lock manager
+     */
+    public static LockManager getLockManager() {
+        if (LOCK_MANAGER == null) {
+            init();
+        }
+        return LOCK_MANAGER;
+    }
+
+    public static void init() {
+        init(null);
+    }
+
+    public static void init(LockMode lockMode) {
+        if (LOCK_MANAGER == null) {
+            synchronized (LockerManagerFactory.class) {
+                if (LOCK_MANAGER == null) {
+                    if (null == lockMode) {
+                        lockMode = StoreConfig.getLockMode();
+                    }
+                    LOGGER.info("use lock store mode: {}", lockMode.getName());
+                    //if not exist the lock mode, throw exception
+                    if (null != StoreConfig.StoreMode.get(lockMode.name())) {
+                        LOCK_MANAGER = EnhancedServiceLoader.load(LockManager.class, lockMode.getName());
+                    }
+                }
+            }
+        }
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/lock/distributed/DistributedLockerFactory.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/lock/distributed/DistributedLockerFactory.java
new file mode 100644
index 0000000..362d213
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/lock/distributed/DistributedLockerFactory.java
@@ -0,0 +1,69 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.lock.distributed;
+
+import io.seata.common.loader.EnhancedServiceLoader;
+import io.seata.common.loader.EnhancedServiceNotFoundException;
+import io.seata.core.store.DefaultDistributedLocker;
+import io.seata.core.store.DistributedLocker;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Distributed locker factory
+ * @author zhongxiang.wang
+ */
+public class DistributedLockerFactory {
+
+    /**
+     * The constant LOGGER.
+     */
+    private static final Logger LOGGER = LoggerFactory.getLogger(DistributedLockerFactory.class);
+
+    private static volatile DistributedLocker DISTRIBUTED_LOCKER = null;
+
+    /**
+     * Get the distributed locker by lockerType
+     *
+     * @param lockerType the locker type
+     * @return the distributed locker
+     */
+    public static DistributedLocker getDistributedLocker(String lockerType) {
+        if (DISTRIBUTED_LOCKER == null) {
+            synchronized (DistributedLocker.class) {
+                if (DISTRIBUTED_LOCKER == null) {
+                    DistributedLocker distributedLocker = null;
+                    try {
+                        if (!"file".equals(lockerType)) {
+                            distributedLocker = EnhancedServiceLoader.load(DistributedLocker.class, lockerType);
+                        }
+                    } catch (EnhancedServiceNotFoundException ex) {
+                        LOGGER.error("Get distributed locker failed: {}", ex.getMessage(), ex);
+                    }
+                    if (distributedLocker == null) {
+                        distributedLocker = new DefaultDistributedLocker();
+                    }
+                    DISTRIBUTED_LOCKER = distributedLocker;
+                }
+            }
+        }
+        return DISTRIBUTED_LOCKER;
+    }
+
+    public static void cleanLocker() {
+        DISTRIBUTED_LOCKER = null;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/logging/listener/SystemPropertyLoggerContextListener.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/logging/listener/SystemPropertyLoggerContextListener.java
new file mode 100644
index 0000000..c0c9659
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/logging/listener/SystemPropertyLoggerContextListener.java
@@ -0,0 +1,75 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.logging.listener;
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.Logger;
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.spi.LoggerContextListener;
+import ch.qos.logback.core.Context;
+import ch.qos.logback.core.spi.ContextAwareBase;
+import ch.qos.logback.core.spi.LifeCycle;
+import io.seata.core.constants.ConfigurationKeys;
+
+/**
+ * @author wang.liang
+ */
+public class SystemPropertyLoggerContextListener extends ContextAwareBase implements LoggerContextListener, LifeCycle {
+
+    private boolean started = false;
+
+    @Override
+    public void start() {
+        if (started) {
+            return;
+        }
+
+        Context context = getContext();
+        context.putProperty("RPC_PORT", System.getProperty(ConfigurationKeys.SERVER_SERVICE_PORT_CAMEL));
+
+        started = true;
+    }
+
+    @Override
+    public void stop() {
+    }
+
+    @Override
+    public boolean isStarted() {
+        return started;
+    }
+
+    @Override
+    public boolean isResetResistant() {
+        return true;
+    }
+
+    @Override
+    public void onStart(LoggerContext context) {
+    }
+
+    @Override
+    public void onReset(LoggerContext context) {
+    }
+
+    @Override
+    public void onStop(LoggerContext context) {
+    }
+
+    @Override
+    public void onLevelChange(Logger logger, Level level) {
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/logging/logback/ExtendedWhitespaceThrowableProxyConverter.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/logging/logback/ExtendedWhitespaceThrowableProxyConverter.java
new file mode 100644
index 0000000..c6bb4a1
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/logging/logback/ExtendedWhitespaceThrowableProxyConverter.java
@@ -0,0 +1,35 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.logging.logback;
+
+import ch.qos.logback.classic.pattern.ExtendedThrowableProxyConverter;
+import ch.qos.logback.classic.spi.IThrowableProxy;
+import ch.qos.logback.core.CoreConstants;
+
+/**
+ * {@link ExtendedThrowableProxyConverter} that adds some additional whitespace around the
+ * stack trace.
+ * Copied from spring-boot-xxx.jar by wang.liang
+ * @author Phillip Webb
+ */
+public class ExtendedWhitespaceThrowableProxyConverter extends ExtendedThrowableProxyConverter {
+
+    @Override
+    protected String throwableProxyToString(IThrowableProxy tp) {
+        return "==>" + CoreConstants.LINE_SEPARATOR + super.throwableProxyToString(tp)
+                + "<==" + CoreConstants.LINE_SEPARATOR + CoreConstants.LINE_SEPARATOR;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/logging/logback/appender/EnhancedLogstashEncoder.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/logging/logback/appender/EnhancedLogstashEncoder.java
new file mode 100644
index 0000000..0b7689c
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/logging/logback/appender/EnhancedLogstashEncoder.java
@@ -0,0 +1,45 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.logging.logback.appender;
+
+import net.logstash.logback.composite.JsonProvider;
+import net.logstash.logback.composite.JsonProviders;
+import net.logstash.logback.encoder.LogstashEncoder;
+
+import java.util.ArrayList;
+
+/**
+ * The type Enhanced logstash encoder
+ *
+ * @author wang.liang
+ * @since 1.5.0
+ */
+public class EnhancedLogstashEncoder extends LogstashEncoder {
+
+    /**
+     * set exclude provider
+     *
+     * @param excludedProviderClassName the excluded provider class name
+     */
+    public void setExcludeProvider(String excludedProviderClassName) {
+        JsonProviders<?> providers = getFormatter().getProviders();
+        for (JsonProvider<?> provider : new ArrayList<>(providers.getProviders())) {
+            if (provider.getClass().getName().equals(excludedProviderClassName)) {
+                providers.removeProvider((JsonProvider) provider);
+            }
+        }
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/metrics/MeterIdConstants.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/metrics/MeterIdConstants.java
new file mode 100644
index 0000000..96f6ac5
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/metrics/MeterIdConstants.java
@@ -0,0 +1,108 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.metrics;
+
+import io.seata.metrics.Id;
+import io.seata.metrics.IdConstants;
+
+/**
+ * Constants for meter id in tc
+ *
+ * @author zhengyangyong
+ */
+public interface MeterIdConstants {
+    Id COUNTER_ACTIVE = new Id(IdConstants.SEATA_TRANSACTION)
+        .withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC)
+        .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_COUNTER)
+        .withTag(IdConstants.STATUS_KEY, IdConstants.STATUS_VALUE_ACTIVE);
+
+    Id COUNTER_COMMITTED = new Id(IdConstants.SEATA_TRANSACTION)
+        .withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC)
+        .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_COUNTER)
+        .withTag(IdConstants.STATUS_KEY, IdConstants.STATUS_VALUE_COMMITTED);
+
+    Id COUNTER_ROLLBACKED = new Id(IdConstants.SEATA_TRANSACTION)
+        .withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC)
+        .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_COUNTER)
+        .withTag(IdConstants.STATUS_KEY, IdConstants.STATUS_VALUE_ROLLBACKED);
+
+    Id COUNTER_AFTER_ROLLBACKED = new Id(IdConstants.SEATA_TRANSACTION)
+        .withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC)
+        .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_COUNTER)
+        .withTag(IdConstants.STATUS_KEY, IdConstants.STATUS_VALUE_AFTER_ROLLBACKED_KEY);
+
+    Id COUNTER_AFTER_COMMITTED = new Id(IdConstants.SEATA_TRANSACTION)
+        .withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC)
+        .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_COUNTER)
+        .withTag(IdConstants.STATUS_KEY, IdConstants.STATUS_VALUE_AFTER_COMMITTED_KEY);
+
+
+    Id SUMMARY_COMMITTED = new Id(IdConstants.SEATA_TRANSACTION)
+        .withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC)
+        .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_SUMMARY)
+        .withTag(IdConstants.STATUS_KEY, IdConstants.STATUS_VALUE_COMMITTED);
+
+    Id SUMMARY_ROLLBACKED = new Id(IdConstants.SEATA_TRANSACTION)
+        .withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC)
+        .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_SUMMARY)
+        .withTag(IdConstants.STATUS_KEY, IdConstants.STATUS_VALUE_ROLLBACKED);
+
+    Id SUMMARY_FAILED = new Id(IdConstants.SEATA_TRANSACTION)
+        .withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC)
+        .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_SUMMARY)
+        .withTag(IdConstants.STATUS_KEY, IdConstants.STATUS_VALUE_FAILED);
+
+    Id SUMMARY_TWO_PHASE_TIMEOUT = new Id(IdConstants.SEATA_TRANSACTION)
+         .withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC)
+         .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_SUMMARY)
+         .withTag(IdConstants.STATUS_KEY, IdConstants.STATUS_VALUE_TWO_PHASE_TIMEOUT);
+
+    Id SUMMARY_AFTER_ROLLBACKED = new Id(IdConstants.SEATA_TRANSACTION)
+        .withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC)
+        .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_SUMMARY)
+        .withTag(IdConstants.STATUS_KEY, IdConstants.STATUS_VALUE_AFTER_ROLLBACKED_KEY);
+
+    Id SUMMARY_AFTER_COMMITTED = new Id(IdConstants.SEATA_TRANSACTION)
+        .withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC)
+        .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_SUMMARY)
+        .withTag(IdConstants.STATUS_KEY, IdConstants.STATUS_VALUE_AFTER_COMMITTED_KEY);
+
+    Id TIMER_COMMITTED = new Id(IdConstants.SEATA_TRANSACTION)
+        .withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC)
+        .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_TIMER)
+        .withTag(IdConstants.STATUS_KEY, IdConstants.STATUS_VALUE_COMMITTED);
+
+    Id TIMER_ROLLBACK = new Id(IdConstants.SEATA_TRANSACTION)
+        .withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC)
+        .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_TIMER)
+        .withTag(IdConstants.STATUS_KEY, IdConstants.STATUS_VALUE_ROLLBACKED);
+
+    Id TIMER_FAILED = new Id(IdConstants.SEATA_TRANSACTION)
+        .withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC)
+        .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_TIMER)
+        .withTag(IdConstants.STATUS_KEY, IdConstants.STATUS_VALUE_FAILED);
+
+    Id TIMER_AFTER_ROLLBACKED = new Id(IdConstants.SEATA_TRANSACTION)
+        .withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC)
+        .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_TIMER)
+        .withTag(IdConstants.STATUS_KEY, IdConstants.STATUS_VALUE_AFTER_ROLLBACKED_KEY);
+
+    Id TIMER_AFTER_COMMITTED = new Id(IdConstants.SEATA_TRANSACTION)
+        .withTag(IdConstants.ROLE_KEY, IdConstants.ROLE_VALUE_TC)
+        .withTag(IdConstants.METER_KEY, IdConstants.METER_VALUE_TIMER)
+        .withTag(IdConstants.STATUS_KEY, IdConstants.STATUS_VALUE_AFTER_COMMITTED_KEY);
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/metrics/MetricsManager.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/metrics/MetricsManager.java
new file mode 100644
index 0000000..bad1c27
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/metrics/MetricsManager.java
@@ -0,0 +1,65 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.metrics;
+
+import io.seata.config.ConfigurationFactory;
+import io.seata.core.constants.ConfigurationKeys;
+import io.seata.metrics.exporter.Exporter;
+import io.seata.metrics.exporter.ExporterFactory;
+import io.seata.metrics.registry.Registry;
+import io.seata.metrics.registry.RegistryFactory;
+import io.seata.server.event.EventBusManager;
+
+import java.util.List;
+
+import static io.seata.common.DefaultValues.DEFAULT_METRICS_ENABLED;
+
+/**
+ * Metrics manager for init
+ *
+ * @author zhengyangyong
+ */
+public class MetricsManager {
+    private static class SingletonHolder {
+        private static MetricsManager INSTANCE = new MetricsManager();
+    }
+
+    public static final MetricsManager get() {
+        return SingletonHolder.INSTANCE;
+    }
+
+    private Registry registry;
+
+    public Registry getRegistry() {
+        return registry;
+    }
+
+    public void init() {
+        boolean enabled = ConfigurationFactory.getInstance().getBoolean(
+            ConfigurationKeys.METRICS_PREFIX + ConfigurationKeys.METRICS_ENABLED, DEFAULT_METRICS_ENABLED);
+        if (enabled) {
+            registry = RegistryFactory.getInstance();
+            if (registry != null) {
+                List<Exporter> exporters = ExporterFactory.getInstanceList();
+                //only at least one metrics exporter implement had imported in pom then need register MetricsSubscriber
+                if (exporters.size() != 0) {
+                    exporters.forEach(exporter -> exporter.setRegistry(registry));
+                    EventBusManager.get().register(new MetricsSubscriber(registry));
+                }
+            }
+        }
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/metrics/MetricsPublisher.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/metrics/MetricsPublisher.java
new file mode 100644
index 0000000..f0db1e5
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/metrics/MetricsPublisher.java
@@ -0,0 +1,97 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.metrics;
+
+import io.seata.core.event.EventBus;
+import io.seata.core.event.GlobalTransactionEvent;
+import io.seata.core.model.GlobalStatus;
+import io.seata.server.event.EventBusManager;
+import io.seata.server.session.GlobalSession;
+
+/**
+ * The type Metrics publisher.
+ *
+ * @author slievrly
+ */
+public class MetricsPublisher {
+
+    private static final EventBus EVENT_BUS = EventBusManager.get();
+
+    /**
+     * post end event
+     *
+     * @param globalSession the global session
+     * @param retryGlobal   the retry global
+     * @param retryBranch   the retry branch
+     */
+    public static void postSessionDoneEvent(final GlobalSession globalSession, boolean retryGlobal,
+                                            boolean retryBranch) {
+        postSessionDoneEvent(globalSession, globalSession.getStatus(), retryGlobal, retryBranch);
+    }
+
+    /**
+     * post end event (force specified state)
+     *
+     * @param globalSession the global session
+     * @param status        the global status
+     * @param retryGlobal   the retry global
+     * @param retryBranch   the retry branch
+     */
+    public static void postSessionDoneEvent(final GlobalSession globalSession, GlobalStatus status, boolean retryGlobal,
+                                            boolean retryBranch) {
+        postSessionDoneEvent(globalSession, status.name(), retryGlobal, globalSession.getBeginTime(), retryBranch);
+    }
+
+    /**
+     * Post session done event.
+     *
+     * @param globalSession the global session
+     * @param status        the status
+     * @param retryGlobal   the retry global
+     * @param beginTime     the begin time
+     * @param retryBranch   the retry branch
+     */
+    public static void postSessionDoneEvent(final GlobalSession globalSession, String status, boolean retryGlobal, long beginTime, boolean retryBranch) {
+        EVENT_BUS.post(new GlobalTransactionEvent(globalSession.getTransactionId(), GlobalTransactionEvent.ROLE_TC,
+            globalSession.getTransactionName(), globalSession.getApplicationId(),
+            globalSession.getTransactionServiceGroup(), beginTime, System.currentTimeMillis(), status, retryGlobal, retryBranch));
+    }
+
+    /**
+     * Post session doing event.
+     *
+     * @param globalSession the global session
+     * @param retryGlobal   the retry global
+     */
+    public static void postSessionDoingEvent(final GlobalSession globalSession, boolean retryGlobal) {
+        postSessionDoingEvent(globalSession, globalSession.getStatus().name(), retryGlobal, false);
+    }
+
+    /**
+     * Post session doing event.
+     *
+     * @param globalSession the global session
+     * @param status        the status
+     * @param retryGlobal   the retry global
+     * @param retryBranch   the retry branch
+     */
+    public static void postSessionDoingEvent(final GlobalSession globalSession, String status, boolean retryGlobal,
+                                             boolean retryBranch) {
+        EVENT_BUS.post(new GlobalTransactionEvent(globalSession.getTransactionId(), GlobalTransactionEvent.ROLE_TC,
+            globalSession.getTransactionName(), globalSession.getApplicationId(),
+            globalSession.getTransactionServiceGroup(), globalSession.getBeginTime(), null, status, retryGlobal, retryBranch));
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/metrics/MetricsSubscriber.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/metrics/MetricsSubscriber.java
new file mode 100644
index 0000000..277cee0
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/metrics/MetricsSubscriber.java
@@ -0,0 +1,214 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.metrics;
+
+import com.google.common.eventbus.Subscribe;
+import io.seata.core.event.GlobalTransactionEvent;
+import io.seata.core.model.GlobalStatus;
+import io.seata.metrics.registry.Registry;
+import io.seata.server.event.EventBusManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
+
+import static io.seata.metrics.IdConstants.*;
+
+/**
+ * Event subscriber for metrics
+ *
+ * @author zhengyangyong
+ */
+public class MetricsSubscriber {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(MetricsSubscriber.class);
+    private final Registry registry;
+
+    private final Map<String, Consumer<GlobalTransactionEvent>> consumers;
+
+    public MetricsSubscriber(Registry registry) {
+        this.registry = registry;
+        consumers = new HashMap<>();
+        consumers.put(GlobalStatus.Begin.name(), this::processGlobalStatusBegin);
+        consumers.put(GlobalStatus.Committed.name(), this::processGlobalStatusCommitted);
+        consumers.put(GlobalStatus.Rollbacked.name(), this::processGlobalStatusRollbacked);
+
+        consumers.put(GlobalStatus.CommitFailed.name(), this::processGlobalStatusCommitFailed);
+        consumers.put(GlobalStatus.RollbackFailed.name(), this::processGlobalStatusRollbackFailed);
+        consumers.put(GlobalStatus.TimeoutRollbacked.name(), this::processGlobalStatusTimeoutRollbacked);
+        consumers.put(GlobalStatus.TimeoutRollbackFailed.name(), this::processGlobalStatusTimeoutRollbackFailed);
+
+        consumers.put(GlobalStatus.CommitRetryTimeout.name(), this::processGlobalStatusCommitRetryTimeout);
+        consumers.put(GlobalStatus.RollbackRetryTimeout.name(), this::processGlobalStatusTimeoutRollbackRetryTimeout);
+
+        consumers.put(STATUS_VALUE_AFTER_COMMITTED_KEY, this::processAfterGlobalCommitted);
+        consumers.put(STATUS_VALUE_AFTER_ROLLBACKED_KEY, this::processAfterGlobalRollbacked);
+    }
+
+    private void processGlobalStatusBegin(GlobalTransactionEvent event) {
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.debug("accept new event,xid:{},event:{}", event.getId(), event);
+            for (Object object : EventBusManager.get().getSubscribers()) {
+                LOGGER.debug("subscribe:{},threadName:{}", object.toString(), Thread.currentThread().getName());
+            }
+        }
+        registry.getCounter(MeterIdConstants.COUNTER_ACTIVE.withTag(APP_ID_KEY, event.getApplicationId())
+            .withTag(GROUP_KEY, event.getGroup())).increase(1);
+    }
+
+    private void processGlobalStatusCommitted(GlobalTransactionEvent event) {
+        if (event.isRetryGlobal()) {
+            return;
+        }
+        decreaseActive(event);
+        registry.getCounter(MeterIdConstants.COUNTER_COMMITTED
+                .withTag(APP_ID_KEY, event.getApplicationId())
+                .withTag(GROUP_KEY, event.getGroup())).increase(1);
+        registry.getSummary(MeterIdConstants.SUMMARY_COMMITTED
+                .withTag(APP_ID_KEY, event.getApplicationId())
+                .withTag(GROUP_KEY, event.getGroup())).increase(1);
+        registry.getTimer(MeterIdConstants.TIMER_COMMITTED
+                .withTag(APP_ID_KEY, event.getApplicationId())
+                .withTag(GROUP_KEY, event.getGroup()))
+                .record(event.getEndTime() - event.getBeginTime(), TimeUnit.MILLISECONDS);
+    }
+
+    private void processGlobalStatusRollbacked(GlobalTransactionEvent event) {
+        if (event.isRetryGlobal()) {
+            return;
+        }
+        decreaseActive(event);
+        registry.getCounter(MeterIdConstants.COUNTER_ROLLBACKED
+                .withTag(APP_ID_KEY, event.getApplicationId())
+                .withTag(GROUP_KEY, event.getGroup())).increase(1);
+        registry.getSummary(MeterIdConstants.SUMMARY_ROLLBACKED
+                .withTag(APP_ID_KEY, event.getApplicationId())
+                .withTag(GROUP_KEY, event.getGroup())).increase(1);
+        registry.getTimer(MeterIdConstants.TIMER_ROLLBACK
+                .withTag(APP_ID_KEY, event.getApplicationId())
+                .withTag(GROUP_KEY, event.getGroup()))
+                .record(event.getEndTime() - event.getBeginTime(), TimeUnit.MILLISECONDS);
+    }
+
+    private void processAfterGlobalRollbacked(GlobalTransactionEvent event) {
+        if (event.isRetryGlobal() && event.isRetryBranch()) {
+            decreaseActive(event);
+        }
+        registry.getCounter(MeterIdConstants.COUNTER_AFTER_ROLLBACKED
+            .withTag(APP_ID_KEY, event.getApplicationId())
+            .withTag(GROUP_KEY, event.getGroup())).increase(1);
+        registry.getSummary(MeterIdConstants.SUMMARY_AFTER_ROLLBACKED
+            .withTag(APP_ID_KEY, event.getApplicationId())
+            .withTag(GROUP_KEY, event.getGroup())).increase(1);
+        registry.getTimer(MeterIdConstants.TIMER_AFTER_ROLLBACKED
+            .withTag(APP_ID_KEY, event.getApplicationId())
+            .withTag(GROUP_KEY, event.getGroup()))
+            .record(event.getEndTime() - event.getBeginTime(), TimeUnit.MILLISECONDS);
+    }
+
+    private void processAfterGlobalCommitted(GlobalTransactionEvent event) {
+        if (event.isRetryGlobal() && event.isRetryBranch()) {
+            decreaseActive(event);
+        }
+        registry.getCounter(MeterIdConstants.COUNTER_AFTER_COMMITTED
+            .withTag(APP_ID_KEY, event.getApplicationId())
+            .withTag(GROUP_KEY, event.getGroup())).increase(1);
+        registry.getSummary(MeterIdConstants.SUMMARY_AFTER_COMMITTED
+            .withTag(APP_ID_KEY, event.getApplicationId())
+            .withTag(GROUP_KEY, event.getGroup())).increase(1);
+        registry.getTimer(MeterIdConstants.TIMER_AFTER_COMMITTED
+            .withTag(APP_ID_KEY, event.getApplicationId())
+            .withTag(GROUP_KEY, event.getGroup()))
+            .record(event.getEndTime() - event.getBeginTime(), TimeUnit.MILLISECONDS);
+    }
+
+    private void processGlobalStatusCommitFailed(GlobalTransactionEvent event) {
+        decreaseActive(event);
+        reportFailed(event);
+    }
+
+    private void processGlobalStatusRollbackFailed(GlobalTransactionEvent event) {
+        decreaseActive(event);
+        reportFailed(event);
+    }
+
+    private void processGlobalStatusTimeoutRollbacked(GlobalTransactionEvent event) {
+        decreaseActive(event);
+    }
+
+    private void processGlobalStatusTimeoutRollbackFailed(GlobalTransactionEvent event) {
+        decreaseActive(event);
+        reportTwoPhaseTimeout(event);
+    }
+
+    private void processGlobalStatusCommitRetryTimeout(GlobalTransactionEvent event) {
+        decreaseActive(event);
+        reportTwoPhaseTimeout(event);
+    }
+
+    private void processGlobalStatusTimeoutRollbackRetryTimeout(GlobalTransactionEvent event) {
+        decreaseActive(event);
+    }
+
+    private void decreaseActive(GlobalTransactionEvent event) {
+        registry.getCounter(MeterIdConstants.COUNTER_ACTIVE
+                .withTag(APP_ID_KEY, event.getApplicationId())
+                .withTag(GROUP_KEY, event.getGroup())).decrease(1);
+    }
+
+    private void reportFailed(GlobalTransactionEvent event) {
+        registry.getSummary(MeterIdConstants.SUMMARY_FAILED
+                .withTag(APP_ID_KEY, event.getApplicationId())
+                .withTag(GROUP_KEY, event.getGroup())).increase(1);
+        registry.getTimer(MeterIdConstants.TIMER_FAILED
+                .withTag(APP_ID_KEY, event.getApplicationId())
+                .withTag(GROUP_KEY, event.getGroup()))
+                .record(event.getEndTime() - event.getBeginTime(), TimeUnit.MILLISECONDS);
+    }
+
+    private void reportTwoPhaseTimeout(GlobalTransactionEvent event) {
+        registry.getSummary(MeterIdConstants.SUMMARY_TWO_PHASE_TIMEOUT
+                .withTag(APP_ID_KEY, event.getApplicationId())
+                .withTag(GROUP_KEY, event.getGroup())).increase(1);
+    }
+
+
+
+    @Subscribe
+    public void recordGlobalTransactionEventForMetrics(GlobalTransactionEvent event) {
+        if (registry != null && consumers.containsKey(event.getStatus())) {
+            consumers.get(event.getStatus()).accept(event);
+        }
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        return this.getClass().getName().equals(obj.getClass().getName());
+    }
+
+    /**
+     * PMD check
+     * SuppressWarnings("checkstyle:EqualsHashCode")
+     * @return the hash code
+     */
+    @Override
+    public int hashCode() {
+        return super.hashCode();
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/AbstractSessionManager.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/AbstractSessionManager.java
new file mode 100644
index 0000000..2668c2c
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/AbstractSessionManager.java
@@ -0,0 +1,199 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.session;
+
+import io.seata.core.exception.BranchTransactionException;
+import io.seata.core.exception.GlobalTransactionException;
+import io.seata.core.exception.TransactionException;
+import io.seata.core.exception.TransactionExceptionCode;
+import io.seata.core.model.BranchStatus;
+import io.seata.core.model.GlobalStatus;
+import io.seata.core.model.LockStatus;
+import io.seata.server.store.SessionStorable;
+import io.seata.server.store.TransactionStoreManager;
+import io.seata.server.store.TransactionStoreManager.LogOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * The type Abstract session manager.
+ */
+public abstract class AbstractSessionManager implements SessionManager, SessionLifecycleListener {
+
+    /**
+     * The constant LOGGER.
+     */
+    protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractSessionManager.class);
+
+    /**
+     * The Transaction store manager.
+     */
+    protected TransactionStoreManager transactionStoreManager;
+
+    /**
+     * The Name.
+     */
+    protected String name;
+
+    /**
+     * Instantiates a new Abstract session manager.
+     */
+    public AbstractSessionManager() {
+    }
+
+    /**
+     * Instantiates a new Abstract session manager.
+     *
+     * @param name the name
+     */
+    public AbstractSessionManager(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public void addGlobalSession(GlobalSession session) throws TransactionException {
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.debug("MANAGER[{}] SESSION[{}] {}", name, session, LogOperation.GLOBAL_ADD);
+        }
+        writeSession(LogOperation.GLOBAL_ADD, session);
+    }
+
+    @Override
+    public void updateGlobalSessionStatus(GlobalSession session, GlobalStatus status) throws TransactionException {
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.debug("MANAGER[{}] SESSION[{}] {}", name, session, LogOperation.GLOBAL_UPDATE);
+        }
+        if (GlobalStatus.Rollbacking == status) {
+            session.getBranchSessions().forEach(i -> i.setLockStatus(LockStatus.Rollbacking));
+        }
+        writeSession(LogOperation.GLOBAL_UPDATE, session);
+    }
+
+    @Override
+    public void removeGlobalSession(GlobalSession session) throws TransactionException {
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.debug("MANAGER[{}] SESSION[{}] {}", name, session, LogOperation.GLOBAL_REMOVE);
+        }
+        writeSession(LogOperation.GLOBAL_REMOVE, session);
+    }
+
+    @Override
+    public void addBranchSession(GlobalSession session, BranchSession branchSession) throws TransactionException {
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.debug("MANAGER[{}] SESSION[{}] {}", name, branchSession, LogOperation.BRANCH_ADD);
+        }
+        writeSession(LogOperation.BRANCH_ADD, branchSession);
+    }
+
+    @Override
+    public void updateBranchSessionStatus(BranchSession branchSession, BranchStatus status)
+        throws TransactionException {
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.debug("MANAGER[{}] SESSION[{}] {}", name, branchSession, LogOperation.BRANCH_UPDATE);
+        }
+        writeSession(LogOperation.BRANCH_UPDATE, branchSession);
+    }
+
+    @Override
+    public void removeBranchSession(GlobalSession globalSession, BranchSession branchSession)
+        throws TransactionException {
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.debug("MANAGER[{}] SESSION[{}] {}", name, branchSession, LogOperation.BRANCH_REMOVE);
+        }
+        writeSession(LogOperation.BRANCH_REMOVE, branchSession);
+    }
+
+    @Override
+    public void onBegin(GlobalSession globalSession) throws TransactionException {
+        addGlobalSession(globalSession);
+    }
+
+    @Override
+    public void onStatusChange(GlobalSession globalSession, GlobalStatus status) throws TransactionException {
+        updateGlobalSessionStatus(globalSession, status);
+    }
+
+    @Override
+    public void onBranchStatusChange(GlobalSession globalSession, BranchSession branchSession, BranchStatus status)
+        throws TransactionException {
+        updateBranchSessionStatus(branchSession, status);
+    }
+
+    @Override
+    public void onAddBranch(GlobalSession globalSession, BranchSession branchSession) throws TransactionException {
+        addBranchSession(globalSession, branchSession);
+    }
+
+    @Override
+    public void onRemoveBranch(GlobalSession globalSession, BranchSession branchSession) throws TransactionException {
+        removeBranchSession(globalSession, branchSession);
+    }
+
+    @Override
+    public void onClose(GlobalSession globalSession) throws TransactionException {
+        globalSession.setActive(false);
+    }
+
+    @Override
+    public void onSuccessEnd(GlobalSession globalSession) throws TransactionException {
+        removeGlobalSession(globalSession);
+    }
+
+    @Override
+    public void onFailEnd(GlobalSession globalSession) throws TransactionException {
+        LOGGER.info("xid:{} fail end, transaction:{}",globalSession.getXid(),globalSession.toString());
+    }
+
+    private void writeSession(LogOperation logOperation, SessionStorable sessionStorable) throws TransactionException {
+        if (!transactionStoreManager.writeSession(logOperation, sessionStorable)) {
+            if (LogOperation.GLOBAL_ADD.equals(logOperation)) {
+                throw new GlobalTransactionException(TransactionExceptionCode.FailedWriteSession,
+                    "Fail to store global session");
+            } else if (LogOperation.GLOBAL_UPDATE.equals(logOperation)) {
+                throw new GlobalTransactionException(TransactionExceptionCode.FailedWriteSession,
+                    "Fail to update global session");
+            } else if (LogOperation.GLOBAL_REMOVE.equals(logOperation)) {
+                throw new GlobalTransactionException(TransactionExceptionCode.FailedWriteSession,
+                    "Fail to remove global session");
+            } else if (LogOperation.BRANCH_ADD.equals(logOperation)) {
+                throw new BranchTransactionException(TransactionExceptionCode.FailedWriteSession,
+                    "Fail to store branch session");
+            } else if (LogOperation.BRANCH_UPDATE.equals(logOperation)) {
+                throw new BranchTransactionException(TransactionExceptionCode.FailedWriteSession,
+                    "Fail to update branch session");
+            } else if (LogOperation.BRANCH_REMOVE.equals(logOperation)) {
+                throw new BranchTransactionException(TransactionExceptionCode.FailedWriteSession,
+                    "Fail to remove branch session");
+            } else {
+                throw new BranchTransactionException(TransactionExceptionCode.FailedWriteSession,
+                    "Unknown LogOperation:" + logOperation.name());
+            }
+        }
+    }
+
+    @Override
+    public void destroy() {
+    }
+
+    /**
+     * Sets transaction store manager.
+     *
+     * @param transactionStoreManager the transaction store manager
+     */
+    public void setTransactionStoreManager(TransactionStoreManager transactionStoreManager) {
+        this.transactionStoreManager = transactionStoreManager;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/BranchSession.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/BranchSession.java
new file mode 100644
index 0000000..daaf230
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/BranchSession.java
@@ -0,0 +1,473 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.session;
+
+import io.seata.common.util.CompressUtil;
+import io.seata.core.exception.TransactionException;
+import io.seata.core.model.BranchStatus;
+import io.seata.core.model.BranchType;
+import io.seata.core.model.LockStatus;
+import io.seata.server.lock.LockerManagerFactory;
+import io.seata.server.storage.file.lock.FileLocker;
+import io.seata.server.store.SessionStorable;
+import io.seata.server.store.StoreConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import static io.seata.core.model.LockStatus.Locked;
+
+/**
+ * The type Branch session.
+ *
+ * @author sharajava
+ */
+public class BranchSession implements Lockable, Comparable<BranchSession>, SessionStorable {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(BranchSession.class);
+
+    private static final int MAX_BRANCH_SESSION_SIZE = StoreConfig.getMaxBranchSessionSize();
+
+    private static ThreadLocal<ByteBuffer> byteBufferThreadLocal = ThreadLocal.withInitial(() -> ByteBuffer.allocate(
+        MAX_BRANCH_SESSION_SIZE));
+
+    private String xid;
+
+    private long transactionId;
+
+    private long branchId;
+
+    private String resourceGroupId;
+
+    private String resourceId;
+
+    private String lockKey;
+
+    private BranchType branchType;
+
+    private BranchStatus status = BranchStatus.Unknown;
+
+    private String clientId;
+
+    private String applicationData;
+
+    private LockStatus lockStatus = Locked;
+
+    private ConcurrentMap<FileLocker.BucketLockMap, Set<String>> lockHolder
+        = new ConcurrentHashMap<>();
+
+    /**
+     * Gets application data.
+     *
+     * @return the application data
+     */
+    public String getApplicationData() {
+        return applicationData;
+    }
+
+    /**
+     * Sets application data.
+     *
+     * @param applicationData the application data
+     */
+    public void setApplicationData(String applicationData) {
+        this.applicationData = applicationData;
+    }
+
+    /**
+     * Gets resource group id.
+     *
+     * @return the resource group id
+     */
+    public String getResourceGroupId() {
+        return resourceGroupId;
+    }
+
+    /**
+     * Sets resource group id.
+     *
+     * @param resourceGroupId the resource group id
+     */
+    public void setResourceGroupId(String resourceGroupId) {
+        this.resourceGroupId = resourceGroupId;
+    }
+
+    /**
+     * Gets client id.
+     *
+     * @return the client id
+     */
+    public String getClientId() {
+        return clientId;
+    }
+
+    /**
+     * Sets client id.
+     *
+     * @param clientId the client id
+     */
+    public void setClientId(String clientId) {
+        this.clientId = clientId;
+    }
+
+    /**
+     * Gets resource id.
+     *
+     * @return the resource id
+     */
+    public String getResourceId() {
+        return resourceId;
+    }
+
+    /**
+     * Sets resource id.
+     *
+     * @param resourceId the resource id
+     */
+    public void setResourceId(String resourceId) {
+        this.resourceId = resourceId;
+    }
+
+    /**
+     * Gets lock key.
+     *
+     * @return the lock key
+     */
+    public String getLockKey() {
+        return lockKey;
+    }
+
+    /**
+     * Sets lock key.
+     *
+     * @param lockKey the lock key
+     */
+    public void setLockKey(String lockKey) {
+        this.lockKey = lockKey;
+    }
+
+    /**
+     * Gets branch type.
+     *
+     * @return the branch type
+     */
+    public BranchType getBranchType() {
+        return branchType;
+    }
+
+    /**
+     * Sets branch type.
+     *
+     * @param branchType the branch type
+     */
+    public void setBranchType(BranchType branchType) {
+        this.branchType = branchType;
+    }
+
+    /**
+     * Gets status.
+     *
+     * @return the status
+     */
+    public BranchStatus getStatus() {
+        return status;
+    }
+
+    /**
+     * Sets status.
+     *
+     * @param status the status
+     */
+    public void setStatus(BranchStatus status) {
+        this.status = status;
+    }
+
+    /**
+     * Gets transaction id.
+     *
+     * @return the transaction id
+     */
+    public long getTransactionId() {
+        return transactionId;
+    }
+
+    /**
+     * Sets transaction id.
+     *
+     * @param transactionId the transaction id
+     */
+    public void setTransactionId(long transactionId) {
+        this.transactionId = transactionId;
+    }
+
+    /**
+     * Gets branch id.
+     *
+     * @return the branch id
+     */
+    public long getBranchId() {
+        return branchId;
+    }
+
+    /**
+     * Sets branch id.
+     *
+     * @param branchId the branch id
+     */
+    public void setBranchId(long branchId) {
+        this.branchId = branchId;
+    }
+
+    /**
+     * Gets xid.
+     *
+     * @return the xid
+     */
+    public String getXid() {
+        return xid;
+    }
+
+    /**
+     * Sets xid.
+     *
+     * @param xid the xid
+     */
+    public void setXid(String xid) {
+        this.xid = xid;
+    }
+
+    @Override
+    public String toString() {
+        return "BR:" + branchId + "/" + transactionId;
+    }
+
+    @Override
+    public int compareTo(BranchSession o) {
+        return Long.compare(this.branchId, o.branchId);
+    }
+
+    public boolean canBeCommittedAsync() {
+        return branchType == BranchType.AT || status == BranchStatus.PhaseOne_Failed;
+    }
+
+    /**
+     * Gets lock holder.
+     *
+     * @return the lock holder
+     */
+    public ConcurrentMap<FileLocker.BucketLockMap, Set<String>> getLockHolder() {
+        return lockHolder;
+    }
+
+    @Override
+    public boolean lock() throws TransactionException {
+        return this.lock(true, false);
+    }
+
+    public boolean lock(boolean autoCommit, boolean skipCheckLock) throws TransactionException {
+        if (this.getBranchType().equals(BranchType.AT)) {
+            return LockerManagerFactory.getLockManager().acquireLock(this, autoCommit, skipCheckLock);
+        }
+        return true;
+    }
+
+    @Override
+    public boolean unlock() throws TransactionException {
+        if (this.getBranchType() == BranchType.AT) {
+            return LockerManagerFactory.getLockManager().releaseLock(this);
+        }
+        return true;
+    }
+
+    public boolean isAT() {
+        return this.getBranchType() == BranchType.AT;
+    }
+
+    public LockStatus getLockStatus() {
+        return lockStatus;
+    }
+
+    public void setLockStatus(LockStatus lockStatus) {
+        this.lockStatus = lockStatus;
+    }
+
+    @Override
+    public byte[] encode() {
+
+        byte[] resourceIdBytes = resourceId != null ? resourceId.getBytes() : null;
+
+        byte[] lockKeyBytes = lockKey != null ? lockKey.getBytes() : null;
+
+        byte[] clientIdBytes = clientId != null ? clientId.getBytes() : null;
+
+        byte[] applicationDataBytes = applicationData != null ? applicationData.getBytes() : null;
+
+        byte[] xidBytes = xid != null ? xid.getBytes() : null;
+
+        byte branchTypeByte = branchType != null ? (byte) branchType.ordinal() : -1;
+
+        int size = calBranchSessionSize(resourceIdBytes, lockKeyBytes, clientIdBytes, applicationDataBytes, xidBytes);
+
+        if (size > MAX_BRANCH_SESSION_SIZE) {
+            if (lockKeyBytes == null) {
+                throw new RuntimeException("branch session size exceeded, size : " + size + " maxBranchSessionSize : "
+                    + MAX_BRANCH_SESSION_SIZE);
+            }
+            // try compress lockkey
+            try {
+                size -= lockKeyBytes.length;
+                lockKeyBytes = CompressUtil.compress(lockKeyBytes);
+            } catch (IOException e) {
+                LOGGER.error("compress lockKey error", e);
+            } finally {
+                size += lockKeyBytes.length;
+            }
+
+            if (size > MAX_BRANCH_SESSION_SIZE) {
+                throw new RuntimeException(
+                    "compress branch session size exceeded, compressSize : " + size + " maxBranchSessionSize : "
+                        + MAX_BRANCH_SESSION_SIZE);
+            }
+        }
+
+        ByteBuffer byteBuffer = byteBufferThreadLocal.get();
+        //recycle
+        byteBuffer.clear();
+
+        byteBuffer.putLong(transactionId);
+        byteBuffer.putLong(branchId);
+
+        if (resourceIdBytes != null) {
+            byteBuffer.putInt(resourceIdBytes.length);
+            byteBuffer.put(resourceIdBytes);
+        } else {
+            byteBuffer.putInt(0);
+        }
+
+        if (lockKeyBytes != null) {
+            byteBuffer.putInt(lockKeyBytes.length);
+            byteBuffer.put(lockKeyBytes);
+        } else {
+            byteBuffer.putInt(0);
+        }
+
+        if (clientIdBytes != null) {
+            byteBuffer.putShort((short)clientIdBytes.length);
+            byteBuffer.put(clientIdBytes);
+        } else {
+            byteBuffer.putShort((short)0);
+        }
+
+        if (applicationDataBytes != null) {
+            byteBuffer.putInt(applicationDataBytes.length);
+            byteBuffer.put(applicationDataBytes);
+        } else {
+            byteBuffer.putInt(0);
+        }
+
+        if (xidBytes != null) {
+            byteBuffer.putInt(xidBytes.length);
+            byteBuffer.put(xidBytes);
+        } else {
+            byteBuffer.putInt(0);
+        }
+
+        byteBuffer.put(branchTypeByte);
+
+        byteBuffer.put((byte)status.getCode());
+        byteBuffer.put((byte)lockStatus.getCode());
+        byteBuffer.flip();
+        byte[] result = new byte[byteBuffer.limit()];
+        byteBuffer.get(result);
+        return result;
+    }
+
+    private int calBranchSessionSize(byte[] resourceIdBytes, byte[] lockKeyBytes, byte[] clientIdBytes,
+                                     byte[] applicationDataBytes, byte[] xidBytes) {
+        final int size = 8 // trascationId
+            + 8 // branchId
+            + 4 // resourceIdBytes.length
+            + 4 // lockKeyBytes.length
+            + 2 // clientIdBytes.length
+            + 4 // applicationDataBytes.length
+            + 4 // xidBytes.size
+            + 1 // statusCode
+            + (resourceIdBytes == null ? 0 : resourceIdBytes.length)
+            + (lockKeyBytes == null ? 0 : lockKeyBytes.length)
+            + (clientIdBytes == null ? 0 : clientIdBytes.length)
+            + (applicationDataBytes == null ? 0 : applicationDataBytes.length)
+            + (xidBytes == null ? 0 : xidBytes.length)
+            + 1; //branchType
+        return size;
+    }
+
+    @Override
+    public void decode(byte[] a) {
+        ByteBuffer byteBuffer = ByteBuffer.wrap(a);
+        this.transactionId = byteBuffer.getLong();
+        this.branchId = byteBuffer.getLong();
+        int resourceLen = byteBuffer.getInt();
+        if (resourceLen > 0) {
+            byte[] byResource = new byte[resourceLen];
+            byteBuffer.get(byResource);
+            this.resourceId = new String(byResource);
+        }
+        int lockKeyLen = byteBuffer.getInt();
+        if (lockKeyLen > 0) {
+            byte[] byLockKey = new byte[lockKeyLen];
+            byteBuffer.get(byLockKey);
+            if (CompressUtil.isCompressData(byLockKey)) {
+                try {
+                    this.lockKey = new String(CompressUtil.uncompress(byLockKey));
+                } catch (IOException e) {
+                    throw new RuntimeException("decompress lockKey error", e);
+                }
+            } else {
+                this.lockKey = new String(byLockKey);
+            }
+
+        }
+        short clientIdLen = byteBuffer.getShort();
+        if (clientIdLen > 0) {
+            byte[] byClientId = new byte[clientIdLen];
+            byteBuffer.get(byClientId);
+            this.clientId = new String(byClientId);
+        }
+        int applicationDataLen = byteBuffer.getInt();
+        if (applicationDataLen > 0) {
+            byte[] byApplicationData = new byte[applicationDataLen];
+            byteBuffer.get(byApplicationData);
+            this.applicationData = new String(byApplicationData);
+        }
+        int xidLen = byteBuffer.getInt();
+        if (xidLen > 0) {
+            byte[] xidBytes = new byte[xidLen];
+            byteBuffer.get(xidBytes);
+            this.xid = new String(xidBytes);
+        }
+        int branchTypeId = byteBuffer.get();
+        if (branchTypeId >= 0) {
+            this.branchType = BranchType.values()[branchTypeId];
+        }
+        this.status = BranchStatus.get(byteBuffer.get());
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/BranchSessionHandler.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/BranchSessionHandler.java
new file mode 100644
index 0000000..3523018
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/BranchSessionHandler.java
@@ -0,0 +1,39 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.session;
+
+import io.seata.core.exception.TransactionException;
+
+/**
+ * The Functional Interface Branch session handler
+ *
+ * @author wang.liang
+ * @since 1.5.0
+ */
+@FunctionalInterface
+public interface BranchSessionHandler {
+
+    Boolean CONTINUE = null;
+
+    /**
+     * Handle branch session.
+     *
+     * @param branchSession the branch session
+     * @return the handle result
+     * @throws TransactionException the transaction exception
+     */
+    Boolean handle(BranchSession branchSession) throws TransactionException;
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/GlobalSession.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/GlobalSession.java
new file mode 100644
index 0000000..8f6c39c
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/GlobalSession.java
@@ -0,0 +1,771 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.session;
+
+import io.seata.common.Constants;
+import io.seata.common.DefaultValues;
+import io.seata.common.XID;
+import io.seata.common.util.StringUtils;
+import io.seata.config.ConfigurationFactory;
+import io.seata.core.constants.ConfigurationKeys;
+import io.seata.core.exception.GlobalTransactionException;
+import io.seata.core.exception.TransactionException;
+import io.seata.core.exception.TransactionExceptionCode;
+import io.seata.core.model.BranchStatus;
+import io.seata.core.model.BranchType;
+import io.seata.core.model.GlobalStatus;
+import io.seata.core.model.LockStatus;
+import io.seata.server.UUIDGenerator;
+import io.seata.server.lock.LockerManagerFactory;
+import io.seata.server.store.SessionStorable;
+import io.seata.server.store.StoreConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.nio.ByteBuffer;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+import static io.seata.core.model.GlobalStatus.*;
+
+/**
+ * The type Global session.
+ *
+ * @author sharajava
+ */
+public class GlobalSession implements SessionLifecycle, SessionStorable {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(GlobalSession.class);
+
+    private static final int MAX_GLOBAL_SESSION_SIZE = StoreConfig.getMaxGlobalSessionSize();
+
+    private static ThreadLocal<ByteBuffer> byteBufferThreadLocal = ThreadLocal.withInitial(() -> ByteBuffer.allocate(
+        MAX_GLOBAL_SESSION_SIZE));
+
+    /**
+     * If the global session's status is (Rollbacking or Committing) and currentTime - createTime >= RETRY_DEAD_THRESHOLD
+     *  then the tx will be remand as need to retry rollback
+     */
+    private static final int RETRY_DEAD_THRESHOLD = ConfigurationFactory.getInstance()
+            .getInt(ConfigurationKeys.RETRY_DEAD_THRESHOLD, DefaultValues.DEFAULT_RETRY_DEAD_THRESHOLD);
+
+    private String xid;
+
+    private long transactionId;
+
+    private volatile GlobalStatus status;
+
+    private String applicationId;
+
+    private String transactionServiceGroup;
+
+    private String transactionName;
+
+    private int timeout;
+
+    private long beginTime;
+
+    private String applicationData;
+
+    private final boolean lazyLoadBranch;
+
+    private volatile boolean active = true;
+
+    private List<BranchSession> branchSessions;
+
+    private GlobalSessionLock globalSessionLock = new GlobalSessionLock();
+
+
+    /**
+     * Add boolean.
+     *
+     * @param branchSession the branch session
+     * @return the boolean
+     */
+    public boolean add(BranchSession branchSession) {
+        if (null != branchSessions) {
+            return branchSessions.add(branchSession);
+        } else {
+            // db and redis no need to deal with
+            return true;
+        }
+    }
+
+    /**
+     * Remove boolean.
+     *
+     * @param branchSession the branch session
+     * @return the boolean
+     */
+    public boolean remove(BranchSession branchSession) {
+        return branchSessions.remove(branchSession);
+    }
+
+    private Set<SessionLifecycleListener> lifecycleListeners = new HashSet<>();
+
+    /**
+     * Can be committed async boolean.
+     *
+     * @return the boolean
+     */
+    public boolean canBeCommittedAsync() {
+        List<BranchSession> branchSessions = getBranchSessions();
+        for (BranchSession branchSession : branchSessions) {
+            if (!branchSession.canBeCommittedAsync()) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Has AT branch
+     *
+     * @return the boolean
+     */
+    public boolean hasATBranch() {
+        List<BranchSession> branchSessions = getBranchSessions();
+        for (BranchSession branchSession : branchSessions) {
+            if (branchSession.getBranchType() == BranchType.AT) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Is saga type transaction
+     *
+     * @return is saga
+     */
+    public boolean isSaga() {
+        List<BranchSession> branchSessions = getBranchSessions();
+        if (branchSessions.size() > 0) {
+            return BranchType.SAGA == branchSessions.get(0).getBranchType();
+        } else {
+            return StringUtils.isNotBlank(transactionName)
+                && transactionName.startsWith(Constants.SAGA_TRANS_NAME_PREFIX);
+        }
+    }
+
+    /**
+     * Is timeout boolean.
+     *
+     * @return the boolean
+     */
+    public boolean isTimeout() {
+        return (System.currentTimeMillis() - beginTime) > timeout;
+    }
+
+    /**
+     * prevent could not handle committing and rollbacking transaction
+     * @return if true retry commit or roll back
+     */
+    public boolean isDeadSession() {
+        return (System.currentTimeMillis() - beginTime) > RETRY_DEAD_THRESHOLD;
+    }
+
+    @Override
+    public void begin() throws TransactionException {
+        this.status = GlobalStatus.Begin;
+        this.beginTime = System.currentTimeMillis();
+        this.active = true;
+        for (SessionLifecycleListener lifecycleListener : lifecycleListeners) {
+            lifecycleListener.onBegin(this);
+        }
+    }
+
+    @Override
+    public void changeGlobalStatus(GlobalStatus status) throws TransactionException {
+        if (GlobalStatus.Rollbacking == status) {
+            LockerManagerFactory.getLockManager().updateLockStatus(xid, LockStatus.Rollbacking);
+        }
+        this.status = status;
+        for (SessionLifecycleListener lifecycleListener : lifecycleListeners) {
+            lifecycleListener.onStatusChange(this, status);
+        }
+    }
+
+    @Override
+    public void changeBranchStatus(BranchSession branchSession, BranchStatus status)
+        throws TransactionException {
+        branchSession.setStatus(status);
+        for (SessionLifecycleListener lifecycleListener : lifecycleListeners) {
+            lifecycleListener.onBranchStatusChange(this, branchSession, status);
+        }
+    }
+
+    @Override
+    public boolean isActive() {
+        return active;
+    }
+
+    @Override
+    public void close() throws TransactionException {
+        if (active) {
+            for (SessionLifecycleListener lifecycleListener : lifecycleListeners) {
+                lifecycleListener.onClose(this);
+            }
+        }
+    }
+
+    @Override
+    public void end() throws TransactionException {
+        if (GlobalStatus.isTwoPhaseSuccess(status)) {
+            // Clean locks first
+            clean();
+            for (SessionLifecycleListener lifecycleListener : lifecycleListeners) {
+                lifecycleListener.onSuccessEnd(this);
+            }
+        } else {
+            for (SessionLifecycleListener lifecycleListener : lifecycleListeners) {
+                lifecycleListener.onFailEnd(this);
+            }
+        }
+    }
+
+    public void clean() throws TransactionException {
+        if (!LockerManagerFactory.getLockManager().releaseGlobalSessionLock(this)) {
+            throw new TransactionException("UnLock globalSession error, xid = " + this.xid);
+        }
+    }
+
+    /**
+     * Close and clean.
+     *
+     * @throws TransactionException the transaction exception
+     */
+    public void closeAndClean() throws TransactionException {
+        close();
+        if (this.hasATBranch()) {
+            clean();
+        }
+    }
+
+    /**
+     * Add session lifecycle listener.
+     *
+     * @param sessionLifecycleListener the session lifecycle listener
+     */
+    public void addSessionLifecycleListener(SessionLifecycleListener sessionLifecycleListener) {
+        lifecycleListeners.add(sessionLifecycleListener);
+    }
+
+    /**
+     * Remove session lifecycle listener.
+     *
+     * @param sessionLifecycleListener the session lifecycle listener
+     */
+    public void removeSessionLifecycleListener(SessionLifecycleListener sessionLifecycleListener) {
+        lifecycleListeners.remove(sessionLifecycleListener);
+    }
+
+    @Override
+    public void addBranch(BranchSession branchSession) throws TransactionException {
+        for (SessionLifecycleListener lifecycleListener : lifecycleListeners) {
+            lifecycleListener.onAddBranch(this, branchSession);
+        }
+        branchSession.setStatus(BranchStatus.Registered);
+        add(branchSession);
+    }
+
+    public void loadBranchs() {
+        if (branchSessions == null && isLazyLoadBranch()) {
+            synchronized (this) {
+                if (branchSessions == null && isLazyLoadBranch()) {
+                    branchSessions = new ArrayList<>();
+                    Optional.ofNullable(SessionHolder.getRootSessionManager().findGlobalSession(xid, true))
+                        .ifPresent(globalSession -> branchSessions.addAll(globalSession.getBranchSessions()));
+                }
+            }
+        }
+    }
+
+    @Override
+    public void unlockBranch(BranchSession branchSession) throws TransactionException {
+        // do not unlock if global status in (Committing, CommitRetrying, AsyncCommitting),
+        // because it's already unlocked in 'DefaultCore.commit()'
+        if (status != Committing && status != CommitRetrying && status != AsyncCommitting) {
+            if (!branchSession.unlock()) {
+                throw new TransactionException("Unlock branch lock failed, xid = " + this.xid + ", branchId = " + branchSession.getBranchId());
+            }
+        }
+    }
+
+    @Override
+    public void removeBranch(BranchSession branchSession) throws TransactionException {
+        for (SessionLifecycleListener lifecycleListener : lifecycleListeners) {
+            lifecycleListener.onRemoveBranch(this, branchSession);
+        }
+        remove(branchSession);
+    }
+
+    @Override
+    public void removeAndUnlockBranch(BranchSession branchSession) throws TransactionException {
+        unlockBranch(branchSession);
+        removeBranch(branchSession);
+    }
+
+    /**
+     * Gets branch.
+     *
+     * @param branchId the branch id
+     * @return the branch
+     */
+    public BranchSession getBranch(long branchId) {
+        synchronized (this) {
+            List<BranchSession> branchSessions = getBranchSessions();
+            for (BranchSession branchSession : branchSessions) {
+                if (branchSession.getBranchId() == branchId) {
+                    return branchSession;
+                }
+            }
+
+            return null;
+        }
+    }
+
+    /**
+     * Gets sorted branches.
+     *
+     * @return the sorted branches
+     */
+    public List<BranchSession> getSortedBranches() {
+        return new ArrayList<>(getBranchSessions());
+    }
+
+    /**
+     * Gets reverse sorted branches.
+     *
+     * @return the reverse sorted branches
+     */
+    public List<BranchSession> getReverseSortedBranches() {
+        List<BranchSession> reversed = new ArrayList<>(getBranchSessions());
+        Collections.reverse(reversed);
+        return reversed;
+    }
+
+    /**
+     * Instantiates a new Global session.
+     */
+    public GlobalSession() {
+        this.lazyLoadBranch = false;
+    }
+
+    /**
+     * Instantiates a new Global session.
+     *
+     * @param applicationId           the application id
+     * @param transactionServiceGroup the transaction service group
+     * @param transactionName         the transaction name
+     * @param timeout                 the timeout
+     * @param lazyLoadBranch          the lazy load branch
+     */
+    public GlobalSession(String applicationId, String transactionServiceGroup, String transactionName, int timeout, boolean lazyLoadBranch) {
+        this.transactionId = UUIDGenerator.generateUUID();
+        this.status = GlobalStatus.Begin;
+        this.lazyLoadBranch = lazyLoadBranch;
+        if (!lazyLoadBranch) {
+            this.branchSessions = new ArrayList<>();
+        }
+        this.applicationId = applicationId;
+        this.transactionServiceGroup = transactionServiceGroup;
+        this.transactionName = transactionName;
+        this.timeout = timeout;
+        this.xid = XID.generateXID(transactionId);
+    }
+
+    /**
+     * Instantiates a new Global session.
+     *
+     * @param applicationId           the application id
+     * @param transactionServiceGroup the transaction service group
+     * @param transactionName         the transaction name
+     * @param timeout                 the timeout
+     */
+    public GlobalSession(String applicationId, String transactionServiceGroup, String transactionName, int timeout) {
+        this(applicationId, transactionServiceGroup, transactionName, timeout, false);
+    }
+
+    /**
+     * Gets transaction id.
+     *
+     * @return the transaction id
+     */
+    public long getTransactionId() {
+        return transactionId;
+    }
+
+    /**
+     * Sets transaction id.
+     *
+     * @param transactionId the transaction id
+     */
+    public void setTransactionId(long transactionId) {
+        this.transactionId = transactionId;
+    }
+
+    /**
+     * Gets status.
+     *
+     * @return the status
+     */
+    public GlobalStatus getStatus() {
+        return status;
+    }
+
+    /**
+     * Sets status.
+     *
+     * @param status the status
+     */
+    public void setStatus(GlobalStatus status) {
+        this.status = status;
+    }
+
+    /**
+     * Gets xid.
+     *
+     * @return the xid
+     */
+    public String getXid() {
+        return xid;
+    }
+
+    /**
+     * Sets xid.
+     *
+     * @param xid the xid
+     */
+    public void setXid(String xid) {
+        this.xid = xid;
+    }
+
+    /**
+     * Gets application id.
+     *
+     * @return the application id
+     */
+    public String getApplicationId() {
+        return applicationId;
+    }
+
+    /**
+     * Gets transaction service group.
+     *
+     * @return the transaction service group
+     */
+    public String getTransactionServiceGroup() {
+        return transactionServiceGroup;
+    }
+
+    /**
+     * Gets transaction name.
+     *
+     * @return the transaction name
+     */
+    public String getTransactionName() {
+        return transactionName;
+    }
+
+    /**
+     * Gets timeout.
+     *
+     * @return the timeout
+     */
+    public int getTimeout() {
+        return timeout;
+    }
+
+    /**
+     * Gets begin time.
+     *
+     * @return the begin time
+     */
+    public long getBeginTime() {
+        return beginTime;
+    }
+
+    /**
+     * Sets begin time.
+     *
+     * @param beginTime the begin time
+     */
+    public void setBeginTime(long beginTime) {
+        this.beginTime = beginTime;
+    }
+
+    /**
+     * Gets application data.
+     *
+     * @return the application data
+     */
+    public String getApplicationData() {
+        return applicationData;
+    }
+
+    /**
+     * Sets application data.
+     *
+     * @param applicationData the application data
+     */
+    public void setApplicationData(String applicationData) {
+        this.applicationData = applicationData;
+    }
+
+    public boolean isLazyLoadBranch() {
+        return lazyLoadBranch;
+    }
+
+    /**
+     * Create global session global session.
+     *
+     * @param applicationId  the application id
+     * @param txServiceGroup the tx service group
+     * @param txName         the tx name
+     * @param timeout        the timeout
+     * @return the global session
+     */
+    public static GlobalSession createGlobalSession(String applicationId, String txServiceGroup, String txName,
+        int timeout) {
+        GlobalSession session = new GlobalSession(applicationId, txServiceGroup, txName, timeout, false);
+        return session;
+    }
+
+    /**
+     * Sets active.
+     *
+     * @param active the active
+     */
+    public void setActive(boolean active) {
+        this.active = active;
+    }
+
+    @Override
+    public byte[] encode() {
+        byte[] byApplicationIdBytes = applicationId != null ? applicationId.getBytes() : null;
+
+        byte[] byServiceGroupBytes = transactionServiceGroup != null ? transactionServiceGroup.getBytes() : null;
+
+        byte[] byTxNameBytes = transactionName != null ? transactionName.getBytes() : null;
+
+        byte[] xidBytes = xid != null ? xid.getBytes() : null;
+
+        byte[] applicationDataBytes = applicationData != null ? applicationData.getBytes() : null;
+
+        int size = calGlobalSessionSize(byApplicationIdBytes, byServiceGroupBytes, byTxNameBytes, xidBytes,
+            applicationDataBytes);
+
+        if (size > MAX_GLOBAL_SESSION_SIZE) {
+            throw new RuntimeException("global session size exceeded, size : " + size + " maxBranchSessionSize : " +
+                MAX_GLOBAL_SESSION_SIZE);
+        }
+        ByteBuffer byteBuffer = byteBufferThreadLocal.get();
+        //recycle
+        byteBuffer.clear();
+
+        byteBuffer.putLong(transactionId);
+        byteBuffer.putInt(timeout);
+        if (byApplicationIdBytes != null) {
+            byteBuffer.putShort((short)byApplicationIdBytes.length);
+            byteBuffer.put(byApplicationIdBytes);
+        } else {
+            byteBuffer.putShort((short)0);
+        }
+        if (byServiceGroupBytes != null) {
+            byteBuffer.putShort((short)byServiceGroupBytes.length);
+            byteBuffer.put(byServiceGroupBytes);
+        } else {
+            byteBuffer.putShort((short)0);
+        }
+        if (byTxNameBytes != null) {
+            byteBuffer.putShort((short)byTxNameBytes.length);
+            byteBuffer.put(byTxNameBytes);
+        } else {
+            byteBuffer.putShort((short)0);
+        }
+        if (xidBytes != null) {
+            byteBuffer.putInt(xidBytes.length);
+            byteBuffer.put(xidBytes);
+        } else {
+            byteBuffer.putInt(0);
+        }
+        if (applicationDataBytes != null) {
+            byteBuffer.putInt(applicationDataBytes.length);
+            byteBuffer.put(applicationDataBytes);
+        } else {
+            byteBuffer.putInt(0);
+        }
+
+        byteBuffer.putLong(beginTime);
+        byteBuffer.put((byte)status.getCode());
+        byteBuffer.flip();
+        byte[] result = new byte[byteBuffer.limit()];
+        byteBuffer.get(result);
+        return result;
+    }
+
+    private int calGlobalSessionSize(byte[] byApplicationIdBytes, byte[] byServiceGroupBytes, byte[] byTxNameBytes,
+        byte[] xidBytes, byte[] applicationDataBytes) {
+        final int size = 8 // transactionId
+            + 4 // timeout
+            + 2 // byApplicationIdBytes.length
+            + 2 // byServiceGroupBytes.length
+            + 2 // byTxNameBytes.length
+            + 4 // xidBytes.length
+            + 4 // applicationDataBytes.length
+            + 8 // beginTime
+            + 1 // statusCode
+            + (byApplicationIdBytes == null ? 0 : byApplicationIdBytes.length)
+            + (byServiceGroupBytes == null ? 0 : byServiceGroupBytes.length)
+            + (byTxNameBytes == null ? 0 : byTxNameBytes.length)
+            + (xidBytes == null ? 0 : xidBytes.length)
+            + (applicationDataBytes == null ? 0 : applicationDataBytes.length);
+        return size;
+    }
+
+    @Override
+    public void decode(byte[] a) {
+        this.branchSessions = new ArrayList<>();
+        ByteBuffer byteBuffer = ByteBuffer.wrap(a);
+        this.transactionId = byteBuffer.getLong();
+        this.timeout = byteBuffer.getInt();
+        short applicationIdLen = byteBuffer.getShort();
+        if (applicationIdLen > 0) {
+            byte[] byApplicationId = new byte[applicationIdLen];
+            byteBuffer.get(byApplicationId);
+            this.applicationId = new String(byApplicationId);
+        }
+        short serviceGroupLen = byteBuffer.getShort();
+        if (serviceGroupLen > 0) {
+            byte[] byServiceGroup = new byte[serviceGroupLen];
+            byteBuffer.get(byServiceGroup);
+            this.transactionServiceGroup = new String(byServiceGroup);
+        }
+        short txNameLen = byteBuffer.getShort();
+        if (txNameLen > 0) {
+            byte[] byTxName = new byte[txNameLen];
+            byteBuffer.get(byTxName);
+            this.transactionName = new String(byTxName);
+        }
+        int xidLen = byteBuffer.getInt();
+        if (xidLen > 0) {
+            byte[] xidBytes = new byte[xidLen];
+            byteBuffer.get(xidBytes);
+            this.xid = new String(xidBytes);
+        }
+        int applicationDataLen = byteBuffer.getInt();
+        if (applicationDataLen > 0) {
+            byte[] applicationDataLenBytes = new byte[applicationDataLen];
+            byteBuffer.get(applicationDataLenBytes);
+            this.applicationData = new String(applicationDataLenBytes);
+        }
+
+        this.beginTime = byteBuffer.getLong();
+        this.status = GlobalStatus.get(byteBuffer.get());
+    }
+
+    /**
+     * Has branch boolean.
+     *
+     * @return the boolean
+     */
+    public boolean hasBranch() {
+        return getBranchSessions().size() > 0;
+    }
+
+    public void lock() throws TransactionException {
+        globalSessionLock.lock();
+    }
+
+    public void unlock() {
+        globalSessionLock.unlock();
+    }
+
+    private static class GlobalSessionLock {
+
+        private Lock globalSessionLock = new ReentrantLock();
+
+        private static final int GLOBAL_SESSION_LOCK_TIME_OUT_MILLS = 2 * 1000;
+
+        public void lock() throws TransactionException {
+            try {
+                if (globalSessionLock.tryLock(GLOBAL_SESSION_LOCK_TIME_OUT_MILLS, TimeUnit.MILLISECONDS)) {
+                    return;
+                }
+            } catch (InterruptedException e) {
+                LOGGER.error("Interrupted error", e);
+            }
+            throw new GlobalTransactionException(TransactionExceptionCode.FailedLockGlobalTranscation, "Lock global session failed");
+        }
+
+        public void unlock() {
+            globalSessionLock.unlock();
+        }
+    }
+
+    @FunctionalInterface
+    public interface LockRunnable {
+
+        void run() throws TransactionException;
+    }
+
+    @FunctionalInterface
+    public interface LockCallable<V> {
+
+        V call() throws TransactionException;
+    }
+
+    public List<BranchSession> getBranchSessions() {
+        loadBranchs();
+        return branchSessions;
+    }
+
+    public void asyncCommit() throws TransactionException {
+        this.addSessionLifecycleListener(SessionHolder.getAsyncCommittingSessionManager());
+        this.setStatus(GlobalStatus.AsyncCommitting);
+        SessionHolder.getAsyncCommittingSessionManager().addGlobalSession(this);
+    }
+
+    public void queueToRetryCommit() throws TransactionException {
+        this.addSessionLifecycleListener(SessionHolder.getRetryCommittingSessionManager());
+        this.setStatus(GlobalStatus.CommitRetrying);
+        SessionHolder.getRetryCommittingSessionManager().addGlobalSession(this);
+    }
+
+    public void queueToRetryRollback() throws TransactionException {
+        this.addSessionLifecycleListener(SessionHolder.getRetryRollbackingSessionManager());
+        GlobalStatus currentStatus = this.getStatus();
+        if (SessionStatusValidator.isTimeoutGlobalStatus(currentStatus)) {
+            this.setStatus(GlobalStatus.TimeoutRollbackRetrying);
+        } else {
+            this.setStatus(GlobalStatus.RollbackRetrying);
+        }
+        SessionHolder.getRetryRollbackingSessionManager().addGlobalSession(this);
+    }
+
+    @Override
+    public String toString() {
+        return "GlobalSession{" + "xid='" + xid + '\'' + ", transactionId=" + transactionId + ", status=" + status
+            + ", applicationId='" + applicationId + '\'' + ", transactionServiceGroup='" + transactionServiceGroup
+            + '\'' + ", transactionName='" + transactionName + '\'' + ", timeout=" + timeout + ", beginTime="
+            + beginTime + ", applicationData='" + applicationData + '\'' + ", lazyLoadBranch=" + lazyLoadBranch
+            + ", active=" + active + ", branchSessions=" + branchSessions + ", globalSessionLock=" + globalSessionLock
+            + ", lifecycleListeners=" + lifecycleListeners + '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/GlobalSessionHandler.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/GlobalSessionHandler.java
new file mode 100644
index 0000000..515b155
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/GlobalSessionHandler.java
@@ -0,0 +1,36 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.session;
+
+import io.seata.core.exception.TransactionException;
+
+/**
+ * The Functional Interface Global session handler
+ *
+ * @author wang.liang
+ * @since 1.5.0
+ */
+@FunctionalInterface
+public interface GlobalSessionHandler {
+
+    /**
+     * Handle global session.
+     *
+     * @param globalSession the global session
+     * @throws TransactionException the transaction exception
+     */
+    void handle(GlobalSession globalSession) throws TransactionException;
+}
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/Lockable.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/Lockable.java
new file mode 100644
index 0000000..d023e63
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/Lockable.java
@@ -0,0 +1,42 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.session;
+
+import io.seata.core.exception.TransactionException;
+
+/**
+ * The interface Lockable.
+ *
+ * @author sharajava
+ */
+public interface Lockable {
+
+    /**
+     * Lock boolean.
+     *
+     * @return the boolean
+     * @throws TransactionException the transaction exception
+     */
+    boolean lock() throws TransactionException;
+
+    /**
+     * Unlock boolean.
+     *
+     * @return the boolean
+     * @throws TransactionException the transaction exception
+     */
+    boolean unlock() throws TransactionException;
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/Reloadable.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/Reloadable.java
new file mode 100644
index 0000000..5701c69
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/Reloadable.java
@@ -0,0 +1,29 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.session;
+
+/**
+ * Service contains states which can be reloaded.
+ *
+ * @author sharajava
+ */
+public interface Reloadable {
+
+    /**
+     * Reload states.
+     */
+    void reload();
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionCondition.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionCondition.java
new file mode 100644
index 0000000..6542a72
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionCondition.java
@@ -0,0 +1,145 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.session;
+
+import io.seata.core.model.GlobalStatus;
+
+/**
+ * The type Session condition.
+ *
+ * @author slievrly
+ */
+public class SessionCondition {
+    private Long transactionId;
+    private String xid;
+    private GlobalStatus status;
+    private GlobalStatus[] statuses;
+    private Long overTimeAliveMills;
+    private boolean lazyLoadBranch;
+
+    /**
+     * Instantiates a new Session condition.
+     */
+    public SessionCondition() {
+    }
+
+    /**
+     * Instantiates a new Session condition.
+     *
+     * @param xid the xid
+     */
+    public SessionCondition(String xid) {
+        this.xid = xid;
+    }
+
+    /**
+     * Instantiates a new Session condition.
+     *
+     * @param status the status
+     */
+    public SessionCondition(GlobalStatus status) {
+        this.status = status;
+        this.statuses = new GlobalStatus[] {status};
+    }
+
+    /**
+     * Instantiates a new Session condition.
+     *
+     * @param statuses the statuses
+     */
+    public SessionCondition(GlobalStatus... statuses) {
+        this.statuses = statuses;
+    }
+
+    /**
+     * Instantiates a new Session condition.
+     *
+     * @param overTimeAliveMills the over time alive mills
+     */
+    public SessionCondition(long overTimeAliveMills) {
+        this.overTimeAliveMills = overTimeAliveMills;
+    }
+
+    /**
+     * Gets status.
+     *
+     * @return the status
+     */
+    public GlobalStatus getStatus() {
+        return status;
+    }
+
+    /**
+     * Sets status.
+     *
+     * @param status the status
+     */
+    public void setStatus(GlobalStatus status) {
+        this.status = status;
+        this.statuses = new GlobalStatus[] {status};
+    }
+
+    /**
+     * Gets over time alive mills.
+     *
+     * @return the over time alive mills
+     */
+    public Long getOverTimeAliveMills() {
+        return overTimeAliveMills;
+    }
+
+    /**
+     * Sets over time alive mills.
+     *
+     * @param overTimeAliveMills the over time alive mills
+     */
+    public void setOverTimeAliveMills(Long overTimeAliveMills) {
+        this.overTimeAliveMills = overTimeAliveMills;
+    }
+
+    public Long getTransactionId() {
+        return transactionId;
+    }
+
+    public void setTransactionId(Long transactionId) {
+        this.transactionId = transactionId;
+    }
+
+    public String getXid() {
+        return xid;
+    }
+
+    public void setXid(String xid) {
+        this.xid = xid;
+    }
+
+    public GlobalStatus[] getStatuses() {
+        return statuses;
+    }
+
+    public void setStatuses(GlobalStatus... statuses) {
+        this.statuses = statuses;
+    }
+
+    public boolean isLazyLoadBranch() {
+        return lazyLoadBranch;
+    }
+
+    public void setLazyLoadBranch(boolean lazyLoadBranch) {
+        this.lazyLoadBranch = lazyLoadBranch;
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionHelper.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionHelper.java
new file mode 100644
index 0000000..12e5f25
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionHelper.java
@@ -0,0 +1,346 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.session;
+
+import io.seata.common.util.CollectionUtils;
+import io.seata.config.Configuration;
+import io.seata.config.ConfigurationFactory;
+import io.seata.core.constants.ConfigurationKeys;
+import io.seata.core.context.RootContext;
+import io.seata.core.exception.TransactionException;
+import io.seata.core.model.BranchType;
+import io.seata.core.model.GlobalStatus;
+import io.seata.metrics.IdConstants;
+import io.seata.server.UUIDGenerator;
+import io.seata.server.coordinator.DefaultCoordinator;
+import io.seata.server.metrics.MetricsPublisher;
+import io.seata.server.store.StoreConfig;
+import io.seata.server.store.StoreConfig.SessionMode;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.MDC;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
+
+import static io.seata.common.DefaultValues.DEFAULT_ENABLE_BRANCH_ASYNC_REMOVE;
+
+/**
+ * The type Session helper.
+ *
+ * @author sharajava
+ */
+public class SessionHelper {
+    private static final Logger LOGGER = LoggerFactory.getLogger(SessionHelper.class);
+
+    /**
+     * The constant CONFIG.
+     */
+    private static final Configuration CONFIG = ConfigurationFactory.getInstance();
+
+    private static final Boolean ENABLE_BRANCH_ASYNC_REMOVE = CONFIG.getBoolean(
+            ConfigurationKeys.ENABLE_BRANCH_ASYNC_REMOVE, DEFAULT_ENABLE_BRANCH_ASYNC_REMOVE);
+
+    /**
+     * The instance of DefaultCoordinator
+     */
+    private static final DefaultCoordinator COORDINATOR = DefaultCoordinator.getInstance();
+
+    private static final boolean DELAY_HANDLE_SESSION = StoreConfig.getSessionMode() != SessionMode.FILE;
+
+    private SessionHelper() {
+    }
+
+    public static BranchSession newBranchByGlobal(GlobalSession globalSession, BranchType branchType, String resourceId, String lockKeys, String clientId) {
+        return newBranchByGlobal(globalSession, branchType, resourceId, null, lockKeys, clientId);
+    }
+
+    /**
+     * New branch by global branch session.
+     *
+     * @param globalSession the global session
+     * @param branchType    the branch type
+     * @param resourceId    the resource id
+     * @param lockKeys      the lock keys
+     * @param clientId      the client id
+     * @return the branch session
+     */
+    public static BranchSession newBranchByGlobal(GlobalSession globalSession, BranchType branchType, String resourceId,
+            String applicationData, String lockKeys, String clientId) {
+        BranchSession branchSession = new BranchSession();
+
+        branchSession.setXid(globalSession.getXid());
+        branchSession.setTransactionId(globalSession.getTransactionId());
+        branchSession.setBranchId(UUIDGenerator.generateUUID());
+        branchSession.setBranchType(branchType);
+        branchSession.setResourceId(resourceId);
+        branchSession.setLockKey(lockKeys);
+        branchSession.setClientId(clientId);
+        branchSession.setApplicationData(applicationData);
+
+        return branchSession;
+    }
+
+    /**
+     * New branch
+     *
+     * @param branchType      the branch type
+     * @param xid             Transaction id.
+     * @param branchId        Branch id.
+     * @param resourceId      Resource id.
+     * @param applicationData Application data bind with this branch.
+     * @return the branch session
+     */
+    public static BranchSession newBranch(BranchType branchType, String xid, long branchId, String resourceId, String applicationData) {
+        BranchSession branchSession = new BranchSession();
+        branchSession.setXid(xid);
+        branchSession.setBranchId(branchId);
+        branchSession.setBranchType(branchType);
+        branchSession.setResourceId(resourceId);
+        branchSession.setApplicationData(applicationData);
+        return branchSession;
+    }
+
+    /**
+     * End committed.
+     *
+     * @param globalSession the global session
+     * @param retryGlobal   the retry global
+     * @throws TransactionException the transaction exception
+     */
+    public static void endCommitted(GlobalSession globalSession, boolean retryGlobal) throws TransactionException {
+        if (retryGlobal || !DELAY_HANDLE_SESSION) {
+            long beginTime = System.currentTimeMillis();
+            boolean retryBranch = globalSession.getStatus() == GlobalStatus.CommitRetrying;
+            globalSession.changeGlobalStatus(GlobalStatus.Committed);
+            globalSession.end();
+            if (!DELAY_HANDLE_SESSION) {
+                MetricsPublisher.postSessionDoneEvent(globalSession, false, false);
+            }
+            MetricsPublisher.postSessionDoneEvent(globalSession, IdConstants.STATUS_VALUE_AFTER_COMMITTED_KEY, true,
+                beginTime, retryBranch);
+        } else {
+            if (globalSession.isSaga()) {
+                globalSession.setStatus(GlobalStatus.Committed);
+                globalSession.end();
+            }
+            MetricsPublisher.postSessionDoneEvent(globalSession, false, false);
+        }
+    }
+
+    /**
+     * End commit failed.
+     *
+     * @param globalSession the global session
+     * @param retryGlobal   the retry global
+     * @throws TransactionException the transaction exception
+     */
+    public static void endCommitFailed(GlobalSession globalSession, boolean retryGlobal) throws TransactionException {
+        endCommitFailed(globalSession, retryGlobal, false);
+    }
+
+    /**
+     * End commit failed.
+     *
+     * @param globalSession  the global session
+     * @param retryGlobal    the retry global
+     * @param isRetryTimeout is retry timeout
+     * @throws TransactionException the transaction exception
+     */
+    public static void endCommitFailed(GlobalSession globalSession, boolean retryGlobal, boolean isRetryTimeout)
+        throws TransactionException {
+        if (isRetryTimeout) {
+            globalSession.changeGlobalStatus(GlobalStatus.CommitRetryTimeout);
+        } else {
+            globalSession.changeGlobalStatus(GlobalStatus.CommitFailed);
+        }
+        LOGGER.error("The Global session {} has changed the status to {}, need to be handled it manually.",
+            globalSession.getXid(), globalSession.getStatus());
+
+        globalSession.end();
+        MetricsPublisher.postSessionDoneEvent(globalSession, retryGlobal, false);
+    }
+
+    /**
+     * End rollbacked.
+     *
+     * @param globalSession the global session
+     * @param retryGlobal   the retry global
+     * @throws TransactionException the transaction exception
+     */
+    public static void endRollbacked(GlobalSession globalSession, boolean retryGlobal) throws TransactionException {
+        if (retryGlobal || !DELAY_HANDLE_SESSION) {
+            long beginTime = System.currentTimeMillis();
+            boolean timeoutDone = false;
+            GlobalStatus currentStatus = globalSession.getStatus();
+            if (currentStatus == GlobalStatus.TimeoutRollbacking) {
+                MetricsPublisher.postSessionDoneEvent(globalSession, GlobalStatus.TimeoutRollbacked, false, false);
+                timeoutDone = true;
+            }
+            boolean retryBranch =
+                    currentStatus == GlobalStatus.TimeoutRollbackRetrying || currentStatus == GlobalStatus.RollbackRetrying;
+            if (SessionStatusValidator.isTimeoutGlobalStatus(currentStatus)) {
+                globalSession.changeGlobalStatus(GlobalStatus.TimeoutRollbacked);
+            } else {
+                globalSession.changeGlobalStatus(GlobalStatus.Rollbacked);
+            }
+            globalSession.end();
+            if (!DELAY_HANDLE_SESSION && !timeoutDone) {
+                MetricsPublisher.postSessionDoneEvent(globalSession, false, false);
+            }
+            MetricsPublisher.postSessionDoneEvent(globalSession, IdConstants.STATUS_VALUE_AFTER_ROLLBACKED_KEY, true,
+                    beginTime, retryBranch);
+        } else {
+            if (globalSession.isSaga()) {
+                globalSession.setStatus(GlobalStatus.Rollbacked);
+                globalSession.end();
+            }
+            MetricsPublisher.postSessionDoneEvent(globalSession, GlobalStatus.Rollbacked, false, false);
+        }
+    }
+
+    /**
+     * End rollback failed.
+     *
+     * @param globalSession the global session
+     * @param retryGlobal   the retry global
+     * @throws TransactionException the transaction exception
+     */
+    public static void endRollbackFailed(GlobalSession globalSession, boolean retryGlobal) throws TransactionException {
+        endRollbackFailed(globalSession, retryGlobal, false);
+    }
+
+    /**
+     * End rollback failed.
+     *
+     * @param globalSession the global session
+     * @param retryGlobal   the retry global
+     * @param isRetryTimeout   is retry timeout
+     * @throws TransactionException the transaction exception
+     */
+    public static void endRollbackFailed(GlobalSession globalSession, boolean retryGlobal, boolean isRetryTimeout) throws TransactionException {
+        GlobalStatus currentStatus = globalSession.getStatus();
+        if (isRetryTimeout) {
+            globalSession.changeGlobalStatus(GlobalStatus.RollbackRetryTimeout);
+        } else if (SessionStatusValidator.isTimeoutGlobalStatus(currentStatus)) {
+            globalSession.changeGlobalStatus(GlobalStatus.TimeoutRollbackFailed);
+        } else {
+            globalSession.changeGlobalStatus(GlobalStatus.RollbackFailed);
+        }
+        LOGGER.error("The Global session {} has changed the status to {}, need to be handled it manually.", globalSession.getXid(), globalSession.getStatus());
+        globalSession.end();
+        MetricsPublisher.postSessionDoneEvent(globalSession, retryGlobal, false);
+    }
+
+    /**
+     * Foreach global sessions.
+     *
+     * @param sessions the global sessions
+     * @param handler  the handler
+     * @since 1.5.0
+     */
+    public static void forEach(Collection<GlobalSession> sessions, GlobalSessionHandler handler) {
+        if (CollectionUtils.isEmpty(sessions)) {
+            return;
+        }
+        sessions.parallelStream().forEach(globalSession -> {
+            try {
+                MDC.put(RootContext.MDC_KEY_XID, globalSession.getXid());
+                handler.handle(globalSession);
+            } catch (Throwable th) {
+                LOGGER.error("handle global session failed: {}", globalSession.getXid(), th);
+            } finally {
+                MDC.remove(RootContext.MDC_KEY_XID);
+            }
+        });
+    }
+
+    /**
+     * Foreach branch sessions.
+     *
+     * @param sessions the branch session
+     * @param handler  the handler
+     * @since 1.5.0
+     */
+    public static Boolean forEach(Collection<BranchSession> sessions, BranchSessionHandler handler) throws TransactionException {
+        Boolean result;
+        for (BranchSession branchSession : sessions) {
+            try {
+                MDC.put(RootContext.MDC_KEY_BRANCH_ID, String.valueOf(branchSession.getBranchId()));
+                result = handler.handle(branchSession);
+                if (result == null) {
+                    continue;
+                }
+                return result;
+            } finally {
+                MDC.remove(RootContext.MDC_KEY_BRANCH_ID);
+            }
+        }
+        return null;
+    }
+
+
+    /**
+     * remove branchSession from globalSession
+     * @param globalSession the globalSession
+     * @param branchSession the branchSession
+     * @param isAsync if asynchronous remove
+     */
+    public static void removeBranch(GlobalSession globalSession, BranchSession branchSession, boolean isAsync)
+            throws TransactionException {
+        globalSession.unlockBranch(branchSession);
+        if (isEnableBranchRemoveAsync() && isAsync) {
+            COORDINATOR.doBranchRemoveAsync(globalSession, branchSession);
+        } else {
+            globalSession.removeBranch(branchSession);
+        }
+    }
+
+    /**
+     * remove branchSession from globalSession
+     * @param globalSession the globalSession
+     * @param isAsync if asynchronous remove
+     */
+    public static void removeAllBranch(GlobalSession globalSession, boolean isAsync)
+            throws TransactionException {
+        List<BranchSession> branchSessions = globalSession.getSortedBranches();
+        if (branchSessions == null || branchSessions.isEmpty()) {
+            return;
+        }
+        boolean isAsyncRemove = isEnableBranchRemoveAsync() && isAsync;
+        for (BranchSession branchSession : branchSessions) {
+            if (isAsyncRemove) {
+                globalSession.unlockBranch(branchSession);
+            } else {
+                globalSession.removeAndUnlockBranch(branchSession);
+            }
+        }
+        if (isAsyncRemove) {
+            COORDINATOR.doBranchRemoveAllAsync(globalSession);
+        }
+    }
+
+    /**
+     * if true, enable delete the branch asynchronously
+     *
+     * @return the boolean
+     */
+    private static boolean isEnableBranchRemoveAsync() {
+        return Objects.equals(Boolean.TRUE, DELAY_HANDLE_SESSION)
+                && Objects.equals(Boolean.TRUE, ENABLE_BRANCH_ASYNC_REMOVE);
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionHolder.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionHolder.java
new file mode 100644
index 0000000..a05bda4
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionHolder.java
@@ -0,0 +1,426 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.session;
+
+import io.seata.common.ConfigurationKeys;
+import io.seata.common.XID;
+import io.seata.common.exception.ShouldNeverHappenException;
+import io.seata.common.exception.StoreException;
+import io.seata.common.loader.EnhancedServiceLoader;
+import io.seata.common.util.CollectionUtils;
+import io.seata.common.util.StringUtils;
+import io.seata.config.Configuration;
+import io.seata.config.ConfigurationFactory;
+import io.seata.core.exception.TransactionException;
+import io.seata.core.model.GlobalStatus;
+import io.seata.core.model.LockStatus;
+import io.seata.core.store.DistributedLockDO;
+import io.seata.core.store.DistributedLocker;
+import io.seata.server.lock.distributed.DistributedLockerFactory;
+import io.seata.server.store.StoreConfig;
+import io.seata.server.store.StoreConfig.SessionMode;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+
+import static io.seata.common.DefaultValues.DEFAULT_DISTRIBUTED_LOCK_EXPIRE_TIME;
+
+/**
+ * The type Session holder.
+ *
+ * @author sharajava
+ */
+public class SessionHolder {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(SessionHolder.class);
+
+    /**
+     * The constant CONFIG.
+     */
+    protected static final Configuration CONFIG = ConfigurationFactory.getInstance();
+    /**
+     * The constant ROOT_SESSION_MANAGER_NAME.
+     */
+    public static final String ROOT_SESSION_MANAGER_NAME = "root.data";
+    /**
+     * The constant ASYNC_COMMITTING_SESSION_MANAGER_NAME.
+     */
+    public static final String ASYNC_COMMITTING_SESSION_MANAGER_NAME = "async.commit.data";
+    /**
+     * The constant RETRY_COMMITTING_SESSION_MANAGER_NAME.
+     */
+    public static final String RETRY_COMMITTING_SESSION_MANAGER_NAME = "retry.commit.data";
+    /**
+     * The constant RETRY_ROLLBACKING_SESSION_MANAGER_NAME.
+     */
+    public static final String RETRY_ROLLBACKING_SESSION_MANAGER_NAME = "retry.rollback.data";
+
+    /**
+     * The default session store dir
+     */
+    public static final String DEFAULT_SESSION_STORE_FILE_DIR = "sessionStore";
+
+    /**
+     * The redis distributed lock expire time
+     */
+    private static long DISTRIBUTED_LOCK_EXPIRE_TIME = CONFIG.getLong(ConfigurationKeys.DISTRIBUTED_LOCK_EXPIRE_TIME, DEFAULT_DISTRIBUTED_LOCK_EXPIRE_TIME);
+
+    private static SessionManager ROOT_SESSION_MANAGER;
+    private static SessionManager ASYNC_COMMITTING_SESSION_MANAGER;
+    private static SessionManager RETRY_COMMITTING_SESSION_MANAGER;
+    private static SessionManager RETRY_ROLLBACKING_SESSION_MANAGER;
+
+    private static DistributedLocker DISTRIBUTED_LOCKER;
+
+    public static void init() {
+        init(null);
+    }
+    /**
+     * Init.
+     *
+     * @param sessionMode the store mode: file, db, redis
+     * @throws IOException the io exception
+     */
+    public static void init(SessionMode sessionMode) {
+        if (null == sessionMode) {
+            sessionMode = StoreConfig.getSessionMode();
+        }
+        LOGGER.info("use session store mode: {}", sessionMode.getName());
+        if (SessionMode.DB.equals(sessionMode)) {
+            ROOT_SESSION_MANAGER = EnhancedServiceLoader.load(SessionManager.class, SessionMode.DB.getName());
+            ASYNC_COMMITTING_SESSION_MANAGER = EnhancedServiceLoader.load(SessionManager.class, SessionMode.DB.getName(),
+                new Object[]{ASYNC_COMMITTING_SESSION_MANAGER_NAME});
+            RETRY_COMMITTING_SESSION_MANAGER = EnhancedServiceLoader.load(SessionManager.class, SessionMode.DB.getName(),
+                new Object[]{RETRY_COMMITTING_SESSION_MANAGER_NAME});
+            RETRY_ROLLBACKING_SESSION_MANAGER = EnhancedServiceLoader.load(SessionManager.class, SessionMode.DB.getName(),
+                new Object[]{RETRY_ROLLBACKING_SESSION_MANAGER_NAME});
+
+            DISTRIBUTED_LOCKER = DistributedLockerFactory.getDistributedLocker(SessionMode.DB.getName());
+        } else if (SessionMode.FILE.equals(sessionMode)) {
+            String sessionStorePath = CONFIG.getConfig(ConfigurationKeys.STORE_FILE_DIR,
+                    DEFAULT_SESSION_STORE_FILE_DIR);
+            if (StringUtils.isBlank(sessionStorePath)) {
+                throw new StoreException("the {store.file.dir} is empty.");
+            }
+            ROOT_SESSION_MANAGER = EnhancedServiceLoader.load(SessionManager.class, SessionMode.FILE.getName(),
+                new Object[]{ROOT_SESSION_MANAGER_NAME, sessionStorePath});
+            ASYNC_COMMITTING_SESSION_MANAGER = ROOT_SESSION_MANAGER;
+            RETRY_COMMITTING_SESSION_MANAGER = ROOT_SESSION_MANAGER;
+            RETRY_ROLLBACKING_SESSION_MANAGER = ROOT_SESSION_MANAGER;
+
+            DISTRIBUTED_LOCKER = DistributedLockerFactory.getDistributedLocker(SessionMode.FILE.getName());
+        } else if (SessionMode.REDIS.equals(sessionMode)) {
+            ROOT_SESSION_MANAGER = EnhancedServiceLoader.load(SessionManager.class, SessionMode.REDIS.getName());
+            ASYNC_COMMITTING_SESSION_MANAGER = EnhancedServiceLoader.load(SessionManager.class,
+                SessionMode.REDIS.getName(), new Object[]{ASYNC_COMMITTING_SESSION_MANAGER_NAME});
+            RETRY_COMMITTING_SESSION_MANAGER = EnhancedServiceLoader.load(SessionManager.class,
+                SessionMode.REDIS.getName(), new Object[]{RETRY_COMMITTING_SESSION_MANAGER_NAME});
+            RETRY_ROLLBACKING_SESSION_MANAGER = EnhancedServiceLoader.load(SessionManager.class,
+                SessionMode.REDIS.getName(), new Object[]{RETRY_ROLLBACKING_SESSION_MANAGER_NAME});
+
+            DISTRIBUTED_LOCKER = DistributedLockerFactory.getDistributedLocker(SessionMode.REDIS.getName());
+        } else {
+            // unknown store
+            throw new IllegalArgumentException("unknown store mode:" + sessionMode.getName());
+        }
+        reload(sessionMode);
+    }
+
+    //region reload
+
+    /**
+     * Reload.
+     *
+     * @param sessionMode the mode of store
+     */
+    protected static void reload(SessionMode sessionMode) {
+
+        if (ROOT_SESSION_MANAGER instanceof Reloadable) {
+            ((Reloadable) ROOT_SESSION_MANAGER).reload();
+        }
+
+        if (SessionMode.FILE.equals(sessionMode)) {
+            Collection<GlobalSession> allSessions = ROOT_SESSION_MANAGER.allSessions();
+            if (CollectionUtils.isNotEmpty(allSessions)) {
+                for (GlobalSession globalSession : allSessions) {
+                    GlobalStatus globalStatus = globalSession.getStatus();
+                    switch (globalStatus) {
+                        case UnKnown:
+                        case Committed:
+                        case CommitFailed:
+                        case Rollbacked:
+                        case RollbackFailed:
+                        case TimeoutRollbacked:
+                        case TimeoutRollbackFailed:
+                        case Finished:
+                            removeInErrorState(globalSession);
+                            break;
+                        case AsyncCommitting:
+                            queueToAsyncCommitting(globalSession);
+                            break;
+                        case Committing:
+                        case CommitRetrying:
+                            queueToRetryCommit(globalSession);
+                            break;
+                        default: {
+                            lockBranchSessions(globalSession.getSortedBranches());
+                            switch (globalStatus) {
+                                case Rollbacking:
+                                case RollbackRetrying:
+                                case TimeoutRollbacking:
+                                case TimeoutRollbackRetrying:
+                                    globalSession.getBranchSessions().parallelStream()
+                                        .forEach(branchSession -> branchSession.setLockStatus(LockStatus.Rollbacking));
+                                    queueToRetryRollback(globalSession);
+                                    break;
+                                case Begin:
+                                    globalSession.setActive(true);
+                                    break;
+                                default:
+                                    LOGGER.error("Could not handle the global session, xid: {}", globalSession.getXid());
+                                    throw new ShouldNeverHappenException("NOT properly handled " + globalStatus);
+                            }
+                            break;
+                        }
+                    }
+                }
+            }
+        } else {
+            // Redis, db and so on
+            CompletableFuture.runAsync(() -> {
+                SessionCondition searchCondition = new SessionCondition(GlobalStatus.UnKnown, GlobalStatus.Committed,
+                        GlobalStatus.Rollbacked, GlobalStatus.TimeoutRollbacked, GlobalStatus.Finished);
+                searchCondition.setLazyLoadBranch(true);
+
+                long now = System.currentTimeMillis();
+                List<GlobalSession> errorStatusGlobalSessions = ROOT_SESSION_MANAGER.findGlobalSessions(searchCondition);
+                while (!CollectionUtils.isEmpty(errorStatusGlobalSessions)) {
+                    for (GlobalSession errorStatusGlobalSession : errorStatusGlobalSessions) {
+                        if (errorStatusGlobalSession.getBeginTime() >= now) {
+                            // Exit when the global transaction begin after the instance started
+                            return;
+                        }
+
+                        removeInErrorState(errorStatusGlobalSession);
+                    }
+
+                    // Load the next part
+                    errorStatusGlobalSessions = ROOT_SESSION_MANAGER.findGlobalSessions(searchCondition);
+                }
+            });
+        }
+    }
+
+    private static void removeInErrorState(GlobalSession globalSession) {
+        try {
+            LOGGER.warn("The global session should NOT be {}, remove it. xid = {}", globalSession.getStatus(), globalSession.getXid());
+            ROOT_SESSION_MANAGER.removeGlobalSession(globalSession);
+            if (LOGGER.isInfoEnabled()) {
+                LOGGER.info("Remove global session succeed, xid = {}, status = {}", globalSession.getXid(), globalSession.getStatus());
+            }
+        } catch (Exception e) {
+            LOGGER.error("Remove global session failed, xid = {}, status = {}", globalSession.getXid(), globalSession.getStatus(), e);
+        }
+    }
+
+    private static void queueToAsyncCommitting(GlobalSession globalSession) {
+        try {
+            globalSession.addSessionLifecycleListener(getAsyncCommittingSessionManager());
+            getAsyncCommittingSessionManager().addGlobalSession(globalSession);
+        } catch (TransactionException e) {
+            throw new ShouldNeverHappenException(e);
+        }
+    }
+
+    private static void lockBranchSessions(List<BranchSession> branchSessions) {
+        branchSessions.forEach(branchSession -> {
+            try {
+                branchSession.lock();
+            } catch (TransactionException e) {
+                throw new ShouldNeverHappenException(e);
+            }
+        });
+    }
+
+    private static void queueToRetryCommit(GlobalSession globalSession) {
+        try {
+            globalSession.addSessionLifecycleListener(getRetryCommittingSessionManager());
+            getRetryCommittingSessionManager().addGlobalSession(globalSession);
+        } catch (TransactionException e) {
+            throw new ShouldNeverHappenException(e);
+        }
+    }
+
+    private static void queueToRetryRollback(GlobalSession globalSession) {
+        try {
+            globalSession.addSessionLifecycleListener(getRetryRollbackingSessionManager());
+            getRetryRollbackingSessionManager().addGlobalSession(globalSession);
+        } catch (TransactionException e) {
+            throw new ShouldNeverHappenException(e);
+        }
+    }
+
+    //endregion
+
+    //region get session manager
+
+    /**
+     * Gets root session manager.
+     *
+     * @return the root session manager
+     */
+    public static SessionManager getRootSessionManager() {
+        if (ROOT_SESSION_MANAGER == null) {
+            throw new ShouldNeverHappenException("SessionManager is NOT init!");
+        }
+        return ROOT_SESSION_MANAGER;
+    }
+
+    /**
+     * Gets async committing session manager.
+     *
+     * @return the async committing session manager
+     */
+    @Deprecated
+    public static SessionManager getAsyncCommittingSessionManager() {
+        if (ASYNC_COMMITTING_SESSION_MANAGER == null) {
+            throw new ShouldNeverHappenException("SessionManager is NOT init!");
+        }
+        return ASYNC_COMMITTING_SESSION_MANAGER;
+    }
+
+    /**
+     * Gets retry committing session manager.
+     *
+     * @return the retry committing session manager
+     */
+    @Deprecated
+    public static SessionManager getRetryCommittingSessionManager() {
+        if (RETRY_COMMITTING_SESSION_MANAGER == null) {
+            throw new ShouldNeverHappenException("SessionManager is NOT init!");
+        }
+        return RETRY_COMMITTING_SESSION_MANAGER;
+    }
+
+    /**
+     * Gets retry rollbacking session manager.
+     *
+     * @return the retry rollbacking session manager
+     */
+    @Deprecated
+    public static SessionManager getRetryRollbackingSessionManager() {
+        if (RETRY_ROLLBACKING_SESSION_MANAGER == null) {
+            throw new ShouldNeverHappenException("SessionManager is NOT init!");
+        }
+        return RETRY_ROLLBACKING_SESSION_MANAGER;
+    }
+
+    //endregion
+
+    /**
+     * Find global session.
+     *
+     * @param xid the xid
+     * @return the global session
+     */
+    public static GlobalSession findGlobalSession(String xid) {
+        return findGlobalSession(xid, true);
+    }
+
+    /**
+     * Find global session.
+     *
+     * @param xid                the xid
+     * @param withBranchSessions the withBranchSessions
+     * @return the global session
+     */
+    public static GlobalSession findGlobalSession(String xid, boolean withBranchSessions) {
+        return getRootSessionManager().findGlobalSession(xid, withBranchSessions);
+    }
+
+    /**
+     * lock and execute
+     *
+     * @param globalSession the global session
+     * @param lockCallable  the lock Callable
+     * @return the value
+     */
+    public static <T> T lockAndExecute(GlobalSession globalSession, GlobalSession.LockCallable<T> lockCallable)
+            throws TransactionException {
+        return getRootSessionManager().lockAndExecute(globalSession, lockCallable);
+    }
+
+    /**
+     * acquire lock
+     *
+     * @param lockKey the lock key, should be distinct for each lock
+     * @return the boolean
+     */
+    public static boolean acquireDistributedLock(String lockKey) {
+        return DISTRIBUTED_LOCKER.acquireLock(new DistributedLockDO(lockKey, XID.getIpAddressAndPort(), DISTRIBUTED_LOCK_EXPIRE_TIME));
+    }
+
+    /**
+     * release lock
+     *
+     * @return the boolean
+     */
+    public static boolean releaseDistributedLock(String lockKey) {
+        return DISTRIBUTED_LOCKER.releaseLock(new DistributedLockDO(lockKey, XID.getIpAddressAndPort(), DISTRIBUTED_LOCK_EXPIRE_TIME));
+    }
+
+    /**
+     * Execute the function after get the distribute lock
+     *
+     * @param key  the distribute lock key
+     * @param func the function to be call
+     * @return whether the func be call
+     */
+    public static boolean distributedLockAndExecute(String key, NoArgsFunc func) {
+        boolean lock = false;
+        try {
+            if (lock = acquireDistributedLock(key)) {
+                func.call();
+            }
+        } catch (Exception e) {
+            LOGGER.error("Exception running function with key = {}", key, e);
+        } finally {
+            if (lock) {
+                try {
+                    SessionHolder.releaseDistributedLock(key);
+                } catch (Exception ex) {
+                    LOGGER.warn("release distribute lock failure, message = {}", ex.getMessage(), ex);
+                }
+            }
+        }
+        return lock;
+    }
+
+    public static void destroy() {
+        if (ROOT_SESSION_MANAGER != null) {
+            ROOT_SESSION_MANAGER.destroy();
+        }
+    }
+
+    @FunctionalInterface
+    public interface NoArgsFunc {
+        void call();
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionLifecycle.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionLifecycle.java
new file mode 100644
index 0000000..eb9bfcd
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionLifecycle.java
@@ -0,0 +1,105 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.session;
+
+import io.seata.core.exception.TransactionException;
+import io.seata.core.model.BranchStatus;
+import io.seata.core.model.GlobalStatus;
+
+/**
+ * The interface Session lifecycle.
+ *
+ * @author sharajava
+ */
+public interface SessionLifecycle {
+
+    /**
+     * Begin.
+     *
+     * @throws TransactionException the transaction exception
+     */
+    void begin() throws TransactionException;
+
+    /**
+     * Change status.
+     *
+     * @param status the status
+     * @throws TransactionException the transaction exception
+     */
+    void changeGlobalStatus(GlobalStatus status) throws TransactionException;
+
+    /**
+     * Change branch status.
+     *
+     * @param branchSession the branch session
+     * @param status        the status
+     * @throws TransactionException the transaction exception
+     */
+    void changeBranchStatus(BranchSession branchSession, BranchStatus status) throws TransactionException;
+
+    /**
+     * Add branch.
+     *
+     * @param branchSession the branch session
+     * @throws TransactionException the transaction exception
+     */
+    void addBranch(BranchSession branchSession) throws TransactionException;
+
+    /**
+     * Release the lock of branch.
+     *
+     * @param branchSession the branch session
+     * @throws TransactionException the transaction exception
+     */
+    void unlockBranch(BranchSession branchSession) throws TransactionException;
+
+    /**
+     * Remove branch.
+     *
+     * @param branchSession the branch session
+     * @throws TransactionException the transaction exception
+     */
+    void removeBranch(BranchSession branchSession) throws TransactionException;
+
+    /**
+     * Remove branch and release the lock of branch.
+     *
+     * @param branchSession the branchSession
+     * @throws TransactionException the TransactionException
+     */
+    void removeAndUnlockBranch(BranchSession branchSession) throws TransactionException;
+
+    /**
+     * Is active boolean.
+     *
+     * @return the boolean
+     */
+    boolean isActive();
+
+    /**
+     * Close.
+     *
+     * @throws TransactionException the transaction exception
+     */
+    void close() throws TransactionException;
+
+    /**
+     * end.
+     *
+     * @throws TransactionException the transaction exception
+     */
+    void end() throws TransactionException;
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionLifecycleListener.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionLifecycleListener.java
new file mode 100644
index 0000000..693d5b6
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionLifecycleListener.java
@@ -0,0 +1,98 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.session;
+
+import io.seata.core.exception.TransactionException;
+import io.seata.core.model.BranchStatus;
+import io.seata.core.model.GlobalStatus;
+
+/**
+ * The interface Session lifecycle listener.
+ *
+ * @author sharajava
+ */
+public interface SessionLifecycleListener {
+
+    /**
+     * On begin.
+     *
+     * @param globalSession the global session
+     * @throws TransactionException the transaction exception
+     */
+    void onBegin(GlobalSession globalSession) throws TransactionException;
+
+    /**
+     * On status change.
+     *
+     * @param globalSession the global session
+     * @param status        the status
+     * @throws TransactionException the transaction exception
+     */
+    void onStatusChange(GlobalSession globalSession, GlobalStatus status) throws TransactionException;
+
+    /**
+     * On branch status change.
+     *
+     * @param globalSession the global session
+     * @param branchSession the branch session
+     * @param status        the status
+     * @throws TransactionException the transaction exception
+     */
+    void onBranchStatusChange(GlobalSession globalSession, BranchSession branchSession, BranchStatus status)
+        throws TransactionException;
+
+    /**
+     * On add branch.
+     *
+     * @param globalSession the global session
+     * @param branchSession the branch session
+     * @throws TransactionException the transaction exception
+     */
+    void onAddBranch(GlobalSession globalSession, BranchSession branchSession) throws TransactionException;
+
+    /**
+     * On remove branch.
+     *
+     * @param globalSession the global session
+     * @param branchSession the branch session
+     * @throws TransactionException the transaction exception
+     */
+    void onRemoveBranch(GlobalSession globalSession, BranchSession branchSession) throws TransactionException;
+
+    /**
+     * On close.
+     *
+     * @param globalSession the global session
+     * @throws TransactionException the transaction exception
+     */
+    void onClose(GlobalSession globalSession) throws TransactionException;
+
+    /**
+     * On end.
+     *
+     * @param globalSession the global session
+     * @throws TransactionException the transaction exception
+     */
+    void onSuccessEnd(GlobalSession globalSession) throws TransactionException;
+
+    /**
+     * On fail end.
+     *
+     * @param globalSession the global session
+     * @throws TransactionException the transaction exception
+     */
+    void onFailEnd(GlobalSession globalSession) throws TransactionException;
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionManager.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionManager.java
new file mode 100644
index 0000000..ac357eb
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionManager.java
@@ -0,0 +1,127 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.session;
+
+import io.seata.core.exception.TransactionException;
+import io.seata.core.model.BranchStatus;
+import io.seata.core.model.GlobalStatus;
+import io.seata.core.rpc.Disposable;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * The interface Session manager.
+ *
+ * @author sharajava
+ */
+public interface SessionManager extends SessionLifecycleListener, Disposable {
+
+    /**
+     * Add global session.
+     *
+     * @param session the session
+     * @throws TransactionException the transaction exception
+     */
+    void addGlobalSession(GlobalSession session) throws TransactionException;
+
+    /**
+     * Find global session global session.
+     *
+     * @param xid the xid
+     * @return the global session
+     */
+    GlobalSession findGlobalSession(String xid) ;
+
+    /**
+     * Find global session global session.
+     *
+     * @param xid the xid
+     * @param withBranchSessions the withBranchSessions
+     * @return the global session
+     */
+    GlobalSession findGlobalSession(String xid, boolean withBranchSessions);
+
+    /**
+     * Update global session status.
+     *
+     * @param session the session
+     * @param status  the status
+     * @throws TransactionException the transaction exception
+     */
+    void updateGlobalSessionStatus(GlobalSession session, GlobalStatus status) throws TransactionException;
+
+    /**
+     * Remove global session.
+     *
+     * @param session the session
+     * @throws TransactionException the transaction exception
+     */
+    void removeGlobalSession(GlobalSession session) throws TransactionException;
+
+    /**
+     * Add branch session.
+     *
+     * @param globalSession the global session
+     * @param session       the session
+     * @throws TransactionException the transaction exception
+     */
+    void addBranchSession(GlobalSession globalSession, BranchSession session) throws TransactionException;
+
+    /**
+     * Update branch session status.
+     *
+     * @param session the session
+     * @param status  the status
+     * @throws TransactionException the transaction exception
+     */
+    void updateBranchSessionStatus(BranchSession session, BranchStatus status) throws TransactionException;
+
+    /**
+     * Remove branch session.
+     *
+     * @param globalSession the global session
+     * @param session       the session
+     * @throws TransactionException the transaction exception
+     */
+    void removeBranchSession(GlobalSession globalSession, BranchSession session) throws TransactionException;
+
+    /**
+     * All sessions collection.
+     *
+     * @return the collection
+     */
+    Collection<GlobalSession> allSessions();
+
+    /**
+     * Find global sessions list.
+     *
+     * @param condition the condition
+     * @return the list
+     */
+    List<GlobalSession> findGlobalSessions(SessionCondition condition);
+
+    /**
+     * lock and execute
+     *
+     * @param globalSession the global session
+     * @param lockCallable the lock Callable
+     * @return the value
+     * @throws TransactionException the transaction exception
+     */
+    <T> T lockAndExecute(GlobalSession globalSession, GlobalSession.LockCallable<T> lockCallable)
+            throws TransactionException;
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionStatusValidator.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionStatusValidator.java
new file mode 100644
index 0000000..20323a7
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionStatusValidator.java
@@ -0,0 +1,87 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.session;
+
+import io.seata.core.model.GlobalStatus;
+
+/**
+ * The type change status validator.
+ *
+ * @author Bughue
+ */
+public class SessionStatusValidator {
+
+    /**
+     * is timeout global status
+     *
+     * @param status the global session
+     */
+    public static boolean isTimeoutGlobalStatus(GlobalStatus status) {
+        return status == GlobalStatus.TimeoutRollbacked
+                || status == GlobalStatus.TimeoutRollbackFailed
+                || status == GlobalStatus.TimeoutRollbacking
+                || status == GlobalStatus.TimeoutRollbackRetrying;
+    }
+
+    /**
+     * is rollback global status
+     *
+     * @param status the global session
+     */
+    public static boolean isRollbackGlobalStatus(GlobalStatus status) {
+        return status == GlobalStatus.Rollbacking
+                || status == GlobalStatus.RollbackRetrying
+                || status == GlobalStatus.Rollbacked
+                || status == GlobalStatus.RollbackFailed
+                || status == GlobalStatus.RollbackRetryTimeout;
+    }
+
+    /**
+     * is commit global status
+     *
+     * @param status the global session
+     */
+    public static boolean isCommitGlobalStatus(GlobalStatus status) {
+        return status == GlobalStatus.Committing
+                || status == GlobalStatus.AsyncCommitting
+                || status == GlobalStatus.CommitRetrying
+                || status == GlobalStatus.Committed
+                || status == GlobalStatus.CommitFailed
+                || status == GlobalStatus.CommitRetryTimeout;
+    }
+
+    /**
+     * check the relation of before status and after status
+     *
+     * @param before the global session
+     * @param after the global session
+     */
+    public static boolean validateUpdateStatus(GlobalStatus before, GlobalStatus after) {
+        if (isTimeoutGlobalStatus(before) && isCommitGlobalStatus(after)) {
+            return false;
+        }
+        if (isCommitGlobalStatus(before) && isTimeoutGlobalStatus(after)) {
+            return false;
+        }
+        if (isRollbackGlobalStatus(before) && isCommitGlobalStatus(after)) {
+            return false;
+        }
+        if (isCommitGlobalStatus(before) && isRollbackGlobalStatus(after)) {
+            return false;
+        }
+        return true;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/spring/listener/SeataPropertiesLoader.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/spring/listener/SeataPropertiesLoader.java
new file mode 100644
index 0000000..3a913c9
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/spring/listener/SeataPropertiesLoader.java
@@ -0,0 +1,70 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.spring.listener;
+
+import io.seata.common.util.CollectionUtils;
+import io.seata.common.util.StringUtils;
+import io.seata.config.ConfigurationFactory;
+import io.seata.config.FileConfiguration;
+import io.seata.config.file.FileConfig;
+import io.seata.server.store.StoreConfig;
+import org.springframework.context.ApplicationContextInitializer;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.core.Ordered;
+import org.springframework.core.annotation.Order;
+import org.springframework.core.env.ConfigurableEnvironment;
+import org.springframework.core.env.PropertiesPropertySource;
+
+import java.util.*;
+
+import static io.seata.common.ConfigurationKeys.*;
+
+@Order(Ordered.HIGHEST_PRECEDENCE)
+public class SeataPropertiesLoader implements ApplicationContextInitializer<ConfigurableApplicationContext> {
+
+    List<String> prefixList = Arrays.asList(FILE_ROOT_PREFIX_CONFIG, FILE_ROOT_PREFIX_REGISTRY, SERVER_PREFIX,
+        STORE_PREFIX, METRICS_PREFIX, TRANSPORT_PREFIX);
+
+    @Override
+    public void initialize(ConfigurableApplicationContext applicationContext) {
+        ConfigurableEnvironment environment = applicationContext.getEnvironment();
+        FileConfiguration configuration = ConfigurationFactory.getOriginFileInstanceRegistry();
+        FileConfig fileConfig = configuration.getFileConfig();
+        Map<String, Object> configs = fileConfig.getAllConfig();
+        if (CollectionUtils.isNotEmpty(configs)) {
+            Optional<FileConfiguration> originFileInstance = ConfigurationFactory.getOriginFileInstance();
+            originFileInstance
+                .ifPresent(fileConfiguration -> configs.putAll(fileConfiguration.getFileConfig().getAllConfig()));
+            Properties properties = new Properties();
+            configs.forEach((k, v) -> {
+                if (v instanceof String) {
+                    if (StringUtils.isEmpty((String)v)) {
+                        return;
+                    }
+                }
+                // Convert the configuration name to the configuration name under Spring Boot
+                if (prefixList.stream().anyMatch(k::startsWith)) {
+                    properties.put(SEATA_FILE_PREFIX_ROOT_CONFIG + k, v);
+                }
+            });
+            environment.getPropertySources().addLast(new PropertiesPropertySource("seataOldConfig", properties));
+        }
+        // Load by priority
+        System.setProperty("sessionMode", StoreConfig.getSessionMode().getName());
+        System.setProperty("lockMode", StoreConfig.getLockMode().getName());
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/spring/listener/ServerApplicationListener.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/spring/listener/ServerApplicationListener.java
new file mode 100644
index 0000000..5d9e0b1
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/spring/listener/ServerApplicationListener.java
@@ -0,0 +1,124 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.spring.listener;
+
+import io.seata.common.holder.ObjectHolder;
+import io.seata.common.util.StringUtils;
+import io.seata.spring.boot.autoconfigure.SeataCoreEnvironmentPostProcessor;
+import io.seata.spring.boot.autoconfigure.SeataServerEnvironmentPostProcessor;
+import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
+import org.springframework.boot.context.logging.LoggingApplicationListener;
+import org.springframework.context.ApplicationEvent;
+import org.springframework.context.event.GenericApplicationListener;
+import org.springframework.core.ResolvableType;
+import org.springframework.core.env.ConfigurableEnvironment;
+import org.springframework.core.env.PropertiesPropertySource;
+
+import java.util.Properties;
+
+import static io.seata.common.Constants.OBJECT_KEY_SPRING_CONFIGURABLE_ENVIRONMENT;
+import static io.seata.common.DefaultValues.SERVICE_OFFSET_SPRING_BOOT;
+import static io.seata.core.constants.ConfigurationKeys.*;
+
+/**
+ * @author slievrly
+ * @author funkye
+ */
+public class ServerApplicationListener implements GenericApplicationListener {
+
+    @Override
+    public boolean supportsEventType(ResolvableType eventType) {
+        return eventType.getRawClass() != null
+                && ApplicationEnvironmentPreparedEvent.class.isAssignableFrom(eventType.getRawClass());
+    }
+
+    @Override
+    public void onApplicationEvent(ApplicationEvent event) {
+        if (!(event instanceof ApplicationEnvironmentPreparedEvent)) {
+            return;
+        }
+        ApplicationEnvironmentPreparedEvent environmentPreparedEvent = (ApplicationEnvironmentPreparedEvent)event;
+        ConfigurableEnvironment environment = environmentPreparedEvent.getEnvironment();
+        ObjectHolder.INSTANCE.setObject(OBJECT_KEY_SPRING_CONFIGURABLE_ENVIRONMENT, environment);
+        SeataCoreEnvironmentPostProcessor.init();
+        SeataServerEnvironmentPostProcessor.init();
+
+        String[] args = environmentPreparedEvent.getArgs();
+
+        // port: -p > -D > env > yml > default
+
+        //-p 8091
+        if (args != null && args.length >= 2) {
+            for (int i = 0; i < args.length; ++i) {
+                if ("-p".equalsIgnoreCase(args[i]) && i < args.length - 1) {
+                    setTargetPort(environment, args[i + 1], true);
+                    return;
+                }
+            }
+        }
+
+        // -Dserver.servicePort=8091
+        String dPort = environment.getProperty(SERVER_SERVICE_PORT_CAMEL, String.class);
+        if (StringUtils.isNotBlank(dPort)) {
+            setTargetPort(environment, dPort, true);
+            return;
+        }
+
+        //docker -e SEATA_PORT=8091
+        String envPort = environment.getProperty(ENV_SEATA_PORT_KEY, String.class);
+        if (StringUtils.isNotBlank(envPort)) {
+            setTargetPort(environment, envPort, true);
+            return;
+        }
+
+        //yml properties server.service-port=8091
+        String configPort = environment.getProperty(SERVER_SERVICE_PORT_CONFIG, String.class);
+        if (StringUtils.isNotBlank(configPort)) {
+            setTargetPort(environment, configPort, false);
+            return;
+        }
+
+        // server.port=7091
+        String serverPort = environment.getProperty("server.port", String.class);
+        if (StringUtils.isBlank(serverPort)) {
+            serverPort = "8080";
+        }
+        String servicePort = String.valueOf(Integer.parseInt(serverPort) + SERVICE_OFFSET_SPRING_BOOT);
+        setTargetPort(environment, servicePort, true);
+    }
+
+    private void setTargetPort(ConfigurableEnvironment environment, String port, boolean needAddPropertySource) {
+        // get rpc port first, use to logback-spring.xml, @see the class named `SystemPropertyLoggerContextListener`
+        System.setProperty(SERVER_SERVICE_PORT_CAMEL, port);
+
+        if (needAddPropertySource) {
+            // add property source to the first position
+            Properties pro = new Properties();
+            pro.setProperty(SERVER_SERVICE_PORT_CONFIG, port);
+            environment.getPropertySources().addFirst(new PropertiesPropertySource("serverProperties", pro));
+        }
+    }
+
+    /**
+     * higher than LoggingApplicationListener
+     *
+     * @return the order
+     */
+    @Override
+    public int getOrder() {
+        return LoggingApplicationListener.DEFAULT_ORDER - 1;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/SessionConverter.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/SessionConverter.java
new file mode 100644
index 0000000..b6b2f95
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/SessionConverter.java
@@ -0,0 +1,207 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.storage;
+
+import io.seata.common.util.CollectionUtils;
+import io.seata.common.util.StringUtils;
+import io.seata.core.model.BranchStatus;
+import io.seata.core.model.BranchType;
+import io.seata.core.model.GlobalStatus;
+import io.seata.core.store.BranchTransactionDO;
+import io.seata.core.store.GlobalTransactionDO;
+import io.seata.server.console.vo.BranchSessionVO;
+import io.seata.server.console.vo.GlobalSessionVO;
+import io.seata.server.session.BranchSession;
+import io.seata.server.session.GlobalSession;
+import io.seata.server.store.SessionStorable;
+import org.springframework.beans.BeanUtils;
+
+import java.util.*;
+
+/**
+ * The session converter
+ *
+ * @author wangzhongxiang
+ * @author doubleDimple
+ */
+public class SessionConverter {
+
+    public static GlobalSession convertGlobalSession(GlobalTransactionDO globalTransactionDO, boolean lazyLoadBranch) {
+        if (globalTransactionDO == null) {
+            return null;
+        }
+        GlobalSession session = new GlobalSession(globalTransactionDO.getApplicationId(),
+                globalTransactionDO.getTransactionServiceGroup(),
+                globalTransactionDO.getTransactionName(),
+                globalTransactionDO.getTimeout(), lazyLoadBranch);
+        session.setXid(globalTransactionDO.getXid());
+        session.setTransactionId(globalTransactionDO.getTransactionId());
+        session.setStatus(GlobalStatus.get(globalTransactionDO.getStatus()));
+        session.setApplicationData(globalTransactionDO.getApplicationData());
+        session.setBeginTime(globalTransactionDO.getBeginTime());
+        return session;
+    }
+
+    public static GlobalSession convertGlobalSession(GlobalTransactionDO globalTransactionDO) {
+        return convertGlobalSession(globalTransactionDO, false);
+    }
+
+    public static BranchSession convertBranchSession(BranchTransactionDO branchTransactionDO) {
+        if (branchTransactionDO == null) {
+            return null;
+        }
+        BranchSession branchSession = new BranchSession();
+        branchSession.setXid(branchTransactionDO.getXid());
+        branchSession.setTransactionId(branchTransactionDO.getTransactionId());
+        branchSession.setApplicationData(branchTransactionDO.getApplicationData());
+        branchSession.setBranchId(branchTransactionDO.getBranchId());
+        branchSession.setBranchType(BranchType.valueOf(branchTransactionDO.getBranchType()));
+        branchSession.setResourceId(branchTransactionDO.getResourceId());
+        branchSession.setClientId(branchTransactionDO.getClientId());
+        branchSession.setResourceGroupId(branchTransactionDO.getResourceGroupId());
+        branchSession.setStatus(BranchStatus.get(branchTransactionDO.getStatus()));
+        return branchSession;
+    }
+
+    public static GlobalTransactionDO convertGlobalTransactionDO(SessionStorable session) {
+        if (session == null || !(session instanceof GlobalSession)) {
+            throw new IllegalArgumentException(
+                    "The parameter of SessionStorable is not available, SessionStorable:" + StringUtils.toString(session));
+        }
+        GlobalSession globalSession = (GlobalSession)session;
+
+        GlobalTransactionDO globalTransactionDO = new GlobalTransactionDO();
+        globalTransactionDO.setXid(globalSession.getXid());
+        globalTransactionDO.setStatus(globalSession.getStatus().getCode());
+        globalTransactionDO.setApplicationId(globalSession.getApplicationId());
+        globalTransactionDO.setBeginTime(globalSession.getBeginTime());
+        globalTransactionDO.setTimeout(globalSession.getTimeout());
+        globalTransactionDO.setTransactionId(globalSession.getTransactionId());
+        globalTransactionDO.setTransactionName(globalSession.getTransactionName());
+        globalTransactionDO.setTransactionServiceGroup(globalSession.getTransactionServiceGroup());
+        globalTransactionDO.setApplicationData(globalSession.getApplicationData());
+        return globalTransactionDO;
+    }
+
+    public static BranchTransactionDO convertBranchTransactionDO(SessionStorable session) {
+        if (session == null || !(session instanceof BranchSession)) {
+            throw new IllegalArgumentException(
+                    "The parameter of SessionStorable is not available, SessionStorable:" + StringUtils.toString(session));
+        }
+        BranchSession branchSession = (BranchSession)session;
+        BranchTransactionDO branchTransactionDO = new BranchTransactionDO();
+        branchTransactionDO.setXid(branchSession.getXid());
+        branchTransactionDO.setBranchId(branchSession.getBranchId());
+        branchTransactionDO.setBranchType(branchSession.getBranchType().name());
+        branchTransactionDO.setClientId(branchSession.getClientId());
+        branchTransactionDO.setResourceGroupId(branchSession.getResourceGroupId());
+        branchTransactionDO.setTransactionId(branchSession.getTransactionId());
+        branchTransactionDO.setApplicationData(branchSession.getApplicationData());
+        branchTransactionDO.setResourceId(branchSession.getResourceId());
+        branchTransactionDO.setStatus(branchSession.getStatus().getCode());
+        return branchTransactionDO;
+    }
+
+    public static void convertToGlobalSessionVo(List<GlobalSessionVO> result, List<GlobalSession> globalSessions) {
+        if (CollectionUtils.isNotEmpty(globalSessions)) {
+            for (GlobalSession globalSession : globalSessions) {
+                GlobalSessionVO globalSessionVO = new GlobalSessionVO();
+                BeanUtils.copyProperties(globalSession,globalSessionVO);
+                globalSessionVO.setStatus(globalSession.getStatus().getCode());
+                globalSessionVO.setTimeout(Long.valueOf(globalSession.getTimeout()));
+                globalSessionVO.setBranchSessionVOs(converToBranchSession(globalSession.getBranchSessions()));
+                result.add(globalSessionVO);
+            }
+        }
+    }
+
+    public static Set<BranchSessionVO> converToBranchSession(List<BranchSession> branchSessions) {
+        Set<BranchSessionVO> branchSessionVOs = new HashSet<>(branchSessions.size());
+        if (CollectionUtils.isNotEmpty(branchSessions)) {
+            for (BranchSession branchSession : branchSessions) {
+                BranchSessionVO branchSessionVONew = new BranchSessionVO();
+                BeanUtils.copyProperties(branchSession,branchSessionVONew);
+
+                branchSessionVONew.setBranchType(branchSession.getBranchType().name());
+                branchSessionVONew.setStatus(branchSession.getStatus().getCode());
+                branchSessionVOs.add(branchSessionVONew);
+            }
+        }
+        return branchSessionVOs;
+    }
+
+    /**
+     * convert GlobalSession to GlobalSessionVO
+     *
+     * @param filteredSessions the GlobalSession list
+     * @return the GlobalSessionVO list
+     */
+    public static List<GlobalSessionVO> convertGlobalSession(List<GlobalSession> filteredSessions) {
+
+        if (CollectionUtils.isEmpty(filteredSessions)) {
+            return Collections.emptyList();
+        }
+
+        final ArrayList<GlobalSessionVO> result = new ArrayList<>(filteredSessions.size());
+
+        for (GlobalSession session : filteredSessions) {
+            result.add(new GlobalSessionVO(
+                    session.getXid(),
+                    session.getTransactionId(),
+                    session.getStatus().getCode(),
+                    session.getApplicationId(),
+                    session.getTransactionServiceGroup(),
+                    session.getTransactionName(),
+                    (long) session.getTimeout(),
+                    session.getBeginTime(),
+                    session.getApplicationData(),
+                    convertBranchSession(session.getBranchSessions())
+            ));
+        }
+        return result;
+    }
+
+    /**
+     * convert BranchSession to BranchSessionVO
+     *
+     * @param branchSessions the BranchSession list
+     * @return the BranchSessionVO list
+     */
+    public static Set<BranchSessionVO> convertBranchSession(List<BranchSession> branchSessions) {
+
+        if (CollectionUtils.isEmpty(branchSessions)) {
+            return Collections.emptySet();
+        }
+
+        final Set<BranchSessionVO> result = new HashSet<>(branchSessions.size());
+
+        for (BranchSession session : branchSessions) {
+            result.add(new BranchSessionVO(
+                    session.getXid(),
+                    session.getTransactionId(),
+                    session.getBranchId(),
+                    session.getResourceGroupId(),
+                    session.getResourceId(),
+                    session.getBranchType().name(),
+                    session.getStatus().getCode(),
+                    session.getClientId(),
+                    session.getApplicationData()
+            ));
+        }
+        return result;
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/lock/DataBaseDistributedLocker.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/lock/DataBaseDistributedLocker.java
new file mode 100644
index 0000000..f55668f
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/lock/DataBaseDistributedLocker.java
@@ -0,0 +1,283 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.storage.db.lock;
+
+import io.seata.common.exception.ShouldNeverHappenException;
+import io.seata.common.loader.EnhancedServiceLoader;
+import io.seata.common.loader.LoadLevel;
+import io.seata.common.loader.Scope;
+import io.seata.common.util.IOUtil;
+import io.seata.common.util.StringUtils;
+import io.seata.config.*;
+import io.seata.core.constants.ConfigurationKeys;
+import io.seata.core.constants.ServerTableColumnsName;
+import io.seata.core.store.DistributedLockDO;
+import io.seata.core.store.DistributedLocker;
+import io.seata.core.store.db.DataSourceProvider;
+import io.seata.core.store.db.sql.distributed.lock.DistributedLockSqlFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.HashSet;
+import java.util.Objects;
+import java.util.Set;
+
+import static io.seata.core.constants.ConfigurationKeys.DISTRIBUTED_LOCK_DB_TABLE;
+
+/**
+ * @author chd
+ */
+@LoadLevel(name = "db", scope = Scope.SINGLETON)
+public class DataBaseDistributedLocker implements DistributedLocker {
+    private static final Logger LOGGER = LoggerFactory.getLogger(DataBaseDistributedLocker.class);
+
+    private final String dbType;
+
+    private final String datasourceType;
+
+    private volatile String distributedLockTable;
+
+    private DataSource distributedLockDataSource;
+
+    private static final String LOCK_WAIT_TIMEOUT_MYSQL_MESSAGE = "try restarting transaction";
+
+    private static final int LOCK_WAIT_TIMEOUT_MYSQL_CODE = 1205;
+
+    private static final Set<Integer> IGNORE_MYSQL_CODE = new HashSet<>();
+
+    private static final Set<String> IGNORE_MYSQL_MESSAGE = new HashSet<>();
+
+    static {
+        IGNORE_MYSQL_CODE.add(LOCK_WAIT_TIMEOUT_MYSQL_CODE);
+        IGNORE_MYSQL_MESSAGE.add(LOCK_WAIT_TIMEOUT_MYSQL_MESSAGE);
+    }
+
+    /**
+     * whether the distribute lock demotion
+     * using for 1.5.0 only and will remove in 1.6.0
+     */
+    @Deprecated
+    private volatile boolean demotion;
+
+    /**
+     * Instantiates a new Log store data base dao.
+     */
+    public DataBaseDistributedLocker() {
+        Configuration configuration = ConfigurationFactory.getInstance();
+
+        distributedLockTable = configuration.getConfig(DISTRIBUTED_LOCK_DB_TABLE);
+        dbType = configuration.getConfig(ConfigurationKeys.STORE_DB_TYPE);
+        datasourceType = configuration.getConfig(ConfigurationKeys.STORE_DB_DATASOURCE_TYPE);
+
+        if (StringUtils.isBlank(distributedLockTable)) {
+            demotion = true;
+            ConfigurationCache.addConfigListener(DISTRIBUTED_LOCK_DB_TABLE, new ConfigurationChangeListener() {
+                @Override
+                public void onChangeEvent(ConfigurationChangeEvent event) {
+                    String newValue = event.getNewValue();
+                    if (StringUtils.isNotBlank(newValue)) {
+                        distributedLockTable = newValue;
+                        init();
+                        demotion = false;
+                        ConfigurationCache.removeConfigListener(DISTRIBUTED_LOCK_DB_TABLE, this);
+                    }
+                }
+            });
+
+            LOGGER.error("The distribute lock table is not config, please create the target table and config it");
+            return;
+        }
+
+        init();
+    }
+
+
+    @Override
+    public boolean acquireLock(DistributedLockDO distributedLockDO) {
+        if (demotion) {
+            return true;
+        }
+
+        Connection connection = null;
+        boolean originalAutoCommit = false;
+        try {
+            connection = distributedLockDataSource.getConnection();
+            originalAutoCommit = connection.getAutoCommit();
+            connection.setAutoCommit(false);
+
+            DistributedLockDO lockFromDB = getDistributedLockDO(connection, distributedLockDO.getLockKey());
+            if (null == lockFromDB) {
+                boolean ret = insertDistribute(connection, distributedLockDO);
+                connection.commit();
+                return ret;
+            }
+
+            if (lockFromDB.getExpireTime() >= System.currentTimeMillis()) {
+                LOGGER.debug("the distribute lock for key :{} is holding by :{}, acquire lock failure.",
+                        distributedLockDO.getLockKey(), lockFromDB.getLockValue());
+                connection.commit();
+                return false;
+            }
+
+            boolean ret = updateDistributedLock(connection, distributedLockDO);
+            connection.commit();
+
+            return ret;
+        } catch (SQLException ex) {
+            // ignore "Lock wait timeout exceeded; try restarting transaction"
+            // TODO: need nowait adaptation
+            if (!ignoreSQLException(ex)) {
+                LOGGER.error("execute acquire lock failure, key is: {}", distributedLockDO.getLockKey(), ex);
+            }
+            try {
+                if (connection != null) {
+                    connection.rollback();
+                }
+            } catch (SQLException e) {
+                LOGGER.warn("rollback fail because of {}", e.getMessage(), e);
+            }
+            return false;
+        } finally {
+            try {
+                if (originalAutoCommit) {
+                    connection.setAutoCommit(true);
+                }
+                IOUtil.close(connection);
+            } catch (SQLException ignore) { }
+        }
+    }
+
+    @Override
+    public boolean releaseLock(DistributedLockDO distributedLockDO) {
+        if (demotion) {
+            return true;
+        }
+
+        Connection connection = null;
+        boolean originalAutoCommit = false;
+        try {
+            connection = distributedLockDataSource.getConnection();
+            originalAutoCommit = connection.getAutoCommit();
+            connection.setAutoCommit(false);
+
+            DistributedLockDO distributedLockDOFromDB = getDistributedLockDO(connection, distributedLockDO.getLockKey());
+            if (null == distributedLockDOFromDB) {
+                throw new ShouldNeverHappenException("distributedLockDO would not be null when release distribute lock");
+            }
+
+            if (distributedLockDOFromDB.getExpireTime() >= System.currentTimeMillis()
+                    && !Objects.equals(distributedLockDOFromDB.getLockValue(), distributedLockDO.getLockValue())) {
+                if (LOGGER.isDebugEnabled()) {
+                    LOGGER.debug("the distribute lock for key :{} is holding by :{}, skip the release lock.",
+                        distributedLockDO.getLockKey(), distributedLockDOFromDB.getLockValue());
+                }
+                connection.commit();
+                return true;
+            }
+
+            distributedLockDO.setLockValue(StringUtils.SPACE);
+            distributedLockDO.setExpireTime(0L);
+            boolean ret = updateDistributedLock(connection, distributedLockDO);
+
+            connection.commit();
+            return ret;
+        } catch (SQLException ex) {
+            if (!ignoreSQLException(ex)) {
+                LOGGER.error("execute release lock failure, key is: {}", distributedLockDO.getLockKey(), ex);
+            }
+
+            try {
+                if (connection != null) {
+                    connection.rollback();
+                }
+            } catch (SQLException e) {
+                LOGGER.warn("rollback fail because of {}", e.getMessage(), e);
+            }
+            return false;
+        } finally {
+            try {
+                if (originalAutoCommit) {
+                    connection.setAutoCommit(true);
+                }
+                IOUtil.close(connection);
+            } catch (SQLException ignore) { }
+        }
+    }
+
+    protected DistributedLockDO getDistributedLockDO(Connection connection, String key) throws SQLException {
+        try (PreparedStatement pst = connection.prepareStatement(DistributedLockSqlFactory.getDistributedLogStoreSql(dbType)
+                .getSelectDistributeForUpdateSql(distributedLockTable))) {
+
+            pst.setString(1, key);
+            ResultSet resultSet = pst.executeQuery();
+
+            if (resultSet.next()) {
+                DistributedLockDO distributedLock = new DistributedLockDO();
+                distributedLock.setExpireTime(resultSet.getLong(ServerTableColumnsName.DISTRIBUTED_LOCK_EXPIRE));
+                distributedLock.setLockValue(resultSet.getString(ServerTableColumnsName.DISTRIBUTED_LOCK_VALUE));
+                distributedLock.setLockKey(key);
+                return distributedLock;
+            }
+            return null;
+        }
+    }
+
+    protected boolean insertDistribute(Connection connection, DistributedLockDO distributedLockDO) throws SQLException {
+        try (PreparedStatement insertPst = connection.prepareStatement(DistributedLockSqlFactory.getDistributedLogStoreSql(dbType)
+                .getInsertSql(distributedLockTable))) {
+            insertPst.setString(1, distributedLockDO.getLockKey());
+            insertPst.setString(2, distributedLockDO.getLockValue());
+            if (distributedLockDO.getExpireTime() > 0) {
+                distributedLockDO.setExpireTime(distributedLockDO.getExpireTime() + System.currentTimeMillis());
+            }
+            insertPst.setLong(3, distributedLockDO.getExpireTime());
+            return insertPst.executeUpdate() > 0;
+        }
+    }
+
+    protected boolean updateDistributedLock(Connection connection, DistributedLockDO distributedLockDO) throws SQLException {
+        try (PreparedStatement updatePst = connection.prepareStatement(DistributedLockSqlFactory.getDistributedLogStoreSql(dbType)
+                .getUpdateSql(distributedLockTable))) {
+            updatePst.setString(1, distributedLockDO.getLockValue());
+            if (distributedLockDO.getExpireTime() > 0) {
+                distributedLockDO.setExpireTime(distributedLockDO.getExpireTime() + System.currentTimeMillis());
+            }
+            updatePst.setLong(2, distributedLockDO.getExpireTime());
+            updatePst.setString(3, distributedLockDO.getLockKey());
+            return updatePst.executeUpdate() > 0;
+        }
+    }
+
+    private void init() {
+        this.distributedLockDataSource = EnhancedServiceLoader.load(DataSourceProvider.class, datasourceType).provide();
+    }
+
+    private boolean ignoreSQLException(SQLException exception) {
+        if (IGNORE_MYSQL_CODE.contains(exception.getErrorCode())) {
+            return true;
+        }
+        if (StringUtils.isNotBlank(exception.getMessage())) {
+            return IGNORE_MYSQL_MESSAGE.stream().anyMatch(message -> exception.getMessage().contains(message));
+        }
+        return false;
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/lock/DataBaseLockManager.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/lock/DataBaseLockManager.java
new file mode 100644
index 0000000..f73df2f
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/lock/DataBaseLockManager.java
@@ -0,0 +1,78 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.storage.db.lock;
+
+import io.seata.common.executor.Initialize;
+import io.seata.common.loader.EnhancedServiceLoader;
+import io.seata.common.loader.LoadLevel;
+import io.seata.config.ConfigurationFactory;
+import io.seata.core.constants.ConfigurationKeys;
+import io.seata.core.exception.TransactionException;
+import io.seata.core.lock.Locker;
+import io.seata.core.store.db.DataSourceProvider;
+import io.seata.server.lock.AbstractLockManager;
+import io.seata.server.session.BranchSession;
+import io.seata.server.session.GlobalSession;
+
+import javax.sql.DataSource;
+
+/**
+ * The type db lock manager.
+ *
+ * @author zjinlei
+ */
+@LoadLevel(name = "db")
+public class DataBaseLockManager extends AbstractLockManager implements Initialize {
+
+    /**
+     * The locker.
+     */
+    private Locker locker;
+
+    @Override
+    public void init() {
+        // init dataSource
+        String datasourceType = ConfigurationFactory.getInstance().getConfig(ConfigurationKeys.STORE_DB_DATASOURCE_TYPE);
+        DataSource lockStoreDataSource = EnhancedServiceLoader.load(DataSourceProvider.class, datasourceType).provide();
+        locker = new DataBaseLocker(lockStoreDataSource);
+    }
+
+    @Override
+    public boolean releaseLock(BranchSession branchSession) throws TransactionException {
+        try {
+            return getLocker().releaseLock(branchSession.getXid(), branchSession.getBranchId());
+        } catch (Exception t) {
+            LOGGER.error("unLock error, xid {}, branchId:{}", branchSession.getXid(), branchSession.getBranchId(), t);
+            return false;
+        }
+    }
+
+    @Override
+    public Locker getLocker(BranchSession branchSession) {
+        return locker;
+    }
+
+    @Override
+    public boolean releaseGlobalSessionLock(GlobalSession globalSession) throws TransactionException {
+        try {
+            return getLocker().releaseLock(globalSession.getXid());
+        } catch (Exception t) {
+            LOGGER.error("unLock globalSession error, xid:{}", globalSession.getXid(), t);
+            return false;
+        }
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/lock/DataBaseLocker.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/lock/DataBaseLocker.java
new file mode 100644
index 0000000..8355bc0
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/lock/DataBaseLocker.java
@@ -0,0 +1,144 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.storage.db.lock;
+
+import io.seata.common.exception.DataAccessException;
+import io.seata.common.exception.StoreException;
+import io.seata.common.util.CollectionUtils;
+import io.seata.core.lock.AbstractLocker;
+import io.seata.core.lock.RowLock;
+import io.seata.core.model.LockStatus;
+import io.seata.core.store.LockStore;
+
+import javax.sql.DataSource;
+import java.util.List;
+
+/**
+ * The type Data base locker.
+ *
+ * @author zhangsen
+ */
+public class DataBaseLocker extends AbstractLocker {
+
+    private LockStore lockStore;
+
+    /**
+     * Instantiates a new Data base locker.
+     */
+    public DataBaseLocker() {
+    }
+
+    /**
+     * Instantiates a new Data base locker.
+     *
+     * @param logStoreDataSource the log store data source
+     */
+    public DataBaseLocker(DataSource logStoreDataSource) {
+        lockStore = new LockStoreDataBaseDAO(logStoreDataSource);
+    }
+
+    @Override
+    public boolean acquireLock(List<RowLock> locks) {
+        return acquireLock(locks, true, false);
+    }
+
+    @Override
+    public boolean acquireLock(List<RowLock> locks, boolean autoCommit, boolean skipCheckLock) {
+        if (CollectionUtils.isEmpty(locks)) {
+            // no lock
+            return true;
+        }
+        try {
+            return lockStore.acquireLock(convertToLockDO(locks), autoCommit, skipCheckLock);
+        } catch (StoreException e) {
+            throw e;
+        } catch (Exception t) {
+            LOGGER.error("AcquireLock error, locks:{}", CollectionUtils.toString(locks), t);
+            return false;
+        }
+    }
+
+    @Override
+    public boolean releaseLock(List<RowLock> locks) {
+        if (CollectionUtils.isEmpty(locks)) {
+            // no lock
+            return true;
+        }
+        try {
+            return lockStore.unLock(convertToLockDO(locks));
+        } catch (StoreException e) {
+            throw e;
+        } catch (Exception t) {
+            LOGGER.error("unLock error, locks:{}", CollectionUtils.toString(locks), t);
+            return false;
+        }
+    }
+
+    @Override
+    public boolean releaseLock(String xid, Long branchId) {
+        try {
+            return lockStore.unLock(branchId);
+        } catch (StoreException e) {
+            throw e;
+        } catch (Exception t) {
+            LOGGER.error("unLock by branchId error, xid {}, branchId:{}", xid, branchId, t);
+            return false;
+        }
+    }
+
+    @Override
+    public boolean releaseLock(String xid) {
+        try {
+            return lockStore.unLock(xid);
+        } catch (StoreException e) {
+            throw e;
+        } catch (Exception t) {
+            LOGGER.error("unLock by branchIds error, xid {}", xid, t);
+            return false;
+        }
+    }
+
+    @Override
+    public boolean isLockable(List<RowLock> locks) {
+        if (CollectionUtils.isEmpty(locks)) {
+            // no lock
+            return true;
+        }
+        try {
+            return lockStore.isLockable(convertToLockDO(locks));
+        } catch (DataAccessException e) {
+            throw e;
+        } catch (Exception t) {
+            LOGGER.error("isLockable error, locks:{}", CollectionUtils.toString(locks), t);
+            return false;
+        }
+    }
+
+    @Override
+    public void updateLockStatus(String xid, LockStatus lockStatus) {
+        lockStore.updateLockStatus(xid, lockStatus);
+    }
+
+    /**
+     * Sets lock store.
+     *
+     * @param lockStore the lock store
+     */
+    public void setLockStore(LockStore lockStore) {
+        this.lockStore = lockStore;
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/lock/LockStoreDataBaseDAO.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/lock/LockStoreDataBaseDAO.java
new file mode 100644
index 0000000..21f5fa2
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/lock/LockStoreDataBaseDAO.java
@@ -0,0 +1,437 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.storage.db.lock;
+
+import io.seata.common.exception.DataAccessException;
+import io.seata.common.exception.StoreException;
+import io.seata.common.util.CollectionUtils;
+import io.seata.common.util.IOUtil;
+import io.seata.common.util.LambdaUtils;
+import io.seata.common.util.StringUtils;
+import io.seata.config.Configuration;
+import io.seata.config.ConfigurationFactory;
+import io.seata.core.constants.ConfigurationKeys;
+import io.seata.core.constants.ServerTableColumnsName;
+import io.seata.core.exception.BranchTransactionException;
+import io.seata.core.model.LockStatus;
+import io.seata.core.store.LockDO;
+import io.seata.core.store.LockStore;
+import io.seata.core.store.db.sql.lock.LockStoreSqlFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.sql.DataSource;
+import java.sql.*;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import static io.seata.common.DefaultValues.DEFAULT_LOCK_DB_TABLE;
+import static io.seata.core.exception.TransactionExceptionCode.LockKeyConflictFailFast;
+
+/**
+ * The type Data base lock store.
+ *
+ * @author zhangsen
+ */
+public class LockStoreDataBaseDAO implements LockStore {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(LockStoreDataBaseDAO.class);
+
+    /**
+     * The constant CONFIG.
+     */
+    protected static final Configuration CONFIG = ConfigurationFactory.getInstance();
+
+    /**
+     * The Lock store data source.
+     */
+    protected DataSource lockStoreDataSource;
+
+    /**
+     * The Lock table.
+     */
+    protected String lockTable;
+
+    /**
+     * The Db type.
+     */
+    protected String dbType;
+
+    /**
+     * Instantiates a new Data base lock store dao.
+     *
+     * @param lockStoreDataSource the log store data source
+     */
+    public LockStoreDataBaseDAO(DataSource lockStoreDataSource) {
+        this.lockStoreDataSource = lockStoreDataSource;
+        lockTable = CONFIG.getConfig(ConfigurationKeys.LOCK_DB_TABLE, DEFAULT_LOCK_DB_TABLE);
+        dbType = CONFIG.getConfig(ConfigurationKeys.STORE_DB_TYPE);
+        if (StringUtils.isBlank(dbType)) {
+            throw new StoreException("there must be db type.");
+        }
+        if (lockStoreDataSource == null) {
+            throw new StoreException("there must be lockStoreDataSource.");
+        }
+    }
+
+    @Override
+    public boolean acquireLock(LockDO lockDO) {
+        return acquireLock(Collections.singletonList(lockDO));
+    }
+
+    @Override
+    public boolean acquireLock(List<LockDO> lockDOs) {
+        return acquireLock(lockDOs, true, false);
+    }
+
+    @Override
+    public boolean acquireLock(List<LockDO> lockDOs, boolean autoCommit, boolean skipCheckLock) {
+        Connection conn = null;
+        PreparedStatement ps = null;
+        ResultSet rs = null;
+        Set<String> dbExistedRowKeys = new HashSet<>();
+        boolean originalAutoCommit = true;
+        if (lockDOs.size() > 1) {
+            lockDOs = lockDOs.stream().filter(LambdaUtils.distinctByKey(LockDO::getRowKey)).collect(Collectors.toList());
+        }
+        try {
+            conn = lockStoreDataSource.getConnection();
+            if (originalAutoCommit = conn.getAutoCommit()) {
+                conn.setAutoCommit(false);
+            }
+            List<LockDO> unrepeatedLockDOs = lockDOs;
+
+            //check lock
+            if (!skipCheckLock) {
+
+                boolean canLock = true;
+                //query
+                String checkLockSQL = LockStoreSqlFactory.getLogStoreSql(dbType).getCheckLockableSql(lockTable, lockDOs.size());
+                ps = conn.prepareStatement(checkLockSQL);
+                for (int i = 0; i < lockDOs.size(); i++) {
+                    ps.setString(i + 1, lockDOs.get(i).getRowKey());
+                }
+                rs = ps.executeQuery();
+                String currentXID = lockDOs.get(0).getXid();
+                boolean failFast = false;
+                while (rs.next()) {
+                    String dbXID = rs.getString(ServerTableColumnsName.LOCK_TABLE_XID);
+                    if (!StringUtils.equals(dbXID, currentXID)) {
+                        if (LOGGER.isInfoEnabled()) {
+                            String dbPk = rs.getString(ServerTableColumnsName.LOCK_TABLE_PK);
+                            String dbTableName = rs.getString(ServerTableColumnsName.LOCK_TABLE_TABLE_NAME);
+                            long dbBranchId = rs.getLong(ServerTableColumnsName.LOCK_TABLE_BRANCH_ID);
+                            LOGGER.info("Global lock on [{}:{}] is holding by xid {} branchId {}", dbTableName, dbPk, dbXID, dbBranchId);
+                        }
+                        if (!autoCommit) {
+                            int status = rs.getInt(ServerTableColumnsName.LOCK_TABLE_STATUS);
+                            if (status == LockStatus.Rollbacking.getCode()) {
+                                failFast = true;
+                            }
+                        }
+                        canLock = false;
+                        break;
+                    }
+
+                    dbExistedRowKeys.add(rs.getString(ServerTableColumnsName.LOCK_TABLE_ROW_KEY));
+                }
+                if (!canLock) {
+                    conn.rollback();
+                    if (failFast) {
+                        throw new StoreException(new BranchTransactionException(LockKeyConflictFailFast));
+                    }
+                    return false;
+                }
+                // If the lock has been exists in db, remove it from the lockDOs
+                if (CollectionUtils.isNotEmpty(dbExistedRowKeys)) {
+                    unrepeatedLockDOs = lockDOs.stream().filter(lockDO -> !dbExistedRowKeys.contains(lockDO.getRowKey()))
+                            .collect(Collectors.toList());
+                }
+                if (CollectionUtils.isEmpty(unrepeatedLockDOs)) {
+                    conn.rollback();
+                    return true;
+                }
+            }
+
+            // lock
+            if (unrepeatedLockDOs.size() == 1) {
+                LockDO lockDO = unrepeatedLockDOs.get(0);
+                if (!doAcquireLock(conn, lockDO)) {
+                    if (LOGGER.isInfoEnabled()) {
+                        LOGGER.info("Global lock acquire failed, xid {} branchId {} pk {}", lockDO.getXid(), lockDO.getBranchId(), lockDO.getPk());
+                    }
+                    conn.rollback();
+                    return false;
+                }
+            } else {
+                if (!doAcquireLocks(conn, unrepeatedLockDOs)) {
+                    if (LOGGER.isInfoEnabled()) {
+                        LOGGER.info("Global lock batch acquire failed, xid {} branchId {} pks {}", unrepeatedLockDOs.get(0).getXid(),
+                            unrepeatedLockDOs.get(0).getBranchId(), unrepeatedLockDOs.stream().map(lockDO -> lockDO.getPk()).collect(Collectors.toList()));
+                    }
+                    conn.rollback();
+                    return false;
+                }
+            }
+            conn.commit();
+            return true;
+        } catch (SQLException e) {
+            throw new StoreException(e);
+        } finally {
+            IOUtil.close(rs, ps);
+            if (conn != null) {
+                try {
+                    if (originalAutoCommit) {
+                        conn.setAutoCommit(true);
+                    }
+                    conn.close();
+                } catch (SQLException e) {
+                }
+            }
+        }
+    }
+
+    @Override
+    public boolean unLock(LockDO lockDO) {
+        return unLock(Collections.singletonList(lockDO));
+    }
+
+    @Override
+    public boolean unLock(List<LockDO> lockDOs) {
+        Connection conn = null;
+        PreparedStatement ps = null;
+        try {
+            conn = lockStoreDataSource.getConnection();
+            conn.setAutoCommit(true);
+
+            //batch release lock
+            String batchDeleteSQL = LockStoreSqlFactory.getLogStoreSql(dbType).getBatchDeleteLockSql(lockTable, lockDOs.size());
+            ps = conn.prepareStatement(batchDeleteSQL);
+            ps.setString(1, lockDOs.get(0).getXid());
+            for (int i = 0; i < lockDOs.size(); i++) {
+                ps.setString(i + 2, lockDOs.get(i).getRowKey());
+            }
+            ps.executeUpdate();
+        } catch (SQLException e) {
+            throw new StoreException(e);
+        } finally {
+            IOUtil.close(ps, conn);
+        }
+        return true;
+    }
+
+    @Override
+    public boolean unLock(String xid) {
+        Connection conn = null;
+        PreparedStatement ps = null;
+        try {
+            conn = lockStoreDataSource.getConnection();
+            conn.setAutoCommit(true);
+            //batch release lock by branch list
+            String batchDeleteSQL = LockStoreSqlFactory.getLogStoreSql(dbType).getBatchDeleteLockSqlByXid(lockTable);
+            ps = conn.prepareStatement(batchDeleteSQL);
+            ps.setString(1, xid);
+            ps.executeUpdate();
+        } catch (SQLException e) {
+            throw new StoreException(e);
+        } finally {
+            IOUtil.close(ps, conn);
+        }
+        return true;
+    }
+
+    @Override
+    public boolean unLock(Long branchId) {
+        Connection conn = null;
+        PreparedStatement ps = null;
+        try {
+            conn = lockStoreDataSource.getConnection();
+            conn.setAutoCommit(true);
+            //batch release lock by branchId
+            String batchDeleteSQL = LockStoreSqlFactory.getLogStoreSql(dbType).getBatchDeleteLockSqlByBranchId(lockTable);
+            ps = conn.prepareStatement(batchDeleteSQL);
+            ps.setLong(1, branchId);
+            ps.executeUpdate();
+        } catch (SQLException e) {
+            throw new StoreException(e);
+        } finally {
+            IOUtil.close(ps, conn);
+        }
+        return true;
+    }
+
+    @Override
+    public boolean isLockable(List<LockDO> lockDOs) {
+        Connection conn = null;
+        try {
+            conn = lockStoreDataSource.getConnection();
+            conn.setAutoCommit(true);
+            if (!checkLockable(conn, lockDOs)) {
+                return false;
+            }
+            return true;
+        } catch (SQLException e) {
+            throw new DataAccessException(e);
+        } finally {
+            IOUtil.close(conn);
+        }
+    }
+
+    @Override
+    public void updateLockStatus(String xid, LockStatus lockStatus) {
+        String updateStatusLockByGlobalSql =
+            LockStoreSqlFactory.getLogStoreSql(dbType).getBatchUpdateStatusLockByGlobalSql(lockTable);
+        try (Connection conn = lockStoreDataSource.getConnection();
+            PreparedStatement ps = conn.prepareStatement(updateStatusLockByGlobalSql)) {
+            conn.setAutoCommit(true);
+            ps.setInt(1, lockStatus.getCode());
+            ps.setString(2, xid);
+            ps.executeUpdate();
+        } catch (SQLException e) {
+            throw new DataAccessException(e);
+        }
+    }
+
+    /**
+     * Do acquire lock boolean.
+     *
+     * @param conn   the conn
+     * @param lockDO the lock do
+     * @return the boolean
+     */
+    protected boolean doAcquireLock(Connection conn, LockDO lockDO) {
+        PreparedStatement ps = null;
+        try {
+            //insert
+            String insertLockSQL = LockStoreSqlFactory.getLogStoreSql(dbType).getInsertLockSQL(lockTable);
+            ps = conn.prepareStatement(insertLockSQL);
+            ps.setString(1, lockDO.getXid());
+            ps.setLong(2, lockDO.getTransactionId());
+            ps.setLong(3, lockDO.getBranchId());
+            ps.setString(4, lockDO.getResourceId());
+            ps.setString(5, lockDO.getTableName());
+            ps.setString(6, lockDO.getPk());
+            ps.setString(7, lockDO.getRowKey());
+            ps.setInt(8, LockStatus.Locked.getCode());
+            return ps.executeUpdate() > 0;
+        } catch (SQLException e) {
+            if (e instanceof SQLIntegrityConstraintViolationException) {
+                return false;
+            }
+            throw new StoreException(e);
+        } finally {
+            IOUtil.close(ps);
+        }
+    }
+
+    /**
+     * Do acquire lock boolean.
+     *
+     * @param conn    the conn
+     * @param lockDOs the lock do list
+     * @return the boolean
+     */
+    protected boolean doAcquireLocks(Connection conn, List<LockDO> lockDOs) throws SQLException {
+        PreparedStatement ps = null;
+        try {
+            //insert
+            String insertLockSQL = LockStoreSqlFactory.getLogStoreSql(dbType).getInsertLockSQL(lockTable);
+            ps = conn.prepareStatement(insertLockSQL);
+            for (LockDO lockDO : lockDOs) {
+                ps.setString(1, lockDO.getXid());
+                ps.setLong(2, lockDO.getTransactionId());
+                ps.setLong(3, lockDO.getBranchId());
+                ps.setString(4, lockDO.getResourceId());
+                ps.setString(5, lockDO.getTableName());
+                ps.setString(6, lockDO.getPk());
+                ps.setString(7, lockDO.getRowKey());
+                ps.setInt(8, lockDO.getStatus());
+                ps.addBatch();
+            }
+            return ps.executeBatch().length == lockDOs.size();
+        } catch (SQLIntegrityConstraintViolationException e) {
+            LOGGER.error("Global lock batch acquire error: {}", e.getMessage(), e);
+            //return false,let the caller go to conn.rollabck()
+            return false;
+        } catch (SQLException e) {
+            throw e;
+        } finally {
+            IOUtil.close(ps);
+        }
+    }
+
+    /**
+     * Check lock boolean.
+     *
+     * @param conn    the conn
+     * @param lockDOs the lock do
+     * @return the boolean
+     */
+    protected boolean checkLockable(Connection conn, List<LockDO> lockDOs) {
+        PreparedStatement ps = null;
+        ResultSet rs = null;
+        try {
+            //query
+            String checkLockSQL = LockStoreSqlFactory.getLogStoreSql(dbType).getCheckLockableSql(lockTable, lockDOs.size());
+            ps = conn.prepareStatement(checkLockSQL);
+            for (int i = 0; i < lockDOs.size(); i++) {
+                ps.setString(i + 1, lockDOs.get(i).getRowKey());
+            }
+            rs = ps.executeQuery();
+            while (rs.next()) {
+                String xid = rs.getString("xid");
+                if (!StringUtils.equals(xid, lockDOs.get(0).getXid())) {
+                    return false;
+                }
+            }
+            return true;
+        } catch (SQLException e) {
+            throw new DataAccessException(e);
+        } finally {
+            IOUtil.close(rs, ps);
+        }
+    }
+
+    /**
+     * Sets lock table.
+     *
+     * @param lockTable the lock table
+     */
+    public void setLockTable(String lockTable) {
+        this.lockTable = lockTable;
+    }
+
+    /**
+     * Sets db type.
+     *
+     * @param dbType the db type
+     */
+    public void setDbType(String dbType) {
+        this.dbType = dbType;
+    }
+
+    /**
+     * Sets log store data source.
+     *
+     * @param lockStoreDataSource the log store data source
+     */
+    public void setLogStoreDataSource(DataSource lockStoreDataSource) {
+        this.lockStoreDataSource = lockStoreDataSource;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/session/DataBaseSessionManager.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/session/DataBaseSessionManager.java
new file mode 100644
index 0000000..f93e3a9
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/session/DataBaseSessionManager.java
@@ -0,0 +1,190 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.storage.db.session;
+
+import io.seata.common.exception.StoreException;
+import io.seata.common.executor.Initialize;
+import io.seata.common.loader.LoadLevel;
+import io.seata.common.loader.Scope;
+import io.seata.common.util.StringUtils;
+import io.seata.core.exception.TransactionException;
+import io.seata.core.model.BranchStatus;
+import io.seata.core.model.GlobalStatus;
+import io.seata.server.session.*;
+import io.seata.server.storage.db.store.DataBaseTransactionStoreManager;
+import io.seata.server.store.TransactionStoreManager.LogOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * The Data base session manager.
+ *
+ * @author zhangsen
+ */
+@LoadLevel(name = "db", scope = Scope.PROTOTYPE)
+public class DataBaseSessionManager extends AbstractSessionManager
+    implements Initialize {
+
+    /**
+     * The constant LOGGER.
+     */
+    protected static final Logger LOGGER = LoggerFactory.getLogger(DataBaseSessionManager.class);
+
+    /**
+     * The Task name.
+     */
+    protected String taskName;
+
+    /**
+     * Instantiates a new Data base session manager.
+     */
+    public DataBaseSessionManager() {
+        super();
+    }
+
+    /**
+     * Instantiates a new Data base session manager.
+     *
+     * @param name the name
+     */
+    public DataBaseSessionManager(String name) {
+        super();
+        this.taskName = name;
+    }
+
+    @Override
+    public void init() {
+        transactionStoreManager = DataBaseTransactionStoreManager.getInstance();
+    }
+
+    @Override
+    public void addGlobalSession(GlobalSession session) throws TransactionException {
+        if (StringUtils.isBlank(taskName)) {
+            boolean ret = transactionStoreManager.writeSession(LogOperation.GLOBAL_ADD, session);
+            if (!ret) {
+                throw new StoreException("addGlobalSession failed.");
+            }
+        } else {
+            boolean ret = transactionStoreManager.writeSession(LogOperation.GLOBAL_UPDATE, session);
+            if (!ret) {
+                throw new StoreException("addGlobalSession failed.");
+            }
+        }
+    }
+
+    @Override
+    public void updateGlobalSessionStatus(GlobalSession session, GlobalStatus status) throws TransactionException {
+        if (StringUtils.isNotBlank(taskName)) {
+            return;
+        }
+        session.setStatus(status);
+        boolean ret = transactionStoreManager.writeSession(LogOperation.GLOBAL_UPDATE, session);
+        if (!ret) {
+            throw new StoreException("updateGlobalSessionStatus failed.");
+        }
+    }
+
+    /**
+     * remove globalSession
+     * 1. rootSessionManager remove normal globalSession
+     * 2. retryCommitSessionManager and retryRollbackSessionManager remove retry expired globalSession
+     * @param session the session
+     * @throws TransactionException the transaction exception
+     */
+    @Override
+    public void removeGlobalSession(GlobalSession session) throws TransactionException {
+        boolean ret = transactionStoreManager.writeSession(LogOperation.GLOBAL_REMOVE, session);
+        if (!ret) {
+            throw new StoreException("removeGlobalSession failed.");
+        }
+    }
+
+    @Override
+    public void addBranchSession(GlobalSession globalSession, BranchSession session) throws TransactionException {
+        if (StringUtils.isNotBlank(taskName)) {
+            return;
+        }
+        boolean ret = transactionStoreManager.writeSession(LogOperation.BRANCH_ADD, session);
+        if (!ret) {
+            throw new StoreException("addBranchSession failed.");
+        }
+    }
+
+    @Override
+    public void updateBranchSessionStatus(BranchSession session, BranchStatus status) throws TransactionException {
+        if (StringUtils.isNotBlank(taskName)) {
+            return;
+        }
+        boolean ret = transactionStoreManager.writeSession(LogOperation.BRANCH_UPDATE, session);
+        if (!ret) {
+            throw new StoreException("updateBranchSessionStatus failed.");
+        }
+    }
+
+    @Override
+    public void removeBranchSession(GlobalSession globalSession, BranchSession session) throws TransactionException {
+        if (StringUtils.isNotBlank(taskName)) {
+            return;
+        }
+        boolean ret = transactionStoreManager.writeSession(LogOperation.BRANCH_REMOVE, session);
+        if (!ret) {
+            throw new StoreException("removeBranchSession failed.");
+        }
+    }
+
+    @Override
+    public GlobalSession findGlobalSession(String xid) {
+        return this.findGlobalSession(xid, true);
+    }
+
+    @Override
+    public GlobalSession findGlobalSession(String xid, boolean withBranchSessions) {
+        return transactionStoreManager.readSession(xid, withBranchSessions);
+    }
+
+    @Override
+    public Collection<GlobalSession> allSessions() {
+        // get by taskName
+        if (SessionHolder.ASYNC_COMMITTING_SESSION_MANAGER_NAME.equalsIgnoreCase(taskName)) {
+            return findGlobalSessions(new SessionCondition(GlobalStatus.AsyncCommitting));
+        } else if (SessionHolder.RETRY_COMMITTING_SESSION_MANAGER_NAME.equalsIgnoreCase(taskName)) {
+            return findGlobalSessions(new SessionCondition(GlobalStatus.CommitRetrying, GlobalStatus.Committing));
+        } else if (SessionHolder.RETRY_ROLLBACKING_SESSION_MANAGER_NAME.equalsIgnoreCase(taskName)) {
+            return findGlobalSessions(new SessionCondition(GlobalStatus.RollbackRetrying, GlobalStatus.Rollbacking,
+                    GlobalStatus.TimeoutRollbacking, GlobalStatus.TimeoutRollbackRetrying));
+        } else {
+            // all data
+            return findGlobalSessions(new SessionCondition(GlobalStatus.UnKnown, GlobalStatus.Begin, GlobalStatus.Committing,
+                    GlobalStatus.CommitRetrying, GlobalStatus.Rollbacking, GlobalStatus.RollbackRetrying, GlobalStatus.TimeoutRollbacking,
+                    GlobalStatus.TimeoutRollbackRetrying, GlobalStatus.AsyncCommitting));
+        }
+    }
+
+    @Override
+    public List<GlobalSession> findGlobalSessions(SessionCondition condition) {
+        // nothing need to do
+        return transactionStoreManager.readSession(condition);
+    }
+
+    @Override
+    public <T> T lockAndExecute(GlobalSession globalSession, GlobalSession.LockCallable<T> lockCallable)
+            throws TransactionException {
+        return lockCallable.call();
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/store/DataBaseTransactionStoreManager.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/store/DataBaseTransactionStoreManager.java
new file mode 100644
index 0000000..e6eb83e
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/store/DataBaseTransactionStoreManager.java
@@ -0,0 +1,256 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.storage.db.store;
+
+import io.seata.common.exception.StoreException;
+import io.seata.common.loader.EnhancedServiceLoader;
+import io.seata.common.util.CollectionUtils;
+import io.seata.common.util.StringUtils;
+import io.seata.config.Configuration;
+import io.seata.config.ConfigurationFactory;
+import io.seata.core.constants.ConfigurationKeys;
+import io.seata.core.model.GlobalStatus;
+import io.seata.core.store.BranchTransactionDO;
+import io.seata.core.store.GlobalTransactionDO;
+import io.seata.core.store.LogStore;
+import io.seata.core.store.db.DataSourceProvider;
+import io.seata.server.session.GlobalSession;
+import io.seata.server.session.SessionCondition;
+import io.seata.server.storage.SessionConverter;
+import io.seata.server.store.AbstractTransactionStoreManager;
+import io.seata.server.store.SessionStorable;
+import io.seata.server.store.TransactionStoreManager;
+
+import javax.sql.DataSource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static io.seata.common.DefaultValues.DEFAULT_QUERY_LIMIT;
+
+/**
+ * The type Database transaction store manager.
+ *
+ * @author zhangsen
+ */
+public class DataBaseTransactionStoreManager extends AbstractTransactionStoreManager
+    implements TransactionStoreManager {
+
+    private static volatile DataBaseTransactionStoreManager instance;
+
+    /**
+     * The constant CONFIG.
+     */
+    protected static final Configuration CONFIG = ConfigurationFactory.getInstance();
+
+    /**
+     * The Log store.
+     */
+    protected LogStore logStore;
+
+    /**
+     * The Log query limit.
+     */
+    protected int logQueryLimit;
+
+    /**
+     * Get the instance.
+     */
+    public static DataBaseTransactionStoreManager getInstance() {
+        if (instance == null) {
+            synchronized (DataBaseTransactionStoreManager.class) {
+                if (instance == null) {
+                    instance = new DataBaseTransactionStoreManager();
+                }
+            }
+        }
+        return instance;
+    }
+
+    /**
+     * Instantiates a new Database transaction store manager.
+     */
+    private DataBaseTransactionStoreManager() {
+        logQueryLimit = CONFIG.getInt(ConfigurationKeys.STORE_DB_LOG_QUERY_LIMIT, DEFAULT_QUERY_LIMIT);
+        String datasourceType = CONFIG.getConfig(ConfigurationKeys.STORE_DB_DATASOURCE_TYPE);
+        //init dataSource
+        DataSource logStoreDataSource = EnhancedServiceLoader.load(DataSourceProvider.class, datasourceType).provide();
+        logStore = new LogStoreDataBaseDAO(logStoreDataSource);
+    }
+
+    @Override
+    public boolean writeSession(LogOperation logOperation, SessionStorable session) {
+        if (LogOperation.GLOBAL_ADD.equals(logOperation)) {
+            return logStore.insertGlobalTransactionDO(SessionConverter.convertGlobalTransactionDO(session));
+        } else if (LogOperation.GLOBAL_UPDATE.equals(logOperation)) {
+            return logStore.updateGlobalTransactionDO(SessionConverter.convertGlobalTransactionDO(session));
+        } else if (LogOperation.GLOBAL_REMOVE.equals(logOperation)) {
+            return logStore.deleteGlobalTransactionDO(SessionConverter.convertGlobalTransactionDO(session));
+        } else if (LogOperation.BRANCH_ADD.equals(logOperation)) {
+            return logStore.insertBranchTransactionDO(SessionConverter.convertBranchTransactionDO(session));
+        } else if (LogOperation.BRANCH_UPDATE.equals(logOperation)) {
+            return logStore.updateBranchTransactionDO(SessionConverter.convertBranchTransactionDO(session));
+        } else if (LogOperation.BRANCH_REMOVE.equals(logOperation)) {
+            return logStore.deleteBranchTransactionDO(SessionConverter.convertBranchTransactionDO(session));
+        } else {
+            throw new StoreException("Unknown LogOperation:" + logOperation.name());
+        }
+    }
+
+    /**
+     * Read session global session.
+     *
+     * @param transactionId the transaction id
+     * @return the global session
+     */
+    public GlobalSession readSession(Long transactionId) {
+        //global transaction
+        GlobalTransactionDO globalTransactionDO = logStore.queryGlobalTransactionDO(transactionId);
+        if (globalTransactionDO == null) {
+            return null;
+        }
+        //branch transactions
+        List<BranchTransactionDO> branchTransactionDOs = logStore.queryBranchTransactionDO(
+            globalTransactionDO.getXid());
+        return getGlobalSession(globalTransactionDO, branchTransactionDOs);
+    }
+
+    /**
+     * Read session global session.
+     *
+     * @param xid the xid
+     * @return the global session
+     */
+    @Override
+    public GlobalSession readSession(String xid) {
+        return this.readSession(xid, true);
+    }
+
+    /**
+     * Read session global session.
+     *
+     * @param xid the xid
+     * @param withBranchSessions the withBranchSessions
+     * @return the global session
+     */
+    @Override
+    public GlobalSession readSession(String xid, boolean withBranchSessions) {
+        //global transaction
+        GlobalTransactionDO globalTransactionDO = logStore.queryGlobalTransactionDO(xid);
+        if (globalTransactionDO == null) {
+            return null;
+        }
+        //branch transactions
+        List<BranchTransactionDO> branchTransactionDOs = null;
+        //reduce rpc with db when branchRegister and getGlobalStatus
+        if (withBranchSessions) {
+            branchTransactionDOs = logStore.queryBranchTransactionDO(globalTransactionDO.getXid());
+        }
+        return getGlobalSession(globalTransactionDO, branchTransactionDOs);
+    }
+
+    @Override
+    public List<GlobalSession> readSortByTimeoutBeginSessions(boolean withBranchSessions) {
+        return readSession(new GlobalStatus[] {GlobalStatus.Begin}, withBranchSessions);
+    }
+
+    /**
+     * Read session list.
+     *
+     * @param statuses the statuses
+     * @return the list
+     */
+    @Override
+    public List<GlobalSession> readSession(GlobalStatus[] statuses, boolean withBranchSessions) {
+        int[] states = new int[statuses.length];
+        for (int i = 0; i < statuses.length; i++) {
+            states[i] = statuses[i].getCode();
+        }
+        //global transaction
+        List<GlobalTransactionDO> globalTransactionDOs = logStore.queryGlobalTransactionDO(states, logQueryLimit);
+        Map<String, List<BranchTransactionDO>> branchTransactionDOsMap = Collections.emptyMap();
+        if (CollectionUtils.isNotEmpty(globalTransactionDOs)) {
+            List<String> xids =
+                globalTransactionDOs.stream().map(GlobalTransactionDO::getXid).collect(Collectors.toList());
+            if (withBranchSessions) {
+                List<BranchTransactionDO> branchTransactionDOs = logStore.queryBranchTransactionDO(xids);
+                branchTransactionDOsMap = branchTransactionDOs.stream().collect(
+                    Collectors.groupingBy(BranchTransactionDO::getXid, LinkedHashMap::new, Collectors.toList()));
+            }
+        }
+        Map<String, List<BranchTransactionDO>> finalBranchTransactionDOsMap = branchTransactionDOsMap;
+        return globalTransactionDOs.stream()
+            .map(globalTransactionDO -> getGlobalSession(globalTransactionDO,
+                    finalBranchTransactionDOsMap.get(globalTransactionDO.getXid()), withBranchSessions))
+            .collect(Collectors.toList());
+    }
+
+    @Override
+    public List<GlobalSession> readSession(SessionCondition sessionCondition) {
+        if (StringUtils.isNotBlank(sessionCondition.getXid())) {
+            GlobalSession globalSession = readSession(sessionCondition.getXid());
+            if (globalSession != null) {
+                List<GlobalSession> globalSessions = new ArrayList<>();
+                globalSessions.add(globalSession);
+                return globalSessions;
+            }
+        } else if (sessionCondition.getTransactionId() != null) {
+            GlobalSession globalSession = readSession(sessionCondition.getTransactionId());
+            if (globalSession != null) {
+                List<GlobalSession> globalSessions = new ArrayList<>();
+                globalSessions.add(globalSession);
+                return globalSessions;
+            }
+        } else if (CollectionUtils.isNotEmpty(sessionCondition.getStatuses())) {
+            return readSession(sessionCondition.getStatuses(), !sessionCondition.isLazyLoadBranch());
+        }
+        return null;
+    }
+
+    private GlobalSession getGlobalSession(GlobalTransactionDO globalTransactionDO,
+        List<BranchTransactionDO> branchTransactionDOs) {
+        return getGlobalSession(globalTransactionDO, branchTransactionDOs, true);
+    }
+
+    private GlobalSession getGlobalSession(GlobalTransactionDO globalTransactionDO,
+        List<BranchTransactionDO> branchTransactionDOs, boolean withBranchSessions) {
+        GlobalSession globalSession = SessionConverter.convertGlobalSession(globalTransactionDO, !withBranchSessions);
+        // branch transactions
+        if (CollectionUtils.isNotEmpty(branchTransactionDOs)) {
+            for (BranchTransactionDO branchTransactionDO : branchTransactionDOs) {
+                globalSession.add(SessionConverter.convertBranchSession(branchTransactionDO));
+            }
+        }
+        return globalSession;
+    }
+
+    /**
+     * Sets log store.
+     *
+     * @param logStore the log store
+     */
+    public void setLogStore(LogStore logStore) {
+        this.logStore = logStore;
+    }
+
+    /**
+     * Sets log query limit.
+     *
+     * @param logQueryLimit the log query limit
+     */
+    public void setLogQueryLimit(int logQueryLimit) {
+        this.logQueryLimit = logQueryLimit;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/store/LogStoreDataBaseDAO.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/store/LogStoreDataBaseDAO.java
new file mode 100644
index 0000000..94baf8e
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/store/LogStoreDataBaseDAO.java
@@ -0,0 +1,601 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.storage.db.store;
+
+import io.seata.common.exception.DataAccessException;
+import io.seata.common.exception.StoreException;
+import io.seata.common.util.IOUtil;
+import io.seata.common.util.StringUtils;
+import io.seata.config.Configuration;
+import io.seata.config.ConfigurationFactory;
+import io.seata.core.constants.ConfigurationKeys;
+import io.seata.core.constants.ServerTableColumnsName;
+import io.seata.core.store.BranchTransactionDO;
+import io.seata.core.store.GlobalTransactionDO;
+import io.seata.core.store.LogStore;
+import io.seata.core.store.db.sql.log.LogStoreSqlsFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.sql.DataSource;
+import java.sql.*;
+import java.util.ArrayList;
+import java.util.List;
+
+import static io.seata.common.DefaultValues.DEFAULT_STORE_DB_BRANCH_TABLE;
+import static io.seata.common.DefaultValues.DEFAULT_STORE_DB_GLOBAL_TABLE;
+
+/**
+ * The type Log store data base dao.
+ *
+ * @author zhangsen
+ */
+public class LogStoreDataBaseDAO implements LogStore {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(LogStoreDataBaseDAO.class);
+
+    /**
+     * The transaction name key
+     */
+    private static final String TRANSACTION_NAME_KEY = "TRANSACTION_NAME";
+    /**
+     * The transaction name default size is 128
+     */
+    private static final int TRANSACTION_NAME_DEFAULT_SIZE = 128;
+
+    /**
+     * The constant CONFIG.
+     */
+    protected static final Configuration CONFIG = ConfigurationFactory.getInstance();
+
+    /**
+     * The Log store data source.
+     */
+    protected DataSource logStoreDataSource = null;
+
+    /**
+     * The Global table.
+     */
+    protected String globalTable;
+
+    /**
+     * The Branch table.
+     */
+    protected String branchTable;
+
+    private String dbType;
+
+    private int transactionNameColumnSize = TRANSACTION_NAME_DEFAULT_SIZE;
+
+    /**
+     * Instantiates a new Log store data base dao.
+     *
+     * @param logStoreDataSource the log store data source
+     */
+    public LogStoreDataBaseDAO(DataSource logStoreDataSource) {
+        this.logStoreDataSource = logStoreDataSource;
+        globalTable = CONFIG.getConfig(ConfigurationKeys.STORE_DB_GLOBAL_TABLE,
+            DEFAULT_STORE_DB_GLOBAL_TABLE);
+        branchTable = CONFIG.getConfig(ConfigurationKeys.STORE_DB_BRANCH_TABLE,
+            DEFAULT_STORE_DB_BRANCH_TABLE);
+        dbType = CONFIG.getConfig(ConfigurationKeys.STORE_DB_TYPE);
+        if (StringUtils.isBlank(dbType)) {
+            throw new StoreException("there must be db type.");
+        }
+        if (logStoreDataSource == null) {
+            throw new StoreException("there must be logStoreDataSource.");
+        }
+        // init transaction_name size
+        initTransactionNameSize();
+    }
+
+    @Override
+    public GlobalTransactionDO queryGlobalTransactionDO(String xid) {
+        String sql = LogStoreSqlsFactory.getLogStoreSqls(dbType).getQueryGlobalTransactionSQL(globalTable);
+        Connection conn = null;
+        PreparedStatement ps = null;
+        ResultSet rs = null;
+        try {
+            conn = logStoreDataSource.getConnection();
+            conn.setAutoCommit(true);
+            ps = conn.prepareStatement(sql);
+            ps.setString(1, xid);
+            rs = ps.executeQuery();
+            if (rs.next()) {
+                return convertGlobalTransactionDO(rs);
+            } else {
+                return null;
+            }
+        } catch (SQLException e) {
+            throw new DataAccessException(e);
+        } finally {
+            IOUtil.close(rs, ps, conn);
+        }
+    }
+
+    @Override
+    public GlobalTransactionDO queryGlobalTransactionDO(long transactionId) {
+        String sql = LogStoreSqlsFactory.getLogStoreSqls(dbType).getQueryGlobalTransactionSQLByTransactionId(globalTable);
+        Connection conn = null;
+        PreparedStatement ps = null;
+        ResultSet rs = null;
+        try {
+            conn = logStoreDataSource.getConnection();
+            conn.setAutoCommit(true);
+            ps = conn.prepareStatement(sql);
+            ps.setLong(1, transactionId);
+            rs = ps.executeQuery();
+            if (rs.next()) {
+                return convertGlobalTransactionDO(rs);
+            } else {
+                return null;
+            }
+        } catch (SQLException e) {
+            throw new DataAccessException(e);
+        } finally {
+            IOUtil.close(rs, ps, conn);
+        }
+    }
+
+    @Override
+    public List<GlobalTransactionDO> queryGlobalTransactionDO(int[] statuses, int limit) {
+        List<GlobalTransactionDO> ret = new ArrayList<>();
+        Connection conn = null;
+        PreparedStatement ps = null;
+        ResultSet rs = null;
+        try {
+            conn = logStoreDataSource.getConnection();
+            conn.setAutoCommit(true);
+
+            String paramsPlaceHolder = org.apache.commons.lang.StringUtils.repeat("?", ",", statuses.length);
+
+            String sql = LogStoreSqlsFactory.getLogStoreSqls(dbType).getQueryGlobalTransactionSQLByStatus(globalTable, paramsPlaceHolder);
+            ps = conn.prepareStatement(sql);
+            for (int i = 0; i < statuses.length; i++) {
+                int status = statuses[i];
+                ps.setInt(i + 1, status);
+            }
+            ps.setInt(statuses.length + 1, limit);
+            rs = ps.executeQuery();
+            while (rs.next()) {
+                ret.add(convertGlobalTransactionDO(rs));
+            }
+            return ret;
+        } catch (SQLException e) {
+            throw new DataAccessException(e);
+        } finally {
+            IOUtil.close(rs, ps, conn);
+        }
+    }
+
+    @Override
+    public boolean insertGlobalTransactionDO(GlobalTransactionDO globalTransactionDO) {
+        String sql = LogStoreSqlsFactory.getLogStoreSqls(dbType).getInsertGlobalTransactionSQL(globalTable);
+        Connection conn = null;
+        PreparedStatement ps = null;
+        try {
+            int index = 1;
+            conn = logStoreDataSource.getConnection();
+            conn.setAutoCommit(true);
+            ps = conn.prepareStatement(sql);
+            ps.setString(index++, globalTransactionDO.getXid());
+            ps.setLong(index++, globalTransactionDO.getTransactionId());
+            ps.setInt(index++, globalTransactionDO.getStatus());
+            ps.setString(index++, globalTransactionDO.getApplicationId());
+            ps.setString(index++, globalTransactionDO.getTransactionServiceGroup());
+            String transactionName = globalTransactionDO.getTransactionName();
+            transactionName = transactionName.length() > transactionNameColumnSize ?
+                transactionName.substring(0, transactionNameColumnSize) :
+                transactionName;
+            ps.setString(index++, transactionName);
+            ps.setInt(index++, globalTransactionDO.getTimeout());
+            ps.setLong(index++, globalTransactionDO.getBeginTime());
+            ps.setString(index++, globalTransactionDO.getApplicationData());
+            return ps.executeUpdate() > 0;
+        } catch (SQLException e) {
+            throw new StoreException(e);
+        } finally {
+            IOUtil.close(ps, conn);
+        }
+    }
+
+    @Override
+    public boolean updateGlobalTransactionDO(GlobalTransactionDO globalTransactionDO) {
+        String sql = LogStoreSqlsFactory.getLogStoreSqls(dbType).getUpdateGlobalTransactionStatusSQL(globalTable);
+        Connection conn = null;
+        PreparedStatement ps = null;
+        try {
+            int index = 1;
+            conn = logStoreDataSource.getConnection();
+            conn.setAutoCommit(true);
+            ps = conn.prepareStatement(sql);
+            ps.setInt(index++, globalTransactionDO.getStatus());
+            ps.setString(index++, globalTransactionDO.getXid());
+            return ps.executeUpdate() > 0;
+        } catch (SQLException e) {
+            throw new StoreException(e);
+        } finally {
+            IOUtil.close(ps, conn);
+        }
+    }
+
+    @Override
+    public boolean deleteGlobalTransactionDO(GlobalTransactionDO globalTransactionDO) {
+        String sql = LogStoreSqlsFactory.getLogStoreSqls(dbType).getDeleteGlobalTransactionSQL(globalTable);
+        Connection conn = null;
+        PreparedStatement ps = null;
+        try {
+            conn = logStoreDataSource.getConnection();
+            conn.setAutoCommit(true);
+            ps = conn.prepareStatement(sql);
+            ps.setString(1, globalTransactionDO.getXid());
+            ps.executeUpdate();
+        } catch (SQLException e) {
+            throw new StoreException(e);
+        } finally {
+            IOUtil.close(ps, conn);
+        }
+        return true;
+    }
+
+    @Override
+    public List<BranchTransactionDO> queryBranchTransactionDO(String xid) {
+        List<BranchTransactionDO> rets = new ArrayList<>();
+        String sql = LogStoreSqlsFactory.getLogStoreSqls(dbType).getQueryBranchTransaction(branchTable);
+        Connection conn = null;
+        PreparedStatement ps = null;
+        ResultSet rs = null;
+        try {
+            conn = logStoreDataSource.getConnection();
+            conn.setAutoCommit(true);
+
+            ps = conn.prepareStatement(sql);
+            ps.setString(1, xid);
+
+            rs = ps.executeQuery();
+            while (rs.next()) {
+                rets.add(convertBranchTransactionDO(rs));
+            }
+            return rets;
+        } catch (SQLException e) {
+            throw new DataAccessException(e);
+        } finally {
+            IOUtil.close(rs, ps, conn);
+        }
+    }
+
+    @Override
+    public List<BranchTransactionDO> queryBranchTransactionDO(List<String> xids) {
+        int length = xids.size();
+        List<BranchTransactionDO> rets = new ArrayList<>(length * 3);
+        String paramsPlaceHolder = org.apache.commons.lang.StringUtils.repeat("?", ",", length);
+        String sql = LogStoreSqlsFactory.getLogStoreSqls(dbType).getQueryBranchTransaction(branchTable, paramsPlaceHolder);
+        Connection conn = null;
+        PreparedStatement ps = null;
+        ResultSet rs = null;
+        try {
+            conn = logStoreDataSource.getConnection();
+            conn.setAutoCommit(true);
+            ps = conn.prepareStatement(sql);
+            for (int i = 0; i < length; i++) {
+                ps.setString(i + 1, xids.get(i));
+            }
+            rs = ps.executeQuery();
+            while (rs.next()) {
+                rets.add(convertBranchTransactionDO(rs));
+            }
+            return rets;
+        } catch (SQLException e) {
+            throw new DataAccessException(e);
+        } finally {
+            IOUtil.close(rs, ps, conn);
+        }
+    }
+
+    @Override
+    public boolean insertBranchTransactionDO(BranchTransactionDO branchTransactionDO) {
+        String sql = LogStoreSqlsFactory.getLogStoreSqls(dbType).getInsertBranchTransactionSQL(branchTable);
+        Connection conn = null;
+        PreparedStatement ps = null;
+        try {
+            int index = 1;
+            conn = logStoreDataSource.getConnection();
+            conn.setAutoCommit(true);
+            ps = conn.prepareStatement(sql);
+            ps.setString(index++, branchTransactionDO.getXid());
+            ps.setLong(index++, branchTransactionDO.getTransactionId());
+            ps.setLong(index++, branchTransactionDO.getBranchId());
+            ps.setString(index++, branchTransactionDO.getResourceGroupId());
+            ps.setString(index++, branchTransactionDO.getResourceId());
+            ps.setString(index++, branchTransactionDO.getBranchType());
+            ps.setInt(index++, branchTransactionDO.getStatus());
+            ps.setString(index++, branchTransactionDO.getClientId());
+            ps.setString(index++, branchTransactionDO.getApplicationData());
+            return ps.executeUpdate() > 0;
+        } catch (SQLException e) {
+            throw new StoreException(e);
+        } finally {
+            IOUtil.close(ps, conn);
+        }
+    }
+
+    @Override
+    public boolean updateBranchTransactionDO(BranchTransactionDO branchTransactionDO) {
+        boolean shouldUpdateAppData = StringUtils.isNotBlank(branchTransactionDO.getApplicationData());
+        String sql = shouldUpdateAppData ?
+            LogStoreSqlsFactory.getLogStoreSqls(dbType).getUpdateBranchTransactionStatusAppDataSQL(branchTable) :
+            LogStoreSqlsFactory.getLogStoreSqls(dbType).getUpdateBranchTransactionStatusSQL(branchTable);
+        Connection conn = null;
+        PreparedStatement ps = null;
+        try {
+            int index = 1;
+            conn = logStoreDataSource.getConnection();
+            conn.setAutoCommit(true);
+            ps = conn.prepareStatement(sql);
+            ps.setInt(index++, branchTransactionDO.getStatus());
+            if (shouldUpdateAppData) {
+                ps.setString(index++, branchTransactionDO.getApplicationData());
+            }
+            ps.setString(index++, branchTransactionDO.getXid());
+            ps.setLong(index++, branchTransactionDO.getBranchId());
+            return ps.executeUpdate() > 0;
+        } catch (SQLException e) {
+            throw new StoreException(e);
+        } finally {
+            IOUtil.close(ps, conn);
+        }
+    }
+
+    @Override
+    public boolean deleteBranchTransactionDO(BranchTransactionDO branchTransactionDO) {
+        String sql = LogStoreSqlsFactory.getLogStoreSqls(dbType).getDeleteBranchTransactionByBranchIdSQL(branchTable);
+        Connection conn = null;
+        PreparedStatement ps = null;
+        try {
+            conn = logStoreDataSource.getConnection();
+            conn.setAutoCommit(true);
+            ps = conn.prepareStatement(sql);
+            ps.setString(1, branchTransactionDO.getXid());
+            ps.setLong(2, branchTransactionDO.getBranchId());
+            ps.executeUpdate();
+        } catch (SQLException e) {
+            throw new StoreException(e);
+        } finally {
+            IOUtil.close(ps, conn);
+        }
+        return true;
+    }
+
+    @Override
+    public long getCurrentMaxSessionId(long high, long low) {
+        String transMaxSql = LogStoreSqlsFactory.getLogStoreSqls(dbType).getQueryGlobalMax(globalTable);
+        String branchMaxSql = LogStoreSqlsFactory.getLogStoreSqls(dbType).getQueryBranchMax(branchTable);
+        long maxTransId = getCurrentMaxSessionId(transMaxSql, high, low);
+        long maxBranchId = getCurrentMaxSessionId(branchMaxSql, high, low);
+        return Math.max(maxBranchId, maxTransId);
+    }
+
+    private long getCurrentMaxSessionId(String sql, long high, long low) {
+        long max = 0;
+        Connection conn = null;
+        PreparedStatement ps = null;
+        ResultSet rs = null;
+        try {
+            int index = 1;
+            conn = logStoreDataSource.getConnection();
+            conn.setAutoCommit(true);
+            ps = conn.prepareStatement(sql);
+            ps.setLong(index++, high);
+            ps.setLong(index++, low);
+
+            rs = ps.executeQuery();
+            while (rs.next()) {
+                max = rs.getLong(1);
+            }
+        } catch (SQLException e) {
+            throw new DataAccessException(e);
+        } finally {
+            IOUtil.close(rs, ps, conn);
+        }
+        return max;
+    }
+
+    private GlobalTransactionDO convertGlobalTransactionDO(ResultSet rs) throws SQLException {
+        GlobalTransactionDO globalTransactionDO = new GlobalTransactionDO();
+        globalTransactionDO.setXid(rs.getString(ServerTableColumnsName.GLOBAL_TABLE_XID));
+        globalTransactionDO.setStatus(rs.getInt(ServerTableColumnsName.GLOBAL_TABLE_STATUS));
+        globalTransactionDO.setApplicationId(rs.getString(ServerTableColumnsName.GLOBAL_TABLE_APPLICATION_ID));
+        globalTransactionDO.setBeginTime(rs.getLong(ServerTableColumnsName.GLOBAL_TABLE_BEGIN_TIME));
+        globalTransactionDO.setTimeout(rs.getInt(ServerTableColumnsName.GLOBAL_TABLE_TIMEOUT));
+        globalTransactionDO.setTransactionId(rs.getLong(ServerTableColumnsName.GLOBAL_TABLE_TRANSACTION_ID));
+        globalTransactionDO.setTransactionName(rs.getString(ServerTableColumnsName.GLOBAL_TABLE_TRANSACTION_NAME));
+        globalTransactionDO.setTransactionServiceGroup(
+            rs.getString(ServerTableColumnsName.GLOBAL_TABLE_TRANSACTION_SERVICE_GROUP));
+        globalTransactionDO.setApplicationData(rs.getString(ServerTableColumnsName.GLOBAL_TABLE_APPLICATION_DATA));
+        globalTransactionDO.setGmtCreate(rs.getTimestamp(ServerTableColumnsName.GLOBAL_TABLE_GMT_CREATE));
+        globalTransactionDO.setGmtModified(rs.getTimestamp(ServerTableColumnsName.GLOBAL_TABLE_GMT_MODIFIED));
+        return globalTransactionDO;
+    }
+
+    private BranchTransactionDO convertBranchTransactionDO(ResultSet rs) throws SQLException {
+        BranchTransactionDO branchTransactionDO = new BranchTransactionDO();
+        branchTransactionDO.setResourceGroupId(rs.getString(ServerTableColumnsName.BRANCH_TABLE_RESOURCE_GROUP_ID));
+        branchTransactionDO.setStatus(rs.getInt(ServerTableColumnsName.BRANCH_TABLE_STATUS));
+        branchTransactionDO.setApplicationData(rs.getString(ServerTableColumnsName.BRANCH_TABLE_APPLICATION_DATA));
+        branchTransactionDO.setClientId(rs.getString(ServerTableColumnsName.BRANCH_TABLE_CLIENT_ID));
+        branchTransactionDO.setXid(rs.getString(ServerTableColumnsName.BRANCH_TABLE_XID));
+        branchTransactionDO.setResourceId(rs.getString(ServerTableColumnsName.BRANCH_TABLE_RESOURCE_ID));
+        branchTransactionDO.setBranchId(rs.getLong(ServerTableColumnsName.BRANCH_TABLE_BRANCH_ID));
+        branchTransactionDO.setBranchType(rs.getString(ServerTableColumnsName.BRANCH_TABLE_BRANCH_TYPE));
+        branchTransactionDO.setTransactionId(rs.getLong(ServerTableColumnsName.BRANCH_TABLE_TRANSACTION_ID));
+        branchTransactionDO.setGmtCreate(rs.getTimestamp(ServerTableColumnsName.BRANCH_TABLE_GMT_CREATE));
+        branchTransactionDO.setGmtModified(rs.getTimestamp(ServerTableColumnsName.BRANCH_TABLE_GMT_MODIFIED));
+        return branchTransactionDO;
+    }
+
+    /**
+     * the public modifier only for test
+     */
+    public void initTransactionNameSize() {
+        ColumnInfo columnInfo = queryTableStructure(globalTable, TRANSACTION_NAME_KEY);
+        if (columnInfo == null) {
+            LOGGER.warn("{} table or {} column not found", globalTable, TRANSACTION_NAME_KEY);
+            return;
+        }
+        this.transactionNameColumnSize = columnInfo.getColumnSize();
+    }
+
+    /**
+     * query column info from table
+     *
+     * @param tableName the table name
+     * @param colName   the column name
+     * @return the column info
+     */
+    private ColumnInfo queryTableStructure(final String tableName, String colName) {
+        try (Connection conn = logStoreDataSource.getConnection()) {
+            DatabaseMetaData dbmd = conn.getMetaData();
+            String schema = getSchema(conn);
+            ResultSet tableRs = dbmd.getTables(null, schema, "%", new String[]{"TABLE"});
+            while (tableRs.next()) {
+                String table = tableRs.getString("TABLE_NAME");
+                if (StringUtils.equalsIgnoreCase(table, tableName)) {
+                    ResultSet columnRs = conn.getMetaData().getColumns(null, schema, table, null);
+                    while (columnRs.next()) {
+                        ColumnInfo info = new ColumnInfo();
+                        String columnName = columnRs.getString("COLUMN_NAME");
+                        info.setColumnName(columnName);
+                        String typeName = columnRs.getString("TYPE_NAME");
+                        info.setTypeName(typeName);
+                        int columnSize = columnRs.getInt("COLUMN_SIZE");
+                        info.setColumnSize(columnSize);
+                        String remarks = columnRs.getString("REMARKS");
+                        info.setRemarks(remarks);
+                        if (StringUtils.equalsIgnoreCase(columnName, colName)) {
+                            return info;
+                        }
+                    }
+                    break;
+                }
+            }
+        } catch (SQLException e) {
+            LOGGER.error("query transaction_name size fail, {}", e.getMessage(), e);
+        }
+        return null;
+    }
+
+    private String getSchema(Connection conn) throws SQLException {
+        if ("h2".equalsIgnoreCase(dbType)) {
+            return null;
+        } else if ("postgresql".equalsIgnoreCase(dbType)) {
+            String sql = "select current_schema";
+            try (PreparedStatement ps = conn.prepareStatement(sql);
+                ResultSet rs = ps.executeQuery()) {
+                String schema = null;
+                if (rs.next()) {
+                    schema = rs.getString(1);
+                }
+                return schema;
+            } catch (SQLException e) {
+                throw new StoreException(e);
+            }
+        } else {
+            return conn.getMetaData().getUserName();
+        }
+    }
+
+    /**
+     * Sets log store data source.
+     *
+     * @param logStoreDataSource the log store data source
+     */
+    public void setLogStoreDataSource(DataSource logStoreDataSource) {
+        this.logStoreDataSource = logStoreDataSource;
+    }
+
+    /**
+     * Sets global table.
+     *
+     * @param globalTable the global table
+     */
+    public void setGlobalTable(String globalTable) {
+        this.globalTable = globalTable;
+    }
+
+    /**
+     * Sets branch table.
+     *
+     * @param branchTable the branch table
+     */
+    public void setBranchTable(String branchTable) {
+        this.branchTable = branchTable;
+    }
+
+    /**
+     * Sets db type.
+     *
+     * @param dbType the db type
+     */
+    public void setDbType(String dbType) {
+        this.dbType = dbType;
+    }
+
+    public int getTransactionNameColumnSize() {
+        return transactionNameColumnSize;
+    }
+
+    /**
+     * column info
+     */
+    private static class ColumnInfo {
+        private String columnName;
+        private String typeName;
+        private int columnSize;
+        private String remarks;
+
+        public String getColumnName() {
+            return columnName;
+        }
+
+        public void setColumnName(String columnName) {
+            this.columnName = columnName;
+        }
+
+        public String getTypeName() {
+            return typeName;
+        }
+
+        public void setTypeName(String typeName) {
+            this.typeName = typeName;
+        }
+
+        public int getColumnSize() {
+            return columnSize;
+        }
+
+        public void setColumnSize(int columnSize) {
+            this.columnSize = columnSize;
+        }
+
+        public String getRemarks() {
+            return remarks;
+        }
+
+        public void setRemarks(String remarks) {
+            this.remarks = remarks;
+        }
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/FlushDiskMode.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/FlushDiskMode.java
new file mode 100644
index 0000000..9fdb50e
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/FlushDiskMode.java
@@ -0,0 +1,43 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.storage.file;
+
+/**
+ * @author lizhao
+ */
+public enum FlushDiskMode {
+    /**
+     * sync flush disk
+     */
+    SYNC_MODEL("sync"),
+    /**
+     * async flush disk
+     */
+    ASYNC_MODEL("async");
+
+    private String modeStr;
+
+    FlushDiskMode(String modeStr) {
+        this.modeStr = modeStr;
+    }
+
+    public static FlushDiskMode findDiskMode(String modeStr) {
+        if (SYNC_MODEL.modeStr.equals(modeStr)) {
+            return SYNC_MODEL;
+        }
+        return ASYNC_MODEL;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/ReloadableStore.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/ReloadableStore.java
new file mode 100644
index 0000000..be45305
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/ReloadableStore.java
@@ -0,0 +1,45 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.storage.file;
+
+import java.util.List;
+
+/**
+ * The interface Reloadable store.
+ *
+ * @author zhangsen
+ */
+public interface ReloadableStore {
+
+    /**
+     * Read write store.
+     *
+     * @param readSize  the read size
+     * @param isHistory the is history
+     * @return the list
+     */
+    List<TransactionWriteStore> readWriteStore(int readSize, boolean isHistory);
+
+    /**
+     * Has remaining boolean.
+     *
+     * @param isHistory the is history
+     * @return the boolean
+     */
+    boolean hasRemaining(boolean isHistory);
+
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/TransactionWriteStore.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/TransactionWriteStore.java
new file mode 100644
index 0000000..d5e4d3e
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/TransactionWriteStore.java
@@ -0,0 +1,129 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.storage.file;
+
+import io.seata.common.exception.ShouldNeverHappenException;
+import io.seata.server.session.BranchSession;
+import io.seata.server.session.GlobalSession;
+import io.seata.server.store.SessionStorable;
+import io.seata.server.store.TransactionStoreManager.LogOperation;
+
+import java.nio.ByteBuffer;
+
+/**
+ * The type Transaction write store.
+ *
+ * @author slievrly
+ */
+public class TransactionWriteStore implements SessionStorable {
+    private SessionStorable sessionRequest;
+    private LogOperation operate;
+
+    /**
+     * Instantiates a new Transaction write store.
+     *
+     * @param sessionRequest the session request
+     * @param operate        the operate
+     */
+    public TransactionWriteStore(SessionStorable sessionRequest, LogOperation operate) {
+        this.sessionRequest = sessionRequest;
+        this.operate = operate;
+    }
+
+    /**
+     * Instantiates a new Transaction write store.
+     */
+    public TransactionWriteStore() {}
+
+    /**
+     * Gets session request.
+     *
+     * @return the session request
+     */
+    public SessionStorable getSessionRequest() {
+        return sessionRequest;
+    }
+
+    /**
+     * Sets session request.
+     *
+     * @param sessionRequest the session request
+     */
+    public void setSessionRequest(SessionStorable sessionRequest) {
+        this.sessionRequest = sessionRequest;
+    }
+
+    /**
+     * Gets operate.
+     *
+     * @return the operate
+     */
+    public LogOperation getOperate() {
+        return operate;
+    }
+
+    /**
+     * Sets operate.
+     *
+     * @param operate the operate
+     */
+    public void setOperate(LogOperation operate) {
+        this.operate = operate;
+    }
+
+    @Override
+    public byte[] encode() {
+        byte[] bySessionRequest = this.sessionRequest.encode();
+        byte byOpCode = this.getOperate().getCode();
+        int len = bySessionRequest.length + 1;
+        byte[] byResult = new byte[len];
+        ByteBuffer byteBuffer = ByteBuffer.wrap(byResult);
+        byteBuffer.put(bySessionRequest);
+        byteBuffer.put(byOpCode);
+        return byResult;
+    }
+
+    @Override
+    public void decode(byte[] src) {
+        ByteBuffer byteBuffer = ByteBuffer.wrap(src);
+        byte[] bySessionRequest = new byte[src.length - 1];
+        byteBuffer.get(bySessionRequest);
+        byte byOpCode = byteBuffer.get();
+        this.operate = LogOperation.getLogOperationByCode(byOpCode);
+        SessionStorable tmpSessionStorable = getSessionInstanceByOperation(this.operate);
+        tmpSessionStorable.decode(bySessionRequest);
+        this.sessionRequest = tmpSessionStorable;
+    }
+
+    private SessionStorable getSessionInstanceByOperation(LogOperation logOperation) {
+        SessionStorable sessionStorable = null;
+        switch (logOperation) {
+            case GLOBAL_ADD:
+            case GLOBAL_UPDATE:
+            case GLOBAL_REMOVE:
+                sessionStorable = new GlobalSession();
+                break;
+            case BRANCH_ADD:
+            case BRANCH_UPDATE:
+            case BRANCH_REMOVE:
+                sessionStorable = new BranchSession();
+                break;
+            default:
+                throw new ShouldNeverHappenException("incorrect logOperation");
+        }
+        return sessionStorable;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/lock/FileLockManager.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/lock/FileLockManager.java
new file mode 100644
index 0000000..72e897e
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/lock/FileLockManager.java
@@ -0,0 +1,60 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.storage.file.lock;
+
+import io.seata.common.loader.LoadLevel;
+import io.seata.core.exception.TransactionException;
+import io.seata.core.lock.Locker;
+import io.seata.server.lock.AbstractLockManager;
+import io.seata.server.session.BranchSession;
+import io.seata.server.session.GlobalSession;
+import org.slf4j.MDC;
+
+import java.util.List;
+
+import static io.seata.core.context.RootContext.MDC_KEY_BRANCH_ID;
+
+/**
+ * The type file lock manager.
+ *
+ * @author zhangsen
+ */
+@LoadLevel(name = "file")
+public class FileLockManager extends AbstractLockManager {
+
+    @Override
+    public Locker getLocker(BranchSession branchSession) {
+        return new FileLocker(branchSession);
+    }
+
+    @Override
+    public boolean releaseGlobalSessionLock(GlobalSession globalSession) throws TransactionException {
+        List<BranchSession> branchSessions = globalSession.getBranchSessions();
+        boolean releaseLockResult = true;
+        for (BranchSession branchSession : branchSessions) {
+            try {
+                MDC.put(MDC_KEY_BRANCH_ID, String.valueOf(branchSession.getBranchId()));
+                if (!this.releaseLock(branchSession)) {
+                    releaseLockResult = false;
+                }
+            } finally {
+                MDC.remove(MDC_KEY_BRANCH_ID);
+            }
+        }
+        return releaseLockResult;
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/lock/FileLocker.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/lock/FileLocker.java
new file mode 100644
index 0000000..fe11102
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/lock/FileLocker.java
@@ -0,0 +1,220 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.storage.file.lock;
+
+import io.seata.common.exception.FrameworkException;
+import io.seata.common.exception.StoreException;
+import io.seata.common.util.CollectionUtils;
+import io.seata.core.exception.BranchTransactionException;
+import io.seata.core.exception.TransactionException;
+import io.seata.core.lock.AbstractLocker;
+import io.seata.core.lock.RowLock;
+import io.seata.core.model.LockStatus;
+import io.seata.server.session.BranchSession;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import static io.seata.core.exception.TransactionExceptionCode.LockKeyConflictFailFast;
+
+/**
+ * The type Memory locker.
+ *
+ * @author zhangsen
+ */
+public class FileLocker extends AbstractLocker {
+
+    private static final int BUCKET_PER_TABLE = 128;
+
+    private static final ConcurrentMap<String/* resourceId */, ConcurrentMap<String/* tableName */,
+        ConcurrentMap<Integer/* bucketId */, BucketLockMap>>>
+        LOCK_MAP = new ConcurrentHashMap<>();
+
+    /**
+     * The Branch session.
+     */
+    protected BranchSession branchSession;
+
+    /**
+     * Instantiates a new Memory locker.
+     *
+     * @param branchSession the branch session
+     */
+    public FileLocker(BranchSession branchSession) {
+        this.branchSession = branchSession;
+    }
+
+    @Override
+    public boolean acquireLock(List<RowLock> rowLocks) {
+        return acquireLock(rowLocks, true, false);
+    }
+
+    @Override
+    public boolean acquireLock(List<RowLock> rowLocks, boolean autoCommit, boolean skipCheckLock) {
+        if (CollectionUtils.isEmpty(rowLocks)) {
+            // no lock
+            return true;
+        }
+        String resourceId = branchSession.getResourceId();
+        long transactionId = branchSession.getTransactionId();
+
+        ConcurrentMap<BucketLockMap, Set<String>> bucketHolder = branchSession.getLockHolder();
+        ConcurrentMap<String, ConcurrentMap<Integer, BucketLockMap>> dbLockMap = CollectionUtils.computeIfAbsent(
+            LOCK_MAP, resourceId, key -> new ConcurrentHashMap<>());
+        boolean failFast = false;
+        boolean canLock = true;
+        for (RowLock lock : rowLocks) {
+            String tableName = lock.getTableName();
+            String pk = lock.getPk();
+            ConcurrentMap<Integer, BucketLockMap> tableLockMap = CollectionUtils.computeIfAbsent(dbLockMap, tableName,
+                key -> new ConcurrentHashMap<>());
+
+            int bucketId = pk.hashCode() % BUCKET_PER_TABLE;
+            BucketLockMap bucketLockMap = CollectionUtils.computeIfAbsent(tableLockMap, bucketId,
+                key -> new BucketLockMap());
+            BranchSession previousLockBranchSession = bucketLockMap.get().putIfAbsent(pk, branchSession);
+            if (previousLockBranchSession == null) {
+                // No existing lock, and now locked by myself
+                Set<String> keysInHolder = CollectionUtils.computeIfAbsent(bucketHolder, bucketLockMap,
+                    key -> ConcurrentHashMap.newKeySet());
+                keysInHolder.add(pk);
+            } else if (previousLockBranchSession.getTransactionId() == transactionId) {
+                // Locked by me before
+                continue;
+            } else {
+                LOGGER.info("Global lock on [" + tableName + ":" + pk + "] is holding by " + previousLockBranchSession.getBranchId());
+                try {
+                    // Release all acquired locks.
+                    branchSession.unlock();
+                } catch (TransactionException e) {
+                    throw new FrameworkException(e);
+                }
+                if (!autoCommit && previousLockBranchSession.getLockStatus() == LockStatus.Rollbacking) {
+                    failFast = true;
+                    break;
+                }
+                if (canLock) {
+                    canLock = false;
+                    if (autoCommit) {
+                        break;
+                    }
+                }
+            }
+        }
+        if (failFast) {
+            throw new StoreException(new BranchTransactionException(LockKeyConflictFailFast));
+        }
+        return canLock;
+    }
+
+    @Override
+    public boolean releaseLock(List<RowLock> rowLock) {
+        if (CollectionUtils.isEmpty(rowLock)) {
+            //no lock
+            return true;
+        }
+        ConcurrentMap<BucketLockMap, Set<String>> lockHolder = branchSession.getLockHolder();
+        if (CollectionUtils.isEmpty(lockHolder)) {
+            return true;
+        }
+        for (Map.Entry<BucketLockMap, Set<String>> entry : lockHolder.entrySet()) {
+            BucketLockMap bucket = entry.getKey();
+            Set<String> keys = entry.getValue();
+            for (String key : keys) {
+                // remove lock only if it locked by myself
+                bucket.get().remove(key, branchSession);
+            }
+        }
+        lockHolder.clear();
+        return true;
+    }
+
+    @Override
+    public boolean isLockable(List<RowLock> rowLocks) {
+        if (CollectionUtils.isEmpty(rowLocks)) {
+            //no lock
+            return true;
+        }
+        Long transactionId = rowLocks.get(0).getTransactionId();
+        String resourceId = rowLocks.get(0).getResourceId();
+        ConcurrentMap<String, ConcurrentMap<Integer, BucketLockMap>> dbLockMap = LOCK_MAP.get(resourceId);
+        if (dbLockMap == null) {
+            return true;
+        }
+        for (RowLock rowLock : rowLocks) {
+            String tableName = rowLock.getTableName();
+            String pk = rowLock.getPk();
+
+            ConcurrentMap<Integer, BucketLockMap> tableLockMap = dbLockMap.get(tableName);
+            if (tableLockMap == null) {
+                continue;
+            }
+            int bucketId = pk.hashCode() % BUCKET_PER_TABLE;
+            BucketLockMap bucketLockMap = tableLockMap.get(bucketId);
+            if (bucketLockMap == null) {
+                continue;
+            }
+            BranchSession branchSession = bucketLockMap.get().get(pk);
+            Long lockingTransactionId = branchSession != null ? branchSession.getTransactionId() : null;
+            if (lockingTransactionId == null || lockingTransactionId.longValue() == transactionId) {
+                // Locked by me
+                continue;
+            } else {
+                LOGGER.info("Global lock on [" + tableName + ":" + pk + "] is holding by " + lockingTransactionId);
+                return false;
+            }
+        }
+        return true;
+    }
+
+
+    @Override
+    public void updateLockStatus(String xid, LockStatus lockStatus) {
+    }
+
+    @Override
+    public void cleanAllLocks() {
+        LOCK_MAP.clear();
+    }
+
+    /**
+     * Because bucket lock map will be key of HashMap(lockHolder), however {@link ConcurrentHashMap} overwrites
+     * {@link Object#hashCode()} and {@link Object#equals(Object)}, that leads to hash key conflict in lockHolder.
+     * We define a {@link BucketLockMap} to hold the ConcurrentHashMap(bucketLockMap) and replace it as key of
+     * HashMap(lockHolder).
+     */
+    public static class BucketLockMap {
+        private final ConcurrentHashMap<String/* pk */, BranchSession/* branchSession */> bucketLockMap
+            = new ConcurrentHashMap<>();
+
+        ConcurrentHashMap<String, BranchSession> get() {
+            return bucketLockMap;
+        }
+
+        @Override
+        public int hashCode() {
+            return super.hashCode();
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            return super.equals(o);
+        }
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/session/FileSessionManager.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/session/FileSessionManager.java
new file mode 100644
index 0000000..9eeca2f
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/session/FileSessionManager.java
@@ -0,0 +1,370 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.storage.file.session;
+
+import io.seata.common.exception.ShouldNeverHappenException;
+import io.seata.common.loader.LoadLevel;
+import io.seata.common.loader.Scope;
+import io.seata.common.util.CollectionUtils;
+import io.seata.common.util.StringUtils;
+import io.seata.config.ConfigurationFactory;
+import io.seata.core.constants.ConfigurationKeys;
+import io.seata.core.exception.TransactionException;
+import io.seata.core.model.GlobalStatus;
+import io.seata.server.session.*;
+import io.seata.server.storage.file.ReloadableStore;
+import io.seata.server.storage.file.TransactionWriteStore;
+import io.seata.server.storage.file.store.FileTransactionStoreManager;
+import io.seata.server.store.AbstractTransactionStoreManager;
+import io.seata.server.store.SessionStorable;
+import io.seata.server.store.TransactionStoreManager;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+
+import static io.seata.common.DefaultValues.DEFAULT_SERVICE_SESSION_RELOAD_READ_SIZE;
+
+
+/**
+ * The type File based session manager.
+ *
+ * @author slievrly
+ */
+@LoadLevel(name = "file", scope = Scope.PROTOTYPE)
+public class FileSessionManager extends AbstractSessionManager implements Reloadable {
+
+    private static final int READ_SIZE = ConfigurationFactory.getInstance().getInt(
+        ConfigurationKeys.SERVICE_SESSION_RELOAD_READ_SIZE, DEFAULT_SERVICE_SESSION_RELOAD_READ_SIZE);
+    /**
+     * The Session map.
+     */
+    private Map<String, GlobalSession> sessionMap = new ConcurrentHashMap<>();
+
+    /**
+     * Instantiates a new File based session manager.
+     *
+     * @param name                 the name
+     * @param sessionStoreFilePath the session store file path
+     * @throws IOException the io exception
+     */
+    public FileSessionManager(String name, String sessionStoreFilePath) throws IOException {
+        super(name);
+        if (StringUtils.isNotBlank(sessionStoreFilePath)) {
+            transactionStoreManager = new FileTransactionStoreManager(
+                sessionStoreFilePath + File.separator + name, this);
+        } else {
+            transactionStoreManager = new AbstractTransactionStoreManager() {
+                @Override
+                public boolean writeSession(LogOperation logOperation, SessionStorable session) {
+                    return true;
+                }
+            };
+        }
+    }
+
+    @Override
+    public void reload() {
+        restoreSessions();
+    }
+
+    @Override
+    public void addGlobalSession(GlobalSession session) throws TransactionException {
+        CollectionUtils.computeIfAbsent(sessionMap, session.getXid(), k -> {
+            try {
+                super.addGlobalSession(session);
+            } catch (TransactionException e) {
+                LOGGER.error("addGlobalSession fail, msg: {}", e.getMessage());
+            }
+            return session;
+        });
+    }
+
+    @Override
+    public GlobalSession findGlobalSession(String xid)  {
+        return sessionMap.get(xid);
+    }
+
+    @Override
+    public GlobalSession findGlobalSession(String xid, boolean withBranchSessions) {
+        // withBranchSessions without process in memory
+        return sessionMap.get(xid);
+    }
+
+    @Override
+    public void removeGlobalSession(GlobalSession session) throws TransactionException {
+        if (sessionMap.remove(session.getXid()) != null) {
+            super.removeGlobalSession(session);
+        }
+    }
+
+    @Override
+    public Collection<GlobalSession> allSessions() {
+        return sessionMap.values();
+    }
+
+    @Override
+    public List<GlobalSession> findGlobalSessions(SessionCondition condition) {
+        List<GlobalSession> found = new ArrayList<>();
+
+        List<GlobalStatus> globalStatuses = null;
+        if (null != condition.getStatuses() && condition.getStatuses().length > 0) {
+            globalStatuses = Arrays.asList(condition.getStatuses());
+        }
+        for (GlobalSession globalSession : sessionMap.values()) {
+            if (null != condition.getOverTimeAliveMills() && condition.getOverTimeAliveMills() > 0) {
+                if (System.currentTimeMillis() - globalSession.getBeginTime() <= condition.getOverTimeAliveMills()) {
+                    continue;
+                }
+            }
+
+            if (!StringUtils.isEmpty(condition.getXid())) {
+                if (Objects.equals(condition.getXid(), globalSession.getXid())) {
+                    // Only one will be found, just add and return
+                    found.add(globalSession);
+                    return found;
+                } else {
+                    continue;
+                }
+            }
+
+            if (null != condition.getTransactionId() && condition.getTransactionId() > 0) {
+                if (Objects.equals(condition.getTransactionId(), globalSession.getTransactionId())) {
+                    // Only one will be found, just add and return
+                    found.add(globalSession);
+                    return found;
+                } else {
+                    continue;
+                }
+            }
+
+            if (null != globalStatuses) {
+                if (!globalStatuses.contains(globalSession.getStatus())) {
+                    continue;
+                }
+            }
+
+            // All test pass, add to resp
+            found.add(globalSession);
+        }
+        return found;
+    }
+
+    @Override
+    public <T> T lockAndExecute(GlobalSession globalSession, GlobalSession.LockCallable<T> lockCallable)
+        throws TransactionException {
+        globalSession.lock();
+        try {
+            return lockCallable.call();
+        } finally {
+            globalSession.unlock();
+        }
+    }
+
+    private void restoreSessions() {
+        final Set<String> removedGlobalBuffer = new HashSet<>();
+        final Map<String, Map<Long, BranchSession>> unhandledBranchBuffer = new HashMap<>();
+
+        restoreSessions(true, removedGlobalBuffer, unhandledBranchBuffer);
+        restoreSessions(false, removedGlobalBuffer, unhandledBranchBuffer);
+
+        if (!unhandledBranchBuffer.isEmpty()) {
+            unhandledBranchBuffer.values().forEach(unhandledBranchSessions -> {
+                unhandledBranchSessions.values().forEach(branchSession -> {
+                    String xid = branchSession.getXid();
+                    if (removedGlobalBuffer.contains(xid)) {
+                        return;
+                    }
+
+                    long bid = branchSession.getBranchId();
+                    GlobalSession found = sessionMap.get(xid);
+                    if (found == null) {
+                        // Ignore
+                        if (LOGGER.isInfoEnabled()) {
+                            LOGGER.info("GlobalSession Does Not Exists For BranchSession [" + bid + "/" + xid + "]");
+                        }
+                    } else {
+                        BranchSession existingBranch = found.getBranch(branchSession.getBranchId());
+                        if (existingBranch == null) {
+                            found.add(branchSession);
+                        } else {
+                            existingBranch.setStatus(branchSession.getStatus());
+                        }
+                    }
+                });
+            });
+        }
+    }
+
+    private boolean checkSessionStatus(GlobalSession globalSession) {
+        GlobalStatus globalStatus = globalSession.getStatus();
+        switch (globalStatus) {
+            case UnKnown:
+            case Committed:
+            case CommitFailed:
+            case Rollbacked:
+            case RollbackFailed:
+            case TimeoutRollbacked:
+            case TimeoutRollbackFailed:
+            case RollbackRetryTimeout:
+            case Finished:
+                return false;
+            default:
+                return true;
+        }
+    }
+
+    private void restoreSessions(boolean isHistory, Set<String> removedGlobalBuffer, Map<String,
+        Map<Long, BranchSession>> unhandledBranchBuffer) {
+        if (!(transactionStoreManager instanceof ReloadableStore)) {
+            return;
+        }
+        while (((ReloadableStore)transactionStoreManager).hasRemaining(isHistory)) {
+            List<TransactionWriteStore> stores = ((ReloadableStore)transactionStoreManager).readWriteStore(READ_SIZE,
+                isHistory);
+            restore(stores, removedGlobalBuffer, unhandledBranchBuffer);
+        }
+    }
+
+    private void restore(List<TransactionWriteStore> stores, Set<String> removedGlobalBuffer,
+        Map<String, Map<Long, BranchSession>> unhandledBranchBuffer) {
+        for (TransactionWriteStore store : stores) {
+            TransactionStoreManager.LogOperation logOperation = store.getOperate();
+            SessionStorable sessionStorable = store.getSessionRequest();
+            switch (logOperation) {
+                case GLOBAL_ADD:
+                case GLOBAL_UPDATE: {
+                    GlobalSession globalSession = (GlobalSession)sessionStorable;
+                    if (globalSession.getTransactionId() == 0) {
+                        LOGGER.error(
+                            "Restore globalSession from file failed, the transactionId is zero , xid:" + globalSession
+                                .getXid());
+                        break;
+                    }
+                    if (removedGlobalBuffer.contains(globalSession.getXid())) {
+                        break;
+                    }
+                    GlobalSession foundGlobalSession = sessionMap.get(globalSession.getXid());
+                    if (foundGlobalSession == null) {
+                        if (this.checkSessionStatus(globalSession)) {
+                            sessionMap.put(globalSession.getXid(), globalSession);
+                        } else {
+                            removedGlobalBuffer.add(globalSession.getXid());
+                            unhandledBranchBuffer.remove(globalSession.getXid());
+                        }
+                    } else {
+                        if (this.checkSessionStatus(globalSession)) {
+                            foundGlobalSession.setStatus(globalSession.getStatus());
+                        } else {
+                            sessionMap.remove(globalSession.getXid());
+                            removedGlobalBuffer.add(globalSession.getXid());
+                            unhandledBranchBuffer.remove(globalSession.getXid());
+                        }
+                    }
+                    break;
+                }
+                case GLOBAL_REMOVE: {
+                    GlobalSession globalSession = (GlobalSession)sessionStorable;
+                    if (globalSession.getTransactionId() == 0) {
+                        LOGGER.error(
+                            "Restore globalSession from file failed, the transactionId is zero , xid:" + globalSession
+                                .getXid());
+                        break;
+                    }
+                    if (removedGlobalBuffer.contains(globalSession.getXid())) {
+                        break;
+                    }
+                    if (sessionMap.remove(globalSession.getXid()) == null) {
+                        if (LOGGER.isInfoEnabled()) {
+                            LOGGER.info("GlobalSession To Be Removed Does Not Exists [" + globalSession.getXid() + "]");
+                        }
+                    }
+                    removedGlobalBuffer.add(globalSession.getXid());
+                    unhandledBranchBuffer.remove(globalSession.getXid());
+                    break;
+                }
+                case BRANCH_ADD:
+                case BRANCH_UPDATE: {
+                    BranchSession branchSession = (BranchSession)sessionStorable;
+                    if (branchSession.getTransactionId() == 0) {
+                        LOGGER.error(
+                            "Restore branchSession from file failed, the transactionId is zero , xid:" + branchSession
+                                .getXid());
+                        break;
+                    }
+                    if (removedGlobalBuffer.contains(branchSession.getXid())) {
+                        break;
+                    }
+                    GlobalSession foundGlobalSession = sessionMap.get(branchSession.getXid());
+                    if (foundGlobalSession == null) {
+                        unhandledBranchBuffer.computeIfAbsent(branchSession.getXid(), key -> new HashMap<>())
+                            .put(branchSession.getBranchId(), branchSession);
+                    } else {
+                        BranchSession existingBranch = foundGlobalSession.getBranch(branchSession.getBranchId());
+                        if (existingBranch == null) {
+                            foundGlobalSession.add(branchSession);
+                        } else {
+                            existingBranch.setStatus(branchSession.getStatus());
+                        }
+                    }
+                    break;
+                }
+                case BRANCH_REMOVE: {
+                    BranchSession branchSession = (BranchSession)sessionStorable;
+                    String xid = branchSession.getXid();
+                    if (removedGlobalBuffer.contains(xid)) {
+                        break;
+                    }
+                    long bid = branchSession.getBranchId();
+                    if (branchSession.getTransactionId() == 0) {
+                        LOGGER.error(
+                            "Restore branchSession from file failed, the transactionId is zero , xid:" + branchSession
+                                .getXid());
+                        break;
+                    }
+                    GlobalSession found = sessionMap.get(xid);
+                    if (found == null) {
+                        if (LOGGER.isInfoEnabled()) {
+                            LOGGER.info(
+                                "GlobalSession To Be Updated (Remove Branch) Does Not Exists [" + bid + "/" + xid
+                                    + "]");
+                        }
+                    } else {
+                        BranchSession theBranch = found.getBranch(bid);
+                        if (theBranch == null) {
+                            if (LOGGER.isInfoEnabled()) {
+                                LOGGER.info("BranchSession To Be Updated Does Not Exists [" + bid + "/" + xid + "]");
+                            }
+                        } else {
+                            found.remove(theBranch);
+                        }
+                    }
+                    break;
+                }
+                default:
+                    throw new ShouldNeverHappenException("Unknown Operation: " + logOperation);
+            }
+        }
+
+    }
+
+    @Override
+    public void destroy() {
+        transactionStoreManager.shutdown();
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/store/FileTransactionStoreManager.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/store/FileTransactionStoreManager.java
new file mode 100644
index 0000000..6b3c1c7
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/store/FileTransactionStoreManager.java
@@ -0,0 +1,651 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.storage.file.store;
+
+import io.seata.common.exception.StoreException;
+import io.seata.common.thread.NamedThreadFactory;
+import io.seata.common.util.CollectionUtils;
+import io.seata.server.session.BranchSession;
+import io.seata.server.session.GlobalSession;
+import io.seata.server.session.SessionCondition;
+import io.seata.server.session.SessionManager;
+import io.seata.server.storage.file.FlushDiskMode;
+import io.seata.server.storage.file.ReloadableStore;
+import io.seata.server.storage.file.TransactionWriteStore;
+import io.seata.server.store.AbstractTransactionStoreManager;
+import io.seata.server.store.SessionStorable;
+import io.seata.server.store.StoreConfig;
+import io.seata.server.store.TransactionStoreManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.MDC;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+import java.nio.file.Files;
+import java.nio.file.StandardCopyOption;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.*;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.locks.ReentrantLock;
+
+import static io.seata.core.context.RootContext.MDC_KEY_BRANCH_ID;
+
+/**
+ * The type File transaction store manager.
+ *
+ * @author slievrly
+ */
+public class FileTransactionStoreManager extends AbstractTransactionStoreManager
+    implements TransactionStoreManager, ReloadableStore {
+    private static final Logger LOGGER = LoggerFactory.getLogger(FileTransactionStoreManager.class);
+
+    private static final int MAX_THREAD_WRITE = 1;
+
+    private ExecutorService fileWriteExecutor;
+
+    private volatile boolean stopping = false;
+
+    private static final int MAX_SHUTDOWN_RETRY = 3;
+
+    private static final int SHUTDOWN_CHECK_INTERVAL = 1 * 1000;
+
+    private static final int MAX_WRITE_RETRY = 5;
+
+    private static final String HIS_DATA_FILENAME_POSTFIX = ".1";
+
+    private static final AtomicLong FILE_TRX_NUM = new AtomicLong(0);
+
+    private static final AtomicLong FILE_FLUSH_NUM = new AtomicLong(0);
+
+    private static final int MARK_SIZE = 4;
+
+    private static final int MAX_WAIT_TIME_MILLS = 2 * 1000;
+
+    private static final int MAX_FLUSH_TIME_MILLS = 2 * 1000;
+
+    private static final int MAX_FLUSH_NUM = 10;
+
+    private static final int PER_FILE_BLOCK_SIZE = 65535 * 8;
+
+    private static final long MAX_TRX_TIMEOUT_MILLS = 30 * 60 * 1000;
+
+    private static volatile long trxStartTimeMills = System.currentTimeMillis();
+
+    private File currDataFile;
+
+    private RandomAccessFile currRaf;
+
+    private FileChannel currFileChannel;
+
+    private long recoverCurrOffset = 0;
+
+    private long recoverHisOffset = 0;
+
+    private SessionManager sessionManager;
+
+    private String currFullFileName;
+
+    private String hisFullFileName;
+
+    private WriteDataFileRunnable writeDataFileRunnable;
+
+    private ReentrantLock writeSessionLock = new ReentrantLock();
+
+    private volatile long lastModifiedTime;
+
+    private static final int MAX_WRITE_BUFFER_SIZE = StoreConfig.getFileWriteBufferCacheSize();
+
+    private final ByteBuffer writeBuffer = ByteBuffer.allocateDirect(MAX_WRITE_BUFFER_SIZE);
+
+    private static final FlushDiskMode FLUSH_DISK_MODE = StoreConfig.getFlushDiskMode();
+
+    private static final int MAX_WAIT_FOR_FLUSH_TIME_MILLS = 2 * 1000;
+
+    private static final int MAX_WAIT_FOR_CLOSE_TIME_MILLS = 2 * 1000;
+
+    private static final int INT_BYTE_SIZE = 4;
+
+    /**
+     * Instantiates a new File transaction store manager.
+     *
+     * @param fullFileName   the dir path
+     * @param sessionManager the session manager
+     * @throws IOException the io exception
+     */
+    public FileTransactionStoreManager(String fullFileName, SessionManager sessionManager) throws IOException {
+        initFile(fullFileName);
+        fileWriteExecutor = new ThreadPoolExecutor(MAX_THREAD_WRITE, MAX_THREAD_WRITE, Integer.MAX_VALUE,
+            TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(),
+            new NamedThreadFactory("fileTransactionStore", MAX_THREAD_WRITE, true));
+        writeDataFileRunnable = new WriteDataFileRunnable();
+        fileWriteExecutor.submit(writeDataFileRunnable);
+        this.sessionManager = sessionManager;
+    }
+
+    private void initFile(String fullFileName) throws IOException {
+        this.currFullFileName = fullFileName;
+        this.hisFullFileName = fullFileName + HIS_DATA_FILENAME_POSTFIX;
+        try {
+            currDataFile = new File(currFullFileName);
+            if (!currDataFile.exists()) {
+                // create parent dir first
+                if (currDataFile.getParentFile() != null && !currDataFile.getParentFile().exists()) {
+                    currDataFile.getParentFile().mkdirs();
+                }
+                currDataFile.createNewFile();
+                trxStartTimeMills = System.currentTimeMillis();
+            } else {
+                trxStartTimeMills = currDataFile.lastModified();
+            }
+            lastModifiedTime = System.currentTimeMillis();
+            currRaf = new RandomAccessFile(currDataFile, "rw");
+            currRaf.seek(currDataFile.length());
+            currFileChannel = currRaf.getChannel();
+        } catch (IOException exx) {
+            LOGGER.error("init file error,{}", exx.getMessage(), exx);
+            throw exx;
+        }
+    }
+
+    @Override
+    public boolean writeSession(LogOperation logOperation, SessionStorable session) {
+        long curFileTrxNum;
+        writeSessionLock.lock();
+        try {
+            if (!writeDataFile(new TransactionWriteStore(session, logOperation).encode())) {
+                return false;
+            }
+            lastModifiedTime = System.currentTimeMillis();
+            curFileTrxNum = FILE_TRX_NUM.incrementAndGet();
+            if (curFileTrxNum % PER_FILE_BLOCK_SIZE == 0
+                && (System.currentTimeMillis() - trxStartTimeMills) > MAX_TRX_TIMEOUT_MILLS) {
+                return saveHistory();
+            }
+        } catch (Exception exx) {
+            LOGGER.error("writeSession error, {}", exx.getMessage(), exx);
+            return false;
+        } finally {
+            writeSessionLock.unlock();
+        }
+        flushDisk(curFileTrxNum, currFileChannel);
+        return true;
+    }
+
+    private void flushDisk(long curFileNum, FileChannel currFileChannel) {
+
+        if (FLUSH_DISK_MODE == FlushDiskMode.SYNC_MODEL) {
+            SyncFlushRequest syncFlushRequest = new SyncFlushRequest(curFileNum, currFileChannel);
+            writeDataFileRunnable.putRequest(syncFlushRequest);
+            syncFlushRequest.waitForFlush(MAX_WAIT_FOR_FLUSH_TIME_MILLS);
+        } else {
+            writeDataFileRunnable.putRequest(new AsyncFlushRequest(curFileNum, currFileChannel));
+        }
+    }
+
+    /**
+     * get all overTimeSessionStorables
+     * merge write file
+     *
+     * @throws IOException
+     */
+    private boolean saveHistory() throws IOException {
+        boolean result;
+        try {
+            result = findTimeoutAndSave();
+            CloseFileRequest request = new CloseFileRequest(currFileChannel, currRaf);
+            writeDataFileRunnable.putRequest(request);
+            request.waitForClose(MAX_WAIT_FOR_CLOSE_TIME_MILLS);
+            Files.move(currDataFile.toPath(), new File(hisFullFileName).toPath(), StandardCopyOption.REPLACE_EXISTING);
+        } catch (IOException exx) {
+            LOGGER.error("save history data file error, {}", exx.getMessage(), exx);
+            result = false;
+        } finally {
+            initFile(currFullFileName);
+        }
+        return result;
+    }
+
+    private boolean writeDataFrame(byte[] data) {
+        if (data == null || data.length <= 0) {
+            return true;
+        }
+        int dataLength = data.length;
+        int bufferRemainingSize = writeBuffer.remaining();
+        if (bufferRemainingSize <= INT_BYTE_SIZE) {
+            if (!flushWriteBuffer(writeBuffer)) {
+                return false;
+            }
+        }
+        bufferRemainingSize = writeBuffer.remaining();
+        if (bufferRemainingSize <= INT_BYTE_SIZE) {
+            throw new IllegalStateException(
+                String.format("Write buffer remaining size %d was too small", bufferRemainingSize));
+        }
+        writeBuffer.putInt(dataLength);
+        bufferRemainingSize = writeBuffer.remaining();
+        int dataPos = 0;
+        while (dataPos < dataLength) {
+            int dataLengthToWrite = dataLength - dataPos;
+            dataLengthToWrite = Math.min(dataLengthToWrite, bufferRemainingSize);
+            writeBuffer.put(data, dataPos, dataLengthToWrite);
+            bufferRemainingSize = writeBuffer.remaining();
+            if (bufferRemainingSize == 0) {
+                if (!flushWriteBuffer(writeBuffer)) {
+                    return false;
+                }
+                bufferRemainingSize = writeBuffer.remaining();
+            }
+            dataPos += dataLengthToWrite;
+        }
+        return true;
+    }
+
+    private boolean flushWriteBuffer(ByteBuffer writeBuffer) {
+        writeBuffer.flip();
+        if (!writeDataFileByBuffer(writeBuffer)) {
+            return false;
+        }
+        writeBuffer.clear();
+        return true;
+    }
+
+    private boolean findTimeoutAndSave() throws IOException {
+        List<GlobalSession> globalSessionsOverMaxTimeout = sessionManager.findGlobalSessions(
+            new SessionCondition(MAX_TRX_TIMEOUT_MILLS));
+        if (CollectionUtils.isEmpty(globalSessionsOverMaxTimeout)) {
+            return true;
+        }
+        for (GlobalSession globalSession : globalSessionsOverMaxTimeout) {
+            TransactionWriteStore globalWriteStore = new TransactionWriteStore(globalSession, LogOperation.GLOBAL_ADD);
+            byte[] data = globalWriteStore.encode();
+            if (!writeDataFrame(data)) {
+                return false;
+            }
+            List<BranchSession> branchSessIonsOverMaXTimeout = globalSession.getSortedBranches();
+            if (branchSessIonsOverMaXTimeout != null) {
+                for (BranchSession branchSession : branchSessIonsOverMaXTimeout) {
+                    try {
+                        MDC.put(MDC_KEY_BRANCH_ID, String.valueOf(branchSession.getBranchId()));
+                        TransactionWriteStore branchWriteStore = new TransactionWriteStore(branchSession,
+                            LogOperation.BRANCH_ADD);
+                        data = branchWriteStore.encode();
+                        if (!writeDataFrame(data)) {
+                            return false;
+                        }
+                    } finally {
+                        MDC.remove(MDC_KEY_BRANCH_ID);
+                    }
+                }
+            }
+        }
+        if (flushWriteBuffer(writeBuffer)) {
+            currFileChannel.force(false);
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public GlobalSession readSession(String xid) {
+        throw new StoreException("unsupport for read from file, xid:" + xid);
+    }
+
+    @Override
+    public List<GlobalSession> readSession(SessionCondition sessionCondition) {
+        throw new StoreException("unsupport for read from file");
+    }
+
+    @Override
+    public void shutdown() {
+        if (fileWriteExecutor != null) {
+            fileWriteExecutor.shutdown();
+            stopping = true;
+            int retry = 0;
+            while (!fileWriteExecutor.isTerminated() && retry < MAX_SHUTDOWN_RETRY) {
+                ++retry;
+                try {
+                    Thread.sleep(SHUTDOWN_CHECK_INTERVAL);
+                } catch (InterruptedException ignore) {
+                }
+            }
+            if (retry >= MAX_SHUTDOWN_RETRY) {
+                fileWriteExecutor.shutdownNow();
+            }
+        }
+        try {
+            if (currFileChannel.isOpen()) {
+                currFileChannel.force(true);
+            }
+        } catch (IOException e) {
+            LOGGER.error("fileChannel force error: {}", e.getMessage(), e);
+        }
+        closeFile(currRaf);
+    }
+
+    @Override
+    public List<TransactionWriteStore> readWriteStore(int readSize, boolean isHistory) {
+        File file = null;
+        long currentOffset = 0;
+        if (isHistory) {
+            file = new File(hisFullFileName);
+            currentOffset = recoverHisOffset;
+        } else {
+            file = new File(currFullFileName);
+            currentOffset = recoverCurrOffset;
+        }
+        if (file.exists()) {
+            return parseDataFile(file, readSize, currentOffset, isHistory);
+        }
+        return null;
+    }
+
+    @Override
+    public boolean hasRemaining(boolean isHistory) {
+        File file;
+        RandomAccessFile raf = null;
+        long currentOffset;
+        if (isHistory) {
+            file = new File(hisFullFileName);
+            currentOffset = recoverHisOffset;
+        } else {
+            file = new File(currFullFileName);
+            currentOffset = recoverCurrOffset;
+        }
+        try {
+            raf = new RandomAccessFile(file, "r");
+            return currentOffset < raf.length();
+
+        } catch (IOException ignore) {
+        } finally {
+            closeFile(raf);
+        }
+        return false;
+    }
+
+    private List<TransactionWriteStore> parseDataFile(File file, int readSize, long currentOffset, boolean isHistory) {
+        List<TransactionWriteStore> transactionWriteStores = new ArrayList<>(readSize);
+        RandomAccessFile raf = null;
+        FileChannel fileChannel = null;
+        try {
+            raf = new RandomAccessFile(file, "r");
+            raf.seek(currentOffset);
+            fileChannel = raf.getChannel();
+            fileChannel.position(currentOffset);
+            long size = raf.length();
+            ByteBuffer buffSize = ByteBuffer.allocate(MARK_SIZE);
+            while (fileChannel.position() < size) {
+                try {
+                    buffSize.clear();
+                    int avilReadSize = fileChannel.read(buffSize);
+                    if (avilReadSize != MARK_SIZE) {
+                        break;
+                    }
+                    buffSize.flip();
+                    int bodySize = buffSize.getInt();
+                    byte[] byBody = new byte[bodySize];
+                    ByteBuffer buffBody = ByteBuffer.wrap(byBody);
+                    avilReadSize = fileChannel.read(buffBody);
+                    if (avilReadSize != bodySize) {
+                        break;
+                    }
+                    TransactionWriteStore writeStore = new TransactionWriteStore();
+                    writeStore.decode(byBody);
+                    transactionWriteStores.add(writeStore);
+                    if (transactionWriteStores.size() == readSize) {
+                        break;
+                    }
+                } catch (Exception ex) {
+                    LOGGER.error("decode data file error:{}", ex.getMessage(), ex);
+                    break;
+                }
+            }
+            return transactionWriteStores;
+        } catch (IOException exx) {
+            LOGGER.error("parse data file error:{},file:{}", exx.getMessage(), file.getName(), exx);
+            return null;
+        } finally {
+            try {
+                if (fileChannel != null) {
+                    if (isHistory) {
+                        recoverHisOffset = fileChannel.position();
+                    } else {
+                        recoverCurrOffset = fileChannel.position();
+                    }
+                }
+                closeFile(raf);
+            } catch (IOException exx) {
+                LOGGER.error("file close error{}", exx.getMessage(), exx);
+            }
+        }
+    }
+
+    private void closeFile(RandomAccessFile raf) {
+        try {
+            if (raf != null) {
+                raf.close();
+                raf = null;
+            }
+        } catch (IOException exx) {
+            LOGGER.error("file close error,{}", exx.getMessage(), exx);
+        }
+    }
+
+    private boolean writeDataFile(byte[] bs) {
+        if (bs == null || bs.length >= Integer.MAX_VALUE - 3) {
+            return false;
+        }
+        if (!writeDataFrame(bs)) {
+            return false;
+        }
+        return flushWriteBuffer(writeBuffer);
+    }
+
+    private boolean writeDataFileByBuffer(ByteBuffer byteBuffer) {
+        for (int retry = 0; retry < MAX_WRITE_RETRY; retry++) {
+            try {
+                while (byteBuffer.hasRemaining()) {
+                    currFileChannel.write(byteBuffer);
+                }
+                return true;
+            } catch (Exception exx) {
+                LOGGER.error("write data file error:{}", exx.getMessage(), exx);
+            }
+        }
+        LOGGER.error("write dataFile failed,retry more than :{}", MAX_WRITE_RETRY);
+        return false;
+    }
+
+    interface StoreRequest {
+
+    }
+
+    abstract static class AbstractFlushRequest implements StoreRequest {
+        private final long curFileTrxNum;
+
+        private final FileChannel curFileChannel;
+
+        protected AbstractFlushRequest(long curFileTrxNum, FileChannel curFileChannel) {
+            this.curFileTrxNum = curFileTrxNum;
+            this.curFileChannel = curFileChannel;
+        }
+
+        public long getCurFileTrxNum() {
+            return curFileTrxNum;
+        }
+
+        public FileChannel getCurFileChannel() {
+            return curFileChannel;
+        }
+    }
+
+    class SyncFlushRequest extends AbstractFlushRequest {
+
+        private final CountDownLatch countDownLatch = new CountDownLatch(1);
+
+        public SyncFlushRequest(long curFileTrxNum, FileChannel curFileChannel) {
+            super(curFileTrxNum, curFileChannel);
+        }
+
+        public void wakeup() {
+            this.countDownLatch.countDown();
+        }
+
+        public void waitForFlush(long timeout) {
+            try {
+                this.countDownLatch.await(timeout, TimeUnit.MILLISECONDS);
+            } catch (InterruptedException e) {
+                LOGGER.error("Interrupted", e);
+            }
+        }
+    }
+
+    class AsyncFlushRequest extends AbstractFlushRequest {
+
+        public AsyncFlushRequest(long curFileTrxNum, FileChannel curFileChannel) {
+            super(curFileTrxNum, curFileChannel);
+        }
+
+    }
+
+    static class CloseFileRequest implements StoreRequest {
+        private final CountDownLatch countDownLatch = new CountDownLatch(1);
+        private FileChannel fileChannel;
+
+        private RandomAccessFile file;
+
+        public CloseFileRequest(FileChannel fileChannel, RandomAccessFile file) {
+            this.fileChannel = fileChannel;
+            this.file = file;
+        }
+
+        public FileChannel getFileChannel() {
+            return fileChannel;
+        }
+
+        public RandomAccessFile getFile() {
+            return file;
+        }
+
+        public void wakeup() {
+            this.countDownLatch.countDown();
+        }
+
+        public void waitForClose(long timeout) {
+            try {
+                this.countDownLatch.await(timeout, TimeUnit.MILLISECONDS);
+            } catch (InterruptedException e) {
+                LOGGER.error("Interrupted", e);
+            }
+        }
+    }
+
+    /**
+     * The type Write data file runnable.
+     */
+    class WriteDataFileRunnable implements Runnable {
+
+        private LinkedBlockingQueue<StoreRequest> storeRequests = new LinkedBlockingQueue<>();
+
+        public void putRequest(final StoreRequest request) {
+            storeRequests.add(request);
+        }
+
+        @Override
+        public void run() {
+            while (!stopping) {
+                try {
+                    StoreRequest storeRequest = storeRequests.poll(MAX_WAIT_TIME_MILLS, TimeUnit.MILLISECONDS);
+                    handleStoreRequest(storeRequest);
+                } catch (Exception exx) {
+                    LOGGER.error("write file error: {}", exx.getMessage(), exx);
+                }
+            }
+            handleRestRequest();
+        }
+
+        /**
+         * handle the rest requests when stopping is true
+         */
+        private void handleRestRequest() {
+            int remainNums = storeRequests.size();
+            for (int i = 0; i < remainNums; i++) {
+                handleStoreRequest(storeRequests.poll());
+            }
+        }
+
+        private void handleStoreRequest(StoreRequest storeRequest) {
+            if (storeRequest == null) {
+                flushOnCondition(currFileChannel);
+            }
+            if (storeRequest instanceof SyncFlushRequest) {
+                syncFlush((SyncFlushRequest)storeRequest);
+            } else if (storeRequest instanceof AsyncFlushRequest) {
+                async((AsyncFlushRequest)storeRequest);
+            } else if (storeRequest instanceof CloseFileRequest) {
+                closeAndFlush((CloseFileRequest)storeRequest);
+            }
+        }
+
+        private void closeAndFlush(CloseFileRequest req) {
+            long diff = FILE_TRX_NUM.get() - FILE_FLUSH_NUM.get();
+            flush(req.getFileChannel());
+            FILE_FLUSH_NUM.addAndGet(diff);
+            closeFile(req.getFile());
+            req.wakeup();
+        }
+
+        private void async(AsyncFlushRequest req) {
+            flushOnCondition(req.getCurFileChannel());
+        }
+
+        private void syncFlush(SyncFlushRequest req) {
+            if (req.getCurFileTrxNum() > FILE_FLUSH_NUM.get()) {
+                long diff = FILE_TRX_NUM.get() - FILE_FLUSH_NUM.get();
+                flush(req.getCurFileChannel());
+                FILE_FLUSH_NUM.addAndGet(diff);
+            }
+            // notify
+            req.wakeup();
+        }
+
+        private void flushOnCondition(FileChannel fileChannel) {
+            if (FLUSH_DISK_MODE == FlushDiskMode.SYNC_MODEL) {
+                return;
+            }
+            long diff = FILE_TRX_NUM.get() - FILE_FLUSH_NUM.get();
+            if (diff == 0) {
+                return;
+            }
+            if (diff % MAX_FLUSH_NUM == 0 || System.currentTimeMillis() - lastModifiedTime > MAX_FLUSH_TIME_MILLS) {
+                flush(fileChannel);
+                FILE_FLUSH_NUM.addAndGet(diff);
+            }
+        }
+
+        private void flush(FileChannel fileChannel) {
+            try {
+                fileChannel.force(false);
+            } catch (IOException exx) {
+                LOGGER.error("flush error: {}", exx.getMessage(), exx);
+            }
+        }
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/JedisPooledFactory.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/JedisPooledFactory.java
new file mode 100644
index 0000000..6c32b7e
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/JedisPooledFactory.java
@@ -0,0 +1,125 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.storage.redis;
+
+import io.seata.common.exception.RedisException;
+import io.seata.common.util.ConfigTools;
+import io.seata.common.util.StringUtils;
+import io.seata.config.Configuration;
+import io.seata.config.ConfigurationFactory;
+import io.seata.core.constants.ConfigurationKeys;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import redis.clients.jedis.*;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+import static io.seata.common.DefaultValues.*;
+
+/**
+ * @author funkye
+ */
+public class JedisPooledFactory {
+    /**
+     * The constant LOGGER.
+     */
+    protected static final Logger LOGGER = LoggerFactory.getLogger(JedisPooledFactory.class);
+
+    private static volatile JedisPoolAbstract jedisPool = null;
+
+    private static final String HOST = "127.0.0.1";
+
+    private static final int PORT = 6379;
+    private static final int DATABASE = 0;
+
+    private static final int SENTINEL_HOST_NUMBER = 3;
+
+    private static final Configuration CONFIGURATION = ConfigurationFactory.getInstance();
+
+    /**
+     * get the RedisPool instance (singleton)
+     *
+     * @return redisPool
+     */
+    public static JedisPoolAbstract getJedisPoolInstance(JedisPoolAbstract... jedisPools) {
+        if (jedisPool == null) {
+            synchronized (JedisPooledFactory.class) {
+                if (jedisPool == null) {
+                    JedisPoolAbstract tempJedisPool = null;
+                    if (jedisPools != null && jedisPools.length > 0) {
+                        tempJedisPool = jedisPools[0];
+                    } else {
+                        String password = CONFIGURATION.getConfig(ConfigurationKeys.STORE_REDIS_PASSWORD);
+                        if (StringUtils.isBlank(password)) {
+                            password = null;
+                        } else {
+                            String publicKey = CONFIGURATION.getConfig(ConfigurationKeys.STORE_PUBLIC_KEY);
+                            if (StringUtils.isNotBlank(publicKey)) {
+                                try {
+                                    password = ConfigTools.publicDecrypt(password, publicKey);
+                                } catch (Exception e) {
+                                    LOGGER.error("decryption failed,please confirm whether the ciphertext and secret key are correct! error msg: {}", e.getMessage());
+                                }
+                            }
+                        }
+                        JedisPoolConfig poolConfig = new JedisPoolConfig();
+                        poolConfig.setMinIdle(CONFIGURATION.getInt(ConfigurationKeys.STORE_REDIS_MIN_CONN,
+                            DEFAULT_REDIS_MIN_IDLE));
+                        poolConfig.setMaxIdle(CONFIGURATION.getInt(ConfigurationKeys.STORE_REDIS_MAX_CONN,
+                            DEFAULT_REDIS_MAX_IDLE));
+                        poolConfig.setMaxTotal(CONFIGURATION.getInt(ConfigurationKeys.STORE_REDIS_MAX_TOTAL, DEFAULT_REDIS_MAX_TOTAL));
+                        String mode = CONFIGURATION.getConfig(ConfigurationKeys.STORE_REDIS_MODE,ConfigurationKeys.REDIS_SINGLE_MODE);
+                        if (mode.equals(ConfigurationKeys.REDIS_SENTINEL_MODE)) {
+                            String masterName = CONFIGURATION.getConfig(ConfigurationKeys.STORE_REDIS_SENTINEL_MASTERNAME);
+                            if (StringUtils.isBlank(masterName)) {
+                                throw new RedisException("The masterName is null in redis sentinel mode");
+                            }
+                            Set<String> sentinels = new HashSet<>(SENTINEL_HOST_NUMBER);
+                            String[] sentinelHosts = CONFIGURATION.getConfig(ConfigurationKeys.STORE_REDIS_SENTINEL_HOST).split(",");
+                            Arrays.asList(sentinelHosts).forEach(sentinelHost -> sentinels.add(sentinelHost));
+                            tempJedisPool = new JedisSentinelPool(masterName, sentinels, poolConfig, 60000, password, CONFIGURATION.getInt(ConfigurationKeys.STORE_REDIS_DATABASE, DATABASE));
+                        } else if (mode.equals(ConfigurationKeys.REDIS_SINGLE_MODE)) {
+                            String host = CONFIGURATION.getConfig(ConfigurationKeys.STORE_REDIS_SINGLE_HOST);
+                            host = StringUtils.isBlank(host) ? CONFIGURATION.getConfig(ConfigurationKeys.STORE_REDIS_HOST, HOST) : host;
+                            int port = CONFIGURATION.getInt(ConfigurationKeys.STORE_REDIS_SINGLE_PORT);
+                            port = port == 0 ? CONFIGURATION.getInt(ConfigurationKeys.STORE_REDIS_PORT, PORT) : port;
+                            tempJedisPool = new JedisPool(poolConfig, host, port, 60000, password, CONFIGURATION.getInt(ConfigurationKeys.STORE_REDIS_DATABASE, DATABASE));
+                        } else {
+                            throw new RedisException("Configuration error of redis cluster mode");
+                        }
+                    }
+                    if (LOGGER.isInfoEnabled()) {
+                        LOGGER.info("initialization of the build redis connection pool is complete");
+                    }
+                    jedisPool = tempJedisPool;
+                }
+            }
+        }
+        return jedisPool;
+    }
+
+    /**
+     * get an instance of Jedis (connection) from the connection pool
+     *
+     * @return jedis
+     */
+    public static Jedis getJedisInstance() {
+        return getJedisPoolInstance().getResource();
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/lock/RedisDistributedLocker.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/lock/RedisDistributedLocker.java
new file mode 100644
index 0000000..ecd60ca
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/lock/RedisDistributedLocker.java
@@ -0,0 +1,85 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.storage.redis.lock;
+
+import io.seata.common.loader.LoadLevel;
+import io.seata.common.loader.Scope;
+import io.seata.core.store.DistributedLockDO;
+import io.seata.core.store.DistributedLocker;
+import io.seata.server.storage.redis.JedisPooledFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import redis.clients.jedis.Jedis;
+import redis.clients.jedis.Transaction;
+import redis.clients.jedis.params.SetParams;
+
+/**
+ * Redis distributed lock
+ * @author  zhongxiang.wang
+ */
+@LoadLevel(name = "redis", scope = Scope.SINGLETON)
+public class RedisDistributedLocker implements DistributedLocker {
+
+    protected static final Logger LOGGER = LoggerFactory.getLogger(RedisDistributedLocker.class);
+    private static final String SUCCESS = "OK";
+
+    /**
+     * Acquire the distributed lock
+     *
+     * @param distributedLockDO the distributed lock info
+     * @return the distributed lock info
+     */
+    @Override
+    public boolean acquireLock(DistributedLockDO distributedLockDO) {
+        try (Jedis jedis = JedisPooledFactory.getJedisInstance()) {
+            //Don't need retry,if can't acquire the lock,let the other get the lock
+            String result = jedis.set(distributedLockDO.getLockKey(), distributedLockDO.getLockValue(), SetParams.setParams().nx().px(distributedLockDO.getExpireTime()));
+            return SUCCESS.equalsIgnoreCase(result);
+        } catch (Exception ex) {
+            LOGGER.error("The {} acquired the {} distributed lock failed.", distributedLockDO.getLockValue(), distributedLockDO.getLockKey(), ex);
+            return false;
+        }
+    }
+
+
+    /**
+     * Release the distributed lock
+     *
+     * @param distributedLockDO the distributed lock info
+     * @return the boolean
+     */
+    @Override
+    public boolean releaseLock(DistributedLockDO distributedLockDO) {
+        String lockKey = distributedLockDO.getLockKey();
+        String lockValue = distributedLockDO.getLockValue();
+        try (Jedis jedis = JedisPooledFactory.getJedisInstance()) {
+            jedis.watch(lockKey);
+            //Check the value to prevent release the other's lock
+            if (lockValue.equals(jedis.get(lockKey))) {
+                Transaction multi = jedis.multi();
+                multi.del(lockKey);
+                multi.exec();
+                return true;
+            }
+            //The lock hold by others,If other one get the lock,we release lock success too as for current lockKey
+            jedis.unwatch();
+            return true;
+        } catch (Exception ex) {
+            LOGGER.error("The {} release the {} distributed lock failed.", lockValue, lockKey, ex);
+            return false;
+        }
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/lock/RedisLockManager.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/lock/RedisLockManager.java
new file mode 100644
index 0000000..067fd50
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/lock/RedisLockManager.java
@@ -0,0 +1,66 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.storage.redis.lock;
+
+import io.seata.common.executor.Initialize;
+import io.seata.common.loader.LoadLevel;
+import io.seata.core.exception.TransactionException;
+import io.seata.core.lock.Locker;
+import io.seata.server.lock.AbstractLockManager;
+import io.seata.server.session.BranchSession;
+import io.seata.server.session.GlobalSession;
+
+/**
+ * @author funkye
+ */
+@LoadLevel(name = "redis")
+public class RedisLockManager extends AbstractLockManager implements Initialize {
+
+    /**
+     * The locker.
+     */
+    private Locker locker;
+
+    @Override
+    public void init() {
+        locker = new RedisLocker();
+    }
+
+    @Override
+    public Locker getLocker(BranchSession branchSession) {
+        return locker;
+    }
+
+    @Override
+    public boolean releaseLock(BranchSession branchSession) throws TransactionException {
+        try {
+            return getLocker().releaseLock(branchSession.getXid(), branchSession.getBranchId());
+        } catch (Exception t) {
+            LOGGER.error("unLock error, xid {}, branchId:{}", branchSession.getXid(), branchSession.getBranchId(), t);
+            return false;
+        }
+    }
+
+    @Override
+    public boolean releaseGlobalSessionLock(GlobalSession globalSession) throws TransactionException {
+        try {
+            return getLocker().releaseLock(globalSession.getXid());
+        } catch (Exception t) {
+            LOGGER.error("unLock globalSession error, xid:{}", globalSession.getXid(), t);
+            return false;
+        }
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/lock/RedisLocker.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/lock/RedisLocker.java
new file mode 100644
index 0000000..361b162
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/lock/RedisLocker.java
@@ -0,0 +1,385 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.storage.redis.lock;
+
+import com.google.common.collect.Lists;
+import io.seata.common.exception.StoreException;
+import io.seata.common.io.FileLoader;
+import io.seata.common.util.CollectionUtils;
+import io.seata.common.util.LambdaUtils;
+import io.seata.common.util.StringUtils;
+import io.seata.core.exception.BranchTransactionException;
+import io.seata.core.lock.AbstractLocker;
+import io.seata.core.lock.RowLock;
+import io.seata.core.model.LockStatus;
+import io.seata.core.store.LockDO;
+import io.seata.server.storage.redis.JedisPooledFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import redis.clients.jedis.Jedis;
+import redis.clients.jedis.Pipeline;
+
+import java.io.*;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static io.seata.common.Constants.ROW_LOCK_KEY_SPLIT_CHAR;
+import static io.seata.core.constants.RedisKeyConstants.DEFAULT_REDIS_SEATA_GLOBAL_LOCK_PREFIX;
+import static io.seata.core.constants.RedisKeyConstants.DEFAULT_REDIS_SEATA_ROW_LOCK_PREFIX;
+import static io.seata.core.exception.TransactionExceptionCode.LockKeyConflictFailFast;
+/**
+ * The redis lock store operation
+ *
+ * @author funkye
+ * @author wangzhongxiang
+ */
+public class RedisLocker extends AbstractLocker {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(RedisLocker.class);
+
+    private static final Integer SUCCEED = 1;
+
+    private static final Integer FAILED = 0;
+
+    private static final String XID = "xid";
+
+    private static final String TRANSACTION_ID = "transactionId";
+
+    private static final String BRANCH_ID = "branchId";
+
+    private static final String RESOURCE_ID = "resourceId";
+
+    private static final String TABLE_NAME = "tableName";
+
+    private static final String PK = "pk";
+
+    private static final String STATUS = "status";
+
+    private static final String ROW_KEY = "rowKey";
+
+    private static final String REDIS_LUA_FILE_NAME = "lua/redislocker/redislock.lua";
+
+    private static String ACQUIRE_LOCK_SHA;
+
+    private static final String WHITE_SPACE = " ";
+
+    private static final String ANNOTATION_LUA = "--";
+
+    /**
+     * Instantiates a new Redis locker.
+     */
+    public RedisLocker() {
+        if (ACQUIRE_LOCK_SHA == null) {
+            File luaFile = FileLoader.load(REDIS_LUA_FILE_NAME);
+            if (luaFile != null) {
+                StringBuilder acquireLockLuaByFile = new StringBuilder();
+                try (FileInputStream fis = new FileInputStream(luaFile)) {
+                    BufferedReader br = new BufferedReader(new InputStreamReader(fis));
+                    String line;
+                    while ((line = br.readLine()) != null) {
+                        if (line.trim().startsWith(ANNOTATION_LUA)) {
+                            continue;
+                        }
+                        acquireLockLuaByFile.append(line);
+                        acquireLockLuaByFile.append(WHITE_SPACE);
+                    }
+                // if it fails to read the file, pipeline mode is used
+                } catch (IOException e) {
+                    LOGGER.info("redis locker use pipeline mode");
+                    return;
+                }
+                try (Jedis jedis = JedisPooledFactory.getJedisInstance()) {
+                    ACQUIRE_LOCK_SHA = jedis.scriptLoad(acquireLockLuaByFile.toString());
+                    LOGGER.info("redis locker use lua mode");
+                }
+            } else {
+                LOGGER.info("redis locker use pipeline mode");
+            }
+        }
+    }
+
+    @Override
+    public boolean acquireLock(List<RowLock> rowLocks) {
+        return acquireLock(rowLocks, true, false);
+    }
+
+    @Override
+    public boolean acquireLock(List<RowLock> rowLocks, boolean autoCommit, boolean skipCheckLock) {
+        if (CollectionUtils.isEmpty(rowLocks)) {
+            return true;
+        }
+        try (Jedis jedis = JedisPooledFactory.getJedisInstance()) {
+            if (ACQUIRE_LOCK_SHA != null && autoCommit) {
+                return acquireLockByLua(jedis, rowLocks);
+            } else {
+                return acquireLockByPipeline(jedis, rowLocks, autoCommit, skipCheckLock);
+            }
+        }
+    }
+
+    private boolean acquireLockByPipeline(Jedis jedis, List<RowLock> rowLocks, boolean autoCommit, boolean skipCheckLock) {
+        String needLockXid = rowLocks.get(0).getXid();
+        Long branchId = rowLocks.get(0).getBranchId();
+        List<LockDO> needLockDOS = convertToLockDO(rowLocks);
+        if (needLockDOS.size() > 1) {
+            needLockDOS =
+                needLockDOS.stream().filter(LambdaUtils.distinctByKey(LockDO::getRowKey)).collect(Collectors.toList());
+        }
+        List<String> needLockKeys = new ArrayList<>();
+        needLockDOS.forEach(lockDO -> needLockKeys.add(buildLockKey(lockDO.getRowKey())));
+        Map<String, LockDO> needAddLock = new HashMap<>(needLockKeys.size(), 1);
+
+        if (!skipCheckLock) {
+            Pipeline pipeline1 = jedis.pipelined();
+            needLockKeys.stream().forEachOrdered(needLockKey -> {
+                pipeline1.hget(needLockKey, XID);
+                if (!autoCommit) {
+                    pipeline1.hget(needLockKey, STATUS);
+                }
+            });
+            List<List<String>> existedLockInfos =
+                    Lists.partition((List<String>)(List)pipeline1.syncAndReturnAll(), autoCommit ? 1 : 2);
+
+            // When the local transaction and the global transaction are enabled,
+            // the branch registration fails to acquire the global lock,
+            // the lock holder is in the second-stage rollback,
+            // and the branch registration fails to be retried quickly,
+            // because the retry with the local transaction does not release the database lock ,
+            // resulting in a two-phase rollback wait.
+            // Therefore, if a global lock is found in the Rollbacking state,
+            // the fail-fast code is returned directly.
+            if (!autoCommit) {
+                boolean hasRollBackingLock = existedLockInfos.parallelStream().anyMatch(
+                    result -> StringUtils.equals(result.get(1), String.valueOf(LockStatus.Rollbacking.getCode())));
+                if (hasRollBackingLock) {
+                    throw new StoreException(new BranchTransactionException(LockKeyConflictFailFast));
+                }
+            }
+
+            // The logic is executed here, there must be a lock without Rollbacking status when autoCommit equals false
+            for (int i = 0; i < needLockKeys.size(); i++) {
+                List<String> results = existedLockInfos.get(i);
+                String existedLockXid = CollectionUtils.isEmpty(results) ? null : existedLockInfos.get(i).get(0);
+                if (StringUtils.isEmpty(existedLockXid)) {
+                    // If empty,we need to lock this row
+                    needAddLock.put(needLockKeys.get(i), needLockDOS.get(i));
+                } else {
+                    if (!StringUtils.equals(existedLockXid, needLockXid)) {
+                        // If not equals,means the rowkey is holding by another global transaction
+                        logGlobalLockConflictInfo(needLockXid, needLockKeys.get(i), existedLockXid);
+                        return false;
+                    }
+                }
+            }
+            if (needAddLock.isEmpty()) {
+                return true;
+            }
+        }
+
+        Pipeline pipeline = jedis.pipelined();
+        List<String> readyKeys = new ArrayList<>(needAddLock.keySet());
+        needAddLock.forEach((key, value) -> {
+            pipeline.hsetnx(key, XID, value.getXid());
+            pipeline.hsetnx(key, TRANSACTION_ID, value.getTransactionId().toString());
+            pipeline.hsetnx(key, BRANCH_ID, value.getBranchId().toString());
+            pipeline.hset(key, ROW_KEY, value.getRowKey());
+            pipeline.hset(key, RESOURCE_ID, value.getResourceId());
+            pipeline.hset(key, TABLE_NAME, value.getTableName());
+            pipeline.hset(key, PK, value.getPk());
+        });
+        List<Integer> results = (List<Integer>) (List) pipeline.syncAndReturnAll();
+        List<List<Integer>> partitions = Lists.partition(results, 7);
+
+        ArrayList<String> success = new ArrayList<>(partitions.size());
+        Integer status = SUCCEED;
+        for (int i = 0; i < partitions.size(); i++) {
+            if (Objects.equals(partitions.get(i).get(0), FAILED)) {
+                status = FAILED;
+            } else {
+                success.add(readyKeys.get(i));
+            }
+        }
+
+        // If someone has failed,all the lockkey which has been added need to be delete.
+        if (FAILED.equals(status)) {
+            if (success.size() > 0) {
+                jedis.del(success.toArray(new String[0]));
+            }
+            return false;
+        }
+        String xidLockKey = buildXidLockKey(needLockXid);
+        StringJoiner lockKeysString = new StringJoiner(ROW_LOCK_KEY_SPLIT_CHAR);
+        needLockKeys.forEach(lockKeysString::add);
+        jedis.hset(xidLockKey, branchId.toString(), lockKeysString.toString());
+        return true;
+    }
+
+    private boolean acquireLockByLua(Jedis jedis, List<RowLock> rowLocks) {
+        String needLockXid = rowLocks.get(0).getXid();
+        Long branchId = rowLocks.get(0).getBranchId();
+        List<LockDO> needLockDOs = rowLocks.stream()
+                .map(this::convertToLockDO)
+                .filter(LambdaUtils.distinctByKey(LockDO::getRowKey))
+                .collect(Collectors.toList());
+        ArrayList<String> keys = new ArrayList<>();
+        ArrayList<String> args = new ArrayList<>();
+        int size = needLockDOs.size();
+        args.add(String.valueOf(size));
+        // args index 2 placeholder
+        args.add(null);
+        args.add(needLockXid);
+        for (LockDO lockDO : needLockDOs) {
+            keys.add(buildLockKey(lockDO.getRowKey()));
+            args.add(lockDO.getTransactionId().toString());
+            args.add(lockDO.getBranchId().toString());
+            args.add(lockDO.getResourceId());
+            args.add(lockDO.getTableName());
+            args.add(lockDO.getRowKey());
+            args.add(lockDO.getPk());
+        }
+        String xidLockKey = buildXidLockKey(needLockXid);
+        StringJoiner lockKeysString = new StringJoiner(ROW_LOCK_KEY_SPLIT_CHAR);
+        needLockDOs.stream().map(lockDO -> buildLockKey(lockDO.getRowKey())).forEach(lockKeysString::add);
+        keys.add(xidLockKey);
+        keys.add(branchId.toString());
+        args.add(lockKeysString.toString());
+        // reset args index 2
+        args.set(1, String.valueOf(args.size()));
+        String xIdOwnLock = (String) jedis.evalsha(ACQUIRE_LOCK_SHA, keys, args);
+        if (xIdOwnLock.equals(needLockXid)) {
+            return true;
+        } else {
+            logGlobalLockConflictInfo(needLockXid, keys.get(0), xIdOwnLock);
+            return false;
+        }
+    }
+
+    private void logGlobalLockConflictInfo(String needLockXid, String lockKey, String xIdOwnLock) {
+        LOGGER.info("tx:[{}] acquire Global lock failed. Global lock on [{}] is holding by xid {}", needLockXid, lockKey, xIdOwnLock);
+    }
+
+    @Override
+    public boolean releaseLock(List<RowLock> rowLocks) {
+        if (CollectionUtils.isEmpty(rowLocks)) {
+            return true;
+        }
+        String currentXid = rowLocks.get(0).getXid();
+        Long branchId = rowLocks.get(0).getBranchId();
+        List<LockDO> needReleaseLocks = convertToLockDO(rowLocks);
+        String[] needReleaseKeys = new String[needReleaseLocks.size()];
+        for (int i = 0; i < needReleaseLocks.size(); i++) {
+            needReleaseKeys[i] = buildLockKey(needReleaseLocks.get(i).getRowKey());
+        }
+
+        try (Jedis jedis = JedisPooledFactory.getJedisInstance(); Pipeline pipelined = jedis.pipelined()) {
+            pipelined.del(needReleaseKeys);
+            pipelined.hdel(buildXidLockKey(currentXid), branchId.toString());
+            pipelined.sync();
+            return true;
+        }
+    }
+
+    @Override
+    public boolean releaseLock(String xid) {
+        return doReleaseLock(xid, null);
+    }
+
+    @Override
+    public boolean releaseLock(String xid, Long branchId) {
+        if (branchId == null) {
+            return true;
+        }
+        return doReleaseLock(xid, branchId);
+    }
+
+    @Override
+    public boolean isLockable(List<RowLock> rowLocks) {
+        if (CollectionUtils.isEmpty(rowLocks)) {
+            return true;
+        }
+        try (Jedis jedis = JedisPooledFactory.getJedisInstance()) {
+            List<LockDO> locks = convertToLockDO(rowLocks);
+            Set<String> lockKeys = new HashSet<>();
+            for (LockDO rowlock : locks) {
+                lockKeys.add(buildLockKey(rowlock.getRowKey()));
+            }
+
+            String xid = rowLocks.get(0).getXid();
+            try (Pipeline pipeline = jedis.pipelined()) {
+                lockKeys.forEach(key -> pipeline.hget(key, XID));
+                List<String> existedXids = (List<String>)(List)pipeline.syncAndReturnAll();
+                return existedXids.stream().allMatch(existedXid -> existedXid == null || xid.equals(existedXid));
+            }
+        }
+    }
+
+    @Override
+    public void updateLockStatus(String xid, LockStatus lockStatus) {
+        try (Jedis jedis = JedisPooledFactory.getJedisInstance()) {
+            String xidLockKey = buildXidLockKey(xid);
+            Map<String, String> branchAndLockKeys = jedis.hgetAll(xidLockKey);
+            if (CollectionUtils.isNotEmpty(branchAndLockKeys)) {
+                try (Pipeline pipeline = jedis.pipelined()) {
+                    branchAndLockKeys.values()
+                        .forEach(k -> pipeline.hset(k, STATUS, String.valueOf(lockStatus.getCode())));
+                    pipeline.sync();
+                }
+            }
+        }
+    }
+
+    private boolean doReleaseLock(String xid, Long branchId) {
+        try (Jedis jedis = JedisPooledFactory.getJedisInstance()) {
+            String xidLockKey = buildXidLockKey(xid);
+            final List<String> rowKeys = new ArrayList<>();
+            if (null == branchId) {
+                Map<String, String> rowKeyMap = jedis.hgetAll(xidLockKey);
+                rowKeyMap.forEach((branch, rowKey) -> rowKeys.add(rowKey));
+            } else {
+                rowKeys.add(jedis.hget(xidLockKey, branchId.toString()));
+            }
+            if (CollectionUtils.isNotEmpty(rowKeys)) {
+                Pipeline pipelined = jedis.pipelined();
+                if (null == branchId) {
+                    pipelined.del(xidLockKey);
+                } else {
+                    pipelined.hdel(xidLockKey, branchId.toString());
+                }
+                rowKeys.forEach(rowKeyStr -> {
+                    if (StringUtils.isNotEmpty(rowKeyStr)) {
+                        if (rowKeyStr.contains(ROW_LOCK_KEY_SPLIT_CHAR)) {
+                            String[] keys = rowKeyStr.split(ROW_LOCK_KEY_SPLIT_CHAR);
+                            pipelined.del(keys);
+                        } else {
+                            pipelined.del(rowKeyStr);
+                        }
+                    }
+                });
+                pipelined.sync();
+            }
+            return true;
+        }
+    }
+
+    private String buildXidLockKey(String xid) {
+        return DEFAULT_REDIS_SEATA_GLOBAL_LOCK_PREFIX + xid;
+    }
+
+    private String buildLockKey(String rowKey) {
+        return DEFAULT_REDIS_SEATA_ROW_LOCK_PREFIX + rowKey;
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/session/RedisSessionManager.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/session/RedisSessionManager.java
new file mode 100644
index 0000000..5012020
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/session/RedisSessionManager.java
@@ -0,0 +1,189 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.storage.redis.session;
+
+import io.seata.common.exception.StoreException;
+import io.seata.common.executor.Initialize;
+import io.seata.common.loader.LoadLevel;
+import io.seata.common.loader.Scope;
+import io.seata.common.util.StringUtils;
+import io.seata.core.exception.TransactionException;
+import io.seata.core.model.BranchStatus;
+import io.seata.core.model.GlobalStatus;
+import io.seata.server.session.*;
+import io.seata.server.storage.redis.store.RedisTransactionStoreManager;
+import io.seata.server.store.TransactionStoreManager.LogOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @author funkye
+ */
+@LoadLevel(name = "redis", scope = Scope.PROTOTYPE)
+public class RedisSessionManager extends AbstractSessionManager
+    implements Initialize {
+    /**
+     * The constant LOGGER.
+     */
+    protected static final Logger LOGGER = LoggerFactory.getLogger(RedisSessionManager.class);
+
+    /**
+     * The Task name.
+     */
+    protected String taskName;
+
+    /**
+     * Instantiates a new Data base session manager.
+     */
+    public RedisSessionManager() {
+        super();
+    }
+
+    /**
+     * Instantiates a new Data base session manager.
+     *
+     * @param name
+     *            the name
+     */
+    public RedisSessionManager(String name) {
+        super();
+        this.taskName = name;
+    }
+
+    @Override
+    public void init() {
+        transactionStoreManager = RedisTransactionStoreManager.getInstance();
+    }
+
+    @Override
+    public void addGlobalSession(GlobalSession session) throws TransactionException {
+        if (StringUtils.isBlank(taskName)) {
+            boolean ret = transactionStoreManager.writeSession(LogOperation.GLOBAL_ADD, session);
+            if (!ret) {
+                throw new StoreException("addGlobalSession failed.");
+            }
+        } else {
+            boolean ret = transactionStoreManager.writeSession(LogOperation.GLOBAL_UPDATE, session);
+            if (!ret) {
+                throw new StoreException("addGlobalSession failed.");
+            }
+        }
+    }
+
+    @Override
+    public void updateGlobalSessionStatus(GlobalSession session, GlobalStatus status) throws TransactionException {
+        if (!StringUtils.isEmpty(taskName)) {
+            return;
+        }
+        session.setStatus(status);
+        boolean ret = transactionStoreManager.writeSession(LogOperation.GLOBAL_UPDATE, session);
+        if (!ret) {
+            throw new StoreException("updateGlobalSessionStatus failed.");
+        }
+    }
+
+    /**
+     * remove globalSession 1. rootSessionManager remove normal globalSession 2. retryCommitSessionManager and
+     * retryRollbackSessionManager remove retry expired globalSession
+     *
+     * @param session
+     *            the session
+     * @throws TransactionException
+     */
+    @Override
+    public void removeGlobalSession(GlobalSession session) throws TransactionException {
+        boolean ret = transactionStoreManager.writeSession(LogOperation.GLOBAL_REMOVE, session);
+        if (!ret) {
+            throw new StoreException("removeGlobalSession failed.");
+        }
+    }
+
+    @Override
+    public void addBranchSession(GlobalSession globalSession, BranchSession session) throws TransactionException {
+        if (!StringUtils.isEmpty(taskName)) {
+            return;
+        }
+        boolean ret = transactionStoreManager.writeSession(LogOperation.BRANCH_ADD, session);
+        if (!ret) {
+            throw new StoreException("addBranchSession failed.");
+        }
+    }
+
+    @Override
+    public void updateBranchSessionStatus(BranchSession session, BranchStatus status) throws TransactionException {
+        if (!StringUtils.isEmpty(taskName)) {
+            return;
+        }
+        boolean ret = transactionStoreManager.writeSession(LogOperation.BRANCH_UPDATE, session);
+        if (!ret) {
+            throw new StoreException("updateBranchSessionStatus failed.");
+        }
+    }
+
+    @Override
+    public void removeBranchSession(GlobalSession globalSession, BranchSession session) throws TransactionException {
+        if (!StringUtils.isEmpty(taskName)) {
+            return;
+        }
+        boolean ret = transactionStoreManager.writeSession(LogOperation.BRANCH_REMOVE, session);
+        if (!ret) {
+            throw new StoreException("removeBranchSession failed.");
+        }
+    }
+
+    @Override
+    public GlobalSession findGlobalSession(String xid) {
+        return this.findGlobalSession(xid, true);
+    }
+
+    @Override
+    public GlobalSession findGlobalSession(String xid, boolean withBranchSessions) {
+        return transactionStoreManager.readSession(xid, withBranchSessions);
+    }
+
+    @Override
+    public Collection<GlobalSession> allSessions() {
+        // get by taskName
+        if (SessionHolder.ASYNC_COMMITTING_SESSION_MANAGER_NAME.equalsIgnoreCase(taskName)) {
+            return findGlobalSessions(new SessionCondition(GlobalStatus.AsyncCommitting));
+        } else if (SessionHolder.RETRY_COMMITTING_SESSION_MANAGER_NAME.equalsIgnoreCase(taskName)) {
+            return findGlobalSessions(new SessionCondition(GlobalStatus.CommitRetrying, GlobalStatus.Committing));
+        } else if (SessionHolder.RETRY_ROLLBACKING_SESSION_MANAGER_NAME.equalsIgnoreCase(taskName)) {
+            return findGlobalSessions(new SessionCondition(GlobalStatus.RollbackRetrying, GlobalStatus.Rollbacking,
+                    GlobalStatus.TimeoutRollbacking, GlobalStatus.TimeoutRollbackRetrying));
+        } else {
+            // all data
+            return findGlobalSessions(new SessionCondition(GlobalStatus.UnKnown, GlobalStatus.Begin, GlobalStatus.Committing,
+                    GlobalStatus.CommitRetrying, GlobalStatus.Rollbacking, GlobalStatus.RollbackRetrying, GlobalStatus.TimeoutRollbacking,
+                    GlobalStatus.TimeoutRollbackRetrying, GlobalStatus.AsyncCommitting));
+        }
+    }
+
+    @Override
+    public List<GlobalSession> findGlobalSessions(SessionCondition condition) {
+        // nothing need to do
+        return transactionStoreManager.readSession(condition);
+    }
+
+    @Override
+    public <T> T lockAndExecute(GlobalSession globalSession, GlobalSession.LockCallable<T> lockCallable)
+        throws TransactionException {
+        return lockCallable.call();
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/store/RedisTransactionStoreManager.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/store/RedisTransactionStoreManager.java
new file mode 100644
index 0000000..573d120
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/store/RedisTransactionStoreManager.java
@@ -0,0 +1,835 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.storage.redis.store;
+
+import com.google.common.collect.ImmutableMap;
+import io.seata.common.XID;
+import io.seata.common.exception.RedisException;
+import io.seata.common.exception.StoreException;
+import io.seata.common.util.BeanUtils;
+import io.seata.common.util.CollectionUtils;
+import io.seata.common.util.StringUtils;
+import io.seata.config.Configuration;
+import io.seata.config.ConfigurationFactory;
+import io.seata.core.model.GlobalStatus;
+import io.seata.core.store.BranchTransactionDO;
+import io.seata.core.store.GlobalTransactionDO;
+import io.seata.server.console.param.GlobalSessionParam;
+import io.seata.server.session.GlobalSession;
+import io.seata.server.session.SessionCondition;
+import io.seata.server.session.SessionStatusValidator;
+import io.seata.server.storage.SessionConverter;
+import io.seata.server.storage.redis.JedisPooledFactory;
+import io.seata.server.store.AbstractTransactionStoreManager;
+import io.seata.server.store.SessionStorable;
+import io.seata.server.store.TransactionStoreManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import redis.clients.jedis.Jedis;
+import redis.clients.jedis.Pipeline;
+import redis.clients.jedis.Transaction;
+
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import static io.seata.common.ConfigurationKeys.STORE_REDIS_QUERY_LIMIT;
+import static io.seata.common.DefaultValues.DEFAULT_QUERY_LIMIT;
+import static io.seata.core.constants.RedisKeyConstants.*;
+
+/**
+ * The redis transaction store manager
+ *
+ * @author funkye
+ * @author wangzhongxiang
+ * @author doubleDimple
+ */
+public class RedisTransactionStoreManager extends AbstractTransactionStoreManager implements TransactionStoreManager {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(RedisTransactionStoreManager.class);
+
+    /**the prefix of the branch transactions*/
+    private static final String REDIS_SEATA_BRANCHES_PREFIX = "SEATA_BRANCHES_";
+
+    /**the prefix of the branch transaction*/
+    private static final String REDIS_SEATA_BRANCH_PREFIX = "SEATA_BRANCH_";
+
+    /**the prefix of the global transaction*/
+    private static final String REDIS_SEATA_GLOBAL_PREFIX = "SEATA_GLOBAL_";
+
+    /**the prefix of the global transaction status*/
+    private static final String REDIS_SEATA_STATUS_PREFIX = "SEATA_STATUS_";
+
+    /**the key of global transaction status for begin*/
+    private static final String REDIS_SEATA_BEGIN_TRANSACTIONS_KEY = "SEATA_BEGIN_TRANSACTIONS";
+
+    private static volatile RedisTransactionStoreManager instance;
+
+    private static final String OK = "OK";
+
+    /**
+     * The constant CONFIG.
+     */
+    private static final Configuration CONFIG = ConfigurationFactory.getInstance();
+
+    /**
+     * The Log query limit.
+     */
+    private int logQueryLimit;
+
+    /**
+     * Get the instance.
+     */
+    public static RedisTransactionStoreManager getInstance() {
+        if (instance == null) {
+            synchronized (RedisTransactionStoreManager.class) {
+                if (instance == null) {
+                    instance = new RedisTransactionStoreManager();
+                }
+            }
+        }
+        return instance;
+    }
+
+    /**
+     * init map to constructor
+     */
+    public RedisTransactionStoreManager() {
+        super();
+        initGlobalMap();
+        initBranchMap();
+        logQueryLimit = CONFIG.getInt(STORE_REDIS_QUERY_LIMIT, DEFAULT_QUERY_LIMIT);
+    }
+
+    /**
+     * Map for LogOperation Global Operation
+     */
+    public static volatile ImmutableMap<LogOperation, Function<GlobalTransactionDO, Boolean>> globalMap;
+
+    /**
+     * Map for LogOperation Branch Operation
+     */
+    public static volatile ImmutableMap<LogOperation, Function<BranchTransactionDO, Boolean>> branchMap;
+
+
+    /**
+     * init globalMap
+     *
+     */
+    public void initGlobalMap() {
+        if (CollectionUtils.isEmpty(branchMap)) {
+            globalMap = ImmutableMap.<LogOperation, Function<GlobalTransactionDO, Boolean>>builder()
+                    .put(LogOperation.GLOBAL_ADD, this::insertGlobalTransactionDO)
+                    .put(LogOperation.GLOBAL_UPDATE, this::updateGlobalTransactionDO)
+                    .put(LogOperation.GLOBAL_REMOVE, this::deleteGlobalTransactionDO)
+                    .build();
+        }
+    }
+
+    /**
+     * init branchMap
+     *
+     */
+    public void initBranchMap() {
+        if (CollectionUtils.isEmpty(branchMap)) {
+            branchMap = ImmutableMap.<LogOperation, Function<BranchTransactionDO, Boolean>>builder()
+                    .put(LogOperation.BRANCH_ADD, this::insertBranchTransactionDO)
+                    .put(LogOperation.BRANCH_UPDATE, this::updateBranchTransactionDO)
+                    .put(LogOperation.BRANCH_REMOVE, this::deleteBranchTransactionDO)
+                    .build();
+        }
+    }
+
+
+    @Override
+    public boolean writeSession(LogOperation logOperation, SessionStorable session) {
+        if (globalMap.containsKey(logOperation) || branchMap.containsKey(logOperation)) {
+            return globalMap.containsKey(logOperation) ?
+                    globalMap.get(logOperation).apply(SessionConverter.convertGlobalTransactionDO(session)) :
+                    branchMap.get(logOperation).apply(SessionConverter.convertBranchTransactionDO(session));
+        } else {
+            throw new StoreException("Unknown LogOperation:" + logOperation.name());
+        }
+    }
+
+    /**
+     * Insert branch transaction
+     * @param branchTransactionDO
+     * @return the boolean
+     */
+    private boolean insertBranchTransactionDO(BranchTransactionDO branchTransactionDO) {
+        String branchKey = buildBranchKey(branchTransactionDO.getBranchId());
+        String branchListKey = buildBranchListKeyByXid(branchTransactionDO.getXid());
+        try (Jedis jedis = JedisPooledFactory.getJedisInstance(); Pipeline pipelined = jedis.pipelined()) {
+            Date now = new Date();
+            branchTransactionDO.setGmtCreate(now);
+            branchTransactionDO.setGmtModified(now);
+            pipelined.hmset(branchKey, BeanUtils.objectToMap(branchTransactionDO));
+            pipelined.rpush(branchListKey, branchKey);
+            pipelined.sync();
+            return true;
+        } catch (Exception ex) {
+            throw new RedisException(ex);
+        }
+    }
+
+    /**
+     * Delete the branch transaction
+     * @param branchTransactionDO
+     * @return
+     */
+    private boolean deleteBranchTransactionDO(BranchTransactionDO branchTransactionDO) {
+        String branchKey = buildBranchKey(branchTransactionDO.getBranchId());
+        try (Jedis jedis = JedisPooledFactory.getJedisInstance()) {
+            String xid = jedis.hget(branchKey, REDIS_KEY_BRANCH_XID);
+            if (StringUtils.isEmpty(xid)) {
+                return true;
+            }
+            String branchListKey = buildBranchListKeyByXid(branchTransactionDO.getXid());
+            try (Pipeline pipelined = jedis.pipelined()) {
+                pipelined.lrem(branchListKey, 0, branchKey);
+                pipelined.del(branchKey);
+                pipelined.sync();
+            }
+            return true;
+        } catch (Exception ex) {
+            throw new RedisException(ex);
+        }
+    }
+
+    /**
+     * Update the branch transaction
+     * @param branchTransactionDO
+     * @return
+     */
+    private boolean updateBranchTransactionDO(BranchTransactionDO branchTransactionDO) {
+        String branchKey = buildBranchKey(branchTransactionDO.getBranchId());
+        try (Jedis jedis = JedisPooledFactory.getJedisInstance()) {
+            String previousBranchStatus = jedis.hget(branchKey, REDIS_KEY_BRANCH_STATUS);
+            if (StringUtils.isEmpty(previousBranchStatus)) {
+                throw new StoreException("Branch transaction is not exist, update branch transaction failed.");
+            }
+            Map<String, String> map = new HashMap<>(3, 1);
+            map.put(REDIS_KEY_BRANCH_STATUS, String.valueOf(branchTransactionDO.getStatus()));
+            map.put(REDIS_KEY_BRANCH_GMT_MODIFIED, String.valueOf((new Date()).getTime()));
+            if (StringUtils.isNotBlank(branchTransactionDO.getApplicationData())) {
+                map.put(REDIS_KEY_BRANCH_APPLICATION_DATA, String.valueOf(branchTransactionDO.getApplicationData()));
+            }
+            jedis.hmset(branchKey, map);
+            return true;
+        } catch (Exception ex) {
+            throw new RedisException(ex);
+        }
+    }
+
+    /**
+     * Insert the global transaction.
+     * @param globalTransactionDO
+     * @return
+     */
+    private boolean insertGlobalTransactionDO(GlobalTransactionDO globalTransactionDO) {
+        String globalKey = buildGlobalKeyByTransactionId(globalTransactionDO.getTransactionId());
+        try (Jedis jedis = JedisPooledFactory.getJedisInstance(); Pipeline pipelined = jedis.pipelined()) {
+            Date now = new Date();
+            globalTransactionDO.setGmtCreate(now);
+            globalTransactionDO.setGmtModified(now);
+            pipelined.hmset(globalKey, BeanUtils.objectToMap(globalTransactionDO));
+            String xid = globalTransactionDO.getXid();
+            pipelined.rpush(buildGlobalStatus(globalTransactionDO.getStatus()), xid);
+            pipelined.zadd(REDIS_SEATA_BEGIN_TRANSACTIONS_KEY,
+                globalTransactionDO.getBeginTime() + globalTransactionDO.getTimeout(), globalKey);
+            pipelined.sync();
+            return true;
+        } catch (Exception ex) {
+            throw new RedisException(ex);
+        }
+    }
+
+    /**
+     * Delete the global transaction.
+     * It will operate two parts:
+     *  1.delete the global session map
+     *  2.remove the xid from the global status list
+     * If the operate failed,the succeed operates will rollback
+     * @param globalTransactionDO
+     * @return
+     */
+    private boolean deleteGlobalTransactionDO(GlobalTransactionDO globalTransactionDO) {
+        String globalKey = buildGlobalKeyByTransactionId(globalTransactionDO.getTransactionId());
+        try (Jedis jedis = JedisPooledFactory.getJedisInstance()) {
+            String xid = jedis.hget(globalKey, REDIS_KEY_GLOBAL_XID);
+            if (StringUtils.isEmpty(xid)) {
+                LOGGER.warn("Global transaction is not exist,xid = {}.Maybe has been deleted by another tc server",
+                    globalTransactionDO.getXid());
+                return true;
+            }
+            try (Pipeline pipelined = jedis.pipelined()) {
+                pipelined.lrem(buildGlobalStatus(globalTransactionDO.getStatus()), 0, globalTransactionDO.getXid());
+                pipelined.del(globalKey);
+                if (GlobalStatus.Begin.getCode() == globalTransactionDO.getStatus()
+                    || GlobalStatus.UnKnown.getCode() == globalTransactionDO.getStatus()) {
+                    pipelined.zrem(REDIS_SEATA_BEGIN_TRANSACTIONS_KEY, globalKey);
+                }
+                pipelined.sync();
+            }
+            return true;
+        } catch (Exception ex) {
+            throw new RedisException(ex);
+        }
+    }
+
+    /**
+     * Update the global transaction.
+     * It will update two parts:
+     *  1.the global session map
+     *  2.the global status list
+     * If the update failed,the succeed operates will rollback
+     * @param globalTransactionDO
+     * @return
+     */
+    private boolean updateGlobalTransactionDO(GlobalTransactionDO globalTransactionDO) {
+        String xid = globalTransactionDO.getXid();
+        String globalKey = buildGlobalKeyByTransactionId(globalTransactionDO.getTransactionId());
+        try (Jedis jedis = JedisPooledFactory.getJedisInstance()) {
+            // Defensive watch to prevent other TC server operating concurrently,Fail fast
+            jedis.watch(globalKey);
+            List<String> statusAndGmtModified = jedis.hmget(globalKey, REDIS_KEY_GLOBAL_STATUS, REDIS_KEY_GLOBAL_GMT_MODIFIED);
+            String previousStatus = statusAndGmtModified.get(0);
+            if (StringUtils.isEmpty(previousStatus)) {
+                jedis.unwatch();
+                throw new StoreException("Global transaction is not exist, update global transaction failed.");
+            }
+            if (previousStatus.equals(String.valueOf(globalTransactionDO.getStatus()))) {
+                jedis.unwatch();
+                return true;
+            }
+            GlobalStatus before = GlobalStatus.get(Integer.parseInt(previousStatus));
+            GlobalStatus after = GlobalStatus.get(globalTransactionDO.getStatus());
+            if (!SessionStatusValidator.validateUpdateStatus(before, after)) {
+                throw new StoreException("Illegal changing of global status, update global transaction failed."
+                    + " beforeStatus[" + before.name() + "] cannot be changed to afterStatus[" + after.name() + "]");
+            }
+
+            String previousGmtModified = statusAndGmtModified.get(1);
+            Transaction multi = jedis.multi();
+            Map<String,String> map = new HashMap<>(2);
+            map.put(REDIS_KEY_GLOBAL_STATUS,String.valueOf(globalTransactionDO.getStatus()));
+            map.put(REDIS_KEY_GLOBAL_GMT_MODIFIED,String.valueOf((new Date()).getTime()));
+            multi.hmset(globalKey, map);
+            multi.lrem(buildGlobalStatus(Integer.valueOf(previousStatus)), 0, xid);
+            multi.rpush(buildGlobalStatus(globalTransactionDO.getStatus()), xid);
+            multi.zrem(REDIS_SEATA_BEGIN_TRANSACTIONS_KEY, globalKey);
+            List<Object> exec = multi.exec();
+            if (CollectionUtils.isEmpty(exec)) {
+                //The data has changed by another tc, so we still think the modification is successful.
+                LOGGER.warn("The global transaction xid = {}, maybe changed by another TC. It does not affect the results",globalTransactionDO.getXid());
+                return true;
+            }
+            String hmset = exec.get(0).toString();
+            long lrem  = (long)exec.get(1);
+            long rpush = (long)exec.get(2);
+            if (OK.equalsIgnoreCase(hmset) && lrem > 0 && rpush > 0) {
+                return true;
+            } else {
+                // If someone failed, the succeed operations need rollback
+                if (OK.equalsIgnoreCase(hmset)) {
+                    // Defensive watch to prevent other TC server operating concurrently,give up this operate
+                    jedis.watch(globalKey);
+                    String xid2 = jedis.hget(globalKey, REDIS_KEY_GLOBAL_XID);
+                    if (StringUtils.isNotEmpty(xid2)) {
+                        Map<String,String> mapPrevious = new HashMap<>(2,1);
+                        mapPrevious.put(REDIS_KEY_GLOBAL_STATUS,previousStatus);
+                        mapPrevious.put(REDIS_KEY_GLOBAL_GMT_MODIFIED,previousGmtModified);
+                        Transaction multi2 = jedis.multi();
+                        multi2.hmset(globalKey,mapPrevious);
+                        multi2.exec();
+                    }
+                }
+                if (lrem > 0) {
+                    jedis.rpush(buildGlobalStatus(Integer.valueOf(previousStatus)), xid);
+                }
+                if (rpush > 0) {
+                    jedis.lrem(buildGlobalStatus(globalTransactionDO.getStatus()), 0, xid);
+                }
+                return false;
+            }
+        } catch (Exception ex) {
+            throw new RedisException(ex);
+        }
+    }
+
+    /**
+     * Read session global session.
+     *
+     * @param xid the xid
+     * @param withBranchSessions  the withBranchSessions
+     * @return the global session
+     */
+    @Override
+    public GlobalSession readSession(String xid, boolean withBranchSessions) {
+        String transactionId = String.valueOf(XID.getTransactionId(xid));
+        String globalKey = buildGlobalKeyByTransactionId(transactionId);
+        try (Jedis jedis = JedisPooledFactory.getJedisInstance()) {
+            Map<String, String> map  = jedis.hgetAll(globalKey);
+            if (CollectionUtils.isEmpty(map)) {
+                return null;
+            }
+            GlobalTransactionDO globalTransactionDO = (GlobalTransactionDO)BeanUtils.mapToObject(map, GlobalTransactionDO.class);
+            List<BranchTransactionDO> branchTransactionDOs = null;
+            if (withBranchSessions) {
+                branchTransactionDOs = this.readBranchSessionByXid(jedis, xid);
+            }
+            GlobalSession session = getGlobalSession(globalTransactionDO, branchTransactionDOs, withBranchSessions);
+            return session;
+        }
+    }
+
+    /**
+     * Read session global session.
+     *
+     * @param xid
+     *            the xid
+     * @return the global session
+     */
+    @Override
+    public GlobalSession readSession(String xid) {
+        return this.readSession(xid, true);
+    }
+
+    /**
+     * Read globalSession list by global status
+     *
+     * @param statuses the statuses
+     * @return the list
+     */
+    @Override
+    public List<GlobalSession> readSession(GlobalStatus[] statuses, boolean withBranchSessions) {
+        List<GlobalSession> globalSessions = Collections.synchronizedList(new ArrayList<>());
+        List<String> statusKeys = convertStatusKeys(statuses);
+        Map<String, Integer> targetMap = calculateStatuskeysHasData(statusKeys);
+        if (targetMap.size() == 0 || logQueryLimit <= 0) {
+            return globalSessions;
+        }
+        int perStatusLimit = resetLogQueryLimit(targetMap);
+        final long countGlobalSessions = targetMap.values().stream().collect(Collectors.summarizingInt(Integer::intValue)).getSum();
+        // queryCount
+        final long queryCount = Math.min(logQueryLimit, countGlobalSessions);
+        List<List<String>> list = new ArrayList<>();
+        dogetXidsForTargetMapRecursive(targetMap, 0L, perStatusLimit - 1, queryCount, list);
+        if (CollectionUtils.isNotEmpty(list)) {
+            List<String> xids = list.stream().flatMap(Collection::stream).collect(Collectors.toList());
+            xids.parallelStream().forEach(xid -> {
+                GlobalSession globalSession = this.readSession(xid, withBranchSessions);
+                if (globalSession != null) {
+                    globalSessions.add(globalSession);
+                }
+            });
+        }
+        return globalSessions;
+    }
+
+    @Override
+    public List<GlobalSession> readSortByTimeoutBeginSessions(boolean withBranchSessions) {
+        List<GlobalSession> list = Collections.emptyList();
+        List<String> statusKeys = convertStatusKeys(GlobalStatus.Begin);
+        Map<String, Integer> targetMap = calculateStatuskeysHasData(statusKeys);
+        if (targetMap.size() == 0 || logQueryLimit <= 0) {
+            return list;
+        }
+        final long countGlobalSessions = targetMap.values().stream().collect(Collectors.summarizingInt(Integer::intValue)).getSum();
+        // queryCount
+        final long queryCount = Math.min(logQueryLimit, countGlobalSessions);
+        try (Jedis jedis = JedisPooledFactory.getJedisInstance()) {
+            Set<String> values =
+                jedis.zrangeByScore(REDIS_SEATA_BEGIN_TRANSACTIONS_KEY, 0, System.currentTimeMillis(), 0,
+                        (int) queryCount);
+            List<Map<String, String>> rep;
+            try (Pipeline pipeline = jedis.pipelined()) {
+                for (String value : values) {
+                    pipeline.hgetAll(value);
+                }
+                rep = (List<Map<String, String>>) (List) pipeline.syncAndReturnAll();
+            }
+            list = rep.stream().map(map -> {
+                GlobalTransactionDO globalTransactionDO = (GlobalTransactionDO) BeanUtils.mapToObject(map,
+                        GlobalTransactionDO.class);
+                if (globalTransactionDO != null) {
+                    String xid = globalTransactionDO.getXid();
+                    List<BranchTransactionDO> branchTransactionDOs = new ArrayList<>();
+                    if (withBranchSessions) {
+                        branchTransactionDOs = this.readBranchSessionByXid(jedis, xid);
+                    }
+                    return getGlobalSession(globalTransactionDO, branchTransactionDOs, withBranchSessions);
+                }
+                return null;
+            }).filter(Objects::nonNull).collect(Collectors.toList());
+        }
+        return list;
+    }
+
+    /**
+     * get everyone keys limit
+     *
+     * @param targetMap
+     * @return
+     */
+    private int resetLogQueryLimit(Map<String, Integer> targetMap) {
+        int resetLimitQuery = logQueryLimit;
+        if (targetMap.size() > 1) {
+            int size = targetMap.size();
+            resetLimitQuery = (logQueryLimit / size) == 0 ? 1 : (logQueryLimit / size);
+        }
+        return resetLimitQuery;
+    }
+
+    /**
+     * read the global session list by different condition
+     * @param sessionCondition the session condition
+     * @return the global sessions
+     */
+    @Override
+    public List<GlobalSession> readSession(SessionCondition sessionCondition) {
+        List<GlobalSession> globalSessions = new ArrayList<>();
+        if (StringUtils.isNotEmpty(sessionCondition.getXid())) {
+            GlobalSession globalSession = this.readSession(sessionCondition.getXid(), !sessionCondition.isLazyLoadBranch());
+            if (globalSession != null) {
+                globalSessions.add(globalSession);
+            }
+            return globalSessions;
+        } else if (sessionCondition.getTransactionId() != null) {
+            GlobalSession globalSession = this
+                .readSessionByTransactionId(sessionCondition.getTransactionId().toString(), !sessionCondition.isLazyLoadBranch());
+            if (globalSession != null) {
+                globalSessions.add(globalSession);
+            }
+            return globalSessions;
+        } else if (CollectionUtils.isNotEmpty(sessionCondition.getStatuses())) {
+            if (sessionCondition.getStatuses().length == 1 && sessionCondition.getStatuses()[0] == GlobalStatus.Begin) {
+                return this.readSortByTimeoutBeginSessions(!sessionCondition.isLazyLoadBranch());
+            } else {
+                return readSession(sessionCondition.getStatuses(), !sessionCondition.isLazyLoadBranch());
+            }
+        }
+        return null;
+    }
+
+    /**
+     * query GlobalSession by status with page
+     *
+     * @param param
+     * @return List<GlobalSession>
+     */
+    public List<GlobalSession> readSessionStatusByPage(GlobalSessionParam param) {
+        List<GlobalSession> globalSessions = new ArrayList<>();
+
+        int pageNum = param.getPageNum();
+        int pageSize = param.getPageSize();
+        int start = Math.max((pageNum - 1) * pageSize, 0);
+        int end = pageNum * pageSize - 1;
+
+        if (param.getStatus() != null) {
+            String statusKey = buildGlobalStatus(GlobalStatus.get(param.getStatus()).getCode());
+            try (Jedis jedis = JedisPooledFactory.getJedisInstance()) {
+                final List<String> xids = jedis.lrange(statusKey, start, end);
+                xids.forEach(xid -> {
+                    GlobalSession globalSession = this.readSession(xid, param.isWithBranch());
+                    if (globalSession != null) {
+                        globalSessions.add(globalSession);
+                    }
+                });
+            }
+        }
+        return globalSessions;
+    }
+
+    /**
+     * assemble the global session and branch session
+     * @param globalTransactionDO the global transactionDo
+     * @param branchTransactionDOs the branch transactionDos
+     * @param withBranchSessions if read branch sessions
+     * @return the global session with branch session
+     */
+    private GlobalSession getGlobalSession(GlobalTransactionDO globalTransactionDO,
+        List<BranchTransactionDO> branchTransactionDOs, boolean withBranchSessions) {
+        GlobalSession globalSession = SessionConverter.convertGlobalSession(globalTransactionDO, !withBranchSessions);
+        if (CollectionUtils.isNotEmpty(branchTransactionDOs)) {
+            for (BranchTransactionDO branchTransactionDO : branchTransactionDOs) {
+                globalSession.add(SessionConverter.convertBranchSession(branchTransactionDO));
+            }
+        }
+        return globalSession;
+    }
+
+    /**
+     * read the global session by transactionId
+     * @param transactionId the transaction id
+     * @param withBranchSessions if read branch sessions
+     * @return the global session
+     */
+    private GlobalSession readSessionByTransactionId(String transactionId, boolean withBranchSessions) {
+        String globalKey = buildGlobalKeyByTransactionId(transactionId);
+        String xid = null;
+        try (Jedis jedis = JedisPooledFactory.getJedisInstance()) {
+            Map<String, String> map = jedis.hgetAll(globalKey);
+            if (CollectionUtils.isEmpty(map)) {
+                return null;
+            }
+            GlobalTransactionDO globalTransactionDO = (GlobalTransactionDO)BeanUtils.mapToObject(map, GlobalTransactionDO.class);
+            if (globalTransactionDO != null) {
+                xid = globalTransactionDO.getXid();
+            }
+            List<BranchTransactionDO> branchTransactionDOs = new ArrayList<>();
+            if (withBranchSessions) {
+                branchTransactionDOs = this.readBranchSessionByXid(jedis, xid);
+            }
+            return getGlobalSession(globalTransactionDO, branchTransactionDOs, withBranchSessions);
+        }
+    }
+
+
+    /**
+     * Read the branch session list by xid
+     * @param jedis the jedis
+     * @param xid the xid
+     * @return the branch transactionDo list
+     */
+    private List<BranchTransactionDO> readBranchSessionByXid(Jedis jedis, String xid) {
+        List<BranchTransactionDO> branchTransactionDOs = new ArrayList<>();
+        String branchListKey = buildBranchListKeyByXid(xid);
+        List<String> branchKeys = lRange(jedis, branchListKey);
+        if (CollectionUtils.isNotEmpty(branchKeys)) {
+            try (Pipeline pipeline = jedis.pipelined()) {
+                branchKeys.stream().forEach(branchKey -> pipeline.hgetAll(branchKey));
+                List<Object> branchInfos = pipeline.syncAndReturnAll();
+                for (Object branchInfo : branchInfos) {
+                    if (branchInfo != null) {
+                        Map<String, String> branchInfoMap = (Map<String, String>)branchInfo;
+                        Optional<BranchTransactionDO> branchTransactionDO = Optional.ofNullable(
+                            (BranchTransactionDO)BeanUtils.mapToObject(branchInfoMap, BranchTransactionDO.class));
+                        branchTransactionDO.ifPresent(branchTransactionDOs::add);
+                    }
+                }
+            }
+        }
+        if (CollectionUtils.isNotEmpty(branchTransactionDOs)) {
+            Collections.sort(branchTransactionDOs);
+        }
+        return branchTransactionDOs;
+    }
+
+    private List<String> lRange(Jedis jedis, String key) {
+        List<String> keys = new ArrayList<>();
+        List<String> values;
+        int limit = 20;
+        int start = 0;
+        int stop = limit;
+        for (;;) {
+            values = jedis.lrange(key, start, stop);
+            keys.addAll(values);
+            if (CollectionUtils.isEmpty(values) || values.size() < limit) {
+                break;
+            }
+            start = keys.size();
+            stop = start + limit;
+        }
+        return keys;
+    }
+
+    public List<BranchTransactionDO> findBranchSessionByXid(String xid) {
+        try (Jedis jedis = JedisPooledFactory.getJedisInstance()) {
+            return readBranchSessionByXid(jedis, xid);
+        }
+    }
+
+    /**
+     * query globalSession by page
+     *
+     * @param pageNum
+     * @param pageSize
+     * @param withBranchSessions
+     * @return List<GlobalSession>
+     */
+    public List<GlobalSession> findGlobalSessionByPage(int pageNum, int pageSize, boolean withBranchSessions) {
+        List<GlobalSession> globalSessions = new ArrayList<>();
+        int start = Math.max((pageNum - 1) * pageSize, 0);
+        int end = pageNum * pageSize - 1;
+
+        List<String> statusKeys = convertStatusKeys(GlobalStatus.values());
+        Map<String, Integer> stringLongMap = calculateStatuskeysHasData(statusKeys);
+
+        List<List<String>> list = dogetXidsForTargetMap(stringLongMap, start, end, pageSize);
+
+        if (CollectionUtils.isNotEmpty(list)) {
+            List<String> xids = list.stream().flatMap(Collection::stream).collect(Collectors.toList());
+            xids.forEach(xid -> {
+                if (globalSessions.size() < pageSize) {
+                    GlobalSession globalSession = this.readSession(xid, withBranchSessions);
+                    if (globalSession != null) {
+                        globalSessions.add(globalSession);
+                    }
+                }
+            });
+        }
+        return globalSessions;
+    }
+
+    /**
+     * query and sort existing values
+     *
+     * @param statusKeys
+     * @return
+     */
+    private Map<String, Integer> calculateStatuskeysHasData(List<String> statusKeys) {
+        Map<String, Integer> resultMap = new LinkedHashMap<>();
+        Map<String, Integer> keysMap = new HashMap<>(statusKeys.size());
+        try (Jedis jedis = JedisPooledFactory.getJedisInstance(); Pipeline pipelined = jedis.pipelined()) {
+            statusKeys.forEach(key -> pipelined.llen(key));
+            List<Long> counts = (List) pipelined.syncAndReturnAll();
+            for (int i = 0; i < counts.size(); i++) {
+                if (counts.get(i) > 0) {
+                    keysMap.put(statusKeys.get(i), counts.get(i).intValue());
+                }
+            }
+        }
+
+        //sort
+        List<Map.Entry<String, Integer>> list = new ArrayList<>(keysMap.entrySet());
+        list.sort((o1, o2) -> o2.getValue() - o1.getValue());
+        list.forEach(e -> resultMap.put(e.getKey(), e.getValue()));
+
+        return resultMap;
+    }
+
+    /**
+     * count GlobalSession total by status
+     *
+     * @param values
+     * @return Long
+     */
+    public Long countByGlobalSessions(GlobalStatus[] values) {
+        List<String> statusKeys = new ArrayList<>();
+        Long total = 0L;
+        for (GlobalStatus status : values) {
+            statusKeys.add(buildGlobalStatus(status.getCode()));
+        }
+        try (Jedis jedis = JedisPooledFactory.getJedisInstance(); Pipeline pipelined = jedis.pipelined()) {
+            statusKeys.stream().forEach(statusKey -> pipelined.llen(statusKey));
+            List<Long> list = (List<Long>)(List)pipelined.syncAndReturnAll();
+            if (list.size() > 0) {
+                total = list.stream().mapToLong(value -> value).sum();
+            }
+            return total;
+        }
+    }
+
+    private List<String> convertStatusKeys(GlobalStatus... statuses) {
+        List<String> statusKeys = new ArrayList<>();
+        for (int i = 0; i < statuses.length; i++) {
+            statusKeys.add(buildGlobalStatus(statuses[i].getCode()));
+        }
+        return statusKeys;
+    }
+
+    private void dogetXidsForTargetMapRecursive(Map<String, Integer> targetMap, long start, long end,
+                                                long queryCount, List<List<String>> listList) {
+
+        long total = listList.stream().mapToLong(List::size).sum();
+
+        if (total >= queryCount) {
+            return;
+        }
+        // when start greater than offset(totalCount)
+        if (start >= queryCount) {
+            return;
+        }
+
+        if (targetMap.size() == 0) {
+            return;
+        }
+
+        try (Jedis jedis = JedisPooledFactory.getJedisInstance()) {
+            Iterator<Map.Entry<String, Integer>> iterator = targetMap.entrySet().iterator();
+            while (iterator.hasNext()) {
+                String key = iterator.next().getKey();
+                final long sum = listList.stream().mapToLong(List::size).sum();
+                final long diffCount = queryCount - sum;
+                if (diffCount <= 0) {
+                    return;
+                }
+                List<String> list;
+                if (end - start >= diffCount) {
+                    long endNew = start + diffCount - 1;
+                    list = jedis.lrange(key, start, endNew);
+                } else {
+                    list = jedis.lrange(key, start, end);
+                }
+
+                if (list.size() > 0) {
+                    listList.add(list);
+                } else {
+                    iterator.remove();
+                }
+            }
+        }
+        long startNew = end + 1;
+        long endNew = startNew + end - start;
+        dogetXidsForTargetMapRecursive(targetMap, startNew, endNew, queryCount, listList);
+    }
+
+    private List<List<String>> dogetXidsForTargetMap(Map<String, Integer> targetMap, int start, int end,
+                                                     int totalCount) {
+        List<List<String>> listList = new ArrayList<>();
+        try (Jedis jedis = JedisPooledFactory.getJedisInstance()) {
+            for (String key : targetMap.keySet()) {
+                final List<String> list = jedis.lrange(key, start, end);
+                final long sum = listList.stream().mapToLong(List::size).sum();
+                if (list.size() > 0 && sum < totalCount) {
+                    listList.add(list);
+                } else {
+                    start = 0;
+                    end = totalCount - 1;
+                }
+            }
+        }
+        return listList;
+    }
+
+    private String buildBranchListKeyByXid(String xid) {
+        return REDIS_SEATA_BRANCHES_PREFIX + xid;
+    }
+
+    private String buildGlobalKeyByTransactionId(Object transactionId) {
+        return REDIS_SEATA_GLOBAL_PREFIX + transactionId;
+    }
+
+    private String buildBranchKey(Long branchId) {
+        return REDIS_SEATA_BRANCH_PREFIX + branchId;
+    }
+
+    private String buildGlobalStatus(Integer status) {
+        return REDIS_SEATA_STATUS_PREFIX + status;
+    }
+
+    /**
+     * Sets log query limit.
+     *
+     * @param logQueryLimit the log query limit
+     */
+    public void setLogQueryLimit(int logQueryLimit) {
+        this.logQueryLimit = logQueryLimit;
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/AbstractTransactionStoreManager.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/AbstractTransactionStoreManager.java
new file mode 100644
index 0000000..3595a72
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/AbstractTransactionStoreManager.java
@@ -0,0 +1,60 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.store;
+
+import io.seata.core.model.GlobalStatus;
+import io.seata.server.session.GlobalSession;
+import io.seata.server.session.SessionCondition;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * The type Abstract transaction store manager.
+ *
+ * @author zhangsen
+ */
+public abstract class AbstractTransactionStoreManager implements TransactionStoreManager {
+
+    @Override
+    public GlobalSession readSession(String xid) {
+        return null;
+    }
+
+    @Override
+    public GlobalSession readSession(String xid, boolean withBranchSessions) {
+        return null;
+    }
+
+    @Override
+    public List<GlobalSession> readSortByTimeoutBeginSessions(boolean withBranchSessions) {
+        return Collections.emptyList();
+    }
+
+    @Override
+    public List<GlobalSession> readSession(GlobalStatus[] statuses, boolean withBranchSessions) {
+        return Collections.emptyList();
+    }
+
+    @Override
+    public List<GlobalSession> readSession(SessionCondition sessionCondition) {
+        return Collections.emptyList();
+    }
+
+    @Override
+    public void shutdown() {
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/DbcpDataSourceProvider.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/DbcpDataSourceProvider.java
new file mode 100644
index 0000000..3d6fc5c
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/DbcpDataSourceProvider.java
@@ -0,0 +1,58 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.store;
+
+import io.seata.common.loader.LoadLevel;
+import io.seata.core.store.db.AbstractDataSourceProvider;
+import org.apache.commons.dbcp2.BasicDataSource;
+
+import javax.sql.DataSource;
+import java.sql.Connection;
+
+/**
+ * The dbcp datasource provider
+ * @author zhangsen
+ * @author ggndnn
+ * @author will
+ */
+@LoadLevel(name = "dbcp")
+public class DbcpDataSourceProvider extends AbstractDataSourceProvider {
+
+    @Override
+    public DataSource generate() {
+        BasicDataSource ds = new BasicDataSource();
+        ds.setDriverClassName(getDriverClassName());
+        // DriverClassLoader works if upgrade commons-dbcp to at least 1.3.1.
+        // https://issues.apache.org/jira/browse/DBCP-333
+        ds.setDriverClassLoader(getDriverClassLoader());
+        ds.setUrl(getUrl());
+        ds.setUsername(getUser());
+
+        ds.setPassword(getPassword());
+        ds.setInitialSize(getMinConn());
+        ds.setMaxTotal(getMaxConn());
+        ds.setMinIdle(getMinConn());
+        ds.setMaxIdle(getMinConn());
+        ds.setMaxWaitMillis(getMaxWait());
+        ds.setTimeBetweenEvictionRunsMillis(120000);
+        ds.setNumTestsPerEvictionRun(1);
+        ds.setTestWhileIdle(true);
+        ds.setValidationQuery(getValidationQuery(getDBType()));
+        ds.setConnectionProperties("useUnicode=yes;characterEncoding=utf8;socketTimeout=5000;connectTimeout=500");
+        ds.setDefaultTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
+        return ds;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/DruidDataSourceProvider.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/DruidDataSourceProvider.java
new file mode 100644
index 0000000..ad09895
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/DruidDataSourceProvider.java
@@ -0,0 +1,59 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.store;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import io.seata.common.loader.LoadLevel;
+import io.seata.core.store.db.AbstractDataSourceProvider;
+
+import javax.sql.DataSource;
+import java.sql.Connection;
+
+/**
+ * The druid datasource provider
+ * @author zhangsen
+ * @author ggndnn
+ * @author will
+ */
+@LoadLevel(name = "druid")
+public class DruidDataSourceProvider extends AbstractDataSourceProvider {
+
+    @Override
+    public DataSource generate() {
+        DruidDataSource ds = new DruidDataSource();
+        ds.setDriverClassName(getDriverClassName());
+        ds.setDriverClassLoader(getDriverClassLoader());
+        ds.setUrl(getUrl());
+        ds.setUsername(getUser());
+        ds.setPassword(getPassword());
+        ds.setInitialSize(getMinConn());
+        ds.setMaxActive(getMaxConn());
+        ds.setMinIdle(getMinConn());
+        ds.setMaxWait(getMaxWait());
+        ds.setTimeBetweenEvictionRunsMillis(120000);
+        ds.setMinEvictableIdleTimeMillis(300000);
+        ds.setTestWhileIdle(true);
+        ds.setTestOnBorrow(false);
+        ds.setPoolPreparedStatements(true);
+        ds.setMaxPoolPreparedStatementPerConnectionSize(20);
+        ds.setValidationQuery(getValidationQuery(getDBType()));
+        ds.setDefaultAutoCommit(true);
+        // fix issue 5030
+        ds.setUseOracleImplicitCache(false);
+        ds.setDefaultTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
+        return ds;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/HikariDataSourceProvider.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/HikariDataSourceProvider.java
new file mode 100644
index 0000000..60eb0d4
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/HikariDataSourceProvider.java
@@ -0,0 +1,62 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.store;
+
+import com.zaxxer.hikari.HikariConfig;
+import com.zaxxer.hikari.HikariDataSource;
+import com.zaxxer.hikari.util.IsolationLevel;
+import io.seata.common.loader.LoadLevel;
+import io.seata.core.store.db.AbstractDataSourceProvider;
+
+import javax.sql.DataSource;
+import java.util.Properties;
+
+/**
+ * The hikari datasource provider
+ * @author diguage
+ * @author will
+ */
+@LoadLevel(name = "hikari")
+public class HikariDataSourceProvider extends AbstractDataSourceProvider {
+
+    @Override
+    public DataSource generate() {
+        Properties properties = new Properties();
+        properties.setProperty("dataSource.cachePrepStmts", "true");
+        properties.setProperty("dataSource.prepStmtCacheSize", "250");
+        properties.setProperty("dataSource.prepStmtCacheSqlLimit", "2048");
+        properties.setProperty("dataSource.useServerPrepStmts", "true");
+        properties.setProperty("dataSource.useLocalSessionState", "true");
+        properties.setProperty("dataSource.rewriteBatchedStatements", "true");
+        properties.setProperty("dataSource.cacheResultSetMetadata", "true");
+        properties.setProperty("dataSource.cacheServerConfiguration", "true");
+        properties.setProperty("dataSource.elideSetAutoCommits", "true");
+        properties.setProperty("dataSource.maintainTimeStats", "false");
+
+        HikariConfig config = new HikariConfig(properties);
+        config.setDriverClassName(getDriverClassName());
+        config.setJdbcUrl(getUrl());
+        config.setUsername(getUser());
+        config.setPassword(getPassword());
+        config.setMaximumPoolSize(getMaxConn());
+        config.setMinimumIdle(getMinConn());
+        config.setAutoCommit(true);
+        config.setConnectionTimeout(getMaxWait());
+        config.setInitializationFailTimeout(-1);
+        config.setTransactionIsolation(IsolationLevel.TRANSACTION_READ_COMMITTED.name());
+        return new HikariDataSource(config);
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/SessionStorable.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/SessionStorable.java
new file mode 100644
index 0000000..cdcebeb
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/SessionStorable.java
@@ -0,0 +1,38 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.store;
+
+/**
+ * The interface Session storable.
+ *
+ * @author slievrly
+ */
+public interface SessionStorable {
+
+    /**
+     * Encode byte [ ].
+     *
+     * @return the byte [ ]
+     */
+    byte[] encode();
+
+    /**
+     * Decode.
+     *
+     * @param src the src
+     */
+    void decode(byte[] src);
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/StoreConfig.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/StoreConfig.java
new file mode 100644
index 0000000..362c799
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/StoreConfig.java
@@ -0,0 +1,248 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.store;
+
+import io.seata.common.util.StringUtils;
+import io.seata.config.Configuration;
+import io.seata.config.ConfigurationFactory;
+import io.seata.core.constants.ConfigurationKeys;
+import io.seata.server.env.ContainerHelper;
+import io.seata.server.storage.file.FlushDiskMode;
+
+import static io.seata.common.DefaultValues.SERVER_DEFAULT_STORE_MODE;
+import static io.seata.core.constants.ConfigurationKeys.STORE_FILE_PREFIX;
+
+/**
+ * @author lizhao
+ */
+public class StoreConfig {
+
+    private static final Configuration CONFIGURATION = ConfigurationFactory.getInstance();
+    private static StoreMode storeMode;
+    private static SessionMode sessionMode;
+    private static LockMode lockMode;
+
+    /**
+     * set storeMode sessionMode lockMode from StartupParameter
+     *
+     * @param storeMode   storeMode
+     * @param sessionMode sessionMode
+     * @param lockMode    lockMode
+     */
+    public static void setStartupParameter(String storeMode, String sessionMode, String lockMode) {
+        if (StringUtils.isNotBlank(storeMode)) {
+            StoreConfig.storeMode = StoreMode.get(storeMode);
+        }
+        if (StringUtils.isNotBlank(sessionMode)) {
+            StoreConfig.sessionMode = SessionMode.get(sessionMode);
+        }
+        if (StringUtils.isNotBlank(lockMode)) {
+            StoreConfig.lockMode = LockMode.get(lockMode);
+        }
+    }
+
+    /**
+     * Default 16kb.
+     */
+    private static final int DEFAULT_MAX_BRANCH_SESSION_SIZE = 1024 * 16;
+
+    /**
+     * Default 512b.
+     */
+    private static final int DEFAULT_MAX_GLOBAL_SESSION_SIZE = 512;
+
+    /**
+     * Default 16kb.
+     */
+    private static final int DEFAULT_WRITE_BUFFER_SIZE = 1024 * 16;
+
+    public static int getMaxBranchSessionSize() {
+        return CONFIGURATION.getInt(STORE_FILE_PREFIX + "maxBranchSessionSize", DEFAULT_MAX_BRANCH_SESSION_SIZE);
+    }
+
+    public static int getMaxGlobalSessionSize() {
+        return CONFIGURATION.getInt(STORE_FILE_PREFIX + "maxGlobalSessionSize", DEFAULT_MAX_GLOBAL_SESSION_SIZE);
+    }
+
+    public static int getFileWriteBufferCacheSize() {
+        return CONFIGURATION.getInt(STORE_FILE_PREFIX + "fileWriteBufferCacheSize", DEFAULT_WRITE_BUFFER_SIZE);
+    }
+
+    public static FlushDiskMode getFlushDiskMode() {
+        return FlushDiskMode.findDiskMode(CONFIGURATION.getConfig(STORE_FILE_PREFIX + "flushDiskMode"));
+    }
+
+    /**
+     * only for inner call
+     *
+     * @return
+     */
+    private static StoreMode getStoreMode() {
+        //startup
+        if (null != storeMode) {
+            return storeMode;
+        }
+        //env
+        String storeModeEnv = ContainerHelper.getStoreMode();
+        if (StringUtils.isNotBlank(storeModeEnv)) {
+            return StoreMode.get(storeModeEnv);
+        }
+        //config
+        String storeModeConfig = CONFIGURATION.getConfig(ConfigurationKeys.STORE_MODE, SERVER_DEFAULT_STORE_MODE);
+        return StoreMode.get(storeModeConfig);
+    }
+
+    public static SessionMode getSessionMode() {
+        //startup
+        if (null != sessionMode) {
+            return sessionMode;
+        }
+        //env
+        String sessionModeEnv = ContainerHelper.getSessionStoreMode();
+        if (StringUtils.isNotBlank(sessionModeEnv)) {
+            return SessionMode.get(sessionModeEnv);
+        }
+        //config
+        String sessionModeConfig = CONFIGURATION.getConfig(ConfigurationKeys.STORE_SESSION_MODE);
+        if (StringUtils.isNotBlank(sessionModeConfig)) {
+            return SessionMode.get(sessionModeConfig);
+        }
+        // complication old config
+        return SessionMode.get(getStoreMode().name());
+    }
+
+    public static LockMode getLockMode() {
+        //startup
+        if (null != lockMode) {
+            return lockMode;
+        }
+        //env
+        String lockModeEnv = ContainerHelper.getLockStoreMode();
+        if (StringUtils.isNotBlank(lockModeEnv)) {
+            return LockMode.get(lockModeEnv);
+        }
+        //config
+        String lockModeConfig = CONFIGURATION.getConfig(ConfigurationKeys.STORE_LOCK_MODE);
+        if (StringUtils.isNotBlank(lockModeConfig)) {
+            return LockMode.get(lockModeConfig);
+        }
+        // complication old config
+        return LockMode.get(getStoreMode().name());
+    }
+
+    public enum StoreMode {
+        /**
+         * The File store mode.
+         */
+        FILE("file"),
+        /**
+         * The Db store mode.
+         */
+        DB("db"),
+        /**
+         * The Redis store mode.
+         */
+        REDIS("redis");
+
+        private String name;
+
+        StoreMode(String name) {
+            this.name = name;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public static StoreMode get(String name) {
+            for (StoreMode mode : StoreMode.values()) {
+                if (mode.getName().equalsIgnoreCase(name)) {
+                    return mode;
+                }
+            }
+            throw new IllegalArgumentException("unknown store mode:" + name);
+        }
+    }
+
+    public enum SessionMode {
+        /**
+         * The File store mode.
+         */
+        FILE("file"),
+        /**
+         * The Db store mode.
+         */
+        DB("db"),
+        /**
+         * The Redis store mode.
+         */
+        REDIS("redis");
+
+        private String name;
+
+        SessionMode(String name) {
+            this.name = name;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public static SessionMode get(String name) {
+            for (SessionMode mode : SessionMode.values()) {
+                if (mode.getName().equalsIgnoreCase(name)) {
+                    return mode;
+                }
+            }
+            throw new IllegalArgumentException("unknown session mode:" + name);
+        }
+    }
+
+    public enum LockMode {
+        /**
+         * The File store mode.
+         */
+        FILE("file"),
+        /**
+         * The Db store mode.
+         */
+        DB("db"),
+        /**
+         * The Redis store mode.
+         */
+        REDIS("redis");
+
+        private String name;
+
+        LockMode(String name) {
+            this.name = name;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public static LockMode get(String name) {
+            for (LockMode mode : LockMode.values()) {
+                if (mode.getName().equalsIgnoreCase(name)) {
+                    return mode;
+                }
+            }
+            throw new IllegalArgumentException("unknown lock mode:" + name);
+        }
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/TransactionStoreManager.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/TransactionStoreManager.java
new file mode 100644
index 0000000..2fb6473
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/TransactionStoreManager.java
@@ -0,0 +1,148 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.store;
+
+import io.seata.core.model.GlobalStatus;
+import io.seata.server.session.GlobalSession;
+import io.seata.server.session.SessionCondition;
+
+import java.util.List;
+
+/**
+ * The interface Transaction store manager.
+ *
+ * @author slievrly
+ */
+public interface TransactionStoreManager {
+
+    /**
+     * Write session boolean.
+     *
+     * @param logOperation the log operation
+     * @param session      the session
+     * @return the boolean
+     */
+    boolean writeSession(LogOperation logOperation, SessionStorable session);
+
+
+    /**
+     * Read global session global session.
+     *
+     * @param xid the xid
+     * @return the global session
+     */
+    GlobalSession readSession(String xid);
+
+    /**
+     * Read session global session.
+     *
+     * @param xid the xid
+     * @param withBranchSessions the withBranchSessions
+     * @return the global session
+     */
+    GlobalSession readSession(String xid, boolean withBranchSessions);
+
+    /**
+     * Read session global session by sort by timeout begin status.
+     *
+     * @param withBranchSessions the withBranchSessions
+     * @return the global session
+     */
+    List<GlobalSession> readSortByTimeoutBeginSessions(boolean withBranchSessions);
+    /**
+     * Read session global session.
+     *
+     * @param statuses the statuses
+     * @param withBranchSessions the withBranchSessions
+     * @return the global session list
+     */
+    List<GlobalSession> readSession(GlobalStatus[] statuses, boolean withBranchSessions);
+
+    /**
+     * Read session by status list.
+     *
+     * @param sessionCondition the session condition
+     * @return the list
+     */
+    List<GlobalSession> readSession(SessionCondition sessionCondition);
+
+    /**
+     * Shutdown.
+     */
+    void shutdown();
+
+
+    /**
+     * The enum Log operation.
+     */
+    enum LogOperation {
+
+        /**
+         * Global add log operation.
+         */
+        GLOBAL_ADD((byte)1),
+        /**
+         * Global update log operation.
+         */
+        GLOBAL_UPDATE((byte)2),
+        /**
+         * Global remove log operation.
+         */
+        GLOBAL_REMOVE((byte)3),
+        /**
+         * Branch add log operation.
+         */
+        BRANCH_ADD((byte)4),
+        /**
+         * Branch update log operation.
+         */
+        BRANCH_UPDATE((byte)5),
+        /**
+         * Branch remove log operation.
+         */
+        BRANCH_REMOVE((byte)6);
+
+        private byte code;
+
+        LogOperation(byte code) {
+            this.code = code;
+        }
+
+        /**
+         * Gets code.
+         *
+         * @return the code
+         */
+        public byte getCode() {
+            return this.code;
+        }
+
+        /**
+         * Gets log operation by code.
+         *
+         * @param code the code
+         * @return the log operation by code
+         */
+        public static LogOperation getLogOperationByCode(byte code) {
+            for (LogOperation temp : values()) {
+                if (temp.getCode() == code) {
+                    return temp;
+                }
+            }
+            throw new IllegalArgumentException("Unknown LogOperation[" + code + "]");
+        }
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/transaction/at/ATCore.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/transaction/at/ATCore.java
new file mode 100644
index 0000000..da31824
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/transaction/at/ATCore.java
@@ -0,0 +1,104 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.transaction.at;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.seata.common.exception.StoreException;
+import io.seata.common.util.StringUtils;
+import io.seata.core.exception.BranchTransactionException;
+import io.seata.core.exception.TransactionException;
+import io.seata.core.model.BranchType;
+import io.seata.core.rpc.RemotingServer;
+import io.seata.server.coordinator.AbstractCore;
+import io.seata.server.session.BranchSession;
+import io.seata.server.session.GlobalSession;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import static io.seata.common.Constants.AUTO_COMMIT;
+import static io.seata.common.Constants.SKIP_CHECK_LOCK;
+import static io.seata.core.exception.TransactionExceptionCode.LockKeyConflict;
+
+/**
+ * The type at core.
+ *
+ * @author ph3636
+ */
+public class ATCore extends AbstractCore {
+
+    private final ObjectMapper objectMapper = new ObjectMapper();
+
+    public ATCore(RemotingServer remotingServer) {
+        super(remotingServer);
+    }
+
+    @Override
+    public BranchType getHandleBranchType() {
+        return BranchType.AT;
+    }
+
+    @Override
+    protected void branchSessionLock(GlobalSession globalSession, BranchSession branchSession)
+        throws TransactionException {
+        String applicationData = branchSession.getApplicationData();
+        boolean autoCommit = true;
+        boolean skipCheckLock = false;
+        if (StringUtils.isNotBlank(applicationData)) {
+            try {
+                Map<String, Object> data = objectMapper.readValue(applicationData, HashMap.class);
+                Object clientAutoCommit = data.get(AUTO_COMMIT);
+                if (clientAutoCommit != null && !(boolean)clientAutoCommit) {
+                    autoCommit = (boolean)clientAutoCommit;
+                }
+                Object clientSkipCheckLock = data.get(SKIP_CHECK_LOCK);
+                if (clientSkipCheckLock instanceof Boolean) {
+                    skipCheckLock = (boolean)clientSkipCheckLock;
+                }
+            } catch (IOException e) {
+                LOGGER.error("failed to get application data: {}", e.getMessage(), e);
+            }
+        }
+        try {
+            if (!branchSession.lock(autoCommit, skipCheckLock)) {
+                throw new BranchTransactionException(LockKeyConflict,
+                    String.format("Global lock acquire failed xid = %s branchId = %s", globalSession.getXid(),
+                        branchSession.getBranchId()));
+            }
+        } catch (StoreException e) {
+            Throwable cause = e.getCause();
+            if (cause instanceof BranchTransactionException) {
+                throw new BranchTransactionException(((BranchTransactionException)cause).getCode(),
+                    String.format("Global lock acquire failed xid = %s branchId = %s", globalSession.getXid(),
+                        branchSession.getBranchId()));
+            }
+            throw e;
+        }
+    }
+
+    @Override
+    protected void branchSessionUnlock(BranchSession branchSession) throws TransactionException {
+        branchSession.unlock();
+    }
+
+    @Override
+    public boolean lockQuery(BranchType branchType, String resourceId, String xid, String lockKeys)
+            throws TransactionException {
+        return lockManager.isLockable(xid, resourceId, lockKeys);
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/transaction/saga/SagaCore.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/transaction/saga/SagaCore.java
new file mode 100644
index 0000000..f57cd6a
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/transaction/saga/SagaCore.java
@@ -0,0 +1,230 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.transaction.saga;
+
+import io.netty.channel.Channel;
+import io.seata.common.util.CollectionUtils;
+import io.seata.core.exception.GlobalTransactionException;
+import io.seata.core.exception.TransactionException;
+import io.seata.core.model.BranchStatus;
+import io.seata.core.model.BranchType;
+import io.seata.core.model.GlobalStatus;
+import io.seata.core.protocol.transaction.BranchCommitRequest;
+import io.seata.core.protocol.transaction.BranchCommitResponse;
+import io.seata.core.protocol.transaction.BranchRollbackRequest;
+import io.seata.core.protocol.transaction.BranchRollbackResponse;
+import io.seata.core.rpc.RemotingServer;
+import io.seata.core.rpc.netty.ChannelManager;
+import io.seata.server.coordinator.AbstractCore;
+import io.seata.server.session.BranchSession;
+import io.seata.server.session.GlobalSession;
+import io.seata.server.session.SessionHelper;
+import io.seata.server.session.SessionHolder;
+
+import java.io.IOException;
+import java.util.Map;
+import java.util.concurrent.TimeoutException;
+
+/**
+ * The type saga core.
+ *
+ * @author ph3636
+ */
+public class SagaCore extends AbstractCore {
+
+    public SagaCore(RemotingServer remotingServer) {
+        super(remotingServer);
+    }
+
+    @Override
+    public BranchType getHandleBranchType() {
+        return BranchType.SAGA;
+    }
+
+    @Override
+    public void globalSessionStatusCheck(GlobalSession globalSession) throws GlobalTransactionException {
+        // SAGA type accept forward(retry) operation on timeout or commit fail, forward operation will register remaining branches
+    }
+
+    @Override
+    public BranchStatus branchCommitSend(BranchCommitRequest request, GlobalSession globalSession,
+                                         BranchSession branchSession) throws IOException, TimeoutException {
+        Map<String, Channel> channels = ChannelManager.getRmChannels();
+        if (CollectionUtils.isEmpty(channels)) {
+            LOGGER.error("Failed to commit SAGA global[" + globalSession.getXid() + ", RM channels is empty.");
+            return BranchStatus.PhaseTwo_CommitFailed_Retryable;
+        }
+        String sagaResourceId = getSagaResourceId(globalSession);
+        Channel sagaChannel = channels.get(sagaResourceId);
+        if (sagaChannel == null) {
+            LOGGER.error("Failed to commit SAGA global[" + globalSession.getXid()
+                    + ", cannot find channel by resourceId[" + sagaResourceId + "]");
+            return BranchStatus.PhaseTwo_CommitFailed_Retryable;
+        }
+        BranchCommitResponse response = (BranchCommitResponse) remotingServer.sendSyncRequest(sagaChannel, request);
+        return response.getBranchStatus();
+    }
+
+    @Override
+    public BranchStatus branchRollbackSend(BranchRollbackRequest request, GlobalSession globalSession,
+                                           BranchSession branchSession) throws IOException, TimeoutException {
+        Map<String, Channel> channels = ChannelManager.getRmChannels();
+        if (CollectionUtils.isEmpty(channels)) {
+            LOGGER.error("Failed to rollback SAGA global[" + globalSession.getXid() + ", RM channels is empty.");
+            return BranchStatus.PhaseTwo_RollbackFailed_Retryable;
+        }
+        String sagaResourceId = getSagaResourceId(globalSession);
+        Channel sagaChannel = channels.get(sagaResourceId);
+        if (sagaChannel == null) {
+            LOGGER.error("Failed to rollback SAGA global[" + globalSession.getXid()
+                    + ", cannot find channel by resourceId[" + sagaResourceId + "]");
+            return BranchStatus.PhaseTwo_RollbackFailed_Retryable;
+        }
+        BranchRollbackResponse response = (BranchRollbackResponse) remotingServer.sendSyncRequest(sagaChannel, request);
+        return response.getBranchStatus();
+    }
+
+    @Override
+    public boolean doGlobalCommit(GlobalSession globalSession, boolean retrying) throws TransactionException {
+        try {
+            BranchStatus branchStatus = branchCommit(globalSession, SessionHelper.newBranch(BranchType.SAGA,
+                    globalSession.getXid(), -1, getSagaResourceId(globalSession), globalSession.getStatus().name()));
+
+            switch (branchStatus) {
+                case PhaseTwo_Committed:
+                    SessionHelper.removeAllBranch(globalSession, !retrying);
+                    LOGGER.info("Successfully committed SAGA global[" + globalSession.getXid() + "]");
+                    break;
+                case PhaseTwo_Rollbacked:
+                    LOGGER.info("Successfully rollbacked SAGA global[" + globalSession.getXid() + "]");
+                    SessionHelper.removeAllBranch(globalSession, !retrying);
+                    SessionHelper.endRollbacked(globalSession, retrying);
+                    return false;
+                case PhaseTwo_RollbackFailed_Retryable:
+                    LOGGER.error("By [{}], failed to rollback SAGA global [{}], will retry later.", branchStatus,
+                            globalSession.getXid());
+                    SessionHolder.getRetryCommittingSessionManager().removeGlobalSession(globalSession);
+                    globalSession.queueToRetryRollback();
+                    return false;
+                case PhaseOne_Failed:
+                    LOGGER.error("By [{}], finish SAGA global [{}]", branchStatus, globalSession.getXid());
+                    SessionHelper.removeAllBranch(globalSession, !retrying);
+                    globalSession.changeGlobalStatus(GlobalStatus.Finished);
+                    globalSession.end();
+                    return false;
+                case PhaseTwo_CommitFailed_Unretryable:
+                    if (globalSession.canBeCommittedAsync()) {
+                        LOGGER.error("By [{}], failed to commit SAGA global [{}]", branchStatus,
+                                globalSession.getXid());
+                        break;
+                    } else {
+                        SessionHelper.endCommitFailed(globalSession,retrying);
+                        LOGGER.error("Finally, failed to commit SAGA global[{}]", globalSession.getXid());
+                        return false;
+                    }
+                default:
+                    if (!retrying) {
+                        globalSession.queueToRetryCommit();
+                    } else {
+                        LOGGER.error("Failed to commit SAGA global[{}], will retry later.", globalSession.getXid());
+                    }
+                    return false;
+            }
+        } catch (Exception ex) {
+            LOGGER.error("Failed to commit global[" + globalSession.getXid() + "]", ex);
+
+            if (!retrying) {
+                globalSession.queueToRetryRollback();
+            }
+            throw new TransactionException(ex);
+        }
+        return true;
+    }
+
+    @Override
+    public boolean doGlobalRollback(GlobalSession globalSession, boolean retrying) throws TransactionException {
+        try {
+            BranchStatus branchStatus = branchRollback(globalSession, SessionHelper.newBranch(BranchType.SAGA,
+                    globalSession.getXid(), -1, getSagaResourceId(globalSession), globalSession.getStatus().name()));
+
+            switch (branchStatus) {
+                case PhaseTwo_Rollbacked:
+                    SessionHelper.removeAllBranch(globalSession, !retrying);
+                    LOGGER.info("Successfully rollbacked SAGA global[{}]",globalSession.getXid());
+                    break;
+                case PhaseTwo_RollbackFailed_Unretryable:
+                    SessionHelper.endRollbackFailed(globalSession, retrying);
+                    LOGGER.error("Failed to rollback SAGA global[{}]", globalSession.getXid());
+                    return false;
+                case PhaseTwo_CommitFailed_Retryable:
+                    SessionHolder.getRetryRollbackingSessionManager().removeGlobalSession(globalSession);
+                    globalSession.queueToRetryCommit();
+                    LOGGER.warn("Retry by custom recover strategy [Forward] on timeout, SAGA global[{}]", globalSession.getXid());
+                    return false;
+                default:
+                    LOGGER.error("Failed to rollback SAGA global[{}]", globalSession.getXid());
+                    if (!retrying) {
+                        globalSession.queueToRetryRollback();
+                    }
+                    return false;
+            }
+        } catch (Exception ex) {
+            LOGGER.error("Failed to rollback global[{}]", globalSession.getXid(), ex);
+            if (!retrying) {
+                globalSession.queueToRetryRollback();
+            }
+            throw new TransactionException(ex);
+        }
+        return true;
+    }
+
+    @Override
+    public void doGlobalReport(GlobalSession globalSession, String xid, GlobalStatus globalStatus) throws TransactionException {
+        if (GlobalStatus.Committed.equals(globalStatus)) {
+            SessionHelper.removeAllBranch(globalSession, false);
+            SessionHelper.endCommitted(globalSession, false);
+            LOGGER.info("Global[{}] committed", globalSession.getXid());
+        } else if (GlobalStatus.Rollbacked.equals(globalStatus)
+                || GlobalStatus.Finished.equals(globalStatus)) {
+            SessionHelper.removeAllBranch(globalSession, false);
+            SessionHelper.endRollbacked(globalSession, false);
+            LOGGER.info("Global[{}] rollbacked", globalSession.getXid());
+        } else {
+            globalSession.changeGlobalStatus(globalStatus);
+            LOGGER.info("Global[{}] reporting is successfully done. status[{}]", globalSession.getXid(), globalSession.getStatus());
+
+            if (GlobalStatus.RollbackRetrying.equals(globalStatus)
+                    || GlobalStatus.TimeoutRollbackRetrying.equals(globalStatus)
+                    || GlobalStatus.UnKnown.equals(globalStatus)) {
+                globalSession.queueToRetryRollback();
+                LOGGER.info("Global[{}] will retry rollback", globalSession.getXid());
+            } else if (GlobalStatus.CommitRetrying.equals(globalStatus)) {
+                globalSession.queueToRetryCommit();
+                LOGGER.info("Global[{}] will retry commit", globalSession.getXid());
+            }
+        }
+    }
+
+    /**
+     * get saga ResourceId
+     *
+     * @param globalSession the globalSession
+     * @return sagaResourceId
+     */
+    private String getSagaResourceId(GlobalSession globalSession) {
+        return globalSession.getApplicationId() + "#" + globalSession.getTransactionServiceGroup();
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/transaction/tcc/TccCore.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/transaction/tcc/TccCore.java
new file mode 100644
index 0000000..e0171aa
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/transaction/tcc/TccCore.java
@@ -0,0 +1,37 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.transaction.tcc;
+
+import io.seata.core.model.BranchType;
+import io.seata.core.rpc.RemotingServer;
+import io.seata.server.coordinator.AbstractCore;
+
+/**
+ * The type tcc core.
+ *
+ * @author ph3636
+ */
+public class TccCore extends AbstractCore {
+
+    public TccCore(RemotingServer remotingServer) {
+        super(remotingServer);
+    }
+
+    @Override
+    public BranchType getHandleBranchType() {
+        return BranchType.TCC;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/transaction/xa/XACore.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/transaction/xa/XACore.java
new file mode 100644
index 0000000..de4620d
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/transaction/xa/XACore.java
@@ -0,0 +1,48 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package io.seata.server.transaction.xa;
+
+import io.seata.core.exception.TransactionException;
+import io.seata.core.model.BranchStatus;
+import io.seata.core.model.BranchType;
+import io.seata.core.rpc.RemotingServer;
+import io.seata.server.coordinator.AbstractCore;
+
+/**
+ * The type XA core.
+ *
+ * @author sharajava
+ */
+public class XACore extends AbstractCore {
+
+    public XACore(RemotingServer remotingServer) {
+        super(remotingServer);
+    }
+
+    @Override
+    public BranchType getHandleBranchType() {
+        return BranchType.XA;
+    }
+
+    @Override
+    public void branchReport(BranchType branchType, String xid, long branchId, BranchStatus status,
+                             String applicationData) throws TransactionException {
+        super.branchReport(branchType, xid, branchId, status, applicationData);
+        if (BranchStatus.PhaseOne_Failed == status) {
+
+        }
+    }
+}
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/native-image/io.seata/server/reflect-config.json b/ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/native-image/io.seata/server/reflect-config.json
new file mode 100644
index 0000000..9d762df
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/native-image/io.seata/server/reflect-config.json
@@ -0,0 +1,362 @@
+[
+  {
+    "condition": {
+      "typeReachable": "io.seata.core.rpc.RegisterCheckAuthHandler"
+    },
+    "name": "io.seata.server.auth.DefaultCheckAuthHandler",
+    "methods": [
+      {
+        "name": "<init>",
+        "parameterTypes": []
+      }
+    ]
+  },
+  {
+    "condition": {
+      "typeReachable": "io.seata.core.store.db.DataSourceProvider"
+    },
+    "name": "io.seata.server.store.DbcpDataSourceProvider",
+    "methods": [
+      {
+        "name": "<init>",
+        "parameterTypes": []
+      }
+    ]
+  },
+  {
+    "condition": {
+      "typeReachable": "io.seata.core.store.db.DataSourceProvider"
+    },
+    "name": "io.seata.server.store.DruidDataSourceProvider",
+    "methods": [
+      {
+        "name": "<init>",
+        "parameterTypes": []
+      }
+    ]
+  },
+  {
+    "condition": {
+      "typeReachable": "io.seata.core.store.db.DataSourceProvider"
+    },
+    "name": "io.seata.server.store.HikariDataSourceProvider",
+    "methods": [
+      {
+        "name": "<init>",
+        "parameterTypes": []
+      }
+    ]
+  },
+  {
+    "condition": {
+      "typeReachable": "io.seata.core.store.DistributedLocker"
+    },
+    "name": "io.seata.server.storage.redis.lock.RedisDistributedLocker",
+    "methods": [
+      {
+        "name": "<init>",
+        "parameterTypes": []
+      }
+    ]
+  },
+  {
+    "condition": {
+      "typeReachable": "io.seata.core.store.DistributedLocker"
+    },
+    "name": "io.seata.server.storage.db.lock.DataBaseDistributedLocker",
+    "methods": [
+      {
+        "name": "<init>",
+        "parameterTypes": []
+      }
+    ]
+  },
+  {
+    "condition": {
+      "typeReachable": "io.seata.server.coordinator.AbstractCore"
+    },
+    "name": "io.seata.server.transaction.at.ATCore",
+    "methods": [
+      {
+        "name": "<init>",
+        "parameterTypes": [
+          "io.seata.core.rpc.RemotingServer"
+        ]
+      }
+    ]
+  },
+  {
+    "condition": {
+      "typeReachable": "io.seata.server.coordinator.AbstractCore"
+    },
+    "name": "io.seata.server.transaction.tcc.TccCore",
+    "methods": [
+      {
+        "name": "<init>",
+        "parameterTypes": [
+          "io.seata.core.rpc.RemotingServer"
+        ]
+      }
+    ]
+  },
+  {
+    "condition": {
+      "typeReachable": "io.seata.server.coordinator.AbstractCore"
+    },
+    "name": "io.seata.server.transaction.saga.SagaCore",
+    "methods": [
+      {
+        "name": "<init>",
+        "parameterTypes": [
+          "io.seata.core.rpc.RemotingServer"
+        ]
+      }
+    ]
+  },
+  {
+    "condition": {
+      "typeReachable": "io.seata.server.coordinator.AbstractCore"
+    },
+    "name": "io.seata.server.transaction.xa.XACore",
+    "methods": [
+      {
+        "name": "<init>",
+        "parameterTypes": [
+          "io.seata.core.rpc.RemotingServer"
+        ]
+      }
+    ]
+  },
+  {
+    "condition": {
+      "typeReachable": "io.seata.server.lock.LockManager"
+    },
+    "name": "io.seata.server.storage.db.lock.DataBaseLockManager",
+    "methods": [
+      {
+        "name": "<init>",
+        "parameterTypes": []
+      }
+    ]
+  },
+  {
+    "condition": {
+      "typeReachable": "io.seata.server.lock.LockManager"
+    },
+    "name": "io.seata.server.storage.file.lock.FileLockManager",
+    "methods": [
+      {
+        "name": "<init>",
+        "parameterTypes": []
+      }
+    ]
+  },
+  {
+    "condition": {
+      "typeReachable": "io.seata.server.lock.LockManager"
+    },
+    "name": "io.seata.server.storage.redis.lock.RedisLockManager",
+    "methods": [
+      {
+        "name": "<init>",
+        "parameterTypes": []
+      }
+    ]
+  },
+  {
+    "condition": {
+      "typeReachable": "io.seata.server.session.SessionManager"
+    },
+    "name": "io.seata.server.storage.file.session.FileSessionManager",
+    "methods": [
+      {
+        "name": "<init>",
+        "parameterTypes": [
+          "java.lang.String",
+          "java.lang.String"
+        ]
+      }
+    ]
+  },
+  {
+    "condition": {
+      "typeReachable": "io.seata.server.session.SessionManager"
+    },
+    "name": "io.seata.server.storage.db.session.DataBaseSessionManager",
+    "methods": [
+      {
+        "name": "<init>",
+        "parameterTypes": []
+      },
+      {
+        "name": "<init>",
+        "parameterTypes": [
+          "java.lang.String"
+        ]
+      }
+    ]
+  },
+  {
+    "condition": {
+      "typeReachable": "io.seata.server.session.SessionManager"
+    },
+    "name": "io.seata.server.storage.redis.session.RedisSessionManager",
+    "methods": [
+      {
+        "name": "<init>",
+        "parameterTypes": []
+      },
+      {
+        "name": "<init>",
+        "parameterTypes": [
+          "java.lang.String"
+        ]
+      }
+    ]
+  },
+  {
+    "condition": {
+      "typeReachable": "com.google.inject.internal.TypeConverterBindingProcessor"
+    },
+    "name": "java.lang.Integer",
+    "methods": [
+      {
+        "name": "parseInteger",
+        "parameterTypes": [
+          "java.lang.String"
+        ]
+      }
+    ]
+  },
+  {
+    "condition": {
+      "typeReachable": "com.google.inject.internal.TypeConverterBindingProcessor"
+    },
+    "name": "java.lang.Long",
+    "methods": [
+      {
+        "name": "parseLong",
+        "parameterTypes": [
+          "java.lang.String"
+        ]
+      }
+    ]
+  },
+  {
+    "condition": {
+      "typeReachable": "com.google.inject.internal.TypeConverterBindingProcessor"
+    },
+    "name": "java.lang.Boolean",
+    "methods": [
+      {
+        "name": "parseBoolean",
+        "parameterTypes": [
+          "java.lang.String"
+        ]
+      }
+    ]
+  },
+  {
+    "condition": {
+      "typeReachable": "com.google.inject.internal.TypeConverterBindingProcessor"
+    },
+    "name": "java.lang.Byte",
+    "methods": [
+      {
+        "name": "parseByte",
+        "parameterTypes": [
+          "java.lang.String"
+        ]
+      }
+    ]
+  },
+  {
+    "condition": {
+      "typeReachable": "com.google.inject.internal.TypeConverterBindingProcessor"
+    },
+    "name": "java.lang.Short",
+    "methods": [
+      {
+        "name": "parseShort",
+        "parameterTypes": [
+          "java.lang.String"
+        ]
+      }
+    ]
+  },
+  {
+    "condition": {
+      "typeReachable": "com.google.inject.internal.TypeConverterBindingProcessor"
+    },
+    "name": "java.lang.Float",
+    "methods": [
+      {
+        "name": "parseFloat",
+        "parameterTypes": [
+          "java.lang.String"
+        ]
+      }
+    ]
+  },
+  {
+    "condition": {
+      "typeReachable": "com.google.inject.internal.TypeConverterBindingProcessor"
+    },
+    "name": "java.lang.Double",
+    "methods": [
+      {
+        "name": "parseDouble",
+        "parameterTypes": [
+          "java.lang.String"
+        ]
+      }
+    ]
+  },
+  {
+    "condition": {
+      "typeReachable": "io.netty.channel.socket.nio.SelectorProviderUtil"
+    },
+    "name": "java.nio.channels.spi.SelectorProvider",
+    "methods": [
+      {
+        "name": "openServerSocketChannel",
+        "parameterTypes": [
+          "java.net.ProtocolFamily"
+        ]
+      }
+    ]
+  },
+  {
+    "condition": {
+      "typeReachable": "io.netty.channel.DefaultChannelConfig"
+    },
+    "name": "io.netty.buffer.ByteBufAllocator"
+  },
+  {
+    "condition": {
+      "typeReachable": "io.netty.channel.DefaultChannelConfig"
+    },
+    "name": "io.netty.buffer.ByteBufUtil"
+  },
+  {
+    "condition": {
+      "typeReachable": "io.netty.util.ResourceLeakDetector"
+    },
+    "name": "io.netty.buffer.AbstractByteBufAllocator",
+    "allDeclaredMethods": true
+  },
+  {
+    "condition": {
+      "typeReachable": "io.netty.util.ResourceLeakDetector"
+    },
+    "name": "io.netty.buffer.AdvancedLeakAwareByteBuf",
+    "allDeclaredMethods": true
+  },
+  {
+    "condition": {
+      "typeReachable": "io.netty.util.ResourceLeakDetector"
+    },
+    "name": "io.netty.util.ReferenceCountUtil",
+    "allDeclaredMethods": true
+  }
+]
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/native-image/io.seata/server/resource-config.json b/ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/native-image/io.seata/server/resource-config.json
new file mode 100644
index 0000000..73b72ff
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/native-image/io.seata/server/resource-config.json
@@ -0,0 +1,21 @@
+{
+  "resources": {
+    "includes": [
+      {
+        "pattern": "\\Qlogback\/\\E.*"
+      },
+      {
+        "pattern": "\\Qlua\/redislocker\/redislock.lua\\E"
+      },
+      {
+        "pattern": "\\Qapplication.yml\\E"
+      },
+      {
+        "pattern": "\\Qbanner.txt\\E"
+      },
+      {
+        "pattern": "\\Qlogback-spring.xml\\E"
+      }
+    ]
+  }
+}
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/services/io.seata.core.rpc.RegisterCheckAuthHandler b/ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/services/io.seata.core.rpc.RegisterCheckAuthHandler
new file mode 100644
index 0000000..1a54728
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/services/io.seata.core.rpc.RegisterCheckAuthHandler
@@ -0,0 +1 @@
+io.seata.server.auth.DefaultCheckAuthHandler
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/services/io.seata.core.store.DistributedLocker b/ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/services/io.seata.core.store.DistributedLocker
new file mode 100644
index 0000000..874e8b9
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/services/io.seata.core.store.DistributedLocker
@@ -0,0 +1,2 @@
+io.seata.server.storage.redis.lock.RedisDistributedLocker
+io.seata.server.storage.db.lock.DataBaseDistributedLocker
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/services/io.seata.core.store.db.DataSourceProvider b/ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/services/io.seata.core.store.db.DataSourceProvider
new file mode 100644
index 0000000..ac04a85
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/services/io.seata.core.store.db.DataSourceProvider
@@ -0,0 +1,3 @@
+io.seata.server.store.DbcpDataSourceProvider
+io.seata.server.store.DruidDataSourceProvider
+io.seata.server.store.HikariDataSourceProvider
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/services/io.seata.server.coordinator.AbstractCore b/ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/services/io.seata.server.coordinator.AbstractCore
new file mode 100644
index 0000000..a80662b
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/services/io.seata.server.coordinator.AbstractCore
@@ -0,0 +1,4 @@
+io.seata.server.transaction.at.ATCore
+io.seata.server.transaction.tcc.TccCore
+io.seata.server.transaction.saga.SagaCore
+io.seata.server.transaction.xa.XACore
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/services/io.seata.server.lock.LockManager b/ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/services/io.seata.server.lock.LockManager
new file mode 100644
index 0000000..bca40c8
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/services/io.seata.server.lock.LockManager
@@ -0,0 +1,3 @@
+io.seata.server.storage.db.lock.DataBaseLockManager
+io.seata.server.storage.file.lock.FileLockManager
+io.seata.server.storage.redis.lock.RedisLockManager
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/services/io.seata.server.session.SessionManager b/ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/services/io.seata.server.session.SessionManager
new file mode 100644
index 0000000..f2e8231
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/services/io.seata.server.session.SessionManager
@@ -0,0 +1,3 @@
+io.seata.server.storage.file.session.FileSessionManager
+io.seata.server.storage.db.session.DataBaseSessionManager
+io.seata.server.storage.redis.session.RedisSessionManager
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/spring-configuration-metadata.json b/ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/spring-configuration-metadata.json
new file mode 100644
index 0000000..0544917
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/spring-configuration-metadata.json
@@ -0,0 +1,22 @@
+{
+  "groups": [],
+  "properties": [
+    {
+      "name": "logging.extend.kafka-appender.bootstrap-servers",
+      "type": "java.lang.String",
+      "defaultValue": "localhost:9092"
+    },
+    {
+      "name": "logging.extend.kafka-appender.topic",
+      "type": "java.lang.String",
+      "defaultValue": "logback_to_logstash"
+    },
+    {
+      "name": "logging.extend.logstash-appender.destination",
+      "type": "java.lang.String",
+      "defaultValue": "localhost:4560"
+    }
+  ],
+  "hints": [
+  ]
+}
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/spring.factories b/ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/spring.factories
new file mode 100644
index 0000000..3384008
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/resources/META-INF/spring.factories
@@ -0,0 +1,4 @@
+org.springframework.context.ApplicationListener=\
+io.seata.server.spring.listener.ServerApplicationListener
+org.springframework.context.ApplicationContextInitializer=\
+io.seata.server.spring.listener.SeataPropertiesLoader
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/resources/README-zh.md b/ruoyi-visual/ruoyi-seata-server/src/main/resources/README-zh.md
new file mode 100644
index 0000000..05d1620
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/resources/README-zh.md
@@ -0,0 +1,32 @@
+# 鑴氭湰璇存槑
+
+## [client](https://github.com/seata/seata/tree/develop/script/client) 
+
+> 瀛樻斁鐢ㄤ簬瀹㈡埛绔殑閰嶇疆鍜孲QL
+
+- at: AT妯″紡涓嬬殑 `undo_log` 寤鸿〃璇彞
+- conf: 瀹㈡埛绔殑閰嶇疆鏂囦欢
+- saga: SAGA 妯″紡涓嬫墍闇�琛ㄧ殑寤鸿〃璇彞
+- spring: SpringBoot 搴旂敤鏀寔鐨勯厤缃枃浠�
+
+## [server](https://github.com/seata/seata/tree/develop/script/server)
+
+> 瀛樻斁server渚ф墍闇�SQL鍜岄儴缃茶剼鏈�
+
+- db: server 渚х殑淇濆瓨妯″紡涓� `db` 鏃舵墍闇�琛ㄧ殑寤鸿〃璇彞
+- docker-compose: server 渚ч�氳繃 docker-compose 閮ㄧ讲鐨勮剼鏈�
+- helm: server 渚ч�氳繃 Helm 閮ㄧ讲鐨勮剼鏈�
+- kubernetes: server 渚ч�氳繃 Kubernetes 閮ㄧ讲鐨勮剼鏈�
+
+## [config-center](https://github.com/seata/seata/tree/develop/script/config-center)
+
+> 鐢ㄤ簬瀛樻斁鍚勭閰嶇疆涓績鐨勫垵濮嬪寲鑴氭湰锛屾墽琛屾椂閮戒細璇诲彇 `config.txt`閰嶇疆鏂囦欢锛屽苟鍐欏叆閰嶇疆涓績
+
+- nacos: 鐢ㄤ簬鍚� Nacos 涓坊鍔犻厤缃�
+- zk: 鐢ㄤ簬鍚� Zookeeper 涓坊鍔犻厤缃紝鑴氭湰渚濊禆 Zookeeper 鐨勭浉鍏宠剼鏈紝闇�瑕佹墜鍔ㄤ笅杞斤紱ZooKeeper鐩稿叧鐨勯厤缃彲浠ュ啓鍦� `zk-params.txt` 涓紝涔熷彲浠ュ湪鎵ц鐨勬椂鍊欒緭鍏�
+- apollo: 鍚� Apollo 涓坊鍔犻厤缃紝Apollo 鐨勫湴鍧�绔彛绛夊彲浠ュ啓鍦� `apollo-params.txt`锛屼篃鍙互鍦ㄦ墽琛岀殑鏃跺�欒緭鍏�
+- etcd3: 鐢ㄤ簬鍚� Etcd3 涓坊鍔犻厤缃�
+- consul: 鐢ㄤ簬鍚� consul 涓坊鍔犻厤缃�
+
+## 鎵撳寘
+./mvnw -Prelease-seata -Dmaven.test.skip=true clean install -U
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/resources/README.md b/ruoyi-visual/ruoyi-seata-server/src/main/resources/README.md
new file mode 100644
index 0000000..ddabd55
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/resources/README.md
@@ -0,0 +1,33 @@
+# Script Description
+
+## [client](https://github.com/seata/seata/tree/develop/script/client) 
+
+> Store configuration and SQL for client side
+
+- at: Script of create table `undo_log` for AT mode.
+- conf: Configuration which client need.
+- saga: Script of create table in SAGA mode
+- spring: Configuration for Spring Boot 
+
+## [server](https://github.com/seata/seata/tree/develop/script/server)
+
+> Store SQL and deploy script for server side
+
+- db: Create table script for server when store mode is `db`
+- docker-compose: Script for deploy server by docker-compose
+- helm: Script for deploy server by Helm
+- kubernetes: Script for deploy server by Kubernetes
+
+## [config-center](https://github.com/seata/seata/tree/develop/script/config-center)
+
+> Store initialize script for configuration center, will use `config.txt` as configuration when initial
+
+- nacos: Initialize script for Nacos
+- zk: Initialize script for ZooKeeper, the script need related script in Zookeeper, you need download yourself. You can modify `zk-params.txt` to change the ZooKeeper server configuration, or input when execute also
+- apollo: Initialize script for Apollo. You can modify `apollo-params.txt` to change the Apollo server configuration, or input when execute also
+- etcd3: Initialize script for Etcd3
+- consul: Initialize script for consul
+
+## build packege 
+./mvnw -Prelease-seata -Dmaven.test.skip=true clean install -U
+
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/resources/application.yml b/ruoyi-visual/ruoyi-seata-server/src/main/resources/application.yml
new file mode 100644
index 0000000..5c12ec5
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/resources/application.yml
@@ -0,0 +1,59 @@
+server:
+  port: 7091
+
+spring:
+  application:
+    name: ruoyi-seata-server
+  profiles:
+    # 鐜閰嶇疆
+    active: @profiles.active@
+
+logging:
+  config: classpath:logback-spring.xml
+  file:
+    path: ./logs/seata
+#  extend:
+#    logstash-appender:
+#      destination: 127.0.0.1:4560
+#    kafka-appender:
+#      bootstrap-servers: 127.0.0.1:9092
+#      topic: logback_to_logstash
+
+console:
+  user:
+    username: seata
+    password: seata
+
+seata:
+  config:
+    # support: nacos 銆� consul 銆� apollo 銆� zk  銆� etcd3
+    type: nacos
+    nacos:
+      server-addr: @nacos.server@
+      group: @nacos.discovery.group@
+      namespace: ${spring.profiles.active}
+      username:
+      password:
+      ##if use MSE Nacos with auth, mutex with username/password attribute
+      #access-key: ""
+      #secret-key: ""
+      data-id: seata-server.properties
+  registry:
+    # support: nacos 銆� eureka 銆� redis 銆� zk  銆� consul 銆� etcd3 銆� sofa
+    type: nacos
+    nacos:
+      application: ${spring.application.name}
+      server-addr: @nacos.server@
+      group: @nacos.discovery.group@
+      namespace: ${spring.profiles.active}
+      cluster: default
+      username:
+      password:
+      ##if use MSE Nacos with auth, mutex with username/password attribute
+      #access-key: ""
+      #secret-key: ""
+  security:
+    secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017
+    tokenValidityInMilliseconds: 1800000
+    ignore:
+      urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.jpeg,/**/*.ico,/api/v1/auth/login
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/resources/banner.txt b/ruoyi-visual/ruoyi-seata-server/src/main/resources/banner.txt
new file mode 100644
index 0000000..0064688
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/resources/banner.txt
@@ -0,0 +1,8 @@
+Spring Boot Version: ${spring-boot.version}
+Spring Application Name: ${spring.application.name}
+                _
+               | |
+ ___  ___  __ _| |_ __ _ ______ ___  ___ _ ____   _____ _ __
+/ __|/ _ \/ _` | __/ _` |______/ __|/ _ \ '__\ \ / / _ \ '__|
+\__ \  __/ (_| | || (_| |      \__ \  __/ |   \ V /  __/ |
+|___/\___|\__,_|\__\__,_|      |___/\___|_|    \_/ \___|_|
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/resources/logback-common.xml b/ruoyi-visual/ruoyi-seata-server/src/main/resources/logback-common.xml
new file mode 100644
index 0000000..89eaa97
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/resources/logback-common.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<included>
+
+    <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"/>
+
+    <!-- 鎺у埗鍙拌緭鍑� -->
+    <appender name="file_console" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/console.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 鏃ュ織鏂囦欢鍚嶆牸寮� -->
+            <fileNamePattern>${log.path}/console.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 鏃ュ織鏈�澶� 1澶� -->
+            <maxHistory>1</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <!-- 杩囨护鐨勭骇鍒� -->
+            <level>INFO</level>
+        </filter>
+    </appender>
+
+    <!-- 绯荤粺鏃ュ織杈撳嚭 -->
+    <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/info.log</file>
+        <!-- 寰幆鏀跨瓥锛氬熀浜庢椂闂村垱寤烘棩蹇楁枃浠� -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 鏃ュ織鏂囦欢鍚嶆牸寮� -->
+            <fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 鏃ュ織鏈�澶х殑鍘嗗彶 60澶� -->
+            <maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 杩囨护鐨勭骇鍒� -->
+            <level>INFO</level>
+            <!-- 鍖归厤鏃剁殑鎿嶄綔锛氭帴鏀讹紙璁板綍锛� -->
+            <onMatch>ACCEPT</onMatch>
+            <!-- 涓嶅尮閰嶆椂鐨勬搷浣滐細鎷掔粷锛堜笉璁板綍锛� -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/error.log</file>
+        <!-- 寰幆鏀跨瓥锛氬熀浜庢椂闂村垱寤烘棩蹇楁枃浠� -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 鏃ュ織鏂囦欢鍚嶆牸寮� -->
+            <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 鏃ュ織鏈�澶х殑鍘嗗彶 60澶� -->
+            <maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 杩囨护鐨勭骇鍒� -->
+            <level>ERROR</level>
+            <!-- 鍖归厤鏃剁殑鎿嶄綔锛氭帴鏀讹紙璁板綍锛� -->
+            <onMatch>ACCEPT</onMatch>
+            <!-- 涓嶅尮閰嶆椂鐨勬搷浣滐細鎷掔粷锛堜笉璁板綍锛� -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- info寮傛杈撳嚭 -->
+    <appender name="async_info" class="ch.qos.logback.classic.AsyncAppender">
+        <!-- 涓嶄涪澶辨棩蹇�.榛樿鐨�,濡傛灉闃熷垪鐨�80%宸叉弧,鍒欎細涓㈠純TRACT銆丏EBUG銆両NFO绾у埆鐨勬棩蹇� -->
+        <discardingThreshold>0</discardingThreshold>
+        <!-- 鏇存敼榛樿鐨勯槦鍒楃殑娣卞害,璇ュ�间細褰卞搷鎬ц兘.榛樿鍊间负256 -->
+        <queueSize>512</queueSize>
+        <!-- 娣诲姞闄勫姞鐨刟ppender,鏈�澶氬彧鑳芥坊鍔犱竴涓� -->
+        <appender-ref ref="file_info"/>
+    </appender>
+
+    <!-- error寮傛杈撳嚭 -->
+    <appender name="async_error" class="ch.qos.logback.classic.AsyncAppender">
+        <!-- 涓嶄涪澶辨棩蹇�.榛樿鐨�,濡傛灉闃熷垪鐨�80%宸叉弧,鍒欎細涓㈠純TRACT銆丏EBUG銆両NFO绾у埆鐨勬棩蹇� -->
+        <discardingThreshold>0</discardingThreshold>
+        <!-- 鏇存敼榛樿鐨勯槦鍒楃殑娣卞害,璇ュ�间細褰卞搷鎬ц兘.榛樿鍊间负256 -->
+        <queueSize>512</queueSize>
+        <!-- 娣诲姞闄勫姞鐨刟ppender,鏈�澶氬彧鑳芥坊鍔犱竴涓� -->
+        <appender-ref ref="file_error"/>
+    </appender>
+
+    <!--绯荤粺鎿嶄綔鏃ュ織-->
+    <root level="info">
+        <appender-ref ref="async_info"/>
+        <appender-ref ref="async_error"/>
+        <appender-ref ref="file_console"/>
+    </root>
+</included>
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/resources/logback-spring.xml b/ruoyi-visual/ruoyi-seata-server/src/main/resources/logback-spring.xml
new file mode 100644
index 0000000..dc942ae
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/resources/logback-spring.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~  Copyright 1999-2019 Seata.io Group.
+  ~
+  ~  Licensed under the Apache License, Version 2.0 (the "License");
+  ~  you may not use this file except in compliance with the License.
+  ~  You may obtain a copy of the License at
+  ~
+  ~       http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~  Unless required by applicable law or agreed to in writing, software
+  ~  distributed under the License is distributed on an "AS IS" BASIS,
+  ~  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~  See the License for the specific language governing permissions and
+  ~  limitations under the License.
+  -->
+
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <!-- Context listeners -->
+    <contextListener class="io.seata.server.logging.listener.SystemPropertyLoggerContextListener"/>
+    <!-- common properties -->
+    <springProperty name="PORT" source="server.port" defaultValue="7091"/>
+    <springProperty name="APPLICATION_NAME" source="spring.application.name" defaultValue="seata-server"/>
+
+    <!-- 鏃ュ織瀛樻斁璺緞 -->
+    <property name="log.path" value="logs/${project.artifactId}"/>
+    <!-- 鏃ュ織杈撳嚭鏍煎紡 -->
+    <property name="console.log.pattern"
+              value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/>
+
+    <!-- 鎺у埗鍙拌緭鍑� -->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>${console.log.pattern}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+    </appender>
+
+    <include resource="logback-common.xml" />
+
+    <include resource="logback-logstash.xml" />
+
+    <!-- 寮�鍚� skywalking 鏃ュ織鏀堕泦 -->
+    <include resource="logback-skylog.xml" />
+
+    <root level="INFO">
+        <appender-ref ref="console"/>
+    </root>
+</configuration>
diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/resources/redislocker/redislock.lua b/ruoyi-visual/ruoyi-seata-server/src/main/resources/redislocker/redislock.lua
new file mode 100644
index 0000000..b004408
--- /dev/null
+++ b/ruoyi-visual/ruoyi-seata-server/src/main/resources/redislocker/redislock.lua
@@ -0,0 +1,52 @@
+--
+-- User: tianyu.li
+-- Date: 2021/1/19
+--
+-- init data
+local array = {}; local result; local keySize = ARGV[1]; local argSize = ARGV[2];
+-- Loop through all keys to see if they can be used , when a key is not available, exit
+for i= 1, keySize do
+    -- search lock xid
+    result = redis.call('HGET',KEYS[i],'xid');
+    -- if lock xid is nil
+    if (not result)
+        -- set 'no' mean There is need to store lock information
+        then array[i]='no'
+        else
+           if (result ~= ARGV[3])
+           then
+               -- return fail
+               return result
+           else
+               -- set 'yes' mean  There is not need to store lock information
+               array[i]= 'yes'
+           end
+    end
+end
+-- Loop through array
+for i =1, keySize do
+    -- if is no ,The lock information is stored
+    if(array[i] == 'no')
+        then
+            -- set xid
+            redis.call('HSET',KEYS[i],'xid',ARGV[3]);
+            -- set transactionId
+            redis.call('HSET',KEYS[i],'transactionId',ARGV[(i-1)*6+4]);
+            -- set branchId
+            redis.call('HSET',KEYS[i],'branchId',ARGV[(i-1)*6+5]);
+            -- set resourceId
+            redis.call('HSET',KEYS[i],'resourceId',ARGV[(i-1)*6+6]);
+            -- set tableName
+            redis.call('HSET',KEYS[i],'tableName',ARGV[(i-1)*6+7]);
+            -- set rowKey
+            redis.call('HSET',KEYS[i],'rowKey',ARGV[(i-1)*6+8]);
+            -- set pk
+            redis.call('HSET',KEYS[i],'pk',ARGV[(i-1)*6+9]);
+    -- exit if
+    end
+-- exit for
+end
+-- set SEATA_GLOBAL_LOCK
+redis.call('HSET',KEYS[(keySize+1)],KEYS[(keySize+2)],ARGV[(argSize+0)]);
+--  return success
+return ARGV[3]
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/Dockerfile b/ruoyi-visual/ruoyi-sentinel-dashboard/Dockerfile
new file mode 100644
index 0000000..ef50b90
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/Dockerfile
@@ -0,0 +1,20 @@
+#FROM findepi/graalvm:java17-native
+FROM openjdk:17.0.2-oraclelinux8
+
+MAINTAINER Lion Li
+
+RUN mkdir -p /ruoyi/sentinel-dashboard/logs \
+    /ruoyi/skywalking/agent
+
+WORKDIR /ruoyi/sentinel-dashboard
+
+ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS=""
+
+EXPOSE 8718
+
+ADD ./target/ruoyi-sentinel-dashboard.jar ./app.jar
+
+ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom \
+           #-Dskywalking.agent.service_name=ruoyi-sentinel-dashboard \
+           #-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar \
+           -jar app.jar ${JAVA_OPTS}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/pom.xml b/ruoyi-visual/ruoyi-sentinel-dashboard/pom.xml
new file mode 100644
index 0000000..3f09b8d
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/pom.xml
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.dromara</groupId>
+        <artifactId>ruoyi-visual</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>ruoyi-sentinel-dashboard</artifactId>
+    <packaging>jar</packaging>
+
+    <properties>
+        <sentinel.version>1.8.6</sentinel.version>
+        <curator.version>4.0.1</curator.version>
+        <spring-boot.version>2.7.18</spring-boot.version>
+        <spring-cloud.version>2021.0.7</spring-cloud.version>
+        <spring-cloud-alibaba.version>2021.0.4.0</spring-cloud-alibaba.version>
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-dependencies</artifactId>
+                <version>${spring-cloud.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>com.alibaba.cloud</groupId>
+                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
+                <version>${spring-cloud-alibaba.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+
+        <!-- SpringCloud Alibaba Nacos -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+
+        <!-- SpringCloud Alibaba Nacos Config -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.csp</groupId>
+            <artifactId>sentinel-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.csp</groupId>
+            <artifactId>sentinel-web-servlet</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.csp</groupId>
+            <artifactId>sentinel-transport-simple-http</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.csp</groupId>
+            <artifactId>sentinel-parameter-flow-control</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.csp</groupId>
+            <artifactId>sentinel-api-gateway-adapter-common</artifactId>
+        </dependency>
+
+        <!-- SpringBoot Web瀹瑰櫒 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>spring-boot-starter-tomcat</artifactId>
+                    <groupId>org.springframework.boot</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>*</artifactId>
+                    <groupId>org.apache.logging.log4j</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!-- web 瀹瑰櫒浣跨敤 undertow 鎬ц兘鏇村己 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-undertow</artifactId>
+        </dependency>
+
+        <!-- starter-actuator -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+            <version>2.6</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpcore</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpasyncclient</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpcore-nio</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <finalName>${project.artifactId}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>${spring-boot.version}</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/DashboardApplication.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/DashboardApplication.java
new file mode 100644
index 0000000..f748646
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/DashboardApplication.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard;
+
+import com.alibaba.csp.sentinel.init.InitExecutor;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * Sentinel dashboard application.
+ *
+ * @author Carpenter Lee
+ */
+@SpringBootApplication
+public class DashboardApplication {
+
+    public static void main(String[] args) {
+        triggerSentinelInit();
+        SpringApplication.run(DashboardApplication.class, args);
+    }
+
+    private static void triggerSentinelInit() {
+        new Thread(() -> InitExecutor.doInit()).start();
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/AuthAction.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/AuthAction.java
new file mode 100644
index 0000000..f521c04
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/AuthAction.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.auth;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @author lkxiaolou
+ * @since 1.7.1
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Target({ElementType.METHOD})
+public @interface AuthAction {
+
+    /**
+     * @return the privilege type
+     */
+    AuthService.PrivilegeType value();
+
+    /**
+     * @return the target name to control
+     */
+    String targetName() default "app";
+
+    /**
+     * @return the message when permission is denied
+     */
+    String message() default "Permission denied";
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/AuthService.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/AuthService.java
new file mode 100644
index 0000000..cdda6a3
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/AuthService.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.auth;
+
+/**
+ * Interface for authentication and authorization.
+ *
+ * @author Carpenter Lee
+ * @since 1.5.0
+ */
+public interface AuthService<R> {
+
+    /**
+     * Get the authentication user.
+     *
+     * @param request the request contains the user information
+     * @return the auth user represent the current user, when the user is illegal, a null value will return.
+     */
+    AuthUser getAuthUser(R request);
+
+    /**
+     * Privilege type.
+     */
+    enum PrivilegeType {
+        /**
+         * Read rule
+         */
+        READ_RULE,
+        /**
+         * Create or modify rule
+         */
+        WRITE_RULE,
+        /**
+         * Delete rule
+         */
+        DELETE_RULE,
+        /**
+         * Read metrics
+         */
+        READ_METRIC,
+        /**
+         * Add machine
+         */
+        ADD_MACHINE,
+        /**
+         * All privileges above are granted.
+         */
+        ALL
+    }
+
+    /**
+     * Represents the current user.
+     */
+    interface AuthUser {
+
+        /**
+         * Query whether current user has the specific privilege to the target, the target
+         * may be an app name or an ip address, or other destination.
+         * <p>
+         * This method will use return value to represent  whether user has the specific
+         * privileges to the target, but to throw a RuntimeException to represent no auth
+         * is also a good way.
+         * </p>
+         *
+         * @param target        the target to check
+         * @param privilegeType the privilege type to check
+         * @return if current user has the specific privileges to the target, return true,
+         * otherwise return false.
+         */
+        boolean authTarget(String target, PrivilegeType privilegeType);
+
+        /**
+         * Check whether current user is a super-user.
+         *
+         * @return if current user is super user return true, else return false.
+         */
+        boolean isSuperUser();
+
+        /**
+         * Get current user's nick name.
+         *
+         * @return current user's nick name.
+         */
+        String getNickName();
+
+        /**
+         * Get current user's login name.
+         *
+         * @return current user's login name.
+         */
+        String getLoginName();
+
+        /**
+         * Get current user's ID.
+         *
+         * @return ID of current user
+         */
+        String getId();
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/AuthorizationInterceptor.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/AuthorizationInterceptor.java
new file mode 100644
index 0000000..0df32a6
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/AuthorizationInterceptor.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.auth;
+
+import org.springframework.web.servlet.HandlerInterceptor;
+
+/**
+ * The web interceptor for privilege-based authorization.
+ *
+ * @author lkxiaolou
+ * @author wxq
+ * @since 1.7.1
+ */
+public interface AuthorizationInterceptor extends HandlerInterceptor {
+
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/DefaultAuthorizationInterceptor.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/DefaultAuthorizationInterceptor.java
new file mode 100644
index 0000000..131e646
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/DefaultAuthorizationInterceptor.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.auth;
+
+import com.alibaba.csp.sentinel.dashboard.domain.Result;
+import com.alibaba.fastjson.JSON;
+import org.springframework.web.method.HandlerMethod;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.lang.reflect.Method;
+
+/**
+ * The web interceptor for privilege-based authorization.
+ * <p>
+ * move from old {@link AuthorizationInterceptor}.
+ *
+ * @author lkxiaolou
+ * @author wxq
+ * @since 1.7.1
+ */
+public class DefaultAuthorizationInterceptor implements AuthorizationInterceptor {
+
+    private final AuthService<HttpServletRequest> authService;
+
+    public DefaultAuthorizationInterceptor(AuthService<HttpServletRequest> authService) {
+        this.authService = authService;
+    }
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
+            throws Exception {
+        if (handler.getClass().isAssignableFrom(HandlerMethod.class)) {
+            Method method = ((HandlerMethod) handler).getMethod();
+
+            AuthAction authAction = method.getAnnotation(AuthAction.class);
+            if (authAction != null) {
+                AuthService.AuthUser authUser = authService.getAuthUser(request);
+                if (authUser == null) {
+                    responseNoPrivilegeMsg(response, authAction.message());
+                    return false;
+                }
+                String target = request.getParameter(authAction.targetName());
+
+                if (!authUser.authTarget(target, authAction.value())) {
+                    responseNoPrivilegeMsg(response, authAction.message());
+                    return false;
+                }
+            }
+        }
+
+        return true;
+    }
+
+    private void responseNoPrivilegeMsg(HttpServletResponse response, String message) throws IOException {
+        Result result = Result.ofFail(-1, message);
+        response.addHeader("Content-Type", "application/json;charset=UTF-8");
+        response.getOutputStream().write(JSON.toJSONBytes(result));
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/DefaultLoginAuthenticationFilter.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/DefaultLoginAuthenticationFilter.java
new file mode 100644
index 0000000..774dab3
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/DefaultLoginAuthenticationFilter.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.auth;
+
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpStatus;
+import org.springframework.util.AntPathMatcher;
+
+import javax.servlet.*;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * <p>The Servlet filter for authentication.</p>
+ *
+ * <p>Note: some urls are excluded as they needn't auth, such as:</p>
+ * <ul>
+ * <li>index url: {@code /}</li>
+ * <li>authentication request url: {@code /login}, {@code /logout}</li>
+ * <li>machine registry: {@code /registry/machine}</li>
+ * <li>static resources</li>
+ * </ul>
+ * <p>
+ * The excluded urls and urlSuffixes could be configured in {@code application.properties} file.
+ *
+ * @author cdfive
+ * @since 1.6.0
+ */
+public class DefaultLoginAuthenticationFilter implements LoginAuthenticationFilter {
+
+    private static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
+
+    private static final String URL_SUFFIX_DOT = ".";
+
+    /**
+     * Some urls which needn't auth, such as /auth/login, /registry/machine and so on.
+     */
+    @Value("#{'${auth.filter.exclude-urls}'.split(',')}")
+    private List<String> authFilterExcludeUrls;
+
+    /**
+     * Some urls with suffixes which needn't auth, such as htm, html, js and so on.
+     */
+    @Value("#{'${auth.filter.exclude-url-suffixes}'.split(',')}")
+    private List<String> authFilterExcludeUrlSuffixes;
+
+    /**
+     * Authentication using AuthService interface.
+     */
+    private final AuthService<HttpServletRequest> authService;
+
+    public DefaultLoginAuthenticationFilter(AuthService<HttpServletRequest> authService) {
+        this.authService = authService;
+    }
+
+    @Override
+    public void init(FilterConfig filterConfig) throws ServletException {
+
+    }
+
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+            throws IOException, ServletException {
+        HttpServletRequest httpRequest = (HttpServletRequest) request;
+
+        String servletPath = httpRequest.getServletPath();
+
+        // Exclude the urls which needn't auth
+        boolean authFilterExcludeMatch = authFilterExcludeUrls.stream()
+                .anyMatch(authFilterExcludeUrl -> PATH_MATCHER.match(authFilterExcludeUrl, servletPath));
+        if (authFilterExcludeMatch) {
+            chain.doFilter(request, response);
+            return;
+        }
+
+        // Exclude the urls with suffixes which needn't auth
+        for (String authFilterExcludeUrlSuffix : authFilterExcludeUrlSuffixes) {
+            if (StringUtils.isBlank(authFilterExcludeUrlSuffix)) {
+                continue;
+            }
+
+            // Add . for url suffix so that we needn't add . in property file
+            if (!authFilterExcludeUrlSuffix.startsWith(URL_SUFFIX_DOT)) {
+                authFilterExcludeUrlSuffix = URL_SUFFIX_DOT + authFilterExcludeUrlSuffix;
+            }
+
+            if (servletPath.endsWith(authFilterExcludeUrlSuffix)) {
+                chain.doFilter(request, response);
+                return;
+            }
+        }
+
+        AuthService.AuthUser authUser = authService.getAuthUser(httpRequest);
+
+        HttpServletResponse httpResponse = (HttpServletResponse) response;
+        if (authUser == null) {
+            // If auth fail, set response status code to 401
+            httpResponse.setStatus(HttpStatus.UNAUTHORIZED.value());
+        } else {
+            chain.doFilter(request, response);
+        }
+    }
+
+    @Override
+    public void destroy() {
+
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/FakeAuthServiceImpl.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/FakeAuthServiceImpl.java
new file mode 100644
index 0000000..8d286a7
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/FakeAuthServiceImpl.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.auth;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * A fake AuthService implementation, which will pass all user auth checking.
+ *
+ * @author Carpenter Lee
+ * @since 1.5.0
+ */
+public class FakeAuthServiceImpl implements AuthService<HttpServletRequest> {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    public FakeAuthServiceImpl() {
+        this.logger.warn("there is no auth, use {} by implementation {}", AuthService.class, this.getClass());
+    }
+
+    @Override
+    public AuthUser getAuthUser(HttpServletRequest request) {
+        return new AuthUserImpl();
+    }
+
+    static final class AuthUserImpl implements AuthUser {
+
+        @Override
+        public boolean authTarget(String target, PrivilegeType privilegeType) {
+            // fake implementation, always return true
+            return true;
+        }
+
+        @Override
+        public boolean isSuperUser() {
+            // fake implementation, always return true
+            return true;
+        }
+
+        @Override
+        public String getNickName() {
+            return "FAKE_NICK_NAME";
+        }
+
+        @Override
+        public String getLoginName() {
+            return "FAKE_LOGIN_NAME";
+        }
+
+        @Override
+        public String getId() {
+            return "FAKE_EMP_ID";
+        }
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/LoginAuthenticationFilter.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/LoginAuthenticationFilter.java
new file mode 100644
index 0000000..cbf9409
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/LoginAuthenticationFilter.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.auth;
+
+import javax.servlet.Filter;
+
+/**
+ * <p>The Servlet filter for authentication.</p>
+ *
+ * <p>Note: some urls are excluded as they needn't auth, such as:</p>
+ * <ul>
+ * <li>index url: {@code /}</li>
+ * <li>authentication request url: {@code /login}, {@code /logout}</li>
+ * <li>machine registry: {@code /registry/machine}</li>
+ * <li>static resources</li>
+ * </ul>
+ * <p>
+ * The excluded urls and urlSuffixes could be configured in {@code application.properties} file.
+ *
+ * @author cdfive
+ * @author wxq
+ * @since 1.6.0
+ */
+public interface LoginAuthenticationFilter extends Filter {
+
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/SimpleWebAuthServiceImpl.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/SimpleWebAuthServiceImpl.java
new file mode 100644
index 0000000..10c386b
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/SimpleWebAuthServiceImpl.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.auth;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+/**
+ * @author cdfive
+ * @since 1.6.0
+ */
+public class SimpleWebAuthServiceImpl implements AuthService<HttpServletRequest> {
+
+    public static final String WEB_SESSION_KEY = "session_sentinel_admin";
+
+    @Override
+    public AuthUser getAuthUser(HttpServletRequest request) {
+        HttpSession session = request.getSession();
+        Object sentinelUserObj = session.getAttribute(SimpleWebAuthServiceImpl.WEB_SESSION_KEY);
+        if (sentinelUserObj != null && sentinelUserObj instanceof AuthUser) {
+            return (AuthUser) sentinelUserObj;
+        }
+
+        return null;
+    }
+
+    public static final class SimpleWebAuthUserImpl implements AuthUser {
+
+        private String username;
+
+        public SimpleWebAuthUserImpl(String username) {
+            this.username = username;
+        }
+
+        @Override
+        public boolean authTarget(String target, PrivilegeType privilegeType) {
+            return true;
+        }
+
+        @Override
+        public boolean isSuperUser() {
+            return true;
+        }
+
+        @Override
+        public String getNickName() {
+            return username;
+        }
+
+        @Override
+        public String getLoginName() {
+            return username;
+        }
+
+        @Override
+        public String getId() {
+            return username;
+        }
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/CommandFailedException.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/CommandFailedException.java
new file mode 100644
index 0000000..76b6aeb
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/CommandFailedException.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.client;
+
+/**
+ * @author Eric Zhao
+ */
+public class CommandFailedException extends RuntimeException {
+
+    public CommandFailedException() {}
+
+    public CommandFailedException(String message) {
+        super(message);
+    }
+
+    @Override
+    public synchronized Throwable fillInStackTrace() {
+        return this;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/CommandNotFoundException.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/CommandNotFoundException.java
new file mode 100644
index 0000000..0db9568
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/CommandNotFoundException.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.client;
+
+/**
+ * @author Eric Zhao
+ * @since 0.2.1
+ */
+public class CommandNotFoundException extends Exception {
+
+    public CommandNotFoundException() { }
+
+    public CommandNotFoundException(String message) {
+        super(message);
+    }
+
+    @Override
+    public synchronized Throwable fillInStackTrace() {
+        return this;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/SentinelApiClient.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/SentinelApiClient.java
new file mode 100644
index 0000000..7d5ac17
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/SentinelApiClient.java
@@ -0,0 +1,849 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.client;
+
+import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule;
+import com.alibaba.csp.sentinel.command.CommandConstants;
+import com.alibaba.csp.sentinel.command.vo.NodeVo;
+import com.alibaba.csp.sentinel.config.SentinelConfig;
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.SentinelVersion;
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.ApiDefinitionEntity;
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.GatewayFlowRuleEntity;
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.*;
+import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.ClusterClientInfoVO;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ClusterClientConfig;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ServerFlowConfig;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ServerTransportConfig;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.state.ClusterServerStateVO;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.state.ClusterStateSimpleEntity;
+import com.alibaba.csp.sentinel.dashboard.util.AsyncUtils;
+import com.alibaba.csp.sentinel.dashboard.util.VersionUtils;
+import com.alibaba.csp.sentinel.slots.block.Rule;
+import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule;
+import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule;
+import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
+import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule;
+import com.alibaba.csp.sentinel.slots.system.SystemRule;
+import com.alibaba.csp.sentinel.util.AssertUtil;
+import com.alibaba.csp.sentinel.util.StringUtil;
+import com.alibaba.fastjson.JSON;
+import org.apache.http.Consts;
+import org.apache.http.HttpResponse;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.client.utils.URLEncodedUtils;
+import org.apache.http.concurrent.FutureCallback;
+import org.apache.http.conn.util.InetAddressUtils;
+import org.apache.http.entity.ContentType;
+import org.apache.http.impl.client.DefaultRedirectStrategy;
+import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
+import org.apache.http.impl.nio.client.HttpAsyncClients;
+import org.apache.http.impl.nio.reactor.IOReactorConfig;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.lang.Nullable;
+import org.springframework.stereotype.Component;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.nio.charset.Charset;
+import java.util.*;
+import java.util.Map.Entry;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.stream.Collectors;
+
+/**
+ * Communicate with Sentinel client.
+ *
+ * @author leyou
+ */
+@Component
+public class SentinelApiClient {
+    private static Logger logger = LoggerFactory.getLogger(SentinelApiClient.class);
+
+    private static final Charset DEFAULT_CHARSET = Charset.forName(SentinelConfig.charset());
+    private static final String HTTP_HEADER_CONTENT_TYPE = "Content-Type";
+    private static final String HTTP_HEADER_CONTENT_TYPE_URLENCODED = ContentType.create(URLEncodedUtils.CONTENT_TYPE).toString();
+
+    private static final String RESOURCE_URL_PATH = "jsonTree";
+    private static final String CLUSTER_NODE_PATH = "clusterNode";
+    private static final String GET_RULES_PATH = "getRules";
+    private static final String SET_RULES_PATH = "setRules";
+    private static final String GET_PARAM_RULE_PATH = "getParamFlowRules";
+    private static final String SET_PARAM_RULE_PATH = "setParamFlowRules";
+
+    private static final String FETCH_CLUSTER_MODE_PATH = "getClusterMode";
+    private static final String MODIFY_CLUSTER_MODE_PATH = "setClusterMode";
+    private static final String FETCH_CLUSTER_CLIENT_CONFIG_PATH = "cluster/client/fetchConfig";
+    private static final String MODIFY_CLUSTER_CLIENT_CONFIG_PATH = "cluster/client/modifyConfig";
+
+    private static final String FETCH_CLUSTER_SERVER_BASIC_INFO_PATH = "cluster/server/info";
+
+    private static final String MODIFY_CLUSTER_SERVER_TRANSPORT_CONFIG_PATH = "cluster/server/modifyTransportConfig";
+    private static final String MODIFY_CLUSTER_SERVER_FLOW_CONFIG_PATH = "cluster/server/modifyFlowConfig";
+    private static final String MODIFY_CLUSTER_SERVER_NAMESPACE_SET_PATH = "cluster/server/modifyNamespaceSet";
+
+    private static final String FETCH_GATEWAY_API_PATH = "gateway/getApiDefinitions";
+    private static final String MODIFY_GATEWAY_API_PATH = "gateway/updateApiDefinitions";
+
+    private static final String FETCH_GATEWAY_FLOW_RULE_PATH = "gateway/getRules";
+    private static final String MODIFY_GATEWAY_FLOW_RULE_PATH = "gateway/updateRules";
+
+    private static final String FLOW_RULE_TYPE = "flow";
+    private static final String DEGRADE_RULE_TYPE = "degrade";
+    private static final String SYSTEM_RULE_TYPE = "system";
+    private static final String AUTHORITY_TYPE = "authority";
+
+    private CloseableHttpAsyncClient httpClient;
+
+    private static final SentinelVersion version160 = new SentinelVersion(1, 6, 0);
+    private static final SentinelVersion version171 = new SentinelVersion(1, 7, 1);
+
+    @Autowired
+    private AppManagement appManagement;
+
+    public SentinelApiClient() {
+        IOReactorConfig ioConfig = IOReactorConfig.custom().setConnectTimeout(3000).setSoTimeout(10000)
+            .setIoThreadCount(Runtime.getRuntime().availableProcessors() * 2).build();
+        httpClient = HttpAsyncClients.custom().setRedirectStrategy(new DefaultRedirectStrategy() {
+            @Override
+            protected boolean isRedirectable(final String method) {
+                return false;
+            }
+        }).setMaxConnTotal(4000).setMaxConnPerRoute(1000).setDefaultIOReactorConfig(ioConfig).build();
+        httpClient.start();
+    }
+
+    private boolean isSuccess(int statusCode) {
+        return statusCode >= 200 && statusCode < 300;
+    }
+
+    private boolean isCommandNotFound(int statusCode, String body) {
+        return statusCode == 400 && StringUtil.isNotEmpty(body) && body.contains(CommandConstants.MSG_UNKNOWN_COMMAND_PREFIX);
+    }
+
+    protected boolean isSupportPost(String app, String ip, int port) {
+        return StringUtil.isNotEmpty(app) && Optional.ofNullable(appManagement.getDetailApp(app))
+                .flatMap(e -> e.getMachine(ip, port))
+                .flatMap(m -> VersionUtils.parseVersion(m.getVersion())
+                    .map(v -> v.greaterOrEqual(version160)))
+                .orElse(false);
+    }
+
+    /**
+     * Check whether target instance (identified by tuple of app-ip:port)
+     * supports the form of "xxxxx; xx=xx" in "Content-Type" header.
+     *
+     * @param app target app name
+     * @param ip target node's address
+     * @param port target node's port
+     */
+    protected boolean isSupportEnhancedContentType(String app, String ip, int port) {
+        return StringUtil.isNotEmpty(app) && Optional.ofNullable(appManagement.getDetailApp(app))
+                .flatMap(e -> e.getMachine(ip, port))
+                .flatMap(m -> VersionUtils.parseVersion(m.getVersion())
+                    .map(v -> v.greaterOrEqual(version171)))
+                .orElse(false);
+    }
+
+    private StringBuilder queryString(Map<String, String> params) {
+        StringBuilder queryStringBuilder = new StringBuilder();
+        for (Entry<String, String> entry : params.entrySet()) {
+            if (StringUtil.isEmpty(entry.getValue())) {
+                continue;
+            }
+            String name = urlEncode(entry.getKey());
+            String value = urlEncode(entry.getValue());
+            if (name != null && value != null) {
+                if (queryStringBuilder.length() > 0) {
+                    queryStringBuilder.append('&');
+                }
+                queryStringBuilder.append(name).append('=').append(value);
+            }
+        }
+        return queryStringBuilder;
+    }
+
+    /**
+     * Build an `HttpUriRequest` in POST way.
+     *
+     * @param url
+     * @param params
+     * @param supportEnhancedContentType see {@link #isSupportEnhancedContentType(String, String, int)}
+     * @return
+     */
+    protected static HttpUriRequest postRequest(String url, Map<String, String> params, boolean supportEnhancedContentType) {
+        HttpPost httpPost = new HttpPost(url);
+        if (params != null && params.size() > 0) {
+            List<NameValuePair> list = new ArrayList<>(params.size());
+            for (Entry<String, String> entry : params.entrySet()) {
+                list.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
+            }
+            httpPost.setEntity(new UrlEncodedFormEntity(list, Consts.UTF_8));
+            if (!supportEnhancedContentType) {
+                httpPost.setHeader(HTTP_HEADER_CONTENT_TYPE, HTTP_HEADER_CONTENT_TYPE_URLENCODED);
+            }
+        }
+        return httpPost;
+    }
+
+    private String urlEncode(String str) {
+        try {
+            return URLEncoder.encode(str, DEFAULT_CHARSET.name());
+        } catch (UnsupportedEncodingException e) {
+            logger.info("encode string error: {}", str, e);
+            return null;
+        }
+    }
+
+    private String getBody(HttpResponse response) throws Exception {
+        Charset charset = null;
+        try {
+            String contentTypeStr = response.getFirstHeader(HTTP_HEADER_CONTENT_TYPE).getValue();
+            if (StringUtil.isNotEmpty(contentTypeStr)) {
+                ContentType contentType = ContentType.parse(contentTypeStr);
+                charset = contentType.getCharset();
+            }
+        } catch (Exception ignore) {
+        }
+        return EntityUtils.toString(response.getEntity(), charset != null ? charset : DEFAULT_CHARSET);
+    }
+
+    /**
+     * With no param
+     *
+     * @param ip
+     * @param port
+     * @param api
+     * @return
+     */
+    private CompletableFuture<String> executeCommand(String ip, int port, String api, boolean useHttpPost) {
+        return executeCommand(ip, port, api, null, useHttpPost);
+    }
+
+    /**
+     * No app specified, force to GET
+     *
+     * @param ip
+     * @param port
+     * @param api
+     * @param params
+     * @return
+     */
+    private CompletableFuture<String> executeCommand(String ip, int port, String api, Map<String, String> params, boolean useHttpPost) {
+        return executeCommand(null, ip, port, api, params, useHttpPost);
+    }
+
+    /**
+     * Prefer to execute request using POST
+     *
+     * @param app
+     * @param ip
+     * @param port
+     * @param api
+     * @param params
+     * @return
+     */
+    private CompletableFuture<String> executeCommand(String app, String ip, int port, String api, Map<String, String> params, boolean useHttpPost) {
+        CompletableFuture<String> future = new CompletableFuture<>();
+        if (StringUtil.isBlank(ip) || StringUtil.isBlank(api)) {
+            future.completeExceptionally(new IllegalArgumentException("Bad URL or command name"));
+            return future;
+        }
+        if (!InetAddressUtils.isIPv4Address(ip) && !InetAddressUtils.isIPv6Address(ip)) {
+            future.completeExceptionally(new IllegalArgumentException("Bad IP"));
+            return future;
+        }
+        if (!StringUtil.isEmpty(app) && !appManagement.isValidMachineOfApp(app, ip)) {
+            future.completeExceptionally(new IllegalArgumentException("Given ip does not belong to given app"));
+            return future;
+        }
+        StringBuilder urlBuilder = new StringBuilder();
+        urlBuilder.append("http://");
+        urlBuilder.append(ip).append(':').append(port).append('/').append(api);
+        if (params == null) {
+            params = Collections.emptyMap();
+        }
+        if (!useHttpPost || !isSupportPost(app, ip, port)) {
+            // Using GET in older versions, append parameters after url
+            if (!params.isEmpty()) {
+                if (urlBuilder.indexOf("?") == -1) {
+                    urlBuilder.append('?');
+                } else {
+                    urlBuilder.append('&');
+                }
+                urlBuilder.append(queryString(params));
+            }
+            return executeCommand(new HttpGet(urlBuilder.toString()));
+        } else {
+            // Using POST
+            return executeCommand(
+                    postRequest(urlBuilder.toString(), params, isSupportEnhancedContentType(app, ip, port)));
+        }
+    }
+
+    private CompletableFuture<String> executeCommand(HttpUriRequest request) {
+        CompletableFuture<String> future = new CompletableFuture<>();
+        httpClient.execute(request, new FutureCallback<HttpResponse>() {
+            @Override
+            public void completed(final HttpResponse response) {
+                int statusCode = response.getStatusLine().getStatusCode();
+                try {
+                    String value = getBody(response);
+                    if (isSuccess(statusCode)) {
+                        future.complete(value);
+                    } else {
+                        if (isCommandNotFound(statusCode, value)) {
+                            future.completeExceptionally(new CommandNotFoundException(request.getURI().getPath()));
+                        } else {
+                            future.completeExceptionally(new CommandFailedException(value));
+                        }
+                    }
+
+                } catch (Exception ex) {
+                    future.completeExceptionally(ex);
+                    logger.error("HTTP request failed: {}", request.getURI().toString(), ex);
+                }
+            }
+
+            @Override
+            public void failed(final Exception ex) {
+                future.completeExceptionally(ex);
+                logger.error("HTTP request failed: {}", request.getURI().toString(), ex);
+            }
+
+            @Override
+            public void cancelled() {
+                future.complete(null);
+            }
+        });
+        return future;
+    }
+
+    public void close() throws Exception {
+        httpClient.close();
+    }
+
+    @Nullable
+    private <T> CompletableFuture<List<T>> fetchItemsAsync(String ip, int port, String api, String type, Class<T> ruleType) {
+        AssertUtil.notEmpty(ip, "Bad machine IP");
+        AssertUtil.isTrue(port > 0, "Bad machine port");
+        Map<String, String> params = null;
+        if (StringUtil.isNotEmpty(type)) {
+            params = new HashMap<>(1);
+            params.put("type", type);
+        }
+        return executeCommand(ip, port, api, params, false)
+                .thenApply(json -> JSON.parseArray(json, ruleType));
+    }
+
+    @Nullable
+    private <T> List<T> fetchItems(String ip, int port, String api, String type, Class<T> ruleType) {
+        try {
+            AssertUtil.notEmpty(ip, "Bad machine IP");
+            AssertUtil.isTrue(port > 0, "Bad machine port");
+            Map<String, String> params = null;
+            if (StringUtil.isNotEmpty(type)) {
+                params = new HashMap<>(1);
+                params.put("type", type);
+            }
+            return fetchItemsAsync(ip, port, api, type, ruleType).get();
+        } catch (InterruptedException | ExecutionException e) {
+            logger.error("Error when fetching items from api: {} -> {}", api, type, e);
+            return null;
+        } catch (Exception e) {
+            logger.error("Error when fetching items: {} -> {}", api, type, e);
+            return null;
+        }
+    }
+
+    private <T extends Rule> List<T> fetchRules(String ip, int port, String type, Class<T> ruleType) {
+        return fetchItems(ip, port, GET_RULES_PATH, type, ruleType);
+    }
+
+    private boolean setRules(String app, String ip, int port, String type, List<? extends RuleEntity> entities) {
+        if (entities == null) {
+            return true;
+        }
+        try {
+            AssertUtil.notEmpty(app, "Bad app name");
+            AssertUtil.notEmpty(ip, "Bad machine IP");
+            AssertUtil.isTrue(port > 0, "Bad machine port");
+            String data = JSON.toJSONString(
+                    entities.stream().map(r -> r.toRule()).collect(Collectors.toList()));
+            Map<String, String> params = new HashMap<>(2);
+            params.put("type", type);
+            params.put("data", data);
+            String result = executeCommand(app, ip, port, SET_RULES_PATH, params, true).get();
+            logger.info("setRules result: {}, type={}", result, type);
+            return true;
+        } catch (InterruptedException e) {
+            logger.warn("setRules API failed: {}", type, e);
+            return false;
+        } catch (ExecutionException e) {
+            logger.warn("setRules API failed: {}", type, e.getCause());
+            return false;
+        } catch (Exception e) {
+            logger.error("setRules API failed, type={}", type, e);
+            return false;
+        }
+    }
+
+    private CompletableFuture<Void> setRulesAsync(String app, String ip, int port, String type, List<? extends RuleEntity> entities) {
+        try {
+            AssertUtil.notNull(entities, "rules cannot be null");
+            AssertUtil.notEmpty(app, "Bad app name");
+            AssertUtil.notEmpty(ip, "Bad machine IP");
+            AssertUtil.isTrue(port > 0, "Bad machine port");
+            String data = JSON.toJSONString(
+                entities.stream().map(r -> r.toRule()).collect(Collectors.toList()));
+            Map<String, String> params = new HashMap<>(2);
+            params.put("type", type);
+            params.put("data", data);
+            return executeCommand(app, ip, port, SET_RULES_PATH, params, true)
+                .thenCompose(r -> {
+                    if ("success".equalsIgnoreCase(r.trim())) {
+                        return CompletableFuture.completedFuture(null);
+                    }
+                    return AsyncUtils.newFailedFuture(new CommandFailedException(r));
+                });
+        } catch (Exception e) {
+            logger.error("setRulesAsync API failed, type={}", type, e);
+            return AsyncUtils.newFailedFuture(e);
+        }
+    }
+
+    public List<NodeVo> fetchResourceOfMachine(String ip, int port, String type) {
+        return fetchItems(ip, port, RESOURCE_URL_PATH, type, NodeVo.class);
+    }
+
+    /**
+     * Fetch cluster node.
+     *
+     * @param ip          ip to fetch
+     * @param port        port of the ip
+     * @param includeZero whether zero value should in the result list.
+     * @return
+     */
+    public List<NodeVo> fetchClusterNodeOfMachine(String ip, int port, boolean includeZero) {
+        String type = "notZero";
+        if (includeZero) {
+            type = "zero";
+        }
+        return fetchItems(ip, port, CLUSTER_NODE_PATH, type, NodeVo.class);
+    }
+
+    public List<FlowRuleEntity> fetchFlowRuleOfMachine(String app, String ip, int port) {
+        List<FlowRule> rules = fetchRules(ip, port, FLOW_RULE_TYPE, FlowRule.class);
+        if (rules != null) {
+            return rules.stream().map(rule -> FlowRuleEntity.fromFlowRule(app, ip, port, rule))
+                .collect(Collectors.toList());
+        } else {
+            return null;
+        }
+    }
+
+    public List<DegradeRuleEntity> fetchDegradeRuleOfMachine(String app, String ip, int port) {
+        List<DegradeRule> rules = fetchRules(ip, port, DEGRADE_RULE_TYPE, DegradeRule.class);
+        if (rules != null) {
+            return rules.stream().map(rule -> DegradeRuleEntity.fromDegradeRule(app, ip, port, rule))
+                .collect(Collectors.toList());
+        } else {
+            return null;
+        }
+    }
+
+    public List<SystemRuleEntity> fetchSystemRuleOfMachine(String app, String ip, int port) {
+        List<SystemRule> rules = fetchRules(ip, port, SYSTEM_RULE_TYPE, SystemRule.class);
+        if (rules != null) {
+            return rules.stream().map(rule -> SystemRuleEntity.fromSystemRule(app, ip, port, rule))
+                .collect(Collectors.toList());
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Fetch all parameter flow rules from provided machine.
+     *
+     * @param app  application name
+     * @param ip   machine client IP
+     * @param port machine client port
+     * @return all retrieved parameter flow rules
+     * @since 0.2.1
+     */
+    public CompletableFuture<List<ParamFlowRuleEntity>> fetchParamFlowRulesOfMachine(String app, String ip, int port) {
+        try {
+            AssertUtil.notEmpty(app, "Bad app name");
+            AssertUtil.notEmpty(ip, "Bad machine IP");
+            AssertUtil.isTrue(port > 0, "Bad machine port");
+            return fetchItemsAsync(ip, port, GET_PARAM_RULE_PATH, null, ParamFlowRule.class)
+                .thenApply(rules -> rules.stream()
+                    .map(e -> ParamFlowRuleEntity.fromParamFlowRule(app, ip, port, e))
+                    .collect(Collectors.toList())
+                );
+        } catch (Exception e) {
+            logger.error("Error when fetching parameter flow rules", e);
+            return AsyncUtils.newFailedFuture(e);
+        }
+    }
+
+    /**
+     * Fetch all authority rules from provided machine.
+     *
+     * @param app  application name
+     * @param ip   machine client IP
+     * @param port machine client port
+     * @return all retrieved authority rules
+     * @since 0.2.1
+     */
+    public List<AuthorityRuleEntity> fetchAuthorityRulesOfMachine(String app, String ip, int port) {
+        AssertUtil.notEmpty(app, "Bad app name");
+        AssertUtil.notEmpty(ip, "Bad machine IP");
+        AssertUtil.isTrue(port > 0, "Bad machine port");
+        Map<String, String> params = new HashMap<>(1);
+        params.put("type", AUTHORITY_TYPE);
+        List<AuthorityRule> rules = fetchRules(ip, port, AUTHORITY_TYPE, AuthorityRule.class);
+        return Optional.ofNullable(rules).map(r -> r.stream()
+                    .map(e -> AuthorityRuleEntity.fromAuthorityRule(app, ip, port, e))
+                    .collect(Collectors.toList())
+                ).orElse(null);
+    }
+
+    /**
+     * set rules of the machine. rules == null will return immediately;
+     * rules.isEmpty() means setting the rules to empty.
+     *
+     * @param app
+     * @param ip
+     * @param port
+     * @param rules
+     * @return whether successfully set the rules.
+     */
+    public boolean setFlowRuleOfMachine(String app, String ip, int port, List<FlowRuleEntity> rules) {
+        return setRules(app, ip, port, FLOW_RULE_TYPE, rules);
+    }
+
+    public CompletableFuture<Void> setFlowRuleOfMachineAsync(String app, String ip, int port, List<FlowRuleEntity> rules) {
+        return setRulesAsync(app, ip, port, FLOW_RULE_TYPE, rules);
+    }
+
+    /**
+     * set rules of the machine. rules == null will return immediately;
+     * rules.isEmpty() means setting the rules to empty.
+     *
+     * @param app
+     * @param ip
+     * @param port
+     * @param rules
+     * @return whether successfully set the rules.
+     */
+    public boolean setDegradeRuleOfMachine(String app, String ip, int port, List<DegradeRuleEntity> rules) {
+        return setRules(app, ip, port, DEGRADE_RULE_TYPE, rules);
+    }
+
+    /**
+     * set rules of the machine. rules == null will return immediately;
+     * rules.isEmpty() means setting the rules to empty.
+     *
+     * @param app
+     * @param ip
+     * @param port
+     * @param rules
+     * @return whether successfully set the rules.
+     */
+    public boolean setSystemRuleOfMachine(String app, String ip, int port, List<SystemRuleEntity> rules) {
+        return setRules(app, ip, port, SYSTEM_RULE_TYPE, rules);
+    }
+
+    public boolean setAuthorityRuleOfMachine(String app, String ip, int port, List<AuthorityRuleEntity> rules) {
+        return setRules(app, ip, port, AUTHORITY_TYPE, rules);
+    }
+
+    public CompletableFuture<Void> setParamFlowRuleOfMachine(String app, String ip, int port, List<ParamFlowRuleEntity> rules) {
+        if (rules == null) {
+            return CompletableFuture.completedFuture(null);
+        }
+        if (StringUtil.isBlank(ip) || port <= 0) {
+            return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter"));
+        }
+        try {
+            String data = JSON.toJSONString(
+                rules.stream().map(ParamFlowRuleEntity::getRule).collect(Collectors.toList())
+            );
+            Map<String, String> params = new HashMap<>(1);
+            params.put("data", data);
+            return executeCommand(app, ip, port, SET_PARAM_RULE_PATH, params, true)
+                .thenCompose(e -> {
+                    if (CommandConstants.MSG_SUCCESS.equals(e)) {
+                        return CompletableFuture.completedFuture(null);
+                    } else {
+                        logger.warn("Push parameter flow rules to client failed: " + e);
+                        return AsyncUtils.newFailedFuture(new RuntimeException(e));
+                    }
+                });
+        } catch (Exception ex) {
+            logger.warn("Error when setting parameter flow rule", ex);
+            return AsyncUtils.newFailedFuture(ex);
+        }
+    }
+
+    // Cluster related
+
+    public CompletableFuture<ClusterStateSimpleEntity> fetchClusterMode(String ip, int port) {
+        if (StringUtil.isBlank(ip) || port <= 0) {
+            return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter"));
+        }
+        try {
+            return executeCommand(ip, port, FETCH_CLUSTER_MODE_PATH, false)
+                .thenApply(r -> JSON.parseObject(r, ClusterStateSimpleEntity.class));
+        } catch (Exception ex) {
+            logger.warn("Error when fetching cluster mode", ex);
+            return AsyncUtils.newFailedFuture(ex);
+        }
+    }
+
+    public CompletableFuture<Void> modifyClusterMode(String ip, int port, int mode) {
+        if (StringUtil.isBlank(ip) || port <= 0) {
+            return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter"));
+        }
+        try {
+            Map<String, String> params = new HashMap<>(1);
+            params.put("mode", String.valueOf(mode));
+            return executeCommand(ip, port, MODIFY_CLUSTER_MODE_PATH, params, false)
+                .thenCompose(e -> {
+                    if (CommandConstants.MSG_SUCCESS.equals(e)) {
+                        return CompletableFuture.completedFuture(null);
+                    } else {
+                        logger.warn("Error when modifying cluster mode: " + e);
+                        return AsyncUtils.newFailedFuture(new RuntimeException(e));
+                    }
+                });
+        } catch (Exception ex) {
+            logger.warn("Error when modifying cluster mode", ex);
+            return AsyncUtils.newFailedFuture(ex);
+        }
+    }
+
+    public CompletableFuture<ClusterClientInfoVO> fetchClusterClientInfoAndConfig(String ip, int port) {
+        if (StringUtil.isBlank(ip) || port <= 0) {
+            return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter"));
+        }
+        try {
+            return executeCommand(ip, port, FETCH_CLUSTER_CLIENT_CONFIG_PATH, false)
+                .thenApply(r -> JSON.parseObject(r, ClusterClientInfoVO.class));
+        } catch (Exception ex) {
+            logger.warn("Error when fetching cluster client config", ex);
+            return AsyncUtils.newFailedFuture(ex);
+        }
+    }
+
+    public CompletableFuture<Void> modifyClusterClientConfig(String app, String ip, int port, ClusterClientConfig config) {
+        if (StringUtil.isBlank(ip) || port <= 0) {
+            return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter"));
+        }
+        try {
+            Map<String, String> params = new HashMap<>(1);
+            params.put("data", JSON.toJSONString(config));
+            return executeCommand(app, ip, port, MODIFY_CLUSTER_CLIENT_CONFIG_PATH, params, true)
+                .thenCompose(e -> {
+                    if (CommandConstants.MSG_SUCCESS.equals(e)) {
+                        return CompletableFuture.completedFuture(null);
+                    } else {
+                        logger.warn("Error when modifying cluster client config: " + e);
+                        return AsyncUtils.newFailedFuture(new RuntimeException(e));
+                    }
+                });
+        } catch (Exception ex) {
+            logger.warn("Error when modifying cluster client config", ex);
+            return AsyncUtils.newFailedFuture(ex);
+        }
+    }
+
+    public CompletableFuture<Void> modifyClusterServerFlowConfig(String app, String ip, int port, ServerFlowConfig config) {
+        if (StringUtil.isBlank(ip) || port <= 0) {
+            return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter"));
+        }
+        try {
+            Map<String, String> params = new HashMap<>(1);
+            params.put("data", JSON.toJSONString(config));
+            return executeCommand(app, ip, port, MODIFY_CLUSTER_SERVER_FLOW_CONFIG_PATH, params, true)
+                .thenCompose(e -> {
+                    if (CommandConstants.MSG_SUCCESS.equals(e)) {
+                        return CompletableFuture.completedFuture(null);
+                    } else {
+                        logger.warn("Error when modifying cluster server flow config: " + e);
+                        return AsyncUtils.newFailedFuture(new RuntimeException(e));
+                    }
+                });
+        } catch (Exception ex) {
+            logger.warn("Error when modifying cluster server flow config", ex);
+            return AsyncUtils.newFailedFuture(ex);
+        }
+    }
+
+    public CompletableFuture<Void> modifyClusterServerTransportConfig(String app, String ip, int port, ServerTransportConfig config) {
+        if (StringUtil.isBlank(ip) || port <= 0) {
+            return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter"));
+        }
+        try {
+            Map<String, String> params = new HashMap<>(2);
+            params.put("port", config.getPort().toString());
+            params.put("idleSeconds", config.getIdleSeconds().toString());
+            return executeCommand(app, ip, port, MODIFY_CLUSTER_SERVER_TRANSPORT_CONFIG_PATH, params, false)
+                .thenCompose(e -> {
+                    if (CommandConstants.MSG_SUCCESS.equals(e)) {
+                        return CompletableFuture.completedFuture(null);
+                    } else {
+                        logger.warn("Error when modifying cluster server transport config: " + e);
+                        return AsyncUtils.newFailedFuture(new RuntimeException(e));
+                    }
+                });
+        } catch (Exception ex) {
+            logger.warn("Error when modifying cluster server transport config", ex);
+            return AsyncUtils.newFailedFuture(ex);
+        }
+    }
+
+    public CompletableFuture<Void> modifyClusterServerNamespaceSet(String app, String ip, int port, Set<String> set) {
+        if (StringUtil.isBlank(ip) || port <= 0) {
+            return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter"));
+        }
+        try {
+            Map<String, String> params = new HashMap<>(1);
+            params.put("data", JSON.toJSONString(set));
+            return executeCommand(app, ip, port, MODIFY_CLUSTER_SERVER_NAMESPACE_SET_PATH, params, true)
+                .thenCompose(e -> {
+                    if (CommandConstants.MSG_SUCCESS.equals(e)) {
+                        return CompletableFuture.completedFuture(null);
+                    } else {
+                        logger.warn("Error when modifying cluster server NamespaceSet", e);
+                        return AsyncUtils.newFailedFuture(new RuntimeException(e));
+                    }
+                });
+        } catch (Exception ex) {
+            logger.warn("Error when modifying cluster server NamespaceSet", ex);
+            return AsyncUtils.newFailedFuture(ex);
+        }
+    }
+
+    public CompletableFuture<ClusterServerStateVO> fetchClusterServerBasicInfo(String ip, int port) {
+        if (StringUtil.isBlank(ip) || port <= 0) {
+            return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter"));
+        }
+        try {
+            return executeCommand(ip, port, FETCH_CLUSTER_SERVER_BASIC_INFO_PATH, false)
+                .thenApply(r -> JSON.parseObject(r, ClusterServerStateVO.class));
+        } catch (Exception ex) {
+            logger.warn("Error when fetching cluster sever all config and basic info", ex);
+            return AsyncUtils.newFailedFuture(ex);
+        }
+    }
+
+    public CompletableFuture<List<ApiDefinitionEntity>> fetchApis(String app, String ip, int port) {
+        if (StringUtil.isBlank(ip) || port <= 0) {
+            return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter"));
+        }
+
+        try {
+            return executeCommand(ip, port, FETCH_GATEWAY_API_PATH, false)
+                    .thenApply(r -> {
+                        List<ApiDefinitionEntity> entities = JSON.parseArray(r, ApiDefinitionEntity.class);
+                        if (entities != null) {
+                            for (ApiDefinitionEntity entity : entities) {
+                                entity.setApp(app);
+                                entity.setIp(ip);
+                                entity.setPort(port);
+                            }
+                        }
+                        return entities;
+                    });
+        } catch (Exception ex) {
+            logger.warn("Error when fetching gateway apis", ex);
+            return AsyncUtils.newFailedFuture(ex);
+        }
+    }
+
+    public boolean modifyApis(String app, String ip, int port, List<ApiDefinitionEntity> apis) {
+        if (apis == null) {
+            return true;
+        }
+
+        try {
+            AssertUtil.notEmpty(app, "Bad app name");
+            AssertUtil.notEmpty(ip, "Bad machine IP");
+            AssertUtil.isTrue(port > 0, "Bad machine port");
+            String data = JSON.toJSONString(
+                    apis.stream().map(r -> r.toApiDefinition()).collect(Collectors.toList()));
+            Map<String, String> params = new HashMap<>(2);
+            params.put("data", data);
+            String result = executeCommand(app, ip, port, MODIFY_GATEWAY_API_PATH, params, true).get();
+            logger.info("Modify gateway apis: {}", result);
+            return true;
+        } catch (Exception e) {
+            logger.warn("Error when modifying gateway apis", e);
+            return false;
+        }
+    }
+
+    public CompletableFuture<List<GatewayFlowRuleEntity>> fetchGatewayFlowRules(String app, String ip, int port) {
+        if (StringUtil.isBlank(ip) || port <= 0) {
+            return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter"));
+        }
+
+        try {
+            return executeCommand(ip, port, FETCH_GATEWAY_FLOW_RULE_PATH, false)
+                    .thenApply(r -> {
+                        List<GatewayFlowRule> gatewayFlowRules = JSON.parseArray(r, GatewayFlowRule.class);
+                        List<GatewayFlowRuleEntity> entities = gatewayFlowRules.stream().map(rule -> GatewayFlowRuleEntity.fromGatewayFlowRule(app, ip, port, rule)).collect(Collectors.toList());
+                        return entities;
+                    });
+        } catch (Exception ex) {
+            logger.warn("Error when fetching gateway flow rules", ex);
+            return AsyncUtils.newFailedFuture(ex);
+        }
+    }
+
+    public boolean modifyGatewayFlowRules(String app, String ip, int port, List<GatewayFlowRuleEntity> rules) {
+        if (rules == null) {
+            return true;
+        }
+
+        try {
+            AssertUtil.notEmpty(app, "Bad app name");
+            AssertUtil.notEmpty(ip, "Bad machine IP");
+            AssertUtil.isTrue(port > 0, "Bad machine port");
+            String data = JSON.toJSONString(
+                    rules.stream().map(r -> r.toGatewayFlowRule()).collect(Collectors.toList()));
+            Map<String, String> params = new HashMap<>(2);
+            params.put("data", data);
+            String result = executeCommand(app, ip, port, MODIFY_GATEWAY_FLOW_RULE_PATH, params, true).get();
+            logger.info("Modify gateway flow rules: {}", result);
+            return true;
+        } catch (Exception e) {
+            logger.warn("Error when modifying gateway apis", e);
+            return false;
+        }
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/AuthConfiguration.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/AuthConfiguration.java
new file mode 100644
index 0000000..b5b78f3
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/AuthConfiguration.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.config;
+
+import com.alibaba.csp.sentinel.dashboard.auth.*;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.servlet.http.HttpServletRequest;
+
+@Configuration
+@EnableConfigurationProperties(AuthProperties.class)
+public class AuthConfiguration {
+
+    private final AuthProperties authProperties;
+
+    public AuthConfiguration(AuthProperties authProperties) {
+        this.authProperties = authProperties;
+    }
+
+    @Bean
+    @ConditionalOnMissingBean
+    public AuthService<HttpServletRequest> httpServletRequestAuthService() {
+        if (this.authProperties.isEnabled()) {
+            return new SimpleWebAuthServiceImpl();
+        }
+        return new FakeAuthServiceImpl();
+    }
+
+    @Bean
+    @ConditionalOnMissingBean
+    public LoginAuthenticationFilter loginAuthenticationFilter(AuthService<HttpServletRequest> httpServletRequestAuthService) {
+        return new DefaultLoginAuthenticationFilter(httpServletRequestAuthService);
+    }
+
+    @Bean
+    @ConditionalOnMissingBean
+    public AuthorizationInterceptor authorizationInterceptor(AuthService<HttpServletRequest> httpServletRequestAuthService) {
+        return new DefaultAuthorizationInterceptor(httpServletRequestAuthService);
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/AuthProperties.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/AuthProperties.java
new file mode 100644
index 0000000..61b66ce
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/AuthProperties.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@ConfigurationProperties(prefix = "auth")
+public class AuthProperties {
+
+    private boolean enabled = true;
+
+    public boolean isEnabled() {
+        return enabled;
+    }
+
+    public void setEnabled(boolean enabled) {
+        this.enabled = enabled;
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/DashboardConfig.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/DashboardConfig.java
new file mode 100644
index 0000000..92e0608
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/DashboardConfig.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.config;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.math.NumberUtils;
+import org.springframework.lang.NonNull;
+
+/**
+ * <p>Dashboard local config support.</p>
+ * <p>
+ * Dashboard supports configuration loading by several ways by order:<br>
+ * 1. System.properties<br>
+ * 2. Env
+ * </p>
+ *
+ * @author jason
+ * @since 1.5.0
+ */
+public class DashboardConfig {
+
+    public static final int DEFAULT_MACHINE_HEALTHY_TIMEOUT_MS = 60_000;
+
+    /**
+     * Login username
+     */
+    public static final String CONFIG_AUTH_USERNAME = "sentinel.dashboard.auth.username";
+
+    /**
+     * Login password
+     */
+    public static final String CONFIG_AUTH_PASSWORD = "sentinel.dashboard.auth.password";
+
+    /**
+     * Hide application name in sidebar when it has no healthy machines after specific period in millisecond.
+     */
+    public static final String CONFIG_HIDE_APP_NO_MACHINE_MILLIS = "sentinel.dashboard.app.hideAppNoMachineMillis";
+    /**
+     * Remove application when it has no healthy machines after specific period in millisecond.
+     */
+    public static final String CONFIG_REMOVE_APP_NO_MACHINE_MILLIS = "sentinel.dashboard.removeAppNoMachineMillis";
+    /**
+     * Timeout
+     */
+    public static final String CONFIG_UNHEALTHY_MACHINE_MILLIS = "sentinel.dashboard.unhealthyMachineMillis";
+    /**
+     * Auto remove unhealthy machine after specific period in millisecond.
+     */
+    public static final String CONFIG_AUTO_REMOVE_MACHINE_MILLIS = "sentinel.dashboard.autoRemoveMachineMillis";
+
+    private static final ConcurrentMap<String, Object> cacheMap = new ConcurrentHashMap<>();
+    
+    @NonNull
+    private static String getConfig(String name) {
+        // env
+        String val = System.getenv(name);
+        if (StringUtils.isNotEmpty(val)) {
+            return val;
+        }
+        // properties
+        val = System.getProperty(name);
+        if (StringUtils.isNotEmpty(val)) {
+            return val;
+        }
+        return "";
+    }
+
+    protected static String getConfigStr(String name) {
+        if (cacheMap.containsKey(name)) {
+            return (String) cacheMap.get(name);
+        }
+
+        String val = getConfig(name);
+
+        if (StringUtils.isBlank(val)) {
+            return null;
+        }
+
+        cacheMap.put(name, val);
+        return val;
+    }
+
+    protected static int getConfigInt(String name, int defaultVal, int minVal) {
+        if (cacheMap.containsKey(name)) {
+            return (int)cacheMap.get(name);
+        }
+        int val = NumberUtils.toInt(getConfig(name));
+        if (val == 0) {
+            val = defaultVal;
+        } else if (val < minVal) {
+            val = minVal;
+        }
+        cacheMap.put(name, val);
+        return val;
+    }
+
+    public static String getAuthUsername() {
+        return getConfigStr(CONFIG_AUTH_USERNAME);
+    }
+
+    public static String getAuthPassword() {
+        return getConfigStr(CONFIG_AUTH_PASSWORD);
+    }
+
+    public static int getHideAppNoMachineMillis() {
+        return getConfigInt(CONFIG_HIDE_APP_NO_MACHINE_MILLIS, 0, 60000);
+    }
+    
+    public static int getRemoveAppNoMachineMillis() {
+        return getConfigInt(CONFIG_REMOVE_APP_NO_MACHINE_MILLIS, 0, 120000);
+    }
+    
+    public static int getAutoRemoveMachineMillis() {
+        return getConfigInt(CONFIG_AUTO_REMOVE_MACHINE_MILLIS, 0, 300000);
+    }
+    
+    public static int getUnhealthyMachineMillis() {
+        return getConfigInt(CONFIG_UNHEALTHY_MACHINE_MILLIS, DEFAULT_MACHINE_HEALTHY_TIMEOUT_MS, 30000);
+    }
+    
+    public static void clearCache() {
+        cacheMap.clear();
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/WebConfig.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/WebConfig.java
new file mode 100644
index 0000000..92e51e5
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/WebConfig.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.config;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+import com.alibaba.csp.sentinel.adapter.servlet.CommonFilter;
+import com.alibaba.csp.sentinel.adapter.servlet.callback.WebCallbackManager;
+import com.alibaba.csp.sentinel.dashboard.auth.AuthorizationInterceptor;
+import com.alibaba.csp.sentinel.dashboard.auth.LoginAuthenticationFilter;
+import com.alibaba.csp.sentinel.util.StringUtil;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import javax.annotation.PostConstruct;
+import javax.servlet.Filter;
+
+/**
+ * @author leyou
+ */
+@Configuration
+public class WebConfig implements WebMvcConfigurer {
+
+    private final Logger logger = LoggerFactory.getLogger(WebConfig.class);
+
+    @Autowired
+    private LoginAuthenticationFilter loginAuthenticationFilter;
+
+    @Autowired
+    private AuthorizationInterceptor authorizationInterceptor;
+
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        registry.addInterceptor(authorizationInterceptor).addPathPatterns("/**");
+    }
+
+    @Override
+    public void addResourceHandlers(ResourceHandlerRegistry registry) {
+        registry.addResourceHandler("/**").addResourceLocations("classpath:/resources/");
+    }
+
+    @Override
+    public void addViewControllers(ViewControllerRegistry registry) {
+        registry.addViewController("/").setViewName("forward:/index.htm");
+    }
+
+    /**
+     * Add {@link CommonFilter} to the server, this is the simplest way to use Sentinel
+     * for Web application.
+     */
+    @Bean
+    public FilterRegistrationBean sentinelFilterRegistration() {
+        FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>();
+        registration.setFilter(new CommonFilter());
+        registration.addUrlPatterns("/*");
+        registration.setName("sentinelFilter");
+        registration.setOrder(1);
+        // If this is enabled, the entrance of all Web URL resources will be unified as a single context name.
+        // In most scenarios that's enough, and it could reduce the memory footprint.
+        registration.addInitParameter(CommonFilter.WEB_CONTEXT_UNIFY, "true");
+
+        logger.info("Sentinel servlet CommonFilter registered");
+
+        return registration;
+    }
+
+    @PostConstruct
+    public void doInit() {
+        Set<String> suffixSet = new HashSet<>(Arrays.asList(".js", ".css", ".html", ".ico", ".txt",
+            ".woff", ".woff2"));
+        // Example: register a UrlCleaner to exclude URLs of common static resources.
+        WebCallbackManager.setUrlCleaner(url -> {
+            if (StringUtil.isEmpty(url)) {
+                return url;
+            }
+            if (suffixSet.stream().anyMatch(url::endsWith)) {
+                return null;
+            }
+            return url;
+        });
+    }
+
+    @Bean
+    public FilterRegistrationBean authenticationFilterRegistration() {
+        FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>();
+        registration.setFilter(loginAuthenticationFilter);
+        registration.addUrlPatterns("/*");
+        registration.setName("authenticationFilter");
+        registration.setOrder(0);
+        return registration;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AppController.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AppController.java
new file mode 100644
index 0000000..6354896
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AppController.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.controller;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import com.alibaba.csp.sentinel.dashboard.discovery.AppInfo;
+import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement;
+import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo;
+import com.alibaba.csp.sentinel.dashboard.domain.Result;
+import com.alibaba.csp.sentinel.dashboard.domain.vo.MachineInfoVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author Carpenter Lee
+ */
+@RestController
+@RequestMapping(value = "/app")
+public class AppController {
+
+    @Autowired
+    private AppManagement appManagement;
+
+    @GetMapping("/names.json")
+    public Result<List<String>> queryApps(HttpServletRequest request) {
+        return Result.ofSuccess(appManagement.getAppNames());
+    }
+
+    @GetMapping("/briefinfos.json")
+    public Result<List<AppInfo>> queryAppInfos(HttpServletRequest request) {
+        List<AppInfo> list = new ArrayList<>(appManagement.getBriefApps());
+        Collections.sort(list, Comparator.comparing(AppInfo::getApp));
+        return Result.ofSuccess(list);
+    }
+
+    @GetMapping(value = "/{app}/machines.json")
+    public Result<List<MachineInfoVo>> getMachinesByApp(@PathVariable("app") String app) {
+        AppInfo appInfo = appManagement.getDetailApp(app);
+        if (appInfo == null) {
+            return Result.ofSuccess(null);
+        }
+        List<MachineInfo> list = new ArrayList<>(appInfo.getMachines());
+        Collections.sort(list, Comparator.comparing(MachineInfo::getApp).thenComparing(MachineInfo::getIp).thenComparingInt(MachineInfo::getPort));
+        return Result.ofSuccess(MachineInfoVo.fromMachineInfoList(list));
+    }
+    
+    @RequestMapping(value = "/{app}/machine/remove.json")
+    public Result<String> removeMachineById(
+            @PathVariable("app") String app,
+            @RequestParam(name = "ip") String ip,
+            @RequestParam(name = "port") int port) {
+        AppInfo appInfo = appManagement.getDetailApp(app);
+        if (appInfo == null) {
+            return Result.ofSuccess(null);
+        }
+        if (appManagement.removeMachine(app, ip, port)) {
+            return Result.ofSuccessMsg("success");
+        } else {
+            return Result.ofFail(1, "remove failed");
+        }
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AuthController.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AuthController.java
new file mode 100644
index 0000000..8b01aed
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AuthController.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.controller;
+
+import com.alibaba.csp.sentinel.dashboard.auth.AuthService;
+import com.alibaba.csp.sentinel.dashboard.auth.SimpleWebAuthServiceImpl;
+import com.alibaba.csp.sentinel.dashboard.config.DashboardConfig;
+import com.alibaba.csp.sentinel.dashboard.domain.Result;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @author cdfive
+ * @since 1.6.0
+ */
+@RestController
+@RequestMapping("/auth")
+public class AuthController {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(AuthController.class);
+
+    @Value("${auth.username:sentinel}")
+    private String authUsername;
+
+    @Value("${auth.password:sentinel}")
+    private String authPassword;
+
+    @Autowired
+    private AuthService<HttpServletRequest> authService;
+
+    @PostMapping("/login")
+    public Result<AuthService.AuthUser> login(HttpServletRequest request, String username, String password) {
+        if (StringUtils.isNotBlank(DashboardConfig.getAuthUsername())) {
+            authUsername = DashboardConfig.getAuthUsername();
+        }
+
+        if (StringUtils.isNotBlank(DashboardConfig.getAuthPassword())) {
+            authPassword = DashboardConfig.getAuthPassword();
+        }
+
+        /*
+         * If auth.username or auth.password is blank(set in application.properties or VM arguments),
+         * auth will pass, as the front side validate the input which can't be blank,
+         * so user can input any username or password(both are not blank) to login in that case.
+         */
+        if (StringUtils.isNotBlank(authUsername) && !authUsername.equals(username)
+                || StringUtils.isNotBlank(authPassword) && !authPassword.equals(password)) {
+            LOGGER.error("Login failed: Invalid username or password, username=" + username);
+            return Result.ofFail(-1, "Invalid username or password");
+        }
+
+        AuthService.AuthUser authUser = new SimpleWebAuthServiceImpl.SimpleWebAuthUserImpl(username);
+        request.getSession().setAttribute(SimpleWebAuthServiceImpl.WEB_SESSION_KEY, authUser);
+        return Result.ofSuccess(authUser);
+    }
+
+    @PostMapping(value = "/logout")
+    public Result<?> logout(HttpServletRequest request) {
+        request.getSession().invalidate();
+        return Result.ofSuccess(null);
+    }
+
+    @PostMapping(value = "/check")
+    public Result<?> check(HttpServletRequest request) {
+        AuthService.AuthUser authUser = authService.getAuthUser(request);
+        if (authUser == null) {
+            return Result.ofFail(-1, "Not logged in");
+        }
+        return Result.ofSuccess(authUser);
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AuthorityRuleController.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AuthorityRuleController.java
new file mode 100644
index 0000000..0adede8
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AuthorityRuleController.java
@@ -0,0 +1,187 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.controller;
+
+import com.alibaba.csp.sentinel.dashboard.auth.AuthAction;
+import com.alibaba.csp.sentinel.dashboard.auth.AuthService.PrivilegeType;
+import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient;
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.AuthorityRuleEntity;
+import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement;
+import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo;
+import com.alibaba.csp.sentinel.dashboard.domain.Result;
+import com.alibaba.csp.sentinel.dashboard.repository.rule.RuleRepository;
+import com.alibaba.csp.sentinel.slots.block.RuleConstant;
+import com.alibaba.csp.sentinel.util.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author Eric Zhao
+ * @since 0.2.1
+ */
+@RestController
+@RequestMapping(value = "/authority")
+public class AuthorityRuleController {
+
+    private final Logger logger = LoggerFactory.getLogger(AuthorityRuleController.class);
+
+    @Autowired
+    private SentinelApiClient sentinelApiClient;
+    @Autowired
+    private RuleRepository<AuthorityRuleEntity, Long> repository;
+    @Autowired
+    private AppManagement appManagement;
+
+    @GetMapping("/rules")
+    @AuthAction(PrivilegeType.READ_RULE)
+    public Result<List<AuthorityRuleEntity>> apiQueryAllRulesForMachine(@RequestParam String app,
+                                                                        @RequestParam String ip,
+                                                                        @RequestParam Integer port) {
+        if (StringUtil.isEmpty(app)) {
+            return Result.ofFail(-1, "app cannot be null or empty");
+        }
+        if (StringUtil.isEmpty(ip)) {
+            return Result.ofFail(-1, "ip cannot be null or empty");
+        }
+        if (port == null || port <= 0) {
+            return Result.ofFail(-1, "Invalid parameter: port");
+        }
+        if (!appManagement.isValidMachineOfApp(app, ip)) {
+            return Result.ofFail(-1, "given ip does not belong to given app");
+        }
+        try {
+            List<AuthorityRuleEntity> rules = sentinelApiClient.fetchAuthorityRulesOfMachine(app, ip, port);
+            rules = repository.saveAll(rules);
+            return Result.ofSuccess(rules);
+        } catch (Throwable throwable) {
+            logger.error("Error when querying authority rules", throwable);
+            return Result.ofFail(-1, throwable.getMessage());
+        }
+    }
+
+    private <R> Result<R> checkEntityInternal(AuthorityRuleEntity entity) {
+        if (entity == null) {
+            return Result.ofFail(-1, "bad rule body");
+        }
+        if (StringUtil.isBlank(entity.getApp())) {
+            return Result.ofFail(-1, "app can't be null or empty");
+        }
+        if (StringUtil.isBlank(entity.getIp())) {
+            return Result.ofFail(-1, "ip can't be null or empty");
+        }
+        if (entity.getPort() == null || entity.getPort() <= 0) {
+            return Result.ofFail(-1, "port can't be null");
+        }
+        if (entity.getRule() == null) {
+            return Result.ofFail(-1, "rule can't be null");
+        }
+        if (StringUtil.isBlank(entity.getResource())) {
+            return Result.ofFail(-1, "resource name cannot be null or empty");
+        }
+        if (StringUtil.isBlank(entity.getLimitApp())) {
+            return Result.ofFail(-1, "limitApp should be valid");
+        }
+        if (entity.getStrategy() != RuleConstant.AUTHORITY_WHITE
+            && entity.getStrategy() != RuleConstant.AUTHORITY_BLACK) {
+            return Result.ofFail(-1, "Unknown strategy (must be blacklist or whitelist)");
+        }
+        return null;
+    }
+
+    @PostMapping("/rule")
+    @AuthAction(PrivilegeType.WRITE_RULE)
+    public Result<AuthorityRuleEntity> apiAddAuthorityRule(@RequestBody AuthorityRuleEntity entity) {
+        Result<AuthorityRuleEntity> checkResult = checkEntityInternal(entity);
+        if (checkResult != null) {
+            return checkResult;
+        }
+        entity.setId(null);
+        Date date = new Date();
+        entity.setGmtCreate(date);
+        entity.setGmtModified(date);
+        try {
+            entity = repository.save(entity);
+        } catch (Throwable throwable) {
+            logger.error("Failed to add authority rule", throwable);
+            return Result.ofThrowable(-1, throwable);
+        }
+        if (!publishRules(entity.getApp(), entity.getIp(), entity.getPort())) {
+            logger.info("Publish authority rules failed after rule add");
+        }
+        return Result.ofSuccess(entity);
+    }
+
+    @PutMapping("/rule/{id}")
+    @AuthAction(PrivilegeType.WRITE_RULE)
+    public Result<AuthorityRuleEntity> apiUpdateParamFlowRule(@PathVariable("id") Long id,
+                                                              @RequestBody AuthorityRuleEntity entity) {
+        if (id == null || id <= 0) {
+            return Result.ofFail(-1, "Invalid id");
+        }
+        Result<AuthorityRuleEntity> checkResult = checkEntityInternal(entity);
+        if (checkResult != null) {
+            return checkResult;
+        }
+        entity.setId(id);
+        Date date = new Date();
+        entity.setGmtCreate(null);
+        entity.setGmtModified(date);
+        try {
+            entity = repository.save(entity);
+            if (entity == null) {
+                return Result.ofFail(-1, "Failed to save authority rule");
+            }
+        } catch (Throwable throwable) {
+            logger.error("Failed to save authority rule", throwable);
+            return Result.ofThrowable(-1, throwable);
+        }
+        if (!publishRules(entity.getApp(), entity.getIp(), entity.getPort())) {
+            logger.info("Publish authority rules failed after rule update");
+        }
+        return Result.ofSuccess(entity);
+    }
+
+    @DeleteMapping("/rule/{id}")
+    @AuthAction(PrivilegeType.DELETE_RULE)
+    public Result<Long> apiDeleteRule(@PathVariable("id") Long id) {
+        if (id == null) {
+            return Result.ofFail(-1, "id cannot be null");
+        }
+        AuthorityRuleEntity oldEntity = repository.findById(id);
+        if (oldEntity == null) {
+            return Result.ofSuccess(null);
+        }
+        try {
+            repository.delete(id);
+        } catch (Exception e) {
+            return Result.ofFail(-1, e.getMessage());
+        }
+        if (!publishRules(oldEntity.getApp(), oldEntity.getIp(), oldEntity.getPort())) {
+            logger.error("Publish authority rules failed after rule delete");
+        }
+        return Result.ofSuccess(id);
+    }
+
+    private boolean publishRules(String app, String ip, Integer port) {
+        List<AuthorityRuleEntity> rules = repository.findAllByMachine(MachineInfo.of(app, ip, port));
+        return sentinelApiClient.setAuthorityRuleOfMachine(app, ip, port, rules);
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/DegradeController.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/DegradeController.java
new file mode 100644
index 0000000..4675ab6
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/DegradeController.java
@@ -0,0 +1,221 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.controller;
+
+import com.alibaba.csp.sentinel.dashboard.auth.AuthAction;
+import com.alibaba.csp.sentinel.dashboard.auth.AuthService.PrivilegeType;
+import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient;
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.DegradeRuleEntity;
+import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement;
+import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo;
+import com.alibaba.csp.sentinel.dashboard.domain.Result;
+import com.alibaba.csp.sentinel.dashboard.repository.rule.RuleRepository;
+import com.alibaba.csp.sentinel.slots.block.RuleConstant;
+import com.alibaba.csp.sentinel.slots.block.degrade.circuitbreaker.CircuitBreakerStrategy;
+import com.alibaba.csp.sentinel.util.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Controller regarding APIs of degrade rules. Refactored since 1.8.0.
+ *
+ * @author Carpenter Lee
+ * @author Eric Zhao
+ */
+@RestController
+@RequestMapping("/degrade")
+public class DegradeController {
+
+    private final Logger logger = LoggerFactory.getLogger(DegradeController.class);
+
+    @Autowired
+    private RuleRepository<DegradeRuleEntity, Long> repository;
+    @Autowired
+    private SentinelApiClient sentinelApiClient;
+    @Autowired
+    private AppManagement appManagement;
+
+    @GetMapping("/rules.json")
+    @AuthAction(PrivilegeType.READ_RULE)
+    public Result<List<DegradeRuleEntity>> apiQueryMachineRules(String app, String ip, Integer port) {
+        if (StringUtil.isEmpty(app)) {
+            return Result.ofFail(-1, "app can't be null or empty");
+        }
+        if (StringUtil.isEmpty(ip)) {
+            return Result.ofFail(-1, "ip can't be null or empty");
+        }
+        if (port == null) {
+            return Result.ofFail(-1, "port can't be null");
+        }
+        if (!appManagement.isValidMachineOfApp(app, ip)) {
+            return Result.ofFail(-1, "given ip does not belong to given app");
+        }
+        try {
+            List<DegradeRuleEntity> rules = sentinelApiClient.fetchDegradeRuleOfMachine(app, ip, port);
+            rules = repository.saveAll(rules);
+            return Result.ofSuccess(rules);
+        } catch (Throwable throwable) {
+            logger.error("queryApps error:", throwable);
+            return Result.ofThrowable(-1, throwable);
+        }
+    }
+
+    @PostMapping("/rule")
+    @AuthAction(PrivilegeType.WRITE_RULE)
+    public Result<DegradeRuleEntity> apiAddRule(@RequestBody DegradeRuleEntity entity) {
+        Result<DegradeRuleEntity> checkResult = checkEntityInternal(entity);
+        if (checkResult != null) {
+            return checkResult;
+        }
+        Date date = new Date();
+        entity.setGmtCreate(date);
+        entity.setGmtModified(date);
+        try {
+            entity = repository.save(entity);
+        } catch (Throwable t) {
+            logger.error("Failed to add new degrade rule, app={}, ip={}", entity.getApp(), entity.getIp(), t);
+            return Result.ofThrowable(-1, t);
+        }
+        if (!publishRules(entity.getApp(), entity.getIp(), entity.getPort())) {
+            logger.warn("Publish degrade rules failed, app={}", entity.getApp());
+        }
+        return Result.ofSuccess(entity);
+    }
+
+    @PutMapping("/rule/{id}")
+    @AuthAction(PrivilegeType.WRITE_RULE)
+    public Result<DegradeRuleEntity> apiUpdateRule(@PathVariable("id") Long id,
+                                                     @RequestBody DegradeRuleEntity entity) {
+        if (id == null || id <= 0) {
+            return Result.ofFail(-1, "id can't be null or negative");
+        }
+        DegradeRuleEntity oldEntity = repository.findById(id);
+        if (oldEntity == null) {
+            return Result.ofFail(-1, "Degrade rule does not exist, id=" + id);
+        }
+        entity.setApp(oldEntity.getApp());
+        entity.setIp(oldEntity.getIp());
+        entity.setPort(oldEntity.getPort());
+        entity.setId(oldEntity.getId());
+        Result<DegradeRuleEntity> checkResult = checkEntityInternal(entity);
+        if (checkResult != null) {
+            return checkResult;
+        }
+
+        entity.setGmtCreate(oldEntity.getGmtCreate());
+        entity.setGmtModified(new Date());
+        try {
+            entity = repository.save(entity);
+        } catch (Throwable t) {
+            logger.error("Failed to save degrade rule, id={}, rule={}", id, entity, t);
+            return Result.ofThrowable(-1, t);
+        }
+        if (!publishRules(entity.getApp(), entity.getIp(), entity.getPort())) {
+            logger.warn("Publish degrade rules failed, app={}", entity.getApp());
+        }
+        return Result.ofSuccess(entity);
+    }
+
+    @DeleteMapping("/rule/{id}")
+    @AuthAction(PrivilegeType.DELETE_RULE)
+    public Result<Long> delete(@PathVariable("id") Long id) {
+        if (id == null) {
+            return Result.ofFail(-1, "id can't be null");
+        }
+
+        DegradeRuleEntity oldEntity = repository.findById(id);
+        if (oldEntity == null) {
+            return Result.ofSuccess(null);
+        }
+
+        try {
+            repository.delete(id);
+        } catch (Throwable throwable) {
+            logger.error("Failed to delete degrade rule, id={}", id, throwable);
+            return Result.ofThrowable(-1, throwable);
+        }
+        if (!publishRules(oldEntity.getApp(), oldEntity.getIp(), oldEntity.getPort())) {
+            logger.warn("Publish degrade rules failed, app={}", oldEntity.getApp());
+        }
+        return Result.ofSuccess(id);
+    }
+
+    private boolean publishRules(String app, String ip, Integer port) {
+        List<DegradeRuleEntity> rules = repository.findAllByMachine(MachineInfo.of(app, ip, port));
+        return sentinelApiClient.setDegradeRuleOfMachine(app, ip, port, rules);
+    }
+
+    private <R> Result<R> checkEntityInternal(DegradeRuleEntity entity) {
+        if (StringUtil.isBlank(entity.getApp())) {
+            return Result.ofFail(-1, "app can't be blank");
+        }
+        if (StringUtil.isBlank(entity.getIp())) {
+            return Result.ofFail(-1, "ip can't be null or empty");
+        }
+        if (!appManagement.isValidMachineOfApp(entity.getApp(), entity.getIp())) {
+            return Result.ofFail(-1, "given ip does not belong to given app");
+        }
+        if (entity.getPort() == null || entity.getPort() <= 0) {
+            return Result.ofFail(-1, "invalid port: " + entity.getPort());
+        }
+        if (StringUtil.isBlank(entity.getLimitApp())) {
+            return Result.ofFail(-1, "limitApp can't be null or empty");
+        }
+        if (StringUtil.isBlank(entity.getResource())) {
+            return Result.ofFail(-1, "resource can't be null or empty");
+        }
+        Double threshold = entity.getCount();
+        if (threshold == null || threshold < 0) {
+            return Result.ofFail(-1, "invalid threshold: " + threshold);
+        }
+        Integer recoveryTimeoutSec = entity.getTimeWindow();
+        if (recoveryTimeoutSec == null || recoveryTimeoutSec <= 0) {
+            return Result.ofFail(-1, "recoveryTimeout should be positive");
+        }
+        Integer strategy = entity.getGrade();
+        if (strategy == null) {
+            return Result.ofFail(-1, "circuit breaker strategy cannot be null");
+        }
+        if (strategy < CircuitBreakerStrategy.SLOW_REQUEST_RATIO.getType()
+            || strategy > RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT) {
+            return Result.ofFail(-1, "Invalid circuit breaker strategy: " + strategy);
+        }
+        if (entity.getMinRequestAmount()  == null || entity.getMinRequestAmount() <= 0) {
+            return Result.ofFail(-1, "Invalid minRequestAmount");
+        }
+        if (entity.getStatIntervalMs() == null || entity.getStatIntervalMs() <= 0) {
+            return Result.ofFail(-1, "Invalid statInterval");
+        }
+        if (strategy == RuleConstant.DEGRADE_GRADE_RT) {
+            Double slowRatio = entity.getSlowRatioThreshold();
+            if (slowRatio == null) {
+                return Result.ofFail(-1, "SlowRatioThreshold is required for slow request ratio strategy");
+            } else if (slowRatio < 0 || slowRatio > 1) {
+                return Result.ofFail(-1, "SlowRatioThreshold should be in range: [0.0, 1.0]");
+            }
+        } else if (strategy == RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO) {
+            if (threshold > 1) {
+                return Result.ofFail(-1, "Ratio threshold should be in range: [0.0, 1.0]");
+            }
+        }
+        return null;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/DemoController.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/DemoController.java
new file mode 100644
index 0000000..cb4fb67
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/DemoController.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.controller;
+
+import java.util.Random;
+import java.util.concurrent.TimeUnit;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.alibaba.csp.sentinel.Entry;
+import com.alibaba.csp.sentinel.EntryType;
+import com.alibaba.csp.sentinel.SphU;
+import com.alibaba.csp.sentinel.context.ContextUtil;
+import com.alibaba.csp.sentinel.slots.block.BlockException;
+
+@Controller
+@RequestMapping(value = "/demo", produces = MediaType.APPLICATION_JSON_VALUE)
+public class DemoController {
+
+    Logger logger = LoggerFactory.getLogger(MachineRegistryController.class);
+
+    @RequestMapping("/greeting")
+    public String greeting() {
+        return "index";
+    }
+
+    @RequestMapping("/link")
+    @ResponseBody
+    public String link() throws BlockException {
+
+        Entry entry = SphU.entry("head1", EntryType.IN);
+
+        Entry entry1 = SphU.entry("head2", EntryType.IN);
+        Entry entry2 = SphU.entry("head3", EntryType.IN);
+        Entry entry3 = SphU.entry("head4", EntryType.IN);
+
+        entry3.exit();
+        entry2.exit();
+        entry1.exit();
+        entry.exit();
+        return "successfully create a call link";
+    }
+
+    @RequestMapping("/loop")
+    @ResponseBody
+    public String loop(String name, int time) throws BlockException {
+        for (int i = 0; i < 10; i++) {
+            Thread timer = new Thread(new RunTask(name, time, false));
+            timer.setName("false");
+            timer.start();
+        }
+        return "successfully create a loop thread";
+    }
+
+    @RequestMapping("/slow")
+    @ResponseBody
+    public String slow(String name, int time) throws BlockException {
+        for (int i = 0; i < 10; i++) {
+            Thread timer = new Thread(new RunTask(name, time, true));
+            timer.setName("false");
+            timer.start();
+        }
+        return "successfully create a loop thread";
+    }
+
+    static class RunTask implements Runnable {
+        int time;
+        boolean stop = false;
+        String name;
+        boolean slow = false;
+
+        public RunTask(String name, int time, boolean slow) {
+            super();
+            this.time = time;
+            this.name = name;
+            this.slow = slow;
+        }
+
+        @Override
+        public void run() {
+            long startTime = System.currentTimeMillis();
+            ContextUtil.enter(String.valueOf(startTime));
+            while (!stop) {
+
+                long now = System.currentTimeMillis();
+                if (now - startTime > time * 1000) {
+                    stop = true;
+                }
+                Entry e1 = null;
+                try {
+                    e1 = SphU.entry(name);
+
+                    if (slow) {
+                        TimeUnit.MILLISECONDS.sleep(3000);
+                    }
+
+                } catch (Exception e) {
+                } finally {
+                    if (e1 != null) {
+                        e1.exit();
+                    }
+                }
+                Random random2 = new Random();
+                try {
+                    TimeUnit.MILLISECONDS.sleep(random2.nextInt(200));
+                } catch (InterruptedException e) {
+                    // TODO Auto-generated catch block
+                    e.printStackTrace();
+                }
+
+            }
+            ContextUtil.exit();
+        }
+
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/FlowControllerV1.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/FlowControllerV1.java
new file mode 100644
index 0000000..9199a47
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/FlowControllerV1.java
@@ -0,0 +1,272 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.controller;
+
+import com.alibaba.csp.sentinel.dashboard.auth.AuthAction;
+import com.alibaba.csp.sentinel.dashboard.auth.AuthService.PrivilegeType;
+import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient;
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.FlowRuleEntity;
+import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement;
+import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo;
+import com.alibaba.csp.sentinel.dashboard.domain.Result;
+import com.alibaba.csp.sentinel.dashboard.repository.rule.InMemoryRuleRepositoryAdapter;
+import com.alibaba.csp.sentinel.util.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Flow rule controller.
+ *
+ * @author leyou
+ * @author Eric Zhao
+ */
+@RestController
+@RequestMapping(value = "/v1/flow")
+public class FlowControllerV1 {
+
+    private final Logger logger = LoggerFactory.getLogger(FlowControllerV1.class);
+
+    @Autowired
+    private InMemoryRuleRepositoryAdapter<FlowRuleEntity> repository;
+    @Autowired
+    private AppManagement appManagement;
+
+    @Autowired
+    private SentinelApiClient sentinelApiClient;
+
+    @GetMapping("/rules")
+    @AuthAction(PrivilegeType.READ_RULE)
+    public Result<List<FlowRuleEntity>> apiQueryMachineRules(@RequestParam String app,
+                                                             @RequestParam String ip,
+                                                             @RequestParam Integer port) {
+        if (StringUtil.isEmpty(app)) {
+            return Result.ofFail(-1, "app can't be null or empty");
+        }
+        if (StringUtil.isEmpty(ip)) {
+            return Result.ofFail(-1, "ip can't be null or empty");
+        }
+        if (port == null) {
+            return Result.ofFail(-1, "port can't be null");
+        }
+        if (!appManagement.isValidMachineOfApp(app, ip)) {
+            return Result.ofFail(-1, "given ip does not belong to given app");
+        }
+        try {
+            List<FlowRuleEntity> rules = sentinelApiClient.fetchFlowRuleOfMachine(app, ip, port);
+            rules = repository.saveAll(rules);
+            return Result.ofSuccess(rules);
+        } catch (Throwable throwable) {
+            logger.error("Error when querying flow rules", throwable);
+            return Result.ofThrowable(-1, throwable);
+        }
+    }
+
+    private <R> Result<R> checkEntityInternal(FlowRuleEntity entity) {
+        if (StringUtil.isBlank(entity.getApp())) {
+            return Result.ofFail(-1, "app can't be null or empty");
+        }
+        if (StringUtil.isBlank(entity.getIp())) {
+            return Result.ofFail(-1, "ip can't be null or empty");
+        }
+        if (entity.getPort() == null) {
+            return Result.ofFail(-1, "port can't be null");
+        }
+        if (!appManagement.isValidMachineOfApp(entity.getApp(), entity.getIp())) {
+            return Result.ofFail(-1, "given ip does not belong to given app");
+        }
+        if (StringUtil.isBlank(entity.getLimitApp())) {
+            return Result.ofFail(-1, "limitApp can't be null or empty");
+        }
+        if (StringUtil.isBlank(entity.getResource())) {
+            return Result.ofFail(-1, "resource can't be null or empty");
+        }
+        if (entity.getGrade() == null) {
+            return Result.ofFail(-1, "grade can't be null");
+        }
+        if (entity.getGrade() != 0 && entity.getGrade() != 1) {
+            return Result.ofFail(-1, "grade must be 0 or 1, but " + entity.getGrade() + " got");
+        }
+        if (entity.getCount() == null || entity.getCount() < 0) {
+            return Result.ofFail(-1, "count should be at lease zero");
+        }
+        if (entity.getStrategy() == null) {
+            return Result.ofFail(-1, "strategy can't be null");
+        }
+        if (entity.getStrategy() != 0 && StringUtil.isBlank(entity.getRefResource())) {
+            return Result.ofFail(-1, "refResource can't be null or empty when strategy!=0");
+        }
+        if (entity.getControlBehavior() == null) {
+            return Result.ofFail(-1, "controlBehavior can't be null");
+        }
+        int controlBehavior = entity.getControlBehavior();
+        if (controlBehavior == 1 && entity.getWarmUpPeriodSec() == null) {
+            return Result.ofFail(-1, "warmUpPeriodSec can't be null when controlBehavior==1");
+        }
+        if (controlBehavior == 2 && entity.getMaxQueueingTimeMs() == null) {
+            return Result.ofFail(-1, "maxQueueingTimeMs can't be null when controlBehavior==2");
+        }
+        if (entity.isClusterMode() && entity.getClusterConfig() == null) {
+            return Result.ofFail(-1, "cluster config should be valid");
+        }
+        return null;
+    }
+
+    @PostMapping("/rule")
+    @AuthAction(PrivilegeType.WRITE_RULE)
+    public Result<FlowRuleEntity> apiAddFlowRule(@RequestBody FlowRuleEntity entity) {
+        Result<FlowRuleEntity> checkResult = checkEntityInternal(entity);
+        if (checkResult != null) {
+            return checkResult;
+        }
+        entity.setId(null);
+        Date date = new Date();
+        entity.setGmtCreate(date);
+        entity.setGmtModified(date);
+        entity.setLimitApp(entity.getLimitApp().trim());
+        entity.setResource(entity.getResource().trim());
+        try {
+            entity = repository.save(entity);
+
+            publishRules(entity.getApp(), entity.getIp(), entity.getPort()).get(5000, TimeUnit.MILLISECONDS);
+            return Result.ofSuccess(entity);
+        } catch (Throwable t) {
+            Throwable e = t instanceof ExecutionException ? t.getCause() : t;
+            logger.error("Failed to add new flow rule, app={}, ip={}", entity.getApp(), entity.getIp(), e);
+            return Result.ofFail(-1, e.getMessage());
+        }
+    }
+
+    @PutMapping("/save.json")
+    @AuthAction(PrivilegeType.WRITE_RULE)
+    public Result<FlowRuleEntity> apiUpdateFlowRule(Long id, String app,
+                                                  String limitApp, String resource, Integer grade,
+                                                  Double count, Integer strategy, String refResource,
+                                                  Integer controlBehavior, Integer warmUpPeriodSec,
+                                                  Integer maxQueueingTimeMs) {
+        if (id == null) {
+            return Result.ofFail(-1, "id can't be null");
+        }
+        FlowRuleEntity entity = repository.findById(id);
+        if (entity == null) {
+            return Result.ofFail(-1, "id " + id + " dose not exist");
+        }
+        if (StringUtil.isNotBlank(app)) {
+            entity.setApp(app.trim());
+        }
+        if (StringUtil.isNotBlank(limitApp)) {
+            entity.setLimitApp(limitApp.trim());
+        }
+        if (StringUtil.isNotBlank(resource)) {
+            entity.setResource(resource.trim());
+        }
+        if (grade != null) {
+            if (grade != 0 && grade != 1) {
+                return Result.ofFail(-1, "grade must be 0 or 1, but " + grade + " got");
+            }
+            entity.setGrade(grade);
+        }
+        if (count != null) {
+            entity.setCount(count);
+        }
+        if (strategy != null) {
+            if (strategy != 0 && strategy != 1 && strategy != 2) {
+                return Result.ofFail(-1, "strategy must be in [0, 1, 2], but " + strategy + " got");
+            }
+            entity.setStrategy(strategy);
+            if (strategy != 0) {
+                if (StringUtil.isBlank(refResource)) {
+                    return Result.ofFail(-1, "refResource can't be null or empty when strategy!=0");
+                }
+                entity.setRefResource(refResource.trim());
+            }
+        }
+        if (controlBehavior != null) {
+            if (controlBehavior != 0 && controlBehavior != 1 && controlBehavior != 2) {
+                return Result.ofFail(-1, "controlBehavior must be in [0, 1, 2], but " + controlBehavior + " got");
+            }
+            if (controlBehavior == 1 && warmUpPeriodSec == null) {
+                return Result.ofFail(-1, "warmUpPeriodSec can't be null when controlBehavior==1");
+            }
+            if (controlBehavior == 2 && maxQueueingTimeMs == null) {
+                return Result.ofFail(-1, "maxQueueingTimeMs can't be null when controlBehavior==2");
+            }
+            entity.setControlBehavior(controlBehavior);
+            if (warmUpPeriodSec != null) {
+                entity.setWarmUpPeriodSec(warmUpPeriodSec);
+            }
+            if (maxQueueingTimeMs != null) {
+                entity.setMaxQueueingTimeMs(maxQueueingTimeMs);
+            }
+        }
+        Date date = new Date();
+        entity.setGmtModified(date);
+        try {
+            entity = repository.save(entity);
+            if (entity == null) {
+                return Result.ofFail(-1, "save entity fail: null");
+            }
+
+            publishRules(entity.getApp(), entity.getIp(), entity.getPort()).get(5000, TimeUnit.MILLISECONDS);
+            return Result.ofSuccess(entity);
+        } catch (Throwable t) {
+            Throwable e = t instanceof ExecutionException ? t.getCause() : t;
+            logger.error("Error when updating flow rules, app={}, ip={}, ruleId={}", entity.getApp(),
+                entity.getIp(), id, e);
+            return Result.ofFail(-1, e.getMessage());
+        }
+    }
+
+    @DeleteMapping("/delete.json")
+    @AuthAction(PrivilegeType.WRITE_RULE)
+    public Result<Long> apiDeleteFlowRule(Long id) {
+
+        if (id == null) {
+            return Result.ofFail(-1, "id can't be null");
+        }
+        FlowRuleEntity oldEntity = repository.findById(id);
+        if (oldEntity == null) {
+            return Result.ofSuccess(null);
+        }
+
+        try {
+            repository.delete(id);
+        } catch (Exception e) {
+            return Result.ofFail(-1, e.getMessage());
+        }
+        try {
+            publishRules(oldEntity.getApp(), oldEntity.getIp(), oldEntity.getPort()).get(5000, TimeUnit.MILLISECONDS);
+            return Result.ofSuccess(id);
+        } catch (Throwable t) {
+            Throwable e = t instanceof ExecutionException ? t.getCause() : t;
+            logger.error("Error when deleting flow rules, app={}, ip={}, id={}", oldEntity.getApp(),
+                oldEntity.getIp(), id, e);
+            return Result.ofFail(-1, e.getMessage());
+        }
+    }
+
+    private CompletableFuture<Void> publishRules(String app, String ip, Integer port) {
+        List<FlowRuleEntity> rules = repository.findAllByMachine(MachineInfo.of(app, ip, port));
+        return sentinelApiClient.setFlowRuleOfMachineAsync(app, ip, port, rules);
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/MachineRegistryController.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/MachineRegistryController.java
new file mode 100644
index 0000000..53e5c02
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/MachineRegistryController.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.controller;
+
+import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement;
+import com.alibaba.csp.sentinel.util.StringUtil;
+
+import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo;
+import com.alibaba.csp.sentinel.dashboard.domain.Result;
+
+import org.apache.http.conn.util.InetAddressUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+@Controller
+@RequestMapping(value = "/registry", produces = MediaType.APPLICATION_JSON_VALUE)
+public class MachineRegistryController {
+
+    private final Logger logger = LoggerFactory.getLogger(MachineRegistryController.class);
+
+    @Autowired
+    private AppManagement appManagement;
+
+    @ResponseBody
+    @RequestMapping("/machine")
+    public Result<?> receiveHeartBeat(String app,
+                                      @RequestParam(value = "app_type", required = false, defaultValue = "0")
+                                          Integer appType, Long version, String v, String hostname, String ip,
+                                      Integer port) {
+        if (StringUtil.isBlank(app) || app.length() > 256) {
+            return Result.ofFail(-1, "invalid appName");
+        }
+        if (StringUtil.isBlank(ip) || ip.length() > 128) {
+            return Result.ofFail(-1, "invalid ip: " + ip);
+        }
+        if (!InetAddressUtils.isIPv4Address(ip) && !InetAddressUtils.isIPv6Address(ip)) {
+            return Result.ofFail(-1, "invalid ip: " + ip);
+        }
+        if (port == null || port < -1) {
+            return Result.ofFail(-1, "invalid port");
+        }
+        if (hostname != null && hostname.length() > 256) {
+            return Result.ofFail(-1, "hostname too long");
+        }
+        if (port == -1) {
+            logger.warn("Receive heartbeat from " + ip + " but port not set yet");
+            return Result.ofFail(-1, "your port not set yet");
+        }
+        String sentinelVersion = StringUtil.isBlank(v) ? "unknown" : v;
+
+        version = version == null ? System.currentTimeMillis() : version;
+        try {
+            MachineInfo machineInfo = new MachineInfo();
+            machineInfo.setApp(app);
+            machineInfo.setAppType(appType);
+            machineInfo.setHostname(hostname);
+            machineInfo.setIp(ip);
+            machineInfo.setPort(port);
+            machineInfo.setHeartbeatVersion(version);
+            machineInfo.setLastHeartbeat(System.currentTimeMillis());
+            machineInfo.setVersion(sentinelVersion);
+            appManagement.addMachine(machineInfo);
+            return Result.ofSuccessMsg("success");
+        } catch (Exception e) {
+            logger.error("Receive heartbeat error", e);
+            return Result.ofFail(-1, e.getMessage());
+        }
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/MetricController.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/MetricController.java
new file mode 100644
index 0000000..ab90c0f
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/MetricController.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.controller;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.concurrent.ConcurrentHashMap;
+
+import com.alibaba.csp.sentinel.dashboard.domain.Result;
+import com.alibaba.csp.sentinel.dashboard.repository.metric.MetricsRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.alibaba.csp.sentinel.util.StringUtil;
+
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.MetricEntity;
+import com.alibaba.csp.sentinel.dashboard.domain.vo.MetricVo;
+
+/**
+ * @author leyou
+ */
+@Controller
+@RequestMapping(value = "/metric", produces = MediaType.APPLICATION_JSON_VALUE)
+public class MetricController {
+
+    private static Logger logger = LoggerFactory.getLogger(MetricController.class);
+
+    private static final long maxQueryIntervalMs = 1000 * 60 * 60;
+
+    @Autowired
+    private MetricsRepository<MetricEntity> metricStore;
+
+    @ResponseBody
+    @RequestMapping("/queryTopResourceMetric.json")
+    public Result<?> queryTopResourceMetric(final String app,
+                                            Integer pageIndex,
+                                            Integer pageSize,
+                                            Boolean desc,
+                                            Long startTime, Long endTime, String searchKey) {
+        if (StringUtil.isEmpty(app)) {
+            return Result.ofFail(-1, "app can't be null or empty");
+        }
+        if (pageIndex == null || pageIndex <= 0) {
+            pageIndex = 1;
+        }
+        if (pageSize == null) {
+            pageSize = 6;
+        }
+        if (pageSize >= 20) {
+            pageSize = 20;
+        }
+        if (desc == null) {
+            desc = true;
+        }
+        if (endTime == null) {
+            endTime = System.currentTimeMillis();
+        }
+        if (startTime == null) {
+            startTime = endTime - 1000 * 60 * 5;
+        }
+        if (endTime - startTime > maxQueryIntervalMs) {
+            return Result.ofFail(-1, "time intervalMs is too big, must <= 1h");
+        }
+        List<String> resources = metricStore.listResourcesOfApp(app);
+        logger.debug("queryTopResourceMetric(), resources.size()={}", resources.size());
+
+        if (resources == null || resources.isEmpty()) {
+            return Result.ofSuccess(null);
+        }
+        if (!desc) {
+            Collections.reverse(resources);
+        }
+        if (StringUtil.isNotEmpty(searchKey)) {
+            List<String> searched = new ArrayList<>();
+            for (String resource : resources) {
+                if (resource.contains(searchKey)) {
+                    searched.add(resource);
+                }
+            }
+            resources = searched;
+        }
+        int totalPage = (resources.size() + pageSize - 1) / pageSize;
+        List<String> topResource = new ArrayList<>();
+        if (pageIndex <= totalPage) {
+            topResource = resources.subList((pageIndex - 1) * pageSize,
+                Math.min(pageIndex * pageSize, resources.size()));
+        }
+        final Map<String, Iterable<MetricVo>> map = new ConcurrentHashMap<>();
+        logger.debug("topResource={}", topResource);
+        long time = System.currentTimeMillis();
+        for (final String resource : topResource) {
+            List<MetricEntity> entities = metricStore.queryByAppAndResourceBetween(
+                app, resource, startTime, endTime);
+            logger.debug("resource={}, entities.size()={}", resource, entities == null ? "null" : entities.size());
+            List<MetricVo> vos = MetricVo.fromMetricEntities(entities, resource);
+            Iterable<MetricVo> vosSorted = sortMetricVoAndDistinct(vos);
+            map.put(resource, vosSorted);
+        }
+        logger.debug("queryTopResourceMetric() total query time={} ms", System.currentTimeMillis() - time);
+        Map<String, Object> resultMap = new HashMap<>(16);
+        resultMap.put("totalCount", resources.size());
+        resultMap.put("totalPage", totalPage);
+        resultMap.put("pageIndex", pageIndex);
+        resultMap.put("pageSize", pageSize);
+
+        Map<String, Iterable<MetricVo>> map2 = new LinkedHashMap<>();
+        // order matters.
+        for (String identity : topResource) {
+            map2.put(identity, map.get(identity));
+        }
+        resultMap.put("metric", map2);
+        return Result.ofSuccess(resultMap);
+    }
+
+    @ResponseBody
+    @RequestMapping("/queryByAppAndResource.json")
+    public Result<?> queryByAppAndResource(String app, String identity, Long startTime, Long endTime) {
+        if (StringUtil.isEmpty(app)) {
+            return Result.ofFail(-1, "app can't be null or empty");
+        }
+        if (StringUtil.isEmpty(identity)) {
+            return Result.ofFail(-1, "identity can't be null or empty");
+        }
+        if (endTime == null) {
+            endTime = System.currentTimeMillis();
+        }
+        if (startTime == null) {
+            startTime = endTime - 1000 * 60;
+        }
+        if (endTime - startTime > maxQueryIntervalMs) {
+            return Result.ofFail(-1, "time intervalMs is too big, must <= 1h");
+        }
+        List<MetricEntity> entities = metricStore.queryByAppAndResourceBetween(
+            app, identity, startTime, endTime);
+        List<MetricVo> vos = MetricVo.fromMetricEntities(entities, identity);
+        return Result.ofSuccess(sortMetricVoAndDistinct(vos));
+    }
+
+    private Iterable<MetricVo> sortMetricVoAndDistinct(List<MetricVo> vos) {
+        if (vos == null) {
+            return null;
+        }
+        Map<Long, MetricVo> map = new TreeMap<>();
+        for (MetricVo vo : vos) {
+            MetricVo oldVo = map.get(vo.getTimestamp());
+            if (oldVo == null || vo.getGmtCreate() > oldVo.getGmtCreate()) {
+                map.put(vo.getTimestamp(), vo);
+            }
+        }
+        return map.values();
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ParamFlowRuleController.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ParamFlowRuleController.java
new file mode 100644
index 0000000..2557799
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ParamFlowRuleController.java
@@ -0,0 +1,263 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.controller;
+
+import com.alibaba.csp.sentinel.dashboard.auth.AuthAction;
+import com.alibaba.csp.sentinel.dashboard.auth.AuthService;
+import com.alibaba.csp.sentinel.dashboard.auth.AuthService.PrivilegeType;
+import com.alibaba.csp.sentinel.dashboard.client.CommandNotFoundException;
+import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient;
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.SentinelVersion;
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.ParamFlowRuleEntity;
+import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement;
+import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo;
+import com.alibaba.csp.sentinel.dashboard.domain.Result;
+import com.alibaba.csp.sentinel.dashboard.repository.rule.RuleRepository;
+import com.alibaba.csp.sentinel.dashboard.util.VersionUtils;
+import com.alibaba.csp.sentinel.slots.block.RuleConstant;
+import com.alibaba.csp.sentinel.util.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+
+/**
+ * @author Eric Zhao
+ * @since 0.2.1
+ */
+@RestController
+@RequestMapping(value = "/paramFlow")
+public class ParamFlowRuleController {
+
+    private final Logger logger = LoggerFactory.getLogger(ParamFlowRuleController.class);
+
+    @Autowired
+    private SentinelApiClient sentinelApiClient;
+    @Autowired
+    private AppManagement appManagement;
+    @Autowired
+    private RuleRepository<ParamFlowRuleEntity, Long> repository;
+
+    private boolean checkIfSupported(String app, String ip, int port) {
+        try {
+            return Optional.ofNullable(appManagement.getDetailApp(app))
+                .flatMap(e -> e.getMachine(ip, port))
+                .flatMap(m -> VersionUtils.parseVersion(m.getVersion())
+                    .map(v -> v.greaterOrEqual(version020)))
+                .orElse(true);
+            // If error occurred or cannot retrieve machine info, return true.
+        } catch (Exception ex) {
+            return true;
+        }
+    }
+
+    @GetMapping("/rules")
+    @AuthAction(PrivilegeType.READ_RULE)
+    public Result<List<ParamFlowRuleEntity>> apiQueryAllRulesForMachine(@RequestParam String app,
+                                                                        @RequestParam String ip,
+                                                                        @RequestParam Integer port) {
+        if (StringUtil.isEmpty(app)) {
+            return Result.ofFail(-1, "app cannot be null or empty");
+        }
+        if (StringUtil.isEmpty(ip)) {
+            return Result.ofFail(-1, "ip cannot be null or empty");
+        }
+        if (port == null || port <= 0) {
+            return Result.ofFail(-1, "Invalid parameter: port");
+        }
+        if (!appManagement.isValidMachineOfApp(app, ip)) {
+            return Result.ofFail(-1, "given ip does not belong to given app");
+        }
+        if (!checkIfSupported(app, ip, port)) {
+            return unsupportedVersion();
+        }
+        try {
+            return sentinelApiClient.fetchParamFlowRulesOfMachine(app, ip, port)
+                .thenApply(repository::saveAll)
+                .thenApply(Result::ofSuccess)
+                .get();
+        } catch (ExecutionException ex) {
+            logger.error("Error when querying parameter flow rules", ex.getCause());
+            if (isNotSupported(ex.getCause())) {
+                return unsupportedVersion();
+            } else {
+                return Result.ofThrowable(-1, ex.getCause());
+            }
+        } catch (Throwable throwable) {
+            logger.error("Error when querying parameter flow rules", throwable);
+            return Result.ofFail(-1, throwable.getMessage());
+        }
+    }
+
+    private boolean isNotSupported(Throwable ex) {
+        return ex instanceof CommandNotFoundException;
+    }
+
+    @PostMapping("/rule")
+    @AuthAction(AuthService.PrivilegeType.WRITE_RULE)
+    public Result<ParamFlowRuleEntity> apiAddParamFlowRule(@RequestBody ParamFlowRuleEntity entity) {
+        Result<ParamFlowRuleEntity> checkResult = checkEntityInternal(entity);
+        if (checkResult != null) {
+            return checkResult;
+        }
+        if (!checkIfSupported(entity.getApp(), entity.getIp(), entity.getPort())) {
+            return unsupportedVersion();
+        }
+        entity.setId(null);
+        entity.getRule().setResource(entity.getResource().trim());
+        Date date = new Date();
+        entity.setGmtCreate(date);
+        entity.setGmtModified(date);
+        try {
+            entity = repository.save(entity);
+            publishRules(entity.getApp(), entity.getIp(), entity.getPort()).get();
+            return Result.ofSuccess(entity);
+        } catch (ExecutionException ex) {
+            logger.error("Error when adding new parameter flow rules", ex.getCause());
+            if (isNotSupported(ex.getCause())) {
+                return unsupportedVersion();
+            } else {
+                return Result.ofThrowable(-1, ex.getCause());
+            }
+        } catch (Throwable throwable) {
+            logger.error("Error when adding new parameter flow rules", throwable);
+            return Result.ofFail(-1, throwable.getMessage());
+        }
+    }
+
+    private <R> Result<R> checkEntityInternal(ParamFlowRuleEntity entity) {
+        if (entity == null) {
+            return Result.ofFail(-1, "bad rule body");
+        }
+        if (StringUtil.isBlank(entity.getApp())) {
+            return Result.ofFail(-1, "app can't be null or empty");
+        }
+        if (StringUtil.isBlank(entity.getIp())) {
+            return Result.ofFail(-1, "ip can't be null or empty");
+        }
+        if (entity.getPort() == null || entity.getPort() <= 0) {
+            return Result.ofFail(-1, "port can't be null");
+        }
+        if (entity.getRule() == null) {
+            return Result.ofFail(-1, "rule can't be null");
+        }
+        if (StringUtil.isBlank(entity.getResource())) {
+            return Result.ofFail(-1, "resource name cannot be null or empty");
+        }
+        if (entity.getCount() < 0) {
+            return Result.ofFail(-1, "count should be valid");
+        }
+        if (entity.getGrade() != RuleConstant.FLOW_GRADE_QPS) {
+            return Result.ofFail(-1, "Unknown mode (blockGrade) for parameter flow control");
+        }
+        if (entity.getParamIdx() == null || entity.getParamIdx() < 0) {
+            return Result.ofFail(-1, "paramIdx should be valid");
+        }
+        if (entity.getDurationInSec() <= 0) {
+            return Result.ofFail(-1, "durationInSec should be valid");
+        }
+        if (entity.getControlBehavior() < 0) {
+            return Result.ofFail(-1, "controlBehavior should be valid");
+        }
+        return null;
+    }
+
+    @PutMapping("/rule/{id}")
+    @AuthAction(AuthService.PrivilegeType.WRITE_RULE)
+    public Result<ParamFlowRuleEntity> apiUpdateParamFlowRule(@PathVariable("id") Long id,
+                                                              @RequestBody ParamFlowRuleEntity entity) {
+        if (id == null || id <= 0) {
+            return Result.ofFail(-1, "Invalid id");
+        }
+        ParamFlowRuleEntity oldEntity = repository.findById(id);
+        if (oldEntity == null) {
+            return Result.ofFail(-1, "id " + id + " does not exist");
+        }
+
+        Result<ParamFlowRuleEntity> checkResult = checkEntityInternal(entity);
+        if (checkResult != null) {
+            return checkResult;
+        }
+        if (!checkIfSupported(entity.getApp(), entity.getIp(), entity.getPort())) {
+            return unsupportedVersion();
+        }
+        entity.setId(id);
+        Date date = new Date();
+        entity.setGmtCreate(oldEntity.getGmtCreate());
+        entity.setGmtModified(date);
+        try {
+            entity = repository.save(entity);
+            publishRules(entity.getApp(), entity.getIp(), entity.getPort()).get();
+            return Result.ofSuccess(entity);
+        } catch (ExecutionException ex) {
+            logger.error("Error when updating parameter flow rules, id=" + id, ex.getCause());
+            if (isNotSupported(ex.getCause())) {
+                return unsupportedVersion();
+            } else {
+                return Result.ofThrowable(-1, ex.getCause());
+            }
+        } catch (Throwable throwable) {
+            logger.error("Error when updating parameter flow rules, id=" + id, throwable);
+            return Result.ofFail(-1, throwable.getMessage());
+        }
+    }
+
+    @DeleteMapping("/rule/{id}")
+    @AuthAction(PrivilegeType.DELETE_RULE)
+    public Result<Long> apiDeleteRule(@PathVariable("id") Long id) {
+        if (id == null) {
+            return Result.ofFail(-1, "id cannot be null");
+        }
+        ParamFlowRuleEntity oldEntity = repository.findById(id);
+        if (oldEntity == null) {
+            return Result.ofSuccess(null);
+        }
+
+        try {
+            repository.delete(id);
+            publishRules(oldEntity.getApp(), oldEntity.getIp(), oldEntity.getPort()).get();
+            return Result.ofSuccess(id);
+        } catch (ExecutionException ex) {
+            logger.error("Error when deleting parameter flow rules", ex.getCause());
+            if (isNotSupported(ex.getCause())) {
+                return unsupportedVersion();
+            } else {
+                return Result.ofThrowable(-1, ex.getCause());
+            }
+        } catch (Throwable throwable) {
+            logger.error("Error when deleting parameter flow rules", throwable);
+            return Result.ofFail(-1, throwable.getMessage());
+        }
+    }
+
+    private CompletableFuture<Void> publishRules(String app, String ip, Integer port) {
+        List<ParamFlowRuleEntity> rules = repository.findAllByMachine(MachineInfo.of(app, ip, port));
+        return sentinelApiClient.setParamFlowRuleOfMachine(app, ip, port, rules);
+    }
+
+    private <R> Result<R> unsupportedVersion() {
+        return Result.ofFail(4041,
+            "Sentinel client not supported for parameter flow control (unsupported version or dependency absent)");
+    }
+
+    private final SentinelVersion version020 = new SentinelVersion().setMinorVersion(2);
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ResourceController.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ResourceController.java
new file mode 100644
index 0000000..70382c7
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ResourceController.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.controller;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.alibaba.csp.sentinel.util.StringUtil;
+import com.alibaba.csp.sentinel.command.vo.NodeVo;
+
+import com.alibaba.csp.sentinel.dashboard.domain.ResourceTreeNode;
+import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient;
+import com.alibaba.csp.sentinel.dashboard.domain.Result;
+import com.alibaba.csp.sentinel.dashboard.domain.vo.ResourceVo;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author Carpenter Lee
+ */
+@RestController
+@RequestMapping(value = "/resource")
+public class ResourceController {
+
+    private static Logger logger = LoggerFactory.getLogger(ResourceController.class);
+
+    @Autowired
+    private SentinelApiClient httpFetcher;
+
+    /**
+     * Fetch real time statistics info of the machine.
+     *
+     * @param ip        ip to fetch
+     * @param port      port of the ip
+     * @param type      one of [root, default, cluster], 'root' means fetching from tree root node, 'default' means
+     *                  fetching from tree default node, 'cluster' means fetching from cluster node.
+     * @param searchKey key to search
+     * @return node statistics info.
+     */
+    @GetMapping("/machineResource.json")
+    public Result<List<ResourceVo>> fetchResourceChainListOfMachine(String ip, Integer port, String type,
+                                                                    String searchKey) {
+        if (StringUtil.isEmpty(ip) || port == null) {
+            return Result.ofFail(-1, "invalid param, give ip, port");
+        }
+        final String ROOT = "root";
+        final String DEFAULT = "default";
+        if (StringUtil.isEmpty(type)) {
+            type = ROOT;
+        }
+        if (ROOT.equalsIgnoreCase(type) || DEFAULT.equalsIgnoreCase(type)) {
+            List<NodeVo> nodeVos = httpFetcher.fetchResourceOfMachine(ip, port, type);
+            if (nodeVos == null) {
+                return Result.ofSuccess(null);
+            }
+            ResourceTreeNode treeNode = ResourceTreeNode.fromNodeVoList(nodeVos);
+            treeNode.searchIgnoreCase(searchKey);
+            return Result.ofSuccess(ResourceVo.fromResourceTreeNode(treeNode));
+        } else {
+            // Normal (cluster node).
+            List<NodeVo> nodeVos = httpFetcher.fetchClusterNodeOfMachine(ip, port, true);
+            if (nodeVos == null) {
+                return Result.ofSuccess(null);
+            }
+            if (StringUtil.isNotEmpty(searchKey)) {
+                nodeVos = nodeVos.stream().filter(node -> node.getResource()
+                    .toLowerCase().contains(searchKey.toLowerCase()))
+                    .collect(Collectors.toList());
+            }
+            return Result.ofSuccess(ResourceVo.fromNodeVoList(nodeVos));
+        }
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/SystemController.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/SystemController.java
new file mode 100644
index 0000000..a13693f
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/SystemController.java
@@ -0,0 +1,254 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.controller;
+
+import com.alibaba.csp.sentinel.dashboard.auth.AuthAction;
+import com.alibaba.csp.sentinel.dashboard.auth.AuthService.PrivilegeType;
+import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient;
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.SystemRuleEntity;
+import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement;
+import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo;
+import com.alibaba.csp.sentinel.dashboard.domain.Result;
+import com.alibaba.csp.sentinel.dashboard.repository.rule.RuleRepository;
+import com.alibaba.csp.sentinel.util.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author leyou(lihao)
+ */
+@RestController
+@RequestMapping("/system")
+public class SystemController {
+
+    private final Logger logger = LoggerFactory.getLogger(SystemController.class);
+
+    @Autowired
+    private RuleRepository<SystemRuleEntity, Long> repository;
+    @Autowired
+    private SentinelApiClient sentinelApiClient;
+    @Autowired
+    private AppManagement appManagement;
+
+    private <R> Result<R> checkBasicParams(String app, String ip, Integer port) {
+        if (StringUtil.isEmpty(app)) {
+            return Result.ofFail(-1, "app can't be null or empty");
+        }
+        if (StringUtil.isEmpty(ip)) {
+            return Result.ofFail(-1, "ip can't be null or empty");
+        }
+        if (port == null) {
+            return Result.ofFail(-1, "port can't be null");
+        }
+        if (!appManagement.isValidMachineOfApp(app, ip)) {
+            return Result.ofFail(-1, "given ip does not belong to given app");
+        }
+        if (port <= 0 || port > 65535) {
+            return Result.ofFail(-1, "port should be in (0, 65535)");
+        }
+        return null;
+    }
+
+    @GetMapping("/rules.json")
+    @AuthAction(PrivilegeType.READ_RULE)
+    public Result<List<SystemRuleEntity>> apiQueryMachineRules(String app, String ip,
+                                                               Integer port) {
+        Result<List<SystemRuleEntity>> checkResult = checkBasicParams(app, ip, port);
+        if (checkResult != null) {
+            return checkResult;
+        }
+        try {
+            List<SystemRuleEntity> rules = sentinelApiClient.fetchSystemRuleOfMachine(app, ip, port);
+            rules = repository.saveAll(rules);
+            return Result.ofSuccess(rules);
+        } catch (Throwable throwable) {
+            logger.error("Query machine system rules error", throwable);
+            return Result.ofThrowable(-1, throwable);
+        }
+    }
+
+    private int countNotNullAndNotNegative(Number... values) {
+        int notNullCount = 0;
+        for (int i = 0; i < values.length; i++) {
+            if (values[i] != null && values[i].doubleValue() >= 0) {
+                notNullCount++;
+            }
+        }
+        return notNullCount;
+    }
+
+    @RequestMapping("/new.json")
+    @AuthAction(PrivilegeType.WRITE_RULE)
+    public Result<SystemRuleEntity> apiAdd(String app, String ip, Integer port,
+                                           Double highestSystemLoad, Double highestCpuUsage, Long avgRt,
+                                           Long maxThread, Double qps) {
+
+        Result<SystemRuleEntity> checkResult = checkBasicParams(app, ip, port);
+        if (checkResult != null) {
+            return checkResult;
+        }
+
+        int notNullCount = countNotNullAndNotNegative(highestSystemLoad, avgRt, maxThread, qps, highestCpuUsage);
+        if (notNullCount != 1) {
+            return Result.ofFail(-1, "only one of [highestSystemLoad, avgRt, maxThread, qps,highestCpuUsage] "
+                + "value must be set > 0, but " + notNullCount + " values get");
+        }
+        if (null != highestCpuUsage && highestCpuUsage > 1) {
+            return Result.ofFail(-1, "highestCpuUsage must between [0.0, 1.0]");
+        }
+        SystemRuleEntity entity = new SystemRuleEntity();
+        entity.setApp(app.trim());
+        entity.setIp(ip.trim());
+        entity.setPort(port);
+        // -1 is a fake value
+        if (null != highestSystemLoad) {
+            entity.setHighestSystemLoad(highestSystemLoad);
+        } else {
+            entity.setHighestSystemLoad(-1D);
+        }
+
+        if (null != highestCpuUsage) {
+            entity.setHighestCpuUsage(highestCpuUsage);
+        } else {
+            entity.setHighestCpuUsage(-1D);
+        }
+
+        if (avgRt != null) {
+            entity.setAvgRt(avgRt);
+        } else {
+            entity.setAvgRt(-1L);
+        }
+        if (maxThread != null) {
+            entity.setMaxThread(maxThread);
+        } else {
+            entity.setMaxThread(-1L);
+        }
+        if (qps != null) {
+            entity.setQps(qps);
+        } else {
+            entity.setQps(-1D);
+        }
+        Date date = new Date();
+        entity.setGmtCreate(date);
+        entity.setGmtModified(date);
+        try {
+            entity = repository.save(entity);
+        } catch (Throwable throwable) {
+            logger.error("Add SystemRule error", throwable);
+            return Result.ofThrowable(-1, throwable);
+        }
+        if (!publishRules(app, ip, port)) {
+            logger.warn("Publish system rules fail after rule add");
+        }
+        return Result.ofSuccess(entity);
+    }
+
+    @GetMapping("/save.json")
+    @AuthAction(PrivilegeType.WRITE_RULE)
+    public Result<SystemRuleEntity> apiUpdateIfNotNull(Long id, String app, Double highestSystemLoad,
+            Double highestCpuUsage, Long avgRt, Long maxThread, Double qps) {
+        if (id == null) {
+            return Result.ofFail(-1, "id can't be null");
+        }
+        SystemRuleEntity entity = repository.findById(id);
+        if (entity == null) {
+            return Result.ofFail(-1, "id " + id + " dose not exist");
+        }
+
+        if (StringUtil.isNotBlank(app)) {
+            entity.setApp(app.trim());
+        }
+        if (highestSystemLoad != null) {
+            if (highestSystemLoad < 0) {
+                return Result.ofFail(-1, "highestSystemLoad must >= 0");
+            }
+            entity.setHighestSystemLoad(highestSystemLoad);
+        }
+        if (highestCpuUsage != null) {
+            if (highestCpuUsage < 0) {
+                return Result.ofFail(-1, "highestCpuUsage must >= 0");
+            }
+            if (highestCpuUsage > 1) {
+                return Result.ofFail(-1, "highestCpuUsage must <= 1");
+            }
+            entity.setHighestCpuUsage(highestCpuUsage);
+        }
+        if (avgRt != null) {
+            if (avgRt < 0) {
+                return Result.ofFail(-1, "avgRt must >= 0");
+            }
+            entity.setAvgRt(avgRt);
+        }
+        if (maxThread != null) {
+            if (maxThread < 0) {
+                return Result.ofFail(-1, "maxThread must >= 0");
+            }
+            entity.setMaxThread(maxThread);
+        }
+        if (qps != null) {
+            if (qps < 0) {
+                return Result.ofFail(-1, "qps must >= 0");
+            }
+            entity.setQps(qps);
+        }
+        Date date = new Date();
+        entity.setGmtModified(date);
+        try {
+            entity = repository.save(entity);
+        } catch (Throwable throwable) {
+            logger.error("save error:", throwable);
+            return Result.ofThrowable(-1, throwable);
+        }
+        if (!publishRules(entity.getApp(), entity.getIp(), entity.getPort())) {
+            logger.info("publish system rules fail after rule update");
+        }
+        return Result.ofSuccess(entity);
+    }
+
+    @RequestMapping("/delete.json")
+    @AuthAction(PrivilegeType.DELETE_RULE)
+    public Result<?> delete(Long id) {
+        if (id == null) {
+            return Result.ofFail(-1, "id can't be null");
+        }
+        SystemRuleEntity oldEntity = repository.findById(id);
+        if (oldEntity == null) {
+            return Result.ofSuccess(null);
+        }
+        try {
+            repository.delete(id);
+        } catch (Throwable throwable) {
+            logger.error("delete error:", throwable);
+            return Result.ofThrowable(-1, throwable);
+        }
+        if (!publishRules(oldEntity.getApp(), oldEntity.getIp(), oldEntity.getPort())) {
+            logger.info("publish system rules fail after rule delete");
+        }
+        return Result.ofSuccess(id);
+    }
+
+    private boolean publishRules(String app, String ip, Integer port) {
+        List<SystemRuleEntity> rules = repository.findAllByMachine(MachineInfo.of(app, ip, port));
+        return sentinelApiClient.setSystemRuleOfMachine(app, ip, port, rules);
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/VersionController.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/VersionController.java
new file mode 100644
index 0000000..69d66ea
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/VersionController.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.controller;
+
+import com.alibaba.csp.sentinel.dashboard.domain.Result;
+import com.alibaba.csp.sentinel.util.StringUtil;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author hisenyuan
+ * @since 1.7.0
+ */
+@RestController
+public class VersionController {
+
+    private static final String VERSION_PATTERN = "-";
+
+    @Value("${sentinel.dashboard.version:}")
+    private String sentinelDashboardVersion;
+
+    @GetMapping("/version")
+    public Result<String> apiGetVersion() {
+        if (StringUtil.isNotBlank(sentinelDashboardVersion)) {
+            String res = sentinelDashboardVersion;
+            if (sentinelDashboardVersion.contains(VERSION_PATTERN)) {
+                res = sentinelDashboardVersion.substring(0, sentinelDashboardVersion.indexOf(VERSION_PATTERN));
+            }
+            return Result.ofSuccess(res);
+        } else {
+            return Result.ofFail(1, "getVersion failed: empty version");
+        }
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/cluster/ClusterAssignController.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/cluster/ClusterAssignController.java
new file mode 100644
index 0000000..dc2e14f
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/cluster/ClusterAssignController.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.controller.cluster;
+
+import java.util.Collections;
+import java.util.Set;
+
+import com.alibaba.csp.sentinel.util.StringUtil;
+
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.ClusterAppFullAssignRequest;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.ClusterAppAssignResultVO;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.ClusterAppSingleServerAssignRequest;
+import com.alibaba.csp.sentinel.dashboard.service.ClusterAssignService;
+import com.alibaba.csp.sentinel.dashboard.domain.Result;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.1
+ */
+@RestController
+@RequestMapping("/cluster/assign")
+public class ClusterAssignController {
+
+    private final Logger logger = LoggerFactory.getLogger(ClusterAssignController.class);
+
+    @Autowired
+    private ClusterAssignService clusterAssignService;
+
+    @PostMapping("/all_server/{app}")
+    public Result<ClusterAppAssignResultVO> apiAssignAllClusterServersOfApp(@PathVariable String app,
+                                                                            @RequestBody
+                                                                                ClusterAppFullAssignRequest assignRequest) {
+        if (StringUtil.isEmpty(app)) {
+            return Result.ofFail(-1, "app cannot be null or empty");
+        }
+        if (assignRequest == null || assignRequest.getClusterMap() == null
+            || assignRequest.getRemainingList() == null) {
+            return Result.ofFail(-1, "bad request body");
+        }
+        try {
+            return Result.ofSuccess(clusterAssignService.applyAssignToApp(app, assignRequest.getClusterMap(),
+                assignRequest.getRemainingList()));
+        } catch (Throwable throwable) {
+            logger.error("Error when assigning full cluster servers for app: " + app, throwable);
+            return Result.ofFail(-1, throwable.getMessage());
+        }
+    }
+
+    @PostMapping("/single_server/{app}")
+    public Result<ClusterAppAssignResultVO> apiAssignSingleClusterServersOfApp(@PathVariable String app,
+                                                                               @RequestBody ClusterAppSingleServerAssignRequest assignRequest) {
+        if (StringUtil.isEmpty(app)) {
+            return Result.ofFail(-1, "app cannot be null or empty");
+        }
+        if (assignRequest == null || assignRequest.getClusterMap() == null) {
+            return Result.ofFail(-1, "bad request body");
+        }
+        try {
+            return Result.ofSuccess(clusterAssignService.applyAssignToApp(app, Collections.singletonList(assignRequest.getClusterMap()),
+                assignRequest.getRemainingList()));
+        } catch (Throwable throwable) {
+            logger.error("Error when assigning single cluster servers for app: " + app, throwable);
+            return Result.ofFail(-1, throwable.getMessage());
+        }
+    }
+
+    @PostMapping("/unbind_server/{app}")
+    public Result<ClusterAppAssignResultVO> apiUnbindClusterServersOfApp(@PathVariable String app,
+                                                                         @RequestBody Set<String> machineIds) {
+        if (StringUtil.isEmpty(app)) {
+            return Result.ofFail(-1, "app cannot be null or empty");
+        }
+        if (machineIds == null || machineIds.isEmpty()) {
+            return Result.ofFail(-1, "bad request body");
+        }
+        try {
+            return Result.ofSuccess(clusterAssignService.unbindClusterServers(app, machineIds));
+        } catch (Throwable throwable) {
+            logger.error("Error when unbinding cluster server {} for app <{}>", machineIds, app, throwable);
+            return Result.ofFail(-1, throwable.getMessage());
+        }
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/cluster/ClusterConfigController.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/cluster/ClusterConfigController.java
new file mode 100644
index 0000000..e9b9aed
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/cluster/ClusterConfigController.java
@@ -0,0 +1,245 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.controller.cluster;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
+
+import com.alibaba.csp.sentinel.cluster.ClusterStateManager;
+import com.alibaba.csp.sentinel.dashboard.client.CommandNotFoundException;
+import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement;
+import com.alibaba.csp.sentinel.util.StringUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.SentinelVersion;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.request.ClusterClientModifyRequest;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.request.ClusterModifyRequest;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.request.ClusterServerModifyRequest;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.state.AppClusterClientStateWrapVO;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.state.AppClusterServerStateWrapVO;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.state.ClusterUniversalStatePairVO;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.state.ClusterUniversalStateVO;
+import com.alibaba.csp.sentinel.dashboard.service.ClusterConfigService;
+import com.alibaba.csp.sentinel.dashboard.util.ClusterEntityUtils;
+import com.alibaba.csp.sentinel.dashboard.util.VersionUtils;
+import com.alibaba.csp.sentinel.dashboard.domain.Result;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.0
+ */
+@RestController
+@RequestMapping(value = "/cluster")
+public class ClusterConfigController {
+
+    private final Logger logger = LoggerFactory.getLogger(ClusterConfigController.class);
+
+    private final SentinelVersion version140 = new SentinelVersion().setMajorVersion(1).setMinorVersion(4);
+
+    @Autowired
+    private AppManagement appManagement;
+
+    @Autowired
+    private ClusterConfigService clusterConfigService;
+
+    @PostMapping("/config/modify_single")
+    public Result<Boolean> apiModifyClusterConfig(@RequestBody String payload) {
+        if (StringUtil.isBlank(payload)) {
+            return Result.ofFail(-1, "empty request body");
+        }
+        try {
+            JSONObject body = JSON.parseObject(payload);
+            if (body.containsKey(KEY_MODE)) {
+                int mode = body.getInteger(KEY_MODE);
+                switch (mode) {
+                    case ClusterStateManager.CLUSTER_CLIENT:
+                        ClusterClientModifyRequest data = JSON.parseObject(payload, ClusterClientModifyRequest.class);
+                        Result<Boolean> res = checkValidRequest(data);
+                        if (res != null) {
+                            return res;
+                        }
+                        clusterConfigService.modifyClusterClientConfig(data).get();
+                        return Result.ofSuccess(true);
+                    case ClusterStateManager.CLUSTER_SERVER:
+                        ClusterServerModifyRequest d = JSON.parseObject(payload, ClusterServerModifyRequest.class);
+                        Result<Boolean> r = checkValidRequest(d);
+                        if (r != null) {
+                            return r;
+                        }
+                        // TODO: bad design here, should refactor!
+                        clusterConfigService.modifyClusterServerConfig(d).get();
+                        return Result.ofSuccess(true);
+                    default:
+                        return Result.ofFail(-1, "invalid mode");
+                }
+            }
+            return Result.ofFail(-1, "invalid parameter");
+        } catch (ExecutionException ex) {
+            logger.error("Error when modifying cluster config", ex.getCause());
+            return errorResponse(ex);
+        } catch (Throwable ex) {
+            logger.error("Error when modifying cluster config", ex);
+            return Result.ofFail(-1, ex.getMessage());
+        }
+    }
+
+    private <T> Result<T> errorResponse(ExecutionException ex) {
+        if (isNotSupported(ex.getCause())) {
+            return unsupportedVersion();
+        } else {
+            return Result.ofThrowable(-1, ex.getCause());
+        }
+    }
+
+    @GetMapping("/state_single")
+    public Result<ClusterUniversalStateVO> apiGetClusterState(@RequestParam String app,
+                                                              @RequestParam String ip,
+                                                              @RequestParam Integer port) {
+        if (StringUtil.isEmpty(app)) {
+            return Result.ofFail(-1, "app cannot be null or empty");
+        }
+        if (StringUtil.isEmpty(ip)) {
+            return Result.ofFail(-1, "ip cannot be null or empty");
+        }
+        if (port == null || port <= 0) {
+            return Result.ofFail(-1, "Invalid parameter: port");
+        }
+        if (!checkIfSupported(app, ip, port)) {
+            return unsupportedVersion();
+        }
+        try {
+            return clusterConfigService.getClusterUniversalState(app, ip, port)
+                .thenApply(Result::ofSuccess)
+                .get();
+        } catch (ExecutionException ex) {
+            logger.error("Error when fetching cluster state", ex.getCause());
+            return errorResponse(ex);
+        } catch (Throwable throwable) {
+            logger.error("Error when fetching cluster state", throwable);
+            return Result.ofFail(-1, throwable.getMessage());
+        }
+    }
+
+    @GetMapping("/server_state/{app}")
+    public Result<List<AppClusterServerStateWrapVO>> apiGetClusterServerStateOfApp(@PathVariable String app) {
+        if (StringUtil.isEmpty(app)) {
+            return Result.ofFail(-1, "app cannot be null or empty");
+        }
+        try {
+            return clusterConfigService.getClusterUniversalState(app)
+                .thenApply(ClusterEntityUtils::wrapToAppClusterServerState)
+                .thenApply(Result::ofSuccess)
+                .get();
+        } catch (ExecutionException ex) {
+            logger.error("Error when fetching cluster server state of app: " + app, ex.getCause());
+            return errorResponse(ex);
+        } catch (Throwable throwable) {
+            logger.error("Error when fetching cluster server state of app: " + app, throwable);
+            return Result.ofFail(-1, throwable.getMessage());
+        }
+    }
+
+    @GetMapping("/client_state/{app}")
+    public Result<List<AppClusterClientStateWrapVO>> apiGetClusterClientStateOfApp(@PathVariable String app) {
+        if (StringUtil.isEmpty(app)) {
+            return Result.ofFail(-1, "app cannot be null or empty");
+        }
+        try {
+            return clusterConfigService.getClusterUniversalState(app)
+                .thenApply(ClusterEntityUtils::wrapToAppClusterClientState)
+                .thenApply(Result::ofSuccess)
+                .get();
+        } catch (ExecutionException ex) {
+            logger.error("Error when fetching cluster token client state of app: " + app, ex.getCause());
+            return errorResponse(ex);
+        } catch (Throwable throwable) {
+            logger.error("Error when fetching cluster token client state of app: " + app, throwable);
+            return Result.ofFail(-1, throwable.getMessage());
+        }
+    }
+
+    @GetMapping("/state/{app}")
+    public Result<List<ClusterUniversalStatePairVO>> apiGetClusterStateOfApp(@PathVariable String app) {
+        if (StringUtil.isEmpty(app)) {
+            return Result.ofFail(-1, "app cannot be null or empty");
+        }
+        try {
+            return clusterConfigService.getClusterUniversalState(app)
+                .thenApply(Result::ofSuccess)
+                .get();
+        } catch (ExecutionException ex) {
+            logger.error("Error when fetching cluster state of app: " + app, ex.getCause());
+            return errorResponse(ex);
+        } catch (Throwable throwable) {
+            logger.error("Error when fetching cluster state of app: " + app, throwable);
+            return Result.ofFail(-1, throwable.getMessage());
+        }
+    }
+
+    private boolean isNotSupported(Throwable ex) {
+        return ex instanceof CommandNotFoundException;
+    }
+
+    private boolean checkIfSupported(String app, String ip, int port) {
+        try {
+            return Optional.ofNullable(appManagement.getDetailApp(app))
+                .flatMap(e -> e.getMachine(ip, port))
+                .flatMap(m -> VersionUtils.parseVersion(m.getVersion())
+                    .map(v -> v.greaterOrEqual(version140)))
+                .orElse(true);
+            // If error occurred or cannot retrieve machine info, return true.
+        } catch (Exception ex) {
+            return true;
+        }
+    }
+
+    private Result<Boolean> checkValidRequest(ClusterModifyRequest request) {
+        if (StringUtil.isEmpty(request.getApp())) {
+            return Result.ofFail(-1, "app cannot be empty");
+        }
+        if (StringUtil.isEmpty(request.getIp())) {
+            return Result.ofFail(-1, "ip cannot be empty");
+        }
+        if (request.getPort() == null || request.getPort() < 0) {
+            return Result.ofFail(-1, "invalid port");
+        }
+        if (request.getMode() == null || request.getMode() < 0) {
+            return Result.ofFail(-1, "invalid mode");
+        }
+        if (!checkIfSupported(request.getApp(), request.getIp(), request.getPort())) {
+            return unsupportedVersion();
+        }
+        return null;
+    }
+
+    private <R> Result<R> unsupportedVersion() {
+        return Result.ofFail(4041, "Sentinel client not supported for cluster flow control (unsupported version or dependency absent)");
+    }
+
+    private static final String KEY_MODE = "mode";
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayApiController.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayApiController.java
new file mode 100644
index 0000000..c7a405d
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayApiController.java
@@ -0,0 +1,260 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.controller.gateway;
+
+import com.alibaba.csp.sentinel.dashboard.auth.AuthAction;
+import com.alibaba.csp.sentinel.dashboard.auth.AuthService;
+import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient;
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.ApiDefinitionEntity;
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.ApiPredicateItemEntity;
+import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo;
+import com.alibaba.csp.sentinel.dashboard.domain.Result;
+import com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.api.AddApiReqVo;
+import com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.api.ApiPredicateItemVo;
+import com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.api.UpdateApiReqVo;
+import com.alibaba.csp.sentinel.dashboard.repository.gateway.InMemApiDefinitionStore;
+import com.alibaba.csp.sentinel.util.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
+
+import static com.alibaba.csp.sentinel.adapter.gateway.common.SentinelGatewayConstants.*;
+
+/**
+ * Gateway api Controller for manage gateway api definitions.
+ *
+ * @author cdfive
+ * @since 1.7.0
+ */
+@RestController
+@RequestMapping(value = "/gateway/api")
+public class GatewayApiController {
+
+    private final Logger logger = LoggerFactory.getLogger(GatewayApiController.class);
+
+    @Autowired
+    private InMemApiDefinitionStore repository;
+
+    @Autowired
+    private SentinelApiClient sentinelApiClient;
+
+    @GetMapping("/list.json")
+    @AuthAction(AuthService.PrivilegeType.READ_RULE)
+    public Result<List<ApiDefinitionEntity>> queryApis(String app, String ip, Integer port) {
+
+        if (StringUtil.isEmpty(app)) {
+            return Result.ofFail(-1, "app can't be null or empty");
+        }
+        if (StringUtil.isEmpty(ip)) {
+            return Result.ofFail(-1, "ip can't be null or empty");
+        }
+        if (port == null) {
+            return Result.ofFail(-1, "port can't be null");
+        }
+
+        try {
+            List<ApiDefinitionEntity> apis = sentinelApiClient.fetchApis(app, ip, port).get();
+            repository.saveAll(apis);
+            return Result.ofSuccess(apis);
+        } catch (Throwable throwable) {
+            logger.error("queryApis error:", throwable);
+            return Result.ofThrowable(-1, throwable);
+        }
+    }
+
+    @PostMapping("/new.json")
+    @AuthAction(AuthService.PrivilegeType.WRITE_RULE)
+    public Result<ApiDefinitionEntity> addApi(HttpServletRequest request, @RequestBody AddApiReqVo reqVo) {
+
+        String app = reqVo.getApp();
+        if (StringUtil.isBlank(app)) {
+            return Result.ofFail(-1, "app can't be null or empty");
+        }
+
+        ApiDefinitionEntity entity = new ApiDefinitionEntity();
+        entity.setApp(app.trim());
+
+        String ip = reqVo.getIp();
+        if (StringUtil.isBlank(ip)) {
+            return Result.ofFail(-1, "ip can't be null or empty");
+        }
+        entity.setIp(ip.trim());
+
+        Integer port = reqVo.getPort();
+        if (port == null) {
+            return Result.ofFail(-1, "port can't be null");
+        }
+        entity.setPort(port);
+
+        // API鍚嶇О
+        String apiName = reqVo.getApiName();
+        if (StringUtil.isBlank(apiName)) {
+            return Result.ofFail(-1, "apiName can't be null or empty");
+        }
+        entity.setApiName(apiName.trim());
+
+        // 鍖归厤瑙勫垯鍒楄〃
+        List<ApiPredicateItemVo> predicateItems = reqVo.getPredicateItems();
+        if (CollectionUtils.isEmpty(predicateItems)) {
+            return Result.ofFail(-1, "predicateItems can't empty");
+        }
+
+        List<ApiPredicateItemEntity> predicateItemEntities = new ArrayList<>();
+        for (ApiPredicateItemVo predicateItem : predicateItems) {
+            ApiPredicateItemEntity predicateItemEntity = new ApiPredicateItemEntity();
+
+            // 鍖归厤妯″紡
+            Integer matchStrategy = predicateItem.getMatchStrategy();
+            if (!Arrays.asList(URL_MATCH_STRATEGY_EXACT, URL_MATCH_STRATEGY_PREFIX, URL_MATCH_STRATEGY_REGEX).contains(matchStrategy)) {
+                return Result.ofFail(-1, "invalid matchStrategy: " + matchStrategy);
+            }
+            predicateItemEntity.setMatchStrategy(matchStrategy);
+
+            // 鍖归厤涓�
+            String pattern = predicateItem.getPattern();
+            if (StringUtil.isBlank(pattern)) {
+                return Result.ofFail(-1, "pattern can't be null or empty");
+            }
+            predicateItemEntity.setPattern(pattern);
+
+            predicateItemEntities.add(predicateItemEntity);
+        }
+        entity.setPredicateItems(new LinkedHashSet<>(predicateItemEntities));
+
+        // 妫�鏌PI鍚嶇О涓嶈兘閲嶅
+        List<ApiDefinitionEntity> allApis = repository.findAllByMachine(MachineInfo.of(app.trim(), ip.trim(), port));
+        if (allApis.stream().map(o -> o.getApiName()).anyMatch(o -> o.equals(apiName.trim()))) {
+            return Result.ofFail(-1, "apiName exists: " + apiName);
+        }
+
+        Date date = new Date();
+        entity.setGmtCreate(date);
+        entity.setGmtModified(date);
+
+        try {
+            entity = repository.save(entity);
+        } catch (Throwable throwable) {
+            logger.error("add gateway api error:", throwable);
+            return Result.ofThrowable(-1, throwable);
+        }
+
+        if (!publishApis(app, ip, port)) {
+            logger.warn("publish gateway apis fail after add");
+        }
+
+        return Result.ofSuccess(entity);
+    }
+
+    @PostMapping("/save.json")
+    @AuthAction(AuthService.PrivilegeType.WRITE_RULE)
+    public Result<ApiDefinitionEntity> updateApi(@RequestBody UpdateApiReqVo reqVo) {
+        String app = reqVo.getApp();
+        if (StringUtil.isBlank(app)) {
+            return Result.ofFail(-1, "app can't be null or empty");
+        }
+
+        Long id = reqVo.getId();
+        if (id == null) {
+            return Result.ofFail(-1, "id can't be null");
+        }
+
+        ApiDefinitionEntity entity = repository.findById(id);
+        if (entity == null) {
+            return Result.ofFail(-1, "api does not exist, id=" + id);
+        }
+
+        // 鍖归厤瑙勫垯鍒楄〃
+        List<ApiPredicateItemVo> predicateItems = reqVo.getPredicateItems();
+        if (CollectionUtils.isEmpty(predicateItems)) {
+            return Result.ofFail(-1, "predicateItems can't empty");
+        }
+
+        List<ApiPredicateItemEntity> predicateItemEntities = new ArrayList<>();
+        for (ApiPredicateItemVo predicateItem : predicateItems) {
+            ApiPredicateItemEntity predicateItemEntity = new ApiPredicateItemEntity();
+
+            // 鍖归厤妯″紡
+            int matchStrategy = predicateItem.getMatchStrategy();
+            if (!Arrays.asList(URL_MATCH_STRATEGY_EXACT, URL_MATCH_STRATEGY_PREFIX, URL_MATCH_STRATEGY_REGEX).contains(matchStrategy)) {
+                return Result.ofFail(-1, "Invalid matchStrategy: " + matchStrategy);
+            }
+            predicateItemEntity.setMatchStrategy(matchStrategy);
+
+            // 鍖归厤涓�
+            String pattern = predicateItem.getPattern();
+            if (StringUtil.isBlank(pattern)) {
+                return Result.ofFail(-1, "pattern can't be null or empty");
+            }
+            predicateItemEntity.setPattern(pattern);
+
+            predicateItemEntities.add(predicateItemEntity);
+        }
+        entity.setPredicateItems(new LinkedHashSet<>(predicateItemEntities));
+
+        Date date = new Date();
+        entity.setGmtModified(date);
+
+        try {
+            entity = repository.save(entity);
+        } catch (Throwable throwable) {
+            logger.error("update gateway api error:", throwable);
+            return Result.ofThrowable(-1, throwable);
+        }
+
+        if (!publishApis(app, entity.getIp(), entity.getPort())) {
+            logger.warn("publish gateway apis fail after update");
+        }
+
+        return Result.ofSuccess(entity);
+    }
+
+    @PostMapping("/delete.json")
+    @AuthAction(AuthService.PrivilegeType.DELETE_RULE)
+
+    public Result<Long> deleteApi(Long id) {
+        if (id == null) {
+            return Result.ofFail(-1, "id can't be null");
+        }
+
+        ApiDefinitionEntity oldEntity = repository.findById(id);
+        if (oldEntity == null) {
+            return Result.ofSuccess(null);
+        }
+
+        try {
+            repository.delete(id);
+        } catch (Throwable throwable) {
+            logger.error("delete gateway api error:", throwable);
+            return Result.ofThrowable(-1, throwable);
+        }
+
+        if (!publishApis(oldEntity.getApp(), oldEntity.getIp(), oldEntity.getPort())) {
+            logger.warn("publish gateway apis fail after delete");
+        }
+
+        return Result.ofSuccess(id);
+    }
+
+    private boolean publishApis(String app, String ip, Integer port) {
+        List<ApiDefinitionEntity> apis = repository.findAllByMachine(MachineInfo.of(app, ip, port));
+        return sentinelApiClient.modifyApis(app, ip, port, apis);
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayFlowRuleController.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayFlowRuleController.java
new file mode 100644
index 0000000..b0a53e7
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayFlowRuleController.java
@@ -0,0 +1,431 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.controller.gateway;
+
+
+import com.alibaba.csp.sentinel.dashboard.auth.AuthAction;
+import com.alibaba.csp.sentinel.dashboard.auth.AuthService;
+import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient;
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.GatewayFlowRuleEntity;
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.GatewayParamFlowItemEntity;
+import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo;
+import com.alibaba.csp.sentinel.dashboard.domain.Result;
+import com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.rule.AddFlowRuleReqVo;
+import com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.rule.GatewayParamFlowItemVo;
+import com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.rule.UpdateFlowRuleReqVo;
+import com.alibaba.csp.sentinel.dashboard.repository.gateway.InMemGatewayFlowRuleStore;
+import com.alibaba.csp.sentinel.util.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+import static com.alibaba.csp.sentinel.slots.block.RuleConstant.*;
+import static com.alibaba.csp.sentinel.adapter.gateway.common.SentinelGatewayConstants.*;
+import static com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.GatewayFlowRuleEntity.*;
+
+/**
+ * Gateway flow rule Controller for manage gateway flow rules.
+ *
+ * @author cdfive
+ * @since 1.7.0
+ */
+@RestController
+@RequestMapping(value = "/gateway/flow")
+public class GatewayFlowRuleController {
+
+    private final Logger logger = LoggerFactory.getLogger(GatewayFlowRuleController.class);
+
+    @Autowired
+    private InMemGatewayFlowRuleStore repository;
+
+    @Autowired
+    private SentinelApiClient sentinelApiClient;
+
+    @GetMapping("/list.json")
+    @AuthAction(AuthService.PrivilegeType.READ_RULE)
+    public Result<List<GatewayFlowRuleEntity>> queryFlowRules(String app, String ip, Integer port) {
+
+        if (StringUtil.isEmpty(app)) {
+            return Result.ofFail(-1, "app can't be null or empty");
+        }
+        if (StringUtil.isEmpty(ip)) {
+            return Result.ofFail(-1, "ip can't be null or empty");
+        }
+        if (port == null) {
+            return Result.ofFail(-1, "port can't be null");
+        }
+
+        try {
+            List<GatewayFlowRuleEntity> rules = sentinelApiClient.fetchGatewayFlowRules(app, ip, port).get();
+            repository.saveAll(rules);
+            return Result.ofSuccess(rules);
+        } catch (Throwable throwable) {
+            logger.error("query gateway flow rules error:", throwable);
+            return Result.ofThrowable(-1, throwable);
+        }
+    }
+
+    @PostMapping("/new.json")
+    @AuthAction(AuthService.PrivilegeType.WRITE_RULE)
+    public Result<GatewayFlowRuleEntity> addFlowRule(@RequestBody AddFlowRuleReqVo reqVo) {
+
+        String app = reqVo.getApp();
+        if (StringUtil.isBlank(app)) {
+            return Result.ofFail(-1, "app can't be null or empty");
+        }
+
+        GatewayFlowRuleEntity entity = new GatewayFlowRuleEntity();
+        entity.setApp(app.trim());
+
+        String ip = reqVo.getIp();
+        if (StringUtil.isBlank(ip)) {
+            return Result.ofFail(-1, "ip can't be null or empty");
+        }
+        entity.setIp(ip.trim());
+
+        Integer port = reqVo.getPort();
+        if (port == null) {
+            return Result.ofFail(-1, "port can't be null");
+        }
+        entity.setPort(port);
+
+        // API绫诲瀷, Route ID鎴朅PI鍒嗙粍
+        Integer resourceMode = reqVo.getResourceMode();
+        if (resourceMode == null) {
+            return Result.ofFail(-1, "resourceMode can't be null");
+        }
+        if (!Arrays.asList(RESOURCE_MODE_ROUTE_ID, RESOURCE_MODE_CUSTOM_API_NAME).contains(resourceMode)) {
+            return Result.ofFail(-1, "invalid resourceMode: " + resourceMode);
+        }
+        entity.setResourceMode(resourceMode);
+
+        // API鍚嶇О
+        String resource = reqVo.getResource();
+        if (StringUtil.isBlank(resource)) {
+            return Result.ofFail(-1, "resource can't be null or empty");
+        }
+        entity.setResource(resource.trim());
+
+        // 閽堝璇锋眰灞炴��
+        GatewayParamFlowItemVo paramItem = reqVo.getParamItem();
+        if (paramItem != null) {
+            GatewayParamFlowItemEntity itemEntity = new GatewayParamFlowItemEntity();
+            entity.setParamItem(itemEntity);
+
+            // 鍙傛暟灞炴�� 0-ClientIP 1-Remote Host 2-Header 3-URL鍙傛暟 4-Cookie
+            Integer parseStrategy = paramItem.getParseStrategy();
+            if (!Arrays.asList(PARAM_PARSE_STRATEGY_CLIENT_IP, PARAM_PARSE_STRATEGY_HOST, PARAM_PARSE_STRATEGY_HEADER
+                    , PARAM_PARSE_STRATEGY_URL_PARAM, PARAM_PARSE_STRATEGY_COOKIE).contains(parseStrategy)) {
+                return Result.ofFail(-1, "invalid parseStrategy: " + parseStrategy);
+            }
+            itemEntity.setParseStrategy(paramItem.getParseStrategy());
+
+            // 褰撳弬鏁板睘鎬т负2-Header 3-URL鍙傛暟 4-Cookie鏃讹紝鍙傛暟鍚嶇О蹇呭~
+            if (Arrays.asList(PARAM_PARSE_STRATEGY_HEADER, PARAM_PARSE_STRATEGY_URL_PARAM, PARAM_PARSE_STRATEGY_COOKIE).contains(parseStrategy)) {
+                // 鍙傛暟鍚嶇О
+                String fieldName = paramItem.getFieldName();
+                if (StringUtil.isBlank(fieldName)) {
+                    return Result.ofFail(-1, "fieldName can't be null or empty");
+                }
+                itemEntity.setFieldName(paramItem.getFieldName());
+            }
+
+            String pattern = paramItem.getPattern();
+            // 濡傛灉鍖归厤涓蹭笉涓虹┖锛岄獙璇佸尮閰嶆ā寮�
+            if (StringUtil.isNotEmpty(pattern)) {
+                itemEntity.setPattern(pattern);
+                Integer matchStrategy = paramItem.getMatchStrategy();
+                if (!Arrays.asList(PARAM_MATCH_STRATEGY_EXACT, PARAM_MATCH_STRATEGY_CONTAINS, PARAM_MATCH_STRATEGY_REGEX).contains(matchStrategy)) {
+                    return Result.ofFail(-1, "invalid matchStrategy: " + matchStrategy);
+                }
+                itemEntity.setMatchStrategy(matchStrategy);
+            }
+        }
+
+        // 闃堝�肩被鍨� 0-绾跨▼鏁� 1-QPS
+        Integer grade = reqVo.getGrade();
+        if (grade == null) {
+            return Result.ofFail(-1, "grade can't be null");
+        }
+        if (!Arrays.asList(FLOW_GRADE_THREAD, FLOW_GRADE_QPS).contains(grade)) {
+            return Result.ofFail(-1, "invalid grade: " + grade);
+        }
+        entity.setGrade(grade);
+
+        // QPS闃堝��
+        Double count = reqVo.getCount();
+        if (count == null) {
+            return Result.ofFail(-1, "count can't be null");
+        }
+        if (count < 0) {
+            return Result.ofFail(-1, "count should be at lease zero");
+        }
+        entity.setCount(count);
+
+        // 闂撮殧
+        Long interval = reqVo.getInterval();
+        if (interval == null) {
+            return Result.ofFail(-1, "interval can't be null");
+        }
+        if (interval <= 0) {
+            return Result.ofFail(-1, "interval should be greater than zero");
+        }
+        entity.setInterval(interval);
+
+        // 闂撮殧鍗曚綅
+        Integer intervalUnit = reqVo.getIntervalUnit();
+        if (intervalUnit == null) {
+            return Result.ofFail(-1, "intervalUnit can't be null");
+        }
+        if (!Arrays.asList(INTERVAL_UNIT_SECOND, INTERVAL_UNIT_MINUTE, INTERVAL_UNIT_HOUR, INTERVAL_UNIT_DAY).contains(intervalUnit)) {
+            return Result.ofFail(-1, "Invalid intervalUnit: " + intervalUnit);
+        }
+        entity.setIntervalUnit(intervalUnit);
+
+        // 娴佹帶鏂瑰紡 0-蹇�熷け璐� 2-鍖�閫熸帓闃�
+        Integer controlBehavior = reqVo.getControlBehavior();
+        if (controlBehavior == null) {
+            return Result.ofFail(-1, "controlBehavior can't be null");
+        }
+        if (!Arrays.asList(CONTROL_BEHAVIOR_DEFAULT, CONTROL_BEHAVIOR_RATE_LIMITER).contains(controlBehavior)) {
+            return Result.ofFail(-1, "invalid controlBehavior: " + controlBehavior);
+        }
+        entity.setControlBehavior(controlBehavior);
+
+        if (CONTROL_BEHAVIOR_DEFAULT == controlBehavior) {
+            // 0-蹇�熷け璐�, 鍒橞urst size蹇呭~
+            Integer burst = reqVo.getBurst();
+            if (burst == null) {
+                return Result.ofFail(-1, "burst can't be null");
+            }
+            if (burst < 0) {
+                return Result.ofFail(-1, "invalid burst: " + burst);
+            }
+            entity.setBurst(burst);
+        } else if (CONTROL_BEHAVIOR_RATE_LIMITER == controlBehavior) {
+            // 1-鍖�閫熸帓闃�, 鍒欒秴鏃舵椂闂村繀濉�
+            Integer maxQueueingTimeoutMs = reqVo.getMaxQueueingTimeoutMs();
+            if (maxQueueingTimeoutMs == null) {
+                return Result.ofFail(-1, "maxQueueingTimeoutMs can't be null");
+            }
+            if (maxQueueingTimeoutMs < 0) {
+                return Result.ofFail(-1, "invalid maxQueueingTimeoutMs: " + maxQueueingTimeoutMs);
+            }
+            entity.setMaxQueueingTimeoutMs(maxQueueingTimeoutMs);
+        }
+
+        Date date = new Date();
+        entity.setGmtCreate(date);
+        entity.setGmtModified(date);
+
+        try {
+            entity = repository.save(entity);
+        } catch (Throwable throwable) {
+            logger.error("add gateway flow rule error:", throwable);
+            return Result.ofThrowable(-1, throwable);
+        }
+
+        if (!publishRules(app, ip, port)) {
+            logger.warn("publish gateway flow rules fail after add");
+        }
+
+        return Result.ofSuccess(entity);
+    }
+
+    @PostMapping("/save.json")
+    @AuthAction(AuthService.PrivilegeType.WRITE_RULE)
+    public Result<GatewayFlowRuleEntity> updateFlowRule(@RequestBody UpdateFlowRuleReqVo reqVo) {
+
+        String app = reqVo.getApp();
+        if (StringUtil.isBlank(app)) {
+            return Result.ofFail(-1, "app can't be null or empty");
+        }
+
+        Long id = reqVo.getId();
+        if (id == null) {
+            return Result.ofFail(-1, "id can't be null");
+        }
+
+        GatewayFlowRuleEntity entity = repository.findById(id);
+        if (entity == null) {
+            return Result.ofFail(-1, "gateway flow rule does not exist, id=" + id);
+        }
+
+        // 閽堝璇锋眰灞炴��
+        GatewayParamFlowItemVo paramItem = reqVo.getParamItem();
+        if (paramItem != null) {
+            GatewayParamFlowItemEntity itemEntity = new GatewayParamFlowItemEntity();
+            entity.setParamItem(itemEntity);
+
+            // 鍙傛暟灞炴�� 0-ClientIP 1-Remote Host 2-Header 3-URL鍙傛暟 4-Cookie
+            Integer parseStrategy = paramItem.getParseStrategy();
+            if (!Arrays.asList(PARAM_PARSE_STRATEGY_CLIENT_IP, PARAM_PARSE_STRATEGY_HOST, PARAM_PARSE_STRATEGY_HEADER
+                    , PARAM_PARSE_STRATEGY_URL_PARAM, PARAM_PARSE_STRATEGY_COOKIE).contains(parseStrategy)) {
+                return Result.ofFail(-1, "invalid parseStrategy: " + parseStrategy);
+            }
+            itemEntity.setParseStrategy(paramItem.getParseStrategy());
+
+            // 褰撳弬鏁板睘鎬т负2-Header 3-URL鍙傛暟 4-Cookie鏃讹紝鍙傛暟鍚嶇О蹇呭~
+            if (Arrays.asList(PARAM_PARSE_STRATEGY_HEADER, PARAM_PARSE_STRATEGY_URL_PARAM, PARAM_PARSE_STRATEGY_COOKIE).contains(parseStrategy)) {
+                // 鍙傛暟鍚嶇О
+                String fieldName = paramItem.getFieldName();
+                if (StringUtil.isBlank(fieldName)) {
+                    return Result.ofFail(-1, "fieldName can't be null or empty");
+                }
+                itemEntity.setFieldName(paramItem.getFieldName());
+            }
+
+            String pattern = paramItem.getPattern();
+            // 濡傛灉鍖归厤涓蹭笉涓虹┖锛岄獙璇佸尮閰嶆ā寮�
+            if (StringUtil.isNotEmpty(pattern)) {
+                itemEntity.setPattern(pattern);
+                Integer matchStrategy = paramItem.getMatchStrategy();
+                if (!Arrays.asList(PARAM_MATCH_STRATEGY_EXACT, PARAM_MATCH_STRATEGY_CONTAINS, PARAM_MATCH_STRATEGY_REGEX).contains(matchStrategy)) {
+                    return Result.ofFail(-1, "invalid matchStrategy: " + matchStrategy);
+                }
+                itemEntity.setMatchStrategy(matchStrategy);
+            }
+        } else {
+            entity.setParamItem(null);
+        }
+
+        // 闃堝�肩被鍨� 0-绾跨▼鏁� 1-QPS
+        Integer grade = reqVo.getGrade();
+        if (grade == null) {
+            return Result.ofFail(-1, "grade can't be null");
+        }
+        if (!Arrays.asList(FLOW_GRADE_THREAD, FLOW_GRADE_QPS).contains(grade)) {
+            return Result.ofFail(-1, "invalid grade: " + grade);
+        }
+        entity.setGrade(grade);
+
+        // QPS闃堝��
+        Double count = reqVo.getCount();
+        if (count == null) {
+            return Result.ofFail(-1, "count can't be null");
+        }
+        if (count < 0) {
+            return Result.ofFail(-1, "count should be at lease zero");
+        }
+        entity.setCount(count);
+
+        // 闂撮殧
+        Long interval = reqVo.getInterval();
+        if (interval == null) {
+            return Result.ofFail(-1, "interval can't be null");
+        }
+        if (interval <= 0) {
+            return Result.ofFail(-1, "interval should be greater than zero");
+        }
+        entity.setInterval(interval);
+
+        // 闂撮殧鍗曚綅
+        Integer intervalUnit = reqVo.getIntervalUnit();
+        if (intervalUnit == null) {
+            return Result.ofFail(-1, "intervalUnit can't be null");
+        }
+        if (!Arrays.asList(INTERVAL_UNIT_SECOND, INTERVAL_UNIT_MINUTE, INTERVAL_UNIT_HOUR, INTERVAL_UNIT_DAY).contains(intervalUnit)) {
+            return Result.ofFail(-1, "Invalid intervalUnit: " + intervalUnit);
+        }
+        entity.setIntervalUnit(intervalUnit);
+
+        // 娴佹帶鏂瑰紡 0-蹇�熷け璐� 2-鍖�閫熸帓闃�
+        Integer controlBehavior = reqVo.getControlBehavior();
+        if (controlBehavior == null) {
+            return Result.ofFail(-1, "controlBehavior can't be null");
+        }
+        if (!Arrays.asList(CONTROL_BEHAVIOR_DEFAULT, CONTROL_BEHAVIOR_RATE_LIMITER).contains(controlBehavior)) {
+            return Result.ofFail(-1, "invalid controlBehavior: " + controlBehavior);
+        }
+        entity.setControlBehavior(controlBehavior);
+
+        if (CONTROL_BEHAVIOR_DEFAULT == controlBehavior) {
+            // 0-蹇�熷け璐�, 鍒橞urst size蹇呭~
+            Integer burst = reqVo.getBurst();
+            if (burst == null) {
+                return Result.ofFail(-1, "burst can't be null");
+            }
+            if (burst < 0) {
+                return Result.ofFail(-1, "invalid burst: " + burst);
+            }
+            entity.setBurst(burst);
+        } else if (CONTROL_BEHAVIOR_RATE_LIMITER == controlBehavior) {
+            // 2-鍖�閫熸帓闃�, 鍒欒秴鏃舵椂闂村繀濉�
+            Integer maxQueueingTimeoutMs = reqVo.getMaxQueueingTimeoutMs();
+            if (maxQueueingTimeoutMs == null) {
+                return Result.ofFail(-1, "maxQueueingTimeoutMs can't be null");
+            }
+            if (maxQueueingTimeoutMs < 0) {
+                return Result.ofFail(-1, "invalid maxQueueingTimeoutMs: " + maxQueueingTimeoutMs);
+            }
+            entity.setMaxQueueingTimeoutMs(maxQueueingTimeoutMs);
+        }
+
+        Date date = new Date();
+        entity.setGmtModified(date);
+
+        try {
+            entity = repository.save(entity);
+        } catch (Throwable throwable) {
+            logger.error("update gateway flow rule error:", throwable);
+            return Result.ofThrowable(-1, throwable);
+        }
+
+        if (!publishRules(app, entity.getIp(), entity.getPort())) {
+            logger.warn("publish gateway flow rules fail after update");
+        }
+
+        return Result.ofSuccess(entity);
+    }
+
+
+    @PostMapping("/delete.json")
+    @AuthAction(AuthService.PrivilegeType.DELETE_RULE)
+    public Result<Long> deleteFlowRule(Long id) {
+
+        if (id == null) {
+            return Result.ofFail(-1, "id can't be null");
+        }
+
+        GatewayFlowRuleEntity oldEntity = repository.findById(id);
+        if (oldEntity == null) {
+            return Result.ofSuccess(null);
+        }
+
+        try {
+            repository.delete(id);
+        } catch (Throwable throwable) {
+            logger.error("delete gateway flow rule error:", throwable);
+            return Result.ofThrowable(-1, throwable);
+        }
+
+        if (!publishRules(oldEntity.getApp(), oldEntity.getIp(), oldEntity.getPort())) {
+            logger.warn("publish gateway flow rules fail after delete");
+        }
+
+        return Result.ofSuccess(id);
+    }
+
+    private boolean publishRules(String app, String ip, Integer port) {
+        List<GatewayFlowRuleEntity> rules = repository.findAllByMachine(MachineInfo.of(app, ip, port));
+        return sentinelApiClient.modifyGatewayFlowRules(app, ip, port, rules);
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/v2/FlowControllerV2.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/v2/FlowControllerV2.java
new file mode 100644
index 0000000..bf7300c
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/v2/FlowControllerV2.java
@@ -0,0 +1,216 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.controller.v2;
+
+import com.alibaba.csp.sentinel.dashboard.auth.AuthAction;
+import com.alibaba.csp.sentinel.dashboard.auth.AuthService;
+import com.alibaba.csp.sentinel.dashboard.auth.AuthService.PrivilegeType;
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.FlowRuleEntity;
+import com.alibaba.csp.sentinel.dashboard.domain.Result;
+import com.alibaba.csp.sentinel.dashboard.repository.rule.InMemoryRuleRepositoryAdapter;
+import com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider;
+import com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher;
+import com.alibaba.csp.sentinel.util.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Flow rule controller (v2).
+ *
+ * @author Eric Zhao
+ * @since 1.4.0
+ */
+@RestController
+@RequestMapping(value = "/v2/flow")
+public class FlowControllerV2 {
+
+    private final Logger logger = LoggerFactory.getLogger(FlowControllerV2.class);
+
+    @Autowired
+    private InMemoryRuleRepositoryAdapter<FlowRuleEntity> repository;
+
+    @Autowired
+    @Qualifier("flowRuleDefaultProvider")
+    private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;
+    @Autowired
+    @Qualifier("flowRuleDefaultPublisher")
+    private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;
+
+    @GetMapping("/rules")
+    @AuthAction(PrivilegeType.READ_RULE)
+    public Result<List<FlowRuleEntity>> apiQueryMachineRules(@RequestParam String app) {
+
+        if (StringUtil.isEmpty(app)) {
+            return Result.ofFail(-1, "app can't be null or empty");
+        }
+        try {
+            List<FlowRuleEntity> rules = ruleProvider.getRules(app);
+            if (rules != null && !rules.isEmpty()) {
+                for (FlowRuleEntity entity : rules) {
+                    entity.setApp(app);
+                    if (entity.getClusterConfig() != null && entity.getClusterConfig().getFlowId() != null) {
+                        entity.setId(entity.getClusterConfig().getFlowId());
+                    }
+                }
+            }
+            rules = repository.saveAll(rules);
+            return Result.ofSuccess(rules);
+        } catch (Throwable throwable) {
+            logger.error("Error when querying flow rules", throwable);
+            return Result.ofThrowable(-1, throwable);
+        }
+    }
+
+    private <R> Result<R> checkEntityInternal(FlowRuleEntity entity) {
+        if (entity == null) {
+            return Result.ofFail(-1, "invalid body");
+        }
+        if (StringUtil.isBlank(entity.getApp())) {
+            return Result.ofFail(-1, "app can't be null or empty");
+        }
+        if (StringUtil.isBlank(entity.getLimitApp())) {
+            return Result.ofFail(-1, "limitApp can't be null or empty");
+        }
+        if (StringUtil.isBlank(entity.getResource())) {
+            return Result.ofFail(-1, "resource can't be null or empty");
+        }
+        if (entity.getGrade() == null) {
+            return Result.ofFail(-1, "grade can't be null");
+        }
+        if (entity.getGrade() != 0 && entity.getGrade() != 1) {
+            return Result.ofFail(-1, "grade must be 0 or 1, but " + entity.getGrade() + " got");
+        }
+        if (entity.getCount() == null || entity.getCount() < 0) {
+            return Result.ofFail(-1, "count should be at lease zero");
+        }
+        if (entity.getStrategy() == null) {
+            return Result.ofFail(-1, "strategy can't be null");
+        }
+        if (entity.getStrategy() != 0 && StringUtil.isBlank(entity.getRefResource())) {
+            return Result.ofFail(-1, "refResource can't be null or empty when strategy!=0");
+        }
+        if (entity.getControlBehavior() == null) {
+            return Result.ofFail(-1, "controlBehavior can't be null");
+        }
+        int controlBehavior = entity.getControlBehavior();
+        if (controlBehavior == 1 && entity.getWarmUpPeriodSec() == null) {
+            return Result.ofFail(-1, "warmUpPeriodSec can't be null when controlBehavior==1");
+        }
+        if (controlBehavior == 2 && entity.getMaxQueueingTimeMs() == null) {
+            return Result.ofFail(-1, "maxQueueingTimeMs can't be null when controlBehavior==2");
+        }
+        if (entity.isClusterMode() && entity.getClusterConfig() == null) {
+            return Result.ofFail(-1, "cluster config should be valid");
+        }
+        return null;
+    }
+
+    @PostMapping("/rule")
+    @AuthAction(value = AuthService.PrivilegeType.WRITE_RULE)
+    public Result<FlowRuleEntity> apiAddFlowRule(@RequestBody FlowRuleEntity entity) {
+
+        Result<FlowRuleEntity> checkResult = checkEntityInternal(entity);
+        if (checkResult != null) {
+            return checkResult;
+        }
+        entity.setId(null);
+        Date date = new Date();
+        entity.setGmtCreate(date);
+        entity.setGmtModified(date);
+        entity.setLimitApp(entity.getLimitApp().trim());
+        entity.setResource(entity.getResource().trim());
+        try {
+            entity = repository.save(entity);
+            publishRules(entity.getApp());
+        } catch (Throwable throwable) {
+            logger.error("Failed to add flow rule", throwable);
+            return Result.ofThrowable(-1, throwable);
+        }
+        return Result.ofSuccess(entity);
+    }
+
+    @PutMapping("/rule/{id}")
+    @AuthAction(AuthService.PrivilegeType.WRITE_RULE)
+
+    public Result<FlowRuleEntity> apiUpdateFlowRule(@PathVariable("id") Long id,
+                                                    @RequestBody FlowRuleEntity entity) {
+        if (id == null || id <= 0) {
+            return Result.ofFail(-1, "Invalid id");
+        }
+        FlowRuleEntity oldEntity = repository.findById(id);
+        if (oldEntity == null) {
+            return Result.ofFail(-1, "id " + id + " does not exist");
+        }
+        if (entity == null) {
+            return Result.ofFail(-1, "invalid body");
+        }
+
+        entity.setApp(oldEntity.getApp());
+        entity.setIp(oldEntity.getIp());
+        entity.setPort(oldEntity.getPort());
+        Result<FlowRuleEntity> checkResult = checkEntityInternal(entity);
+        if (checkResult != null) {
+            return checkResult;
+        }
+
+        entity.setId(id);
+        Date date = new Date();
+        entity.setGmtCreate(oldEntity.getGmtCreate());
+        entity.setGmtModified(date);
+        try {
+            entity = repository.save(entity);
+            if (entity == null) {
+                return Result.ofFail(-1, "save entity fail");
+            }
+            publishRules(oldEntity.getApp());
+        } catch (Throwable throwable) {
+            logger.error("Failed to update flow rule", throwable);
+            return Result.ofThrowable(-1, throwable);
+        }
+        return Result.ofSuccess(entity);
+    }
+
+    @DeleteMapping("/rule/{id}")
+    @AuthAction(PrivilegeType.DELETE_RULE)
+    public Result<Long> apiDeleteRule(@PathVariable("id") Long id) {
+        if (id == null || id <= 0) {
+            return Result.ofFail(-1, "Invalid id");
+        }
+        FlowRuleEntity oldEntity = repository.findById(id);
+        if (oldEntity == null) {
+            return Result.ofSuccess(null);
+        }
+
+        try {
+            repository.delete(id);
+            publishRules(oldEntity.getApp());
+        } catch (Exception e) {
+            return Result.ofFail(-1, e.getMessage());
+        }
+        return Result.ofSuccess(id);
+    }
+
+    private void publishRules(/*@NonNull*/ String app) throws Exception {
+        List<FlowRuleEntity> rules = repository.findAllByApp(app);
+        rulePublisher.publish(app, rules);
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/ApplicationEntity.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/ApplicationEntity.java
new file mode 100644
index 0000000..44c10da
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/ApplicationEntity.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.datasource.entity;
+
+import java.util.Date;
+
+import com.alibaba.csp.sentinel.dashboard.discovery.AppInfo;
+
+/**
+ * @author leyou
+ */
+public class ApplicationEntity {
+
+    private Long id;
+    private Date gmtCreate;
+    private Date gmtModified;
+    private String app;
+    private Integer appType;
+    private String activeConsole;
+    private Date lastFetch;
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    public String getApp() {
+        return app;
+    }
+
+    public void setApp(String app) {
+        this.app = app;
+    }
+
+    public Integer getAppType() {
+        return appType;
+    }
+
+    public void setAppType(Integer appType) {
+        this.appType = appType;
+    }
+
+    public String getActiveConsole() {
+        return activeConsole;
+    }
+
+    public Date getLastFetch() {
+        return lastFetch;
+    }
+
+    public void setLastFetch(Date lastFetch) {
+        this.lastFetch = lastFetch;
+    }
+
+    public void setActiveConsole(String activeConsole) {
+        this.activeConsole = activeConsole;
+    }
+
+    public AppInfo toAppInfo() {
+        return new AppInfo(app, appType);
+    }
+
+    @Override
+    public String toString() {
+        return "ApplicationEntity{" +
+            "id=" + id +
+            ", gmtCreate=" + gmtCreate +
+            ", gmtModified=" + gmtModified +
+            ", app='" + app + '\'' +
+            ", activeConsole='" + activeConsole + '\'' +
+            ", lastFetch=" + lastFetch +
+            '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/MachineEntity.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/MachineEntity.java
new file mode 100644
index 0000000..5b91f33
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/MachineEntity.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.datasource.entity;
+
+import java.util.Date;
+
+import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo;
+
+/**
+ * @author leyou
+ */
+public class MachineEntity {
+    private Long id;
+    private Date gmtCreate;
+    private Date gmtModified;
+    private String app;
+    private String ip;
+    private String hostname;
+    private Date timestamp;
+    private Integer port;
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    public String getApp() {
+        return app;
+    }
+
+    public void setApp(String app) {
+        this.app = app;
+    }
+
+    public String getIp() {
+        return ip;
+    }
+
+    public void setIp(String ip) {
+        this.ip = ip;
+    }
+
+    public String getHostname() {
+        return hostname;
+    }
+
+    public void setHostname(String hostname) {
+        this.hostname = hostname;
+    }
+
+    public Date getTimestamp() {
+        return timestamp;
+    }
+
+    public void setTimestamp(Date timestamp) {
+        this.timestamp = timestamp;
+    }
+
+    public Integer getPort() {
+        return port;
+    }
+
+    public void setPort(Integer port) {
+        this.port = port;
+    }
+
+    public MachineInfo toMachineInfo() {
+        MachineInfo machineInfo = new MachineInfo();
+
+        machineInfo.setApp(app);
+        machineInfo.setHostname(hostname);
+        machineInfo.setIp(ip);
+        machineInfo.setPort(port);
+        machineInfo.setLastHeartbeat(timestamp.getTime());
+        machineInfo.setHeartbeatVersion(timestamp.getTime());
+
+        return machineInfo;
+    }
+
+    @Override
+    public String toString() {
+        return "MachineEntity{" +
+            "id=" + id +
+            ", gmtCreate=" + gmtCreate +
+            ", gmtModified=" + gmtModified +
+            ", app='" + app + '\'' +
+            ", ip='" + ip + '\'' +
+            ", hostname='" + hostname + '\'' +
+            ", timestamp=" + timestamp +
+            ", port=" + port +
+            '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/MetricEntity.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/MetricEntity.java
new file mode 100644
index 0000000..94513cb
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/MetricEntity.java
@@ -0,0 +1,219 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.datasource.entity;
+
+import java.util.Date;
+
+/**
+ * @author leyou
+ */
+public class MetricEntity {
+    private Long id;
+    private Date gmtCreate;
+    private Date gmtModified;
+    private String app;
+    /**
+     * 鐩戞帶淇℃伅鐨勬椂闂存埑
+     */
+    private Date timestamp;
+    private String resource;
+    private Long passQps;
+    private Long successQps;
+    private Long blockQps;
+    private Long exceptionQps;
+
+    /**
+     * summary rt of all success exit qps.
+     */
+    private double rt;
+
+    /**
+     * 鏈鑱氬悎鐨勬�绘潯鏁�
+     */
+    private int count;
+
+    private int resourceCode;
+
+    public static MetricEntity copyOf(MetricEntity oldEntity) {
+        MetricEntity entity = new MetricEntity();
+        entity.setId(oldEntity.getId());
+        entity.setGmtCreate(oldEntity.getGmtCreate());
+        entity.setGmtModified(oldEntity.getGmtModified());
+        entity.setApp(oldEntity.getApp());
+        entity.setTimestamp(oldEntity.getTimestamp());
+        entity.setResource(oldEntity.getResource());
+        entity.setPassQps(oldEntity.getPassQps());
+        entity.setBlockQps(oldEntity.getBlockQps());
+        entity.setSuccessQps(oldEntity.getSuccessQps());
+        entity.setExceptionQps(oldEntity.getExceptionQps());
+        entity.setRt(oldEntity.getRt());
+        entity.setCount(oldEntity.getCount());
+        return entity;
+    }
+
+    public synchronized void addPassQps(Long passQps) {
+        this.passQps += passQps;
+    }
+
+    public synchronized void addBlockQps(Long blockQps) {
+        this.blockQps += blockQps;
+    }
+
+    public synchronized void addExceptionQps(Long exceptionQps) {
+        this.exceptionQps += exceptionQps;
+    }
+
+    public synchronized void addCount(int count) {
+        this.count += count;
+    }
+
+    public synchronized void addRtAndSuccessQps(double avgRt, Long successQps) {
+        this.rt += avgRt * successQps;
+        this.successQps += successQps;
+    }
+
+    /**
+     * {@link #rt} = {@code avgRt * successQps}
+     *
+     * @param avgRt      average rt of {@code successQps}
+     * @param successQps
+     */
+    public synchronized void setRtAndSuccessQps(double avgRt, Long successQps) {
+        this.rt = avgRt * successQps;
+        this.successQps = successQps;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    public String getApp() {
+        return app;
+    }
+
+    public void setApp(String app) {
+        this.app = app;
+    }
+
+    public Date getTimestamp() {
+        return timestamp;
+    }
+
+    public void setTimestamp(Date timestamp) {
+        this.timestamp = timestamp;
+    }
+
+    public String getResource() {
+        return resource;
+    }
+
+    public void setResource(String resource) {
+        this.resource = resource;
+        this.resourceCode = resource.hashCode();
+    }
+
+    public Long getPassQps() {
+        return passQps;
+    }
+
+    public void setPassQps(Long passQps) {
+        this.passQps = passQps;
+    }
+
+    public Long getBlockQps() {
+        return blockQps;
+    }
+
+    public void setBlockQps(Long blockQps) {
+        this.blockQps = blockQps;
+    }
+
+    public Long getExceptionQps() {
+        return exceptionQps;
+    }
+
+    public void setExceptionQps(Long exceptionQps) {
+        this.exceptionQps = exceptionQps;
+    }
+
+    public double getRt() {
+        return rt;
+    }
+
+    public void setRt(double rt) {
+        this.rt = rt;
+    }
+
+    public int getCount() {
+        return count;
+    }
+
+    public void setCount(int count) {
+        this.count = count;
+    }
+
+    public int getResourceCode() {
+        return resourceCode;
+    }
+
+    public Long getSuccessQps() {
+        return successQps;
+    }
+
+    public void setSuccessQps(Long successQps) {
+        this.successQps = successQps;
+    }
+
+    @Override
+    public String toString() {
+        return "MetricEntity{" +
+            "id=" + id +
+            ", gmtCreate=" + gmtCreate +
+            ", gmtModified=" + gmtModified +
+            ", app='" + app + '\'' +
+            ", timestamp=" + timestamp +
+            ", resource='" + resource + '\'' +
+            ", passQps=" + passQps +
+            ", blockQps=" + blockQps +
+            ", successQps=" + successQps +
+            ", exceptionQps=" + exceptionQps +
+            ", rt=" + rt +
+            ", count=" + count +
+            ", resourceCode=" + resourceCode +
+            '}';
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/MetricPositionEntity.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/MetricPositionEntity.java
new file mode 100644
index 0000000..2be29eb
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/MetricPositionEntity.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.datasource.entity;
+
+import java.util.Date;
+
+/**
+ * @author leyou
+ */
+public class MetricPositionEntity {
+    private long id;
+    private Date gmtCreate;
+    private Date gmtModified;
+    private String app;
+    private String ip;
+    /**
+     * Sentinel鍦ㄨ搴旂敤涓婁娇鐢ㄧ殑绔彛
+     */
+    private int port;
+
+    /**
+     * 鏈哄櫒鍚嶏紝鍐椾綑瀛楁
+     */
+    private String hostname;
+
+    /**
+     * 涓婁竴娆℃媺鍙栫殑鏈�鏅氭椂闂存埑
+     */
+    private Date lastFetch;
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    public String getApp() {
+        return app;
+    }
+
+    public void setApp(String app) {
+        this.app = app;
+    }
+
+    public String getIp() {
+        return ip;
+    }
+
+    public void setIp(String ip) {
+        this.ip = ip;
+    }
+
+    public int getPort() {
+        return port;
+    }
+
+    public void setPort(int port) {
+        this.port = port;
+    }
+
+    public String getHostname() {
+        return hostname;
+    }
+
+    public void setHostname(String hostname) {
+        this.hostname = hostname;
+    }
+
+    public Date getLastFetch() {
+        return lastFetch;
+    }
+
+    public void setLastFetch(Date lastFetch) {
+        this.lastFetch = lastFetch;
+    }
+
+    @Override
+    public String toString() {
+        return "MetricPositionEntity{" +
+            "id=" + id +
+            ", gmtCreate=" + gmtCreate +
+            ", gmtModified=" + gmtModified +
+            ", app='" + app + '\'' +
+            ", ip='" + ip + '\'' +
+            ", port=" + port +
+            ", hostname='" + hostname + '\'' +
+            ", lastFetch=" + lastFetch +
+            '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/SentinelVersion.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/SentinelVersion.java
new file mode 100644
index 0000000..08fcaf2
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/SentinelVersion.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.datasource.entity;
+
+/**
+ * @author Eric Zhao
+ * @since 0.2.1
+ */
+public class SentinelVersion {
+    private int majorVersion;
+    private int minorVersion;
+    private int fixVersion;
+    private String postfix;
+    
+    public SentinelVersion() {
+        this(0, 0, 0);
+    }
+    
+    public SentinelVersion(int major, int minor, int fix) {
+        this(major, minor, fix, null);
+    }
+    
+    public SentinelVersion(int major, int minor, int fix, String postfix) {
+        this.majorVersion = major;
+        this.minorVersion = minor;
+        this.fixVersion = fix;
+        this.postfix = postfix;
+    }
+    
+    /**
+     * 000, 000, 000
+     */
+    public int getFullVersion() {
+        return majorVersion * 1000000 + minorVersion * 1000 + fixVersion;
+    }
+
+    public int getMajorVersion() {
+        return majorVersion;
+    }
+
+    public SentinelVersion setMajorVersion(int majorVersion) {
+        this.majorVersion = majorVersion;
+        return this;
+    }
+
+    public int getMinorVersion() {
+        return minorVersion;
+    }
+
+    public SentinelVersion setMinorVersion(int minorVersion) {
+        this.minorVersion = minorVersion;
+        return this;
+    }
+
+    public int getFixVersion() {
+        return fixVersion;
+    }
+
+    public SentinelVersion setFixVersion(int fixVersion) {
+        this.fixVersion = fixVersion;
+        return this;
+    }
+
+    public String getPostfix() {
+        return postfix;
+    }
+
+    public SentinelVersion setPostfix(String postfix) {
+        this.postfix = postfix;
+        return this;
+    }
+
+    public boolean greaterThan(SentinelVersion version) {
+        if (version == null) {
+            return true;
+        }
+        return getFullVersion() > version.getFullVersion();
+    }
+
+    public boolean greaterOrEqual(SentinelVersion version) {
+        if (version == null) {
+            return true;
+        }
+        return getFullVersion() >= version.getFullVersion();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) { return true; }
+        if (o == null || getClass() != o.getClass()) { return false; }
+
+        SentinelVersion that = (SentinelVersion)o;
+
+        if (getFullVersion() != that.getFullVersion()) { return false; }
+        return postfix != null ? postfix.equals(that.postfix) : that.postfix == null;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = majorVersion;
+        result = 31 * result + minorVersion;
+        result = 31 * result + fixVersion;
+        result = 31 * result + (postfix != null ? postfix.hashCode() : 0);
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        return "SentinelVersion{" +
+            "majorVersion=" + majorVersion +
+            ", minorVersion=" + minorVersion +
+            ", fixVersion=" + fixVersion +
+            ", postfix='" + postfix + '\'' +
+            '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/gateway/ApiDefinitionEntity.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/gateway/ApiDefinitionEntity.java
new file mode 100644
index 0000000..b042e0a
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/gateway/ApiDefinitionEntity.java
@@ -0,0 +1,208 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway;
+
+import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiDefinition;
+import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiPathPredicateItem;
+import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiPredicateItem;
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.RuleEntity;
+import com.alibaba.csp.sentinel.slots.block.Rule;
+
+import java.util.Date;
+import java.util.LinkedHashSet;
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * Entity for {@link ApiDefinition}.
+ *
+ * @author cdfive
+ * @since 1.7.0
+ */
+public class ApiDefinitionEntity implements RuleEntity {
+
+    private Long id;
+    private String app;
+    private String ip;
+    private Integer port;
+
+    private Date gmtCreate;
+    private Date gmtModified;
+
+    private String apiName;
+    private Set<ApiPredicateItemEntity> predicateItems;
+
+    public static ApiDefinitionEntity fromApiDefinition(String app, String ip, Integer port, ApiDefinition apiDefinition) {
+        ApiDefinitionEntity entity = new ApiDefinitionEntity();
+        entity.setApp(app);
+        entity.setIp(ip);
+        entity.setPort(port);
+        entity.setApiName(apiDefinition.getApiName());
+
+        Set<ApiPredicateItemEntity> predicateItems = new LinkedHashSet<>();
+        entity.setPredicateItems(predicateItems);
+
+        Set<ApiPredicateItem> apiPredicateItems = apiDefinition.getPredicateItems();
+        if (apiPredicateItems != null) {
+            for (ApiPredicateItem apiPredicateItem : apiPredicateItems) {
+                ApiPredicateItemEntity itemEntity = new ApiPredicateItemEntity();
+                predicateItems.add(itemEntity);
+                ApiPathPredicateItem pathPredicateItem = (ApiPathPredicateItem) apiPredicateItem;
+                itemEntity.setPattern(pathPredicateItem.getPattern());
+                itemEntity.setMatchStrategy(pathPredicateItem.getMatchStrategy());
+            }
+        }
+
+        return entity;
+    }
+
+    public ApiDefinition toApiDefinition() {
+        ApiDefinition apiDefinition = new ApiDefinition();
+        apiDefinition.setApiName(apiName);
+
+        Set<ApiPredicateItem> apiPredicateItems = new LinkedHashSet<>();
+        apiDefinition.setPredicateItems(apiPredicateItems);
+
+        if (predicateItems != null) {
+            for (ApiPredicateItemEntity predicateItem : predicateItems) {
+                ApiPathPredicateItem apiPredicateItem = new ApiPathPredicateItem();
+                apiPredicateItems.add(apiPredicateItem);
+                apiPredicateItem.setMatchStrategy(predicateItem.getMatchStrategy());
+                apiPredicateItem.setPattern(predicateItem.getPattern());
+            }
+        }
+
+        return apiDefinition;
+    }
+
+    public ApiDefinitionEntity() {
+
+    }
+
+    public ApiDefinitionEntity(String apiName, Set<ApiPredicateItemEntity> predicateItems) {
+        this.apiName = apiName;
+        this.predicateItems = predicateItems;
+    }
+
+    public String getApiName() {
+        return apiName;
+    }
+
+    public void setApiName(String apiName) {
+        this.apiName = apiName;
+    }
+
+    public Set<ApiPredicateItemEntity> getPredicateItems() {
+        return predicateItems;
+    }
+
+    public void setPredicateItems(Set<ApiPredicateItemEntity> predicateItems) {
+        this.predicateItems = predicateItems;
+    }
+
+    @Override
+    public Long getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getApp() {
+        return app;
+    }
+
+    public void setApp(String app) {
+        this.app = app;
+    }
+
+    @Override
+    public String getIp() {
+        return ip;
+    }
+
+    public void setIp(String ip) {
+        this.ip = ip;
+    }
+
+    @Override
+    public Integer getPort() {
+        return port;
+    }
+
+    public void setPort(Integer port) {
+        this.port = port;
+    }
+
+    @Override
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    @Override
+    public Rule toRule() {
+        return null;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) { return true; }
+        if (o == null || getClass() != o.getClass()) { return false; }
+        ApiDefinitionEntity entity = (ApiDefinitionEntity) o;
+        return Objects.equals(id, entity.id) &&
+                Objects.equals(app, entity.app) &&
+                Objects.equals(ip, entity.ip) &&
+                Objects.equals(port, entity.port) &&
+                Objects.equals(gmtCreate, entity.gmtCreate) &&
+                Objects.equals(gmtModified, entity.gmtModified) &&
+                Objects.equals(apiName, entity.apiName) &&
+                Objects.equals(predicateItems, entity.predicateItems);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, app, ip, port, gmtCreate, gmtModified, apiName, predicateItems);
+    }
+
+    @Override
+    public String toString() {
+        return "ApiDefinitionEntity{" +
+                "id=" + id +
+                ", app='" + app + '\'' +
+                ", ip='" + ip + '\'' +
+                ", port=" + port +
+                ", gmtCreate=" + gmtCreate +
+                ", gmtModified=" + gmtModified +
+                ", apiName='" + apiName + '\'' +
+                ", predicateItems=" + predicateItems +
+                '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/gateway/ApiPredicateItemEntity.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/gateway/ApiPredicateItemEntity.java
new file mode 100644
index 0000000..1d6058c
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/gateway/ApiPredicateItemEntity.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway;
+
+import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiPredicateItem;
+
+import java.util.Objects;
+
+/**
+ * Entity for {@link ApiPredicateItem}.
+ *
+ * @author cdfive
+ * @since 1.7.0
+ */
+public class ApiPredicateItemEntity {
+
+    private String pattern;
+
+    private Integer matchStrategy;
+
+    public ApiPredicateItemEntity() {
+    }
+
+    public ApiPredicateItemEntity(String pattern, int matchStrategy) {
+        this.pattern = pattern;
+        this.matchStrategy = matchStrategy;
+    }
+
+    public String getPattern() {
+        return pattern;
+    }
+
+    public void setPattern(String pattern) {
+        this.pattern = pattern;
+    }
+
+    public Integer getMatchStrategy() {
+        return matchStrategy;
+    }
+
+    public void setMatchStrategy(Integer matchStrategy) {
+        this.matchStrategy = matchStrategy;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) { return true; }
+        if (o == null || getClass() != o.getClass()) { return false; }
+        ApiPredicateItemEntity that = (ApiPredicateItemEntity) o;
+        return Objects.equals(pattern, that.pattern) &&
+                Objects.equals(matchStrategy, that.matchStrategy);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(pattern, matchStrategy);
+    }
+
+    @Override
+    public String toString() {
+        return "ApiPredicateItemEntity{" +
+                "pattern='" + pattern + '\'' +
+                ", matchStrategy=" + matchStrategy +
+                '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/gateway/GatewayFlowRuleEntity.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/gateway/GatewayFlowRuleEntity.java
new file mode 100644
index 0000000..391ea41
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/gateway/GatewayFlowRuleEntity.java
@@ -0,0 +1,354 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway;
+
+import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule;
+import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayParamFlowItem;
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.RuleEntity;
+import com.alibaba.csp.sentinel.slots.block.Rule;
+
+import java.util.Date;
+import java.util.Objects;
+
+/**
+ * Entity for {@link GatewayFlowRule}.
+ *
+ * @author cdfive
+ * @since 1.7.0
+ */
+public class GatewayFlowRuleEntity implements RuleEntity {
+
+    /**闂撮殧鍗曚綅*/
+    /**0-绉�*/
+    public static final int INTERVAL_UNIT_SECOND = 0;
+    /**1-鍒�*/
+    public static final int INTERVAL_UNIT_MINUTE = 1;
+    /**2-鏃�*/
+    public static final int INTERVAL_UNIT_HOUR = 2;
+    /**3-澶�*/
+    public static final int INTERVAL_UNIT_DAY = 3;
+
+    private Long id;
+    private String app;
+    private String ip;
+    private Integer port;
+
+    private Date gmtCreate;
+    private Date gmtModified;
+
+    private String resource;
+    private Integer resourceMode;
+
+    private Integer grade;
+    private Double count;
+    private Long interval;
+    private Integer intervalUnit;
+
+    private Integer controlBehavior;
+    private Integer burst;
+
+    private Integer maxQueueingTimeoutMs;
+
+    private GatewayParamFlowItemEntity paramItem;
+
+    public static Long calIntervalSec(Long interval, Integer intervalUnit) {
+        switch (intervalUnit) {
+            case INTERVAL_UNIT_SECOND:
+                return interval;
+            case INTERVAL_UNIT_MINUTE:
+                return interval * 60;
+            case INTERVAL_UNIT_HOUR:
+                return interval * 60 * 60;
+            case INTERVAL_UNIT_DAY:
+                return interval * 60 * 60 * 24;
+            default:
+                break;
+        }
+
+        throw new IllegalArgumentException("Invalid intervalUnit: " + intervalUnit);
+    }
+
+    public static Object[] parseIntervalSec(Long intervalSec) {
+        if (intervalSec % (60 * 60 * 24) == 0) {
+            return new Object[] {intervalSec / (60 * 60 * 24), INTERVAL_UNIT_DAY};
+        }
+
+        if (intervalSec % (60 * 60 ) == 0) {
+            return new Object[] {intervalSec / (60 * 60), INTERVAL_UNIT_HOUR};
+        }
+
+        if (intervalSec % 60 == 0) {
+            return new Object[] {intervalSec / 60, INTERVAL_UNIT_MINUTE};
+        }
+
+        return new Object[] {intervalSec, INTERVAL_UNIT_SECOND};
+    }
+
+    public GatewayFlowRule toGatewayFlowRule() {
+        GatewayFlowRule rule = new GatewayFlowRule();
+        rule.setResource(resource);
+        rule.setResourceMode(resourceMode);
+
+        rule.setGrade(grade);
+        rule.setCount(count);
+        rule.setIntervalSec(calIntervalSec(interval, intervalUnit));
+
+        rule.setControlBehavior(controlBehavior);
+
+        if (burst != null) {
+            rule.setBurst(burst);
+        }
+
+        if (maxQueueingTimeoutMs != null) {
+            rule.setMaxQueueingTimeoutMs(maxQueueingTimeoutMs);
+        }
+
+        if (paramItem != null) {
+            GatewayParamFlowItem ruleItem = new GatewayParamFlowItem();
+            rule.setParamItem(ruleItem);
+            ruleItem.setParseStrategy(paramItem.getParseStrategy());
+            ruleItem.setFieldName(paramItem.getFieldName());
+            ruleItem.setPattern(paramItem.getPattern());
+
+            if (paramItem.getMatchStrategy() != null) {
+                ruleItem.setMatchStrategy(paramItem.getMatchStrategy());
+            }
+        }
+
+        return rule;
+    }
+
+    public static GatewayFlowRuleEntity fromGatewayFlowRule(String app, String ip, Integer port, GatewayFlowRule rule) {
+        GatewayFlowRuleEntity entity = new GatewayFlowRuleEntity();
+        entity.setApp(app);
+        entity.setIp(ip);
+        entity.setPort(port);
+
+        entity.setResource(rule.getResource());
+        entity.setResourceMode(rule.getResourceMode());
+
+        entity.setGrade(rule.getGrade());
+        entity.setCount(rule.getCount());
+        Object[] intervalSecResult = parseIntervalSec(rule.getIntervalSec());
+        entity.setInterval((Long) intervalSecResult[0]);
+        entity.setIntervalUnit((Integer) intervalSecResult[1]);
+
+        entity.setControlBehavior(rule.getControlBehavior());
+        entity.setBurst(rule.getBurst());
+        entity.setMaxQueueingTimeoutMs(rule.getMaxQueueingTimeoutMs());
+
+        GatewayParamFlowItem paramItem = rule.getParamItem();
+        if (paramItem != null) {
+            GatewayParamFlowItemEntity itemEntity = new GatewayParamFlowItemEntity();
+            entity.setParamItem(itemEntity);
+            itemEntity.setParseStrategy(paramItem.getParseStrategy());
+            itemEntity.setFieldName(paramItem.getFieldName());
+            itemEntity.setPattern(paramItem.getPattern());
+            itemEntity.setMatchStrategy(paramItem.getMatchStrategy());
+        }
+
+        return entity;
+    }
+
+    @Override
+    public Long getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getApp() {
+        return app;
+    }
+
+    public void setApp(String app) {
+        this.app = app;
+    }
+
+    @Override
+    public String getIp() {
+        return ip;
+    }
+
+    public void setIp(String ip) {
+        this.ip = ip;
+    }
+
+    @Override
+    public Integer getPort() {
+        return port;
+    }
+
+    public void setPort(Integer port) {
+        this.port = port;
+    }
+
+    @Override
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+
+    @Override
+    public Rule toRule() {
+        return null;
+    }
+
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    public GatewayParamFlowItemEntity getParamItem() {
+        return paramItem;
+    }
+
+    public void setParamItem(GatewayParamFlowItemEntity paramItem) {
+        this.paramItem = paramItem;
+    }
+
+    public String getResource() {
+        return resource;
+    }
+
+    public void setResource(String resource) {
+        this.resource = resource;
+    }
+
+    public Integer getResourceMode() {
+        return resourceMode;
+    }
+
+    public void setResourceMode(Integer resourceMode) {
+        this.resourceMode = resourceMode;
+    }
+
+    public Integer getGrade() {
+        return grade;
+    }
+
+    public void setGrade(Integer grade) {
+        this.grade = grade;
+    }
+
+    public Double getCount() {
+        return count;
+    }
+
+    public void setCount(Double count) {
+        this.count = count;
+    }
+
+    public Long getInterval() {
+        return interval;
+    }
+
+    public void setInterval(Long interval) {
+        this.interval = interval;
+    }
+
+    public Integer getIntervalUnit() {
+        return intervalUnit;
+    }
+
+    public void setIntervalUnit(Integer intervalUnit) {
+        this.intervalUnit = intervalUnit;
+    }
+
+    public Integer getControlBehavior() {
+        return controlBehavior;
+    }
+
+    public void setControlBehavior(Integer controlBehavior) {
+        this.controlBehavior = controlBehavior;
+    }
+
+    public Integer getBurst() {
+        return burst;
+    }
+
+    public void setBurst(Integer burst) {
+        this.burst = burst;
+    }
+
+    public Integer getMaxQueueingTimeoutMs() {
+        return maxQueueingTimeoutMs;
+    }
+
+    public void setMaxQueueingTimeoutMs(Integer maxQueueingTimeoutMs) {
+        this.maxQueueingTimeoutMs = maxQueueingTimeoutMs;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) { return true; }
+        if (o == null || getClass() != o.getClass()) { return false; }
+        GatewayFlowRuleEntity that = (GatewayFlowRuleEntity) o;
+        return Objects.equals(id, that.id) &&
+                Objects.equals(app, that.app) &&
+                Objects.equals(ip, that.ip) &&
+                Objects.equals(port, that.port) &&
+                Objects.equals(gmtCreate, that.gmtCreate) &&
+                Objects.equals(gmtModified, that.gmtModified) &&
+                Objects.equals(resource, that.resource) &&
+                Objects.equals(resourceMode, that.resourceMode) &&
+                Objects.equals(grade, that.grade) &&
+                Objects.equals(count, that.count) &&
+                Objects.equals(interval, that.interval) &&
+                Objects.equals(intervalUnit, that.intervalUnit) &&
+                Objects.equals(controlBehavior, that.controlBehavior) &&
+                Objects.equals(burst, that.burst) &&
+                Objects.equals(maxQueueingTimeoutMs, that.maxQueueingTimeoutMs) &&
+                Objects.equals(paramItem, that.paramItem);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, app, ip, port, gmtCreate, gmtModified, resource, resourceMode, grade, count, interval, intervalUnit, controlBehavior, burst, maxQueueingTimeoutMs, paramItem);
+    }
+
+    @Override
+    public String toString() {
+        return "GatewayFlowRuleEntity{" +
+                "id=" + id +
+                ", app='" + app + '\'' +
+                ", ip='" + ip + '\'' +
+                ", port=" + port +
+                ", gmtCreate=" + gmtCreate +
+                ", gmtModified=" + gmtModified +
+                ", resource='" + resource + '\'' +
+                ", resourceMode=" + resourceMode +
+                ", grade=" + grade +
+                ", count=" + count +
+                ", interval=" + interval +
+                ", intervalUnit=" + intervalUnit +
+                ", controlBehavior=" + controlBehavior +
+                ", burst=" + burst +
+                ", maxQueueingTimeoutMs=" + maxQueueingTimeoutMs +
+                ", paramItem=" + paramItem +
+                '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/gateway/GatewayParamFlowItemEntity.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/gateway/GatewayParamFlowItemEntity.java
new file mode 100644
index 0000000..4da71c8
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/gateway/GatewayParamFlowItemEntity.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway;
+
+import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayParamFlowItem;
+
+import java.util.Objects;
+
+/**
+ * Entity for {@link GatewayParamFlowItem}.
+ *
+ * @author cdfive
+ * @since 1.7.0
+ */
+public class GatewayParamFlowItemEntity {
+
+    private Integer parseStrategy;
+
+    private String fieldName;
+
+    private String pattern;
+
+    private Integer matchStrategy;
+
+    public Integer getParseStrategy() {
+        return parseStrategy;
+    }
+
+    public void setParseStrategy(Integer parseStrategy) {
+        this.parseStrategy = parseStrategy;
+    }
+
+    public String getFieldName() {
+        return fieldName;
+    }
+
+    public void setFieldName(String fieldName) {
+        this.fieldName = fieldName;
+    }
+
+    public String getPattern() {
+        return pattern;
+    }
+
+    public void setPattern(String pattern) {
+        this.pattern = pattern;
+    }
+
+    public Integer getMatchStrategy() {
+        return matchStrategy;
+    }
+
+    public void setMatchStrategy(Integer matchStrategy) {
+        this.matchStrategy = matchStrategy;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) { return true; }
+        if (o == null || getClass() != o.getClass()) { return false; }
+        GatewayParamFlowItemEntity that = (GatewayParamFlowItemEntity) o;
+        return Objects.equals(parseStrategy, that.parseStrategy) &&
+                Objects.equals(fieldName, that.fieldName) &&
+                Objects.equals(pattern, that.pattern) &&
+                Objects.equals(matchStrategy, that.matchStrategy);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(parseStrategy, fieldName, pattern, matchStrategy);
+    }
+
+    @Override
+    public String toString() {
+        return "GatewayParamFlowItemEntity{" +
+                "parseStrategy=" + parseStrategy +
+                ", fieldName='" + fieldName + '\'' +
+                ", pattern='" + pattern + '\'' +
+                ", matchStrategy=" + matchStrategy +
+                '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/AbstractRuleEntity.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/AbstractRuleEntity.java
new file mode 100644
index 0000000..7a95c21
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/AbstractRuleEntity.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.datasource.entity.rule;
+
+import java.util.Date;
+
+import com.alibaba.csp.sentinel.slots.block.AbstractRule;
+
+/**
+ * @author Eric Zhao
+ * @since 0.2.1
+ */
+public abstract class AbstractRuleEntity<T extends AbstractRule> implements RuleEntity {
+
+    protected Long id;
+
+    protected String app;
+    protected String ip;
+    protected Integer port;
+
+    protected T rule;
+
+    private Date gmtCreate;
+    private Date gmtModified;
+
+    @Override
+    public Long getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getApp() {
+        return app;
+    }
+
+    public AbstractRuleEntity<T> setApp(String app) {
+        this.app = app;
+        return this;
+    }
+
+    @Override
+    public String getIp() {
+        return ip;
+    }
+
+    public AbstractRuleEntity<T> setIp(String ip) {
+        this.ip = ip;
+        return this;
+    }
+
+    @Override
+    public Integer getPort() {
+        return port;
+    }
+
+    public AbstractRuleEntity<T> setPort(Integer port) {
+        this.port = port;
+        return this;
+    }
+
+    public T getRule() {
+        return rule;
+    }
+
+    public AbstractRuleEntity<T> setRule(T rule) {
+        this.rule = rule;
+        return this;
+    }
+
+    @Override
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public AbstractRuleEntity<T> setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+        return this;
+    }
+
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public AbstractRuleEntity<T> setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+        return this;
+    }
+
+    @Override
+    public T toRule() {
+        return rule;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/AuthorityRuleEntity.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/AuthorityRuleEntity.java
new file mode 100644
index 0000000..a085d89
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/AuthorityRuleEntity.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.datasource.entity.rule;
+
+import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule;
+import com.alibaba.csp.sentinel.util.AssertUtil;
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+/**
+ * @author Eric Zhao
+ * @since 0.2.1
+ */
+public class AuthorityRuleEntity extends AbstractRuleEntity<AuthorityRule> {
+
+    public AuthorityRuleEntity() {
+    }
+
+    public AuthorityRuleEntity(AuthorityRule authorityRule) {
+        AssertUtil.notNull(authorityRule, "Authority rule should not be null");
+        this.rule = authorityRule;
+    }
+
+    public static AuthorityRuleEntity fromAuthorityRule(String app, String ip, Integer port, AuthorityRule rule) {
+        AuthorityRuleEntity entity = new AuthorityRuleEntity(rule);
+        entity.setApp(app);
+        entity.setIp(ip);
+        entity.setPort(port);
+        return entity;
+    }
+
+    @JsonIgnore
+    @JSONField(serialize = false)
+    public String getLimitApp() {
+        return rule.getLimitApp();
+    }
+
+    @JsonIgnore
+    @JSONField(serialize = false)
+    public String getResource() {
+        return rule.getResource();
+    }
+
+    @JsonIgnore
+    @JSONField(serialize = false)
+    public int getStrategy() {
+        return rule.getStrategy();
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/DegradeRuleEntity.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/DegradeRuleEntity.java
new file mode 100644
index 0000000..4fd8b71
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/DegradeRuleEntity.java
@@ -0,0 +1,202 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.datasource.entity.rule;
+
+import java.util.Date;
+
+import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule;
+
+/**
+ * @author leyou
+ */
+public class DegradeRuleEntity implements RuleEntity {
+
+    private Long id;
+    private String app;
+
+    private String ip;
+    private Integer port;
+
+    private String resource;
+    private String limitApp;
+    private Double count;
+    private Integer timeWindow;
+    private Integer grade;
+    private Integer minRequestAmount;
+    private Double slowRatioThreshold;
+    private Integer statIntervalMs;
+
+    private Date gmtCreate;
+    private Date gmtModified;
+
+    public static DegradeRuleEntity fromDegradeRule(String app, String ip, Integer port, DegradeRule rule) {
+        DegradeRuleEntity entity = new DegradeRuleEntity();
+        entity.setApp(app);
+        entity.setIp(ip);
+        entity.setPort(port);
+        entity.setResource(rule.getResource());
+        entity.setLimitApp(rule.getLimitApp());
+        entity.setCount(rule.getCount());
+        entity.setTimeWindow(rule.getTimeWindow());
+        entity.setGrade(rule.getGrade());
+        entity.setMinRequestAmount(rule.getMinRequestAmount());
+        entity.setSlowRatioThreshold(rule.getSlowRatioThreshold());
+        entity.setStatIntervalMs(rule.getStatIntervalMs());
+        return entity;
+    }
+
+    @Override
+    public String getIp() {
+        return ip;
+    }
+
+    public void setIp(String ip) {
+        this.ip = ip;
+    }
+
+    @Override
+    public Integer getPort() {
+        return port;
+    }
+
+    public void setPort(Integer port) {
+        this.port = port;
+    }
+
+    @Override
+    public Long getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getApp() {
+        return app;
+    }
+
+    public void setApp(String app) {
+        this.app = app;
+    }
+
+    public String getResource() {
+        return resource;
+    }
+
+    public void setResource(String resource) {
+        this.resource = resource;
+    }
+
+    public String getLimitApp() {
+        return limitApp;
+    }
+
+    public void setLimitApp(String limitApp) {
+        this.limitApp = limitApp;
+    }
+
+    public Double getCount() {
+        return count;
+    }
+
+    public void setCount(Double count) {
+        this.count = count;
+    }
+
+    public Integer getTimeWindow() {
+        return timeWindow;
+    }
+
+    public void setTimeWindow(Integer timeWindow) {
+        this.timeWindow = timeWindow;
+    }
+
+    public Integer getGrade() {
+        return grade;
+    }
+
+    public void setGrade(Integer grade) {
+        this.grade = grade;
+    }
+
+    public Integer getMinRequestAmount() {
+        return minRequestAmount;
+    }
+
+    public DegradeRuleEntity setMinRequestAmount(Integer minRequestAmount) {
+        this.minRequestAmount = minRequestAmount;
+        return this;
+    }
+
+    public Double getSlowRatioThreshold() {
+        return slowRatioThreshold;
+    }
+
+    public DegradeRuleEntity setSlowRatioThreshold(Double slowRatioThreshold) {
+        this.slowRatioThreshold = slowRatioThreshold;
+        return this;
+    }
+
+    public Integer getStatIntervalMs() {
+        return statIntervalMs;
+    }
+
+    public DegradeRuleEntity setStatIntervalMs(Integer statIntervalMs) {
+        this.statIntervalMs = statIntervalMs;
+        return this;
+    }
+
+    @Override
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    @Override
+    public DegradeRule toRule() {
+        DegradeRule rule = new DegradeRule();
+        rule.setResource(resource);
+        rule.setLimitApp(limitApp);
+        rule.setCount(count);
+        rule.setTimeWindow(timeWindow);
+        rule.setGrade(grade);
+        if (minRequestAmount != null) {
+            rule.setMinRequestAmount(minRequestAmount);
+        }
+        if (slowRatioThreshold != null) {
+            rule.setSlowRatioThreshold(slowRatioThreshold);
+        }
+        if (statIntervalMs != null) {
+            rule.setStatIntervalMs(statIntervalMs);
+        }
+
+        return rule;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/FlowRuleEntity.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/FlowRuleEntity.java
new file mode 100644
index 0000000..a076bd4
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/FlowRuleEntity.java
@@ -0,0 +1,249 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.datasource.entity.rule;
+
+import java.util.Date;
+
+import com.alibaba.csp.sentinel.slots.block.flow.ClusterFlowConfig;
+import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
+
+/**
+ * @author leyou
+ */
+public class FlowRuleEntity implements RuleEntity {
+
+    private Long id;
+    private String app;
+    private String ip;
+    private Integer port;
+    private String limitApp;
+    private String resource;
+    /**
+     * 0涓虹嚎绋嬫暟;1涓簈ps
+     */
+    private Integer grade;
+    private Double count;
+    /**
+     * 0涓虹洿鎺ラ檺娴�;1涓哄叧鑱旈檺娴�;2涓洪摼璺檺娴�
+     ***/
+    private Integer strategy;
+    private String refResource;
+    /**
+     * 0. default, 1. warm up, 2. rate limiter
+     */
+    private Integer controlBehavior;
+    private Integer warmUpPeriodSec;
+    /**
+     * max queueing time in rate limiter behavior
+     */
+    private Integer maxQueueingTimeMs;
+
+    private boolean clusterMode;
+    /**
+     * Flow rule config for cluster mode.
+     */
+    private ClusterFlowConfig clusterConfig;
+
+    private Date gmtCreate;
+    private Date gmtModified;
+
+    public static FlowRuleEntity fromFlowRule(String app, String ip, Integer port, FlowRule rule) {
+        FlowRuleEntity entity = new FlowRuleEntity();
+        entity.setApp(app);
+        entity.setIp(ip);
+        entity.setPort(port);
+        entity.setLimitApp(rule.getLimitApp());
+        entity.setResource(rule.getResource());
+        entity.setGrade(rule.getGrade());
+        entity.setCount(rule.getCount());
+        entity.setStrategy(rule.getStrategy());
+        entity.setRefResource(rule.getRefResource());
+        entity.setControlBehavior(rule.getControlBehavior());
+        entity.setWarmUpPeriodSec(rule.getWarmUpPeriodSec());
+        entity.setMaxQueueingTimeMs(rule.getMaxQueueingTimeMs());
+        entity.setClusterMode(rule.isClusterMode());
+        entity.setClusterConfig(rule.getClusterConfig());
+        return entity;
+    }
+
+    @Override
+    public String getIp() {
+        return ip;
+    }
+
+    public void setIp(String ip) {
+        this.ip = ip;
+    }
+
+    @Override
+    public Integer getPort() {
+        return port;
+    }
+
+    public void setPort(Integer port) {
+        this.port = port;
+    }
+
+    @Override
+    public String getApp() {
+        return app;
+    }
+
+    public void setApp(String app) {
+        this.app = app;
+    }
+
+    @Override
+    public Long getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getLimitApp() {
+        return limitApp;
+    }
+
+    public void setLimitApp(String limitApp) {
+        this.limitApp = limitApp;
+    }
+
+    public String getResource() {
+        return resource;
+    }
+
+    public void setResource(String resource) {
+        this.resource = resource;
+    }
+
+    public Integer getGrade() {
+        return grade;
+    }
+
+    public void setGrade(Integer grade) {
+        this.grade = grade;
+    }
+
+    public Double getCount() {
+        return count;
+    }
+
+    public void setCount(Double count) {
+        this.count = count;
+    }
+
+    public Integer getStrategy() {
+        return strategy;
+    }
+
+    public void setStrategy(Integer strategy) {
+        this.strategy = strategy;
+    }
+
+    public String getRefResource() {
+        return refResource;
+    }
+
+    public void setRefResource(String refResource) {
+        this.refResource = refResource;
+    }
+
+    public Integer getControlBehavior() {
+        return controlBehavior;
+    }
+
+    public void setControlBehavior(Integer controlBehavior) {
+        this.controlBehavior = controlBehavior;
+    }
+
+    public Integer getWarmUpPeriodSec() {
+        return warmUpPeriodSec;
+    }
+
+    public void setWarmUpPeriodSec(Integer warmUpPeriodSec) {
+        this.warmUpPeriodSec = warmUpPeriodSec;
+    }
+
+    public Integer getMaxQueueingTimeMs() {
+        return maxQueueingTimeMs;
+    }
+
+    public void setMaxQueueingTimeMs(Integer maxQueueingTimeMs) {
+        this.maxQueueingTimeMs = maxQueueingTimeMs;
+    }
+
+    public boolean isClusterMode() {
+        return clusterMode;
+    }
+
+    public FlowRuleEntity setClusterMode(boolean clusterMode) {
+        this.clusterMode = clusterMode;
+        return this;
+    }
+
+    public ClusterFlowConfig getClusterConfig() {
+        return clusterConfig;
+    }
+
+    public FlowRuleEntity setClusterConfig(ClusterFlowConfig clusterConfig) {
+        this.clusterConfig = clusterConfig;
+        return this;
+    }
+
+    @Override
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    @Override
+    public FlowRule toRule() {
+        FlowRule flowRule = new FlowRule();
+        flowRule.setCount(this.count);
+        flowRule.setGrade(this.grade);
+        flowRule.setResource(this.resource);
+        flowRule.setLimitApp(this.limitApp);
+        flowRule.setRefResource(this.refResource);
+        flowRule.setStrategy(this.strategy);
+        if (this.controlBehavior != null) {
+            flowRule.setControlBehavior(controlBehavior);
+        }
+        if (this.warmUpPeriodSec != null) {
+            flowRule.setWarmUpPeriodSec(warmUpPeriodSec);
+        }
+        if (this.maxQueueingTimeMs != null) {
+            flowRule.setMaxQueueingTimeMs(maxQueueingTimeMs);
+        }
+        flowRule.setClusterMode(clusterMode);
+        flowRule.setClusterConfig(clusterConfig);
+        return flowRule;
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/ParamFlowRuleEntity.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/ParamFlowRuleEntity.java
new file mode 100644
index 0000000..b1c10d9
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/ParamFlowRuleEntity.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.datasource.entity.rule;
+
+import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowClusterConfig;
+import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowItem;
+import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule;
+import com.alibaba.csp.sentinel.util.AssertUtil;
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+import java.util.List;
+
+/**
+ * @author Eric Zhao
+ * @since 0.2.1
+ */
+public class ParamFlowRuleEntity extends AbstractRuleEntity<ParamFlowRule> {
+
+    public ParamFlowRuleEntity() {
+    }
+
+    public ParamFlowRuleEntity(ParamFlowRule rule) {
+        AssertUtil.notNull(rule, "Authority rule should not be null");
+        this.rule = rule;
+    }
+
+    public static ParamFlowRuleEntity fromParamFlowRule(String app, String ip, Integer port, ParamFlowRule rule) {
+        ParamFlowRuleEntity entity = new ParamFlowRuleEntity(rule);
+        entity.setApp(app);
+        entity.setIp(ip);
+        entity.setPort(port);
+        return entity;
+    }
+
+    @JsonIgnore
+    @JSONField(serialize = false)
+    public String getLimitApp() {
+        return rule.getLimitApp();
+    }
+
+    @JsonIgnore
+    @JSONField(serialize = false)
+    public String getResource() {
+        return rule.getResource();
+    }
+
+    @JsonIgnore
+    @JSONField(serialize = false)
+    public int getGrade() {
+        return rule.getGrade();
+    }
+
+    @JsonIgnore
+    @JSONField(serialize = false)
+    public Integer getParamIdx() {
+        return rule.getParamIdx();
+    }
+
+    @JsonIgnore
+    @JSONField(serialize = false)
+    public double getCount() {
+        return rule.getCount();
+    }
+
+    @JsonIgnore
+    @JSONField(serialize = false)
+    public List<ParamFlowItem> getParamFlowItemList() {
+        return rule.getParamFlowItemList();
+    }
+
+    @JsonIgnore
+    @JSONField(serialize = false)
+    public int getControlBehavior() {
+        return rule.getControlBehavior();
+    }
+
+    @JsonIgnore
+    @JSONField(serialize = false)
+    public int getMaxQueueingTimeMs() {
+        return rule.getMaxQueueingTimeMs();
+    }
+
+    @JsonIgnore
+    @JSONField(serialize = false)
+    public int getBurstCount() {
+        return rule.getBurstCount();
+    }
+
+    @JsonIgnore
+    @JSONField(serialize = false)
+    public long getDurationInSec() {
+        return rule.getDurationInSec();
+    }
+
+    @JsonIgnore
+    @JSONField(serialize = false)
+    public boolean isClusterMode() {
+        return rule.isClusterMode();
+    }
+
+    @JsonIgnore
+    @JSONField(serialize = false)
+    public ParamFlowClusterConfig getClusterConfig() {
+        return rule.getClusterConfig();
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/RuleEntity.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/RuleEntity.java
new file mode 100644
index 0000000..0ad764f
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/RuleEntity.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.datasource.entity.rule;
+
+import java.util.Date;
+
+import com.alibaba.csp.sentinel.slots.block.Rule;
+
+/**
+ * @author leyou
+ */
+public interface RuleEntity {
+
+    Long getId();
+
+    void setId(Long id);
+
+    String getApp();
+
+    String getIp();
+
+    Integer getPort();
+
+    Date getGmtCreate();
+    
+    Rule toRule();
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/SystemRuleEntity.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/SystemRuleEntity.java
new file mode 100644
index 0000000..483ebcb
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/SystemRuleEntity.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.datasource.entity.rule;
+
+import com.alibaba.csp.sentinel.slots.system.SystemRule;
+
+import java.util.Date;
+
+/**
+ * @author leyou
+ */
+public class SystemRuleEntity implements RuleEntity {
+
+    private Long id;
+
+    private String app;
+    private String ip;
+    private Integer port;
+    private Double highestSystemLoad;
+    private Long avgRt;
+    private Long maxThread;
+    private Double qps;
+    private Double highestCpuUsage;
+
+    private Date gmtCreate;
+    private Date gmtModified;
+
+    public static SystemRuleEntity fromSystemRule(String app, String ip, Integer port, SystemRule rule) {
+        SystemRuleEntity entity = new SystemRuleEntity();
+        entity.setApp(app);
+        entity.setIp(ip);
+        entity.setPort(port);
+        entity.setHighestSystemLoad(rule.getHighestSystemLoad());
+        entity.setHighestCpuUsage(rule.getHighestCpuUsage());
+        entity.setAvgRt(rule.getAvgRt());
+        entity.setMaxThread(rule.getMaxThread());
+        entity.setQps(rule.getQps());
+        return entity;
+    }
+
+    @Override
+    public String getIp() {
+        return ip;
+    }
+
+    public void setIp(String ip) {
+        this.ip = ip;
+    }
+
+    @Override
+    public Integer getPort() {
+        return port;
+    }
+
+    public void setPort(Integer port) {
+        this.port = port;
+    }
+
+    @Override
+    public Long getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getApp() {
+        return app;
+    }
+
+    public void setApp(String app) {
+        this.app = app;
+    }
+
+    public Double getHighestSystemLoad() {
+        return highestSystemLoad;
+    }
+
+    public void setHighestSystemLoad(Double highestSystemLoad) {
+        this.highestSystemLoad = highestSystemLoad;
+    }
+
+    public Long getAvgRt() {
+        return avgRt;
+    }
+
+    public void setAvgRt(Long avgRt) {
+        this.avgRt = avgRt;
+    }
+
+    public Long getMaxThread() {
+        return maxThread;
+    }
+
+    public void setMaxThread(Long maxThread) {
+        this.maxThread = maxThread;
+    }
+
+    public Double getQps() {
+        return qps;
+    }
+
+    public void setQps(Double qps) {
+        this.qps = qps;
+    }
+
+    public Double getHighestCpuUsage() {
+        return highestCpuUsage;
+    }
+
+    public void setHighestCpuUsage(Double highestCpuUsage) {
+        this.highestCpuUsage = highestCpuUsage;
+    }
+
+    @Override
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    @Override
+    public SystemRule toRule() {
+        SystemRule rule = new SystemRule();
+        rule.setHighestSystemLoad(highestSystemLoad);
+        rule.setAvgRt(avgRt);
+        rule.setMaxThread(maxThread);
+        rule.setQps(qps);
+        rule.setHighestCpuUsage(highestCpuUsage);
+        return rule;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/AppInfo.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/AppInfo.java
new file mode 100644
index 0000000..2897590
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/AppInfo.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.discovery;
+
+import com.alibaba.csp.sentinel.dashboard.config.DashboardConfig;
+
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class AppInfo {
+
+    private String app = "";
+
+    private Integer appType = 0;
+
+    private Set<MachineInfo> machines = ConcurrentHashMap.newKeySet();
+
+    public AppInfo() {}
+
+    public AppInfo(String app) {
+        this.app = app;
+    }
+
+    public AppInfo(String app, Integer appType) {
+        this.app = app;
+        this.appType = appType;
+    }
+
+    public String getApp() {
+        return app;
+    }
+
+    public void setApp(String app) {
+        this.app = app;
+    }
+
+    public Integer getAppType() {
+        return appType;
+    }
+
+    public void setAppType(Integer appType) {
+        this.appType = appType;
+    }
+
+    /**
+     * Get the current machines.
+     *
+     * @return a new copy of the current machines.
+     */
+    public Set<MachineInfo> getMachines() {
+        return new HashSet<>(machines);
+    }
+
+    @Override
+    public String toString() {
+        return "AppInfo{" + "app='" + app + ", machines=" + machines + '}';
+    }
+
+    public boolean addMachine(MachineInfo machineInfo) {
+        machines.remove(machineInfo);
+        return machines.add(machineInfo);
+    }
+
+    public synchronized boolean removeMachine(String ip, int port) {
+        Iterator<MachineInfo> it = machines.iterator();
+        while (it.hasNext()) {
+            MachineInfo machine = it.next();
+            if (machine.getIp().equals(ip) && machine.getPort() == port) {
+                it.remove();
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public Optional<MachineInfo> getMachine(String ip, int port) {
+        return machines.stream()
+            .filter(e -> e.getIp().equals(ip) && e.getPort().equals(port))
+            .findFirst();
+    }
+
+    public Optional<MachineInfo> getMachine(String ip) {
+        return machines.stream()
+            .filter(e -> e.getIp().equals(ip))
+            .findFirst();
+    }
+
+    private boolean heartbeatJudge(final int threshold) {
+        if (machines.size() == 0) {
+            return false;
+        }
+        if (threshold > 0) {
+            long healthyCount = machines.stream()
+                .filter(MachineInfo::isHealthy)
+                .count();
+            if (healthyCount == 0) {
+                // No healthy machines.
+                return machines.stream()
+                    .max(Comparator.comparingLong(MachineInfo::getLastHeartbeat))
+                    .map(e -> System.currentTimeMillis() - e.getLastHeartbeat() < threshold)
+                    .orElse(false);
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Check whether current application has no healthy machines and should not be displayed.
+     *
+     * @return true if the application should be displayed in the sidebar, otherwise false
+     */
+    public boolean isShown() {
+        return heartbeatJudge(DashboardConfig.getHideAppNoMachineMillis());
+    }
+
+    /**
+     * Check whether current application has no healthy machines and should be removed.
+     *
+     * @return true if the application is dead and should be removed, otherwise false
+     */
+    public boolean isDead() {
+        return !heartbeatJudge(DashboardConfig.getRemoveAppNoMachineMillis());
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/AppManagement.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/AppManagement.java
new file mode 100644
index 0000000..0924a3e
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/AppManagement.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.discovery;
+
+import com.alibaba.csp.sentinel.util.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+
+@Component
+public class AppManagement implements MachineDiscovery {
+
+    @Autowired
+    private ApplicationContext context;
+
+    private MachineDiscovery machineDiscovery;
+
+    @PostConstruct
+    public void init() {
+        machineDiscovery = context.getBean(SimpleMachineDiscovery.class);
+    }
+
+    @Override
+    public Set<AppInfo> getBriefApps() {
+        return machineDiscovery.getBriefApps();
+    }
+
+    @Override
+    public long addMachine(MachineInfo machineInfo) {
+        return machineDiscovery.addMachine(machineInfo);
+    }
+
+    @Override
+    public boolean removeMachine(String app, String ip, int port) {
+        return machineDiscovery.removeMachine(app, ip, port);
+    }
+
+    @Override
+    public List<String> getAppNames() {
+        return machineDiscovery.getAppNames();
+    }
+
+    @Override
+    public AppInfo getDetailApp(String app) {
+        return machineDiscovery.getDetailApp(app);
+    }
+
+    @Override
+    public void removeApp(String app) {
+        machineDiscovery.removeApp(app);
+    }
+
+    public boolean isValidMachineOfApp(String app, String ip) {
+        if (StringUtil.isEmpty(app)) {
+            return false;
+        }
+        return Optional.ofNullable(getDetailApp(app))
+            .flatMap(a -> a.getMachine(ip))
+            .isPresent();
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/MachineDiscovery.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/MachineDiscovery.java
new file mode 100644
index 0000000..260b0d8
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/MachineDiscovery.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.discovery;
+
+import java.util.List;
+import java.util.Set;
+
+public interface MachineDiscovery {
+
+    String UNKNOWN_APP_NAME = "CLUSTER_NOT_STARTED";
+
+    List<String> getAppNames();
+
+    Set<AppInfo> getBriefApps();
+
+    AppInfo getDetailApp(String app);
+
+    /**
+     * Remove the given app from the application registry.
+     *
+     * @param app application name
+     * @since 1.5.0
+     */
+    void removeApp(String app);
+
+    long addMachine(MachineInfo machineInfo);
+
+    /**
+     * Remove the given machine instance from the application registry.
+     *
+     * @param app the application name of the machine
+     * @param ip machine IP
+     * @param port machine port
+     * @return true if removed, otherwise false
+     * @since 1.5.0
+     */
+    boolean removeMachine(String app, String ip, int port);
+}
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/MachineInfo.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/MachineInfo.java
new file mode 100644
index 0000000..afcc812
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/MachineInfo.java
@@ -0,0 +1,185 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.discovery;
+
+import java.util.Objects;
+
+import com.alibaba.csp.sentinel.dashboard.config.DashboardConfig;
+import com.alibaba.csp.sentinel.util.StringUtil;
+
+public class MachineInfo implements Comparable<MachineInfo> {
+
+    private String app = "";
+    private Integer appType = 0;
+    private String hostname = "";
+    private String ip = "";
+    private Integer port = -1;
+    private long lastHeartbeat;
+    private long heartbeatVersion;
+
+    /**
+     * Indicates the version of Sentinel client (since 0.2.0).
+     */
+    private String version;
+
+    public static MachineInfo of(String app, String ip, Integer port) {
+        MachineInfo machineInfo = new MachineInfo();
+        machineInfo.setApp(app);
+        machineInfo.setIp(ip);
+        machineInfo.setPort(port);
+        return machineInfo;
+    }
+
+    public String toHostPort() {
+        return ip + ":" + port;
+    }
+
+    public Integer getPort() {
+        return port;
+    }
+
+    public void setPort(Integer port) {
+        this.port = port;
+    }
+
+    public String getApp() {
+        return app;
+    }
+
+    public void setApp(String app) {
+        this.app = app;
+    }
+
+    public Integer getAppType() {
+        return appType;
+    }
+
+    public void setAppType(Integer appType) {
+        this.appType = appType;
+    }
+
+    public String getHostname() {
+        return hostname;
+    }
+
+    public void setHostname(String hostname) {
+        this.hostname = hostname;
+    }
+
+    public String getIp() {
+        return ip;
+    }
+
+    public void setIp(String ip) {
+        this.ip = ip;
+    }
+
+    public long getHeartbeatVersion() {
+        return heartbeatVersion;
+    }
+    
+    public void setHeartbeatVersion(long heartbeatVersion) {
+        this.heartbeatVersion = heartbeatVersion;
+    }
+
+    public String getVersion() {
+        return version;
+    }
+
+    public MachineInfo setVersion(String version) {
+        this.version = version;
+        return this;
+    }
+    
+    public boolean isHealthy() {
+        long delta = System.currentTimeMillis() - lastHeartbeat;
+        return delta < DashboardConfig.getUnhealthyMachineMillis();
+    }
+    
+    /**
+     * whether dead should be removed
+     * 
+     * @return
+     */
+    public boolean isDead() {
+        if (DashboardConfig.getAutoRemoveMachineMillis() > 0) {
+            long delta = System.currentTimeMillis() - lastHeartbeat;
+            return delta > DashboardConfig.getAutoRemoveMachineMillis();
+        }
+        return false;
+    }
+    
+    public long getLastHeartbeat() {
+        return lastHeartbeat;
+    }
+    
+    public void setLastHeartbeat(long lastHeartbeat) {
+        this.lastHeartbeat = lastHeartbeat;
+    }
+
+    @Override
+    public int compareTo(MachineInfo o) {
+        if (this == o) {
+            return 0;
+        }
+        if (!port.equals(o.getPort())) {
+            return port.compareTo(o.getPort());
+        }
+        if (!StringUtil.equals(app, o.getApp())) {
+            return app.compareToIgnoreCase(o.getApp());
+        }
+        return ip.compareToIgnoreCase(o.getIp());
+    }
+
+    @Override
+    public String toString() {
+        return new StringBuilder("MachineInfo {")
+            .append("app='").append(app).append('\'')
+            .append(",appType='").append(appType).append('\'')
+            .append(", hostname='").append(hostname).append('\'')
+            .append(", ip='").append(ip).append('\'')
+            .append(", port=").append(port)
+            .append(", heartbeatVersion=").append(heartbeatVersion)
+            .append(", lastHeartbeat=").append(lastHeartbeat)
+            .append(", version='").append(version).append('\'')
+            .append(", healthy=").append(isHealthy())
+            .append('}').toString();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) { return true; }
+        if (!(o instanceof MachineInfo)) { return false; }
+        MachineInfo that = (MachineInfo)o;
+        return Objects.equals(app, that.app) &&
+            Objects.equals(ip, that.ip) &&
+            Objects.equals(port, that.port);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(app, ip, port);
+    }
+
+    /**
+     * Information for log
+     *
+     * @return
+     */
+    public String toLogString() {
+        return app + "|" + ip + "|" + port + "|" + version;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/SimpleMachineDiscovery.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/SimpleMachineDiscovery.java
new file mode 100644
index 0000000..a4ab83a
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/SimpleMachineDiscovery.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.discovery;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import com.alibaba.csp.sentinel.util.AssertUtil;
+
+import org.springframework.stereotype.Component;
+
+/**
+ * @author leyou
+ */
+@Component
+public class SimpleMachineDiscovery implements MachineDiscovery {
+
+    private final ConcurrentMap<String, AppInfo> apps = new ConcurrentHashMap<>();
+
+    @Override
+    public long addMachine(MachineInfo machineInfo) {
+        AssertUtil.notNull(machineInfo, "machineInfo cannot be null");
+        AppInfo appInfo = apps.computeIfAbsent(machineInfo.getApp(), o -> new AppInfo(machineInfo.getApp(), machineInfo.getAppType()));
+        appInfo.addMachine(machineInfo);
+        return 1;
+    }
+
+    @Override
+    public boolean removeMachine(String app, String ip, int port) {
+        AssertUtil.assertNotBlank(app, "app name cannot be blank");
+        AppInfo appInfo = apps.get(app);
+        if (appInfo != null) {
+            return appInfo.removeMachine(ip, port);
+        }
+        return false;
+    }
+
+    @Override
+    public List<String> getAppNames() {
+        return new ArrayList<>(apps.keySet());
+    }
+
+    @Override
+    public AppInfo getDetailApp(String app) {
+        AssertUtil.assertNotBlank(app, "app name cannot be blank");
+        return apps.get(app);
+    }
+
+    @Override
+    public Set<AppInfo> getBriefApps() {
+        return new HashSet<>(apps.values());
+    }
+
+    @Override
+    public void removeApp(String app) {
+        AssertUtil.assertNotBlank(app, "app name cannot be blank");
+        apps.remove(app);
+    }
+
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/ResourceTreeNode.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/ResourceTreeNode.java
new file mode 100644
index 0000000..be57616
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/ResourceTreeNode.java
@@ -0,0 +1,242 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.alibaba.csp.sentinel.command.vo.NodeVo;
+
+/**
+ * @author leyou
+ */
+public class ResourceTreeNode {
+    private String id;
+    private String parentId;
+    private String resource;
+
+    private Integer threadNum;
+    private Long passQps;
+    private Long blockQps;
+    private Long totalQps;
+    private Long averageRt;
+    private Long successQps;
+    private Long exceptionQps;
+    private Long oneMinutePass;
+    private Long oneMinuteBlock;
+    private Long oneMinuteException;
+    private Long oneMinuteTotal;
+
+    private boolean visible = true;
+
+    private List<ResourceTreeNode> children = new ArrayList<>();
+
+    public static ResourceTreeNode fromNodeVoList(List<NodeVo> nodeVos) {
+        if (nodeVos == null || nodeVos.isEmpty()) {
+            return null;
+        }
+        ResourceTreeNode root = null;
+        Map<String, ResourceTreeNode> map = new HashMap<>();
+        for (NodeVo vo : nodeVos) {
+            ResourceTreeNode node = fromNodeVo(vo);
+            map.put(node.id, node);
+            // real root
+            if (node.parentId == null || node.parentId.isEmpty()) {
+                root = node;
+            } else if (map.containsKey(node.parentId)) {
+                map.get(node.parentId).children.add(node);
+            } else {
+                // impossible
+            }
+        }
+        return root;
+    }
+
+    public static ResourceTreeNode fromNodeVo(NodeVo vo) {
+        ResourceTreeNode node = new ResourceTreeNode();
+        node.id = vo.getId();
+        node.parentId = vo.getParentId();
+        node.resource = vo.getResource();
+        node.threadNum = vo.getThreadNum();
+        node.passQps = vo.getPassQps();
+        node.blockQps = vo.getBlockQps();
+        node.totalQps = vo.getTotalQps();
+        node.averageRt = vo.getAverageRt();
+        node.successQps = vo.getSuccessQps();
+        node.exceptionQps = vo.getExceptionQps();
+        node.oneMinutePass = vo.getOneMinutePass();
+        node.oneMinuteBlock = vo.getOneMinuteBlock();
+        node.oneMinuteException = vo.getOneMinuteException();
+        node.oneMinuteTotal = vo.getOneMinuteTotal();
+        return node;
+    }
+
+    public void searchIgnoreCase(String searchKey) {
+        search(this, searchKey);
+    }
+
+    /**
+     * This node is visible only when searchKey matches this.resource or at least
+     * one of this's children is visible
+     */
+    private boolean search(ResourceTreeNode node, String searchKey) {
+        // empty matches all
+        if (searchKey == null || searchKey.isEmpty() ||
+            node.resource.toLowerCase().contains(searchKey.toLowerCase())) {
+            node.visible = true;
+        } else {
+            node.visible = false;
+        }
+
+        boolean found = false;
+        for (ResourceTreeNode c : node.children) {
+            found |= search(c, searchKey);
+        }
+        node.visible |= found;
+        return node.visible;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(String parentId) {
+        this.parentId = parentId;
+    }
+
+    public String getResource() {
+        return resource;
+    }
+
+    public void setResource(String resource) {
+        this.resource = resource;
+    }
+
+    public Integer getThreadNum() {
+        return threadNum;
+    }
+
+    public void setThreadNum(Integer threadNum) {
+        this.threadNum = threadNum;
+    }
+
+    public Long getPassQps() {
+        return passQps;
+    }
+
+    public void setPassQps(Long passQps) {
+        this.passQps = passQps;
+    }
+
+    public Long getBlockQps() {
+        return blockQps;
+    }
+
+    public void setBlockQps(Long blockQps) {
+        this.blockQps = blockQps;
+    }
+
+    public Long getTotalQps() {
+        return totalQps;
+    }
+
+    public void setTotalQps(Long totalQps) {
+        this.totalQps = totalQps;
+    }
+
+    public Long getAverageRt() {
+        return averageRt;
+    }
+
+    public void setAverageRt(Long averageRt) {
+        this.averageRt = averageRt;
+    }
+
+    public Long getSuccessQps() {
+        return successQps;
+    }
+
+    public void setSuccessQps(Long successQps) {
+        this.successQps = successQps;
+    }
+
+    public Long getExceptionQps() {
+        return exceptionQps;
+    }
+
+    public void setExceptionQps(Long exceptionQps) {
+        this.exceptionQps = exceptionQps;
+    }
+
+    public Long getOneMinutePass() {
+        return oneMinutePass;
+    }
+
+    public void setOneMinutePass(Long oneMinutePass) {
+        this.oneMinutePass = oneMinutePass;
+    }
+
+    public Long getOneMinuteBlock() {
+        return oneMinuteBlock;
+    }
+
+    public void setOneMinuteBlock(Long oneMinuteBlock) {
+        this.oneMinuteBlock = oneMinuteBlock;
+    }
+
+    public Long getOneMinuteException() {
+        return oneMinuteException;
+    }
+
+    public void setOneMinuteException(Long oneMinuteException) {
+        this.oneMinuteException = oneMinuteException;
+    }
+
+    public Long getOneMinuteTotal() {
+        return oneMinuteTotal;
+    }
+
+    public void setOneMinuteTotal(Long oneMinuteTotal) {
+        this.oneMinuteTotal = oneMinuteTotal;
+    }
+
+    public boolean isVisible() {
+        return visible;
+    }
+
+    public void setVisible(boolean visible) {
+        this.visible = visible;
+    }
+
+    public List<ResourceTreeNode> getChildren() {
+        return children;
+    }
+
+    public void setChildren(List<ResourceTreeNode> children) {
+        this.children = children;
+    }
+}
+
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/Result.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/Result.java
new file mode 100644
index 0000000..2dbf476
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/Result.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain;
+
+/**
+ * @author leyou
+ * @author Eric Zhao
+ */
+public class Result<R> {
+
+    private boolean success;
+    private int code;
+    private String msg;
+    private R data;
+
+    public static <R> Result<R> ofSuccess(R data) {
+        return new Result<R>()
+            .setSuccess(true)
+            .setMsg("success")
+            .setData(data);
+    }
+
+    public static <R> Result<R> ofSuccessMsg(String msg) {
+        return new Result<R>()
+            .setSuccess(true)
+            .setMsg(msg);
+    }
+
+    public static <R> Result<R> ofFail(int code, String msg) {
+        Result<R> result = new Result<>();
+        result.setSuccess(false);
+        result.setCode(code);
+        result.setMsg(msg);
+        return result;
+    }
+
+    public static <R> Result<R> ofThrowable(int code, Throwable throwable) {
+        Result<R> result = new Result<>();
+        result.setSuccess(false);
+        result.setCode(code);
+        result.setMsg(throwable.getClass().getName() + ", " + throwable.getMessage());
+        return result;
+    }
+
+    public boolean isSuccess() {
+        return success;
+    }
+
+    public Result<R> setSuccess(boolean success) {
+        this.success = success;
+        return this;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public Result<R> setCode(int code) {
+        this.code = code;
+        return this;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public Result<R> setMsg(String msg) {
+        this.msg = msg;
+        return this;
+    }
+
+    public R getData() {
+        return data;
+    }
+
+    public Result<R> setData(R data) {
+        this.data = data;
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return "Result{" +
+            "success=" + success +
+            ", code=" + code +
+            ", msg='" + msg + '\'' +
+            ", data=" + data +
+            '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterAppAssignResultVO.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterAppAssignResultVO.java
new file mode 100644
index 0000000..b7b48cc
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterAppAssignResultVO.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain.cluster;
+
+import java.util.Set;
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.1
+ */
+public class ClusterAppAssignResultVO {
+
+    private Set<String> failedServerSet;
+    private Set<String> failedClientSet;
+
+    private Integer totalCount;
+
+    public Set<String> getFailedServerSet() {
+        return failedServerSet;
+    }
+
+    public ClusterAppAssignResultVO setFailedServerSet(Set<String> failedServerSet) {
+        this.failedServerSet = failedServerSet;
+        return this;
+    }
+
+    public Set<String> getFailedClientSet() {
+        return failedClientSet;
+    }
+
+    public ClusterAppAssignResultVO setFailedClientSet(Set<String> failedClientSet) {
+        this.failedClientSet = failedClientSet;
+        return this;
+    }
+
+    public Integer getTotalCount() {
+        return totalCount;
+    }
+
+    public ClusterAppAssignResultVO setTotalCount(Integer totalCount) {
+        this.totalCount = totalCount;
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return "ClusterAppAssignResultVO{" +
+            "failedServerSet=" + failedServerSet +
+            ", failedClientSet=" + failedClientSet +
+            ", totalCount=" + totalCount +
+            '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterAppFullAssignRequest.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterAppFullAssignRequest.java
new file mode 100644
index 0000000..96a3dc9
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterAppFullAssignRequest.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain.cluster;
+
+import java.util.List;
+import java.util.Set;
+
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.request.ClusterAppAssignMap;
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.1
+ */
+public class ClusterAppFullAssignRequest {
+
+    private List<ClusterAppAssignMap> clusterMap;
+    private Set<String> remainingList;
+
+    public List<ClusterAppAssignMap> getClusterMap() {
+        return clusterMap;
+    }
+
+    public ClusterAppFullAssignRequest setClusterMap(
+        List<ClusterAppAssignMap> clusterMap) {
+        this.clusterMap = clusterMap;
+        return this;
+    }
+
+    public Set<String> getRemainingList() {
+        return remainingList;
+    }
+
+    public ClusterAppFullAssignRequest setRemainingList(Set<String> remainingList) {
+        this.remainingList = remainingList;
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return "ClusterAppFullAssignRequest{" +
+            "clusterMap=" + clusterMap +
+            ", remainingList=" + remainingList +
+            '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterAppSingleServerAssignRequest.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterAppSingleServerAssignRequest.java
new file mode 100644
index 0000000..f9d9bbc
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterAppSingleServerAssignRequest.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain.cluster;
+
+import java.util.Set;
+
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.request.ClusterAppAssignMap;
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.1
+ */
+public class ClusterAppSingleServerAssignRequest {
+
+    private ClusterAppAssignMap clusterMap;
+    private Set<String> remainingList;
+
+    public ClusterAppAssignMap getClusterMap() {
+        return clusterMap;
+    }
+
+    public ClusterAppSingleServerAssignRequest setClusterMap(ClusterAppAssignMap clusterMap) {
+        this.clusterMap = clusterMap;
+        return this;
+    }
+
+    public Set<String> getRemainingList() {
+        return remainingList;
+    }
+
+    public ClusterAppSingleServerAssignRequest setRemainingList(Set<String> remainingList) {
+        this.remainingList = remainingList;
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return "ClusterAppSingleServerAssignRequest{" +
+            "clusterMap=" + clusterMap +
+            ", remainingList=" + remainingList +
+            '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterClientInfoVO.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterClientInfoVO.java
new file mode 100644
index 0000000..a9437e7
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterClientInfoVO.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain.cluster;
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.1
+ */
+public class ClusterClientInfoVO {
+
+    private String serverHost;
+    private Integer serverPort;
+
+    private Integer clientState;
+
+    private Integer requestTimeout;
+
+    public String getServerHost() {
+        return serverHost;
+    }
+
+    public ClusterClientInfoVO setServerHost(String serverHost) {
+        this.serverHost = serverHost;
+        return this;
+    }
+
+    public Integer getServerPort() {
+        return serverPort;
+    }
+
+    public ClusterClientInfoVO setServerPort(Integer serverPort) {
+        this.serverPort = serverPort;
+        return this;
+    }
+
+    public Integer getClientState() {
+        return clientState;
+    }
+
+    public ClusterClientInfoVO setClientState(Integer clientState) {
+        this.clientState = clientState;
+        return this;
+    }
+
+    public Integer getRequestTimeout() {
+        return requestTimeout;
+    }
+
+    public ClusterClientInfoVO setRequestTimeout(Integer requestTimeout) {
+        this.requestTimeout = requestTimeout;
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return "ClusterClientInfoVO{" +
+            "serverHost='" + serverHost + '\'' +
+            ", serverPort=" + serverPort +
+            ", clientState=" + clientState +
+            ", requestTimeout=" + requestTimeout +
+            '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterGroupEntity.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterGroupEntity.java
new file mode 100644
index 0000000..eef2552
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterGroupEntity.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain.cluster;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.1
+ */
+public class ClusterGroupEntity {
+
+    private String machineId;
+
+    private String ip;
+    private Integer port;
+
+    private Set<String> clientSet = new HashSet<>();
+
+    private Boolean belongToApp;
+
+    public String getMachineId() {
+        return machineId;
+    }
+
+    public ClusterGroupEntity setMachineId(String machineId) {
+        this.machineId = machineId;
+        return this;
+    }
+
+    public String getIp() {
+        return ip;
+    }
+
+    public ClusterGroupEntity setIp(String ip) {
+        this.ip = ip;
+        return this;
+    }
+
+    public Integer getPort() {
+        return port;
+    }
+
+    public ClusterGroupEntity setPort(Integer port) {
+        this.port = port;
+        return this;
+    }
+
+    public Set<String> getClientSet() {
+        return clientSet;
+    }
+
+    public ClusterGroupEntity setClientSet(Set<String> clientSet) {
+        this.clientSet = clientSet;
+        return this;
+    }
+
+    public Boolean getBelongToApp() {
+        return belongToApp;
+    }
+
+    public ClusterGroupEntity setBelongToApp(Boolean belongToApp) {
+        this.belongToApp = belongToApp;
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return "ClusterGroupEntity{" +
+            "machineId='" + machineId + '\'' +
+            ", ip='" + ip + '\'' +
+            ", port=" + port +
+            ", clientSet=" + clientSet +
+            ", belongToApp=" + belongToApp +
+            '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterStateSingleVO.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterStateSingleVO.java
new file mode 100644
index 0000000..7678c51
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterStateSingleVO.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain.cluster;
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.1
+ */
+public class ClusterStateSingleVO {
+
+    private String address;
+    private Integer mode;
+    private String target;
+
+    public String getAddress() {
+        return address;
+    }
+
+    public ClusterStateSingleVO setAddress(String address) {
+        this.address = address;
+        return this;
+    }
+
+    public Integer getMode() {
+        return mode;
+    }
+
+    public ClusterStateSingleVO setMode(Integer mode) {
+        this.mode = mode;
+        return this;
+    }
+
+    public String getTarget() {
+        return target;
+    }
+
+    public ClusterStateSingleVO setTarget(String target) {
+        this.target = target;
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return "ClusterStateSingleVO{" +
+            "address='" + address + '\'' +
+            ", mode=" + mode +
+            ", target='" + target + '\'' +
+            '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ConnectionDescriptorVO.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ConnectionDescriptorVO.java
new file mode 100644
index 0000000..71d9e74
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ConnectionDescriptorVO.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain.cluster;
+
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.0
+ */
+public class ConnectionDescriptorVO {
+
+    private String address;
+    private String host;
+
+    public String getAddress() {
+        return address;
+    }
+
+    public ConnectionDescriptorVO setAddress(String address) {
+        this.address = address;
+        return this;
+    }
+
+    public String getHost() {
+        return host;
+    }
+
+    public ConnectionDescriptorVO setHost(String host) {
+        this.host = host;
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return "ConnectionDescriptorVO{" +
+            "address='" + address + '\'' +
+            ", host='" + host + '\'' +
+            '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ConnectionGroupVO.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ConnectionGroupVO.java
new file mode 100644
index 0000000..af3aa90
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ConnectionGroupVO.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain.cluster;
+
+import java.util.List;
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.0
+ */
+public class ConnectionGroupVO {
+
+    private String namespace;
+    private List<ConnectionDescriptorVO> connectionSet;
+    private Integer connectedCount;
+
+    public String getNamespace() {
+        return namespace;
+    }
+
+    public ConnectionGroupVO setNamespace(String namespace) {
+        this.namespace = namespace;
+        return this;
+    }
+
+    public List<ConnectionDescriptorVO> getConnectionSet() {
+        return connectionSet;
+    }
+
+    public ConnectionGroupVO setConnectionSet(
+        List<ConnectionDescriptorVO> connectionSet) {
+        this.connectionSet = connectionSet;
+        return this;
+    }
+
+    public Integer getConnectedCount() {
+        return connectedCount;
+    }
+
+    public ConnectionGroupVO setConnectedCount(Integer connectedCount) {
+        this.connectedCount = connectedCount;
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return "ConnectionGroupVO{" +
+            "namespace='" + namespace + '\'' +
+            ", connectionSet=" + connectionSet +
+            ", connectedCount=" + connectedCount +
+            '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/config/ClusterClientConfig.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/config/ClusterClientConfig.java
new file mode 100644
index 0000000..2cd6bb3
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/config/ClusterClientConfig.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain.cluster.config;
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.0
+ */
+public class ClusterClientConfig {
+
+    private String serverHost;
+    private Integer serverPort;
+
+    private Integer requestTimeout;
+    private Integer connectTimeout;
+
+    public String getServerHost() {
+        return serverHost;
+    }
+
+    public ClusterClientConfig setServerHost(String serverHost) {
+        this.serverHost = serverHost;
+        return this;
+    }
+
+    public Integer getServerPort() {
+        return serverPort;
+    }
+
+    public ClusterClientConfig setServerPort(Integer serverPort) {
+        this.serverPort = serverPort;
+        return this;
+    }
+
+    public Integer getRequestTimeout() {
+        return requestTimeout;
+    }
+
+    public ClusterClientConfig setRequestTimeout(Integer requestTimeout) {
+        this.requestTimeout = requestTimeout;
+        return this;
+    }
+
+    public Integer getConnectTimeout() {
+        return connectTimeout;
+    }
+
+    public ClusterClientConfig setConnectTimeout(Integer connectTimeout) {
+        this.connectTimeout = connectTimeout;
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return "ClusterClientConfig{" +
+            "serverHost='" + serverHost + '\'' +
+            ", serverPort=" + serverPort +
+            ", requestTimeout=" + requestTimeout +
+            ", connectTimeout=" + connectTimeout +
+            '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/config/ServerFlowConfig.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/config/ServerFlowConfig.java
new file mode 100644
index 0000000..3390ea1
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/config/ServerFlowConfig.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain.cluster.config;
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.0
+ */
+public class ServerFlowConfig {
+
+    public static final double DEFAULT_EXCEED_COUNT = 1.0d;
+    public static final double DEFAULT_MAX_OCCUPY_RATIO = 1.0d;
+
+    public static final int DEFAULT_INTERVAL_MS = 1000;
+    public static final int DEFAULT_SAMPLE_COUNT= 10;
+    public static final double DEFAULT_MAX_ALLOWED_QPS= 30000;
+
+    private final String namespace;
+
+    private Double exceedCount = DEFAULT_EXCEED_COUNT;
+    private Double maxOccupyRatio = DEFAULT_MAX_OCCUPY_RATIO;
+    private Integer intervalMs = DEFAULT_INTERVAL_MS;
+    private Integer sampleCount = DEFAULT_SAMPLE_COUNT;
+
+    private Double maxAllowedQps = DEFAULT_MAX_ALLOWED_QPS;
+
+    public ServerFlowConfig() {
+        this("default");
+    }
+
+    public ServerFlowConfig(String namespace) {
+        this.namespace = namespace;
+    }
+
+    public String getNamespace() {
+        return namespace;
+    }
+
+    public Double getExceedCount() {
+        return exceedCount;
+    }
+
+    public ServerFlowConfig setExceedCount(Double exceedCount) {
+        this.exceedCount = exceedCount;
+        return this;
+    }
+
+    public Double getMaxOccupyRatio() {
+        return maxOccupyRatio;
+    }
+
+    public ServerFlowConfig setMaxOccupyRatio(Double maxOccupyRatio) {
+        this.maxOccupyRatio = maxOccupyRatio;
+        return this;
+    }
+
+    public Integer getIntervalMs() {
+        return intervalMs;
+    }
+
+    public ServerFlowConfig setIntervalMs(Integer intervalMs) {
+        this.intervalMs = intervalMs;
+        return this;
+    }
+
+    public Integer getSampleCount() {
+        return sampleCount;
+    }
+
+    public ServerFlowConfig setSampleCount(Integer sampleCount) {
+        this.sampleCount = sampleCount;
+        return this;
+    }
+
+    public Double getMaxAllowedQps() {
+        return maxAllowedQps;
+    }
+
+    public ServerFlowConfig setMaxAllowedQps(Double maxAllowedQps) {
+        this.maxAllowedQps = maxAllowedQps;
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return "ServerFlowConfig{" +
+            "namespace='" + namespace + '\'' +
+            ", exceedCount=" + exceedCount +
+            ", maxOccupyRatio=" + maxOccupyRatio +
+            ", intervalMs=" + intervalMs +
+            ", sampleCount=" + sampleCount +
+            ", maxAllowedQps=" + maxAllowedQps +
+            '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/config/ServerTransportConfig.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/config/ServerTransportConfig.java
new file mode 100644
index 0000000..58fe12a
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/config/ServerTransportConfig.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain.cluster.config;
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.0
+ */
+public class ServerTransportConfig {
+
+    public static final int DEFAULT_PORT = 18730;
+    public static final int DEFAULT_IDLE_SECONDS = 600;
+
+    private Integer port;
+    private Integer idleSeconds;
+
+    public ServerTransportConfig() {
+        this(DEFAULT_PORT, DEFAULT_IDLE_SECONDS);
+    }
+
+    public ServerTransportConfig(Integer port, Integer idleSeconds) {
+        this.port = port;
+        this.idleSeconds = idleSeconds;
+    }
+
+    public Integer getPort() {
+        return port;
+    }
+
+    public ServerTransportConfig setPort(Integer port) {
+        this.port = port;
+        return this;
+    }
+
+    public Integer getIdleSeconds() {
+        return idleSeconds;
+    }
+
+    public ServerTransportConfig setIdleSeconds(Integer idleSeconds) {
+        this.idleSeconds = idleSeconds;
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return "ServerTransportConfig{" +
+            "port=" + port +
+            ", idleSeconds=" + idleSeconds +
+            '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/request/ClusterAppAssignMap.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/request/ClusterAppAssignMap.java
new file mode 100644
index 0000000..3dbf96b
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/request/ClusterAppAssignMap.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain.cluster.request;
+
+import java.util.Set;
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.1
+ */
+public class ClusterAppAssignMap {
+
+    private String machineId;
+    private String ip;
+    private Integer port;
+
+    private Boolean belongToApp;
+
+    private Set<String> clientSet;
+
+    private Set<String> namespaceSet;
+    private Double maxAllowedQps;
+
+    public String getMachineId() {
+        return machineId;
+    }
+
+    public ClusterAppAssignMap setMachineId(String machineId) {
+        this.machineId = machineId;
+        return this;
+    }
+
+    public String getIp() {
+        return ip;
+    }
+
+    public ClusterAppAssignMap setIp(String ip) {
+        this.ip = ip;
+        return this;
+    }
+
+    public Integer getPort() {
+        return port;
+    }
+
+    public ClusterAppAssignMap setPort(Integer port) {
+        this.port = port;
+        return this;
+    }
+
+    public Set<String> getClientSet() {
+        return clientSet;
+    }
+
+    public ClusterAppAssignMap setClientSet(Set<String> clientSet) {
+        this.clientSet = clientSet;
+        return this;
+    }
+
+    public Set<String> getNamespaceSet() {
+        return namespaceSet;
+    }
+
+    public ClusterAppAssignMap setNamespaceSet(Set<String> namespaceSet) {
+        this.namespaceSet = namespaceSet;
+        return this;
+    }
+
+    public Boolean getBelongToApp() {
+        return belongToApp;
+    }
+
+    public ClusterAppAssignMap setBelongToApp(Boolean belongToApp) {
+        this.belongToApp = belongToApp;
+        return this;
+    }
+
+    public Double getMaxAllowedQps() {
+        return maxAllowedQps;
+    }
+
+    public ClusterAppAssignMap setMaxAllowedQps(Double maxAllowedQps) {
+        this.maxAllowedQps = maxAllowedQps;
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return "ClusterAppAssignMap{" +
+            "machineId='" + machineId + '\'' +
+            ", ip='" + ip + '\'' +
+            ", port=" + port +
+            ", belongToApp=" + belongToApp +
+            ", clientSet=" + clientSet +
+            ", namespaceSet=" + namespaceSet +
+            ", maxAllowedQps=" + maxAllowedQps +
+            '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/request/ClusterClientModifyRequest.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/request/ClusterClientModifyRequest.java
new file mode 100644
index 0000000..e6ff561
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/request/ClusterClientModifyRequest.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain.cluster.request;
+
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ClusterClientConfig;
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.0
+ */
+public class ClusterClientModifyRequest implements ClusterModifyRequest {
+
+    private String app;
+    private String ip;
+    private Integer port;
+
+    private Integer mode;
+    private ClusterClientConfig clientConfig;
+
+    @Override
+    public String getApp() {
+        return app;
+    }
+
+    public ClusterClientModifyRequest setApp(String app) {
+        this.app = app;
+        return this;
+    }
+
+    @Override
+    public String getIp() {
+        return ip;
+    }
+
+    public ClusterClientModifyRequest setIp(String ip) {
+        this.ip = ip;
+        return this;
+    }
+
+    @Override
+    public Integer getPort() {
+        return port;
+    }
+
+    public ClusterClientModifyRequest setPort(Integer port) {
+        this.port = port;
+        return this;
+    }
+
+    @Override
+    public Integer getMode() {
+        return mode;
+    }
+
+    public ClusterClientModifyRequest setMode(Integer mode) {
+        this.mode = mode;
+        return this;
+    }
+
+    public ClusterClientConfig getClientConfig() {
+        return clientConfig;
+    }
+
+    public ClusterClientModifyRequest setClientConfig(
+        ClusterClientConfig clientConfig) {
+        this.clientConfig = clientConfig;
+        return this;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/request/ClusterModifyRequest.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/request/ClusterModifyRequest.java
new file mode 100644
index 0000000..9f855ef
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/request/ClusterModifyRequest.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain.cluster.request;
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.0
+ */
+public interface ClusterModifyRequest {
+
+    String getApp();
+
+    String getIp();
+
+    Integer getPort();
+
+    Integer getMode();
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/request/ClusterServerModifyRequest.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/request/ClusterServerModifyRequest.java
new file mode 100644
index 0000000..9389f69
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/request/ClusterServerModifyRequest.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain.cluster.request;
+
+import java.util.Set;
+
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ServerFlowConfig;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ServerTransportConfig;
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.0
+ */
+public class ClusterServerModifyRequest implements ClusterModifyRequest {
+
+    private String app;
+    private String ip;
+    private Integer port;
+
+    private Integer mode;
+    private ServerFlowConfig flowConfig;
+    private ServerTransportConfig transportConfig;
+    private Set<String> namespaceSet;
+
+    @Override
+    public String getApp() {
+        return app;
+    }
+
+    public ClusterServerModifyRequest setApp(String app) {
+        this.app = app;
+        return this;
+    }
+
+    @Override
+    public String getIp() {
+        return ip;
+    }
+
+    public ClusterServerModifyRequest setIp(String ip) {
+        this.ip = ip;
+        return this;
+    }
+
+    @Override
+    public Integer getPort() {
+        return port;
+    }
+
+    public ClusterServerModifyRequest setPort(Integer port) {
+        this.port = port;
+        return this;
+    }
+
+    @Override
+    public Integer getMode() {
+        return mode;
+    }
+
+    public ClusterServerModifyRequest setMode(Integer mode) {
+        this.mode = mode;
+        return this;
+    }
+
+    public ServerFlowConfig getFlowConfig() {
+        return flowConfig;
+    }
+
+    public ClusterServerModifyRequest setFlowConfig(
+        ServerFlowConfig flowConfig) {
+        this.flowConfig = flowConfig;
+        return this;
+    }
+
+    public ServerTransportConfig getTransportConfig() {
+        return transportConfig;
+    }
+
+    public ClusterServerModifyRequest setTransportConfig(
+        ServerTransportConfig transportConfig) {
+        this.transportConfig = transportConfig;
+        return this;
+    }
+
+    public Set<String> getNamespaceSet() {
+        return namespaceSet;
+    }
+
+    public ClusterServerModifyRequest setNamespaceSet(Set<String> namespaceSet) {
+        this.namespaceSet = namespaceSet;
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return "ClusterServerModifyRequest{" +
+            "app='" + app + '\'' +
+            ", ip='" + ip + '\'' +
+            ", port=" + port +
+            ", mode=" + mode +
+            ", flowConfig=" + flowConfig +
+            ", transportConfig=" + transportConfig +
+            ", namespaceSet=" + namespaceSet +
+            '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/AppClusterClientStateWrapVO.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/AppClusterClientStateWrapVO.java
new file mode 100644
index 0000000..4076d23
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/AppClusterClientStateWrapVO.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain.cluster.state;
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.1
+ */
+public class AppClusterClientStateWrapVO {
+
+    /**
+     * {ip}@{transport_command_port}.
+     */
+    private String id;
+
+    private Integer commandPort;
+    private String ip;
+
+    private ClusterClientStateVO state;
+
+    public String getId() {
+        return id;
+    }
+
+    public AppClusterClientStateWrapVO setId(String id) {
+        this.id = id;
+        return this;
+    }
+
+    public String getIp() {
+        return ip;
+    }
+
+    public AppClusterClientStateWrapVO setIp(String ip) {
+        this.ip = ip;
+        return this;
+    }
+
+    public ClusterClientStateVO getState() {
+        return state;
+    }
+
+    public AppClusterClientStateWrapVO setState(ClusterClientStateVO state) {
+        this.state = state;
+        return this;
+    }
+
+    public Integer getCommandPort() {
+        return commandPort;
+    }
+
+    public AppClusterClientStateWrapVO setCommandPort(Integer commandPort) {
+        this.commandPort = commandPort;
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return "AppClusterClientStateWrapVO{" +
+            "id='" + id + '\'' +
+            ", commandPort=" + commandPort +
+            ", ip='" + ip + '\'' +
+            ", state=" + state +
+            '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/AppClusterServerStateWrapVO.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/AppClusterServerStateWrapVO.java
new file mode 100644
index 0000000..ed39e7b
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/AppClusterServerStateWrapVO.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain.cluster.state;
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.1
+ */
+public class AppClusterServerStateWrapVO {
+
+    /**
+     * {ip}@{transport_command_port}.
+     */
+    private String id;
+
+    private String ip;
+    private Integer port;
+
+    private Integer connectedCount;
+
+    private Boolean belongToApp;
+
+    private ClusterServerStateVO state;
+
+    public String getId() {
+        return id;
+    }
+
+    public AppClusterServerStateWrapVO setId(String id) {
+        this.id = id;
+        return this;
+    }
+
+    public String getIp() {
+        return ip;
+    }
+
+    public AppClusterServerStateWrapVO setIp(String ip) {
+        this.ip = ip;
+        return this;
+    }
+
+    public Integer getPort() {
+        return port;
+    }
+
+    public AppClusterServerStateWrapVO setPort(Integer port) {
+        this.port = port;
+        return this;
+    }
+
+    public Boolean getBelongToApp() {
+        return belongToApp;
+    }
+
+    public AppClusterServerStateWrapVO setBelongToApp(Boolean belongToApp) {
+        this.belongToApp = belongToApp;
+        return this;
+    }
+
+    public Integer getConnectedCount() {
+        return connectedCount;
+    }
+
+    public AppClusterServerStateWrapVO setConnectedCount(Integer connectedCount) {
+        this.connectedCount = connectedCount;
+        return this;
+    }
+
+    public ClusterServerStateVO getState() {
+        return state;
+    }
+
+    public AppClusterServerStateWrapVO setState(ClusterServerStateVO state) {
+        this.state = state;
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return "AppClusterServerStateWrapVO{" +
+            "id='" + id + '\'' +
+            ", ip='" + ip + '\'' +
+            ", port='" + port + '\'' +
+            ", belongToApp=" + belongToApp +
+            ", state=" + state +
+            '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterClientStateVO.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterClientStateVO.java
new file mode 100644
index 0000000..ac61b0b
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterClientStateVO.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain.cluster.state;
+
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.ClusterClientInfoVO;
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.0
+ */
+public class ClusterClientStateVO {
+
+    /**
+     * Cluster token client state.
+     */
+    private ClusterClientInfoVO clientConfig;
+
+    public ClusterClientInfoVO getClientConfig() {
+        return clientConfig;
+    }
+
+    public ClusterClientStateVO setClientConfig(ClusterClientInfoVO clientConfig) {
+        this.clientConfig = clientConfig;
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return "ClusterClientStateVO{" +
+            "clientConfig=" + clientConfig +
+            '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterRequestLimitVO.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterRequestLimitVO.java
new file mode 100644
index 0000000..6c5da42
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterRequestLimitVO.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain.cluster.state;
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.1
+ */
+public class ClusterRequestLimitVO {
+
+    private String namespace;
+    private Double currentQps;
+    private Double maxAllowedQps;
+
+    public String getNamespace() {
+        return namespace;
+    }
+
+    public ClusterRequestLimitVO setNamespace(String namespace) {
+        this.namespace = namespace;
+        return this;
+    }
+
+    public Double getCurrentQps() {
+        return currentQps;
+    }
+
+    public ClusterRequestLimitVO setCurrentQps(Double currentQps) {
+        this.currentQps = currentQps;
+        return this;
+    }
+
+    public Double getMaxAllowedQps() {
+        return maxAllowedQps;
+    }
+
+    public ClusterRequestLimitVO setMaxAllowedQps(Double maxAllowedQps) {
+        this.maxAllowedQps = maxAllowedQps;
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return "ClusterRequestLimitVO{" +
+            "namespace='" + namespace + '\'' +
+            ", currentQps=" + currentQps +
+            ", maxAllowedQps=" + maxAllowedQps +
+            '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterServerStateVO.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterServerStateVO.java
new file mode 100644
index 0000000..a76a7ff
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterServerStateVO.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain.cluster.state;
+
+import java.util.List;
+import java.util.Set;
+
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.ConnectionGroupVO;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ServerFlowConfig;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ServerTransportConfig;
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.0
+ */
+public class ClusterServerStateVO {
+
+    private String appName;
+
+    private ServerTransportConfig transport;
+    private ServerFlowConfig flow;
+    private Set<String> namespaceSet;
+
+    private Integer port;
+
+    private List<ConnectionGroupVO> connection;
+    private List<ClusterRequestLimitVO> requestLimitData;
+
+    private Boolean embedded;
+
+    public String getAppName() {
+        return appName;
+    }
+
+    public ClusterServerStateVO setAppName(String appName) {
+        this.appName = appName;
+        return this;
+    }
+
+    public ServerTransportConfig getTransport() {
+        return transport;
+    }
+
+    public ClusterServerStateVO setTransport(ServerTransportConfig transport) {
+        this.transport = transport;
+        return this;
+    }
+
+    public ServerFlowConfig getFlow() {
+        return flow;
+    }
+
+    public ClusterServerStateVO setFlow(ServerFlowConfig flow) {
+        this.flow = flow;
+        return this;
+    }
+
+    public Set<String> getNamespaceSet() {
+        return namespaceSet;
+    }
+
+    public ClusterServerStateVO setNamespaceSet(Set<String> namespaceSet) {
+        this.namespaceSet = namespaceSet;
+        return this;
+    }
+
+    public Integer getPort() {
+        return port;
+    }
+
+    public ClusterServerStateVO setPort(Integer port) {
+        this.port = port;
+        return this;
+    }
+
+    public List<ConnectionGroupVO> getConnection() {
+        return connection;
+    }
+
+    public ClusterServerStateVO setConnection(List<ConnectionGroupVO> connection) {
+        this.connection = connection;
+        return this;
+    }
+
+    public List<ClusterRequestLimitVO> getRequestLimitData() {
+        return requestLimitData;
+    }
+
+    public ClusterServerStateVO setRequestLimitData(List<ClusterRequestLimitVO> requestLimitData) {
+        this.requestLimitData = requestLimitData;
+        return this;
+    }
+
+    public Boolean getEmbedded() {
+        return embedded;
+    }
+
+    public ClusterServerStateVO setEmbedded(Boolean embedded) {
+        this.embedded = embedded;
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return "ClusterServerStateVO{" +
+            "appName='" + appName + '\'' +
+            ", transport=" + transport +
+            ", flow=" + flow +
+            ", namespaceSet=" + namespaceSet +
+            ", port=" + port +
+            ", connection=" + connection +
+            ", requestLimitData=" + requestLimitData +
+            ", embedded=" + embedded +
+            '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterStateSimpleEntity.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterStateSimpleEntity.java
new file mode 100644
index 0000000..c5537aa
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterStateSimpleEntity.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain.cluster.state;
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.0
+ */
+public class ClusterStateSimpleEntity {
+
+    private Integer mode;
+    private Long lastModified;
+    private Boolean clientAvailable;
+    private Boolean serverAvailable;
+
+    public Integer getMode() {
+        return mode;
+    }
+
+    public ClusterStateSimpleEntity setMode(Integer mode) {
+        this.mode = mode;
+        return this;
+    }
+
+    public Long getLastModified() {
+        return lastModified;
+    }
+
+    public ClusterStateSimpleEntity setLastModified(Long lastModified) {
+        this.lastModified = lastModified;
+        return this;
+    }
+
+    public Boolean getClientAvailable() {
+        return clientAvailable;
+    }
+
+    public ClusterStateSimpleEntity setClientAvailable(Boolean clientAvailable) {
+        this.clientAvailable = clientAvailable;
+        return this;
+    }
+
+    public Boolean getServerAvailable() {
+        return serverAvailable;
+    }
+
+    public ClusterStateSimpleEntity setServerAvailable(Boolean serverAvailable) {
+        this.serverAvailable = serverAvailable;
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return "ClusterStateSimpleEntity{" +
+            "mode=" + mode +
+            ", lastModified=" + lastModified +
+            ", clientAvailable=" + clientAvailable +
+            ", serverAvailable=" + serverAvailable +
+            '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterUniversalStatePairVO.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterUniversalStatePairVO.java
new file mode 100644
index 0000000..1127656
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterUniversalStatePairVO.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain.cluster.state;
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.1
+ */
+public class ClusterUniversalStatePairVO {
+
+    private String ip;
+    private Integer commandPort;
+
+    private ClusterUniversalStateVO state;
+
+    public ClusterUniversalStatePairVO() {}
+
+    public ClusterUniversalStatePairVO(String ip, Integer commandPort, ClusterUniversalStateVO state) {
+        this.ip = ip;
+        this.commandPort = commandPort;
+        this.state = state;
+    }
+
+    public String getIp() {
+        return ip;
+    }
+
+    public ClusterUniversalStatePairVO setIp(String ip) {
+        this.ip = ip;
+        return this;
+    }
+
+    public Integer getCommandPort() {
+        return commandPort;
+    }
+
+    public ClusterUniversalStatePairVO setCommandPort(Integer commandPort) {
+        this.commandPort = commandPort;
+        return this;
+    }
+
+    public ClusterUniversalStateVO getState() {
+        return state;
+    }
+
+    public ClusterUniversalStatePairVO setState(ClusterUniversalStateVO state) {
+        this.state = state;
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return "ClusterUniversalStatePairVO{" +
+            "ip='" + ip + '\'' +
+            ", commandPort=" + commandPort +
+            ", state=" + state +
+            '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterUniversalStateVO.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterUniversalStateVO.java
new file mode 100644
index 0000000..3e9a787
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterUniversalStateVO.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain.cluster.state;
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.0
+ */
+public class ClusterUniversalStateVO {
+
+    private ClusterStateSimpleEntity stateInfo;
+    private ClusterClientStateVO client;
+    private ClusterServerStateVO server;
+
+    public ClusterClientStateVO getClient() {
+        return client;
+    }
+
+    public ClusterUniversalStateVO setClient(ClusterClientStateVO client) {
+        this.client = client;
+        return this;
+    }
+
+    public ClusterServerStateVO getServer() {
+        return server;
+    }
+
+    public ClusterUniversalStateVO setServer(ClusterServerStateVO server) {
+        this.server = server;
+        return this;
+    }
+
+    public ClusterStateSimpleEntity getStateInfo() {
+        return stateInfo;
+    }
+
+    public ClusterUniversalStateVO setStateInfo(
+        ClusterStateSimpleEntity stateInfo) {
+        this.stateInfo = stateInfo;
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return "ClusterUniversalStateVO{" +
+            "stateInfo=" + stateInfo +
+            ", client=" + client +
+            ", server=" + server +
+            '}';
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/MachineInfoVo.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/MachineInfoVo.java
new file mode 100644
index 0000000..66428c1
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/MachineInfoVo.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain.vo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo;
+
+/**
+ * @author leyou
+ */
+public class MachineInfoVo {
+
+    private String app;
+    private String hostname;
+    private String ip;
+    private int port;
+    private long heartbeatVersion;
+    private long lastHeartbeat;
+    private boolean healthy;
+
+    private String version;
+
+    public static List<MachineInfoVo> fromMachineInfoList(List<MachineInfo> machines) {
+        List<MachineInfoVo> list = new ArrayList<>();
+        for (MachineInfo machine : machines) {
+            list.add(fromMachineInfo(machine));
+        }
+        return list;
+    }
+
+    public static MachineInfoVo fromMachineInfo(MachineInfo machine) {
+        MachineInfoVo vo = new MachineInfoVo();
+        vo.setApp(machine.getApp());
+        vo.setHostname(machine.getHostname());
+        vo.setIp(machine.getIp());
+        vo.setPort(machine.getPort());
+        vo.setLastHeartbeat(machine.getLastHeartbeat());
+        vo.setHeartbeatVersion(machine.getHeartbeatVersion());
+        vo.setVersion(machine.getVersion());
+        vo.setHealthy(machine.isHealthy());
+        return vo;
+    }
+
+    public String getApp() {
+        return app;
+    }
+
+    public void setApp(String app) {
+        this.app = app;
+    }
+
+    public String getHostname() {
+        return hostname;
+    }
+
+    public void setHostname(String hostname) {
+        this.hostname = hostname;
+    }
+
+    public String getIp() {
+        return ip;
+    }
+
+    public void setIp(String ip) {
+        this.ip = ip;
+    }
+
+    public int getPort() {
+        return port;
+    }
+
+    public void setPort(int port) {
+        this.port = port;
+    }
+
+    public long getLastHeartbeat() {
+        return lastHeartbeat;
+    }
+    
+    public void setLastHeartbeat(long lastHeartbeat) {
+        this.lastHeartbeat = lastHeartbeat;
+    }
+    
+    public void setHeartbeatVersion(long heartbeatVersion) {
+        this.heartbeatVersion = heartbeatVersion;
+    }
+    
+    public long getHeartbeatVersion() {
+        return heartbeatVersion;
+    }
+
+    public String getVersion() {
+        return version;
+    }
+
+    public MachineInfoVo setVersion(String version) {
+        this.version = version;
+        return this;
+    }
+
+    public boolean isHealthy() {
+        return healthy;
+    }
+
+    public void setHealthy(boolean healthy) {
+        this.healthy = healthy;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/MetricVo.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/MetricVo.java
new file mode 100644
index 0000000..af64941
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/MetricVo.java
@@ -0,0 +1,208 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain.vo;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.MetricEntity;
+
+/**
+ * @author leyou
+ */
+public class MetricVo implements Comparable<MetricVo> {
+    private Long id;
+    private String app;
+    private Long timestamp;
+    private Long gmtCreate = System.currentTimeMillis();
+    private String resource;
+    private Long passQps;
+    private Long blockQps;
+    private Long successQps;
+    private Long exceptionQps;
+    /**
+     * average rt
+     */
+    private Double rt;
+    private Integer count;
+
+    public MetricVo() {
+    }
+
+    public static List<MetricVo> fromMetricEntities(Collection<MetricEntity> entities) {
+        List<MetricVo> list = new ArrayList<>();
+        if (entities != null) {
+            for (MetricEntity entity : entities) {
+                list.add(fromMetricEntity(entity));
+            }
+        }
+        return list;
+    }
+
+    /**
+     * 淇濈暀璧勬簮鍚嶄负identity鐨勭粨鏋溿��
+     *
+     * @param entities 閫氳繃hashCode鏌ユ壘鍒扮殑MetricEntities
+     * @param identity 鐪熸闇�瑕佹煡鎵剧殑璧勬簮鍚�
+     * @return
+     */
+    public static List<MetricVo> fromMetricEntities(Collection<MetricEntity> entities, String identity) {
+        List<MetricVo> list = new ArrayList<>();
+        if (entities != null) {
+            for (MetricEntity entity : entities) {
+                if (entity.getResource().equals(identity)) {
+                    list.add(fromMetricEntity(entity));
+                }
+            }
+        }
+        return list;
+    }
+
+    public static MetricVo fromMetricEntity(MetricEntity entity) {
+        MetricVo vo = new MetricVo();
+        vo.id = entity.getId();
+        vo.app = entity.getApp();
+        vo.timestamp = entity.getTimestamp().getTime();
+        vo.gmtCreate = entity.getGmtCreate().getTime();
+        vo.resource = entity.getResource();
+        vo.passQps = entity.getPassQps();
+        vo.blockQps = entity.getBlockQps();
+        vo.successQps = entity.getSuccessQps();
+        vo.exceptionQps = entity.getExceptionQps();
+        if (entity.getSuccessQps() != 0) {
+            vo.rt = entity.getRt() / entity.getSuccessQps();
+        } else {
+            vo.rt = 0D;
+        }
+        vo.count = entity.getCount();
+        return vo;
+    }
+
+    public static MetricVo parse(String line) {
+        String[] strs = line.split("\\|");
+        long timestamp = Long.parseLong(strs[0]);
+        String identity = strs[1];
+        long passQps = Long.parseLong(strs[2]);
+        long blockQps = Long.parseLong(strs[3]);
+        long exception = Long.parseLong(strs[4]);
+        double rt = Double.parseDouble(strs[5]);
+        long successQps = Long.parseLong(strs[6]);
+        MetricVo vo = new MetricVo();
+        vo.timestamp = timestamp;
+        vo.resource = identity;
+        vo.passQps = passQps;
+        vo.blockQps = blockQps;
+        vo.successQps = successQps;
+        vo.exceptionQps = exception;
+        vo.rt = rt;
+        vo.count = 1;
+        return vo;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getApp() {
+        return app;
+    }
+
+    public void setApp(String app) {
+        this.app = app;
+    }
+
+    public Long getTimestamp() {
+        return timestamp;
+    }
+
+    public void setTimestamp(Long timestamp) {
+        this.timestamp = timestamp;
+    }
+
+    public Long getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Long gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+
+    public String getResource() {
+        return resource;
+    }
+
+    public void setResource(String resource) {
+        this.resource = resource;
+    }
+
+    public Long getPassQps() {
+        return passQps;
+    }
+
+    public void setPassQps(Long passQps) {
+        this.passQps = passQps;
+    }
+
+    public Long getBlockQps() {
+        return blockQps;
+    }
+
+    public void setBlockQps(Long blockQps) {
+        this.blockQps = blockQps;
+    }
+
+    public Long getSuccessQps() {
+        return successQps;
+    }
+
+    public void setSuccessQps(Long successQps) {
+        this.successQps = successQps;
+    }
+
+    public Long getExceptionQps() {
+        return exceptionQps;
+    }
+
+    public void setExceptionQps(Long exceptionQps) {
+        this.exceptionQps = exceptionQps;
+    }
+
+    public Double getRt() {
+        return rt;
+    }
+
+    public void setRt(Double rt) {
+        this.rt = rt;
+    }
+
+    public Integer getCount() {
+        return count;
+    }
+
+    public void setCount(Integer count) {
+        this.count = count;
+    }
+
+    @Override
+    public int compareTo(MetricVo o) {
+        return Long.compare(this.timestamp, o.timestamp);
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/ResourceVo.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/ResourceVo.java
new file mode 100644
index 0000000..a8ffe24
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/ResourceVo.java
@@ -0,0 +1,236 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain.vo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.alibaba.csp.sentinel.command.vo.NodeVo;
+
+import com.alibaba.csp.sentinel.dashboard.domain.ResourceTreeNode;
+
+/**
+ * @author leyou
+ */
+public class ResourceVo {
+    private String parentTtId;
+    private String ttId;
+    private String resource;
+
+    private Integer threadNum;
+    private Long passQps;
+    private Long blockQps;
+    private Long totalQps;
+    private Long averageRt;
+    private Long passRequestQps;
+    private Long exceptionQps;
+    private Long oneMinutePass;
+    private Long oneMinuteBlock;
+    private Long oneMinuteException;
+    private Long oneMinuteTotal;
+
+    private boolean visible = true;
+
+    public ResourceVo() {
+    }
+
+    public static List<ResourceVo> fromNodeVoList(List<NodeVo> nodeVos) {
+        if (nodeVos == null) {
+            return null;
+        }
+        List<ResourceVo> list = new ArrayList<>();
+        for (NodeVo nodeVo : nodeVos) {
+            ResourceVo vo = new ResourceVo();
+            vo.parentTtId = nodeVo.getParentId();
+            vo.ttId = nodeVo.getId();
+            vo.resource = nodeVo.getResource();
+            vo.threadNum = nodeVo.getThreadNum();
+            vo.passQps = nodeVo.getPassQps();
+            vo.blockQps = nodeVo.getBlockQps();
+            vo.totalQps = nodeVo.getTotalQps();
+            vo.averageRt = nodeVo.getAverageRt();
+            vo.exceptionQps = nodeVo.getExceptionQps();
+            vo.oneMinutePass = nodeVo.getOneMinutePass();
+            vo.oneMinuteBlock = nodeVo.getOneMinuteBlock();
+            vo.oneMinuteException = nodeVo.getOneMinuteException();
+            vo.oneMinuteTotal = nodeVo.getOneMinuteTotal();
+            list.add(vo);
+        }
+        return list;
+    }
+
+    public static List<ResourceVo> fromResourceTreeNode(ResourceTreeNode root) {
+        if (root == null) {
+            return null;
+        }
+        List<ResourceVo> list = new ArrayList<>();
+        visit(root, list, false, true);
+        //if(!list.isEmpty()){
+        //    list.remove(0);
+        //}
+        return list;
+    }
+
+    /**
+     * This node is visible when this.visible==true or one of this's parents is visible,
+     * root node is always invisible.
+     */
+    private static void visit(ResourceTreeNode node, List<ResourceVo> list, boolean parentVisible, boolean isRoot) {
+        boolean visible = !isRoot && (node.isVisible() || parentVisible);
+        //boolean visible = node.isVisible();
+        if (visible) {
+            ResourceVo vo = new ResourceVo();
+            vo.parentTtId = node.getParentId();
+            vo.ttId = node.getId();
+            vo.resource = node.getResource();
+            vo.threadNum = node.getThreadNum();
+            vo.passQps = node.getPassQps();
+            vo.blockQps = node.getBlockQps();
+            vo.totalQps = node.getTotalQps();
+            vo.averageRt = node.getAverageRt();
+            vo.exceptionQps = node.getExceptionQps();
+            vo.oneMinutePass = node.getOneMinutePass();
+            vo.oneMinuteBlock = node.getOneMinuteBlock();
+            vo.oneMinuteException = node.getOneMinuteException();
+            vo.oneMinuteTotal = node.getOneMinuteTotal();
+            vo.visible = node.isVisible();
+            list.add(vo);
+        }
+        for (ResourceTreeNode c : node.getChildren()) {
+            visit(c, list, visible, false);
+        }
+    }
+
+    public String getParentTtId() {
+        return parentTtId;
+    }
+
+    public void setParentTtId(String parentTtId) {
+        this.parentTtId = parentTtId;
+    }
+
+    public String getTtId() {
+        return ttId;
+    }
+
+    public void setTtId(String ttId) {
+        this.ttId = ttId;
+    }
+
+    public String getResource() {
+        return resource;
+    }
+
+    public void setResource(String resource) {
+        this.resource = resource;
+    }
+
+    public Integer getThreadNum() {
+        return threadNum;
+    }
+
+    public void setThreadNum(Integer threadNum) {
+        this.threadNum = threadNum;
+    }
+
+    public Long getPassQps() {
+        return passQps;
+    }
+
+    public void setPassQps(Long passQps) {
+        this.passQps = passQps;
+    }
+
+    public Long getBlockQps() {
+        return blockQps;
+    }
+
+    public void setBlockQps(Long blockQps) {
+        this.blockQps = blockQps;
+    }
+
+    public Long getTotalQps() {
+        return totalQps;
+    }
+
+    public void setTotalQps(Long totalQps) {
+        this.totalQps = totalQps;
+    }
+
+    public Long getAverageRt() {
+        return averageRt;
+    }
+
+    public void setAverageRt(Long averageRt) {
+        this.averageRt = averageRt;
+    }
+
+    public Long getPassRequestQps() {
+        return passRequestQps;
+    }
+
+    public void setPassRequestQps(Long passRequestQps) {
+        this.passRequestQps = passRequestQps;
+    }
+
+    public Long getExceptionQps() {
+        return exceptionQps;
+    }
+
+    public void setExceptionQps(Long exceptionQps) {
+        this.exceptionQps = exceptionQps;
+    }
+
+    public Long getOneMinuteException() {
+        return oneMinuteException;
+    }
+
+    public void setOneMinuteException(Long oneMinuteException) {
+        this.oneMinuteException = oneMinuteException;
+    }
+
+    public Long getOneMinutePass() {
+        return oneMinutePass;
+    }
+
+    public void setOneMinutePass(Long oneMinutePass) {
+        this.oneMinutePass = oneMinutePass;
+    }
+
+    public Long getOneMinuteBlock() {
+        return oneMinuteBlock;
+    }
+
+    public void setOneMinuteBlock(Long oneMinuteBlock) {
+        this.oneMinuteBlock = oneMinuteBlock;
+    }
+
+    public Long getOneMinuteTotal() {
+        return oneMinuteTotal;
+    }
+
+    public void setOneMinuteTotal(Long oneMinuteTotal) {
+        this.oneMinuteTotal = oneMinuteTotal;
+    }
+
+    public boolean isVisible() {
+        return visible;
+    }
+
+    public void setVisible(boolean visible) {
+        this.visible = visible;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/api/AddApiReqVo.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/api/AddApiReqVo.java
new file mode 100644
index 0000000..445f445
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/api/AddApiReqVo.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.api;
+
+import java.util.List;
+
+/**
+ * Value Object for add gateway api.
+ *
+ * @author cdfive
+ * @since 1.7.0
+ */
+public class AddApiReqVo {
+
+    private String app;
+
+    private String ip;
+
+    private Integer port;
+
+    private String apiName;
+
+    private List<ApiPredicateItemVo> predicateItems;
+
+    public String getApp() {
+        return app;
+    }
+
+    public void setApp(String app) {
+        this.app = app;
+    }
+
+    public String getIp() {
+        return ip;
+    }
+
+    public void setIp(String ip) {
+        this.ip = ip;
+    }
+
+    public Integer getPort() {
+        return port;
+    }
+
+    public void setPort(Integer port) {
+        this.port = port;
+    }
+
+    public String getApiName() {
+        return apiName;
+    }
+
+    public void setApiName(String apiName) {
+        this.apiName = apiName;
+    }
+
+    public List<ApiPredicateItemVo> getPredicateItems() {
+        return predicateItems;
+    }
+
+    public void setPredicateItems(List<ApiPredicateItemVo> predicateItems) {
+        this.predicateItems = predicateItems;
+    }
+}
+
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/api/ApiPredicateItemVo.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/api/ApiPredicateItemVo.java
new file mode 100644
index 0000000..3fd8788
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/api/ApiPredicateItemVo.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.api;
+
+/**
+ * Value Object for add or update gateway api.
+ *
+ * @author cdfive
+ * @since 1.7.0
+ */
+public class ApiPredicateItemVo {
+
+    /**
+     * The pattern for matching url.
+     */
+    private String pattern;
+
+    /**
+     * The matching Strategy in url. Constants are defined in class SentinelGatewayConstants.\
+     *
+     * <ul>
+     *     <li>0(URL_MATCH_STRATEGY_EXACT): exact match mode</li>
+     *     <li>1(URL_MATCH_STRATEGY_PREFIX): prefix match mode</li>
+     *     <li>2(URL_MATCH_STRATEGY_REGEX): regex match mode</li>
+     * </ul>
+     */
+    private Integer matchStrategy;
+
+    public String getPattern() {
+        return pattern;
+    }
+
+    public void setPattern(String pattern) {
+        this.pattern = pattern;
+    }
+
+    public Integer getMatchStrategy() {
+        return matchStrategy;
+    }
+
+    public void setMatchStrategy(Integer matchStrategy) {
+        this.matchStrategy = matchStrategy;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/api/UpdateApiReqVo.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/api/UpdateApiReqVo.java
new file mode 100644
index 0000000..3dfd96a
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/api/UpdateApiReqVo.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.api;
+
+import java.util.List;
+
+/**
+ * Value Object for update gateway api.
+ *
+ * @author cdfive
+ * @since 1.7.0
+ */
+public class UpdateApiReqVo {
+
+    private Long id;
+
+    private String app;
+
+    private List<ApiPredicateItemVo> predicateItems;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getApp() {
+        return app;
+    }
+
+    public void setApp(String app) {
+        this.app = app;
+    }
+
+    public List<ApiPredicateItemVo> getPredicateItems() {
+        return predicateItems;
+    }
+
+    public void setPredicateItems(List<ApiPredicateItemVo> predicateItems) {
+        this.predicateItems = predicateItems;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/rule/AddFlowRuleReqVo.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/rule/AddFlowRuleReqVo.java
new file mode 100644
index 0000000..57cc9e2
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/rule/AddFlowRuleReqVo.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.rule;
+
+/**
+ * Value Object for add gateway flow rule.
+ *
+ * @author cdfive
+ * @since 1.7.0
+ */
+public class AddFlowRuleReqVo {
+
+    private String app;
+
+    private String ip;
+
+    private Integer port;
+
+    private String resource;
+
+    private Integer resourceMode;
+
+    private Integer grade;
+
+    private Double count;
+
+    private Long interval;
+
+    private Integer intervalUnit;
+
+    private Integer controlBehavior;
+
+    private Integer burst;
+
+    private Integer maxQueueingTimeoutMs;
+
+    private GatewayParamFlowItemVo paramItem;
+
+    public String getApp() {
+        return app;
+    }
+
+    public void setApp(String app) {
+        this.app = app;
+    }
+
+    public String getIp() {
+        return ip;
+    }
+
+    public void setIp(String ip) {
+        this.ip = ip;
+    }
+
+    public Integer getPort() {
+        return port;
+    }
+
+    public void setPort(Integer port) {
+        this.port = port;
+    }
+
+    public String getResource() {
+        return resource;
+    }
+
+    public void setResource(String resource) {
+        this.resource = resource;
+    }
+
+    public Integer getResourceMode() {
+        return resourceMode;
+    }
+
+    public void setResourceMode(Integer resourceMode) {
+        this.resourceMode = resourceMode;
+    }
+
+    public Integer getGrade() {
+        return grade;
+    }
+
+    public void setGrade(Integer grade) {
+        this.grade = grade;
+    }
+
+    public Double getCount() {
+        return count;
+    }
+
+    public void setCount(Double count) {
+        this.count = count;
+    }
+
+    public Long getInterval() {
+        return interval;
+    }
+
+    public void setInterval(Long interval) {
+        this.interval = interval;
+    }
+
+    public Integer getIntervalUnit() {
+        return intervalUnit;
+    }
+
+    public void setIntervalUnit(Integer intervalUnit) {
+        this.intervalUnit = intervalUnit;
+    }
+
+    public Integer getControlBehavior() {
+        return controlBehavior;
+    }
+
+    public void setControlBehavior(Integer controlBehavior) {
+        this.controlBehavior = controlBehavior;
+    }
+
+    public Integer getBurst() {
+        return burst;
+    }
+
+    public void setBurst(Integer burst) {
+        this.burst = burst;
+    }
+
+    public Integer getMaxQueueingTimeoutMs() {
+        return maxQueueingTimeoutMs;
+    }
+
+    public void setMaxQueueingTimeoutMs(Integer maxQueueingTimeoutMs) {
+        this.maxQueueingTimeoutMs = maxQueueingTimeoutMs;
+    }
+
+    public GatewayParamFlowItemVo getParamItem() {
+        return paramItem;
+    }
+
+    public void setParamItem(GatewayParamFlowItemVo paramItem) {
+        this.paramItem = paramItem;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/rule/GatewayParamFlowItemVo.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/rule/GatewayParamFlowItemVo.java
new file mode 100644
index 0000000..af24fed
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/rule/GatewayParamFlowItemVo.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.rule;
+
+/**
+ * Value Object for add or update gateway flow rule.
+ *
+ * @author cdfive
+ * @since 1.7.0
+ */
+public class GatewayParamFlowItemVo {
+
+    private Integer parseStrategy;
+
+    private String fieldName;
+
+    private String pattern;
+
+    private Integer matchStrategy;
+
+    public Integer getParseStrategy() {
+        return parseStrategy;
+    }
+
+    public void setParseStrategy(Integer parseStrategy) {
+        this.parseStrategy = parseStrategy;
+    }
+
+    public String getFieldName() {
+        return fieldName;
+    }
+
+    public void setFieldName(String fieldName) {
+        this.fieldName = fieldName;
+    }
+
+    public String getPattern() {
+        return pattern;
+    }
+
+    public void setPattern(String pattern) {
+        this.pattern = pattern;
+    }
+
+    public Integer getMatchStrategy() {
+        return matchStrategy;
+    }
+
+    public void setMatchStrategy(Integer matchStrategy) {
+        this.matchStrategy = matchStrategy;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/rule/UpdateFlowRuleReqVo.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/rule/UpdateFlowRuleReqVo.java
new file mode 100644
index 0000000..8d1988f
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/rule/UpdateFlowRuleReqVo.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.rule;
+
+/**
+ * Value Object for update gateway flow rule.
+ *
+ * @author cdfive
+ * @since 1.7.0
+ */
+public class UpdateFlowRuleReqVo {
+
+    private Long id;
+
+    private String app;
+
+    private Integer grade;
+
+    private Double count;
+
+    private Long interval;
+
+    private Integer intervalUnit;
+
+    private Integer controlBehavior;
+
+    private Integer burst;
+
+    private Integer maxQueueingTimeoutMs;
+
+    private GatewayParamFlowItemVo paramItem;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getApp() {
+        return app;
+    }
+
+    public void setApp(String app) {
+        this.app = app;
+    }
+
+    public Integer getGrade() {
+        return grade;
+    }
+
+    public void setGrade(Integer grade) {
+        this.grade = grade;
+    }
+
+    public Double getCount() {
+        return count;
+    }
+
+    public void setCount(Double count) {
+        this.count = count;
+    }
+
+    public Long getInterval() {
+        return interval;
+    }
+
+    public void setInterval(Long interval) {
+        this.interval = interval;
+    }
+
+    public Integer getIntervalUnit() {
+        return intervalUnit;
+    }
+
+    public void setIntervalUnit(Integer intervalUnit) {
+        this.intervalUnit = intervalUnit;
+    }
+
+    public Integer getControlBehavior() {
+        return controlBehavior;
+    }
+
+    public void setControlBehavior(Integer controlBehavior) {
+        this.controlBehavior = controlBehavior;
+    }
+
+    public Integer getBurst() {
+        return burst;
+    }
+
+    public void setBurst(Integer burst) {
+        this.burst = burst;
+    }
+
+    public Integer getMaxQueueingTimeoutMs() {
+        return maxQueueingTimeoutMs;
+    }
+
+    public void setMaxQueueingTimeoutMs(Integer maxQueueingTimeoutMs) {
+        this.maxQueueingTimeoutMs = maxQueueingTimeoutMs;
+    }
+
+    public GatewayParamFlowItemVo getParamItem() {
+        return paramItem;
+    }
+
+    public void setParamItem(GatewayParamFlowItemVo paramItem) {
+        this.paramItem = paramItem;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/metric/MetricFetcher.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/metric/MetricFetcher.java
new file mode 100644
index 0000000..13bd4db
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/metric/MetricFetcher.java
@@ -0,0 +1,375 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.metric;
+
+import java.net.ConnectException;
+import java.net.SocketTimeoutException;
+import java.nio.charset.Charset;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.RejectedExecutionHandler;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.ThreadPoolExecutor.DiscardPolicy;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
+
+import com.alibaba.csp.sentinel.Constants;
+import com.alibaba.csp.sentinel.concurrent.NamedThreadFactory;
+import com.alibaba.csp.sentinel.config.SentinelConfig;
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.MetricEntity;
+import com.alibaba.csp.sentinel.dashboard.discovery.AppInfo;
+import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement;
+import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo;
+import com.alibaba.csp.sentinel.node.metric.MetricNode;
+import com.alibaba.csp.sentinel.util.StringUtil;
+
+import com.alibaba.csp.sentinel.dashboard.repository.metric.MetricsRepository;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.concurrent.FutureCallback;
+import org.apache.http.entity.ContentType;
+import org.apache.http.impl.client.DefaultRedirectStrategy;
+import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
+import org.apache.http.impl.nio.client.HttpAsyncClients;
+import org.apache.http.impl.nio.reactor.IOReactorConfig;
+import org.apache.http.protocol.HTTP;
+import org.apache.http.util.EntityUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * Fetch metric of machines.
+ *
+ * @author leyou
+ */
+@Component
+public class MetricFetcher {
+
+    public static final String NO_METRICS = "No metrics";
+    private static final int HTTP_OK = 200;
+    private static final long MAX_LAST_FETCH_INTERVAL_MS = 1000 * 15;
+    private static final long FETCH_INTERVAL_SECOND = 6;
+    private static final Charset DEFAULT_CHARSET = Charset.forName(SentinelConfig.charset());
+    private final static String METRIC_URL_PATH = "metric";
+    private static Logger logger = LoggerFactory.getLogger(MetricFetcher.class);
+    private final long intervalSecond = 1;
+
+    private Map<String, AtomicLong> appLastFetchTime = new ConcurrentHashMap<>();
+
+    @Autowired
+    private MetricsRepository<MetricEntity> metricStore;
+    @Autowired
+    private AppManagement appManagement;
+
+    private CloseableHttpAsyncClient httpclient;
+
+    @SuppressWarnings("PMD.ThreadPoolCreationRule")
+    private ScheduledExecutorService fetchScheduleService = Executors.newScheduledThreadPool(1,
+        new NamedThreadFactory("sentinel-dashboard-metrics-fetch-task", true));
+    private ExecutorService fetchService;
+    private ExecutorService fetchWorker;
+
+    public MetricFetcher() {
+        int cores = Runtime.getRuntime().availableProcessors() * 2;
+        long keepAliveTime = 0;
+        int queueSize = 2048;
+        RejectedExecutionHandler handler = new DiscardPolicy();
+        fetchService = new ThreadPoolExecutor(cores, cores,
+            keepAliveTime, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(queueSize),
+            new NamedThreadFactory("sentinel-dashboard-metrics-fetchService", true), handler);
+        fetchWorker = new ThreadPoolExecutor(cores, cores,
+            keepAliveTime, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(queueSize),
+            new NamedThreadFactory("sentinel-dashboard-metrics-fetchWorker",true), handler);
+        IOReactorConfig ioConfig = IOReactorConfig.custom()
+            .setConnectTimeout(3000)
+            .setSoTimeout(3000)
+            .setIoThreadCount(Runtime.getRuntime().availableProcessors() * 2)
+            .build();
+
+        httpclient = HttpAsyncClients.custom()
+            .setRedirectStrategy(new DefaultRedirectStrategy() {
+                @Override
+                protected boolean isRedirectable(final String method) {
+                    return false;
+                }
+            }).setMaxConnTotal(4000)
+            .setMaxConnPerRoute(1000)
+            .setDefaultIOReactorConfig(ioConfig)
+            .build();
+        httpclient.start();
+        start();
+    }
+
+    private void start() {
+        fetchScheduleService.scheduleAtFixedRate(() -> {
+            try {
+                fetchAllApp();
+            } catch (Exception e) {
+                logger.info("fetchAllApp error:", e);
+            }
+        }, 10, intervalSecond, TimeUnit.SECONDS);
+    }
+
+    private void writeMetric(Map<String, MetricEntity> map) {
+        if (map.isEmpty()) {
+            return;
+        }
+        Date date = new Date();
+        for (MetricEntity entity : map.values()) {
+            entity.setGmtCreate(date);
+            entity.setGmtModified(date);
+        }
+        metricStore.saveAll(map.values());
+    }
+
+    /**
+     * Traverse each APP, and then pull the metric of all machines for that APP.
+     */
+    private void fetchAllApp() {
+        List<String> apps = appManagement.getAppNames();
+        if (apps == null) {
+            return;
+        }
+        for (final String app : apps) {
+            fetchService.submit(() -> {
+                try {
+                    doFetchAppMetric(app);
+                } catch (Exception e) {
+                    logger.error("fetchAppMetric error", e);
+                }
+            });
+        }
+    }
+
+    /**
+     * fetch metric between [startTime, endTime], both side inclusive
+     */
+    private void fetchOnce(String app, long startTime, long endTime, int maxWaitSeconds) {
+        if (maxWaitSeconds <= 0) {
+            throw new IllegalArgumentException("maxWaitSeconds must > 0, but " + maxWaitSeconds);
+        }
+        AppInfo appInfo = appManagement.getDetailApp(app);
+        // auto remove for app
+        if (appInfo.isDead()) {
+            logger.info("Dead app removed: {}", app);
+            appManagement.removeApp(app);
+            return;
+        }
+        Set<MachineInfo> machines = appInfo.getMachines();
+        logger.debug("enter fetchOnce(" + app + "), machines.size()=" + machines.size()
+            + ", time intervalMs [" + startTime + ", " + endTime + "]");
+        if (machines.isEmpty()) {
+            return;
+        }
+        final String msg = "fetch";
+        AtomicLong unhealthy = new AtomicLong();
+        final AtomicLong success = new AtomicLong();
+        final AtomicLong fail = new AtomicLong();
+
+        long start = System.currentTimeMillis();
+        /** app_resource_timeSecond -> metric */
+        final Map<String, MetricEntity> metricMap = new ConcurrentHashMap<>(16);
+        final CountDownLatch latch = new CountDownLatch(machines.size());
+        for (final MachineInfo machine : machines) {
+            // auto remove
+            if (machine.isDead()) {
+                latch.countDown();
+                appManagement.getDetailApp(app).removeMachine(machine.getIp(), machine.getPort());
+                logger.info("Dead machine removed: {}:{} of {}", machine.getIp(), machine.getPort(), app);
+                continue;
+            }
+            if (!machine.isHealthy()) {
+                latch.countDown();
+                unhealthy.incrementAndGet();
+                continue;
+            }
+            final String url = "http://" + machine.getIp() + ":" + machine.getPort() + "/" + METRIC_URL_PATH
+                + "?startTime=" + startTime + "&endTime=" + endTime + "&refetch=" + false;
+            final HttpGet httpGet = new HttpGet(url);
+            httpGet.setHeader(HTTP.CONN_DIRECTIVE, HTTP.CONN_CLOSE);
+            httpclient.execute(httpGet, new FutureCallback<HttpResponse>() {
+                @Override
+                public void completed(final HttpResponse response) {
+                    try {
+                        handleResponse(response, machine, metricMap);
+                        success.incrementAndGet();
+                    } catch (Exception e) {
+                        logger.error(msg + " metric " + url + " error:", e);
+                    } finally {
+                        latch.countDown();
+                    }
+                }
+
+                @Override
+                public void failed(final Exception ex) {
+                    latch.countDown();
+                    fail.incrementAndGet();
+                    httpGet.abort();
+                    if (ex instanceof SocketTimeoutException) {
+                        logger.error("Failed to fetch metric from <{}>: socket timeout", url);
+                    } else if (ex instanceof ConnectException) {
+                        logger.error("Failed to fetch metric from <{}> (ConnectionException: {})", url, ex.getMessage());
+                    } else {
+                        logger.error(msg + " metric " + url + " error", ex);
+                    }
+                }
+
+                @Override
+                public void cancelled() {
+                    latch.countDown();
+                    fail.incrementAndGet();
+                    httpGet.abort();
+                }
+            });
+        }
+        try {
+            latch.await(maxWaitSeconds, TimeUnit.SECONDS);
+        } catch (Exception e) {
+            logger.info(msg + " metric, wait http client error:", e);
+        }
+        //long cost = System.currentTimeMillis() - start;
+        //logger.info("finished " + msg + " metric for " + app + ", time intervalMs [" + startTime + ", " + endTime
+        //    + "], total machines=" + machines.size() + ", dead=" + dead + ", fetch success="
+        //    + success + ", fetch fail=" + fail + ", time cost=" + cost + " ms");
+        writeMetric(metricMap);
+    }
+
+    private void doFetchAppMetric(final String app) {
+        long now = System.currentTimeMillis();
+        long lastFetchMs = now - MAX_LAST_FETCH_INTERVAL_MS;
+        if (appLastFetchTime.containsKey(app)) {
+            lastFetchMs = Math.max(lastFetchMs, appLastFetchTime.get(app).get() + 1000);
+        }
+        // trim milliseconds
+        lastFetchMs = lastFetchMs / 1000 * 1000;
+        long endTime = lastFetchMs + FETCH_INTERVAL_SECOND * 1000;
+        if (endTime > now - 1000 * 2) {
+            // too near
+            return;
+        }
+        // update last_fetch in advance.
+        appLastFetchTime.computeIfAbsent(app, a -> new AtomicLong()).set(endTime);
+        final long finalLastFetchMs = lastFetchMs;
+        final long finalEndTime = endTime;
+        try {
+            // do real fetch async
+            fetchWorker.submit(() -> {
+                try {
+                    fetchOnce(app, finalLastFetchMs, finalEndTime, 5);
+                } catch (Exception e) {
+                    logger.info("fetchOnce(" + app + ") error", e);
+                }
+            });
+        } catch (Exception e) {
+            logger.info("submit fetchOnce(" + app + ") fail, intervalMs [" + lastFetchMs + ", " + endTime + "]", e);
+        }
+    }
+
+    private void handleResponse(final HttpResponse response, MachineInfo machine,
+                                Map<String, MetricEntity> metricMap) throws Exception {
+        int code = response.getStatusLine().getStatusCode();
+        if (code != HTTP_OK) {
+            return;
+        }
+        Charset charset = null;
+        try {
+            String contentTypeStr = response.getFirstHeader("Content-type").getValue();
+            if (StringUtil.isNotEmpty(contentTypeStr)) {
+                ContentType contentType = ContentType.parse(contentTypeStr);
+                charset = contentType.getCharset();
+            }
+        } catch (Exception ignore) {
+        }
+        String body = EntityUtils.toString(response.getEntity(), charset != null ? charset : DEFAULT_CHARSET);
+        if (StringUtil.isEmpty(body) || body.startsWith(NO_METRICS)) {
+            //logger.info(machine.getApp() + ":" + machine.getIp() + ":" + machine.getPort() + ", bodyStr is empty");
+            return;
+        }
+        String[] lines = body.split("\n");
+        //logger.info(machine.getApp() + ":" + machine.getIp() + ":" + machine.getPort() +
+        //    ", bodyStr.length()=" + body.length() + ", lines=" + lines.length);
+        handleBody(lines, machine, metricMap);
+    }
+
+    private void handleBody(String[] lines, MachineInfo machine, Map<String, MetricEntity> map) {
+        //logger.info("handleBody() lines=" + lines.length + ", machine=" + machine);
+        if (lines.length < 1) {
+            return;
+        }
+
+        for (String line : lines) {
+            try {
+                MetricNode node = MetricNode.fromThinString(line);
+                if (shouldFilterOut(node.getResource())) {
+                    continue;
+                }
+                /*
+                 * aggregation metrics by app_resource_timeSecond, ignore ip and port.
+                 */
+                String key = buildMetricKey(machine.getApp(), node.getResource(), node.getTimestamp());
+
+                MetricEntity metricEntity = map.computeIfAbsent(key, s -> {
+                    MetricEntity initMetricEntity = new MetricEntity();
+                    initMetricEntity.setApp(machine.getApp());
+                    initMetricEntity.setTimestamp(new Date(node.getTimestamp()));
+                    initMetricEntity.setPassQps(0L);
+                    initMetricEntity.setBlockQps(0L);
+                    initMetricEntity.setRtAndSuccessQps(0, 0L);
+                    initMetricEntity.setExceptionQps(0L);
+                    initMetricEntity.setCount(0);
+                    initMetricEntity.setResource(node.getResource());
+                    return initMetricEntity;
+                });
+                metricEntity.addPassQps(node.getPassQps());
+                metricEntity.addBlockQps(node.getBlockQps());
+                metricEntity.addRtAndSuccessQps(node.getRt(), node.getSuccessQps());
+                metricEntity.addExceptionQps(node.getExceptionQps());
+                metricEntity.addCount(1);
+            } catch (Exception e) {
+                logger.warn("handleBody line exception, machine: {}, line: {}", machine.toLogString(), line);
+            }
+        }
+    }
+
+    private String buildMetricKey(String app, String resource, long timestamp) {
+        return app + "__" + resource + "__" + (timestamp / 1000);
+    }
+
+    private boolean shouldFilterOut(String resource) {
+        return RES_EXCLUSION_SET.contains(resource);
+    }
+
+    private static final Set<String> RES_EXCLUSION_SET = new HashSet<String>() {{
+       add(Constants.TOTAL_IN_RESOURCE_NAME);
+       add(Constants.SYSTEM_LOAD_RESOURCE_NAME);
+       add(Constants.CPU_USAGE_RESOURCE_NAME);
+    }};
+
+}
+
+
+
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/gateway/InMemApiDefinitionStore.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/gateway/InMemApiDefinitionStore.java
new file mode 100644
index 0000000..844acbd
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/gateway/InMemApiDefinitionStore.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.repository.gateway;
+
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.ApiDefinitionEntity;
+import com.alibaba.csp.sentinel.dashboard.repository.rule.InMemoryRuleRepositoryAdapter;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * Store {@link ApiDefinitionEntity} in memory.
+ *
+ * @author cdfive
+ * @since 1.7.0
+ */
+@Component
+public class InMemApiDefinitionStore extends InMemoryRuleRepositoryAdapter<ApiDefinitionEntity> {
+
+    private static AtomicLong ids = new AtomicLong(0);
+
+    @Override
+    protected long nextId() {
+        return ids.incrementAndGet();
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/gateway/InMemGatewayFlowRuleStore.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/gateway/InMemGatewayFlowRuleStore.java
new file mode 100644
index 0000000..f1b63c4
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/gateway/InMemGatewayFlowRuleStore.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.repository.gateway;
+
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.GatewayFlowRuleEntity;
+import com.alibaba.csp.sentinel.dashboard.repository.rule.InMemoryRuleRepositoryAdapter;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * Store {@link GatewayFlowRuleEntity} in memory.
+ *
+ * @author cdfive
+ * @since 1.7.0
+ */
+@Component
+public class InMemGatewayFlowRuleStore extends InMemoryRuleRepositoryAdapter<GatewayFlowRuleEntity> {
+
+    private static AtomicLong ids = new AtomicLong(0);
+
+    @Override
+    protected long nextId() {
+        return ids.incrementAndGet();
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/metric/InMemoryMetricsRepository.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/metric/InMemoryMetricsRepository.java
new file mode 100644
index 0000000..4afeb0c
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/metric/InMemoryMetricsRepository.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.repository.metric;
+
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.MetricEntity;
+import com.alibaba.csp.sentinel.util.StringUtil;
+import com.alibaba.csp.sentinel.util.TimeUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+import java.util.stream.Collectors;
+
+/**
+ * Caches metrics data in a period of time in memory.
+ *
+ * @author Carpenter Lee
+ * @author Eric Zhao
+ */
+@Component
+public class InMemoryMetricsRepository implements MetricsRepository<MetricEntity> {
+
+    private static final long MAX_METRIC_LIVE_TIME_MS = 1000 * 60 * 5;
+
+    /**
+     * {@code app -> resource -> timestamp -> metric}
+     */
+    private Map<String, Map<String, LinkedHashMap<Long, MetricEntity>>> allMetrics = new ConcurrentHashMap<>();
+
+    private final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
+
+
+    @Override
+    public void save(MetricEntity entity) {
+        if (entity == null || StringUtil.isBlank(entity.getApp())) {
+            return;
+        }
+        readWriteLock.writeLock().lock();
+        try {
+            allMetrics.computeIfAbsent(entity.getApp(), e -> new HashMap<>(16))
+                    .computeIfAbsent(entity.getResource(), e -> new LinkedHashMap<Long, MetricEntity>() {
+                        @Override
+                        protected boolean removeEldestEntry(Entry<Long, MetricEntity> eldest) {
+                            // Metric older than {@link #MAX_METRIC_LIVE_TIME_MS} will be removed.
+                            return eldest.getKey() < TimeUtil.currentTimeMillis() - MAX_METRIC_LIVE_TIME_MS;
+                        }
+                    }).put(entity.getTimestamp().getTime(), entity);
+        } finally {
+            readWriteLock.writeLock().unlock();
+        }
+
+    }
+
+    @Override
+    public void saveAll(Iterable<MetricEntity> metrics) {
+        if (metrics == null) {
+            return;
+        }
+        readWriteLock.writeLock().lock();
+        try {
+            metrics.forEach(this::save);
+        } finally {
+            readWriteLock.writeLock().unlock();
+        }
+    }
+
+    @Override
+    public List<MetricEntity> queryByAppAndResourceBetween(String app, String resource,
+                                                           long startTime, long endTime) {
+        List<MetricEntity> results = new ArrayList<>();
+        if (StringUtil.isBlank(app)) {
+            return results;
+        }
+        Map<String, LinkedHashMap<Long, MetricEntity>> resourceMap = allMetrics.get(app);
+        if (resourceMap == null) {
+            return results;
+        }
+        LinkedHashMap<Long, MetricEntity> metricsMap = resourceMap.get(resource);
+        if (metricsMap == null) {
+            return results;
+        }
+        readWriteLock.readLock().lock();
+        try {
+            for (Entry<Long, MetricEntity> entry : metricsMap.entrySet()) {
+                if (entry.getKey() >= startTime && entry.getKey() <= endTime) {
+                    results.add(entry.getValue());
+                }
+            }
+            return results;
+        } finally {
+            readWriteLock.readLock().unlock();
+        }
+    }
+
+    @Override
+    public List<String> listResourcesOfApp(String app) {
+        List<String> results = new ArrayList<>();
+        if (StringUtil.isBlank(app)) {
+            return results;
+        }
+        // resource -> timestamp -> metric
+        Map<String, LinkedHashMap<Long, MetricEntity>> resourceMap = allMetrics.get(app);
+        if (resourceMap == null) {
+            return results;
+        }
+        final long minTimeMs = System.currentTimeMillis() - 1000 * 60;
+        Map<String, MetricEntity> resourceCount = new ConcurrentHashMap<>(32);
+
+        readWriteLock.readLock().lock();
+        try {
+            for (Entry<String, LinkedHashMap<Long, MetricEntity>> resourceMetrics : resourceMap.entrySet()) {
+                for (Entry<Long, MetricEntity> metrics : resourceMetrics.getValue().entrySet()) {
+                    if (metrics.getKey() < minTimeMs) {
+                        continue;
+                    }
+                    MetricEntity newEntity = metrics.getValue();
+                    if (resourceCount.containsKey(resourceMetrics.getKey())) {
+                        MetricEntity oldEntity = resourceCount.get(resourceMetrics.getKey());
+                        oldEntity.addPassQps(newEntity.getPassQps());
+                        oldEntity.addRtAndSuccessQps(newEntity.getRt(), newEntity.getSuccessQps());
+                        oldEntity.addBlockQps(newEntity.getBlockQps());
+                        oldEntity.addExceptionQps(newEntity.getExceptionQps());
+                        oldEntity.addCount(1);
+                    } else {
+                        resourceCount.put(resourceMetrics.getKey(), MetricEntity.copyOf(newEntity));
+                    }
+                }
+            }
+            // Order by last minute b_qps DESC.
+            return resourceCount.entrySet()
+                    .stream()
+                    .sorted((o1, o2) -> {
+                        MetricEntity e1 = o1.getValue();
+                        MetricEntity e2 = o2.getValue();
+                        int t = e2.getBlockQps().compareTo(e1.getBlockQps());
+                        if (t != 0) {
+                            return t;
+                        }
+                        return e2.getPassQps().compareTo(e1.getPassQps());
+                    })
+                    .map(Entry::getKey)
+                    .collect(Collectors.toList());
+        } finally {
+            readWriteLock.readLock().unlock();
+        }
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/metric/MetricsRepository.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/metric/MetricsRepository.java
new file mode 100644
index 0000000..f54cc20
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/metric/MetricsRepository.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.repository.metric;
+
+import java.util.List;
+
+/**
+ * Repository interface for aggregated metrics data.
+ *
+ * @param <T> type of metrics
+ * @author Eric Zhao
+ */
+public interface MetricsRepository<T> {
+
+    /**
+     * Save the metric to the storage repository.
+     *
+     * @param metric metric data to save
+     */
+    void save(T metric);
+
+    /**
+     * Save all metrics to the storage repository.
+     *
+     * @param metrics metrics to save
+     */
+    void saveAll(Iterable<T> metrics);
+
+    /**
+     * Get all metrics by {@code appName} and {@code resourceName} between a period of time.
+     *
+     * @param app       application name for Sentinel
+     * @param resource  resource name
+     * @param startTime start timestamp
+     * @param endTime   end timestamp
+     * @return all metrics in query conditions
+     */
+    List<T> queryByAppAndResourceBetween(String app, String resource, long startTime, long endTime);
+
+    /**
+     * List resource name of provided application name.
+     *
+     * @param app application name
+     * @return list of resources
+     */
+    List<String> listResourcesOfApp(String app);
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemAuthorityRuleStore.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemAuthorityRuleStore.java
new file mode 100644
index 0000000..bbeb888
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemAuthorityRuleStore.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.repository.rule;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.AuthorityRuleEntity;
+
+import org.springframework.stereotype.Component;
+
+/**
+ * In-memory storage for authority rules.
+ *
+ * @author Eric Zhao
+ * @since 0.2.1
+ */
+@Component
+public class InMemAuthorityRuleStore extends InMemoryRuleRepositoryAdapter<AuthorityRuleEntity> {
+
+    private static AtomicLong ids = new AtomicLong(0);
+
+    @Override
+    protected long nextId() {
+        return ids.incrementAndGet();
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemDegradeRuleStore.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemDegradeRuleStore.java
new file mode 100644
index 0000000..0b9bf7e
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemDegradeRuleStore.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.repository.rule;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.DegradeRuleEntity;
+
+import org.springframework.stereotype.Component;
+
+/**
+ * @author leyou
+ */
+@Component
+public class InMemDegradeRuleStore extends InMemoryRuleRepositoryAdapter<DegradeRuleEntity> {
+
+    private static AtomicLong ids = new AtomicLong(0);
+
+    @Override
+    protected long nextId() {
+        return ids.incrementAndGet();
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemFlowRuleStore.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemFlowRuleStore.java
new file mode 100644
index 0000000..c5a2a34
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemFlowRuleStore.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.repository.rule;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.FlowRuleEntity;
+import com.alibaba.csp.sentinel.slots.block.flow.ClusterFlowConfig;
+
+import org.springframework.stereotype.Component;
+
+/**
+ * Store {@link FlowRuleEntity} in memory.
+ *
+ * @author leyou
+ */
+@Component
+public class InMemFlowRuleStore extends InMemoryRuleRepositoryAdapter<FlowRuleEntity> {
+
+    private static AtomicLong ids = new AtomicLong(0);
+
+    @Override
+    protected long nextId() {
+        return ids.incrementAndGet();
+    }
+
+    @Override
+    protected FlowRuleEntity preProcess(FlowRuleEntity entity) {
+        if (entity != null && entity.isClusterMode()) {
+            ClusterFlowConfig config = entity.getClusterConfig();
+            if (config == null) {
+                config = new ClusterFlowConfig();
+                entity.setClusterConfig(config);
+            }
+            // Set cluster rule id.
+            config.setFlowId(entity.getId());
+        }
+        return entity;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemParamFlowRuleStore.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemParamFlowRuleStore.java
new file mode 100644
index 0000000..5a82f13
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemParamFlowRuleStore.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.repository.rule;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.ParamFlowRuleEntity;
+import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowClusterConfig;
+
+import org.springframework.stereotype.Component;
+
+/**
+ * @author Eric Zhao
+ * @since 0.2.1
+ */
+@Component
+public class InMemParamFlowRuleStore extends InMemoryRuleRepositoryAdapter<ParamFlowRuleEntity> {
+
+    private static AtomicLong ids = new AtomicLong(0);
+
+    @Override
+    protected long nextId() {
+        return ids.incrementAndGet();
+    }
+
+    @Override
+    protected ParamFlowRuleEntity preProcess(ParamFlowRuleEntity entity) {
+        if (entity != null && entity.isClusterMode()) {
+            ParamFlowClusterConfig config = entity.getClusterConfig();
+            if (config == null) {
+                config = new ParamFlowClusterConfig();
+            }
+            // Set cluster rule id.
+            config.setFlowId(entity.getId());
+        }
+        return entity;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemSystemRuleStore.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemSystemRuleStore.java
new file mode 100644
index 0000000..8d3949b
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemSystemRuleStore.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.repository.rule;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.SystemRuleEntity;
+
+import org.springframework.stereotype.Component;
+
+/**
+ * @author leyou
+ */
+@Component
+public class InMemSystemRuleStore extends InMemoryRuleRepositoryAdapter<SystemRuleEntity> {
+
+    private static AtomicLong ids = new AtomicLong(0);
+
+    @Override
+    protected long nextId() {
+        return ids.incrementAndGet();
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemoryRuleRepositoryAdapter.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemoryRuleRepositoryAdapter.java
new file mode 100644
index 0000000..08d623c
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemoryRuleRepositoryAdapter.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.repository.rule;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.RuleEntity;
+import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo;
+import com.alibaba.csp.sentinel.util.AssertUtil;
+
+/**
+ * @author leyou
+ */
+public abstract class InMemoryRuleRepositoryAdapter<T extends RuleEntity> implements RuleRepository<T, Long> {
+
+    /**
+     * {@code <machine, <id, rule>>}
+     */
+    private Map<MachineInfo, Map<Long, T>> machineRules = new ConcurrentHashMap<>(16);
+    private Map<Long, T> allRules = new ConcurrentHashMap<>(16);
+
+    private Map<String, Map<Long, T>> appRules = new ConcurrentHashMap<>(16);
+
+    private static final int MAX_RULES_SIZE = 10000;
+
+    @Override
+    public T save(T entity) {
+        if (entity.getId() == null) {
+            entity.setId(nextId());
+        }
+        T processedEntity = preProcess(entity);
+        if (processedEntity != null) {
+            allRules.put(processedEntity.getId(), processedEntity);
+            machineRules.computeIfAbsent(MachineInfo.of(processedEntity.getApp(), processedEntity.getIp(),
+                processedEntity.getPort()), e -> new ConcurrentHashMap<>(32))
+                .put(processedEntity.getId(), processedEntity);
+            appRules.computeIfAbsent(processedEntity.getApp(), v -> new ConcurrentHashMap<>(32))
+                .put(processedEntity.getId(), processedEntity);
+        }
+
+        return processedEntity;
+    }
+
+    @Override
+    public List<T> saveAll(List<T> rules) {
+        // TODO: check here.
+        allRules.clear();
+        machineRules.clear();
+        appRules.clear();
+
+        if (rules == null) {
+            return null;
+        }
+        List<T> savedRules = new ArrayList<>(rules.size());
+        for (T rule : rules) {
+            savedRules.add(save(rule));
+        }
+        return savedRules;
+    }
+
+    @Override
+    public T delete(Long id) {
+        T entity = allRules.remove(id);
+        if (entity != null) {
+            if (appRules.get(entity.getApp()) != null) {
+                appRules.get(entity.getApp()).remove(id);
+            }
+            machineRules.get(MachineInfo.of(entity.getApp(), entity.getIp(), entity.getPort())).remove(id);
+        }
+        return entity;
+    }
+
+    @Override
+    public T findById(Long id) {
+        return allRules.get(id);
+    }
+
+    @Override
+    public List<T> findAllByMachine(MachineInfo machineInfo) {
+        Map<Long, T> entities = machineRules.get(machineInfo);
+        if (entities == null) {
+            return new ArrayList<>();
+        }
+        return new ArrayList<>(entities.values());
+    }
+
+    @Override
+    public List<T> findAllByApp(String appName) {
+        AssertUtil.notEmpty(appName, "appName cannot be empty");
+        Map<Long, T> entities = appRules.get(appName);
+        if (entities == null) {
+            return new ArrayList<>();
+        }
+        return new ArrayList<>(entities.values());
+    }
+
+    public void clearAll() {
+        allRules.clear();
+        machineRules.clear();
+        appRules.clear();
+    }
+
+    protected T preProcess(T entity) {
+        return entity;
+    }
+
+    /**
+     * Get next unused id.
+     *
+     * @return next unused id
+     */
+    abstract protected long nextId();
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/RuleRepository.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/RuleRepository.java
new file mode 100644
index 0000000..266c2fa
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/RuleRepository.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.repository.rule;
+
+import java.util.List;
+
+import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo;
+
+/**
+ * Interface to store and find rules.
+ *
+ * @author leyou
+ */
+public interface RuleRepository<T, ID> {
+
+    /**
+     * Save one.
+     *
+     * @param entity
+     * @return
+     */
+    T save(T entity);
+
+    /**
+     * Save all.
+     *
+     * @param rules
+     * @return rules saved.
+     */
+    List<T> saveAll(List<T> rules);
+
+    /**
+     * Delete by id
+     *
+     * @param id
+     * @return entity deleted
+     */
+    T delete(ID id);
+
+    /**
+     * Find by id.
+     *
+     * @param id
+     * @return
+     */
+    T findById(ID id);
+
+    /**
+     * Find all by machine.
+     *
+     * @param machineInfo
+     * @return
+     */
+    List<T> findAllByMachine(MachineInfo machineInfo);
+
+    /**
+     * Find all by application.
+     *
+     * @param appName valid app name
+     * @return all rules of the application
+     * @since 1.4.0
+     */
+    List<T> findAllByApp(String appName);
+
+    ///**
+    // * Find all by app and enable switch.
+    // * @param app
+    // * @param enable
+    // * @return
+    // */
+    //List<T> findAllByAppAndEnable(String app, boolean enable);
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/DynamicRuleProvider.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/DynamicRuleProvider.java
new file mode 100644
index 0000000..7ee38ad
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/DynamicRuleProvider.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.rule;
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.0
+ */
+public interface DynamicRuleProvider<T> {
+
+    T getRules(String appName) throws Exception;
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/DynamicRulePublisher.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/DynamicRulePublisher.java
new file mode 100644
index 0000000..940d76a
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/DynamicRulePublisher.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.rule;
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.0
+ */
+public interface DynamicRulePublisher<T> {
+
+    /**
+     * Publish rules to remote rule configuration center for given application name.
+     *
+     * @param app app name
+     * @param rules list of rules to push
+     * @throws Exception if some error occurs
+     */
+    void publish(String app, T rules) throws Exception;
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/FlowRuleApiProvider.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/FlowRuleApiProvider.java
new file mode 100644
index 0000000..9f9ce5c
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/FlowRuleApiProvider.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.rule;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient;
+import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement;
+import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo;
+import com.alibaba.csp.sentinel.util.StringUtil;
+
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.FlowRuleEntity;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author Eric Zhao
+ */
+@Component("flowRuleDefaultProvider")
+public class FlowRuleApiProvider implements DynamicRuleProvider<List<FlowRuleEntity>> {
+
+    @Autowired
+    private SentinelApiClient sentinelApiClient;
+    @Autowired
+    private AppManagement appManagement;
+
+    @Override
+    public List<FlowRuleEntity> getRules(String appName) throws Exception {
+        if (StringUtil.isBlank(appName)) {
+            return new ArrayList<>();
+        }
+        List<MachineInfo> list = appManagement.getDetailApp(appName).getMachines()
+            .stream()
+            .filter(MachineInfo::isHealthy)
+            .sorted((e1, e2) -> Long.compare(e2.getLastHeartbeat(), e1.getLastHeartbeat())).collect(Collectors.toList());
+        if (list.isEmpty()) {
+            return new ArrayList<>();
+        } else {
+            MachineInfo machine = list.get(0);
+            return sentinelApiClient.fetchFlowRuleOfMachine(machine.getApp(), machine.getIp(), machine.getPort());
+        }
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/FlowRuleApiPublisher.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/FlowRuleApiPublisher.java
new file mode 100644
index 0000000..9afbcf3
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/FlowRuleApiPublisher.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.rule;
+
+import java.util.List;
+import java.util.Set;
+
+import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient;
+import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement;
+import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo;
+import com.alibaba.csp.sentinel.util.StringUtil;
+
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.FlowRuleEntity;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.0
+ */
+@Component("flowRuleDefaultPublisher")
+public class FlowRuleApiPublisher implements DynamicRulePublisher<List<FlowRuleEntity>> {
+
+    @Autowired
+    private SentinelApiClient sentinelApiClient;
+    @Autowired
+    private AppManagement appManagement;
+
+    @Override
+    public void publish(String app, List<FlowRuleEntity> rules) throws Exception {
+        if (StringUtil.isBlank(app)) {
+            return;
+        }
+        if (rules == null) {
+            return;
+        }
+        Set<MachineInfo> set = appManagement.getDetailApp(app).getMachines();
+
+        for (MachineInfo machine : set) {
+            if (!machine.isHealthy()) {
+                continue;
+            }
+            // TODO: parse the results
+            sentinelApiClient.setFlowRuleOfMachine(app, machine.getIp(), machine.getPort(), rules);
+        }
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterAssignService.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterAssignService.java
new file mode 100644
index 0000000..79a796e
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterAssignService.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.service;
+
+import java.util.List;
+import java.util.Set;
+
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.ClusterAppAssignResultVO;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.request.ClusterAppAssignMap;
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.1
+ */
+public interface ClusterAssignService {
+
+    /**
+     * Unbind a specific cluster server and its clients.
+     *
+     * @param app app name
+     * @param machineId valid machine ID ({@code host@commandPort})
+     * @return assign result
+     */
+    ClusterAppAssignResultVO unbindClusterServer(String app, String machineId);
+
+    /**
+     * Unbind a set of cluster servers and its clients.
+     *
+     * @param app app name
+     * @param machineIdSet set of valid machine ID ({@code host@commandPort})
+     * @return assign result
+     */
+    ClusterAppAssignResultVO unbindClusterServers(String app, Set<String> machineIdSet);
+
+    /**
+     * Apply cluster server and client assignment for provided app.
+     *
+     * @param app app name
+     * @param clusterMap cluster assign map (server -> clients)
+     * @param remainingSet unassigned set of machine ID
+     * @return assign result
+     */
+    ClusterAppAssignResultVO applyAssignToApp(String app, List<ClusterAppAssignMap> clusterMap,
+                                              Set<String> remainingSet);
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterAssignServiceImpl.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterAssignServiceImpl.java
new file mode 100644
index 0000000..494e7af
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterAssignServiceImpl.java
@@ -0,0 +1,270 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.service;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+import com.alibaba.csp.sentinel.cluster.ClusterStateManager;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.state.ClusterUniversalStatePairVO;
+import com.alibaba.csp.sentinel.util.AssertUtil;
+import com.alibaba.csp.sentinel.util.function.Tuple2;
+
+import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.ClusterAppAssignResultVO;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.ClusterGroupEntity;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ClusterClientConfig;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ServerFlowConfig;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ServerTransportConfig;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.request.ClusterAppAssignMap;
+import com.alibaba.csp.sentinel.dashboard.util.MachineUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.1
+ */
+@Service
+public class ClusterAssignServiceImpl implements ClusterAssignService {
+
+    private final Logger LOGGER = LoggerFactory.getLogger(ClusterAssignServiceImpl.class);
+
+    @Autowired
+    private SentinelApiClient sentinelApiClient;
+    @Autowired
+    private ClusterConfigService clusterConfigService;
+
+    private boolean isMachineInApp(/*@NonEmpty*/ String machineId) {
+        return machineId.contains(":");
+    }
+
+    private ClusterAppAssignResultVO handleUnbindClusterServerNotInApp(String app, String machineId) {
+        Set<String> failedSet = new HashSet<>();
+        try {
+            List<ClusterUniversalStatePairVO> list = clusterConfigService.getClusterUniversalState(app)
+                .get(10, TimeUnit.SECONDS);
+            Set<String> toModifySet = list.stream()
+                .filter(e -> e.getState().getStateInfo().getMode() == ClusterStateManager.CLUSTER_CLIENT)
+                .filter(e -> machineId.equals(e.getState().getClient().getClientConfig().getServerHost() + ':' +
+                    e.getState().getClient().getClientConfig().getServerPort()))
+                .map(e -> e.getIp() + '@' + e.getCommandPort())
+                .collect(Collectors.toSet());
+            // Modify mode to NOT-STARTED for all associated token clients.
+            modifyToNonStarted(toModifySet, failedSet);
+        } catch (Exception ex) {
+            Throwable e = ex instanceof ExecutionException ? ex.getCause() : ex;
+            LOGGER.error("Failed to unbind machine <{}>", machineId, e);
+            failedSet.add(machineId);
+        }
+        return new ClusterAppAssignResultVO()
+            .setFailedClientSet(failedSet)
+            .setFailedServerSet(new HashSet<>());
+    }
+
+    private void modifyToNonStarted(Set<String> toModifySet, Set<String> failedSet) {
+        toModifySet.parallelStream()
+            .map(MachineUtils::parseCommandIpAndPort)
+            .filter(Optional::isPresent)
+            .map(Optional::get)
+            .map(e -> {
+                CompletableFuture<Void> f = modifyMode(e.r1, e.r2, ClusterStateManager.CLUSTER_NOT_STARTED);
+                return Tuple2.of(e.r1 + '@' + e.r2, f);
+            })
+            .forEach(f -> handleFutureSync(f, failedSet));
+    }
+
+    @Override
+    public ClusterAppAssignResultVO unbindClusterServer(String app, String machineId) {
+        AssertUtil.assertNotBlank(app, "app cannot be blank");
+        AssertUtil.assertNotBlank(machineId, "machineId cannot be blank");
+
+        if (isMachineInApp(machineId)) {
+            return handleUnbindClusterServerNotInApp(app, machineId);
+        }
+        Set<String> failedSet = new HashSet<>();
+        try {
+            ClusterGroupEntity entity = clusterConfigService.getClusterUniversalStateForAppMachine(app, machineId)
+                .get(10, TimeUnit.SECONDS);
+            Set<String> toModifySet = new HashSet<>();
+            toModifySet.add(machineId);
+            if (entity.getClientSet() != null) {
+                toModifySet.addAll(entity.getClientSet());
+            }
+            // Modify mode to NOT-STARTED for all chosen token servers and associated token clients.
+            modifyToNonStarted(toModifySet, failedSet);
+        } catch (Exception ex) {
+            Throwable e = ex instanceof ExecutionException ? ex.getCause() : ex;
+            LOGGER.error("Failed to unbind machine <{}>", machineId, e);
+            failedSet.add(machineId);
+        }
+        return new ClusterAppAssignResultVO()
+            .setFailedClientSet(failedSet)
+            .setFailedServerSet(new HashSet<>());
+    }
+
+    @Override
+    public ClusterAppAssignResultVO unbindClusterServers(String app, Set<String> machineIdSet) {
+        AssertUtil.assertNotBlank(app, "app cannot be blank");
+        AssertUtil.isTrue(machineIdSet != null && !machineIdSet.isEmpty(), "machineIdSet cannot be empty");
+        ClusterAppAssignResultVO result = new ClusterAppAssignResultVO()
+            .setFailedClientSet(new HashSet<>())
+            .setFailedServerSet(new HashSet<>());
+        for (String machineId : machineIdSet) {
+            ClusterAppAssignResultVO resultVO = unbindClusterServer(app, machineId);
+            result.getFailedClientSet().addAll(resultVO.getFailedClientSet());
+            result.getFailedServerSet().addAll(resultVO.getFailedServerSet());
+        }
+        return result;
+    }
+
+    @Override
+    public ClusterAppAssignResultVO applyAssignToApp(String app, List<ClusterAppAssignMap> clusterMap,
+                                                     Set<String> remainingSet) {
+        AssertUtil.assertNotBlank(app, "app cannot be blank");
+        AssertUtil.notNull(clusterMap, "clusterMap cannot be null");
+        Set<String> failedServerSet = new HashSet<>();
+        Set<String> failedClientSet = new HashSet<>();
+
+        // Assign server and apply config.
+        clusterMap.stream()
+            .filter(Objects::nonNull)
+            .filter(ClusterAppAssignMap::getBelongToApp)
+            .map(e -> {
+                String ip = e.getIp();
+                int commandPort = parsePort(e);
+                CompletableFuture<Void> f = modifyMode(ip, commandPort, ClusterStateManager.CLUSTER_SERVER)
+                    .thenCompose(v -> applyServerConfigChange(app, ip, commandPort, e));
+                return Tuple2.of(e.getMachineId(), f);
+            })
+            .forEach(t -> handleFutureSync(t, failedServerSet));
+
+        // Assign client of servers and apply config.
+        clusterMap.parallelStream()
+            .filter(Objects::nonNull)
+            .forEach(e -> applyAllClientConfigChange(app, e, failedClientSet));
+
+        // Unbind remaining (unassigned) machines.
+        applyAllRemainingMachineSet(app, remainingSet, failedClientSet);
+
+        return new ClusterAppAssignResultVO()
+            .setFailedClientSet(failedClientSet)
+            .setFailedServerSet(failedServerSet);
+    }
+
+    private void applyAllRemainingMachineSet(String app, Set<String> remainingSet, Set<String> failedSet) {
+        if (remainingSet == null || remainingSet.isEmpty()) {
+            return;
+        }
+        remainingSet.parallelStream()
+            .filter(Objects::nonNull)
+            .map(MachineUtils::parseCommandIpAndPort)
+            .filter(Optional::isPresent)
+            .map(Optional::get)
+            .map(ipPort -> {
+                String ip = ipPort.r1;
+                int commandPort = ipPort.r2;
+                CompletableFuture<Void> f = modifyMode(ip, commandPort, ClusterStateManager.CLUSTER_NOT_STARTED);
+                return Tuple2.of(ip + '@' + commandPort, f);
+            })
+            .forEach(t -> handleFutureSync(t, failedSet));
+    }
+
+    private void applyAllClientConfigChange(String app, ClusterAppAssignMap assignMap,
+                                            Set<String> failedSet) {
+        Set<String> clientSet = assignMap.getClientSet();
+        if (clientSet == null || clientSet.isEmpty()) {
+            return;
+        }
+        final String serverIp = assignMap.getIp();
+        final int serverPort = assignMap.getPort();
+        clientSet.stream()
+            .map(MachineUtils::parseCommandIpAndPort)
+            .filter(Optional::isPresent)
+            .map(Optional::get)
+            .map(ipPort -> {
+                CompletableFuture<Void> f = sentinelApiClient
+                    .modifyClusterMode(ipPort.r1, ipPort.r2, ClusterStateManager.CLUSTER_CLIENT)
+                    .thenCompose(v -> sentinelApiClient.modifyClusterClientConfig(app, ipPort.r1, ipPort.r2,
+                        new ClusterClientConfig().setRequestTimeout(20)
+                            .setServerHost(serverIp)
+                            .setServerPort(serverPort)
+                    ));
+                return Tuple2.of(ipPort.r1 + '@' + ipPort.r2, f);
+            })
+            .forEach(t -> handleFutureSync(t, failedSet));
+    }
+
+    private void handleFutureSync(Tuple2<String, CompletableFuture<Void>> t, Set<String> failedSet) {
+        try {
+            t.r2.get(10, TimeUnit.SECONDS);
+        } catch (Exception ex) {
+            if (ex instanceof ExecutionException) {
+                LOGGER.error("Request for <{}> failed", t.r1, ex.getCause());
+            } else {
+                LOGGER.error("Request for <{}> failed", t.r1, ex);
+            }
+            failedSet.add(t.r1);
+        }
+    }
+
+    private CompletableFuture<Void> applyServerConfigChange(String app, String ip, int commandPort,
+                                                            ClusterAppAssignMap assignMap) {
+        ServerTransportConfig transportConfig = new ServerTransportConfig()
+            .setPort(assignMap.getPort())
+            .setIdleSeconds(600);
+        return sentinelApiClient.modifyClusterServerTransportConfig(app, ip, commandPort, transportConfig)
+            .thenCompose(v -> applyServerFlowConfigChange(app, ip, commandPort, assignMap))
+            .thenCompose(v -> applyServerNamespaceSetConfig(app, ip, commandPort, assignMap));
+    }
+
+    private CompletableFuture<Void> applyServerFlowConfigChange(String app, String ip, int commandPort,
+                                                                ClusterAppAssignMap assignMap) {
+        Double maxAllowedQps = assignMap.getMaxAllowedQps();
+        if (maxAllowedQps == null || maxAllowedQps <= 0 || maxAllowedQps > 20_0000) {
+            return CompletableFuture.completedFuture(null);
+        }
+        return sentinelApiClient.modifyClusterServerFlowConfig(app, ip, commandPort,
+            new ServerFlowConfig().setMaxAllowedQps(maxAllowedQps));
+    }
+
+    private CompletableFuture<Void> applyServerNamespaceSetConfig(String app, String ip, int commandPort,
+                                                                  ClusterAppAssignMap assignMap) {
+        Set<String> namespaceSet = assignMap.getNamespaceSet();
+        if (namespaceSet == null || namespaceSet.isEmpty()) {
+            return CompletableFuture.completedFuture(null);
+        }
+        return sentinelApiClient.modifyClusterServerNamespaceSet(app, ip, commandPort, namespaceSet);
+    }
+
+    private CompletableFuture<Void> modifyMode(String ip, int port, int mode) {
+        return sentinelApiClient.modifyClusterMode(ip, port, mode);
+    }
+
+    private int parsePort(ClusterAppAssignMap assignMap) {
+        return MachineUtils.parseCommandPort(assignMap.getMachineId())
+            .orElse(ServerTransportConfig.DEFAULT_PORT);
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterConfigService.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterConfigService.java
new file mode 100644
index 0000000..1691deb
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterConfigService.java
@@ -0,0 +1,179 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.CompletableFuture;
+import java.util.stream.Collectors;
+
+import com.alibaba.csp.sentinel.cluster.ClusterStateManager;
+import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient;
+import com.alibaba.csp.sentinel.dashboard.discovery.AppInfo;
+import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.request.ClusterServerModifyRequest;
+import com.alibaba.csp.sentinel.dashboard.util.AsyncUtils;
+import com.alibaba.csp.sentinel.dashboard.util.ClusterEntityUtils;
+import com.alibaba.csp.sentinel.util.StringUtil;
+
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.ClusterGroupEntity;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.request.ClusterClientModifyRequest;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.state.ClusterClientStateVO;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.state.ClusterUniversalStatePairVO;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.state.ClusterUniversalStateVO;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ClusterClientConfig;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ServerFlowConfig;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ServerTransportConfig;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.0
+ */
+@Service
+public class ClusterConfigService {
+
+    @Autowired
+    private SentinelApiClient sentinelApiClient;
+    @Autowired
+    private AppManagement appManagement;
+
+    public CompletableFuture<Void> modifyClusterClientConfig(ClusterClientModifyRequest request) {
+        if (notClientRequestValid(request)) {
+            throw new IllegalArgumentException("Invalid request");
+        }
+        String app = request.getApp();
+        String ip = request.getIp();
+        int port = request.getPort();
+        return sentinelApiClient.modifyClusterClientConfig(app, ip, port, request.getClientConfig())
+            .thenCompose(v -> sentinelApiClient.modifyClusterMode(ip, port, ClusterStateManager.CLUSTER_CLIENT));
+    }
+
+    private boolean notClientRequestValid(/*@NonNull */ ClusterClientModifyRequest request) {
+        ClusterClientConfig config = request.getClientConfig();
+        return config == null || StringUtil.isEmpty(config.getServerHost())
+            || config.getServerPort() == null || config.getServerPort() <= 0
+            || config.getRequestTimeout() == null || config.getRequestTimeout() <= 0;
+    }
+
+    public CompletableFuture<Void> modifyClusterServerConfig(ClusterServerModifyRequest request) {
+        ServerTransportConfig transportConfig = request.getTransportConfig();
+        ServerFlowConfig flowConfig = request.getFlowConfig();
+        Set<String> namespaceSet = request.getNamespaceSet();
+        if (invalidTransportConfig(transportConfig)) {
+            throw new IllegalArgumentException("Invalid transport config in request");
+        }
+        if (invalidFlowConfig(flowConfig)) {
+            throw new IllegalArgumentException("Invalid flow config in request");
+        }
+        if (namespaceSet == null) {
+            throw new IllegalArgumentException("namespace set cannot be null");
+        }
+        String app = request.getApp();
+        String ip = request.getIp();
+        int port = request.getPort();
+        return sentinelApiClient.modifyClusterServerNamespaceSet(app, ip, port, namespaceSet)
+            .thenCompose(v -> sentinelApiClient.modifyClusterServerTransportConfig(app, ip, port, transportConfig))
+            .thenCompose(v -> sentinelApiClient.modifyClusterServerFlowConfig(app, ip, port, flowConfig))
+            .thenCompose(v -> sentinelApiClient.modifyClusterMode(ip, port, ClusterStateManager.CLUSTER_SERVER));
+    }
+
+    /**
+     * Get cluster state list of all available machines of provided application.
+     *
+     * @param app application name
+     * @return cluster state list of all available machines of the application
+     * @since 1.4.1
+     */
+    public CompletableFuture<List<ClusterUniversalStatePairVO>> getClusterUniversalState(String app) {
+        if (StringUtil.isBlank(app)) {
+            return AsyncUtils.newFailedFuture(new IllegalArgumentException("app cannot be empty"));
+        }
+        AppInfo appInfo = appManagement.getDetailApp(app);
+        if (appInfo == null || appInfo.getMachines() == null) {
+            return CompletableFuture.completedFuture(new ArrayList<>());
+        }
+
+        List<CompletableFuture<ClusterUniversalStatePairVO>> futures = appInfo.getMachines().stream()
+            .filter(e -> e.isHealthy())
+            .map(machine -> getClusterUniversalState(app, machine.getIp(), machine.getPort())
+                .thenApply(e -> new ClusterUniversalStatePairVO(machine.getIp(), machine.getPort(), e)))
+            .collect(Collectors.toList());
+
+        return AsyncUtils.sequenceSuccessFuture(futures);
+    }
+
+    public CompletableFuture<ClusterGroupEntity> getClusterUniversalStateForAppMachine(String app, String machineId) {
+        if (StringUtil.isBlank(app)) {
+            return AsyncUtils.newFailedFuture(new IllegalArgumentException("app cannot be empty"));
+        }
+        AppInfo appInfo = appManagement.getDetailApp(app);
+        if (appInfo == null || appInfo.getMachines() == null) {
+            return AsyncUtils.newFailedFuture(new IllegalArgumentException("app does not have machines"));
+        }
+
+        boolean machineOk = appInfo.getMachines().stream()
+            .filter(e -> e.isHealthy())
+            .map(e -> e.getIp() + '@' + e.getPort())
+            .anyMatch(e -> e.equals(machineId));
+        if (!machineOk) {
+            return AsyncUtils.newFailedFuture(new IllegalStateException("machine does not exist or disconnected"));
+        }
+
+        return getClusterUniversalState(app)
+            .thenApply(ClusterEntityUtils::wrapToClusterGroup)
+            .thenCompose(e -> e.stream()
+                .filter(e1 -> e1.getMachineId().equals(machineId))
+                .findAny()
+                .map(CompletableFuture::completedFuture)
+                .orElse(AsyncUtils.newFailedFuture(new IllegalStateException("not a server: " + machineId)))
+            );
+    }
+
+    public CompletableFuture<ClusterUniversalStateVO> getClusterUniversalState(String app, String ip, int port) {
+        return sentinelApiClient.fetchClusterMode(ip, port)
+            .thenApply(e -> new ClusterUniversalStateVO().setStateInfo(e))
+            .thenCompose(vo -> {
+                if (vo.getStateInfo().getClientAvailable()) {
+                    return sentinelApiClient.fetchClusterClientInfoAndConfig(ip, port)
+                        .thenApply(cc -> vo.setClient(new ClusterClientStateVO().setClientConfig(cc)));
+                } else {
+                    return CompletableFuture.completedFuture(vo);
+                }
+            }).thenCompose(vo -> {
+                if (vo.getStateInfo().getServerAvailable()) {
+                    return sentinelApiClient.fetchClusterServerBasicInfo(ip, port)
+                        .thenApply(vo::setServer);
+                } else {
+                    return CompletableFuture.completedFuture(vo);
+                }
+            });
+    }
+
+    private boolean invalidTransportConfig(ServerTransportConfig transportConfig) {
+        return transportConfig == null || transportConfig.getPort() == null || transportConfig.getPort() <= 0
+            || transportConfig.getIdleSeconds() == null || transportConfig.getIdleSeconds() <= 0;
+    }
+
+    private boolean invalidFlowConfig(ServerFlowConfig flowConfig) {
+        return flowConfig == null || flowConfig.getSampleCount() == null || flowConfig.getSampleCount() <= 0
+            || flowConfig.getIntervalMs() == null || flowConfig.getIntervalMs() <= 0
+            || flowConfig.getIntervalMs() % flowConfig.getSampleCount() != 0
+            || flowConfig.getMaxAllowedQps() == null || flowConfig.getMaxAllowedQps() < 0;
+    }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/AsyncUtils.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/AsyncUtils.java
new file mode 100644
index 0000000..9881cda
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/AsyncUtils.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.util;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.1
+ */
+public final class AsyncUtils {
+
+    private static final Logger LOG = LoggerFactory.getLogger(AsyncUtils.class);
+
+    public static <R> CompletableFuture<R> newFailedFuture(Throwable ex) {
+        CompletableFuture<R> future = new CompletableFuture<>();
+        future.completeExceptionally(ex);
+        return future;
+    }
+
+    public static <R> CompletableFuture<List<R>> sequenceFuture(List<CompletableFuture<R>> futures) {
+        return CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]))
+            .thenApply(v -> futures.stream()
+                .map(AsyncUtils::getValue)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList())
+            );
+    }
+
+    public static <R> CompletableFuture<List<R>> sequenceSuccessFuture(List<CompletableFuture<R>> futures) {
+        return CompletableFuture.supplyAsync(() -> futures.parallelStream()
+            .map(AsyncUtils::getValue)
+            .filter(Objects::nonNull)
+            .collect(Collectors.toList())
+        );
+    }
+
+    public static <T> T getValue(CompletableFuture<T> future) {
+        try {
+            return future.get(10, TimeUnit.SECONDS);
+        } catch (Exception ex) {
+            LOG.error("getValue for async result failed", ex);
+        }
+        return null;
+    }
+
+    public static boolean isSuccessFuture(CompletableFuture future) {
+        return future.isDone() && !future.isCompletedExceptionally() && !future.isCancelled();
+    }
+
+    private AsyncUtils() {}
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/ClusterEntityUtils.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/ClusterEntityUtils.java
new file mode 100644
index 0000000..646cf94
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/ClusterEntityUtils.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.util;
+
+import com.alibaba.csp.sentinel.cluster.ClusterStateManager;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.ClusterGroupEntity;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.ConnectionGroupVO;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.state.*;
+import com.alibaba.csp.sentinel.util.StringUtil;
+
+import java.util.*;
+
+/**
+ * @author Eric Zhao
+ * @since 1.4.1
+ */
+public final class ClusterEntityUtils {
+
+    public static List<AppClusterServerStateWrapVO> wrapToAppClusterServerState(
+        List<ClusterUniversalStatePairVO> list) {
+        if (list == null || list.isEmpty()) {
+            return new ArrayList<>();
+        }
+        Map<String, AppClusterServerStateWrapVO> map = new HashMap<>();
+        Set<String> tokenServerSet = new HashSet<>();
+        // Handle token servers that belong to current app.
+        for (ClusterUniversalStatePairVO stateVO : list) {
+            int mode = stateVO.getState().getStateInfo().getMode();
+
+            if (mode == ClusterStateManager.CLUSTER_SERVER) {
+                String ip = stateVO.getIp();
+                String serverId = ip + '@' + stateVO.getCommandPort();
+                ClusterServerStateVO serverStateVO = stateVO.getState().getServer();
+                map.computeIfAbsent(serverId, v -> new AppClusterServerStateWrapVO()
+                    .setId(serverId)
+                    .setIp(ip)
+                    .setPort(serverStateVO.getPort())
+                    .setState(serverStateVO)
+                    .setBelongToApp(true)
+                    .setConnectedCount(serverStateVO.getConnection().stream()
+                        .mapToInt(ConnectionGroupVO::getConnectedCount)
+                        .sum()
+                    )
+                );
+                tokenServerSet.add(ip + ":" + serverStateVO.getPort());
+            }
+        }
+        // Handle token servers from other app.
+        for (ClusterUniversalStatePairVO stateVO : list) {
+            int mode = stateVO.getState().getStateInfo().getMode();
+
+            if (mode == ClusterStateManager.CLUSTER_CLIENT) {
+                ClusterClientStateVO clientState = stateVO.getState().getClient();
+                if (clientState == null) {
+                    continue;
+                }
+                String serverIp = clientState.getClientConfig().getServerHost();
+                int serverPort = clientState.getClientConfig().getServerPort();
+                if (tokenServerSet.contains(serverIp + ":" + serverPort)) {
+                    continue;
+                }
+                // We are not able to get the commandPort of foreign token server directly.
+                String serverId = String.format("%s:%d", serverIp, serverPort);
+                map.computeIfAbsent(serverId, v -> new AppClusterServerStateWrapVO()
+                    .setId(serverId)
+                    .setIp(serverIp)
+                    .setPort(serverPort)
+                    .setBelongToApp(false)
+                );
+            }
+        }
+        return new ArrayList<>(map.values());
+    }
+
+    public static List<AppClusterClientStateWrapVO> wrapToAppClusterClientState(
+        List<ClusterUniversalStatePairVO> list) {
+        if (list == null || list.isEmpty()) {
+            return new ArrayList<>();
+        }
+        Map<String, AppClusterClientStateWrapVO> map = new HashMap<>();
+        for (ClusterUniversalStatePairVO stateVO : list) {
+            int mode = stateVO.getState().getStateInfo().getMode();
+
+            if (mode == ClusterStateManager.CLUSTER_CLIENT) {
+                String ip = stateVO.getIp();
+                String clientId = ip + '@' + stateVO.getCommandPort();
+                ClusterClientStateVO clientStateVO = stateVO.getState().getClient();
+                map.computeIfAbsent(clientId, v -> new AppClusterClientStateWrapVO()
+                    .setId(clientId)
+                    .setIp(ip)
+                    .setState(clientStateVO)
+                    .setCommandPort(stateVO.getCommandPort())
+                );
+            }
+        }
+        return new ArrayList<>(map.values());
+    }
+
+    public static List<ClusterGroupEntity> wrapToClusterGroup(List<ClusterUniversalStatePairVO> list) {
+        if (list == null || list.isEmpty()) {
+            return new ArrayList<>();
+        }
+        Map<String, ClusterGroupEntity> map = new HashMap<>();
+        for (ClusterUniversalStatePairVO stateVO : list) {
+            int mode = stateVO.getState().getStateInfo().getMode();
+            String ip = stateVO.getIp();
+            if (mode == ClusterStateManager.CLUSTER_SERVER) {
+                String serverAddress = getIp(ip);
+                int port = stateVO.getState().getServer().getPort();
+                String targetAddress = serverAddress + ":" + port;
+                map.computeIfAbsent(targetAddress, v -> new ClusterGroupEntity()
+                    .setBelongToApp(true).setMachineId(ip + '@' + stateVO.getCommandPort())
+                    .setIp(ip).setPort(port)
+                );
+            }
+        }
+        for (ClusterUniversalStatePairVO stateVO : list) {
+            int mode = stateVO.getState().getStateInfo().getMode();
+            String ip = stateVO.getIp();
+            if (mode == ClusterStateManager.CLUSTER_CLIENT) {
+                String targetServer = stateVO.getState().getClient().getClientConfig().getServerHost();
+                Integer targetPort = stateVO.getState().getClient().getClientConfig().getServerPort();
+                if (StringUtil.isBlank(targetServer) || targetPort == null || targetPort <= 0) {
+                    continue;
+                }
+                String targetAddress = targetServer + ":" + targetPort;
+                ClusterGroupEntity group = map.computeIfAbsent(targetAddress,
+                    v -> new ClusterGroupEntity()
+                        .setBelongToApp(true).setMachineId(targetServer)
+                        .setIp(targetServer).setPort(targetPort)
+                );
+                group.getClientSet().add(ip + '@' + stateVO.getCommandPort());
+            }
+        }
+        return new ArrayList<>(map.values());
+    }
+
+    private static String getIp(String str) {
+        if (str.contains(":")) {
+            return str.split(":")[0];
+        }
+        return str;
+    }
+
+    private ClusterEntityUtils() {}
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/MachineUtils.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/MachineUtils.java
new file mode 100644
index 0000000..5b3073c
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/MachineUtils.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.util;
+
+import java.util.Optional;
+
+import com.alibaba.csp.sentinel.util.StringUtil;
+import com.alibaba.csp.sentinel.util.function.Tuple2;
+
+/**
+ * @author Eric Zhao
+ */
+public final class MachineUtils {
+
+    public static Optional<Integer> parseCommandPort(String machineIp) {
+        try {
+            if (!machineIp.contains("@")) {
+                return Optional.empty();
+            }
+            String[] str = machineIp.split("@");
+            if (str.length <= 1) {
+                return Optional.empty();
+            }
+            return Optional.of(Integer.parseInt(str[1]));
+        } catch (Exception ex) {
+            return Optional.empty();
+        }
+    }
+
+    public static Optional<Tuple2<String, Integer>> parseCommandIpAndPort(String machineIp) {
+        try {
+            if (StringUtil.isEmpty(machineIp) || !machineIp.contains("@")) {
+                return Optional.empty();
+            }
+            String[] str = machineIp.split("@");
+            if (str.length <= 1) {
+                return Optional.empty();
+            }
+            return Optional.of(Tuple2.of(str[0], Integer.parseInt(str[1])));
+        } catch (Exception ex) {
+            return Optional.empty();
+        }
+    }
+
+    private MachineUtils() {}
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/VersionUtils.java b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/VersionUtils.java
new file mode 100644
index 0000000..71b9ac2
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/VersionUtils.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.csp.sentinel.dashboard.util;
+
+import java.util.Optional;
+
+import com.alibaba.csp.sentinel.util.StringUtil;
+
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.SentinelVersion;
+
+/**
+ * Util class for parsing version.
+ *
+ * @author Eric Zhao
+ * @since 0.2.1
+ */
+public final class VersionUtils {
+
+    /**
+     * Parse version of Sentinel from raw string.
+     *
+     * @param verStr version string
+     * @return parsed {@link SentinelVersion} if the version is valid; empty if
+     * there is something wrong with the format
+     */
+    public static Optional<SentinelVersion> parseVersion(String verStr) {
+        if (StringUtil.isBlank(verStr)) {
+            return Optional.empty();
+        }
+        try {
+            String versionFull = verStr;
+            SentinelVersion version = new SentinelVersion();
+            
+            // postfix
+            int index = versionFull.indexOf("-");
+            if (index == 0) {
+                // Start with "-"
+                return Optional.empty();
+            }
+            if (index == versionFull.length() - 1) {
+                // End with "-"
+            } else if (index > 0) {
+                version.setPostfix(versionFull.substring(index + 1));
+            }
+            
+            if (index >= 0) {
+                versionFull = versionFull.substring(0, index);
+            }
+            
+            // x.x.x
+            int segment = 0;
+            int[] ver = new int[3];
+            while (segment < ver.length) {
+                index = versionFull.indexOf('.');
+                if (index < 0) {
+                    if (versionFull.length() > 0) {
+                        ver[segment] = Integer.valueOf(versionFull);
+                    }
+                    break;
+                }
+                ver[segment] = Integer.valueOf(versionFull.substring(0, index));
+                versionFull = versionFull.substring(index + 1);
+                segment ++;
+            }
+            
+            if (ver[0] < 1) {
+                // Wrong format, return empty.
+                return Optional.empty();
+            } else {
+                return Optional.of(version
+                        .setMajorVersion(ver[0])
+                        .setMinorVersion(ver[1])
+                        .setFixVersion(ver[2]));
+            }
+        } catch (Exception ex) {
+            // Parse fail, return empty.
+            return Optional.empty();
+        }
+    }
+
+    private VersionUtils() {}
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/resources/application.yml b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/resources/application.yml
new file mode 100644
index 0000000..1072f36
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/resources/application.yml
@@ -0,0 +1,35 @@
+# Tomcat
+server:
+  port: 8718
+
+# Spring
+spring:
+  application:
+    # 搴旂敤鍚嶇О
+    name: ruoyi-sentinel-dashboard
+  profiles:
+    # 鐜閰嶇疆
+    active: @profiles.active@
+
+sentinel:
+  dashboard:
+    version: @sentinel.version@
+
+--- # nacos 閰嶇疆
+spring:
+  cloud:
+    nacos:
+      # nacos 鏈嶅姟鍦板潃
+      server-addr: @nacos.server@
+      discovery:
+        # 娉ㄥ唽缁�
+        group: @nacos.discovery.group@
+        namespace: ${spring.profiles.active}
+      config:
+        # 閰嶇疆缁�
+        group: @nacos.config.group@
+        namespace: ${spring.profiles.active}
+  config:
+    import:
+      - optional:nacos:application-common.yml
+      - optional:nacos:${spring.application.name}.yml
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/resources/banner.txt b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/resources/banner.txt
new file mode 100644
index 0000000..e081fef
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/resources/banner.txt
@@ -0,0 +1,8 @@
+Spring Boot Version: ${spring-boot.version}
+Spring Application Name: ${spring.application.name}
+                _   _            _           _           _     _                         _
+               | | (_)          | |         | |         | |   | |                       | |
+ ___  ___ _ __ | |_ _ _ __   ___| |______ __| | __ _ ___| |__ | |__   ___   __ _ _ __ __| |
+/ __|/ _ \ '_ \| __| | '_ \ / _ \ |______/ _` |/ _` / __| '_ \| '_ \ / _ \ / _` | '__/ _` |
+\__ \  __/ | | | |_| | | | |  __/ |     | (_| | (_| \__ \ | | | |_) | (_) | (_| | | | (_| |
+|___/\___|_| |_|\__|_|_| |_|\___|_|      \__,_|\__,_|___/_| |_|_.__/ \___/ \__,_|_|  \__,_|
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/resources/logback-common.xml b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/resources/logback-common.xml
new file mode 100644
index 0000000..89eaa97
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/resources/logback-common.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<included>
+
+    <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"/>
+
+    <!-- 鎺у埗鍙拌緭鍑� -->
+    <appender name="file_console" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/console.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 鏃ュ織鏂囦欢鍚嶆牸寮� -->
+            <fileNamePattern>${log.path}/console.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 鏃ュ織鏈�澶� 1澶� -->
+            <maxHistory>1</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <!-- 杩囨护鐨勭骇鍒� -->
+            <level>INFO</level>
+        </filter>
+    </appender>
+
+    <!-- 绯荤粺鏃ュ織杈撳嚭 -->
+    <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/info.log</file>
+        <!-- 寰幆鏀跨瓥锛氬熀浜庢椂闂村垱寤烘棩蹇楁枃浠� -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 鏃ュ織鏂囦欢鍚嶆牸寮� -->
+            <fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 鏃ュ織鏈�澶х殑鍘嗗彶 60澶� -->
+            <maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 杩囨护鐨勭骇鍒� -->
+            <level>INFO</level>
+            <!-- 鍖归厤鏃剁殑鎿嶄綔锛氭帴鏀讹紙璁板綍锛� -->
+            <onMatch>ACCEPT</onMatch>
+            <!-- 涓嶅尮閰嶆椂鐨勬搷浣滐細鎷掔粷锛堜笉璁板綍锛� -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/error.log</file>
+        <!-- 寰幆鏀跨瓥锛氬熀浜庢椂闂村垱寤烘棩蹇楁枃浠� -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 鏃ュ織鏂囦欢鍚嶆牸寮� -->
+            <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 鏃ュ織鏈�澶х殑鍘嗗彶 60澶� -->
+            <maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 杩囨护鐨勭骇鍒� -->
+            <level>ERROR</level>
+            <!-- 鍖归厤鏃剁殑鎿嶄綔锛氭帴鏀讹紙璁板綍锛� -->
+            <onMatch>ACCEPT</onMatch>
+            <!-- 涓嶅尮閰嶆椂鐨勬搷浣滐細鎷掔粷锛堜笉璁板綍锛� -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- info寮傛杈撳嚭 -->
+    <appender name="async_info" class="ch.qos.logback.classic.AsyncAppender">
+        <!-- 涓嶄涪澶辨棩蹇�.榛樿鐨�,濡傛灉闃熷垪鐨�80%宸叉弧,鍒欎細涓㈠純TRACT銆丏EBUG銆両NFO绾у埆鐨勬棩蹇� -->
+        <discardingThreshold>0</discardingThreshold>
+        <!-- 鏇存敼榛樿鐨勯槦鍒楃殑娣卞害,璇ュ�间細褰卞搷鎬ц兘.榛樿鍊间负256 -->
+        <queueSize>512</queueSize>
+        <!-- 娣诲姞闄勫姞鐨刟ppender,鏈�澶氬彧鑳芥坊鍔犱竴涓� -->
+        <appender-ref ref="file_info"/>
+    </appender>
+
+    <!-- error寮傛杈撳嚭 -->
+    <appender name="async_error" class="ch.qos.logback.classic.AsyncAppender">
+        <!-- 涓嶄涪澶辨棩蹇�.榛樿鐨�,濡傛灉闃熷垪鐨�80%宸叉弧,鍒欎細涓㈠純TRACT銆丏EBUG銆両NFO绾у埆鐨勬棩蹇� -->
+        <discardingThreshold>0</discardingThreshold>
+        <!-- 鏇存敼榛樿鐨勯槦鍒楃殑娣卞害,璇ュ�间細褰卞搷鎬ц兘.榛樿鍊间负256 -->
+        <queueSize>512</queueSize>
+        <!-- 娣诲姞闄勫姞鐨刟ppender,鏈�澶氬彧鑳芥坊鍔犱竴涓� -->
+        <appender-ref ref="file_error"/>
+    </appender>
+
+    <!--绯荤粺鎿嶄綔鏃ュ織-->
+    <root level="info">
+        <appender-ref ref="async_info"/>
+        <appender-ref ref="async_error"/>
+        <appender-ref ref="file_console"/>
+    </root>
+</included>
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/resources/logback-plus.xml b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/resources/logback-plus.xml
new file mode 100644
index 0000000..a2e187f
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/resources/logback-plus.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <!-- 鏃ュ織瀛樻斁璺緞 -->
+    <property name="log.path" value="logs/${project.artifactId}"/>
+    <!-- 鏃ュ織杈撳嚭鏍煎紡 -->
+    <property name="console.log.pattern"
+              value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/>
+
+    <!-- 鎺у埗鍙拌緭鍑� -->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>${console.log.pattern}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+    </appender>
+
+    <include resource="logback-common.xml" />
+
+    <include resource="logback-logstash.xml" />
+
+    <!-- 寮�鍚� skywalking 鏃ュ織鏀堕泦 -->
+    <include resource="logback-skylog.xml" />
+
+    <!--绯荤粺鎿嶄綔鏃ュ織-->
+    <root level="info">
+        <appender-ref ref="console"/>
+    </root>
+</configuration>
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/.gitignore b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/.gitignore
new file mode 100644
index 0000000..104d999
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/.gitignore
@@ -0,0 +1,2 @@
+node_modules/
+tmp/
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/.jshintrc b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/.jshintrc
new file mode 100644
index 0000000..6c66001
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/.jshintrc
@@ -0,0 +1,67 @@
+{
+  /*
+   * ENVIRONMENTS
+   * =================
+   */
+
+  // Define globals exposed by modern browsers.
+  "browser": true,
+
+  // Define globals exposed by jQuery.
+  "jquery": true,
+
+  // Define globals exposed by Node.js.
+  "node": true,
+
+  // Allow ES6.
+  "esversion": 6,
+
+  /*
+   * ENFORCING OPTIONS
+   * =================
+   */
+
+  // Force all variable names to use either camelCase style or UPPER_CASE
+  // with underscores.
+  "camelcase": true,
+
+  // Prohibit use of == and != in favor of === and !==.
+  "eqeqeq": true,
+
+  // Enforce tab width of 2 spaces.
+  "indent": 2,
+
+  // Prohibit use of a variable before it is defined.
+  "latedef": true,
+
+  // Enforce line length to 100 characters
+  "maxlen": 100,
+
+  // Require capitalized names for constructor functions.
+  "newcap": true,
+
+  // Enforce use of single quotation marks for strings.
+  "quotmark": "single",
+
+  // Enforce placing 'use strict' at the top function scope
+  // 鍓嶇椤圭洰涓灞備娇鐢� strict 鍗冲彲锛岃鐩栨鏉¤鍒�
+  "strict": false,
+
+  // Prohibit use of explicitly undeclared variables.
+  "undef": true,
+
+  // Warn when variables are defined but never used.
+  "unused": true,
+
+  /*
+   * RELAXING OPTIONS
+   * =================
+   */
+
+  // Suppress warnings about == null comparisons.
+  "eqnull": true,
+  "globals": {
+    "$": false,
+    "angular": false
+  }
+}
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/README.md b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/README.md
new file mode 100644
index 0000000..20f0de6
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/README.md
@@ -0,0 +1,33 @@
+# Sentinel Dashboard Frontend
+
+## Env Requirement
+
+- Node.js > 6.x
+- Node.js < 12.x
+
+## Code Guide
+
+- [Code Style Guide for HTML/CSS](https://codeguide.bootcss.com/)
+- [Airbnb JavaScript Style Guide](https://github.com/airbnb/javascript/tree/es5-deprecated/es5)
+
+## Install Packages
+
+```
+npm install
+```
+
+## Start Development
+
+```
+npm start
+```
+
+## Build for production
+
+```
+npm run build
+```
+
+## Credit
+
+- [sb-admin-angular](https://github.com/start-angular/sb-admin-angular)
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/README_zh.md b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/README_zh.md
new file mode 100644
index 0000000..48dae74
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/README_zh.md
@@ -0,0 +1,33 @@
+# Sentinel Dashboard Frontend
+
+## 鐜瑕佹眰
+
+- Node.js > 6.x
+- Node.js < 12.x
+
+## 缂栫爜瑙勮寖
+
+- HTML/CSS 閬靛惊 [Bootstrap 缂栫爜瑙勮寖](https://codeguide.bootcss.com/)
+- JavaScript 閬靛惊 [Airbnb JavaScript Style Guide](https://github.com/airbnb/javascript/tree/es5-deprecated/es5) 浠ュ強鏈�鏂扮殑 ES 6 鏍囧噯
+
+## 瀹夎渚濊禆
+
+```
+npm i
+```
+
+## 寮�濮嬫湰鍦板紑鍙�
+
+```
+npm start
+```
+
+## 鏋勫缓鍓嶇璧勬簮
+
+```
+npm run build
+```
+
+## Credit
+
+- [sb-admin-angular](https://github.com/start-angular/sb-admin-angular)
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/app.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/app.js
new file mode 100644
index 0000000..ff15e9a
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/app.js
@@ -0,0 +1,368 @@
+'use strict';
+
+/**
+ * @ngdoc overview
+ * @name sentinelDashboardApp
+ * @description
+ * # sentinelDashboardApp
+ *
+ * Main module of the application.
+ */
+
+angular
+  .module('sentinelDashboardApp', [
+    'oc.lazyLoad',
+    'ui.router',
+    'ui.bootstrap',
+    'angular-loading-bar',
+    'ngDialog',
+    'ui.bootstrap.datetimepicker',
+    'ui-notification',
+    'rzTable',
+    'angular-clipboard',
+    'selectize',
+    'angularUtils.directives.dirPagination'
+  ])
+  .factory('AuthInterceptor', ['$window', '$state', function ($window, $state) {
+    var authInterceptor = {
+      'responseError' : function(response) {
+        if (response.status === 401) {
+          // If not auth, clear session in localStorage and jump to the login page
+          $window.localStorage.removeItem('session_sentinel_admin');
+          $state.go('login');
+        }
+
+        return response;
+      },
+      'response' : function(response) {
+        return response;
+      },
+      'request' : function(config) {
+        // Resolved resource loading failure after configuring ContextPath
+    	  var baseUrl = $window.document.getElementsByTagName('base')[0].href;
+    	  config.url = baseUrl + config.url;
+        return config;
+      },
+      'requestError' : function(config){
+        return config;
+      }
+    };
+    return authInterceptor;
+  }])
+  .config(['$stateProvider', '$urlRouterProvider', '$ocLazyLoadProvider', '$httpProvider',
+    function ($stateProvider, $urlRouterProvider, $ocLazyLoadProvider, $httpProvider) {
+      $httpProvider.interceptors.push('AuthInterceptor');
+
+      $ocLazyLoadProvider.config({
+        debug: false,
+        events: true,
+      });
+
+      $urlRouterProvider.otherwise('/dashboard/home');
+
+      $stateProvider
+        .state('login', {
+            url: '/login',
+            templateUrl: 'app/views/login.html',
+            controller: 'LoginCtl',
+            resolve: {
+                loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) {
+                    return $ocLazyLoad.load({
+                        name: 'sentinelDashboardApp',
+                        files: [
+                            'app/scripts/controllers/login.js',
+                        ]
+                    });
+                }]
+            }
+        })
+
+      .state('dashboard', {
+        url: '/dashboard',
+        templateUrl: 'app/views/dashboard/main.html',
+        resolve: {
+          loadMyDirectives: ['$ocLazyLoad', function ($ocLazyLoad) {
+            return $ocLazyLoad.load(
+              {
+                name: 'sentinelDashboardApp',
+                files: [
+                  'app/scripts/directives/header/header.js',
+                  'app/scripts/directives/sidebar/sidebar.js',
+                  'app/scripts/directives/sidebar/sidebar-search/sidebar-search.js',
+                ]
+              });
+          }]
+        }
+      })
+
+      .state('dashboard.home', {
+        url: '/home',
+        templateUrl: 'app/views/dashboard/home.html',
+        resolve: {
+          loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) {
+            return $ocLazyLoad.load({
+              name: 'sentinelDashboardApp',
+              files: [
+                'app/scripts/controllers/main.js',
+              ]
+            });
+          }]
+        }
+      })
+
+      .state('dashboard.flowV1', {
+        templateUrl: 'app/views/flow_v1.html',
+        url: '/flow/:app',
+        controller: 'FlowControllerV1',
+        resolve: {
+          loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) {
+            return $ocLazyLoad.load({
+              name: 'sentinelDashboardApp',
+              files: [
+                'app/scripts/controllers/flow_v1.js',
+              ]
+            });
+          }]
+        }
+      })
+
+      .state('dashboard.flow', {
+          templateUrl: 'app/views/flow_v2.html',
+          url: '/v2/flow/:app',
+          controller: 'FlowControllerV2',
+          resolve: {
+              loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) {
+                  return $ocLazyLoad.load({
+                      name: 'sentinelDashboardApp',
+                      files: [
+                          'app/scripts/controllers/flow_v2.js',
+                      ]
+                  });
+              }]
+          }
+      })
+
+      .state('dashboard.paramFlow', {
+        templateUrl: 'app/views/param_flow.html',
+        url: '/paramFlow/:app',
+        controller: 'ParamFlowController',
+        resolve: {
+          loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) {
+            return $ocLazyLoad.load({
+              name: 'sentinelDashboardApp',
+              files: [
+                'app/scripts/controllers/param_flow.js',
+              ]
+            });
+          }]
+        }
+      })
+
+      .state('dashboard.clusterAppAssignManage', {
+          templateUrl: 'app/views/cluster_app_assign_manage.html',
+          url: '/cluster/assign_manage/:app',
+          controller: 'SentinelClusterAppAssignManageController',
+          resolve: {
+              loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) {
+                  return $ocLazyLoad.load({
+                      name: 'sentinelDashboardApp',
+                      files: [
+                          'app/scripts/controllers/cluster_app_assign_manage.js',
+                      ]
+                  });
+              }]
+          }
+      })
+
+      .state('dashboard.clusterAppServerList', {
+          templateUrl: 'app/views/cluster_app_server_list.html',
+          url: '/cluster/server/:app',
+          controller: 'SentinelClusterAppServerListController',
+          resolve: {
+              loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) {
+                  return $ocLazyLoad.load({
+                      name: 'sentinelDashboardApp',
+                      files: [
+                          'app/scripts/controllers/cluster_app_server_list.js',
+                      ]
+                  });
+              }]
+          }
+      })
+
+      .state('dashboard.clusterAppClientList', {
+          templateUrl: 'app/views/cluster_app_client_list.html',
+          url: '/cluster/client/:app',
+          controller: 'SentinelClusterAppTokenClientListController',
+          resolve: {
+              loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) {
+                  return $ocLazyLoad.load({
+                      name: 'sentinelDashboardApp',
+                      files: [
+                          'app/scripts/controllers/cluster_app_token_client_list.js',
+                      ]
+                  });
+              }]
+          }
+      })
+
+      .state('dashboard.clusterSingle', {
+          templateUrl: 'app/views/cluster_single_config.html',
+          url: '/cluster/single/:app',
+          controller: 'SentinelClusterSingleController',
+          resolve: {
+              loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) {
+                  return $ocLazyLoad.load({
+                      name: 'sentinelDashboardApp',
+                      files: [
+                          'app/scripts/controllers/cluster_single.js',
+                      ]
+                  });
+              }]
+          }
+      })
+
+      .state('dashboard.authority', {
+            templateUrl: 'app/views/authority.html',
+            url: '/authority/:app',
+            controller: 'AuthorityRuleController',
+            resolve: {
+                loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) {
+                    return $ocLazyLoad.load({
+                        name: 'sentinelDashboardApp',
+                        files: [
+                            'app/scripts/controllers/authority.js',
+                        ]
+                    });
+                }]
+            }
+       })
+
+      .state('dashboard.degrade', {
+        templateUrl: 'app/views/degrade.html',
+        url: '/degrade/:app',
+        controller: 'DegradeCtl',
+        resolve: {
+          loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) {
+            return $ocLazyLoad.load({
+              name: 'sentinelDashboardApp',
+              files: [
+                'app/scripts/controllers/degrade.js',
+              ]
+            });
+          }]
+        }
+      })
+
+      .state('dashboard.system', {
+        templateUrl: 'app/views/system.html',
+        url: '/system/:app',
+        controller: 'SystemCtl',
+        resolve: {
+          loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) {
+            return $ocLazyLoad.load({
+              name: 'sentinelDashboardApp',
+              files: [
+                'app/scripts/controllers/system.js',
+              ]
+            });
+          }]
+        }
+      })
+
+      .state('dashboard.machine', {
+        templateUrl: 'app/views/machine.html',
+        url: '/app/:app',
+        controller: 'MachineCtl',
+        resolve: {
+          loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) {
+            return $ocLazyLoad.load({
+              name: 'sentinelDashboardApp',
+              files: [
+                'app/scripts/controllers/machine.js',
+              ]
+            });
+          }]
+        }
+      })
+
+      .state('dashboard.identity', {
+        templateUrl: 'app/views/identity.html',
+        url: '/identity/:app',
+        controller: 'IdentityCtl',
+        resolve: {
+          loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) {
+            return $ocLazyLoad.load({
+              name: 'sentinelDashboardApp',
+              files: [
+                'app/scripts/controllers/identity.js',
+              ]
+            });
+          }]
+        }
+      })
+
+      .state('dashboard.gatewayIdentity', {
+        templateUrl: 'app/views/gateway/identity.html',
+        url: '/gateway/identity/:app',
+        controller: 'GatewayIdentityCtl',
+        resolve: {
+          loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) {
+            return $ocLazyLoad.load({
+              name: 'sentinelDashboardApp',
+              files: [
+                'app/scripts/controllers/gateway/identity.js',
+              ]
+            });
+          }]
+        }
+      })
+
+      .state('dashboard.metric', {
+        templateUrl: 'app/views/metric.html',
+        url: '/metric/:app',
+        controller: 'MetricCtl',
+        resolve: {
+          loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) {
+            return $ocLazyLoad.load({
+              name: 'sentinelDashboardApp',
+              files: [
+                'app/scripts/controllers/metric.js',
+              ]
+            });
+          }]
+        }
+      })
+
+      .state('dashboard.gatewayApi', {
+        templateUrl: 'app/views/gateway/api.html',
+        url: '/gateway/api/:app',
+        controller: 'GatewayApiCtl',
+        resolve: {
+          loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) {
+            return $ocLazyLoad.load({
+              name: 'sentinelDashboardApp',
+              files: [
+                'app/scripts/controllers/gateway/api.js',
+              ]
+            });
+          }]
+        }
+      })
+
+      .state('dashboard.gatewayFlow', {
+          templateUrl: 'app/views/gateway/flow.html',
+          url: '/gateway/flow/:app',
+          controller: 'GatewayFlowCtl',
+          resolve: {
+              loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) {
+                  return $ocLazyLoad.load({
+                      name: 'sentinelDashboardApp',
+                      files: [
+                          'app/scripts/controllers/gateway/flow.js',
+                      ]
+                  });
+              }]
+          }
+      });
+  }]);
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/authority.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/authority.js
new file mode 100644
index 0000000..3d86302
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/authority.js
@@ -0,0 +1,227 @@
+/**
+ * Authority rule controller.
+ */
+angular.module('sentinelDashboardApp').controller('AuthorityRuleController', ['$scope', '$stateParams', 'AuthorityRuleService', 'ngDialog',
+    'MachineService',
+    function ($scope, $stateParams, AuthorityRuleService, ngDialog,
+              MachineService) {
+        $scope.app = $stateParams.app;
+
+        $scope.rulesPageConfig = {
+            pageSize: 10,
+            currentPageIndex: 1,
+            totalPage: 1,
+            totalCount: 0,
+        };
+        $scope.macsInputConfig = {
+            searchField: ['text', 'value'],
+            persist: true,
+            create: false,
+            maxItems: 1,
+            render: {
+                item: function (data, escape) {
+                    return '<div>' + escape(data.text) + '</div>';
+                }
+            },
+            onChange: function (value, oldValue) {
+                $scope.macInputModel = value;
+            }
+        };
+
+        function getMachineRules() {
+            if (!$scope.macInputModel) {
+                return;
+            }
+            let mac = $scope.macInputModel.split(':');
+            AuthorityRuleService.queryMachineRules($scope.app, mac[0], mac[1])
+                .success(function (data) {
+                    if (data.code === 0 && data.data) {
+                        $scope.loadError = undefined;
+                        $scope.rules = data.data;
+                        $scope.rulesPageConfig.totalCount = $scope.rules.length;
+                    } else {
+                        $scope.rules = [];
+                        $scope.rulesPageConfig.totalCount = 0;
+                        $scope.loadError = {message: data.msg};
+                    }
+                })
+                .error((data, header, config, status) => {
+                    $scope.loadError = {message: "鏈煡閿欒"};
+                });
+        };
+        $scope.getMachineRules = getMachineRules;
+        getMachineRules();
+
+        var authorityRuleDialog;
+
+        $scope.editRule = function (rule) {
+            $scope.currentRule = angular.copy(rule);
+            $scope.authorityRuleDialog = {
+                title: '缂栬緫鎺堟潈瑙勫垯',
+                type: 'edit',
+                confirmBtnText: '淇濆瓨',
+            };
+            authorityRuleDialog = ngDialog.open({
+                template: '/app/views/dialog/authority-rule-dialog.html',
+                width: 680,
+                overlay: true,
+                scope: $scope
+            });
+        };
+
+        $scope.addNewRule = function () {
+            var mac = $scope.macInputModel.split(':');
+            $scope.currentRule = {
+                app: $scope.app,
+                ip: mac[0],
+                port: mac[1],
+                rule: {
+                    strategy: 0,
+                    limitApp: '',
+                }
+            };
+            $scope.authorityRuleDialog = {
+                title: '鏂板鎺堟潈瑙勫垯',
+                type: 'add',
+                confirmBtnText: '鏂板',
+                showAdvanceButton: true,
+            };
+            authorityRuleDialog = ngDialog.open({
+                template: '/app/views/dialog/authority-rule-dialog.html',
+                width: 680,
+                overlay: true,
+                scope: $scope
+            });
+        };
+
+        $scope.saveRule = function () {
+            if (!AuthorityRuleService.checkRuleValid($scope.currentRule.rule)) {
+                return;
+            }
+            if ($scope.authorityRuleDialog.type === 'add') {
+                addNewRuleAndPush($scope.currentRule);
+            } else if ($scope.authorityRuleDialog.type === 'edit') {
+                saveRuleAndPush($scope.currentRule, true);
+            }
+        };
+
+        function addNewRuleAndPush(rule) {
+            AuthorityRuleService.addNewRule(rule).success((data) => {
+                if (data.success) {
+                    getMachineRules();
+                    authorityRuleDialog.close();
+                } else {
+                    alert('娣诲姞瑙勫垯澶辫触锛�' + data.msg);
+                }
+            }).error((data) => {
+                if (data) {
+                    alert('娣诲姞瑙勫垯澶辫触锛�' + data.msg);
+                } else {
+                    alert("娣诲姞瑙勫垯澶辫触锛氭湭鐭ラ敊璇�");
+                }
+            });
+        }
+
+        function saveRuleAndPush(rule, edit) {
+            AuthorityRuleService.saveRule(rule).success(function (data) {
+                if (data.success) {
+                    alert("淇敼瑙勫垯鎴愬姛");
+                    getMachineRules();
+                    if (edit) {
+                        authorityRuleDialog.close();
+                    } else {
+                        confirmDialog.close();
+                    }
+                } else {
+                    alert('淇敼瑙勫垯澶辫触锛�' + data.msg);
+                }
+            }).error((data) => {
+                if (data) {
+                    alert('淇敼瑙勫垯澶辫触锛�' + data.msg);
+                } else {
+                    alert("淇敼瑙勫垯澶辫触锛氭湭鐭ラ敊璇�");
+                }
+            });
+        }
+
+        function deleteRuleAndPush(entity) {
+            if (entity.id === undefined || isNaN(entity.id)) {
+                alert('瑙勫垯 ID 涓嶅悎娉曪紒');
+                return;
+            }
+            AuthorityRuleService.deleteRule(entity).success((data) => {
+                if (data.code == 0) {
+                    getMachineRules();
+                    confirmDialog.close();
+                } else {
+                    alert('鍒犻櫎瑙勫垯澶辫触锛�' + data.msg);
+                }
+            }).error((data) => {
+                if (data) {
+                    alert('鍒犻櫎瑙勫垯澶辫触锛�' + data.msg);
+                } else {
+                    alert("鍒犻櫎瑙勫垯澶辫触锛氭湭鐭ラ敊璇�");
+                }
+            });
+        };
+
+        var confirmDialog;
+        $scope.deleteRule = function (ruleEntity) {
+            $scope.currentRule = ruleEntity;
+            $scope.confirmDialog = {
+                title: '鍒犻櫎鎺堟潈瑙勫垯',
+                type: 'delete_rule',
+                attentionTitle: '璇风‘璁ゆ槸鍚﹀垹闄ゅ涓嬫巿鏉冮檺娴佽鍒�',
+                attention: '璧勬簮鍚�: ' + ruleEntity.rule.resource + ', 娴佹帶搴旂敤: ' + ruleEntity.rule.limitApp +
+                    ', 绫诲瀷: ' + (ruleEntity.rule.strategy === 0 ? '鐧藉悕鍗�' : '榛戝悕鍗�'),
+                confirmBtnText: '鍒犻櫎',
+            };
+            confirmDialog = ngDialog.open({
+                template: '/app/views/dialog/confirm-dialog.html',
+                scope: $scope,
+                overlay: true
+            });
+        };
+
+        $scope.confirm = function () {
+            if ($scope.confirmDialog.type === 'delete_rule') {
+                deleteRuleAndPush($scope.currentRule);
+            } else {
+                console.error('error');
+            }
+        };
+
+        queryAppMachines();
+
+        function queryAppMachines() {
+            MachineService.getAppMachines($scope.app).success(
+                function (data) {
+                    if (data.code == 0) {
+                        // $scope.machines = data.data;
+                        if (data.data) {
+                            $scope.machines = [];
+                            $scope.macsInputOptions = [];
+                            data.data.forEach(function (item) {
+                                if (item.healthy) {
+                                    $scope.macsInputOptions.push({
+                                        text: item.ip + ':' + item.port,
+                                        value: item.ip + ':' + item.port
+                                    });
+                                }
+                            });
+                        }
+                        if ($scope.macsInputOptions.length > 0) {
+                            $scope.macInputModel = $scope.macsInputOptions[0].value;
+                        }
+                    } else {
+                        $scope.macsInputOptions = [];
+                    }
+                }
+            );
+        };
+        $scope.$watch('macInputModel', function () {
+            if ($scope.macInputModel) {
+                getMachineRules();
+            }
+        });
+    }]);
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_assign_manage.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_assign_manage.js
new file mode 100644
index 0000000..6f9367d
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_assign_manage.js
@@ -0,0 +1,283 @@
+var app = angular.module('sentinelDashboardApp');
+
+app.controller('SentinelClusterAppAssignManageController', ['$scope', '$stateParams', 'ngDialog',
+    'MachineService', 'ClusterStateService',
+    function ($scope, $stateParams, ngDialog, MachineService, ClusterStateService) {
+        $scope.app = $stateParams.app;
+        const UNSUPPORTED_CODE = 4041;
+
+        const CLUSTER_MODE_CLIENT = 0;
+        const CLUSTER_MODE_SERVER = 1;
+        const DEFAULT_CLUSTER_SERVER_PORT = 18730;
+
+        $scope.tmp = {
+            curClientChosen: [],
+            curRemainingClientChosen: [],
+            curChosenServer: {},
+        };
+
+        function convertSetToString(set) {
+            if (set === undefined) {
+                return '';
+            }
+            let s = '';
+            for (let i = 0; i < set.length; i++) {
+                s = s + set[i];
+                if (i < set.length - 1) {
+                    s = s + ',';
+                }
+            }
+            return s;
+        }
+
+        function convertStrToNamespaceSet(str) {
+            if (str === undefined || str === '') {
+                return [];
+            }
+            let arr = [];
+            let spliced = str.split(',');
+            spliced.forEach((v) => {
+                arr.push(v.trim());
+            });
+            return arr;
+        }
+
+        function processAppSingleData(data) {
+            if (data.state.server && data.state.server.namespaceSet) {
+                data.state.server.namespaceSetStr = convertSetToString(data.state.server.namespaceSet);
+                data.mode = data.state.stateInfo.mode;
+            }
+        }
+
+        function removeFromArr(arr, v) {
+            for (let i = 0; i < arr.length; i++) {
+                if (arr[i] === v) {
+                    arr.splice(i, 1);
+                    break;
+                }
+            }
+        }
+
+        function resetChosen() {
+            $scope.tmp.curClientChosen = [];
+            $scope.tmp.curRemainingClientChosen = [];
+        }
+
+        function generateMachineId(e) {
+            return e.ip + '@' + e.commandPort;
+        }
+
+        function applyClusterMap(appClusterMachineList) {
+            if (!appClusterMachineList) {
+                return;
+            }
+            let tmpMap = new Map();
+            $scope.clusterMap = [];
+            $scope.remainingClientAddressList = [];
+            let tmpServerList = [];
+            let tmpClientList = [];
+            appClusterMachineList.forEach((e) => {
+                if (e.mode === CLUSTER_MODE_CLIENT) {
+                    tmpClientList.push(e);
+                } else if (e.mode === CLUSTER_MODE_SERVER) {
+                    tmpServerList.push(e);
+                } else {
+                    $scope.remainingClientAddressList.push(generateMachineId(e));
+                }
+            });
+            tmpServerList.forEach((e) => {
+                let ip = e.ip;
+                let machineId = ip + '@' + e.commandPort;
+                let group = {
+                    ip: ip,
+                    machineId: machineId,
+                    port: e.state.server.port,
+                    clientSet: [],
+                    namespaceSetStr: e.state.server.namespaceSetStr,
+                    belongToApp: true,
+                };
+                if (!tmpMap.has(ip)) {
+                    tmpMap.set(ip, group);
+                }
+            });
+            tmpClientList.forEach((e) => {
+                let ip = e.ip;
+                let machineId = ip + '@' + e.commandPort;
+
+                let targetServer = e.state.client.clientConfig.serverHost;
+                let targetPort = e.state.client.clientConfig.serverPort;
+                if (targetServer === undefined || targetServer === '' ||
+                    targetPort === undefined || targetPort <= 0) {
+                    $scope.remainingClientAddressList.push(generateMachineId(e));
+                    return;
+                }
+
+                if (!tmpMap.has(targetServer)) {
+                    let group = {
+                        ip: targetServer,
+                        machineId: targetServer,
+                        port: targetPort,
+                        clientSet: [machineId],
+                        belongToApp: false,
+                    };
+                    tmpMap.set(targetServer, group);
+                } else {
+                    let g = tmpMap.get(targetServer);
+                    g.clientSet.push(machineId);
+                }
+            });
+            tmpMap.forEach((v) => {
+                if (v !== undefined) {
+                    $scope.clusterMap.push(v);
+                }
+            });
+        }
+
+        $scope.onCurrentServerChange = () => {
+            resetChosen();
+        };
+
+        $scope.remainingClientAddressList = [];
+
+        $scope.moveToServerGroup = () => {
+            let chosenServer = $scope.tmp.curChosenServer;
+            if (!chosenServer || !chosenServer.machineId) {
+                return;
+            }
+            $scope.tmp.curRemainingClientChosen.forEach(e => {
+                chosenServer.clientSet.push(e);
+                removeFromArr($scope.remainingClientAddressList, e);
+            });
+            resetChosen();
+        };
+
+        $scope.moveToRemainingSharePool = () => {
+            $scope.tmp.curClientChosen.forEach(e => {
+                $scope.remainingClientAddressList.push(e);
+                removeFromArr($scope.tmp.curChosenServer.clientSet, e);
+            });
+            resetChosen();
+        };
+
+        function parseIpFromMachineId(machineId) {
+            if (machineId.indexOf('@') === -1) {
+                return machineId;
+            }
+            let arr = machineId.split('@');
+            return arr[0];
+        }
+
+        $scope.addToServerList = () => {
+            let group;
+            $scope.tmp.curRemainingClientChosen.forEach(e => {
+                group = {
+                    machineId: e,
+                    ip: parseIpFromMachineId(e),
+                    port: DEFAULT_CLUSTER_SERVER_PORT,
+                    clientSet: [],
+                    namespaceSetStr: 'default,' + $scope.app,
+                    belongToApp: true,
+                };
+                $scope.clusterMap.push(group);
+                removeFromArr($scope.remainingClientAddressList, e);
+                $scope.tmp.curChosenServer = group;
+            });
+            resetChosen();
+        };
+
+        $scope.removeFromServerList = () => {
+            let chosenServer = $scope.tmp.curChosenServer;
+            if (!chosenServer || !chosenServer.machineId) {
+                return;
+            }
+            chosenServer.clientSet.forEach((e) => {
+                if (e !== undefined) {
+                    $scope.remainingClientAddressList.push(e);
+                }
+            });
+
+            if (chosenServer.belongToApp || chosenServer.machineId.indexOf('@') !== -1) {
+                $scope.remainingClientAddressList.push(chosenServer.machineId);
+            } else {
+                alert('鎻愮ず锛氶潪鏈簲鐢ㄥ唴鏈哄櫒灏嗕笉浼氱疆鍥炵┖闂插垪琛ㄤ腑');
+            }
+
+            removeFromArr($scope.clusterMap, chosenServer);
+
+            resetChosen();
+
+            if ($scope.clusterMap.length > 0) {
+                $scope.tmp.curChosenServer = $scope.clusterMap[0];
+                $scope.onCurrentServerChange();
+            } else {
+                $scope.tmp.curChosenServer = {};
+            }
+        };
+
+        function retrieveClusterAppInfo() {
+            ClusterStateService.fetchClusterUniversalStateOfApp($scope.app).success(function (data) {
+                if (data.code === 0 && data.data) {
+                    $scope.loadError = undefined;
+                    $scope.appClusterMachineList = data.data;
+                    $scope.appClusterMachineList.forEach(processAppSingleData);
+                    applyClusterMap($scope.appClusterMachineList);
+                    if ($scope.clusterMap.length > 0) {
+                        $scope.tmp.curChosenServer = $scope.clusterMap[0];
+                        $scope.onCurrentServerChange();
+                    }
+                } else {
+                    $scope.appClusterMachineList = {};
+                    if (data.code === UNSUPPORTED_CODE) {
+                        $scope.loadError = {message: '璇ュ簲鐢ㄧ殑 Sentinel 瀹㈡埛绔笉鏀寔闆嗙兢闄愭祦锛岃鍗囩骇鑷� 1.4.0 浠ヤ笂鐗堟湰骞跺紩鍏ョ浉鍏充緷璧栥��'}
+                    } else {
+                        $scope.loadError = {message: data.msg};
+                    }
+                }
+            }).error(() => {
+                $scope.loadError = {message: '鏈煡閿欒'};
+            });
+        }
+
+        retrieveClusterAppInfo();
+
+        $scope.saveAndApplyAssign = () => {
+            let ok = confirm('鏄惁纭鎵ц鍙樻洿锛�');
+            if (!ok) {
+                return;
+            }
+            let cm = $scope.clusterMap;
+            if (!cm) {
+                cm = [];
+            }
+            cm.forEach((e) => {
+                e.namespaceSet = convertStrToNamespaceSet(e.namespaceSetStr);
+            });
+            cm.namespaceSet = convertStrToNamespaceSet(cm.namespaceSetStr);
+            let request = {
+                clusterMap: cm,
+                remainingList: $scope.remainingClientAddressList,
+            };
+            ClusterStateService.applyClusterFullAssignOfApp($scope.app, request).success((data) => {
+                if (data.code === 0 && data.data) {
+                    let failedServerSet = data.data.failedServerSet;
+                    let failedClientSet = data.data.failedClientSet;
+                    if (failedClientSet.length === 0 && failedServerSet.length === 0) {
+                        alert('鍏ㄩ儴鎺ㄩ�佹垚鍔�');
+                    } else {
+                        alert('鎺ㄩ�佸畬姣曘�倀oken server 澶辫触鍒楄〃锛�' + JSON.stringify(failedServerSet) +
+                            '; token client 澶辫触鍒楄〃锛�' + JSON.stringify(failedClientSet));
+                    }
+
+                    retrieveClusterAppInfo();
+                } else {
+                    if (data.code === UNSUPPORTED_CODE) {
+                        alert('璇ュ簲鐢ㄧ殑 Sentinel 瀹㈡埛绔笉鏀寔闆嗙兢闄愭祦锛岃鍗囩骇鑷� 1.4.0 浠ヤ笂鐗堟湰骞跺紩鍏ョ浉鍏充緷璧栥��');
+                    } else {
+                        alert('鎺ㄩ�佸け璐ワ細' + data.msg);
+                    }
+                }
+            }).error(() => {
+                alert('鏈煡閿欒');
+            });
+        };
+    }]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_server_list.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_server_list.js
new file mode 100644
index 0000000..7e1708c
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_server_list.js
@@ -0,0 +1,570 @@
+var app = angular.module('sentinelDashboardApp');
+
+app.controller('SentinelClusterAppServerListController', ['$scope', '$stateParams', 'ngDialog',
+    'MachineService', 'ClusterStateService',
+    function ($scope, $stateParams, ngDialog, MachineService, ClusterStateService) {
+        $scope.app = $stateParams.app;
+        const UNSUPPORTED_CODE = 4041;
+
+        const CLUSTER_MODE_CLIENT = 0;
+        const CLUSTER_MODE_SERVER = 1;
+        const DEFAULT_CLUSTER_SERVER_PORT = 18730;
+        const DEFAULT_NAMESPACE = 'default';
+        const DEFAULT_MAX_ALLOWED_QPS = 20000;
+
+        // tmp for dialog temporary data.
+        $scope.tmp = {
+            curClientChosen: [],
+            curRemainingClientChosen: [],
+            curChosenServer: {},
+        };
+
+        $scope.remainingMachineList = [];
+
+        function convertSetToString(set) {
+            if (set === undefined) {
+                return '';
+            }
+            if (set.length === 1 && set[0] === DEFAULT_NAMESPACE) {
+                return DEFAULT_NAMESPACE;
+            }
+            let s = '';
+            for (let i = 0; i < set.length; i++) {
+                let ns = set[i];
+                if (ns !== DEFAULT_NAMESPACE) {
+                    s = s + ns;
+                    if (i < set.length - 1) {
+                        s = s + ',';
+                    }
+                }
+            }
+            return s;
+        }
+
+        function convertStrToNamespaceSet(str) {
+            if (str === undefined || str === '') {
+                return [];
+            }
+            let arr = [];
+            let spliced = str.split(',');
+            spliced.forEach((v) => {
+                arr.push(v.trim());
+            });
+            return arr;
+        }
+
+        function processAppSingleData(data) {
+            if (data.state.server && data.state.server.namespaceSet) {
+                data.state.server.namespaceSetStr = convertSetToString(data.state.server.namespaceSet);
+                data.mode = data.state.stateInfo.mode;
+            }
+        }
+
+        function removeFromArr(arr, v) {
+            for (let i = 0; i < arr.length; i++) {
+                if (arr[i] === v) {
+                    arr.splice(i, 1);
+                    break;
+                }
+            }
+        }
+
+        function removeFromArrIf(arr, f) {
+            for (let i = 0; i < arr.length; i++) {
+                if (f(arr[i]) === true) {
+                    arr.splice(i, 1);
+                    break;
+                }
+            }
+        }
+
+        function resetAssignDialogChosen() {
+            $scope.tmp.curClientChosen = [];
+            $scope.tmp.curRemainingClientChosen = [];
+        }
+
+        function generateMachineId(e) {
+            return e.ip + '@' + e.commandPort;
+        }
+
+        function applyClusterMap(appClusterMachineList) {
+            if (!appClusterMachineList) {
+                return;
+            }
+            let tmpMap = new Map();
+            let serverCommandPortMap = new Map();
+            $scope.clusterMap = [];
+            $scope.remainingMachineList = [];
+            let tmpServerList = [];
+            let tmpClientList = [];
+            appClusterMachineList.forEach((e) => {
+                if (e.mode === CLUSTER_MODE_CLIENT) {
+                    tmpClientList.push(e);
+                } else if (e.mode === CLUSTER_MODE_SERVER) {
+                    tmpServerList.push(e);
+                } else {
+                    $scope.remainingMachineList.push(generateMachineId(e));
+                }
+            });
+            tmpServerList.forEach((e) => {
+                let ip = e.ip;
+                let machineId = ip + '@' + e.commandPort;
+                let group = {
+                    ip: ip,
+                    machineId: machineId,
+                    port: e.state.server.port,
+                    clientSet: [],
+                    namespaceSetStr: e.state.server.namespaceSetStr,
+                    maxAllowedQps: e.state.server.flow.maxAllowedQps,
+                    belongToApp: true,
+                };
+                if (!tmpMap.has(machineId)) {
+                    tmpMap.set(machineId, group);
+                }
+                serverCommandPortMap.set(ip + ':' + e.state.server.port, e.commandPort);
+            });
+            tmpClientList.forEach((e) => {
+                let ip = e.ip;
+                let machineId = ip + '@' + e.commandPort;
+
+                let targetServer = e.state.client.clientConfig.serverHost;
+                let targetPort = e.state.client.clientConfig.serverPort;
+                if (targetServer === undefined || targetServer === '' ||
+                    targetPort === undefined || targetPort <= 0) {
+                    $scope.remainingMachineList.push(generateMachineId(e));
+                    return;
+                }
+
+                let serverHostPort = targetServer + ':' + targetPort;
+
+                if (serverCommandPortMap.has(serverHostPort)) {
+                    let serverCommandPort = serverCommandPortMap.get(serverHostPort);
+                    let g;
+                    if (serverCommandPort < 0) {
+                        // Not belong to this app.
+                        g = tmpMap.get(serverHostPort);
+                    } else {
+                        // Belong to this app.
+                        g = tmpMap.get(targetServer + '@' + serverCommandPort);
+                    }
+                    g.clientSet.push(machineId);
+                } else {
+                    let group = {
+                        ip: targetServer,
+                        machineId: serverHostPort,
+                        port: targetPort,
+                        clientSet: [machineId],
+                        belongToApp: false,
+                    };
+                    tmpMap.set(serverHostPort, group);
+                    // Indicates that it's not belonging to current app.
+                    serverCommandPortMap.set(serverHostPort, -1);
+                }
+
+                // if (!tmpMap.has(serverHostPort)) {
+                //     let group = {
+                //         ip: targetServer,
+                //         machineId: targetServer,
+                //         port: targetPort,
+                //         clientSet: [machineId],
+                //         belongToApp: false,
+                //     };
+                //     tmpMap.set(targetServer, group);
+                // } else {
+                //     let g = tmpMap.get(targetServer);
+                //     g.clientSet.push(machineId);
+                // }
+            });
+            tmpMap.forEach((v) => {
+                if (v !== undefined) {
+                    $scope.clusterMap.push(v);
+                }
+            });
+        }
+
+        $scope.notChosenServer = (id) => {
+            return id !== $scope.serverAssignDialogData.serverData.currentServer;
+        };
+
+        $scope.onCurrentServerChange = () => {
+            resetAssignDialogChosen();
+        };
+
+        $scope.moveToServerGroup = () => {
+            $scope.tmp.curRemainingClientChosen.forEach(e => {
+                $scope.serverAssignDialogData.serverData.clientSet.push(e);
+                removeFromArr($scope.remainingMachineList, e);
+            });
+            resetAssignDialogChosen();
+        };
+
+        $scope.moveToRemainingSharePool = () => {
+            $scope.tmp.curClientChosen.forEach(e => {
+                $scope.remainingMachineList.push(e);
+                removeFromArr($scope.serverAssignDialogData.serverData.clientSet, e);
+            });
+            resetAssignDialogChosen();
+        };
+
+        function parseIpFromMachineId(machineId) {
+            if (machineId.indexOf(':') !== -1) {
+                return machineId.split(':')[0];
+            }
+            if (machineId.indexOf('@') === -1) {
+                return machineId;
+            }
+            let arr = machineId.split('@');
+            return arr[0];
+        }
+
+        function retrieveClusterAssignInfoOfApp() {
+            ClusterStateService.fetchClusterUniversalStateOfApp($scope.app).success(function (data) {
+                if (data.code === 0 && data.data) {
+                    $scope.loadError = undefined;
+                    $scope.appClusterMachineList = data.data;
+                    $scope.appClusterMachineList.forEach(processAppSingleData);
+                    applyClusterMap($scope.appClusterMachineList);
+                } else {
+                    $scope.appClusterMachineList = {};
+                    if (data.code === UNSUPPORTED_CODE) {
+                        $scope.loadError = {message: '璇ュ簲鐢ㄧ殑 Sentinel 瀹㈡埛绔笉鏀寔闆嗙兢闄愭祦锛岃鍗囩骇鑷� 1.4.0 浠ヤ笂鐗堟湰骞跺紩鍏ョ浉鍏充緷璧栥��'}
+                    } else {
+                        $scope.loadError = {message: data.msg};
+                    }
+                }
+            }).error(() => {
+                $scope.loadError = {message: '鏈煡閿欒'};
+            });
+        }
+
+
+        $scope.newServerDialog = () => {
+            retrieveClusterAssignInfoOfApp();
+            $scope.serverAssignDialogData = {
+                title: '鏂板 Token Server',
+                type: 'add',
+                confirmBtnText: '淇濆瓨',
+                serverData: {
+                    serverType: 0,
+                    clientSet: [],
+                    serverPort: DEFAULT_CLUSTER_SERVER_PORT,
+                    maxAllowedQps: DEFAULT_MAX_ALLOWED_QPS,
+                }
+            };
+            $scope.serverAssignDialog = ngDialog.open({
+                template: '/app/views/dialog/cluster/cluster-server-assign-dialog.html',
+                width: 1000,
+                overlay: true,
+                scope: $scope
+            });
+        };
+
+        $scope.modifyServerAssignConfig = (serverVO) => {
+            let id = serverVO.id;
+            ClusterStateService.fetchClusterUniversalStateOfApp($scope.app).success(function (data) {
+                if (data.code === 0 && data.data) {
+                    $scope.loadError = undefined;
+                    $scope.appClusterMachineList = data.data;
+                    $scope.appClusterMachineList.forEach(processAppSingleData);
+                    applyClusterMap($scope.appClusterMachineList);
+                    let clusterMap = $scope.clusterMap;
+                    let d;
+                    for (let i = 0; i < clusterMap.length; i++) {
+                        if (clusterMap[i].machineId === id) {
+                            d = clusterMap[i];
+                        }
+                    }
+                    if (!d) {
+                        alert('鐘舵�侀敊璇�');
+                        return;
+                    }
+                    $scope.serverAssignDialogData = {
+                        title: 'Token Server 鍒嗛厤缂栬緫',
+                        type: 'edit',
+                        confirmBtnText: '淇濆瓨',
+                        serverData: {
+                            currentServer: d.machineId,
+                            belongToApp: serverVO.belongToApp,
+                            serverPort: d.port,
+                            clientSet: d.clientSet,
+                        }
+                    };
+                    if (d.maxAllowedQps !== undefined) {
+                        $scope.serverAssignDialogData.serverData.maxAllowedQps = d.maxAllowedQps;
+                    }
+                    $scope.serverAssignDialog = ngDialog.open({
+                        template: '/app/views/dialog/cluster/cluster-server-assign-dialog.html',
+                        width: 1000,
+                        overlay: true,
+                        scope: $scope
+                    });
+                } else {
+                    if (data.code === UNSUPPORTED_CODE) {
+                        $scope.loadError = {message: '璇ュ簲鐢ㄧ殑 Sentinel 瀹㈡埛绔笉鏀寔闆嗙兢闄愭祦锛岃鍗囩骇鑷� 1.4.0 浠ヤ笂鐗堟湰骞跺紩鍏ョ浉鍏充緷璧栥��'}
+                    } else {
+                        $scope.loadError = {message: data.msg};
+                    }
+                }
+            }).error(() => {
+                $scope.loadError = {message: '鏈煡閿欒'};
+            });
+        };
+
+        function getRemainingMachineList() {
+            return $scope.remainingMachineList.filter((e) => $scope.notChosenServer(e));
+        }
+
+        function doApplyNewSingleServerAssign() {
+            let ok = confirm('鏄惁纭鎵ц鍙樻洿锛�');
+            if (!ok) {
+                return;
+            }
+            let serverData = $scope.serverAssignDialogData.serverData;
+            let belongToApp = serverData.serverType == 0; // don't modify here!
+            let machineId = serverData.currentServer;
+            let request = {
+                clusterMap: {
+                    machineId: machineId,
+                    ip: parseIpFromMachineId(machineId),
+                    port: serverData.serverPort,
+                    clientSet: serverData.clientSet,
+                    belongToApp: belongToApp,
+                    maxAllowedQps: serverData.maxAllowedQps,
+                },
+                remainingList: getRemainingMachineList(),
+            };
+            ClusterStateService.applyClusterSingleServerAssignOfApp($scope.app, request).success((data) => {
+                if (data.code === 0 && data.data) {
+                    let failedServerSet = data.data.failedServerSet;
+                    let failedClientSet = data.data.failedClientSet;
+                    if (failedClientSet.length === 0 && failedServerSet.length === 0) {
+                        alert('鍏ㄩ儴鎺ㄩ�佹垚鍔�');
+                    } else {
+                        let failedSet = [];
+                        if (failedServerSet) {
+                            failedServerSet.forEach((e) => {
+                                failedSet.push(e);
+                            });
+                        }
+                        if (failedClientSet) {
+                            failedClientSet.forEach((e) => {
+                                failedSet.push(e);
+                            });
+                        }
+
+                        alert('鎺ㄩ�佸畬姣曘�傚け璐ユ満鍣ㄥ垪琛細' + JSON.stringify(failedSet));
+                    }
+
+                    location.reload();
+                } else {
+                    if (data.code === UNSUPPORTED_CODE) {
+                        alert('璇ュ簲鐢ㄧ殑 Sentinel 瀹㈡埛绔笉鏀寔闆嗙兢闄愭祦锛岃鍗囩骇鑷� 1.4.0 浠ヤ笂鐗堟湰骞跺紩鍏ョ浉鍏充緷璧栥��');
+                    } else {
+                        alert('鎺ㄩ�佸け璐ワ細' + data.msg);
+                    }
+                }
+            }).error(() => {
+                alert('鏈煡閿欒');
+            });
+        }
+
+        function doApplySingleServerAssignEdit() {
+            let ok = confirm('鏄惁纭鎵ц鍙樻洿锛�');
+            if (!ok) {
+                return;
+            }
+            let serverData = $scope.serverAssignDialogData.serverData;
+            let machineId = serverData.currentServer;
+            let request = {
+                clusterMap: {
+                    machineId: machineId,
+                    ip: parseIpFromMachineId(machineId),
+                    port: serverData.serverPort,
+                    clientSet: serverData.clientSet,
+                    belongToApp: serverData.belongToApp,
+                },
+                remainingList: $scope.remainingMachineList,
+            };
+            if (serverData.maxAllowedQps !== undefined) {
+                request.clusterMap.maxAllowedQps = serverData.maxAllowedQps;
+            }
+            ClusterStateService.applyClusterSingleServerAssignOfApp($scope.app, request).success((data) => {
+                if (data.code === 0 && data.data) {
+                    let failedServerSet = data.data.failedServerSet;
+                    let failedClientSet = data.data.failedClientSet;
+                    if (failedClientSet.length === 0 && failedServerSet.length === 0) {
+                        alert('鍏ㄩ儴鎺ㄩ�佹垚鍔�');
+                    } else {
+                        let failedSet = [];
+                        failedServerSet.forEach(failedSet.push);
+                        failedClientSet.forEach(failedSet.push);
+                        alert('鎺ㄩ�佸畬姣曘�傚け璐ユ満鍣ㄥ垪琛細' + JSON.stringify(failedSet));
+                    }
+
+                    location.reload();
+                } else {
+                    if (data.code === UNSUPPORTED_CODE) {
+                        alert('璇ュ簲鐢ㄧ殑 Sentinel 瀹㈡埛绔笉鏀寔闆嗙兢闄愭祦锛岃鍗囩骇鑷� 1.4.0 浠ヤ笂鐗堟湰骞跺紩鍏ョ浉鍏充緷璧栥��');
+                    } else {
+                        alert('鎺ㄩ�佸け璐ワ細' + data.msg);
+                    }
+                }
+            }).error(() => {
+                alert('鏈煡閿欒');
+            });
+        }
+
+        $scope.saveAssignForDialog = () => {
+            if (!checkAssignDialogValid()) {
+                return;
+            }
+            if ($scope.serverAssignDialogData.type === 'add') {
+                doApplyNewSingleServerAssign();
+            } else if ($scope.serverAssignDialogData.type === 'edit') {
+                doApplySingleServerAssignEdit();
+            } else {
+                alert('鏈煡鐨勬搷浣�');
+            }
+        };
+
+        function checkAssignDialogValid() {
+            let serverData = $scope.serverAssignDialogData.serverData;
+            if (serverData.currentServer === undefined || serverData.currentServer === '') {
+                alert('璇锋寚瀹氭湁鏁堢殑 Token Server');
+                return false;
+            }
+            if (serverData.serverPort === undefined || serverData.serverPort <= 0 || serverData.serverPort > 65535) {
+                alert('璇疯緭鍏ュ悎娉曠殑绔彛鍊�');
+                return false;
+            }
+            if (serverData.maxAllowedQps !== undefined && serverData.maxAllowedQps < 0) {
+                alert('璇疯緭鍏ュ悎娉曠殑鏈�澶у厑璁� QPS');
+                return false;
+            }
+            return true;
+        }
+
+        $scope.viewConnectionDetail = (serverVO) => {
+            $scope.connectionDetailDialogData = {
+                serverData: serverVO
+            };
+            $scope.connectionDetailDialog = ngDialog.open({
+                template: '/app/views/dialog/cluster/cluster-server-connection-detail-dialog.html',
+                width: 700,
+                overlay: true,
+                scope: $scope
+            });
+        };
+
+        function generateRequestLimitDataStr(limitData) {
+            if (limitData.length === 1 && limitData[0].namespace === DEFAULT_NAMESPACE) {
+                 return 'default: ' + limitData[0].currentQps + ' / ' + limitData[0].maxAllowedQps;
+            }
+            for (let i = 0; i < limitData.length; i++) {
+                let crl = limitData[i];
+                if (crl.namespace === $scope.app) {
+                    return '' + crl.currentQps + ' / ' + crl.maxAllowedQps;
+                }
+            }
+            return '0';
+        }
+
+        function processServerListData(serverVO) {
+            if (serverVO.state && serverVO.state.namespaceSet) {
+                serverVO.state.namespaceSetStr = convertSetToString(serverVO.state.namespaceSet);
+            }
+            if (serverVO.state && serverVO.state.requestLimitData) {
+                serverVO.state.requestLimitDataStr = generateRequestLimitDataStr(serverVO.state.requestLimitData);
+            }
+        }
+
+        $scope.generateConnectionSet = (data) => {
+            let connectionSet = data;
+            let s = '';
+            if (connectionSet) {
+                s = s + '[';
+                for (let i = 0; i < connectionSet.length; i++) {
+                    s = s + connectionSet[i].address;
+                    if (i < connectionSet.length - 1) {
+                        s = s + ', ';
+                    }
+                }
+                s = s + ']';
+            } else {
+                s = '[]';
+            }
+            return s;
+        };
+
+        function retrieveClusterServerInfo() {
+            ClusterStateService.fetchClusterServerStateOfApp($scope.app).success(function (data) {
+                if (data.code === 0 && data.data) {
+                    $scope.loadError = undefined;
+                    $scope.serverVOList = data.data;
+                    $scope.serverVOList.forEach(processServerListData);
+                } else {
+                    $scope.serverVOList = {};
+                    if (data.code === UNSUPPORTED_CODE) {
+                        $scope.loadError = {message: '璇ュ簲鐢ㄧ殑 Sentinel 瀹㈡埛绔笉鏀寔闆嗙兢闄愭祦锛岃鍗囩骇鑷� 1.4.0 浠ヤ笂鐗堟湰骞跺紩鍏ョ浉鍏充緷璧栥��'}
+                    } else {
+                        $scope.loadError = {message: data.msg};
+                    }
+                }
+            }).error(() => {
+                $scope.loadError = {message: '鏈煡閿欒'};
+            });
+        }
+
+        retrieveClusterServerInfo();
+
+        let confirmUnbindServerDialog;
+        $scope.unbindServer = (id) => {
+            $scope.pendingUnbindIds = [id];
+            $scope.confirmDialog = {
+                title: '绉婚櫎 Token Server',
+                type: 'unbind_token_server',
+                attentionTitle: '璇风‘璁ゆ槸鍚︾Щ闄や互涓� Token Server锛堣 server 涓嬬殑 client 涔熶細瑙i櫎鍒嗛厤锛�',
+                attention: id + '',
+                confirmBtnText: '绉婚櫎',
+            };
+            confirmUnbindServerDialog = ngDialog.open({
+                template: '/app/views/dialog/confirm-dialog.html',
+                scope: $scope,
+                overlay: true
+            });
+        };
+
+        function apiUnbindServerAssign(ids) {
+            ClusterStateService.applyClusterServerBatchUnbind($scope.app, ids).success((data) => {
+                if (data.code === 0 && data.data) {
+                    let failedServerSet = data.data.failedServerSet;
+                    let failedClientSet = data.data.failedClientSet;
+                    if (failedClientSet.length === 0 && failedServerSet.length === 0) {
+                        alert('鎴愬姛');
+                    } else {
+                        alert('鎿嶄綔鎺ㄩ�佸畬姣曪紝閮ㄥ垎澶辫触鏈哄櫒鍒楄〃锛�' + JSON.stringify(failedClientSet));
+                    }
+
+                    location.reload();
+                } else {
+                    if (data.code === UNSUPPORTED_CODE) {
+                        alert('璇ュ簲鐢ㄧ殑 Sentinel 瀹㈡埛绔笉鏀寔闆嗙兢闄愭祦锛岃鍗囩骇鑷� 1.4.0 浠ヤ笂鐗堟湰骞跺紩鍏ョ浉鍏充緷璧栥��');
+                    } else {
+                        alert('鎺ㄩ�佸け璐ワ細' + data.msg);
+                    }
+                }
+            }).error(() => {
+                alert('鏈煡閿欒');
+            });
+            // confirmUnbindServerDialog.close();
+        }
+
+        // Confirm function for confirm dialog.
+        $scope.confirm = () => {
+            if ($scope.confirmDialog.type === 'unbind_token_server') {
+                apiUnbindServerAssign($scope.pendingUnbindIds);
+            } else {
+                console.error('Error dialog when unbinding token server');
+            }
+        };
+    }]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_server_manage.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_server_manage.js
new file mode 100644
index 0000000..6f9367d
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_server_manage.js
@@ -0,0 +1,283 @@
+var app = angular.module('sentinelDashboardApp');
+
+app.controller('SentinelClusterAppAssignManageController', ['$scope', '$stateParams', 'ngDialog',
+    'MachineService', 'ClusterStateService',
+    function ($scope, $stateParams, ngDialog, MachineService, ClusterStateService) {
+        $scope.app = $stateParams.app;
+        const UNSUPPORTED_CODE = 4041;
+
+        const CLUSTER_MODE_CLIENT = 0;
+        const CLUSTER_MODE_SERVER = 1;
+        const DEFAULT_CLUSTER_SERVER_PORT = 18730;
+
+        $scope.tmp = {
+            curClientChosen: [],
+            curRemainingClientChosen: [],
+            curChosenServer: {},
+        };
+
+        function convertSetToString(set) {
+            if (set === undefined) {
+                return '';
+            }
+            let s = '';
+            for (let i = 0; i < set.length; i++) {
+                s = s + set[i];
+                if (i < set.length - 1) {
+                    s = s + ',';
+                }
+            }
+            return s;
+        }
+
+        function convertStrToNamespaceSet(str) {
+            if (str === undefined || str === '') {
+                return [];
+            }
+            let arr = [];
+            let spliced = str.split(',');
+            spliced.forEach((v) => {
+                arr.push(v.trim());
+            });
+            return arr;
+        }
+
+        function processAppSingleData(data) {
+            if (data.state.server && data.state.server.namespaceSet) {
+                data.state.server.namespaceSetStr = convertSetToString(data.state.server.namespaceSet);
+                data.mode = data.state.stateInfo.mode;
+            }
+        }
+
+        function removeFromArr(arr, v) {
+            for (let i = 0; i < arr.length; i++) {
+                if (arr[i] === v) {
+                    arr.splice(i, 1);
+                    break;
+                }
+            }
+        }
+
+        function resetChosen() {
+            $scope.tmp.curClientChosen = [];
+            $scope.tmp.curRemainingClientChosen = [];
+        }
+
+        function generateMachineId(e) {
+            return e.ip + '@' + e.commandPort;
+        }
+
+        function applyClusterMap(appClusterMachineList) {
+            if (!appClusterMachineList) {
+                return;
+            }
+            let tmpMap = new Map();
+            $scope.clusterMap = [];
+            $scope.remainingClientAddressList = [];
+            let tmpServerList = [];
+            let tmpClientList = [];
+            appClusterMachineList.forEach((e) => {
+                if (e.mode === CLUSTER_MODE_CLIENT) {
+                    tmpClientList.push(e);
+                } else if (e.mode === CLUSTER_MODE_SERVER) {
+                    tmpServerList.push(e);
+                } else {
+                    $scope.remainingClientAddressList.push(generateMachineId(e));
+                }
+            });
+            tmpServerList.forEach((e) => {
+                let ip = e.ip;
+                let machineId = ip + '@' + e.commandPort;
+                let group = {
+                    ip: ip,
+                    machineId: machineId,
+                    port: e.state.server.port,
+                    clientSet: [],
+                    namespaceSetStr: e.state.server.namespaceSetStr,
+                    belongToApp: true,
+                };
+                if (!tmpMap.has(ip)) {
+                    tmpMap.set(ip, group);
+                }
+            });
+            tmpClientList.forEach((e) => {
+                let ip = e.ip;
+                let machineId = ip + '@' + e.commandPort;
+
+                let targetServer = e.state.client.clientConfig.serverHost;
+                let targetPort = e.state.client.clientConfig.serverPort;
+                if (targetServer === undefined || targetServer === '' ||
+                    targetPort === undefined || targetPort <= 0) {
+                    $scope.remainingClientAddressList.push(generateMachineId(e));
+                    return;
+                }
+
+                if (!tmpMap.has(targetServer)) {
+                    let group = {
+                        ip: targetServer,
+                        machineId: targetServer,
+                        port: targetPort,
+                        clientSet: [machineId],
+                        belongToApp: false,
+                    };
+                    tmpMap.set(targetServer, group);
+                } else {
+                    let g = tmpMap.get(targetServer);
+                    g.clientSet.push(machineId);
+                }
+            });
+            tmpMap.forEach((v) => {
+                if (v !== undefined) {
+                    $scope.clusterMap.push(v);
+                }
+            });
+        }
+
+        $scope.onCurrentServerChange = () => {
+            resetChosen();
+        };
+
+        $scope.remainingClientAddressList = [];
+
+        $scope.moveToServerGroup = () => {
+            let chosenServer = $scope.tmp.curChosenServer;
+            if (!chosenServer || !chosenServer.machineId) {
+                return;
+            }
+            $scope.tmp.curRemainingClientChosen.forEach(e => {
+                chosenServer.clientSet.push(e);
+                removeFromArr($scope.remainingClientAddressList, e);
+            });
+            resetChosen();
+        };
+
+        $scope.moveToRemainingSharePool = () => {
+            $scope.tmp.curClientChosen.forEach(e => {
+                $scope.remainingClientAddressList.push(e);
+                removeFromArr($scope.tmp.curChosenServer.clientSet, e);
+            });
+            resetChosen();
+        };
+
+        function parseIpFromMachineId(machineId) {
+            if (machineId.indexOf('@') === -1) {
+                return machineId;
+            }
+            let arr = machineId.split('@');
+            return arr[0];
+        }
+
+        $scope.addToServerList = () => {
+            let group;
+            $scope.tmp.curRemainingClientChosen.forEach(e => {
+                group = {
+                    machineId: e,
+                    ip: parseIpFromMachineId(e),
+                    port: DEFAULT_CLUSTER_SERVER_PORT,
+                    clientSet: [],
+                    namespaceSetStr: 'default,' + $scope.app,
+                    belongToApp: true,
+                };
+                $scope.clusterMap.push(group);
+                removeFromArr($scope.remainingClientAddressList, e);
+                $scope.tmp.curChosenServer = group;
+            });
+            resetChosen();
+        };
+
+        $scope.removeFromServerList = () => {
+            let chosenServer = $scope.tmp.curChosenServer;
+            if (!chosenServer || !chosenServer.machineId) {
+                return;
+            }
+            chosenServer.clientSet.forEach((e) => {
+                if (e !== undefined) {
+                    $scope.remainingClientAddressList.push(e);
+                }
+            });
+
+            if (chosenServer.belongToApp || chosenServer.machineId.indexOf('@') !== -1) {
+                $scope.remainingClientAddressList.push(chosenServer.machineId);
+            } else {
+                alert('鎻愮ず锛氶潪鏈簲鐢ㄥ唴鏈哄櫒灏嗕笉浼氱疆鍥炵┖闂插垪琛ㄤ腑');
+            }
+
+            removeFromArr($scope.clusterMap, chosenServer);
+
+            resetChosen();
+
+            if ($scope.clusterMap.length > 0) {
+                $scope.tmp.curChosenServer = $scope.clusterMap[0];
+                $scope.onCurrentServerChange();
+            } else {
+                $scope.tmp.curChosenServer = {};
+            }
+        };
+
+        function retrieveClusterAppInfo() {
+            ClusterStateService.fetchClusterUniversalStateOfApp($scope.app).success(function (data) {
+                if (data.code === 0 && data.data) {
+                    $scope.loadError = undefined;
+                    $scope.appClusterMachineList = data.data;
+                    $scope.appClusterMachineList.forEach(processAppSingleData);
+                    applyClusterMap($scope.appClusterMachineList);
+                    if ($scope.clusterMap.length > 0) {
+                        $scope.tmp.curChosenServer = $scope.clusterMap[0];
+                        $scope.onCurrentServerChange();
+                    }
+                } else {
+                    $scope.appClusterMachineList = {};
+                    if (data.code === UNSUPPORTED_CODE) {
+                        $scope.loadError = {message: '璇ュ簲鐢ㄧ殑 Sentinel 瀹㈡埛绔笉鏀寔闆嗙兢闄愭祦锛岃鍗囩骇鑷� 1.4.0 浠ヤ笂鐗堟湰骞跺紩鍏ョ浉鍏充緷璧栥��'}
+                    } else {
+                        $scope.loadError = {message: data.msg};
+                    }
+                }
+            }).error(() => {
+                $scope.loadError = {message: '鏈煡閿欒'};
+            });
+        }
+
+        retrieveClusterAppInfo();
+
+        $scope.saveAndApplyAssign = () => {
+            let ok = confirm('鏄惁纭鎵ц鍙樻洿锛�');
+            if (!ok) {
+                return;
+            }
+            let cm = $scope.clusterMap;
+            if (!cm) {
+                cm = [];
+            }
+            cm.forEach((e) => {
+                e.namespaceSet = convertStrToNamespaceSet(e.namespaceSetStr);
+            });
+            cm.namespaceSet = convertStrToNamespaceSet(cm.namespaceSetStr);
+            let request = {
+                clusterMap: cm,
+                remainingList: $scope.remainingClientAddressList,
+            };
+            ClusterStateService.applyClusterFullAssignOfApp($scope.app, request).success((data) => {
+                if (data.code === 0 && data.data) {
+                    let failedServerSet = data.data.failedServerSet;
+                    let failedClientSet = data.data.failedClientSet;
+                    if (failedClientSet.length === 0 && failedServerSet.length === 0) {
+                        alert('鍏ㄩ儴鎺ㄩ�佹垚鍔�');
+                    } else {
+                        alert('鎺ㄩ�佸畬姣曘�倀oken server 澶辫触鍒楄〃锛�' + JSON.stringify(failedServerSet) +
+                            '; token client 澶辫触鍒楄〃锛�' + JSON.stringify(failedClientSet));
+                    }
+
+                    retrieveClusterAppInfo();
+                } else {
+                    if (data.code === UNSUPPORTED_CODE) {
+                        alert('璇ュ簲鐢ㄧ殑 Sentinel 瀹㈡埛绔笉鏀寔闆嗙兢闄愭祦锛岃鍗囩骇鑷� 1.4.0 浠ヤ笂鐗堟湰骞跺紩鍏ョ浉鍏充緷璧栥��');
+                    } else {
+                        alert('鎺ㄩ�佸け璐ワ細' + data.msg);
+                    }
+                }
+            }).error(() => {
+                alert('鏈煡閿欒');
+            });
+        };
+    }]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_server_monitor.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_server_monitor.js
new file mode 100644
index 0000000..202fca1
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_server_monitor.js
@@ -0,0 +1,97 @@
+var app = angular.module('sentinelDashboardApp');
+
+app.controller('SentinelClusterAppServerMonitorController', ['$scope', '$stateParams', 'ngDialog',
+    'MachineService', 'ClusterStateService',
+    function ($scope, $stateParams, ngDialog, MachineService, ClusterStateService) {
+        $scope.app = $stateParams.app;
+        const UNSUPPORTED_CODE = 4041;
+
+        const CLUSTER_MODE_SERVER = 1;
+
+        $scope.tmp = {
+            curChosenServer: {},
+        };
+
+        function convertSetToString(set) {
+            if (set === undefined) {
+                return '';
+            }
+            let s = '';
+            for (let i = 0; i < set.length; i++) {
+                s = s + set[i];
+                if (i < set.length - 1) {
+                    s = s + ',';
+                }
+            }
+            return s;
+        }
+
+        function processServerData(serverVO) {
+            if (serverVO.state && serverVO.state.namespaceSet) {
+                serverVO.state.namespaceSetStr = convertSetToString(serverVO.state.namespaceSet);
+            }
+        }
+
+        $scope.generateConnectionSet = (data) => {
+            let connectionSet = data;
+            let s = '';
+            if (connectionSet) {
+                s = s + '[';
+                for (let i = 0; i < connectionSet.length; i++) {
+                    s = s + connectionSet[i].address;
+                    if (i < connectionSet.length - 1) {
+                        s = s + ', ';
+                    }
+                }
+                s = s + ']';
+            } else {
+                s = '[]';
+            }
+            return s;
+        };
+
+        $scope.onChosenServerChange = () => {
+
+        };
+
+        function retrieveClusterServerInfo() {
+            ClusterStateService.fetchClusterServerStateOfApp($scope.app).success(function (data) {
+                if (data.code === 0 && data.data) {
+                    $scope.loadError = undefined;
+                    $scope.serverVOList = data.data;
+                    $scope.serverVOList.forEach(processServerData);
+
+                    if ($scope.serverVOList.length > 0) {
+                        $scope.tmp.curChosenServer = $scope.serverVOList[0];
+                        $scope.onChosenServerChange();
+                    }
+                } else {
+                    $scope.serverVOList = {};
+                    if (data.code === UNSUPPORTED_CODE) {
+                        $scope.loadError = {message: '璇ュ簲鐢ㄧ殑 Sentinel 瀹㈡埛绔笉鏀寔闆嗙兢闄愭祦锛岃鍗囩骇鑷� 1.4.0 浠ヤ笂鐗堟湰骞跺紩鍏ョ浉鍏充緷璧栥��'}
+                    } else {
+                        $scope.loadError = {message: data.msg};
+                    }
+                }
+            }).error(() => {
+                $scope.loadError = {message: '鏈煡閿欒'};
+            });
+        }
+
+        retrieveClusterServerInfo();
+
+        $scope.macsInputConfig = {
+            searchField: ['text', 'value'],
+            persist: true,
+            create: false,
+            maxItems: 1,
+            render: {
+                item: function (data, escape) {
+                    return '<div>' + escape(data.text) + '</div>';
+                }
+            },
+            onChange: function (value, oldValue) {
+                $scope.macInputModel = value;
+            }
+        };
+    }]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_token_client_list.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_token_client_list.js
new file mode 100644
index 0000000..177161b
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_token_client_list.js
@@ -0,0 +1,121 @@
+var app = angular.module('sentinelDashboardApp');
+
+app.controller('SentinelClusterAppTokenClientListController', ['$scope', '$stateParams', 'ngDialog',
+    'MachineService', 'ClusterStateService',
+    function ($scope, $stateParams, ngDialog, MachineService, ClusterStateService) {
+        $scope.app = $stateParams.app;
+
+        const UNSUPPORTED_CODE = 4041;
+        const CLUSTER_MODE_CLIENT = 0;
+        const CLUSTER_MODE_SERVER = 1;
+
+        function processClientData(clientVO) {
+
+        }
+
+        $scope.modifyClientConfigDialog = (clientVO) => {
+            if (!clientVO) {
+                return;
+            }
+            $scope.ccDialogData = {
+                ip: clientVO.ip,
+                commandPort: clientVO.commandPort,
+                clientId: clientVO.id,
+                serverHost: clientVO.state.clientConfig.serverHost,
+                serverPort: clientVO.state.clientConfig.serverPort,
+                requestTimeout: clientVO.state.clientConfig.requestTimeout,
+            };
+            $scope.ccDialog = ngDialog.open({
+                template: '/app/views/dialog/cluster/cluster-client-config-dialog.html',
+                width: 700,
+                overlay: true,
+                scope: $scope
+            });
+        };
+
+        function checkValidClientConfig(config) {
+            if (!config.serverHost || config.serverHost.trim() == '') {
+                alert('璇疯緭鍏ユ湁鏁堢殑 Token Server IP');
+                return false;
+            }
+            if (config.serverPort === undefined || config.serverPort <= 0 ||  config.serverPort > 65535) {
+                alert('璇疯緭鍏ユ湁鏁堢殑 Token Server 绔彛');
+                return false;
+            }
+            if (config.requestTimeout === undefined || config.requestTimeout <= 0) {
+                alert('璇疯緭鍏ユ湁鏁堢殑璇锋眰瓒呮椂鏃堕暱');
+                return false;
+            }
+            return true;
+        }
+
+        $scope.doModifyClientConfig = () => {
+            if (!checkValidClientConfig($scope.ccDialogData)) {
+                return;
+            }
+            let id = $scope.ccDialogData.id;
+            let request = {
+                app: $scope.app,
+                ip: $scope.ccDialogData.ip,
+                port: $scope.ccDialogData.commandPort,
+                mode: CLUSTER_MODE_CLIENT,
+                clientConfig: {
+                    serverHost: $scope.ccDialogData.serverHost,
+                    serverPort: $scope.ccDialogData.serverPort,
+                    requestTimeout: $scope.ccDialogData.requestTimeout,
+                }
+            };
+            ClusterStateService.modifyClusterConfig(request).success((data) => {
+                if (data.code === 0 && data.data) {
+                    alert('淇敼 Token Client 閰嶇疆鎴愬姛');
+                    window.location.reload();
+                } else {
+                    if (data.code === UNSUPPORTED_CODE) {
+                        alert('鏈哄櫒 ' + id + ' 鐨� Sentinel 娌℃湁寮曞叆闆嗙兢闄愭祦瀹㈡埛绔紝璇峰崌绾ц嚦 1.4.0 浠ヤ笂鐗堟湰骞跺紩鍏ョ浉鍏充緷璧栥��');
+                    } else {
+                        alert('淇敼澶辫触锛�' + data.msg);
+                    }
+                }
+            }).error((data, header, config, status) => {
+                alert('鏈煡閿欒');
+            });
+        };
+
+        function retrieveClusterTokenClientInfo() {
+            ClusterStateService.fetchClusterClientStateOfApp($scope.app)
+                .success((data) => {
+                    if (data.code === 0 && data.data) {
+                        $scope.loadError = undefined;
+                        $scope.clientVOList = data.data;
+                        $scope.clientVOList.forEach(processClientData);
+                    } else {
+                        $scope.clientVOList = [];
+                        if (data.code === UNSUPPORTED_CODE) {
+                            $scope.loadError = {message: '璇ュ簲鐢ㄧ殑 Sentinel 瀹㈡埛绔笉鏀寔闆嗙兢闄愭祦锛岃鍗囩骇鑷� 1.4.0 浠ヤ笂鐗堟湰骞跺紩鍏ョ浉鍏充緷璧栥��'}
+                        } else {
+                            $scope.loadError = {message: data.msg};
+                        }
+                    }
+                })
+                .error(() => {
+                    $scope.loadError = {message: '鏈煡閿欒'};
+                });
+        }
+
+        retrieveClusterTokenClientInfo();
+
+        $scope.macsInputConfig = {
+            searchField: ['text', 'value'],
+            persist: true,
+            create: false,
+            maxItems: 1,
+            render: {
+                item: function (data, escape) {
+                    return '<div>' + escape(data.text) + '</div>';
+                }
+            },
+            onChange: function (value, oldValue) {
+                $scope.macInputModel = value;
+            }
+        };
+    }]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_single.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_single.js
new file mode 100644
index 0000000..7392229
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_single.js
@@ -0,0 +1,262 @@
+var app = angular.module('sentinelDashboardApp');
+
+app.controller('SentinelClusterSingleController', ['$scope', '$stateParams', 'ngDialog',
+    'MachineService', 'ClusterStateService',
+    function ($scope, $stateParams, ngDialog, MachineService, ClusterStateService) {
+        $scope.app = $stateParams.app;
+        const UNSUPPORTED_CODE = 4041;
+
+        const CLUSTER_MODE_CLIENT = 0;
+        const CLUSTER_MODE_SERVER = 1;
+
+        $scope.macsInputConfig = {
+            searchField: ['text', 'value'],
+            persist: true,
+            create: false,
+            maxItems: 1,
+            render: {
+                item: function (data, escape) {
+                    return '<div>' + escape(data.text) + '</div>';
+                }
+            },
+            onChange: function (value, oldValue) {
+                $scope.macInputModel = value;
+            }
+        };
+
+        function convertSetToString(set) {
+            if (set === undefined) {
+                return '';
+            }
+            let s = '';
+            for (let i = 0; i < set.length; i++) {
+                s = s + set[i];
+                if (i < set.length - 1) {
+                    s = s + ',';
+                }
+            }
+            return s;
+        }
+
+        function convertStrToNamespaceSet(str) {
+            if (str === undefined || str === '') {
+                return [];
+            }
+            let arr = [];
+            let spliced = str.split(',');
+            spliced.forEach((v) => {
+                arr.push(v.trim());
+            });
+            return arr;
+        }
+
+        function fetchMachineClusterState() {
+            if (!$scope.macInputModel || $scope.macInputModel === '') {
+                return;
+            }
+            let mac = $scope.macInputModel.split(':');
+            ClusterStateService.fetchClusterUniversalStateSingle($scope.app, mac[0], mac[1]).success(function (data) {
+                if (data.code == 0 && data.data) {
+                    $scope.loadError = undefined;
+                    $scope.stateVO = data.data;
+                    $scope.stateVO.currentMode = $scope.stateVO.stateInfo.mode;
+                    if ($scope.stateVO.server && $scope.stateVO.server.namespaceSet) {
+                        $scope.stateVO.server.namespaceSetStr = convertSetToString($scope.stateVO.server.namespaceSet);
+                    }
+                } else {
+                    $scope.stateVO = {};
+                    if (data.code === UNSUPPORTED_CODE) {
+                        $scope.loadError = {message: '鏈哄櫒 ' + mac[0] + ':' + mac[1] + ' 鐨� Sentinel 瀹㈡埛绔増鏈笉鏀寔闆嗙兢闄愭祦锛岃鍗囩骇鑷� 1.4.0 浠ヤ笂鐗堟湰骞跺紩鍏ョ浉鍏充緷璧栥��'}
+                    } else {
+                        $scope.loadError = {message: data.msg};
+                    }
+                }
+            }).error((data, header, config, status) => {
+                $scope.loadError = {message: '鏈煡閿欒'};
+            });
+        }
+
+        fetchMachineClusterState();
+
+        function checkValidClientConfig(stateVO) {
+            if (!stateVO.client || !stateVO.client.clientConfig) {
+                alert('涓嶅悎娉曠殑閰嶇疆');
+                return false;
+            }
+            let config = stateVO.client.clientConfig;
+            if (!config.serverHost || config.serverHost.trim() == '') {
+                alert('璇疯緭鍏ユ湁鏁堢殑 Token Server IP');
+                return false;
+            }
+            if (config.serverPort === undefined || config.serverPort <= 0 ||  config.serverPort > 65535) {
+                alert('璇疯緭鍏ユ湁鏁堢殑 Token Server 绔彛');
+                return false;
+            }
+            if (config.requestTimeout === undefined || config.requestTimeout <= 0) {
+                alert('璇疯緭鍏ユ湁鏁堢殑璇锋眰瓒呮椂鏃堕暱');
+                return false;
+            }
+            return true;
+        }
+
+        function sendClusterClientRequest(stateVO) {
+            if (!checkValidClientConfig(stateVO)) {
+                return;
+            }
+            if (!$scope.macInputModel) {
+                return;
+            }
+            let mac = $scope.macInputModel.split(':');
+            let request = {
+                app: $scope.app,
+                ip: mac[0],
+                port: mac[1],
+            };
+            request.mode = CLUSTER_MODE_CLIENT;
+            request.clientConfig = stateVO.client.clientConfig;
+            ClusterStateService.modifyClusterConfig(request).success(function (data) {
+                if (data.code == 0 && data.data) {
+                    alert('淇敼闆嗙兢闄愭祦瀹㈡埛绔厤缃垚鍔�');
+                    window.location.reload();
+                } else {
+                    if (data.code === UNSUPPORTED_CODE) {
+                        alert('鏈哄櫒 ' + mac[0] + ':' + mac[1] + ' 鐨� Sentinel 瀹㈡埛绔増鏈笉鏀寔闆嗙兢闄愭祦瀹㈡埛绔紝璇峰崌绾ц嚦 1.4.0 浠ヤ笂鐗堟湰骞跺紩鍏ョ浉鍏充緷璧栥��');
+                    } else {
+                        alert('淇敼澶辫触锛�' + data.msg);
+                    }
+                }
+            }).error((data, header, config, status) => {
+                alert('鏈煡閿欒');
+            });
+        }
+
+        function checkValidServerConfig(stateVO) {
+            if (!stateVO.server || !stateVO.server.transport) {
+                alert('涓嶅悎娉曠殑閰嶇疆');
+                return false;
+            }
+            if (stateVO.server.namespaceSetStr === undefined || stateVO.server.namespaceSetStr == '') {
+                alert('璇疯緭鍏ユ湁鏁堢殑鍛藉悕绌洪棿闆嗗悎锛堝涓� namespace 浠� , 鍒嗛殧锛�');
+                return false;
+            }
+            let transportConfig = stateVO.server.transport;
+            if (transportConfig.port === undefined || transportConfig.port <= 0 || transportConfig.port > 65535) {
+                alert('璇疯緭鍏ユ湁鏁堢殑 Token Server 绔彛');
+                return false;
+            }
+            let flowConfig = stateVO.server.flow;
+            if (flowConfig.maxAllowedQps === undefined || flowConfig.maxAllowedQps < 0) {
+                alert('璇疯緭鍏ユ湁鏁堢殑鏈�澶у厑璁� QPS');
+                return false;
+            }
+            // if (transportConfig.idleSeconds === undefined || transportConfig.idleSeconds <= 0) {
+            //     alert('璇疯緭鍏ユ湁鏁堢殑杩炴帴娓呯悊鏃堕暱 (idleSeconds)');
+            //     return false;
+            // }
+            return true;
+        }
+
+        function sendClusterServerRequest(stateVO) {
+            if (!checkValidServerConfig(stateVO)) {
+                return;
+            }
+            if (!$scope.macInputModel) {
+                return;
+            }
+            let mac = $scope.macInputModel.split(':');
+            let request = {
+                app: $scope.app,
+                ip: mac[0],
+                port: mac[1],
+            };
+            request.mode = CLUSTER_MODE_SERVER;
+            request.flowConfig = stateVO.server.flow;
+            request.transportConfig = stateVO.server.transport;
+            request.namespaceSet = convertStrToNamespaceSet(stateVO.server.namespaceSetStr);
+            ClusterStateService.modifyClusterConfig(request).success(function (data) {
+                if (data.code == 0 && data.data) {
+                    alert('淇敼闆嗙兢闄愭祦鏈嶅姟绔厤缃垚鍔�');
+                    window.location.reload();
+                } else {
+                    if (data.code === UNSUPPORTED_CODE) {
+                        alert('鏈哄櫒 ' + mac[0] + ':' + mac[1] + ' 鐨� Sentinel 瀹㈡埛绔増鏈笉鏀寔闆嗙兢闄愭祦鏈嶅姟绔紝璇峰崌绾ц嚦 1.4.0 浠ヤ笂鐗堟湰骞跺紩鍏ョ浉鍏充緷璧栥��');
+                    } else {
+                        alert('淇敼澶辫触锛�' + data.msg);
+                    }
+                }
+            }).error((data, header, config, status) => {
+                alert('鏈煡閿欒');
+            });
+        }
+
+
+        $scope.saveConfig = () => {
+            let ok = confirm('鏄惁纭畾淇敼闆嗙兢闄愭祦閰嶇疆锛�');
+            if (!ok) {
+                return;
+            }
+            let mode = $scope.stateVO.stateInfo.mode;
+            if (mode != 1 && mode != 0) {
+                alert('鏈煡鐨勯泦缇ら檺娴佹ā寮�');
+                return;
+            }
+            if (mode == 0) {
+                sendClusterClientRequest($scope.stateVO);
+            } else {
+                sendClusterServerRequest($scope.stateVO);
+            }
+        };
+
+        function queryAppMachines() {
+            MachineService.getAppMachines($scope.app).success(
+                function (data) {
+                    if (data.code === 0) {
+                        // $scope.machines = data.data;
+                        if (data.data) {
+                            $scope.machines = [];
+                            $scope.macsInputOptionsOrigin = [];
+                            $scope.macsInputOptions = [];
+                            data.data.forEach(function (item) {
+                                if (item.healthy) {
+                                    $scope.macsInputOptionsOrigin.push({
+                                        text: item.ip + ':' + item.port,
+                                        value: item.ip + ':' + item.port
+                                    });
+                                }
+                            });
+                            $scope.macsInputOptions = $scope.macsInputOptionsOrigin;
+                        }
+                        if ($scope.macsInputOptions.length > 0) {
+                            $scope.macInputModel = $scope.macsInputOptions[0].value;
+                        }
+                    } else {
+                        $scope.macsInputOptions = [];
+                    }
+                }
+            );
+        }
+        queryAppMachines();
+
+        $scope.$watch('searchKey', function () {
+            if (!$scope.macsInputOptions) {
+                return;
+            }
+            if ($scope.searchKey) {
+                $scope.macsInputOptions = $scope.macsInputOptionsOrigin
+                    .filter((e) => e.value.indexOf($scope.searchKey) !== -1);
+            } else {
+                $scope.macsInputOptions = $scope.macsInputOptionsOrigin;
+            }
+            if ($scope.macsInputOptions.length > 0) {
+                $scope.macInputModel = $scope.macsInputOptions[0].value;
+            } else {
+                $scope.macInputModel = '';
+            }
+        });
+
+        $scope.$watch('macInputModel', function () {
+            if ($scope.macInputModel) {
+                fetchMachineClusterState();
+            }
+        });
+    }]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/degrade.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/degrade.js
new file mode 100644
index 0000000..204c5c0
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/degrade.js
@@ -0,0 +1,204 @@
+var app = angular.module('sentinelDashboardApp');
+
+app.controller('DegradeCtl', ['$scope', '$stateParams', 'DegradeService', 'ngDialog', 'MachineService',
+  function ($scope, $stateParams, DegradeService, ngDialog, MachineService) {
+    //鍒濆鍖�
+    $scope.app = $stateParams.app;
+    $scope.rulesPageConfig = {
+      pageSize: 10,
+      currentPageIndex: 1,
+      totalPage: 1,
+      totalCount: 0,
+    };
+    $scope.macsInputConfig = {
+      searchField: ['text', 'value'],
+      persist: true,
+      create: false,
+      maxItems: 1,
+      render: {
+        item: function (data, escape) {
+          return '<div>' + escape(data.text) + '</div>';
+        }
+      },
+      onChange: function (value, oldValue) {
+        $scope.macInputModel = value;
+      }
+    };
+    getMachineRules();
+    function getMachineRules() {
+      if (!$scope.macInputModel) {
+        return;
+      }
+      var mac = $scope.macInputModel.split(':');
+      DegradeService.queryMachineRules($scope.app, mac[0], mac[1]).success(
+        function (data) {
+          if (data.code == 0 && data.data) {
+            $scope.rules = data.data;
+            $scope.rulesPageConfig.totalCount = $scope.rules.length;
+          } else {
+            $scope.rules = [];
+            $scope.rulesPageConfig.totalCount = 0;
+          }
+        });
+    };
+    $scope.getMachineRules = getMachineRules;
+
+    var degradeRuleDialog;
+    $scope.editRule = function (rule) {
+      $scope.currentRule = angular.copy(rule);
+      $scope.degradeRuleDialog = {
+        title: '缂栬緫鐔旀柇瑙勫垯',
+        type: 'edit',
+        confirmBtnText: '淇濆瓨'
+      };
+      degradeRuleDialog = ngDialog.open({
+        template: '/app/views/dialog/degrade-rule-dialog.html',
+        width: 680,
+        overlay: true,
+        scope: $scope
+      });
+    };
+
+    $scope.addNewRule = function () {
+      var mac = $scope.macInputModel.split(':');
+      $scope.currentRule = {
+        grade: 0,
+        app: $scope.app,
+        ip: mac[0],
+        port: mac[1],
+        limitApp: 'default',
+        minRequestAmount: 5,
+        statIntervalMs: 1000,
+      };
+      $scope.degradeRuleDialog = {
+        title: '鏂板鐔旀柇瑙勫垯',
+        type: 'add',
+        confirmBtnText: '鏂板'
+      };
+      degradeRuleDialog = ngDialog.open({
+        template: '/app/views/dialog/degrade-rule-dialog.html',
+        width: 680,
+        overlay: true,
+        scope: $scope
+      });
+    };
+
+    $scope.saveRule = function () {
+      if (!DegradeService.checkRuleValid($scope.currentRule)) {
+        return;
+      }
+      if ($scope.degradeRuleDialog.type === 'add') {
+        addNewRule($scope.currentRule);
+      } else if ($scope.degradeRuleDialog.type === 'edit') {
+        saveRule($scope.currentRule, true);
+      }
+    };
+
+    function parseDegradeMode(grade) {
+        switch (grade) {
+            case 0:
+              return '鎱㈣皟鐢ㄦ瘮渚�';
+            case 1:
+              return '寮傚父姣斾緥';
+            case 2:
+              return '寮傚父鏁�';
+            default:
+              return '鏈煡';
+        }
+    }
+
+    var confirmDialog;
+    $scope.deleteRule = function (rule) {
+      $scope.currentRule = rule;
+      $scope.confirmDialog = {
+        title: '鍒犻櫎鐔旀柇瑙勫垯',
+        type: 'delete_rule',
+        attentionTitle: '璇风‘璁ゆ槸鍚﹀垹闄ゅ涓嬬啍鏂鍒�',
+        attention: '璧勬簮鍚�: ' + rule.resource +
+            ', 鐔旀柇绛栫暐: ' + parseDegradeMode(rule.grade) + ', 闃堝��: ' + rule.count,
+        confirmBtnText: '鍒犻櫎',
+      };
+      confirmDialog = ngDialog.open({
+        template: '/app/views/dialog/confirm-dialog.html',
+        scope: $scope,
+        overlay: true
+      });
+    };
+
+    $scope.confirm = function () {
+      if ($scope.confirmDialog.type == 'delete_rule') {
+        deleteRule($scope.currentRule);
+      } else {
+        console.error('error');
+      }
+    };
+
+    function deleteRule(rule) {
+      DegradeService.deleteRule(rule).success(function (data) {
+        if (data.code == 0) {
+          getMachineRules();
+          confirmDialog.close();
+        } else {
+          alert('澶辫触锛�' + data.msg);
+        }
+      });
+    };
+
+    function addNewRule(rule) {
+      DegradeService.newRule(rule).success(function (data) {
+        if (data.code == 0) {
+          getMachineRules();
+          degradeRuleDialog.close();
+        } else {
+          alert('澶辫触锛�' + data.msg);
+        }
+      });
+    };
+
+    function saveRule(rule, edit) {
+      DegradeService.saveRule(rule).success(function (data) {
+        if (data.code == 0) {
+          getMachineRules();
+          if (edit) {
+            degradeRuleDialog.close();
+          } else {
+            confirmDialog.close();
+          }
+        } else {
+          alert('澶辫触锛�' + data.msg);
+        }
+      });
+    }
+    queryAppMachines();
+    function queryAppMachines() {
+      MachineService.getAppMachines($scope.app).success(
+        function (data) {
+          if (data.code === 0) {
+            // $scope.machines = data.data;
+            if (data.data) {
+              $scope.machines = [];
+              $scope.macsInputOptions = [];
+              data.data.forEach(function (item) {
+                if (item.healthy) {
+                  $scope.macsInputOptions.push({
+                    text: item.ip + ':' + item.port,
+                    value: item.ip + ':' + item.port
+                  });
+                }
+              });
+            }
+            if ($scope.macsInputOptions.length > 0) {
+              $scope.macInputModel = $scope.macsInputOptions[0].value;
+            }
+          } else {
+            $scope.macsInputOptions = [];
+          }
+        }
+      );
+    };
+    $scope.$watch('macInputModel', function () {
+      if ($scope.macInputModel) {
+        getMachineRules();
+      }
+    });
+  }]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/flow_v1.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/flow_v1.js
new file mode 100644
index 0000000..3c64493
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/flow_v1.js
@@ -0,0 +1,220 @@
+var app = angular.module('sentinelDashboardApp');
+
+app.controller('FlowControllerV1', ['$scope', '$stateParams', 'FlowServiceV1', 'ngDialog',
+  'MachineService',
+  function ($scope, $stateParams, FlowService, ngDialog,
+    MachineService) {
+    $scope.app = $stateParams.app;
+
+    $scope.rulesPageConfig = {
+      pageSize: 10,
+      currentPageIndex: 1,
+      totalPage: 1,
+      totalCount: 0,
+    };
+    $scope.macsInputConfig = {
+      searchField: ['text', 'value'],
+      persist: true,
+      create: false,
+      maxItems: 1,
+      render: {
+        item: function (data, escape) {
+          return '<div>' + escape(data.text) + '</div>';
+        }
+      },
+      onChange: function (value, oldValue) {
+        $scope.macInputModel = value;
+      }
+    };
+
+    $scope.generateThresholdTypeShow = (rule) => {
+      if (!rule.clusterMode) {
+        return '鍗曟満';
+      }
+      if (rule.clusterConfig.thresholdType === 0) {
+        return '闆嗙兢鍧囨憡';
+      } else if (rule.clusterConfig.thresholdType === 1) {
+        return '闆嗙兢鎬讳綋';
+      } else {
+        return '闆嗙兢';
+      }
+    };
+
+    getMachineRules();
+    function getMachineRules() {
+      if (!$scope.macInputModel) {
+        return;
+      }
+      var mac = $scope.macInputModel.split(':');
+      FlowService.queryMachineRules($scope.app, mac[0], mac[1]).success(
+        function (data) {
+          if (data.code == 0 && data.data) {
+            $scope.rules = data.data;
+            $scope.rulesPageConfig.totalCount = $scope.rules.length;
+          } else {
+            $scope.rules = [];
+            $scope.rulesPageConfig.totalCount = 0;
+          }
+        });
+    };
+    $scope.getMachineRules = getMachineRules;
+
+    var flowRuleDialog;
+    $scope.editRule = function (rule) {
+      $scope.currentRule = angular.copy(rule);
+      $scope.flowRuleDialog = {
+        title: '缂栬緫娴佹帶瑙勫垯',
+        type: 'edit',
+        confirmBtnText: '淇濆瓨',
+        showAdvanceButton: rule.controlBehavior == 0 && rule.strategy == 0
+      };
+      flowRuleDialog = ngDialog.open({
+        template: '/app/views/dialog/flow-rule-dialog.html',
+        width: 680,
+        overlay: true,
+        scope: $scope
+      });
+    };
+
+    $scope.addNewRule = function () {
+      var mac = $scope.macInputModel.split(':');
+      $scope.currentRule = {
+        grade: 1,
+        strategy: 0,
+        controlBehavior: 0,
+        app: $scope.app,
+        ip: mac[0],
+        port: mac[1],
+        limitApp: 'default',
+        clusterMode: false,
+        clusterConfig: {
+          thresholdType: 0
+        }
+      };
+      $scope.flowRuleDialog = {
+        title: '鏂板娴佹帶瑙勫垯',
+        type: 'add',
+        confirmBtnText: '鏂板',
+        showAdvanceButton: true,
+      };
+      flowRuleDialog = ngDialog.open({
+        template: '/app/views/dialog/flow-rule-dialog.html',
+        width: 680,
+        overlay: true,
+        scope: $scope
+      });
+    };
+
+    $scope.saveRule = function () {
+      if (!FlowService.checkRuleValid($scope.currentRule)) {
+        return;
+      }
+      if ($scope.flowRuleDialog.type === 'add') {
+        addNewRule($scope.currentRule);
+      } else if ($scope.flowRuleDialog.type === 'edit') {
+        saveRule($scope.currentRule, true);
+      }
+    };
+
+    var confirmDialog;
+    $scope.deleteRule = function (rule) {
+      $scope.currentRule = rule;
+      $scope.confirmDialog = {
+        title: '鍒犻櫎娴佹帶瑙勫垯',
+        type: 'delete_rule',
+        attentionTitle: '璇风‘璁ゆ槸鍚﹀垹闄ゅ涓嬫祦鎺ц鍒�',
+        attention: '璧勬簮鍚�: ' + rule.resource + ', 娴佹帶搴旂敤: ' + rule.limitApp
+          + ', 闃堝�肩被鍨�: ' + (rule.grade == 0 ? '绾跨▼鏁�' : 'QPS') + ', 闃堝��: ' + rule.count,
+        confirmBtnText: '鍒犻櫎',
+      };
+      confirmDialog = ngDialog.open({
+        template: '/app/views/dialog/confirm-dialog.html',
+        scope: $scope,
+        overlay: true
+      });
+    };
+
+    $scope.confirm = function () {
+      if ($scope.confirmDialog.type === 'delete_rule') {
+        deleteRule($scope.currentRule);
+      } else {
+        console.error('error');
+      }
+    };
+
+    function deleteRule(rule) {
+      FlowService.deleteRule(rule).success(function (data) {
+        if (data.code == 0) {
+          getMachineRules();
+          confirmDialog.close();
+        } else {
+          alert('澶辫触锛�' + data.msg);
+        }
+      });
+    };
+
+    function addNewRule(rule) {
+      FlowService.newRule(rule).success(function (data) {
+        if (data.code === 0) {
+          getMachineRules();
+          flowRuleDialog.close();
+        } else {
+          alert('澶辫触锛�' + data.msg);
+        }
+      });
+    };
+
+    $scope.onOpenAdvanceClick = function () {
+      $scope.flowRuleDialog.showAdvanceButton = false;
+    };
+    $scope.onCloseAdvanceClick = function () {
+      $scope.flowRuleDialog.showAdvanceButton = true;
+    };
+
+    function saveRule(rule, edit) {
+      FlowService.saveRule(rule).success(function (data) {
+        if (data.code === 0) {
+          getMachineRules();
+          if (edit) {
+            flowRuleDialog.close();
+          } else {
+            confirmDialog.close();
+          }
+        } else {
+          alert('澶辫触锛�' + data.msg);
+        }
+      });
+    }
+    queryAppMachines();
+    function queryAppMachines() {
+      MachineService.getAppMachines($scope.app).success(
+        function (data) {
+          if (data.code == 0) {
+            // $scope.machines = data.data;
+            if (data.data) {
+              $scope.machines = [];
+              $scope.macsInputOptions = [];
+              data.data.forEach(function (item) {
+                if (item.healthy) {
+                  $scope.macsInputOptions.push({
+                    text: item.ip + ':' + item.port,
+                    value: item.ip + ':' + item.port
+                  });
+                }
+              });
+            }
+            if ($scope.macsInputOptions.length > 0) {
+              $scope.macInputModel = $scope.macsInputOptions[0].value;
+            }
+          } else {
+            $scope.macsInputOptions = [];
+          }
+        }
+      );
+    };
+    $scope.$watch('macInputModel', function () {
+      if ($scope.macInputModel) {
+        getMachineRules();
+      }
+    });
+  }]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/flow_v2.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/flow_v2.js
new file mode 100644
index 0000000..3280675
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/flow_v2.js
@@ -0,0 +1,221 @@
+var app = angular.module('sentinelDashboardApp');
+
+app.controller('FlowControllerV2', ['$scope', '$stateParams', 'FlowServiceV2', 'ngDialog',
+  'MachineService',
+  function ($scope, $stateParams, FlowService, ngDialog,
+    MachineService) {
+    $scope.app = $stateParams.app;
+
+    $scope.rulesPageConfig = {
+      pageSize: 10,
+      currentPageIndex: 1,
+      totalPage: 1,
+      totalCount: 0,
+    };
+    $scope.macsInputConfig = {
+      searchField: ['text', 'value'],
+      persist: true,
+      create: false,
+      maxItems: 1,
+      render: {
+        item: function (data, escape) {
+          return '<div>' + escape(data.text) + '</div>';
+        }
+      },
+      onChange: function (value, oldValue) {
+        $scope.macInputModel = value;
+      }
+    };
+
+    $scope.generateThresholdTypeShow = (rule) => {
+      if (!rule.clusterMode) {
+        return '鍗曟満';
+      }
+      if (rule.clusterConfig.thresholdType === 0) {
+        return '闆嗙兢鍧囨憡';
+      } else if (rule.clusterConfig.thresholdType === 1) {
+        return '闆嗙兢鎬讳綋';
+      } else {
+        return '闆嗙兢';
+      }
+    };
+
+    getMachineRules();
+    function getMachineRules() {
+      if (!$scope.macInputModel) {
+        return;
+      }
+      var mac = $scope.macInputModel.split(':');
+      FlowService.queryMachineRules($scope.app, mac[0], mac[1]).success(
+        function (data) {
+          if (data.code == 0 && data.data) {
+            $scope.rules = data.data;
+            $scope.rulesPageConfig.totalCount = $scope.rules.length;
+          } else {
+            $scope.rules = [];
+            $scope.rulesPageConfig.totalCount = 0;
+          }
+        });
+    };
+    $scope.getMachineRules = getMachineRules;
+
+    var flowRuleDialog;
+    $scope.editRule = function (rule) {
+      $scope.currentRule = angular.copy(rule);
+      $scope.flowRuleDialog = {
+        title: '缂栬緫娴佹帶瑙勫垯',
+        type: 'edit',
+        confirmBtnText: '淇濆瓨',
+        showAdvanceButton: rule.controlBehavior == 0 && rule.strategy == 0
+      };
+      flowRuleDialog = ngDialog.open({
+        template: '/app/views/dialog/flow-rule-dialog.html',
+        width: 680,
+        overlay: true,
+        scope: $scope
+      });
+    };
+
+    $scope.addNewRule = function () {
+      var mac = $scope.macInputModel.split(':');
+      $scope.currentRule = {
+        grade: 1,
+        strategy: 0,
+        controlBehavior: 0,
+        app: $scope.app,
+        ip: mac[0],
+        port: mac[1],
+        limitApp: 'default',
+        clusterMode: false,
+        clusterConfig: {
+          thresholdType: 0,
+          fallbackToLocalWhenFail: true
+        }
+      };
+      $scope.flowRuleDialog = {
+        title: '鏂板娴佹帶瑙勫垯',
+        type: 'add',
+        confirmBtnText: '鏂板',
+        showAdvanceButton: true,
+      };
+      flowRuleDialog = ngDialog.open({
+        template: '/app/views/dialog/flow-rule-dialog.html',
+        width: 680,
+        overlay: true,
+        scope: $scope
+      });
+    };
+
+    $scope.saveRule = function () {
+      if (!FlowService.checkRuleValid($scope.currentRule)) {
+        return;
+      }
+      if ($scope.flowRuleDialog.type === 'add') {
+        addNewRule($scope.currentRule);
+      } else if ($scope.flowRuleDialog.type === 'edit') {
+        saveRule($scope.currentRule, true);
+      }
+    };
+
+    var confirmDialog;
+    $scope.deleteRule = function (rule) {
+      $scope.currentRule = rule;
+      $scope.confirmDialog = {
+        title: '鍒犻櫎娴佹帶瑙勫垯',
+        type: 'delete_rule',
+        attentionTitle: '璇风‘璁ゆ槸鍚﹀垹闄ゅ涓嬫祦鎺ц鍒�',
+        attention: '璧勬簮鍚�: ' + rule.resource + ', 娴佹帶搴旂敤: ' + rule.limitApp
+          + ', 闃堝�肩被鍨�: ' + (rule.grade == 0 ? '绾跨▼鏁�' : 'QPS') + ', 闃堝��: ' + rule.count,
+        confirmBtnText: '鍒犻櫎',
+      };
+      confirmDialog = ngDialog.open({
+        template: '/app/views/dialog/confirm-dialog.html',
+        scope: $scope,
+        overlay: true
+      });
+    };
+
+    $scope.confirm = function () {
+      if ($scope.confirmDialog.type === 'delete_rule') {
+        deleteRule($scope.currentRule);
+      } else {
+        console.error('error');
+      }
+    };
+
+    function deleteRule(rule) {
+      FlowService.deleteRule(rule).success(function (data) {
+        if (data.code == 0) {
+          getMachineRules();
+          confirmDialog.close();
+        } else {
+          alert('澶辫触!');
+        }
+      });
+    };
+
+    function addNewRule(rule) {
+      FlowService.newRule(rule).success(function (data) {
+        if (data.code == 0) {
+          getMachineRules();
+          flowRuleDialog.close();
+        } else {
+          alert('澶辫触!');
+        }
+      });
+    };
+
+    $scope.onOpenAdvanceClick = function () {
+      $scope.flowRuleDialog.showAdvanceButton = false;
+    };
+    $scope.onCloseAdvanceClick = function () {
+      $scope.flowRuleDialog.showAdvanceButton = true;
+    };
+
+    function saveRule(rule, edit) {
+      FlowService.saveRule(rule).success(function (data) {
+        if (data.code == 0) {
+          getMachineRules();
+          if (edit) {
+            flowRuleDialog.close();
+          } else {
+            confirmDialog.close();
+          }
+        } else {
+          alert('澶辫触!');
+        }
+      });
+    }
+    queryAppMachines();
+    function queryAppMachines() {
+      MachineService.getAppMachines($scope.app).success(
+        function (data) {
+          if (data.code == 0) {
+            // $scope.machines = data.data;
+            if (data.data) {
+              $scope.machines = [];
+              $scope.macsInputOptions = [];
+              data.data.forEach(function (item) {
+                if (item.healthy) {
+                  $scope.macsInputOptions.push({
+                    text: item.ip + ':' + item.port,
+                    value: item.ip + ':' + item.port
+                  });
+                }
+              });
+            }
+            if ($scope.macsInputOptions.length > 0) {
+              $scope.macInputModel = $scope.macsInputOptions[0].value;
+            }
+          } else {
+            $scope.macsInputOptions = [];
+          }
+        }
+      );
+    };
+    $scope.$watch('macInputModel', function () {
+      if ($scope.macInputModel) {
+        getMachineRules();
+      }
+    });
+  }]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/gateway/api.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/gateway/api.js
new file mode 100644
index 0000000..ccf2497
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/gateway/api.js
@@ -0,0 +1,245 @@
+var app = angular.module('sentinelDashboardApp');
+
+app.controller('GatewayApiCtl', ['$scope', '$stateParams', 'GatewayApiService', 'ngDialog', 'MachineService',
+  function ($scope, $stateParams, GatewayApiService, ngDialog, MachineService) {
+    $scope.app = $stateParams.app;
+
+    $scope.apisPageConfig = {
+      pageSize: 10,
+      currentPageIndex: 1,
+      totalPage: 1,
+      totalCount: 0,
+    };
+
+    $scope.macsInputConfig = {
+      searchField: ['text', 'value'],
+      persist: true,
+      create: false,
+      maxItems: 1,
+      render: {
+        item: function (data, escape) {
+          return '<div>' + escape(data.text) + '</div>';
+        }
+      },
+      onChange: function (value, oldValue) {
+        $scope.macInputModel = value;
+      }
+    };
+
+    getApis();
+    function getApis() {
+      if (!$scope.macInputModel) {
+        return;
+      }
+
+      var mac = $scope.macInputModel.split(':');
+      GatewayApiService.queryApis($scope.app, mac[0], mac[1]).success(
+        function (data) {
+          if (data.code == 0 && data.data) {
+            // To merge rows for api who has more than one predicateItems, here we build data manually
+            $scope.apis = [];
+
+            data.data.forEach(function(api) {
+              api["predicateItems"].forEach(function (item, index) {
+                var newItem = {};
+                newItem["id"] = api["id"];
+                newItem["app"] = api["app"];
+                newItem["ip"] = api["ip"];
+                newItem["port"] = api["port"];
+                newItem["apiName"] = api["apiName"];
+                newItem["pattern"] = item["pattern"];
+                newItem["matchStrategy"] = item["matchStrategy"];
+                // The itemSize indicates how many rows to merge, by using rowspan="{{api.itemSize}}" in <td> tag
+                newItem["itemSize"] = api["predicateItems"].length;
+                // Mark the flag of first item to zero, indicates the start row to merge
+                newItem["firstFlag"] = index == 0 ? 0 : 1;
+                // Still hold the data of predicateItems, in order to bind data in edit dialog html
+                newItem["predicateItems"] = api["predicateItems"];
+                $scope.apis.push(newItem);
+              });
+            });
+
+            $scope.apisPageConfig.totalCount = data.data.length;
+          } else {
+            $scope.apis = [];
+            $scope.apisPageConfig.totalCount = 0;
+          }
+        });
+    };
+    $scope.getApis = getApis;
+
+    var gatewayApiDialog;
+    $scope.editApi = function (api) {
+      $scope.currentApi = angular.copy(api);
+      $scope.gatewayApiDialog = {
+        title: '缂栬緫鑷畾涔� API',
+        type: 'edit',
+        confirmBtnText: '淇濆瓨'
+      };
+      gatewayApiDialog = ngDialog.open({
+        template: '/app/views/dialog/gateway/api-dialog.html',
+        width: 900,
+        overlay: true,
+        scope: $scope
+      });
+    };
+
+    $scope.addNewApi = function () {
+      var mac = $scope.macInputModel.split(':');
+      $scope.currentApi = {
+        grade: 0,
+        app: $scope.app,
+        ip: mac[0],
+        port: mac[1],
+        predicateItems: [{matchStrategy: 0, pattern: ''}]
+      };
+      $scope.gatewayApiDialog = {
+        title: '鏂板鑷畾涔� API',
+        type: 'add',
+        confirmBtnText: '鏂板'
+      };
+      gatewayApiDialog = ngDialog.open({
+        template: '/app/views/dialog/gateway/api-dialog.html',
+        width: 900,
+        overlay: true,
+        scope: $scope
+      });
+    };
+
+    $scope.saveApi = function () {
+      var apiNames = [];
+      if ($scope.gatewayApiDialog.type === 'add') {
+        apiNames = $scope.apis.map(function (item, index, array) {
+          return item["apiName"];
+        }).filter(function (item, index, array) {
+          return array.indexOf(item) === index;
+        });
+      }
+
+      if (!GatewayApiService.checkApiValid($scope.currentApi, apiNames)) {
+        return;
+      }
+
+      if ($scope.gatewayApiDialog.type === 'add') {
+        addNewApi($scope.currentApi);
+      } else if ($scope.gatewayApiDialog.type === 'edit') {
+        saveApi($scope.currentApi, true);
+      }
+    };
+
+    function addNewApi(api) {
+      GatewayApiService.newApi(api).success(function (data) {
+        if (data.code == 0) {
+          getApis();
+          gatewayApiDialog.close();
+        } else {
+          alert('鏂板鑷畾涔堿PI澶辫触!' + data.msg);
+        }
+      });
+    };
+
+    function saveApi(api, edit) {
+      GatewayApiService.saveApi(api).success(function (data) {
+        if (data.code == 0) {
+          getApis();
+          if (edit) {
+            gatewayApiDialog.close();
+          } else {
+            confirmDialog.close();
+          }
+        } else {
+          alert('淇敼鑷畾涔堿PI澶辫触!' + data.msg);
+        }
+      });
+    };
+
+    var confirmDialog;
+    $scope.deleteApi = function (api) {
+      $scope.currentApi = api;
+      $scope.confirmDialog = {
+        title: '鍒犻櫎鑷畾涔堿PI',
+        type: 'delete_api',
+        attentionTitle: '璇风‘璁ゆ槸鍚﹀垹闄ゅ涓嬭嚜瀹氫箟API',
+        attention: 'API鍚嶇О: ' + api.apiName,
+        confirmBtnText: '鍒犻櫎',
+      };
+      confirmDialog = ngDialog.open({
+        template: '/app/views/dialog/confirm-dialog.html',
+        scope: $scope,
+        overlay: true
+      });
+    };
+
+    $scope.confirm = function () {
+      if ($scope.confirmDialog.type == 'delete_api') {
+        deleteApi($scope.currentApi);
+      } else {
+        console.error('error');
+      }
+    };
+
+    function deleteApi(api) {
+      GatewayApiService.deleteApi(api).success(function (data) {
+        if (data.code == 0) {
+          getApis();
+          confirmDialog.close();
+        } else {
+          alert('鍒犻櫎鑷畾涔堿PI澶辫触!' + data.msg);
+        }
+      });
+    };
+
+    $scope.addNewMatchPattern = function() {
+      var total;
+      if ($scope.currentApi.predicateItems == null) {
+        $scope.currentApi.predicateItems = [];
+        total = 0;
+      } else {
+        total = $scope.currentApi.predicateItems.length;
+      }
+      $scope.currentApi.predicateItems.splice(total + 1, 0, {matchStrategy: 0, pattern: ''});
+    };
+
+    $scope.removeMatchPattern = function($index) {
+      if ($scope.currentApi.predicateItems.length <= 1) {
+        // Should never happen since no remove button will display when only one predicateItem.
+        alert('鑷冲皯鏈変竴涓尮閰嶈鍒�');
+        return;
+      }
+      $scope.currentApi.predicateItems.splice($index, 1);
+    };
+
+    queryAppMachines();
+    function queryAppMachines() {
+      MachineService.getAppMachines($scope.app).success(
+        function (data) {
+          if (data.code == 0) {
+            // $scope.machines = data.data;
+            if (data.data) {
+              $scope.machines = [];
+              $scope.macsInputOptions = [];
+              data.data.forEach(function (item) {
+                if (item.healthy) {
+                  $scope.macsInputOptions.push({
+                    text: item.ip + ':' + item.port,
+                    value: item.ip + ':' + item.port
+                  });
+                }
+              });
+            }
+            if ($scope.macsInputOptions.length > 0) {
+              $scope.macInputModel = $scope.macsInputOptions[0].value;
+            }
+          } else {
+            $scope.macsInputOptions = [];
+          }
+        }
+      );
+    };
+    $scope.$watch('macInputModel', function () {
+      if ($scope.macInputModel) {
+        getApis();
+      }
+    });
+  }]
+);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/gateway/flow.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/gateway/flow.js
new file mode 100644
index 0000000..c492cf9
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/gateway/flow.js
@@ -0,0 +1,251 @@
+var app = angular.module('sentinelDashboardApp');
+
+app.controller('GatewayFlowCtl', ['$scope', '$stateParams', 'GatewayFlowService', 'GatewayApiService', 'ngDialog', 'MachineService',
+  function ($scope, $stateParams, GatewayFlowService, GatewayApiService, ngDialog, MachineService) {
+    $scope.app = $stateParams.app;
+
+    $scope.rulesPageConfig = {
+      pageSize: 10,
+      currentPageIndex: 1,
+      totalPage: 1,
+      totalCount: 0,
+    };
+
+    $scope.macsInputConfig = {
+      searchField: ['text', 'value'],
+      persist: true,
+      create: false,
+      maxItems: 1,
+      render: {
+        item: function (data, escape) {
+          return '<div>' + escape(data.text) + '</div>';
+        }
+      },
+      onChange: function (value, oldValue) {
+        $scope.macInputModel = value;
+      }
+    };
+
+    getMachineRules();
+    function getMachineRules() {
+      if (!$scope.macInputModel) {
+        return;
+      }
+
+      var mac = $scope.macInputModel.split(':');
+      GatewayFlowService.queryRules($scope.app, mac[0], mac[1]).success(
+        function (data) {
+          if (data.code == 0 && data.data) {
+            $scope.rules = data.data;
+            $scope.rulesPageConfig.totalCount = $scope.rules.length;
+          } else {
+            $scope.rules = [];
+            $scope.rulesPageConfig.totalCount = 0;
+          }
+        });
+    };
+    $scope.getMachineRules = getMachineRules;
+
+    getApiNames();
+    function getApiNames() {
+      if (!$scope.macInputModel) {
+        return;
+      }
+
+      var mac = $scope.macInputModel.split(':');
+      GatewayApiService.queryApis($scope.app, mac[0], mac[1]).success(
+        function (data) {
+          if (data.code == 0 && data.data) {
+            $scope.apiNames = [];
+
+            data.data.forEach(function (api) {
+              $scope.apiNames.push(api["apiName"]);
+            });
+          }
+        });
+    }
+
+    $scope.intervalUnits = [{val: 0, desc: '绉�'}, {val: 1, desc: '鍒�'}, {val: 2, desc: '鏃�'}, {val: 3, desc: '澶�'}];
+
+    var gatewayFlowRuleDialog;
+    $scope.editRule = function (rule) {
+      $scope.currentRule = angular.copy(rule);
+      $scope.gatewayFlowRuleDialog = {
+        title: '缂栬緫缃戝叧娴佹帶瑙勫垯',
+        type: 'edit',
+        confirmBtnText: '淇濆瓨'
+      };
+      gatewayFlowRuleDialog = ngDialog.open({
+        template: '/app/views/dialog/gateway/flow-rule-dialog.html',
+        width: 780,
+        overlay: true,
+        scope: $scope
+      });
+    };
+
+    $scope.addNewRule = function () {
+      var mac = $scope.macInputModel.split(':');
+      $scope.currentRule = {
+        grade: 1,
+        app: $scope.app,
+        ip: mac[0],
+        port: mac[1],
+        resourceMode: 0,
+        interval: 1,
+        intervalUnit: 0,
+        controlBehavior: 0,
+        burst: 0,
+        maxQueueingTimeoutMs: 0
+      };
+
+      $scope.gatewayFlowRuleDialog = {
+        title: '鏂板缃戝叧娴佹帶瑙勫垯',
+        type: 'add',
+        confirmBtnText: '鏂板'
+      };
+
+      gatewayFlowRuleDialog = ngDialog.open({
+        template: '/app/views/dialog/gateway/flow-rule-dialog.html',
+        width: 780,
+        overlay: true,
+        scope: $scope
+      });
+    };
+
+    $scope.saveRule = function () {
+      if (!GatewayFlowService.checkRuleValid($scope.currentRule)) {
+        return;
+      }
+      if ($scope.gatewayFlowRuleDialog.type === 'add') {
+        addNewRule($scope.currentRule);
+      } else if ($scope.gatewayFlowRuleDialog.type === 'edit') {
+        saveRule($scope.currentRule, true);
+      }
+    };
+
+    $scope.useRouteID = function() {
+      $scope.currentRule.resource = '';
+    };
+
+    $scope.useCustormAPI = function() {
+      $scope.currentRule.resource = '';
+    };
+
+    $scope.useParamItem = function () {
+      $scope.currentRule.paramItem = {
+        parseStrategy: 0,
+        matchStrategy: 0
+      };
+    };
+
+    $scope.notUseParamItem = function () {
+      $scope.currentRule.paramItem = null;
+    };
+
+    $scope.useParamItemVal = function() {
+      $scope.currentRule.paramItem.pattern = "";
+      $scope.currentRule.paramItem.matchStrategy = 0;
+    };
+
+    $scope.notUseParamItemVal = function() {
+      $scope.currentRule.paramItem.pattern = null;
+      $scope.currentRule.paramItem.matchStrategy = null;
+    };
+
+    function addNewRule(rule) {
+      GatewayFlowService.newRule(rule).success(function (data) {
+        if (data.code == 0) {
+          getMachineRules();
+          gatewayFlowRuleDialog.close();
+        } else {
+          alert('鏂板缃戝叧娴佹帶瑙勫垯澶辫触!' + data.msg);
+        }
+      });
+    };
+
+    function saveRule(rule, edit) {
+      GatewayFlowService.saveRule(rule).success(function (data) {
+        if (data.code == 0) {
+          getMachineRules();
+          if (edit) {
+            gatewayFlowRuleDialog.close();
+          } else {
+            confirmDialog.close();
+          }
+        } else {
+          alert('淇敼缃戝叧娴佹帶瑙勫垯澶辫触!' + data.msg);
+        }
+      });
+    };
+
+    var confirmDialog;
+    $scope.deleteRule = function (rule) {
+      $scope.currentRule = rule;
+      $scope.confirmDialog = {
+        title: '鍒犻櫎缃戝叧娴佹帶瑙勫垯',
+        type: 'delete_rule',
+        attentionTitle: '璇风‘璁ゆ槸鍚﹀垹闄ゅ涓嬭鍒�',
+        attention: 'API鍚嶇О: ' + rule.resource + ', ' + (rule.grade == 1 ? 'QPS闃堝��' : '绾跨▼鏁�') + ': ' + rule.count,
+        confirmBtnText: '鍒犻櫎',
+      };
+      confirmDialog = ngDialog.open({
+        template: '/app/views/dialog/confirm-dialog.html',
+        scope: $scope,
+        overlay: true
+      });
+    };
+
+    $scope.confirm = function () {
+      if ($scope.confirmDialog.type == 'delete_rule') {
+        deleteRule($scope.currentRule);
+      } else {
+        console.error('error');
+      }
+    };
+
+    function deleteRule(rule) {
+      GatewayFlowService.deleteRule(rule).success(function (data) {
+        if (data.code == 0) {
+          getMachineRules();
+          confirmDialog.close();
+        } else {
+          alert('鍒犻櫎缃戝叧娴佹帶瑙勫垯澶辫触!' + data.msg);
+        }
+      });
+    };
+
+    queryAppMachines();
+
+    function queryAppMachines() {
+      MachineService.getAppMachines($scope.app).success(
+          function (data) {
+            if (data.code == 0) {
+              if (data.data) {
+                $scope.machines = [];
+                $scope.macsInputOptions = [];
+                data.data.forEach(function (item) {
+                  if (item.healthy) {
+                    $scope.macsInputOptions.push({
+                      text: item.ip + ':' + item.port,
+                      value: item.ip + ':' + item.port
+                    });
+                  }
+                });
+              }
+              if ($scope.macsInputOptions.length > 0) {
+                $scope.macInputModel = $scope.macsInputOptions[0].value;
+              }
+            } else {
+              $scope.macsInputOptions = [];
+            }
+          }
+      );
+    };
+    $scope.$watch('macInputModel', function () {
+      if ($scope.macInputModel) {
+        getMachineRules();
+        getApiNames();
+      }
+    });
+  }]
+);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/gateway/identity.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/gateway/identity.js
new file mode 100644
index 0000000..52871b4
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/gateway/identity.js
@@ -0,0 +1,299 @@
+var app = angular.module('sentinelDashboardApp');
+
+app.controller('GatewayIdentityCtl', ['$scope', '$stateParams', 'IdentityService',
+  'ngDialog', 'GatewayFlowService', 'GatewayApiService', 'DegradeService', 'MachineService',
+  '$interval', '$location', '$timeout',
+  function ($scope, $stateParams, IdentityService, ngDialog,
+    GatewayFlowService, GatewayApiService, DegradeService, MachineService, $interval, $location, $timeout) {
+
+    $scope.app = $stateParams.app;
+
+    $scope.currentPage = 1;
+    $scope.pageSize = 16;
+    $scope.totalPage = 1;
+    $scope.totalCount = 0;
+    $scope.identities = [];
+
+    $scope.searchKey = '';
+
+    $scope.macsInputConfig = {
+      searchField: ['text', 'value'],
+      persist: true,
+      create: false,
+      maxItems: 1,
+      render: {
+        item: function (data, escape) {
+          return '<div>' + escape(data.text) + '</div>';
+        }
+      },
+      onChange: function (value, oldValue) {
+        $scope.macInputModel = value;
+      }
+    };
+    $scope.table = null;
+
+    getApiNames();
+    function getApiNames() {
+      if (!$scope.macInputModel) {
+        return;
+      }
+
+      var mac = $scope.macInputModel.split(':');
+      GatewayApiService.queryApis($scope.app, mac[0], mac[1]).success(
+        function (data) {
+          if (data.code == 0 && data.data) {
+            $scope.apiNames = [];
+
+            data.data.forEach(function (api) {
+              $scope.apiNames.push(api["apiName"]);
+            });
+          }
+        });
+    }
+
+    var gatewayFlowRuleDialog;
+    var gatewayFlowRuleDialogScope;
+    $scope.addNewGatewayFlowRule = function (resource) {
+      if (!$scope.macInputModel) {
+        return;
+      }
+      var mac = $scope.macInputModel.split(':');
+      gatewayFlowRuleDialogScope = $scope.$new(true);
+
+      gatewayFlowRuleDialogScope.apiNames = $scope.apiNames;
+
+      gatewayFlowRuleDialogScope.intervalUnits = [{val: 0, desc: '绉�'}, {val: 1, desc: '鍒�'}, {val: 2, desc: '鏃�'}, {val: 3, desc: '澶�'}];
+
+      gatewayFlowRuleDialogScope.currentRule = {
+        grade: 1,
+        app: $scope.app,
+        ip: mac[0],
+        port: mac[1],
+        resourceMode: gatewayFlowRuleDialogScope.apiNames.indexOf(resource) == -1 ? 0 : 1,
+        resource: resource,
+        interval: 1,
+        intervalUnit: 0,
+        controlBehavior: 0,
+        burst: 0,
+        maxQueueingTimeoutMs: 0
+      };
+
+      gatewayFlowRuleDialogScope.gatewayFlowRuleDialog = {
+        title: '鏂板缃戝叧娴佹帶瑙勫垯',
+        type: 'add',
+        confirmBtnText: '鏂板',
+        saveAndContinueBtnText: '鏂板骞剁户缁坊鍔�',
+        showAdvanceButton: true
+      };
+
+      gatewayFlowRuleDialogScope.useRouteID = function() {
+        gatewayFlowRuleDialogScope.currentRule.resource = '';
+      };
+
+      gatewayFlowRuleDialogScope.useCustormAPI = function() {
+        gatewayFlowRuleDialogScope.currentRule.resource = '';
+      };
+
+      gatewayFlowRuleDialogScope.useParamItem = function () {
+        gatewayFlowRuleDialogScope.currentRule.paramItem = {
+          parseStrategy: 0,
+          matchStrategy: 0
+        };
+      };
+
+      gatewayFlowRuleDialogScope.notUseParamItem = function () {
+        gatewayFlowRuleDialogScope.currentRule.paramItem = null;
+      };
+
+      gatewayFlowRuleDialogScope.useParamItemVal = function() {
+        gatewayFlowRuleDialogScope.currentRule.paramItem.pattern = "";
+      };
+
+      gatewayFlowRuleDialogScope.notUseParamItemVal = function() {
+        gatewayFlowRuleDialogScope.currentRule.paramItem.pattern = null;
+      };
+
+      gatewayFlowRuleDialogScope.saveRule = saveGatewayFlowRule;
+      gatewayFlowRuleDialogScope.saveRuleAndContinue = saveGatewayFlowRuleAndContinue;
+      gatewayFlowRuleDialogScope.onOpenAdvanceClick = function () {
+        gatewayFlowRuleDialogScope.gatewayFlowRuleDialog.showAdvanceButton = false;
+      };
+      gatewayFlowRuleDialogScope.onCloseAdvanceClick = function () {
+        gatewayFlowRuleDialogScope.gatewayFlowRuleDialog.showAdvanceButton = true;
+      };
+
+      gatewayFlowRuleDialog = ngDialog.open({
+        template: '/app/views/dialog/gateway/flow-rule-dialog.html',
+        width: 780,
+        overlay: true,
+        scope: gatewayFlowRuleDialogScope
+      });
+    };
+
+    function saveGatewayFlowRule() {
+      if (!GatewayFlowService.checkRuleValid(gatewayFlowRuleDialogScope.currentRule)) {
+        return;
+      }
+      GatewayFlowService.newRule(gatewayFlowRuleDialogScope.currentRule).success(function (data) {
+        if (data.code === 0) {
+          gatewayFlowRuleDialog.close();
+          let url = '/dashboard/gateway/flow/' + $scope.app;
+          $location.path(url);
+        } else {
+          alert('澶辫触!');
+        }
+      }).error((data, header, config, status) => {
+          alert('鏈煡閿欒');
+      });
+    }
+
+    function saveGatewayFlowRuleAndContinue() {
+        if (!GatewayFlowService.checkRuleValid(gatewayFlowRuleDialogScope.currentRule)) {
+            return;
+        }
+      GatewayFlowService.newRule(gatewayFlowRuleDialogScope.currentRule).success(function (data) {
+        if (data.code == 0) {
+          gatewayFlowRuleDialog.close();
+        } else {
+          alert('澶辫触!');
+        }
+      });
+    }
+
+    var degradeRuleDialog;
+    $scope.addNewDegradeRule = function (resource) {
+      if (!$scope.macInputModel) {
+        return;
+      }
+      var mac = $scope.macInputModel.split(':');
+      degradeRuleDialogScope = $scope.$new(true);
+      degradeRuleDialogScope.currentRule = {
+        enable: false,
+        grade: 0,
+        strategy: 0,
+        resource: resource,
+        limitApp: 'default',
+        app: $scope.app,
+        ip: mac[0],
+        port: mac[1]
+      };
+
+      degradeRuleDialogScope.degradeRuleDialog = {
+        title: '鏂板闄嶇骇瑙勫垯',
+        type: 'add',
+        confirmBtnText: '鏂板',
+        saveAndContinueBtnText: '鏂板骞剁户缁坊鍔�'
+      };
+      degradeRuleDialogScope.saveRule = saveDegradeRule;
+      degradeRuleDialogScope.saveRuleAndContinue = saveDegradeRuleAndContinue;
+
+      degradeRuleDialog = ngDialog.open({
+        template: '/app/views/dialog/degrade-rule-dialog.html',
+        width: 680,
+        overlay: true,
+        scope: degradeRuleDialogScope
+      });
+    };
+
+    function saveDegradeRule() {
+        if (!DegradeService.checkRuleValid(degradeRuleDialogScope.currentRule)) {
+            return;
+        }
+      DegradeService.newRule(degradeRuleDialogScope.currentRule).success(function (data) {
+        if (data.code == 0) {
+          degradeRuleDialog.close();
+          var url = '/dashboard/degrade/' + $scope.app;
+          $location.path(url);
+        } else {
+          alert('澶辫触!');
+        }
+      });
+    }
+
+    function saveDegradeRuleAndContinue() {
+        if (!DegradeService.checkRuleValid(degradeRuleDialogScope.currentRule)) {
+            return;
+        }
+      DegradeService.newRule(degradeRuleDialogScope.currentRule).success(function (data) {
+        if (data.code == 0) {
+          degradeRuleDialog.close();
+        } else {
+          alert('澶辫触!');
+        }
+      });
+    }
+
+    var searchHandler;
+    $scope.searchChange = function (searchKey) {
+      $timeout.cancel(searchHandler);
+      searchHandler = $timeout(function () {
+        $scope.searchKey = searchKey;
+        reInitIdentityDatas();
+      }, 600);
+    };
+
+    function queryAppMachines() {
+      MachineService.getAppMachines($scope.app).success(
+        function (data) {
+          if (data.code === 0) {
+            if (data.data) {
+              $scope.machines = [];
+              $scope.macsInputOptions = [];
+              data.data.forEach(function (item) {
+                if (item.healthy) {
+                  $scope.macsInputOptions.push({
+                    text: item.ip + ':' + item.port,
+                    value: item.ip + ':' + item.port
+                  });
+                }
+              });
+            }
+            if ($scope.macsInputOptions.length > 0) {
+              $scope.macInputModel = $scope.macsInputOptions[0].value;
+            }
+          } else {
+            $scope.macsInputOptions = [];
+          }
+        }
+      );
+    }
+
+    // Fetch all machines by current app name.
+    queryAppMachines();
+
+    $scope.$watch('macInputModel', function () {
+      if ($scope.macInputModel) {
+        reInitIdentityDatas();
+      }
+    });
+
+    $scope.$on('$destroy', function () {
+      $interval.cancel(intervalId);
+    });
+
+    var intervalId;
+    function reInitIdentityDatas() {
+      getApiNames();
+      queryIdentities();
+    };
+
+    function queryIdentities() {
+      var mac = $scope.macInputModel.split(':');
+      if (mac == null || mac.length < 2) {
+        return;
+      }
+
+      IdentityService.fetchClusterNodeOfMachine(mac[0], mac[1], $scope.searchKey).success(
+        function (data) {
+          if (data.code == 0 && data.data) {
+            $scope.identities = data.data;
+            $scope.totalCount = $scope.identities.length;
+          } else {
+            $scope.identities = [];
+            $scope.totalCount = 0;
+          }
+        }
+      );
+    };
+    $scope.queryIdentities = queryIdentities;
+  }]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/home.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/home.js
new file mode 100644
index 0000000..1df5862
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/home.js
@@ -0,0 +1,11 @@
+/**
+ * @ngdoc function
+ * @name sentinelDashboardApp.controller:MainCtrl
+ * @description
+ * # MainCtrl
+ * Controller of the sentinelDashboardApp
+ */
+angular.module('sentinelDashboardApp')
+  .controller('HomeCtrl', ['$scope', '$position', function ($scope, $position) {
+    // do noting
+  }]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/identity.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/identity.js
new file mode 100644
index 0000000..cc58342
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/identity.js
@@ -0,0 +1,478 @@
+var app = angular.module('sentinelDashboardApp');
+
+app.controller('IdentityCtl', ['$scope', '$stateParams', 'IdentityService',
+  'ngDialog', 'FlowServiceV1', 'DegradeService', 'AuthorityRuleService', 'ParamFlowService', 'MachineService',
+  '$interval', '$location', '$timeout',
+  function ($scope, $stateParams, IdentityService, ngDialog,
+    FlowService, DegradeService, AuthorityRuleService, ParamFlowService, MachineService, $interval, $location, $timeout) {
+
+    $scope.app = $stateParams.app;
+
+    $scope.currentPage = 1;
+    $scope.pageSize = 16;
+    $scope.totalPage = 1;
+    $scope.totalCount = 0;
+    $scope.identities = [];
+    // 鏁版嵁鑷姩鍒锋柊棰戠巼, 榛樿10s
+    var DATA_REFRESH_INTERVAL = 30;
+
+    $scope.isExpand = true;
+    $scope.searchKey = '';
+    $scope.firstExpandAll = false;
+    $scope.isTreeView = true;
+
+    $scope.macsInputConfig = {
+      searchField: ['text', 'value'],
+      persist: true,
+      create: false,
+      maxItems: 1,
+      render: {
+        item: function (data, escape) {
+          return '<div>' + escape(data.text) + '</div>';
+        }
+      },
+      onChange: function (value, oldValue) {
+        $scope.macInputModel = value;
+      }
+    };
+    $scope.table = null;
+
+    var flowRuleDialog;
+    var flowRuleDialogScope;
+    $scope.addNewFlowRule = function (resource) {
+      if (!$scope.macInputModel) {
+        return;
+      }
+      var mac = $scope.macInputModel.split(':');
+      flowRuleDialogScope = $scope.$new(true);
+      flowRuleDialogScope.currentRule = {
+        enable: false,
+        strategy: 0,
+        grade: 1,
+        controlBehavior: 0,
+        resource: resource,
+        limitApp: 'default',
+        clusterMode: false,
+        clusterConfig: {
+            thresholdType: 0
+        },
+        app: $scope.app,
+        ip: mac[0],
+        port: mac[1]
+      };
+
+      flowRuleDialogScope.flowRuleDialog = {
+        title: '鏂板娴佹帶瑙勫垯',
+        type: 'add',
+        confirmBtnText: '鏂板',
+        saveAndContinueBtnText: '鏂板骞剁户缁坊鍔�',
+        showAdvanceButton: true
+      };
+      // $scope.flowRuleDialog = {
+      //     showAdvanceButton : true
+      // };
+      flowRuleDialogScope.saveRule = saveFlowRule;
+      flowRuleDialogScope.saveRuleAndContinue = saveFlowRuleAndContinue;
+      flowRuleDialogScope.onOpenAdvanceClick = function () {
+        flowRuleDialogScope.flowRuleDialog.showAdvanceButton = false;
+      };
+      flowRuleDialogScope.onCloseAdvanceClick = function () {
+        flowRuleDialogScope.flowRuleDialog.showAdvanceButton = true;
+      };
+
+      flowRuleDialog = ngDialog.open({
+        template: '/app/views/dialog/flow-rule-dialog.html',
+        width: 680,
+        overlay: true,
+        scope: flowRuleDialogScope
+      });
+    };
+
+    function saveFlowRule() {
+      if (!FlowService.checkRuleValid(flowRuleDialogScope.currentRule)) {
+        return;
+      }
+      FlowService.newRule(flowRuleDialogScope.currentRule).success(function (data) {
+        if (data.code === 0) {
+          flowRuleDialog.close();
+          let url = '/dashboard/flow/' + $scope.app;
+          $location.path(url);
+        } else {
+          alert('澶辫触锛�' + data.msg);
+        }
+      }).error((data, header, config, status) => {
+          alert('鏈煡閿欒');
+      });
+    }
+
+    function saveFlowRuleAndContinue() {
+        if (!FlowService.checkRuleValid(flowRuleDialogScope.currentRule)) {
+            return;
+        }
+      FlowService.newRule(flowRuleDialogScope.currentRule).success(function (data) {
+        if (data.code === 0) {
+          flowRuleDialog.close();
+        } else {
+            alert('澶辫触锛�' + data.msg);
+        }
+      });
+    }
+
+    var degradeRuleDialog;
+    var degradeRuleDialogScope;
+    $scope.addNewDegradeRule = function (resource) {
+      if (!$scope.macInputModel) {
+        return;
+      }
+      var mac = $scope.macInputModel.split(':');
+      degradeRuleDialogScope = $scope.$new(true);
+      degradeRuleDialogScope.currentRule = {
+        enable: false,
+        grade: 0,
+        strategy: 0,
+        resource: resource,
+        limitApp: 'default',
+        minRequestAmount: 5,
+        statIntervalMs: 1000,
+        app: $scope.app,
+        ip: mac[0],
+        port: mac[1]
+      };
+
+      degradeRuleDialogScope.degradeRuleDialog = {
+        title: '鏂板鐔旀柇瑙勫垯',
+        type: 'add',
+        confirmBtnText: '鏂板',
+        saveAndContinueBtnText: '鏂板骞剁户缁坊鍔�'
+      };
+      degradeRuleDialogScope.saveRule = saveDegradeRule;
+      degradeRuleDialogScope.saveRuleAndContinue = saveDegradeRuleAndContinue;
+
+      degradeRuleDialog = ngDialog.open({
+        template: '/app/views/dialog/degrade-rule-dialog.html',
+        width: 680,
+        overlay: true,
+        scope: degradeRuleDialogScope
+      });
+    };
+
+    function saveDegradeRule() {
+        if (!DegradeService.checkRuleValid(degradeRuleDialogScope.currentRule)) {
+            return;
+        }
+      DegradeService.newRule(degradeRuleDialogScope.currentRule).success(function (data) {
+        if (data.code === 0) {
+          degradeRuleDialog.close();
+          var url = '/dashboard/degrade/' + $scope.app;
+          $location.path(url);
+        } else {
+          alert('澶辫触锛�' + data.msg);
+        }
+      });
+    }
+
+    function saveDegradeRuleAndContinue() {
+        if (!DegradeService.checkRuleValid(degradeRuleDialogScope.currentRule)) {
+            return;
+        }
+      DegradeService.newRule(degradeRuleDialogScope.currentRule).success(function (data) {
+        if (data.code === 0) {
+          degradeRuleDialog.close();
+        } else {
+            alert('澶辫触锛�' + data.msg);
+        }
+      });
+    }
+
+      let authorityRuleDialog;
+      let authorityRuleDialogScope;
+
+      function saveAuthorityRule() {
+          let ruleEntity = authorityRuleDialogScope.currentRule;
+          if (!AuthorityRuleService.checkRuleValid(ruleEntity.rule)) {
+              return;
+          }
+          AuthorityRuleService.addNewRule(ruleEntity).success((data) => {
+              if (data.success) {
+                  authorityRuleDialog.close();
+                  let url = '/dashboard/authority/' + $scope.app;
+                  $location.path(url);
+              } else {
+                  alert('娣诲姞瑙勫垯澶辫触锛�' + data.msg);
+              }
+          }).error((data) => {
+              if (data) {
+                  alert('娣诲姞瑙勫垯澶辫触锛�' + data.msg);
+              } else {
+                  alert("娣诲姞瑙勫垯澶辫触锛氭湭鐭ラ敊璇�");
+              }
+          });
+      }
+
+      function saveAuthorityRuleAndContinue() {
+          let ruleEntity = authorityRuleDialogScope.currentRule;
+          if (!AuthorityRuleService.checkRuleValid(ruleEntity.rule)) {
+              return;
+          }
+          AuthorityRuleService.addNewRule(ruleEntity).success((data) => {
+              if (data.success) {
+                  authorityRuleDialog.close();
+              } else {
+                  alert('娣诲姞瑙勫垯澶辫触锛�' + data.msg);
+              }
+          }).error((data) => {
+              if (data) {
+                  alert('娣诲姞瑙勫垯澶辫触锛�' + data.msg);
+              } else {
+                  alert("娣诲姞瑙勫垯澶辫触锛氭湭鐭ラ敊璇�");
+              }
+          });
+      }
+
+      $scope.addNewAuthorityRule = function (resource) {
+          if (!$scope.macInputModel) {
+              return;
+          }
+          let mac = $scope.macInputModel.split(':');
+          authorityRuleDialogScope = $scope.$new(true);
+          authorityRuleDialogScope.currentRule = {
+              app: $scope.app,
+              ip: mac[0],
+              port: mac[1],
+              rule: {
+                  resource: resource,
+                  strategy: 0,
+                  limitApp: '',
+              }
+          };
+
+          authorityRuleDialogScope.authorityRuleDialog = {
+              title: '鏂板鎺堟潈瑙勫垯',
+              type: 'add',
+              confirmBtnText: '鏂板',
+              saveAndContinueBtnText: '鏂板骞剁户缁坊鍔�'
+          };
+          authorityRuleDialogScope.saveRule = saveAuthorityRule;
+          authorityRuleDialogScope.saveRuleAndContinue = saveAuthorityRuleAndContinue;
+
+          authorityRuleDialog = ngDialog.open({
+              template: '/app/views/dialog/authority-rule-dialog.html',
+              width: 680,
+              overlay: true,
+              scope: authorityRuleDialogScope
+          });
+      };
+
+      let paramFlowRuleDialog;
+      let paramFlowRuleDialogScope;
+
+      function saveParamFlowRule() {
+          let ruleEntity = paramFlowRuleDialogScope.currentRule;
+          if (!ParamFlowService.checkRuleValid(ruleEntity.rule)) {
+              return;
+          }
+          ParamFlowService.addNewRule(ruleEntity).success((data) => {
+              if (data.success) {
+                  paramFlowRuleDialog.close();
+                  let url = '/dashboard/paramFlow/' + $scope.app;
+                  $location.path(url);
+              } else {
+                  alert('娣诲姞鐑偣瑙勫垯澶辫触锛�' + data.msg);
+              }
+          }).error((data) => {
+              if (data) {
+                  alert('娣诲姞鐑偣瑙勫垯澶辫触锛�' + data.msg);
+              } else {
+                  alert("娣诲姞鐑偣瑙勫垯澶辫触锛氭湭鐭ラ敊璇�");
+              }
+          });
+      }
+
+      function saveParamFlowRuleAndContinue() {
+          let ruleEntity = paramFlowRuleDialogScope.currentRule;
+          if (!ParamFlowService.checkRuleValid(ruleEntity.rule)) {
+              return;
+          }
+          ParamFlowService.addNewRule(ruleEntity).success((data) => {
+              if (data.success) {
+                  paramFlowRuleDialog.close();
+              } else {
+                  alert('娣诲姞鐑偣瑙勫垯澶辫触锛�' + data.msg);
+              }
+          }).error((data) => {
+              if (data) {
+                  alert('娣诲姞鐑偣瑙勫垯澶辫触锛�' + data.msg);
+              } else {
+                  alert("娣诲姞鐑偣瑙勫垯澶辫触锛氭湭鐭ラ敊璇�");
+              }
+          });
+      }
+
+      $scope.addNewParamFlowRule = function (resource) {
+          if (!$scope.macInputModel) {
+              return;
+          }
+          let mac = $scope.macInputModel.split(':');
+          paramFlowRuleDialogScope = $scope.$new(true);
+          paramFlowRuleDialogScope.currentRule = {
+              app: $scope.app,
+              ip: mac[0],
+              port: mac[1],
+              rule: {
+                  resource: resource,
+                  grade: 1,
+                  paramFlowItemList: [],
+                  count: 0,
+                  limitApp: 'default',
+                  controlBehavior: 0,
+                  durationInSec: 1,
+                  burstCount: 0,
+                  maxQueueingTimeMs: 0,
+                  clusterMode: false,
+                  clusterConfig: {
+                      thresholdType: 0,
+                      fallbackToLocalWhenFail: true,
+                  }
+              }
+          };
+
+          paramFlowRuleDialogScope.paramFlowRuleDialog = {
+              title: '鏂板鐑偣瑙勫垯',
+              type: 'add',
+              confirmBtnText: '鏂板',
+              saveAndContinueBtnText: '鏂板骞剁户缁坊鍔�',
+              supportAdvanced: false,
+              showAdvanceButton: true
+          };
+          paramFlowRuleDialogScope.saveRule = saveParamFlowRule;
+          paramFlowRuleDialogScope.saveRuleAndContinue = saveParamFlowRuleAndContinue;
+          // paramFlowRuleDialogScope.onOpenAdvanceClick = function () {
+          //     paramFlowRuleDialogScope.paramFlowRuleDialog.showAdvanceButton = false;
+          // };
+          // paramFlowRuleDialogScope.onCloseAdvanceClick = function () {
+          //     paramFlowRuleDialogScope.paramFlowRuleDialog.showAdvanceButton = true;
+          // };
+
+          paramFlowRuleDialog = ngDialog.open({
+              template: '/app/views/dialog/param-flow-rule-dialog.html',
+              width: 680,
+              overlay: true,
+              scope: paramFlowRuleDialogScope
+          });
+      };
+
+    var searchHandler;
+    $scope.searchChange = function (searchKey) {
+      $timeout.cancel(searchHandler);
+      searchHandler = $timeout(function () {
+        $scope.searchKey = searchKey;
+        $scope.isExpand = true;
+        $scope.firstExpandAll = true;
+        reInitIdentityDatas();
+        $scope.firstExpandAll = false;
+      }, 600);
+    };
+
+    $scope.initTreeTable = function () {
+      // if (!$scope.table) {
+        com_github_culmat_jsTreeTable.register(window);
+        $scope.table = window.treeTable($('#identities'));
+      // }
+    };
+
+    $scope.expandAll = function () {
+      $scope.isExpand = true;
+    };
+    $scope.collapseAll = function () {
+      $scope.isExpand = false;
+    };
+    $scope.treeView = function () {
+      $scope.isTreeView = true;
+      queryIdentities();
+    };
+    $scope.listView = function () {
+      $scope.isTreeView = false;
+      queryIdentities();
+    };
+
+    function queryAppMachines() {
+      MachineService.getAppMachines($scope.app).success(
+        function (data) {
+          if (data.code === 0) {
+            if (data.data) {
+              $scope.machines = [];
+              $scope.macsInputOptions = [];
+              data.data.forEach(function (item) {
+                if (item.healthy) {
+                  $scope.macsInputOptions.push({
+                    text: item.ip + ':' + item.port,
+                    value: item.ip + ':' + item.port
+                  });
+                }
+              });
+            }
+            if ($scope.macsInputOptions.length > 0) {
+              $scope.macInputModel = $scope.macsInputOptions[0].value;
+            }
+          } else {
+            $scope.macsInputOptions = [];
+          }
+        }
+      );
+    }
+
+    // Fetch all machines by current app name.
+    queryAppMachines();
+
+    $scope.$watch('macInputModel', function () {
+      if ($scope.macInputModel) {
+        reInitIdentityDatas();
+      }
+    });
+
+    $scope.$on('$destroy', function () {
+      $interval.cancel(intervalId);
+    });
+
+    var intervalId;
+    function reInitIdentityDatas() {
+      // $interval.cancel(intervalId);
+      queryIdentities();
+      // intervalId = $interval(function () {
+      //    queryIdentities();
+      // }, DATA_REFRESH_INTERVAL * 1000);
+    };
+
+    function queryIdentities() {
+      var mac = $scope.macInputModel.split(':');
+      if (mac == null || mac.length < 2) {
+        return;
+      }
+      if ($scope.isTreeView) {
+        IdentityService.fetchIdentityOfMachine(mac[0], mac[1], $scope.searchKey).success(
+          function (data) {
+            if (data.code == 0 && data.data) {
+              $scope.identities = data.data;
+              $scope.totalCount = $scope.identities.length;
+            } else {
+              $scope.identities = [];
+              $scope.totalCount = 0;
+            }
+          }
+        );
+      } else {
+        IdentityService.fetchClusterNodeOfMachine(mac[0], mac[1], $scope.searchKey).success(
+          function (data) {
+            if (data.code == 0 && data.data) {
+              $scope.identities = data.data;
+              $scope.totalCount = $scope.identities.length;
+            } else {
+              $scope.identities = [];
+              $scope.totalCount = 0;
+            }
+          }
+        );
+      }
+    };
+    $scope.queryIdentities = queryIdentities;
+  }]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/login.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/login.js
new file mode 100644
index 0000000..3d49d3c
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/login.js
@@ -0,0 +1,33 @@
+var app = angular.module('sentinelDashboardApp');
+
+app.controller('LoginCtl', ['$scope', '$state', '$window', 'AuthService',
+  function ($scope, $state, $window, AuthService) {
+    // If auth passed, jump to the index page directly
+    if ($window.localStorage.getItem('session_sentinel_admin')) {
+      $state.go('dashboard');
+    }
+
+    $scope.login = function () {
+      if (!$scope.username) {
+        alert('璇疯緭鍏ョ敤鎴峰悕');
+        return;
+      }
+
+      if (!$scope.password) {
+        alert('璇疯緭鍏ュ瘑鐮�');
+        return;
+      }
+
+      var param = {"username": $scope.username, "password": $scope.password};
+
+      AuthService.login(param).success(function (data) {
+        if (data.code == 0) {
+          $window.localStorage.setItem('session_sentinel_admin', JSON.stringify(data.data));
+          $state.go('dashboard');
+        } else {
+          alert(data.msg);
+        }
+      });
+    };
+  }]
+);
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/machine.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/machine.js
new file mode 100644
index 0000000..1618047
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/machine.js
@@ -0,0 +1,65 @@
+var app = angular.module('sentinelDashboardApp');
+
+app.controller('MachineCtl', ['$scope', '$stateParams', 'MachineService',
+  function ($scope, $stateParams, MachineService) {
+    $scope.app = $stateParams.app;
+    $scope.propertyName = '';
+    $scope.reverse = false;
+    $scope.currentPage = 1;
+    $scope.machines = [];
+    $scope.machinesPageConfig = {
+      pageSize: 10,
+      currentPageIndex: 1,
+      totalPage: 1,
+      totalCount: 0,
+    };
+
+    $scope.sortBy = function (propertyName) {
+      // console.log('machine sortBy ' + propertyName);
+      $scope.reverse = ($scope.propertyName === propertyName) ? !$scope.reverse : false;
+      $scope.propertyName = propertyName;
+    };
+    
+    $scope.reloadMachines = function() {
+      MachineService.getAppMachines($scope.app).success(
+        function (data) {
+          // console.log('get machines: ' + data.data[0].hostname)
+          if (data.code == 0 && data.data) {
+            $scope.machines = data.data;
+            var healthy = 0;
+            $scope.machines.forEach(function (item) {
+              if (item.healthy) {
+                  healthy++;
+              }
+              if (!item.hostname) {
+                item.hostname = '鏈煡'
+              }
+            })
+            $scope.healthyCount = healthy;
+            $scope.machinesPageConfig.totalCount = $scope.machines.length;
+          } else {
+            $scope.machines = [];
+            $scope.healthyCount = 0;
+          }
+        }
+      );
+    };
+    
+    $scope.removeMachine = function(ip, port) {
+      if (!confirm("confirm to remove machine [" + ip + ":" + port + "]?")) {
+        return;
+      }
+      MachineService.removeAppMachine($scope.app, ip, port).success(
+        function(data) {
+          if (data.code == 0) {
+            $scope.reloadMachines();
+          } else {
+            alert("remove failed");
+          }
+        }
+      );
+    };
+    
+    $scope.reloadMachines();
+    
+  }]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/main.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/main.js
new file mode 100644
index 0000000..37500f7
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/main.js
@@ -0,0 +1,10 @@
+/**
+ * @ngdoc function
+ * @name sentinelDashboardApp.controller:MainCtrl
+ * @description
+ * # MainCtrl
+ * Controller of the sentinelDashboardApp
+ */
+angular.module('sentinelDashboardApp')
+  .controller('DashboardCtrl', ['$scope', '$position', function ($scope, $position) {
+  }]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/metric.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/metric.js
new file mode 100644
index 0000000..71496eb
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/metric.js
@@ -0,0 +1,269 @@
+var app = angular.module('sentinelDashboardApp');
+
+app.controller('MetricCtl', ['$scope', '$stateParams', 'MetricService', '$interval', '$timeout',
+  function ($scope, $stateParams, MetricService, $interval, $timeout) {
+	$scope.charts = [];
+    $scope.endTime = new Date();
+    $scope.startTime = new Date();
+    $scope.startTime.setMinutes($scope.endTime.getMinutes() - 30);
+    $scope.startTimeFmt = formatDate($scope.startTime);
+    $scope.endTimeFmt = formatDate($scope.endTime);
+    function formatDate(date) {
+      return moment(date).format('YYYY/MM/DD HH:mm:ss');
+    }
+    $scope.changeStartTime = function (startTime) {
+      $scope.startTime = new Date(startTime);
+      $scope.startTimeFmt = formatDate(startTime);
+    };
+    $scope.changeEndTime = function (endTime) {
+      $scope.endTime = new Date(endTime);
+      $scope.endTimeFmt = formatDate(endTime);
+    };
+
+    $scope.app = $stateParams.app;
+    // 鏁版嵁鑷姩鍒锋柊棰戠巼
+    var DATA_REFRESH_INTERVAL = 1000 * 10;
+
+    $scope.servicePageConfig = {
+      pageSize: 6,
+      currentPageIndex: 1,
+      totalPage: 1,
+      totalCount: 0,
+    };
+    $scope.servicesChartConfigs = [];
+
+    $scope.pageChanged = function (newPageNumber) {
+      $scope.servicePageConfig.currentPageIndex = newPageNumber;
+      reInitIdentityDatas();
+    };
+
+    var searchT;
+    $scope.searchService = function () {
+      $timeout.cancel(searchT);
+      searchT = $timeout(function () {
+        reInitIdentityDatas();
+      }, 600);
+    }
+
+    var intervalId;
+    reInitIdentityDatas();
+    function reInitIdentityDatas() {
+      $interval.cancel(intervalId);
+      queryIdentityDatas();
+      intervalId = $interval(function () {
+        queryIdentityDatas();
+      }, DATA_REFRESH_INTERVAL);
+    };
+
+    $scope.$on('$destroy', function () {
+      $interval.cancel(intervalId);
+    });
+    $scope.initAllChart = function () {
+      //revoke useless charts positively
+      while($scope.charts.length > 0) {
+      	let chart = $scope.charts.pop();
+      	chart.destroy();
+      }
+      $.each($scope.metrics, function (idx, metric) {
+        if (idx == $scope.metrics.length - 1) {
+          return;
+        }
+        const chart = new G2.Chart({
+          container: 'chart' + idx,
+          forceFit: true,
+          width: 100,
+          height: 250,
+          padding: [10, 30, 70, 50]
+        });
+        $scope.charts.push(chart);
+        var maxQps = 0;
+        for (var i in metric.data) {
+          var item = metric.data[i];
+          if (item.passQps > maxQps) {
+            maxQps = item.passQps;
+          }
+          if (item.blockQps > maxQps) {
+            maxQps = item.blockQps;
+          }
+        }
+        chart.source(metric.data);
+        chart.scale('timestamp', {
+          type: 'time',
+          mask: 'YYYY-MM-DD HH:mm:ss'
+        });
+        chart.scale('passQps', {
+          min: 0,
+          max: maxQps,
+          fine: true,
+          alias: '閫氳繃 QPS'
+          // max: 10
+        });
+        chart.scale('blockQps', {
+          min: 0,
+          max: maxQps,
+          fine: true,
+          alias: '鎷掔粷 QPS',
+        });
+        chart.scale('rt', {
+          min: 0,
+          fine: true,
+        });
+        chart.axis('rt', {
+          grid: null,
+          label: null
+        });
+        chart.axis('blockQps', {
+          grid: null,
+          label: null
+        });
+
+        chart.axis('timestamp', {
+          label: {
+            textStyle: {
+              textAlign: 'center', // 鏂囨湰瀵归綈鏂瑰悜锛屽彲鍙栧�间负锛� start center end
+              fill: '#404040', // 鏂囨湰鐨勯鑹�
+              fontSize: '11', // 鏂囨湰澶у皬
+              //textBaseline: 'top', // 鏂囨湰鍩哄噯绾匡紝鍙彇 top middle bottom锛岄粯璁や负middle
+            },
+            autoRotate: false,
+            formatter: function (text, item, index) {
+              return text.substring(11, 11 + 5);
+            }
+          }
+        });
+        chart.legend({
+          custom: true,
+          position: 'bottom',
+          allowAllCanceled: true,
+          itemFormatter: function (val) {
+            if ('passQps' === val) {
+              return '閫氳繃 QPS';
+            }
+            if ('blockQps' === val) {
+              return '鎷掔粷 QPS';
+            }
+            return val;
+          },
+          items: [
+            { value: 'passQps', marker: { symbol: 'hyphen', stroke: 'green', radius: 5, lineWidth: 2 } },
+            { value: 'blockQps', marker: { symbol: 'hyphen', stroke: 'blue', radius: 5, lineWidth: 2 } },
+            //{ value: 'rt', marker: {symbol: 'hyphen', stroke: 'gray', radius: 5, lineWidth: 2} },
+          ],
+          onClick: function (ev) {
+            const item = ev.item;
+            const value = item.value;
+            const checked = ev.checked;
+            const geoms = chart.getAllGeoms();
+            for (var i = 0; i < geoms.length; i++) {
+              const geom = geoms[i];
+              if (geom.getYScale().field === value) {
+                if (checked) {
+                  geom.show();
+                } else {
+                  geom.hide();
+                }
+              }
+            }
+          }
+        });
+        chart.line().position('timestamp*passQps').size(1).color('green').shape('smooth');
+        chart.line().position('timestamp*blockQps').size(1).color('blue').shape('smooth');
+        //chart.line().position('timestamp*rt').size(1).color('gray').shape('smooth');
+        G2.track(false);
+        chart.render();
+      });
+    };
+
+    $scope.metrics = [];
+    $scope.emptyObjs = [];
+    function queryIdentityDatas() {
+      var params = {
+        app: $scope.app,
+        pageIndex: $scope.servicePageConfig.currentPageIndex,
+        pageSize: $scope.servicePageConfig.pageSize,
+        desc: $scope.isDescOrder,
+        searchKey: $scope.serviceQuery
+      };
+      MetricService.queryAppSortedIdentities(params).success(function (data) {
+        $scope.metrics = [];
+        $scope.emptyObjs = [];
+        if (data.code === 0 && data.data) {
+          var metricsObj = data.data.metric;
+          var identityNames = Object.keys(metricsObj);
+          if (identityNames.length < 1) {
+            $scope.emptyServices = true;
+          } else {
+            $scope.emptyServices = false;
+          }
+          $scope.servicePageConfig.totalPage = data.data.totalPage;
+          $scope.servicePageConfig.pageSize = data.data.pageSize;
+          var totalCount = data.data.totalCount;
+          $scope.servicePageConfig.totalCount = totalCount;
+          for (i = 0; i < totalCount; i++) {
+            $scope.emptyObjs.push({});
+          }
+          $.each(identityNames, function (idx, identityName) {
+            var identityDatas = metricsObj[identityName];
+            var metrics = {};
+            metrics.resource = identityName;
+            // metrics.data = identityDatas;
+            metrics.data = fillZeros(identityDatas);
+            metrics.shortData = lastOfArray(identityDatas, 6);
+            $scope.metrics.push(metrics);
+          });
+          // push an empty element in the last, for ng-init reasons.
+          $scope.metrics.push([]);
+        } else {
+          $scope.emptyServices = true;
+          console.log(data.msg);
+        }
+      });
+    };
+    function fillZeros(metricData) {
+      if (!metricData || metricData.length == 0) {
+        return [];
+      }
+      var filledData = [];
+      filledData.push(metricData[0]);
+      var lastTime = metricData[0].timestamp / 1000;
+      for (var i = 1; i < metricData.length; i++) {
+        var curTime = metricData[i].timestamp / 1000;
+        if (curTime > lastTime + 1) {
+          for (var j = lastTime + 1; j < curTime; j++) {
+            filledData.push({
+                "timestamp": j * 1000,
+                "passQps": 0,
+                "blockQps": 0,
+                "successQps": 0,
+                "exception": 0,
+                "rt": 0,
+                "count": 0
+            })
+          }
+        }
+        filledData.push(metricData[i]);
+        lastTime = curTime;
+      }
+      return filledData;
+    }
+    function lastOfArray(arr, n) {
+      if (!arr.length) {
+        return [];
+      }
+      var rs = [];
+      for (i = 0; i < n && i < arr.length; i++) {
+        rs.push(arr[arr.length - 1 - i]);
+      }
+      return rs;
+    }
+
+    $scope.isDescOrder = true;
+    $scope.setDescOrder = function () {
+      $scope.isDescOrder = true;
+      reInitIdentityDatas();
+    }
+    $scope.setAscOrder = function () {
+      $scope.isDescOrder = false;
+      reInitIdentityDatas();
+    }
+  }]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/param_flow.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/param_flow.js
new file mode 100644
index 0000000..65d868a
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/param_flow.js
@@ -0,0 +1,328 @@
+/**
+ * Parameter flow control controller.
+ * 
+ * @author Eric Zhao
+ */
+angular.module('sentinelDashboardApp').controller('ParamFlowController', ['$scope', '$stateParams', 'ParamFlowService', 'ngDialog',
+  'MachineService',
+  function ($scope, $stateParams, ParamFlowService, ngDialog,
+    MachineService) {
+    const UNSUPPORTED_CODE = 4041;
+    $scope.app = $stateParams.app;
+    $scope.curExItem = {};
+
+    $scope.paramItemClassTypeList = [
+      'int', 'double', 'java.lang.String', 'long', 'float', 'char', 'byte'
+    ];
+
+    $scope.rulesPageConfig = {
+      pageSize: 10,
+      currentPageIndex: 1,
+      totalPage: 1,
+      totalCount: 0,
+    };
+    $scope.macsInputConfig = {
+      searchField: ['text', 'value'],
+      persist: true,
+      create: false,
+      maxItems: 1,
+      render: {
+        item: function (data, escape) {
+          return '<div>' + escape(data.text) + '</div>';
+        }
+      },
+      onChange: function (value, oldValue) {
+        $scope.macInputModel = value;
+      }
+    };
+
+      function updateSingleParamItem(arr, v, t, c) {
+          for (let i = 0; i < arr.length; i++) {
+              if (arr[i].object === v && arr[i].classType === t) {
+                  arr[i].count = c;
+                  return;
+              }
+          }
+          arr.push({object: v, classType: t, count: c});
+      }
+
+      function removeSingleParamItem(arr, v, t) {
+          for (let i = 0; i < arr.length; i++) {
+              if (arr[i].object === v && arr[i].classType === t) {
+                  arr.splice(i, 1);
+                  break;
+              }
+          }
+      }
+
+      function isNumberClass(classType) {
+        return classType === 'int' || classType === 'double' ||
+            classType === 'float' || classType === 'long' || classType === 'short';
+      }
+
+      function isByteClass(classType) {
+          return classType === 'byte';
+      }
+
+      function notNumberAtLeastZero(num) {
+        return num === undefined || num === '' || isNaN(num) || num < 0;
+      }
+
+      function notGoodNumber(num) {
+          return num === undefined || num === '' || isNaN(num);
+      }
+
+      function notGoodNumberBetweenExclusive(num, l ,r) {
+          return num === undefined || num === '' || isNaN(num) || num < l || num > r;
+      }
+
+      $scope.notValidParamItem = (curExItem) => {
+        if (isNumberClass(curExItem.classType) && notGoodNumber(curExItem.object)) {
+          return true;
+        }
+        if (isByteClass(curExItem.classType) && notGoodNumberBetweenExclusive(curExItem.object, -128, 127)) {
+          return true;
+        }
+        return curExItem.object === undefined || curExItem.classType === undefined ||
+            notNumberAtLeastZero(curExItem.count);
+      };
+
+      $scope.addParamItem = () => {
+          updateSingleParamItem($scope.currentRule.rule.paramFlowItemList,
+              $scope.curExItem.object, $scope.curExItem.classType, $scope.curExItem.count);
+          let oldItem = $scope.curExItem;
+          $scope.curExItem = {classType: oldItem.classType};
+      };
+
+      $scope.removeParamItem = (v, t) => {
+          removeSingleParamItem($scope.currentRule.rule.paramFlowItemList, v, t);
+      };
+
+    function getMachineRules() {
+      if (!$scope.macInputModel) {
+        return;
+      }
+      let mac = $scope.macInputModel.split(':');
+      ParamFlowService.queryMachineRules($scope.app, mac[0], mac[1])
+        .success(function (data) {
+          if (data.code === 0 && data.data) {
+            $scope.loadError = undefined;
+            $scope.rules = data.data;
+            $scope.rulesPageConfig.totalCount = $scope.rules.length;
+          } else {
+            $scope.rules = [];
+            $scope.rulesPageConfig.totalCount = 0;
+            if (data.code === UNSUPPORTED_CODE) {
+              $scope.loadError = {message: "鏈哄櫒 " + mac[0] + ":" + mac[1] + " 鐨� Sentinel 瀹㈡埛绔増鏈笉鏀寔鐑偣鍙傛暟闄愭祦鍔熻兘锛岃鍗囩骇鑷� 0.2.0 浠ヤ笂鐗堟湰骞跺紩鍏� sentinel-parameter-flow-control 渚濊禆銆�"}
+            } else {
+              $scope.loadError = {message: data.msg}
+            }
+          }
+        })
+        .error((data, header, config, status) => {
+          $scope.loadError = {message: "鏈煡閿欒"}
+        });
+    }
+    $scope.getMachineRules = getMachineRules;
+    getMachineRules();
+
+    var paramFlowRuleDialog;
+
+    $scope.editRule = function (rule) {
+      $scope.currentRule = angular.copy(rule);
+      if ($scope.currentRule.rule && $scope.currentRule.rule.durationInSec === undefined) {
+        $scope.currentRule.rule.durationInSec = 1;
+      }
+      $scope.paramFlowRuleDialog = {
+        title: '缂栬緫鐑偣瑙勫垯',
+        type: 'edit',
+        confirmBtnText: '淇濆瓨',
+        supportAdvanced: true,
+        showAdvanceButton: rule.rule.paramFlowItemList === undefined || rule.rule.paramFlowItemList.length <= 0
+      };
+      paramFlowRuleDialog = ngDialog.open({
+        template: '/app/views/dialog/param-flow-rule-dialog.html',
+        width: 680,
+        overlay: true,
+        scope: $scope
+      });
+      $scope.curExItem = {};
+    };
+
+    $scope.addNewRule = function () {
+      var mac = $scope.macInputModel.split(':');
+      $scope.currentRule = {
+        app: $scope.app,
+        ip: mac[0],
+        port: mac[1],
+        rule: {
+          grade: 1,
+          paramFlowItemList: [],
+          count: 0,
+          limitApp: 'default',
+          controlBehavior: 0,
+          durationInSec: 1,
+          burstCount: 0,
+          maxQueueingTimeMs: 0,
+          clusterMode: false,
+          clusterConfig: {
+            thresholdType: 0,
+            fallbackToLocalWhenFail: true,
+          }
+        }
+      };
+      $scope.paramFlowRuleDialog = {
+        title: '鏂板鐑偣瑙勫垯',
+        type: 'add',
+        confirmBtnText: '鏂板',
+        supportAdvanced: true,
+        showAdvanceButton: true,
+      };
+      paramFlowRuleDialog = ngDialog.open({
+        template: '/app/views/dialog/param-flow-rule-dialog.html',
+        width: 680,
+        overlay: true,
+        scope: $scope
+      });
+      $scope.curExItem = {};
+    };
+
+      $scope.onOpenAdvanceClick = function () {
+          $scope.paramFlowRuleDialog.showAdvanceButton = false;
+      };
+      $scope.onCloseAdvanceClick = function () {
+          $scope.paramFlowRuleDialog.showAdvanceButton = true;
+      };
+
+    $scope.saveRule = function () {
+      if (!ParamFlowService.checkRuleValid($scope.currentRule.rule)) {
+        return;
+      }
+      if ($scope.paramFlowRuleDialog.type === 'add') {
+        addNewRuleAndPush($scope.currentRule);
+      } else if ($scope.paramFlowRuleDialog.type === 'edit') {
+        saveRuleAndPush($scope.currentRule, true);
+      }
+    };
+
+    function addNewRuleAndPush(rule) {
+      ParamFlowService.addNewRule(rule).success((data) => {
+        if (data.success) {
+          getMachineRules();
+          paramFlowRuleDialog.close();
+        } else {
+          alert('娣诲姞瑙勫垯澶辫触锛�' + data.msg);
+        }
+      }).error((data) => {
+        if (data) {
+          alert('娣诲姞瑙勫垯澶辫触锛�' + data.msg);
+        } else {
+          alert("娣诲姞瑙勫垯澶辫触锛氭湭鐭ラ敊璇�");
+        }
+      });
+    }
+
+    function saveRuleAndPush(rule, edit) {
+      ParamFlowService.saveRule(rule).success(function (data) {
+        if (data.success) {
+          alert("淇敼瑙勫垯鎴愬姛");
+          getMachineRules();
+          if (edit) {
+            paramFlowRuleDialog.close();
+          } else {
+            confirmDialog.close();
+          }
+        } else {
+          alert('淇敼瑙勫垯澶辫触锛�' + data.msg);
+        }
+      }).error((data) => {
+        if (data) {
+          alert('淇敼瑙勫垯澶辫触锛�' + data.msg);
+        } else {
+          alert("淇敼瑙勫垯澶辫触锛氭湭鐭ラ敊璇�");
+        }
+      });
+    }
+
+    function deleteRuleAndPush(entity) {
+      if (entity.id === undefined || isNaN(entity.id)) {
+        alert('瑙勫垯 ID 涓嶅悎娉曪紒');
+        return;
+      }
+      ParamFlowService.deleteRule(entity).success((data) => {
+        if (data.code == 0) {
+          getMachineRules();
+          confirmDialog.close();
+        } else {
+          alert('鍒犻櫎瑙勫垯澶辫触锛�' + data.msg);
+        }
+      }).error((data) => {
+        if (data) {
+          alert('鍒犻櫎瑙勫垯澶辫触锛�' + data.msg);
+        } else {
+          alert("鍒犻櫎瑙勫垯澶辫触锛氭湭鐭ラ敊璇�");
+        }
+      });
+    };
+
+    var confirmDialog;
+    $scope.deleteRule = function (ruleEntity) {
+      $scope.currentRule = ruleEntity;
+      console.log('deleting: ' + ruleEntity);
+      $scope.confirmDialog = {
+        title: '鍒犻櫎鐑偣瑙勫垯',
+        type: 'delete_rule',
+        attentionTitle: '璇风‘璁ゆ槸鍚﹀垹闄ゅ涓嬬儹鐐瑰弬鏁伴檺娴佽鍒�',
+        attention: '璧勬簮鍚�: ' + ruleEntity.rule.resource + ', 鐑偣鍙傛暟绱㈠紩: ' + ruleEntity.rule.paramIdx +
+            ', 闄愭祦妯″紡: ' + (ruleEntity.rule.grade === 1 ? 'QPS' : '鏈煡') + ', 闄愭祦闃堝��: ' + ruleEntity.rule.count,
+        confirmBtnText: '鍒犻櫎',
+      };
+      confirmDialog = ngDialog.open({
+        template: '/app/views/dialog/confirm-dialog.html',
+        scope: $scope,
+        overlay: true
+      });
+    };
+
+    $scope.confirm = function () {
+      if ($scope.confirmDialog.type === 'delete_rule') {
+        deleteRuleAndPush($scope.currentRule);
+      } else {
+        console.error('error');
+      }
+    };
+
+    queryAppMachines();
+
+    function queryAppMachines() {
+      MachineService.getAppMachines($scope.app).success(
+        function (data) {
+          if (data.code == 0) {
+            // $scope.machines = data.data;
+            if (data.data) {
+              $scope.machines = [];
+              $scope.macsInputOptions = [];
+              data.data.forEach(function (item) {
+                if (item.healthy) {
+                  $scope.macsInputOptions.push({
+                    text: item.ip + ':' + item.port,
+                    value: item.ip + ':' + item.port
+                  });
+                }
+              });
+            }
+            if ($scope.macsInputOptions.length > 0) {
+              $scope.macInputModel = $scope.macsInputOptions[0].value;
+            }
+          } else {
+            $scope.macsInputOptions = [];
+          }
+        }
+      );
+    };
+    $scope.$watch('macInputModel', function () {
+      if ($scope.macInputModel) {
+        getMachineRules();
+      }
+    });
+  }]);
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/system.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/system.js
new file mode 100644
index 0000000..5b3107f
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/system.js
@@ -0,0 +1,239 @@
+var app = angular.module('sentinelDashboardApp');
+
+app.controller('SystemCtl', ['$scope', '$stateParams', 'SystemService', 'ngDialog', 'MachineService',
+  function ($scope, $stateParams, SystemService,
+    ngDialog, MachineService) {
+    //鍒濆鍖�
+    $scope.app = $stateParams.app;
+    $scope.rulesPageConfig = {
+      pageSize: 10,
+      currentPageIndex: 1,
+      totalPage: 1,
+      totalCount: 0,
+    };
+    $scope.macsInputConfig = {
+      searchField: ['text', 'value'],
+      persist: true,
+      create: false,
+      maxItems: 1,
+      render: {
+        item: function (data, escape) {
+          return '<div>' + escape(data.text) + '</div>';
+        }
+      },
+      onChange: function (value, oldValue) {
+        $scope.macInputModel = value;
+      }
+    };
+
+    getMachineRules();
+    function getMachineRules() {
+      if (!$scope.macInputModel) {
+        return;
+      }
+      let mac = $scope.macInputModel.split(':');
+      SystemService.queryMachineRules($scope.app, mac[0], mac[1]).success(
+        function (data) {
+          if (data.code === 0 && data.data) {
+            $scope.rules = data.data;
+            $.each($scope.rules, function (idx, rule) {
+              if (rule.highestSystemLoad >= 0) {
+                rule.grade = 0;
+              } else if (rule.avgRt >= 0) {
+                rule.grade = 1;
+              } else if (rule.maxThread >= 0) {
+                rule.grade = 2;
+              } else if (rule.qps >= 0) {
+                rule.grade = 3;
+              } else if (rule.highestCpuUsage >= 0) {
+                  rule.grade = 4;
+              }
+            });
+            $scope.rulesPageConfig.totalCount = $scope.rules.length;
+          } else {
+            $scope.rules = [];
+            $scope.rulesPageConfig.totalCount = 0;
+          }
+        });
+    }
+
+    $scope.getMachineRules = getMachineRules;
+    var systemRuleDialog;
+    $scope.editRule = function (rule) {
+      $scope.currentRule = angular.copy(rule);
+      $scope.systemRuleDialog = {
+        title: '缂栬緫绯荤粺淇濇姢瑙勫垯',
+        type: 'edit',
+        confirmBtnText: '淇濆瓨'
+      };
+      systemRuleDialog = ngDialog.open({
+        template: '/app/views/dialog/system-rule-dialog.html',
+        width: 680,
+        overlay: true,
+        scope: $scope
+      });
+    };
+
+    $scope.addNewRule = function () {
+      var mac = $scope.macInputModel.split(':');
+      $scope.currentRule = {
+        grade: 0,
+        app: $scope.app,
+        ip: mac[0],
+        port: mac[1],
+      };
+      $scope.systemRuleDialog = {
+        title: '鏂板绯荤粺淇濇姢瑙勫垯',
+        type: 'add',
+        confirmBtnText: '鏂板'
+      };
+      systemRuleDialog = ngDialog.open({
+        template: '/app/views/dialog/system-rule-dialog.html',
+        width: 680,
+        overlay: true,
+        scope: $scope
+      });
+    };
+
+    $scope.saveRule = function () {
+      if ($scope.systemRuleDialog.type === 'add') {
+        addNewRule($scope.currentRule);
+      } else if ($scope.systemRuleDialog.type === 'edit') {
+        saveRule($scope.currentRule, true);
+      }
+    };
+
+    var confirmDialog;
+    $scope.deleteRule = function (rule) {
+      $scope.currentRule = rule;
+      var ruleTypeDesc = '';
+      var ruleTypeCount = null;
+      if (rule.highestSystemLoad != -1) {
+        ruleTypeDesc = 'LOAD';
+        ruleTypeCount = rule.highestSystemLoad;
+      } else if (rule.avgRt != -1) {
+        ruleTypeDesc = 'RT';
+        ruleTypeCount = rule.avgRt;
+      } else if (rule.maxThread != -1) {
+        ruleTypeDesc = '绾跨▼鏁�';
+        ruleTypeCount = rule.maxThread;
+      } else if (rule.qps != -1) {
+        ruleTypeDesc = 'QPS';
+        ruleTypeCount = rule.qps;
+      }else if (rule.highestCpuUsage != -1) {
+          ruleTypeDesc = 'CPU 浣跨敤鐜�';
+          ruleTypeCount = rule.highestCpuUsage;
+      }
+
+      $scope.confirmDialog = {
+        title: '鍒犻櫎绯荤粺淇濇姢瑙勫垯',
+        type: 'delete_rule',
+        attentionTitle: '璇风‘璁ゆ槸鍚﹀垹闄ゅ涓嬬郴缁熶繚鎶よ鍒�',
+        attention: '闃堝�肩被鍨�: ' + ruleTypeDesc + ', 闃堝��: ' + ruleTypeCount,
+        confirmBtnText: '鍒犻櫎',
+      };
+      confirmDialog = ngDialog.open({
+        template: '/app/views/dialog/confirm-dialog.html',
+        scope: $scope,
+        overlay: true
+      });
+    };
+
+
+    $scope.confirm = function () {
+      if ($scope.confirmDialog.type === 'delete_rule') {
+        deleteRule($scope.currentRule);
+        // } else if ($scope.confirmDialog.type == 'enable_rule') {
+        //     $scope.currentRule.enable = true;
+        //     saveRule($scope.currentRule);
+        // } else if ($scope.confirmDialog.type == 'disable_rule') {
+        //     $scope.currentRule.enable = false;
+        //     saveRule($scope.currentRule);
+        // } else if ($scope.confirmDialog.type == 'enable_all') {
+        //     enableAll($scope.app);
+        // } else if ($scope.confirmDialog.type == 'disable_all') {
+        //     disableAll($scope.app);
+      } else {
+        console.error('error');
+      }
+    };
+
+    function deleteRule(rule) {
+      SystemService.deleteRule(rule).success(function (data) {
+        if (data.code === 0) {
+          getMachineRules();
+          confirmDialog.close();
+        } else if (data.msg != null) {
+            alert('澶辫触锛�' + data.msg);
+        } else {
+            alert('澶辫触锛氭湭鐭ラ敊璇�');
+        }
+      });
+    }
+
+    function addNewRule(rule) {
+      if (rule.grade == 4 && (rule.highestCpuUsage < 0 || rule.highestCpuUsage > 1)) {
+        alert('CPU 浣跨敤鐜囨ā寮忕殑鍙栧�艰寖鍥村簲涓� [0.0, 1.0]锛屽搴� 0% - 100%');
+        return;
+      }
+      SystemService.newRule(rule).success(function (data) {
+        if (data.code === 0) {
+          getMachineRules();
+          systemRuleDialog.close();
+        } else if (data.msg != null) {
+          alert('澶辫触锛�' + data.msg);
+        } else {
+          alert('澶辫触锛氭湭鐭ラ敊璇�');
+        }
+      });
+    }
+
+    function saveRule(rule, edit) {
+      SystemService.saveRule(rule).success(function (data) {
+        if (data.code === 0) {
+          getMachineRules();
+          if (edit) {
+            systemRuleDialog.close();
+          } else {
+            confirmDialog.close();
+          }
+        } else if (data.msg != null) {
+          alert('澶辫触锛�' + data.msg);
+        } else {
+          alert('澶辫触锛氭湭鐭ラ敊璇�');
+        }
+      });
+    }
+    queryAppMachines();
+    function queryAppMachines() {
+      MachineService.getAppMachines($scope.app).success(
+        function (data) {
+          if (data.code === 0) {
+            // $scope.machines = data.data;
+            if (data.data) {
+              $scope.machines = [];
+              $scope.macsInputOptions = [];
+              data.data.forEach(function (item) {
+                if (item.healthy) {
+                  $scope.macsInputOptions.push({
+                    text: item.ip + ':' + item.port,
+                    value: item.ip + ':' + item.port
+                  });
+                }
+              });
+            }
+            if ($scope.macsInputOptions.length > 0) {
+              $scope.macInputModel = $scope.macsInputOptions[0].value;
+            }
+          } else {
+            $scope.macsInputOptions = [];
+          }
+        }
+      );
+    };
+    $scope.$watch('macInputModel', function () {
+      if ($scope.macInputModel) {
+        getMachineRules();
+      }
+    });
+  }]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/header/header.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/header/header.html
new file mode 100644
index 0000000..4584e89
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/header/header.html
@@ -0,0 +1,15 @@
+<div class="header">
+  <nav class="navbar navbar-fixed-top navbar-inverse" style="" role="navigation">
+    <div class="navbar-brand">
+      <span style="color: #fff;font-size: 26px;" ng-model="dashboardVersion">Sentinel 鎺у埗鍙� {{dashboardVersion}}</span>
+    </div>
+    <ul class="nav navbar-nav navbar-right">
+      <li ng-show="showLogout">
+        <a href="javascript:void(0);" ng-click="logout()"
+           style="margin: 3px 15px 0 0;"><span class="glyphicon glyphicon-log-out"></span>&nbsp;娉ㄩ攢</a>
+      </li>
+    </ul>
+  </nav>
+  <!-- end nav -->
+  <sidebar></sidebar>
+</div>
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/header/header.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/header/header.js
new file mode 100644
index 0000000..4e6c8f2
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/header/header.js
@@ -0,0 +1,61 @@
+/**
+ * @ngdoc directive
+ * @name izzyposWebApp.directive:adminPosHeader
+ * @description
+ * # adminPosHeader
+ */
+angular.module('sentinelDashboardApp')
+  .directive('header', ['VersionService', 'AuthService', function () {
+    return {
+      templateUrl: 'app/scripts/directives/header/header.html',
+      restrict: 'E',
+      replace: true,
+      controller: function ($scope, $state, $window, VersionService, AuthService) {
+        VersionService.version().success(function (data) {
+          if (data.code == 0) {
+            $scope.dashboardVersion = data.data;
+          }
+        });
+
+        if (!$window.localStorage.getItem("session_sentinel_admin")) {
+          AuthService.check().success(function (data) {
+            if (data.code == 0) {
+              $window.localStorage.setItem('session_sentinel_admin', JSON.stringify(data.data));
+              handleLogout($scope, data.data.id)
+            } else {
+              $state.go('login');
+            }
+          });
+        } else {
+          try {
+            var id = JSON.parse($window.localStorage.getItem("session_sentinel_admin")).id;
+            handleLogout($scope, id);
+          } catch (e) {
+            // Historical version compatibility processing, fixes issue-1449
+            // If error happens while parsing, remove item in localStorage and redirect to login page.
+            $window.localStorage.removeItem("session_sentinel_admin");
+            $state.go('login');
+          }
+        }
+
+        function handleLogout($scope, id) {
+          if (id == 'FAKE_EMP_ID') {
+            $scope.showLogout = false;
+          } else {
+            $scope.showLogout = true;
+          }
+        }
+
+        $scope.logout = function () {
+          AuthService.logout().success(function (data) {
+            if (data.code == 0) {
+              $window.localStorage.removeItem("session_sentinel_admin");
+              $state.go('login');
+            } else {
+              alert('logout error');
+            }
+          });
+        }
+      }
+    }
+  }]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar-search/sidebar-search.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar-search/sidebar-search.html
new file mode 100644
index 0000000..18b2b3a
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar-search/sidebar-search.html
@@ -0,0 +1,10 @@
+<li class="sidebar-search">
+  <div class="input-group custom-search-form">
+    <input type="text" class="form-control" ng-model="searchApp" placeholder="Search...">
+    <span class="input-group-btn">
+      <button class="btn btn-default" type="button">
+        <i class="fa fa-search"></i>
+      </button>
+    </span>
+  </div>
+</li>
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar-search/sidebar-search.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar-search/sidebar-search.js
new file mode 100644
index 0000000..31acca6
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar-search/sidebar-search.js
@@ -0,0 +1,20 @@
+/**
+ * @ngdoc directive
+ * @name izzyposWebApp.directive:adminPosHeader
+ * @description
+ * # adminPosHeader
+ */
+
+angular.module('sentinelDashboardApp')
+  .directive('sidebarSearch', function () {
+    return {
+      templateUrl: 'app/scripts/directives/sidebar/sidebar-search/sidebar-search.html',
+      restrict: 'E',
+      replace: true,
+      scope: {
+      },
+      controller: function ($scope) {
+        $scope.selectedMenu = 'home';
+      }
+    }
+  });
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar.html
new file mode 100644
index 0000000..40f68d3
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar.html
@@ -0,0 +1,91 @@
+<div class="navbar-default sidebar" role="navigation" style="overflow-y: auto;">
+  <div class="sidebar-nav navbar-collapse">
+    <ul class="nav in" id="side-menu">
+      <li class="sidebar-search">
+        <div class="input-group" style="">
+          <input type="text" class="form-control highlight-border" placeholder="搴旂敤鍚�" ng-model="searchApp">
+          <span class="input-group-btn">
+            <button class="btn btn-secondary btn-default-inverse" type="button">鎼滅储</button>
+          </span>
+        </div>
+      </li>
+      <li ui-sref-active="active">
+        <a ui-sref="dashboard.home" style="font-size:16px;">
+          <span class="glyphicon glyphicon-dashboard"></span>
+          &nbsp;&nbsp;棣栭〉</a>
+      </li>
+
+      <li ng-class="{active: true}" ng-repeat="entry in apps | filter: { app: searchApp }">{{dropDown}}
+        <a href="javascript:void(0);" ng-click="click($event)" collapse="{{collpaseall == 1}}" style="font-size: 16px;word-break: break-word;">
+          &nbsp;{{entry.app}}
+          <span class="fa arrow"></span>
+          <span class="arrow">({{entry.healthyCount}}/{{entry.machines.length}})</span>
+        </a>
+
+        <!--<ul class="nav nav-second-level" collapse="{{entry.active}}" style="display: none;">-->
+        <ul class="nav nav-second-level" ng-show="entry.active">
+          <li ui-sref-active="active">
+            <a ui-sref="dashboard.metric({app: entry.app})">
+              <i class="fa fa-bar-chart"></i>&nbsp;&nbsp;瀹炴椂鐩戞帶</a>
+          </li>
+
+          <li ui-sref-active="active" ng-if="!entry.isGateway">
+            <a ui-sref="dashboard.identity({app: entry.app})">
+              <i class="glyphicon glyphicon-list-alt"></i>&nbsp;&nbsp;绨囩偣閾捐矾</a>
+          </li>
+
+          <li ui-sref-active="active" ng-if="entry.isGateway">
+            <a ui-sref="dashboard.gatewayIdentity({app: entry.app})">
+              <i class="glyphicon glyphicon-filter"></i>&nbsp;&nbsp;璇锋眰閾捐矾</a>
+          </li>
+
+          <!--<li ui-sref-active="active" ng-if="entry.appType==0">-->
+            <!--<a ui-sref="dashboard.flow({app: entry.app})">-->
+              <!--<i class="glyphicon glyphicon-filter"></i>&nbsp;&nbsp;娴佹帶瑙勫垯 V1</a>-->
+          <!--</li>-->
+
+          <li ui-sref-active="active" ng-if="entry.isGateway">
+            <a ui-sref="dashboard.gatewayApi({app: entry.app})">
+              <i class="glyphicon glyphicon-tags"></i>&nbsp;&nbsp;&nbsp;API 绠$悊</a>
+          </li>
+          <li ui-sref-active="active" ng-if="entry.isGateway">
+            <a ui-sref="dashboard.gatewayFlow({app: entry.app})">
+              <i class="glyphicon glyphicon-filter"></i>&nbsp;&nbsp;娴佹帶瑙勫垯</a>
+          </li>
+
+          <li ui-sref-active="active" ng-if="!entry.isGateway">
+            <a ui-sref="dashboard.flowV1({app: entry.app})">
+              <i class="glyphicon glyphicon-filter"></i>&nbsp;&nbsp;娴佹帶瑙勫垯</a>
+          </li>
+
+          <li ui-sref-active="active">
+            <a ui-sref="dashboard.degrade({app: entry.app})">
+              <i class="glyphicon glyphicon-flash"></i>&nbsp;&nbsp;鐔旀柇瑙勫垯</a>
+          </li>
+          <li ui-sref-active="active" ng-if="!entry.isGateway">
+            <a ui-sref="dashboard.paramFlow({app: entry.app})">
+              <i class="glyphicon glyphicon-fire"></i>&nbsp;&nbsp;鐑偣瑙勫垯</a>
+          </li>
+          <li ui-sref-active="active">
+            <a ui-sref="dashboard.system({app: entry.app})">
+              <i class="glyphicon glyphicon-lock"></i>&nbsp;&nbsp;绯荤粺瑙勫垯</a>
+          </li>
+          <li ui-sref-active="active" ng-if="!entry.isGateway">
+            <a ui-sref="dashboard.authority({app: entry.app})">
+              <i class="glyphicon glyphicon-check"></i>&nbsp;&nbsp;鎺堟潈瑙勫垯</a>
+          </li>
+          <li ui-sref-active="active" ng-if="!entry.isGateway">
+            <a ui-sref="dashboard.clusterAppServerList({app: entry.app})">
+              <i class="glyphicon glyphicon-cloud"></i>&nbsp;&nbsp;闆嗙兢娴佹帶</a>
+          </li>
+
+          <li ui-sref-active="active">
+            <a ui-sref="dashboard.machine({app: entry.app})">
+              <i class="glyphicon glyphicon-th-list"></i>&nbsp;&nbsp;鏈哄櫒鍒楄〃</a>
+          </li>
+        </ul>
+        <!-- /.nav-second-level -->
+      </li>
+    </ul>
+  </div>
+</div>
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar.js
new file mode 100644
index 0000000..7ef5740
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar.js
@@ -0,0 +1,71 @@
+angular.module('sentinelDashboardApp')
+  .directive('sidebar', ['$location', '$stateParams', 'AppService', function () {
+    return {
+      templateUrl: 'app/scripts/directives/sidebar/sidebar.html',
+      restrict: 'E',
+      replace: true,
+      scope: {
+      },
+      controller: function ($scope, $stateParams, $location, AppService) {
+        $scope.app = $stateParams.app;
+        $scope.collapseVar = 0;
+
+        // app
+        AppService.getApps().success(
+          function (data) {
+            if (data.code === 0) {
+              let path = $location.path().split('/');
+              let initHashApp = path[path.length - 1];
+              $scope.apps = data.data;
+              $scope.apps = $scope.apps.map(function (item) {
+                if (item.app === initHashApp) {
+                  item.active = true;
+                }
+                let healthyCount = 0;
+                for (let i in item.machines) {
+                  if (item.machines[i].healthy) {
+                      healthyCount++;
+                  }
+                }
+                item.healthyCount = healthyCount;
+                // Handle appType
+                item.isGateway = item.appType === 1 || item.appType === 11 || item.appType === 12;
+
+                if (item.shown) {
+                  return item;
+                }
+              });
+            }
+          }
+        );
+
+        // toggle side bar
+        $scope.click = function ($event) {
+          let entry = angular.element($event.target).scope().entry;
+          entry.active = !entry.active;// toggle this clicked app bar
+
+          $scope.apps.forEach(function (item) { // collapse other app bars
+            if (item !== entry) {
+              item.active = false;
+            }
+          });
+        };
+
+        /**
+         * @deprecated
+         */
+        $scope.addSearchApp = function () {
+          let findApp = false;
+          for (let i = 0; i < $scope.apps.length; i++) {
+            if ($scope.apps[i].app === $scope.searchApp) {
+              findApp = true;
+              break;
+            }
+          }
+          if (!findApp) {
+            $scope.apps.push({ app: $scope.searchApp });
+          }
+        };
+      }
+    };
+  }]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/filters/filters.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/filters/filters.js
new file mode 100644
index 0000000..f39b08f
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/filters/filters.js
@@ -0,0 +1,17 @@
+var app = angular.module('sentinelDashboardApp');
+
+app.filter('range', [function () {
+  return function (input, length) {
+    if (isNaN(length) || length <= 0) {
+      return [];
+    }
+
+    input = [];
+    for (var index = 1; index <= length; index++) {
+      input.push(index);
+    }
+
+    return input;
+  };
+  
+}]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/libs/treeTable.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/libs/treeTable.js
new file mode 100644
index 0000000..1eff197
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/libs/treeTable.js
@@ -0,0 +1,292 @@
+var com_github_culmat_jsTreeTable =  (function(){
+
+	function depthFirst(tree, func, childrenAttr) {
+		childrenAttr = childrenAttr || 'children'
+		function i_depthFirst(node) {
+			if (node[childrenAttr]) {
+				$.each(node[childrenAttr], function(i, child) {
+					i_depthFirst(child)
+				})
+			}
+			func(node)
+		}
+		$.each(tree, function(i, root) {
+			i_depthFirst(root)
+		})
+		return tree
+	}
+	
+	/*
+	 * make a deep copy of the object
+	 */
+	function copy(data){
+		return JSON.parse(JSON.stringify(data))
+	}
+	
+	function makeTree (data, idAttr, refAttr, childrenAttr) {
+		var data_tmp = data
+		idAttr = idAttr || 'id'
+		refAttr = refAttr || 'parent'
+		childrenAttr = childrenAttr || 'children'
+	
+		var byName = []
+		$.each(data_tmp, function(i, entry) {
+			byName[entry[idAttr]] = entry
+		})
+		var tree = []
+		$.each(data_tmp, function(i, entry) {
+			var parents = entry[refAttr]
+			if(!$.isArray(parents)){
+				parents = [parents]
+			}
+			if(parents.length == 0){
+				tree.push(entry)
+			} else {
+				var inTree = false;
+				$.each(parents, function(i,parentID){
+					var parent = byName[parentID]
+					if (parent) {
+						if (!parent[childrenAttr]) {
+							parent[childrenAttr] = []
+						}
+						if($.inArray(entry, parent[childrenAttr])< 0)
+							parent[childrenAttr].push(entry)
+						inTree = true
+					} 
+				})
+				if(!inTree){
+					tree.push(entry)
+				}
+			}
+		})
+		return tree
+	}
+	
+	function renderTree(tree, childrenAttr, idAttr, attrs, renderer, tableAttributes) {
+		childrenAttr = childrenAttr || 'children'
+		idAttr = idAttr || 'id'
+		tableAttributes = tableAttributes || {}
+		var maxLevel = 0;
+		var ret = []
+	
+		var table = $("<table>")
+		$.each(tableAttributes, function(key, value){
+			if(key == 'class' && value != 'jsTT') {
+				table.addClass(value)
+			} else {
+				table.attr(key, value)			
+			}
+		})
+		var thead = $("<thead>")
+		var tr = $("<tr>")
+		var tbody = $("<tbody>")
+	
+		table.append(thead)
+		thead.append(tr)
+		table.append(tbody)
+		if (attrs) {
+			$.each(attrs, function(attr, desc) {
+				$(tr).append($('<th>' + desc + '</th>'))
+			})
+		} else {
+			$(tr).append($('<th>' + idAttr + '</th>'))
+			$.each(tree[0], function(key, value) {
+				if (key != childrenAttr && key != idAttr)
+					$(tr).append($('<th>' + key + '</th>'))
+			})
+		}
+	
+		function render(node, parent) {
+			var tr = $("<tr>")
+			$(tr).attr('data-tt-id', node[idAttr])
+			$(tr).attr('data-tt-level', node['data-tt-level'])
+			if(!node[childrenAttr] || node[childrenAttr].length == 0)
+				$(tr).attr('data-tt-isleaf', true)
+			else
+				$(tr).attr('data-tt-isnode', true)
+			if (parent) {
+				$(tr).attr('data-tt-parent-id', parent[idAttr])
+			}
+			if (renderer) {
+				renderer($(tr), node)
+			}else if (attrs) {
+				$.each(attrs, function(attr, desc) {
+					$(tr).append($('<td>' + node[attr] + '</td>'))
+				})
+			} else {
+				$(tr).append($('<td>' + node[idAttr] + '</td>'))
+				$.each(node, function(key, value) {
+					if (key != childrenAttr && key != idAttr && key != 'data-tt-level')
+						$(tr).append($('<td>' + value + '</td>'))
+				})
+			}
+			tbody.append(tr)
+		}
+	
+		function i_renderTree(subTree, childrenAttr, level, parent) {
+			maxLevel = Math.max(maxLevel, level)
+			$.each(subTree, function(i, node) {
+				node['data-tt-level'] = level
+				render(node, parent)
+				if (node[childrenAttr]) {
+					$.each(node[childrenAttr], function(i, child) {
+						i_renderTree([ child ], childrenAttr, level + 1, node)
+					})
+				}
+			})
+		}
+		i_renderTree(tree, childrenAttr, 1)
+		if (tree[0])
+			tree[0].maxLevel = maxLevel
+		return table
+	}
+	
+	function attr2attr(nodes, attrs){
+		$.each(nodes,  function(i, node) {
+			$.each(attrs,  function(j, at) {
+				node[at] = $(node).attr(at)
+			})	
+		})
+		return nodes
+	}
+	
+	function treeTable(table){
+		table.addClass('jsTT')
+		table.expandLevel = function (n) {
+			$("tr[data-tt-level]", table).each(function(index) {
+				var level = parseInt($(this).attr('data-tt-level'))
+				if (level > n-1) {
+					this.trCollapse(true)
+				} else if (level == n-1){
+					this.trExpand(true)
+				}
+			})
+		}
+		function getLevel(node){
+			var level = node.attr('data-tt-level')
+			if(level != undefined ) return parseInt(level)
+			var parentID = node.attr('data-tt-parent-id')
+			if( parentID == undefined){
+				return 0
+			} else {
+				return getLevel($('tr[data-tt-id="'+parentID+'"]', table).first()) + 1
+			} 
+		}
+		$("tr[data-tt-id]", table).each(function(i,node){
+			node = $(node)
+			node.attr('data-tt-level', getLevel(node)) 
+		})
+		var dat = $("tr[data-tt-level]", table).get()
+		$.each(dat,  function(j, d) {
+			d.trChildrenVisible = true
+			d.trChildren = []
+		})	
+		dat  = attr2attr(dat, ['data-tt-id', 'data-tt-parent-id'])
+		dat = makeTree(dat, 'data-tt-id', 'data-tt-parent-id', 'trChildren')
+		
+		var imgExpand = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAHlJREFUeNrcU1sNgDAQ6wgmcAM2MICGGlg1gJnNzWQcvwQGy1j4oUl/7tH0mpwzM7SgQyO+EZAUWh2MkkzSWhJwuRAlHYsJwEwyvs1gABDuzqoJcTw5qxaIJN0bgQRgIjnlmn1heSO5PE6Y2YXe+5Cr5+h++gs12AcAS6FS+7YOsj4AAAAASUVORK5CYII="
+		var imgCollapse = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAHFJREFUeNpi/P//PwMlgImBQsA44C6gvhfa29v3MzAwOODRc6CystIRbxi0t7fjDJjKykpGYrwwi1hxnLHQ3t7+jIGBQRJJ6HllZaUUKYEYRYBPOB0gBShKwKGA////48VtbW3/8clTnBIH3gCKkzJgAGvBX0dDm0sCAAAAAElFTkSuQmCC"
+		$("tr[data-tt-level]", table).each(function(index, tr) {
+			var level = $(tr).attr('data-tt-level')
+			var td = $("td",tr).first()
+			if(tr.trChildren.length>0){
+				td.prepend($('<img id="state" style="cursor:pointer" src="'+imgCollapse+'"/>'))			
+			}  else {
+				td.prepend($('<span style="padding-left:16px;" /></span>'))
+			}
+			td.prepend($('<span style="padding-left:'+(15*parseInt(level-1))+'px;" /></span>'))
+			// td.css('white-space','nowrap')
+			tr.trExpand = function(changeState){
+				if(this.trChildren.length < 1) return
+				if(changeState) {
+					this.trChildrenVisible = true
+					$('#state', this).get(0).src= imgCollapse
+				} 
+				var doit = changeState || this.trChildrenVisible
+				$.each(this.trChildren, function(i, ctr) {
+					if(doit) $(ctr).css('display', 'table-row')
+					ctr.trExpand()
+				})
+			}
+			tr.trCollapse = function(changeState){
+				if(this.trChildren.length < 1) return
+				if(changeState) {
+					this.trChildrenVisible = false
+					$('#state', this).get(0).src= imgExpand
+				}
+				$.each(this.trChildren, function(i, ctr) {
+					$(ctr).css('display', 'none')
+					ctr.trCollapse()
+				})
+			}
+			$(tr).click(function() {
+				this.trChildrenVisible ? this.trCollapse(true) : this.trExpand(true)
+			})
+		})
+		return table
+	}
+	
+	function appendTreetable(tree, options) {
+		function inALine(nodes) {
+			var tr = $('<tr>')
+			$.each(nodes, function(i, node){
+				tr.append($('<td style="padding-right: 20px;">').append(node))
+			})
+			return $('<table border="0"/>').append(tr)
+			
+		}
+		options = options || {}
+		options.idAttr = (options.idAttr || 'id')
+		options.childrenAttr = (options.childrenAttr || 'children')
+		var controls = (options.controls || [])
+	
+		if (!options.mountPoint)
+			options.mountPoint = $('body')
+		
+		if (options.depthFirst)
+			depthFirst(tree, options.depthFirst, options.childrenAttr)
+		var rendered = renderTree(tree, options.childrenAttr, options.idAttr,
+				options.renderedAttr, options.renderer, options.tableAttributes)
+	
+		treeTable(rendered)
+		if (options.replaceContent) {
+			options.mountPoint.html('')
+		}
+		var initialExpandLevel = options.initialExpandLevel ? parseInt(options.initialExpandLevel) : -1
+		initialExpandLevel = Math.min(initialExpandLevel, tree[0].maxLevel)
+		rendered.expandLevel(initialExpandLevel)
+		if(options.slider){
+			var slider = $('<div style="margin-right: 15px;">')
+			slider.width('200px')
+			slider.slider({
+				min : 1,
+				max : tree[0].maxLevel,
+				range : "min",
+				value : initialExpandLevel,
+				slide : function(event, ui) {
+					rendered.expandLevel(ui.value)
+				}
+			})
+			controls = [slider].concat(options.controls)
+		}
+		
+	    if(controls.length >0){
+	    	options.mountPoint.append(inALine(controls))    	
+	    }
+		options.mountPoint.append(rendered)
+		return rendered
+	}
+	
+	return {
+		depthFirst : depthFirst,
+		makeTree : makeTree,
+		renderTree : renderTree,
+		attr2attr : attr2attr,
+		treeTable : treeTable,
+		appendTreetable : appendTreetable,
+		jsTreeTable : '1.0',
+		register : function(target){
+			$.each(this, function(key, value){ if(key != 'register') target[key] = value})
+		}
+	}
+})();
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/appservice.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/appservice.js
new file mode 100644
index 0000000..4770583
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/appservice.js
@@ -0,0 +1,12 @@
+
+var app = angular.module('sentinelDashboardApp');
+
+app.service('AppService', ['$http', function ($http) {
+  this.getApps = function () {
+    return $http({
+      // url: 'app/mock_infos',
+      url: 'app/briefinfos.json',
+      method: 'GET'
+    });
+  };
+}]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/auth_service.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/auth_service.js
new file mode 100644
index 0000000..fec1cf4
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/auth_service.js
@@ -0,0 +1,25 @@
+var app = angular.module('sentinelDashboardApp');
+
+app.service('AuthService', ['$http', function ($http) {
+  this.check = function () {
+    return $http({
+      url: '/auth/check',
+      method: 'POST'
+    });
+  };
+
+  this.login = function (param) {
+    return $http({
+      url: '/auth/login',
+      params: param,
+      method: 'POST'
+    });
+  };
+
+  this.logout = function () {
+    return $http({
+      url: '/auth/logout',
+      method: 'POST'
+    });
+  };
+}]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/authority_service.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/authority_service.js
new file mode 100644
index 0000000..42a6101
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/authority_service.js
@@ -0,0 +1,56 @@
+/**
+ * Authority rule service.
+ */
+angular.module('sentinelDashboardApp').service('AuthorityRuleService', ['$http', function ($http) {
+    this.queryMachineRules = function(app, ip, port) {
+        var param = {
+            app: app,
+            ip: ip,
+            port: port
+        };
+        return $http({
+            url: '/authority/rules',
+            params: param,
+            method: 'GET'
+        });
+    };
+
+    this.addNewRule = function(rule) {
+        return $http({
+            url: '/authority/rule',
+            data: rule,
+            method: 'POST'
+        });
+    };
+
+    this.saveRule = function (entity) {
+        return $http({
+            url: '/authority/rule/' + entity.id,
+            data: entity,
+            method: 'PUT'
+        });
+    };
+
+    this.deleteRule = function (entity) {
+        return $http({
+            url: '/authority/rule/' + entity.id,
+            method: 'DELETE'
+        });
+    };
+
+    this.checkRuleValid = function checkRuleValid(rule) {
+        if (rule.resource === undefined || rule.resource === '') {
+            alert('璧勬簮鍚嶇О涓嶈兘涓虹┖');
+            return false;
+        }
+        if (rule.limitApp === undefined || rule.limitApp === '') {
+            alert('娴佹帶閽堝搴旂敤涓嶈兘涓虹┖');
+            return false;
+        }
+        if (rule.strategy === undefined) {
+            alert('蹇呴』閫夋嫨榛戠櫧鍚嶅崟妯″紡');
+            return false;
+        }
+        return true;
+    };
+}]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/cluster_state_service.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/cluster_state_service.js
new file mode 100644
index 0000000..7bca816
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/cluster_state_service.js
@@ -0,0 +1,73 @@
+/**
+ * Cluster state control service.
+ *
+ * @author Eric Zhao
+ */
+angular.module('sentinelDashboardApp').service('ClusterStateService', ['$http', function ($http) {
+
+    this.fetchClusterUniversalStateSingle = function(app, ip, port) {
+        var param = {
+            app: app,
+            ip: ip,
+            port: port
+        };
+        return $http({
+            url: '/cluster/state_single',
+            params: param,
+            method: 'GET'
+        });
+    };
+
+    this.fetchClusterUniversalStateOfApp = function(app) {
+        return $http({
+            url: '/cluster/state/' + app,
+            method: 'GET'
+        });
+    };
+
+    this.fetchClusterServerStateOfApp = function(app) {
+        return $http({
+            url: '/cluster/server_state/' + app,
+            method: 'GET'
+        });
+    };
+
+    this.fetchClusterClientStateOfApp = function(app) {
+        return $http({
+            url: '/cluster/client_state/' + app,
+            method: 'GET'
+        });
+    };
+
+    this.modifyClusterConfig = function(config) {
+        return $http({
+            url: '/cluster/config/modify_single',
+            data: config,
+            method: 'POST'
+        });
+    };
+
+    this.applyClusterFullAssignOfApp = function(app, clusterMap) {
+        return $http({
+            url: '/cluster/assign/all_server/' + app,
+            data: clusterMap,
+            method: 'POST'
+        });
+    };
+
+    this.applyClusterSingleServerAssignOfApp = function(app, request) {
+        return $http({
+            url: '/cluster/assign/single_server/' + app,
+            data: request,
+            method: 'POST'
+        });
+    };
+
+    this.applyClusterServerBatchUnbind = function(app, machineSet) {
+        return $http({
+            url: '/cluster/assign/unbind_server/' + app,
+            data: machineSet,
+            method: 'POST'
+        });
+    };
+}]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/degrade_service.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/degrade_service.js
new file mode 100644
index 0000000..8b6e7e0
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/degrade_service.js
@@ -0,0 +1,97 @@
+var app = angular.module('sentinelDashboardApp');
+
+app.service('DegradeService', ['$http', function ($http) {
+  this.queryMachineRules = function (app, ip, port) {
+    var param = {
+      app: app,
+      ip: ip,
+      port: port
+    };
+    return $http({
+      url: 'degrade/rules.json',
+      params: param,
+      method: 'GET'
+    });
+  };
+
+  this.newRule = function (rule) {
+    return $http({
+        url: '/degrade/rule',
+        data: rule,
+        method: 'POST'
+    });
+  };
+
+  this.saveRule = function (rule) {
+    var param = {
+      id: rule.id,
+      resource: rule.resource,
+      limitApp: rule.limitApp,
+      grade: rule.grade,
+      count: rule.count,
+      timeWindow: rule.timeWindow,
+        statIntervalMs: rule.statIntervalMs,
+        minRequestAmount: rule.minRequestAmount,
+        slowRatioThreshold: rule.slowRatioThreshold,
+    };
+    return $http({
+        url: '/degrade/rule/' + rule.id,
+        data: param,
+        method: 'PUT'
+    });
+  };
+
+  this.deleteRule = function (rule) {
+      return $http({
+          url: '/degrade/rule/' + rule.id,
+          method: 'DELETE'
+      });
+  };
+
+  this.checkRuleValid = function (rule) {
+      if (rule.resource === undefined || rule.resource === '') {
+          alert('璧勬簮鍚嶇О涓嶈兘涓虹┖');
+          return false;
+      }
+      if (rule.grade === undefined || rule.grade < 0) {
+          alert('鏈煡鐨勯檷绾х瓥鐣�');
+          return false;
+      }
+      if (rule.count === undefined || rule.count === '' || rule.count < 0) {
+          alert('闄嶇骇闃堝�间笉鑳戒负绌烘垨灏忎簬 0');
+          return false;
+      }
+      if (rule.timeWindow == undefined || rule.timeWindow === '' || rule.timeWindow <= 0) {
+          alert('鐔旀柇鏃堕暱蹇呴』澶т簬 0s');
+          return false;
+      }
+      if (rule.minRequestAmount == undefined || rule.minRequestAmount <= 0) {
+          alert('鏈�灏忚姹傛暟鐩渶澶т簬 0');
+          return false;
+      }
+      if (rule.statIntervalMs == undefined || rule.statIntervalMs <= 0) {
+          alert('缁熻绐楀彛鏃堕暱闇�澶т簬 0s');
+          return false;
+      }
+      if (rule.statIntervalMs !== undefined && rule.statIntervalMs > 60 * 1000 * 2) {
+          alert('缁熻绐楀彛鏃堕暱鏈�澶� 120s');
+          return false;
+      }
+      // 寮傚父姣旂巼绫诲瀷.
+      if (rule.grade == 1 && rule.count > 1) {
+          alert('寮傚父姣旂巼瓒呭嚭鑼冨洿锛歔0.0 - 1.0]');
+          return false;
+      }
+      if (rule.grade == 0) {
+          if (rule.slowRatioThreshold == undefined) {
+              alert('鎱㈣皟鐢ㄦ瘮鐜囦笉鑳戒负绌�');
+              return false;
+          }
+          if (rule.slowRatioThreshold < 0 || rule.slowRatioThreshold > 1) {
+              alert('鎱㈣皟鐢ㄦ瘮鐜囪秴鍑鸿寖鍥达細[0.0 - 1.0]');
+              return false;
+          }
+      }
+      return true;
+  };
+}]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/flow_service_v1.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/flow_service_v1.js
new file mode 100644
index 0000000..051a3c7
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/flow_service_v1.js
@@ -0,0 +1,119 @@
+var app = angular.module('sentinelDashboardApp');
+
+app.service('FlowServiceV1', ['$http', function ($http) {
+    this.queryMachineRules = function (app, ip, port) {
+        var param = {
+            app: app,
+            ip: ip,
+            port: port
+        };
+        return $http({
+            url: '/v1/flow/rules',
+            params: param,
+            method: 'GET'
+        });
+    };
+
+    this.newRule = function (rule) {
+        var param = {
+            resource: rule.resource,
+            limitApp: rule.limitApp,
+            grade: rule.grade,
+            count: rule.count,
+            strategy: rule.strategy,
+            refResource: rule.refResource,
+            controlBehavior: rule.controlBehavior,
+            warmUpPeriodSec: rule.warmUpPeriodSec,
+            maxQueueingTimeMs: rule.maxQueueingTimeMs,
+            app: rule.app,
+            ip: rule.ip,
+            port: rule.port
+        };
+
+        return $http({
+            url: '/v1/flow/rule',
+            data: rule,
+            method: 'POST'
+        });
+    };
+
+    this.saveRule = function (rule) {
+        var param = {
+            id: rule.id,
+            resource: rule.resource,
+            limitApp: rule.limitApp,
+            grade: rule.grade,
+            count: rule.count,
+            strategy: rule.strategy,
+            refResource: rule.refResource,
+            controlBehavior: rule.controlBehavior,
+            warmUpPeriodSec: rule.warmUpPeriodSec,
+            maxQueueingTimeMs: rule.maxQueueingTimeMs,
+        };
+
+        return $http({
+            url: '/v1/flow/save.json',
+            params: param,
+            method: 'PUT'
+        });
+    };
+
+    this.deleteRule = function (rule) {
+        var param = {
+            id: rule.id,
+            app: rule.app
+        };
+
+        return $http({
+            url: '/v1/flow/delete.json',
+            params: param,
+            method: 'DELETE'
+        });
+    };
+
+    function notNumberAtLeastZero(num) {
+        return num === undefined || num === '' || isNaN(num) || num < 0;
+    }
+
+    function notNumberGreaterThanZero(num) {
+        return num === undefined || num === '' || isNaN(num) || num <= 0;
+    }
+
+    this.checkRuleValid = function (rule) {
+        if (rule.resource === undefined || rule.resource === '') {
+            alert('璧勬簮鍚嶇О涓嶈兘涓虹┖');
+            return false;
+        }
+        if (rule.count === undefined || rule.count < 0) {
+            alert('闄愭祦闃堝�煎繀椤诲ぇ浜庣瓑浜� 0');
+            return false;
+        }
+        if (rule.strategy === undefined || rule.strategy < 0) {
+            alert('鏃犳晥鐨勬祦鎺фā寮�');
+            return false;
+        }
+        if (rule.strategy == 1 || rule.strategy == 2) {
+            if (rule.refResource === undefined || rule.refResource == '') {
+                alert('璇峰~鍐欏叧鑱旇祫婧愭垨鍏ュ彛');
+                return false;
+            }
+        }
+        if (rule.controlBehavior === undefined || rule.controlBehavior < 0) {
+            alert('鏃犳晥鐨勬祦鎺ф暣褰㈡柟寮�');
+            return false;
+        }
+        if (rule.controlBehavior == 1 && notNumberGreaterThanZero(rule.warmUpPeriodSec)) {
+            alert('棰勭儹鏃堕暱蹇呴』澶т簬 0');
+            return false;
+        }
+        if (rule.controlBehavior == 2 && notNumberGreaterThanZero(rule.maxQueueingTimeMs)) {
+            alert('鎺掗槦瓒呮椂鏃堕棿蹇呴』澶т簬 0');
+            return false;
+        }
+        if (rule.clusterMode && (rule.clusterConfig === undefined || rule.clusterConfig.thresholdType === undefined)) {
+            alert('闆嗙兢闄愭祦閰嶇疆涓嶆纭�');
+            return false;
+        }
+        return true;
+    };
+}]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/flow_service_v2.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/flow_service_v2.js
new file mode 100644
index 0000000..716d66d
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/flow_service_v2.js
@@ -0,0 +1,85 @@
+var app = angular.module('sentinelDashboardApp');
+
+app.service('FlowServiceV2', ['$http', function ($http) {
+    this.queryMachineRules = function (app, ip, port) {
+        var param = {
+            app: app,
+            ip: ip,
+            port: port
+        };
+        return $http({
+            url: '/v2/flow/rules',
+            params: param,
+            method: 'GET'
+        });
+    };
+
+    this.newRule = function (rule) {
+        return $http({
+            url: '/v2/flow/rule',
+            data: rule,
+            method: 'POST'
+        });
+    };
+
+    this.saveRule = function (rule) {
+        return $http({
+            url: '/v2/flow/rule/' + rule.id,
+            data: rule,
+            method: 'PUT'
+        });
+    };
+
+    this.deleteRule = function (rule) {
+        return $http({
+            url: '/v2/flow/rule/' + rule.id,
+            method: 'DELETE'
+        });
+    };
+
+    function notNumberAtLeastZero(num) {
+        return num === undefined || num === '' || isNaN(num) || num < 0;
+    }
+
+    function notNumberGreaterThanZero(num) {
+        return num === undefined || num === '' || isNaN(num) || num <= 0;
+    }
+
+    this.checkRuleValid = function (rule) {
+        if (rule.resource === undefined || rule.resource === '') {
+            alert('璧勬簮鍚嶇О涓嶈兘涓虹┖');
+            return false;
+        }
+        if (rule.count === undefined || rule.count < 0) {
+            alert('闄愭祦闃堝�煎繀椤诲ぇ浜庣瓑浜� 0');
+            return false;
+        }
+        if (rule.strategy === undefined || rule.strategy < 0) {
+            alert('鏃犳晥鐨勬祦鎺фā寮�');
+            return false;
+        }
+        if (rule.strategy == 1 || rule.strategy == 2) {
+            if (rule.refResource === undefined || rule.refResource == '') {
+                alert('璇峰~鍐欏叧鑱旇祫婧愭垨鍏ュ彛');
+                return false;
+            }
+        }
+        if (rule.controlBehavior === undefined || rule.controlBehavior < 0) {
+            alert('鏃犳晥鐨勬祦鎺ф暣褰㈡柟寮�');
+            return false;
+        }
+        if (rule.controlBehavior == 1 && notNumberGreaterThanZero(rule.warmUpPeriodSec)) {
+            alert('棰勭儹鏃堕暱蹇呴』澶т簬 0');
+            return false;
+        }
+        if (rule.controlBehavior == 2 && notNumberGreaterThanZero(rule.maxQueueingTimeMs)) {
+            alert('鎺掗槦瓒呮椂鏃堕棿蹇呴』澶т簬 0');
+            return false;
+        }
+        if (rule.clusterMode && (rule.clusterConfig === undefined || rule.clusterConfig.thresholdType === undefined)) {
+            alert('闆嗙兢闄愭祦閰嶇疆涓嶆纭�');
+            return false;
+        }
+        return true;
+    };
+}]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/gateway/api_service.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/gateway/api_service.js
new file mode 100644
index 0000000..373f71d
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/gateway/api_service.js
@@ -0,0 +1,73 @@
+var app = angular.module('sentinelDashboardApp');
+
+app.service('GatewayApiService', ['$http', function ($http) {
+  this.queryApis = function (app, ip, port) {
+    var param = {
+      app: app,
+      ip: ip,
+      port: port
+    };
+    return $http({
+      url: '/gateway/api/list.json',
+      params: param,
+      method: 'GET'
+    });
+  };
+
+  this.newApi = function (api) {
+    return $http({
+      url: '/gateway/api/new.json',
+      data: api,
+      method: 'POST'
+    });
+  };
+
+  this.saveApi = function (api) {
+    return $http({
+      url: '/gateway/api/save.json',
+      data: api,
+      method: 'POST'
+    });
+  };
+
+  this.deleteApi = function (api) {
+    var param = {
+      id: api.id,
+      app: api.app
+    };
+    return $http({
+      url: '/gateway/api/delete.json',
+      params: param,
+      method: 'POST'
+    });
+  };
+
+  this.checkApiValid = function (api, apiNames) {
+    if (api.apiName === undefined || api.apiName === '') {
+      alert('API鍚嶇О涓嶈兘涓虹┖');
+      return false;
+    }
+
+    if (api.predicateItems == null || api.predicateItems.length === 0) {
+      // Should never happen since no remove button will display when only one predicateItem.
+      alert('鑷冲皯鏈変竴涓尮閰嶈鍒�');
+      return false;
+    }
+
+    for (var i = 0; i < api.predicateItems.length; i++) {
+      var predicateItem = api.predicateItems[i];
+      var pattern = predicateItem.pattern;
+      if (pattern === undefined || pattern === '') {
+        alert('鍖归厤涓蹭笉鑳戒负绌猴紝璇锋鏌�');
+        return false;
+      }
+    }
+
+    if (apiNames.indexOf(api.apiName) !== -1) {
+      alert('API鍚嶇О(' + api.apiName + ')宸插瓨鍦�');
+      return false;
+    }
+
+    return true;
+  };
+}]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/gateway/flow_service.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/gateway/flow_service.js
new file mode 100644
index 0000000..b026b32
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/gateway/flow_service.js
@@ -0,0 +1,76 @@
+var app = angular.module('sentinelDashboardApp');
+
+app.service('GatewayFlowService', ['$http', function ($http) {
+  this.queryRules = function (app, ip, port) {
+    var param = {
+      app: app,
+      ip: ip,
+      port: port
+    };
+
+    return $http({
+      url: '/gateway/flow/list.json',
+      params: param,
+      method: 'GET'
+    });
+  };
+
+  this.newRule = function (rule) {
+    return $http({
+      url: '/gateway/flow/new.json',
+      data: rule,
+      method: 'POST'
+    });
+  };
+
+  this.saveRule = function (rule) {
+    return $http({
+      url: '/gateway/flow/save.json',
+      data: rule,
+      method: 'POST'
+    });
+  };
+
+  this.deleteRule = function (rule) {
+    var param = {
+      id: rule.id,
+      app: rule.app
+    };
+
+    return $http({
+      url: '/gateway/flow/delete.json',
+      params: param,
+      method: 'POST'
+    });
+  };
+
+  this.checkRuleValid = function (rule) {
+    if (rule.resource === undefined || rule.resource === '') {
+      alert('API鍚嶇О涓嶈兘涓虹┖');
+      return false;
+    }
+
+    if (rule.paramItem != null) {
+      if (rule.paramItem.parseStrategy == 2 ||
+          rule.paramItem.parseStrategy == 3 ||
+          rule.paramItem.parseStrategy == 4) {
+        if (rule.paramItem.fieldName === undefined || rule.paramItem.fieldName === '') {
+          alert('褰撳弬鏁板睘鎬т负Header銆乁RL鍙傛暟銆丆ookie鏃讹紝鍙傛暟鍚嶇О涓嶈兘涓虹┖');
+          return false;
+        }
+
+        if (rule.paramItem.pattern === '') {
+          alert('鍖归厤涓蹭笉鑳戒负绌�');
+          return false;
+        }
+      }
+    }
+
+    if (rule.count === undefined || rule.count < 0) {
+      alert((rule.grade === 1 ? 'QPS闃堝��' : '绾跨▼鏁�') + '蹇呴』澶т簬绛変簬 0');
+      return false;
+    }
+
+    return true;
+  };
+}]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/identityservice.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/identityservice.js
new file mode 100644
index 0000000..926c002
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/identityservice.js
@@ -0,0 +1,30 @@
+var app = angular.module('sentinelDashboardApp');
+
+app.service('IdentityService', ['$http', function ($http) {
+
+  this.fetchIdentityOfMachine = function (ip, port, searchKey) {
+    var param = {
+      ip: ip,
+      port: port,
+      searchKey: searchKey
+    };
+    return $http({
+      url: 'resource/machineResource.json',
+      params: param,
+      method: 'GET'
+    });
+  };
+  this.fetchClusterNodeOfMachine = function (ip, port, searchKey) {
+    var param = {
+      ip: ip,
+      port: port,
+      type: 'cluster',
+      searchKey: searchKey
+    };
+    return $http({
+      url: 'resource/machineResource.json',
+      params: param,
+      method: 'GET'
+    });
+  };
+}]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/machineservice.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/machineservice.js
new file mode 100644
index 0000000..2d3b5e8
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/machineservice.js
@@ -0,0 +1,25 @@
+var app = angular.module('sentinelDashboardApp');
+
+app.service('MachineService', ['$http', '$httpParamSerializerJQLike',
+  function ($http, $httpParamSerializerJQLike) {
+    this.getAppMachines = function (app) {
+      return $http({
+        url: 'app/' + app + '/machines.json',
+        method: 'GET'
+      });
+    };
+    this.removeAppMachine = function (app, ip, port) {
+      return $http({
+        url: 'app/' + app + '/machine/remove.json',
+        method: 'POST',
+        headers: {
+          'Content-type': 'application/x-www-form-urlencoded; charset=UTF-8'
+        },
+        data: $httpParamSerializerJQLike({
+          ip: ip,
+          port: port
+        })
+      });
+    };
+  }]
+);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/metricservice.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/metricservice.js
new file mode 100644
index 0000000..8d8a38e
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/metricservice.js
@@ -0,0 +1,36 @@
+var app = angular.module('sentinelDashboardApp');
+
+app.service('MetricService', ['$http', function ($http) {
+
+  this.queryAppSortedIdentities = function (params) {
+    return $http({
+      url: '/metric/queryTopResourceMetric.json',
+      params: params,
+      method: 'GET'
+    });
+  };
+
+  this.queryByAppAndIdentity = function (params) {
+    return $http({
+      url: '/metric/queryByAppAndResource.json',
+      params: params,
+      method: 'GET'
+    });
+  };
+
+  this.queryByMachineAndIdentity = function (ip, port, identity, startTime, endTime) {
+    var param = {
+      ip: ip,
+      port: port,
+      identity: identity,
+      startTime: startTime.getTime(),
+      endTime: endTime.getTime()
+    };
+
+    return $http({
+      url: '/metric/queryByAppAndResource.json',
+      params: param,
+      method: 'GET'
+    });
+  };
+}]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/param_flow_service.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/param_flow_service.js
new file mode 100644
index 0000000..2e23555
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/param_flow_service.js
@@ -0,0 +1,104 @@
+/**
+ * Parameter flow control service.
+ * 
+ * @author Eric Zhao
+ */
+angular.module('sentinelDashboardApp').service('ParamFlowService', ['$http', function ($http) {
+  this.queryMachineRules = function(app, ip, port) {
+    var param = {
+      app: app,
+      ip: ip,
+      port: port
+    };
+    return $http({
+      url: '/paramFlow/rules',
+      params: param,
+      method: 'GET'
+    });
+  };
+
+  this.addNewRule = function(rule) {
+    return $http({
+      url: '/paramFlow/rule',
+      data: rule,
+      method: 'POST'
+    });
+  };
+
+  this.saveRule = function (entity) {
+    return $http({
+      url: '/paramFlow/rule/' + entity.id,
+      data: entity,
+      method: 'PUT'
+    });
+  };
+
+  this.deleteRule = function (entity) {
+    return $http({
+      url: '/paramFlow/rule/' + entity.id,
+      method: 'DELETE'
+    });
+  };
+
+    function isNumberClass(classType) {
+        return classType === 'int' || classType === 'double' ||
+            classType === 'float' || classType === 'long' || classType === 'short';
+    }
+
+    function isByteClass(classType) {
+        return classType === 'byte';
+    }
+
+    function notNumberAtLeastZero(num) {
+        return num === undefined || num === '' || isNaN(num) || num < 0;
+    }
+
+    function notGoodNumber(num) {
+        return num === undefined || num === '' || isNaN(num);
+    }
+
+    function notGoodNumberBetweenExclusive(num, l ,r) {
+        return num === undefined || num === '' || isNaN(num) || num < l || num > r;
+    }
+
+    function notValidParamItem(curExItem) {
+        if (isNumberClass(curExItem.classType) && notGoodNumber(curExItem.object)) {
+            return true;
+        }
+        if (isByteClass(curExItem.classType) && notGoodNumberBetweenExclusive(curExItem.object, -128, 127)) {
+            return true;
+        }
+        return curExItem.object === undefined || curExItem.classType === undefined ||
+            notNumberAtLeastZero(curExItem.count);
+    }
+
+  this.checkRuleValid = function (rule) {
+      if (!rule.resource || rule.resource === '') {
+          alert('璧勬簮鍚嶇О涓嶈兘涓虹┖');
+          return false;
+      }
+      if (rule.grade != 1) {
+          alert('鏈煡鐨勯檺娴佹ā寮�');
+          return false;
+      }
+      if (rule.count < 0) {
+          alert('闄愭祦闃堝�煎繀椤诲ぇ浜庣瓑浜� 0');
+          return false;
+      }
+      if (rule.paramIdx === undefined || rule.paramIdx === '' || isNaN(rule.paramIdx) || rule.paramIdx < 0) {
+          alert('鐑偣鍙傛暟绱㈠紩蹇呴』澶т簬绛変簬 0');
+          return false;
+      }
+      if (rule.paramFlowItemList !== undefined) {
+          for (var i = 0; i < rule.paramFlowItemList.length; i++) {
+              var item = rule.paramFlowItemList[i];
+              if (notValidParamItem(item)) {
+                  alert('鐑偣鍙傛暟渚嬪椤逛笉鍚堟硶锛岃妫�鏌ュ�煎拰绫诲瀷鏄惁姝g‘锛氬弬鏁颁负 ' + item.object + ', 绫诲瀷涓� ' +
+                      item.classType + ', 闄愭祦闃堝�间负 ' + item.count);
+                  return false;
+              }
+          }
+      }
+      return true;
+  };
+}]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/systemservice.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/systemservice.js
new file mode 100644
index 0000000..8b47679
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/systemservice.js
@@ -0,0 +1,77 @@
+var app = angular.module('sentinelDashboardApp');
+
+app.service('SystemService', ['$http', function ($http) {
+  this.queryMachineRules = function (app, ip, port) {
+    var param = {
+      app: app,
+      ip: ip,
+      port: port
+    };
+    return $http({
+      url: 'system/rules.json',
+      params: param,
+      method: 'GET'
+    });
+  };
+
+  this.newRule = function (rule) {
+    var param = {
+      app: rule.app,
+      ip: rule.ip,
+      port: rule.port
+    };
+    if (rule.grade == 0) {// avgLoad
+      param.highestSystemLoad = rule.highestSystemLoad;
+    } else if (rule.grade == 1) {// avgRt
+      param.avgRt = rule.avgRt;
+    } else if (rule.grade == 2) {// maxThread
+      param.maxThread = rule.maxThread;
+    } else if (rule.grade == 3) {// qps
+      param.qps = rule.qps;
+    } else if (rule.grade == 4) {// cpu
+      param.highestCpuUsage = rule.highestCpuUsage;
+    }
+
+    return $http({
+      url: '/system/new.json',
+      params: param,
+      method: 'GET'
+    });
+  };
+
+  this.saveRule = function (rule) {
+    var param = {
+      id: rule.id,
+    };
+    if (rule.grade == 0) {// avgLoad
+      param.highestSystemLoad = rule.highestSystemLoad;
+    } else if (rule.grade == 1) {// avgRt
+      param.avgRt = rule.avgRt;
+    } else if (rule.grade == 2) {// maxThread
+      param.maxThread = rule.maxThread;
+    } else if (rule.grade == 3) {// qps
+      param.qps = rule.qps;
+    } else if (rule.grade == 4) {// cpu
+        param.highestCpuUsage = rule.highestCpuUsage;
+    }
+
+    return $http({
+      url: '/system/save.json',
+      params: param,
+      method: 'GET'
+    });
+  };
+
+  this.deleteRule = function (rule) {
+    var param = {
+      id: rule.id,
+      app: rule.app
+    };
+
+    return $http({
+      url: '/system/delete.json',
+      params: param,
+      method: 'GET'
+    });
+  };
+}]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/version_service.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/version_service.js
new file mode 100644
index 0000000..1322f56
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/version_service.js
@@ -0,0 +1,10 @@
+var app = angular.module('sentinelDashboardApp');
+
+app.service('VersionService', ['$http', function ($http) {
+  this.version = function () {
+    return $http({
+      url: '/version',
+      method: 'GET'
+    });
+  };
+}]);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/styles/main.css b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/styles/main.css
new file mode 100644
index 0000000..bb1db2b
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/styles/main.css
@@ -0,0 +1,1756 @@
+.browsehappy {
+    margin: 0.2em 0;
+    background: #ccc;
+    color: #000;
+    padding: 0.2em 0;
+}
+
+body {
+    padding: 0;
+}
+
+/* Everything but the jumbotron gets side spacing for mobile first views */
+
+.header,
+.marketing,
+.footer {
+    padding-left: 15px;
+    padding-right: 15px;
+}
+
+
+/* Custom page header */
+
+.header {
+    border-bottom: 1px solid #e5e5e5;
+    margin-bottom: 10px;
+}
+
+
+/* Make the masthead heading the same height as the navigation */
+
+.header h3 {
+    margin-top: 0;
+    margin-bottom: 0;
+    line-height: 40px;
+    padding-bottom: 19px;
+}
+
+
+/* Custom page footer */
+
+.footer {
+    padding-top: 19px;
+    color: #777;
+    border-top: 1px solid #e5e5e5;
+}
+
+.container-narrow > hr {
+    margin: 30px 0;
+}
+
+
+/* Main marketing message and sign up button */
+
+.jumbotron {
+    text-align: center;
+    border-bottom: 1px solid #e5e5e5;
+}
+
+.jumbotron .btn {
+    font-size: 21px;
+    padding: 14px 24px;
+}
+
+
+/* Supporting marketing content */
+
+.marketing {
+    margin: 40px 0;
+}
+
+.marketing p + h4 {
+    margin-top: 28px;
+}
+
+
+/* Responsive: Portrait tablets and up */
+
+@media screen and (min-width: 768px) {
+    .container {
+        width: inherit;
+        margin-left: 60px;
+        margin-right: 5px;
+    }
+    /* Remove the padding we set earlier */
+    .header,
+    .marketing,
+    .footer {
+        padding-left: 0;
+        padding-right: 0;
+    }
+    /* Space out the masthead */
+    .header {
+        margin-bottom: 30px;
+    }
+    /* Remove the bottom border on the jumbotron for visual effect */
+    .jumbotron {
+        border-bottom: 0;
+    }
+}
+
+.navbar-inverse {
+    background-color: #1d9d74;
+    border-color: #1b926c;
+}
+
+.navbar-inverse .navbar-nav > li > a {
+    color: #b0ddce;
+    font-size: 15px;
+}
+
+.navbar-inverse .navbar-nav>.open>a,
+.navbar-inverse .navbar-nav>.open>a:focus,
+.navbar-inverse .navbar-nav>.open>a:hover {
+    background-color: #1b926c;
+}
+
+@media (min-width: 900px) {
+    .navbar-left {
+        float: left !important;
+    }
+    .navbar-right {
+        float: right !important;
+        margin-right: 0%;
+    }
+    .navbar-right ~ .navbar-right {
+        margin-right: 0;
+    }
+}
+
+.dropdown-menu {
+    min-width: 100px !important;
+}
+
+.nav-sidebar li.active a {
+    background: #DDD;
+}
+
+.dropdown-menu>li>a:hover, .dropdown-menu>li>a:focus {
+    background: #1d9d74;
+    /*background: #d9d9d9;*/
+    color: white;
+}
+
+.broadcast-message,
+.broadcast-message-preview {
+    padding: 10px;
+    text-align: center;
+    background: #555;
+    color: #BBB;
+    margin-top: 50px;
+}
+
+.card {
+    position: relative;
+    border: 1px solid #d9d9d9;
+    border-radius: 3px;
+    color: #666;
+    background-color: #fff;
+    width: 100%;
+    border-radius: 5px;
+}
+
+.card .card-header {
+    padding: 9px 0;
+    height: 40px;
+    background: #555;
+    color: #fff;
+    text-align: center;
+    border-top-left-radius: 4px;
+    border-top-right-radius: 4px;
+}
+
+.card .card-body {
+    padding: 12px 10px;
+}
+
+.card .card-footer {
+    height: 20px;
+    font-size: 10px;
+    color: #777;
+    margin-top: -15px;
+    margin-bottom: 5px;
+    margin-left: 20px;
+    margin-right: 20px;
+}
+
+.card .detail-brand {
+    float: left;
+    width: 30%;
+    line-height: 98px;
+    font-size: 30px;
+    text-align: center;
+    color: white;
+}
+
+.card .default {
+    background: #1d9d74;
+}
+
+.card .info {
+    background: #6EBEE7;
+}
+
+.card .warn {
+    background: #ED7F54;
+}
+
+.card .danger {
+    background: #6583BE;
+}
+
+.card .detail .text-default {
+    color: #1d9d74;
+}
+
+.card .detail .text-info {
+    color: #6EBEE7;
+}
+
+.card .detail .text-warn {
+    color: #ED7F54;
+}
+
+.card .detail .text-danger {
+    color: #6583BE;
+}
+
+.card .detail {
+    float: right;
+    width: 70%;
+    line-height: 98px;
+    text-align: center;
+}
+
+.card .detail .text {
+    font-size: 12px;
+}
+
+.card .detail .number {
+    font-size: 30px;
+    font-weight: 500;
+}
+
+.h100 {
+    height: 100px;
+}
+
+.inline {
+    display: inline;
+}
+
+.separator {
+    height: 1px;
+    background-color: #e5e5e5;
+    margin-top: 10px;
+}
+
+.card > .card-body > table > thead > tr > td,
+.card > .card-body > table > tbody > tr > td {
+    word-wrap: break-word;
+    word-break: break-all;
+}
+
+.card > .card-body > table > thead > tr > td {
+    font-weight: 500;
+    font-size: 13px;
+    text-align: center;
+}
+
+.card > .card-body > table > thead > tr > td > span {
+    font-weight: 500;
+    font-size: 10px;
+}
+
+.card > .card-body > table > tbody > tr > td {
+    font-size: 12px;
+    text-align: center;
+}
+
+.card > .card-body > table > tbody > tr > td > a {
+    color: #666;
+}
+
+.thumbnails > .card > .card-body > table > thead > tr > td,
+.thumbnails > .card > .card-body > table > tbody > tr > td {
+    font-size: 12px;
+    color: #777;
+    word-wrap: break-word;
+    word-break: break-all;
+}
+
+.thumbnails > .card > .card-body > table > thead > tr > td:nth-child(n+2) {
+    text-align: center;
+}
+
+.thumbnails > .card > .card-body > table > tbody > tr > td:nth-child(n+2) {
+    font-weight: 700;
+    text-align: center;
+}
+
+.thumbnails > .card > .card-body > table > thead > tr > td:nth-child(1),
+.thumbnails > .card > .card-body > table > tbody > tr > td:nth-child(1) {
+    text-align: left;
+}
+
+.tools-header {
+    background: whitesmoke;
+    padding: 9px 0;
+    height: 40px;
+    border-top-left-radius: 4px;
+    border-top-right-radius: 4px;
+}
+
+.tools-header .brand {
+    font-size: 13px;
+    margin: 2px 10px;
+    font-weight: 700;
+    float: left;
+}
+
+.tools-header .brand > a {
+    color: #666;
+}
+
+.tools-header > button,
+.tools-header > select,
+.tools-header > a {
+    float: right;
+    max-width: 80px;
+    margin: 1px 10px;
+    height: 25px;
+    padding: 0 10px;
+    line-height: 25px;
+    color: #666;
+}
+
+.tools-header .paged {
+    margin-right: 0px;
+}
+
+.btn {
+    height: 32px;
+}
+
+.btn.btn-main {
+    color: #ffffff;
+    background-color: #337ab7;
+    border-color: #337ab7;
+}
+
+.btn:focus,
+.btn:active {
+    outline: none !important;
+}
+
+.btn-default:hover,
+.btn-default:focus,
+.btn-default:active {
+    color: #1d9d74;
+    border-color: #1d9d74;
+    background: white;
+}
+
+
+.btn.btn-danger-tag {
+    color: #ffffff;
+    background-color: #d9534f;
+    border-color: #d43f3a;
+    line-height: 1px;
+    font-size: 11px;
+    padding: 4px 4px;
+}
+
+.btn.btn-danger {
+    color: #333;
+    background-color: #fff;
+    border-color: #ccc;
+}
+
+.btn.btn-danger:hover,
+.btn.btn-danger:focus,
+.btn.btn-danger:active {
+    color: #d9534f;
+    border-color: #d9534f;
+    background: white;
+}
+
+.form-control {
+    height : 32px;
+}
+
+.form-control:focus {
+    border-color: #337ab7;
+    box-shadow: 0px 0px 0px rgba(0, 0, 0, 0.075) inset, 0px 0px 0px rgba(29, 157, 116, 1);
+}
+
+.form-control {
+    border-radius: 8px;
+}
+
+.input-label:before {
+    display: inline-block;
+    content: "*";
+    color: #f44336;
+    font-family: SimSun;
+    font-size: 12px;
+    -webkit-transform: TranslateX(-10px);
+    -ms-transform: TranslateX(-10px);
+    transform: TranslateX(-10px);
+}
+
+.label.label-main {
+    color: #ffffff;
+    background-color: #1d9d74;
+    border-color: #1d9d74;
+}
+
+.badge-main {
+    color: #ffffff;
+    background-color: #1d9d74;
+    border-color: #1d9d74;
+}
+
+.bootstrap-tagsinput {
+    background-color: #fff;
+    border: 1px solid #ccc;
+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+    display: inline-block;
+    padding: 4px 6px;
+    color: #555;
+    vertical-align: middle;
+    border-radius: 4px;
+    /* max-width: 100%; */
+    width: 85%;
+    height: 100px;
+    line-height: 20px;
+    cursor: text;
+}
+
+.bootstrap-tagsinput > .dropdown-menu {
+    min-width: 40px;
+    font-size: 12px;
+}
+
+.bootstrap-tagsinput > .dropdown-menu>.active>a,
+.bootstrap-tagsinput > .dropdown-menu>.active>a:focus,
+.bootstrap-tagsinput > .dropdown-menu>.active>a:hover {
+    background-color: #1d9d74;
+    background-image: -webkit-linear-gradient(top, #1d9d74 0, #1d9d74 100%);
+    background-image: -o-linear-gradient(top, #1d9d74 0, #1d9d74 100%);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(#1d9d74), to(#1d9d74));
+    background-image: linear-gradient(to bottom, #1d9d74 0, #1d9d74 100%);
+    filter: progid: DXImageTransform.Microsoft.gradient(startColorstr='#1d9d74', endColorstr='#1d9d74', GradientType=0);
+    background-repeat: repeat-x;
+}
+
+.bootstrap-tagsinput > .dropdown-menu>.active>a,
+.bootstrap-tagsinput > .dropdown-menu>.active>a:focus,
+.bootstrap-tagsinput > .dropdown-menu>.active>a:hover {
+    color: #fff;
+    text-decoration: none;
+    background-color: #1d9d74;
+    outline: 0;
+}
+
+.bootstrap-tagsinput > .dropdown-menu>.active>a,
+.bootstrap-tagsinput > .dropdown-menu>.active>a:hover,
+.bootstrap-tagsinput > .dropdown-menu>.active>a:focus {
+    color: white;
+    text-decoration: none;
+    outline: 0;
+    background-color: #1d9d74;
+}
+
+.inputs-header {
+    padding: 9px 0;
+    height: 50px;
+    border-top-left-radius: 4px;
+    border-top-right-radius: 4px;
+}
+
+.inputs-header .brand {
+    font-size: 13px;
+    margin: 2px 10px;
+    font-weight: 700;
+    float: left;
+}
+
+.inputs-header .brand > a {
+    color: #666;
+}
+
+.inputs-header > input {
+    float: right;
+    margin: 1px 10px;
+    height: 30px;
+    padding: 0 10px;
+    color: #666;
+}
+
+.inputs-header > a {
+    float: right;
+    margin: 1px 10px;
+    height: 30px;
+    padding: 5 5px;
+}
+
+.inputs-header > select {
+    float: right;
+    max-width: 80px;
+    margin: 1px 10px;
+    height: 30px;
+    padding: 0 10px;
+    color: #666;
+    height: 25px;
+    font-size: 12px;
+}
+
+.witdh-150 {
+    max-width: 150px;
+}
+
+.witdh-200 {
+    max-width: 200px;
+}
+
+.width-200 {
+    max-width: 200px;
+}
+
+.witdh-300 {
+    max-width: 300px;
+}
+
+.width-300 {
+    max-width: 300px;
+}
+
+.card.highlight {
+    border-color: #d9534f;
+}
+
+.card .pagination-footer {
+    height: 40px;
+    font-size: 10px;
+    color: #777;
+    margin-top: -15px;
+    margin-bottom: 5px;
+    margin-left: 20px;
+    margin-right: 20px;
+}
+
+.card .pagination-footer .tools {
+    font-size: 12px;
+    margin: 11px 0;
+    float: right;
+    display: inline;
+    margin-right: 20px;
+}
+
+.card > .pagination-footer > .tools > span > input {
+    height: 25px;
+    max-width: 50px;
+    display: inline;
+}
+
+.pagination {
+    display: inline-block;
+    padding-left: 0;
+    margin: 8px 0;
+    float: right;
+    border-radius: 4px;
+}
+
+
+.pagination > a {
+    margin-right: 5px;
+    height: 28px;
+    width: 28px;
+    padding: 5px 0px;
+}
+
+.pagination > .btn.active {
+        color: #ffffff;
+    background-color: #1d9d74;
+    border-color: #1d9d74;
+}
+
+
+
+
+.datepicker > .table > thead > tr > td, .datepicker > .table > tbody > tr > td,
+.timepicker > .table > thead > tr > td, .timepicker > .table > tbody > tr > td   {
+    padding: 5px 3px;
+}
+
+.datepicker > .table > thead > tr > td > .btn, .datepicker > .table > tbody > tr > td > .btn,
+.timepicker > .table > thead > tr > td > .btn, .timepicker > .table > tbody > tr > td > .btn  {
+    border: 1px solid #FFFDFD;
+}
+
+.datepicker > .table > thead > tr > td > .btn-default:hover,
+.datepicker > .table > thead > tr > td > .btn-default:focus,
+.datepicker > .table > thead > tr > td > .btn-default:active,
+.datepicker > .table > tbody > tr > td > .btn-default:hover,
+.datepicker > .table > tbody > tr > td > .btn-default:focus,
+.datepicker > .table > tbody > tr > td > .btn-default:active,
+.timepicker > .table > thead > tr > td > .btn-default:hover,
+.timepicker > .table > thead > tr > td > .btn-default:focus,
+.timepicker > .table > thead > tr > td > .btn-default:active,
+.timepicker > .table > tbody > tr > td > .btn-default:hover,
+.timepicker > .table > tbody > tr > td > .btn-default:focus,
+.timepicker > .table > tbody > tr > td > .btn-default:active  {
+    color: #1d9d74;
+    border-color: #1d9d74;
+    background: white;
+}
+
+.datepicker > .table > thead > tr > td > a, .datepicker > .table > tbody > tr > td > a,
+.timepicker > .table > thead > tr > td > a, .timepicker > .table > tbody > tr > td > a {
+    height: 25px;
+    width: 25px;
+    padding: 3px 0px;
+}
+
+.datepicker > .table > tbody > tr:first-child > td > a {
+    padding: 4px 0px;
+}
+
+.datepicker > .table > thead > tr > td > a.btn.active, 
+.datepicker > .table > tbody > tr > td > a.btn.active,
+.timepicker > .table > thead > tr > td > a.btn.active, 
+.timepicker > .table > tbody > tr > td > a.btn.active {
+/*    color: #ffffff;
+    background-color: #1d9d74;
+    border-color: #1d9d74;*/
+        color: #1d9d74;
+    border-color: #1d9d74;
+    background: white;
+    box-shadow: inset 0 0px 0px rgba(0,0,0,0.125);
+}
+
+.datepicker > .table > thead > tr > td:not(:first-child):last-child > a,
+.timepicker > .table > thead > tr > td:not(:first-child):last-child > a  {
+    height: 25px;
+    width: 50px;
+    padding: 5px 0px;
+}
+
+.datepicker > .table > tbody > tr > td > a, 
+.timepicker > .table > tbody > tr > td > a {
+    margin-left: 8px;
+}
+
+
+.selectize-input-200 > .selectize-input {
+    min-width: 250px;
+}
+
+.highlight-border {
+    border-color: #337ab7;
+    box-shadow: 0px 0px 0px rgba(0, 0, 0, 0.075) inset, 0px 0px 0px rgba(29, 157, 116, 1);
+}.browsehappy {
+    margin: 0.2em 0;
+    background: #ccc;
+    color: #000;
+    padding: 0.2em 0;
+}
+
+body {
+    padding: 0;
+}
+
+
+/* Everything but the jumbotron gets side spacing for mobile first views */
+
+.header,
+.marketing,
+.footer {
+    padding-left: 15px;
+    padding-right: 15px;
+}
+
+
+/* Custom page header */
+
+.header {
+    border-bottom: 1px solid #e5e5e5;
+    margin-bottom: 10px;
+}
+
+
+/* Make the masthead heading the same height as the navigation */
+
+.header h3 {
+    margin-top: 0;
+    margin-bottom: 0;
+    line-height: 40px;
+    padding-bottom: 19px;
+}
+
+
+/* Custom page footer */
+
+.footer {
+    padding-top: 19px;
+    color: #777;
+    border-top: 1px solid #e5e5e5;
+}
+
+.container-narrow > hr {
+    margin: 30px 0;
+}
+
+
+/* Main marketing message and sign up button */
+
+.jumbotron {
+    text-align: center;
+    border-bottom: 1px solid #e5e5e5;
+}
+
+.jumbotron .btn {
+    font-size: 21px;
+    padding: 14px 24px;
+}
+
+
+/* Supporting marketing content */
+
+.marketing {
+    margin: 40px 0;
+}
+
+.marketing p + h4 {
+    margin-top: 28px;
+}
+
+
+/* Responsive: Portrait tablets and up */
+
+@media screen and (min-width: 768px) {
+    .container {
+        width: inherit;
+        margin-left: 60px;
+        margin-right: 5px;
+    }
+    /* Remove the padding we set earlier */
+    .header,
+    .marketing,
+    .footer {
+        padding-left: 0;
+        padding-right: 0;
+    }
+    /* Space out the masthead */
+    .header {
+        margin-bottom: 30px;
+    }
+    /* Remove the bottom border on the jumbotron for visual effect */
+    .jumbotron {
+        border-bottom: 0;
+    }
+}
+
+.navbar-inverse {
+    background-color: #1d9d74;
+    border-color: #1b926c;
+}
+
+.navbar-inverse .navbar-nav > li > a {
+    color: #b0ddce;
+    font-size: 15px;
+}
+
+.navbar-inverse .navbar-nav>.open>a,
+.navbar-inverse .navbar-nav>.open>a:focus,
+.navbar-inverse .navbar-nav>.open>a:hover {
+    background-color: #1b926c;
+}
+
+@media (min-width: 900px) {
+    .navbar-left {
+        float: left !important;
+    }
+    .navbar-right {
+        float: right !important;
+        margin-right: 0%;
+    }
+    .navbar-right ~ .navbar-right {
+        margin-right: 0;
+    }
+}
+
+.dropdown-menu {
+    min-width: 100px !important;
+}
+
+.nav-sidebar li.active a {
+    background: #DDD;
+}
+
+.dropdown-menu>li>a:hover, .dropdown-menu>li>a:focus {
+    background: #1d9d74;
+    /*background: #d9d9d9;*/
+    color: white;
+}
+
+.broadcast-message,
+.broadcast-message-preview {
+    padding: 10px;
+    text-align: center;
+    background: #555;
+    color: #BBB;
+    margin-top: 50px;
+}
+
+.card {
+    position: relative;
+    border: 1px solid #d9d9d9;
+    border-radius: 3px;
+    color: #666;
+    background-color: #fff;
+    width: 100%;
+    border-radius: 5px;
+}
+
+.card .card-header {
+    padding: 9px 0;
+    height: 40px;
+    background: #555;
+    color: #fff;
+    text-align: center;
+    border-top-left-radius: 4px;
+    border-top-right-radius: 4px;
+}
+
+.card .card-body {
+    padding: 12px 10px;
+}
+
+.card .card-footer {
+    height: 20px;
+    font-size: 10px;
+    color: #777;
+    margin-top: -15px;
+    margin-bottom: 5px;
+    margin-left: 20px;
+    margin-right: 20px;
+}
+
+.card .detail-brand {
+    float: left;
+    width: 30%;
+    line-height: 98px;
+    font-size: 30px;
+    text-align: center;
+    color: white;
+}
+
+.card .default {
+    background: #1d9d74;
+}
+
+.card .info {
+    background: #6EBEE7;
+}
+
+.card .warn {
+    background: #ED7F54;
+}
+
+.card .danger {
+    background: #6583BE;
+}
+
+.card .detail .text-default {
+    color: #1d9d74;
+}
+
+.card .detail .text-info {
+    color: #6EBEE7;
+}
+
+.card .detail .text-warn {
+    color: #ED7F54;
+}
+
+.card .detail .text-danger {
+    color: #6583BE;
+}
+
+.card .detail {
+    float: right;
+    width: 70%;
+    line-height: 98px;
+    text-align: center;
+}
+
+.card .detail .text {
+    font-size: 12px;
+}
+
+.card .detail .number {
+    font-size: 30px;
+    font-weight: 500;
+}
+
+.h100 {
+    height: 100px;
+}
+
+.inline {
+    display: inline;
+}
+
+.separator {
+    height: 1px;
+    background-color: #e5e5e5;
+    margin-top: 10px;
+}
+
+.card > .card-body > table > thead > tr > td,
+.card > .card-body > table > tbody > tr > td {
+    word-wrap: break-word;
+    word-break: break-all;
+}
+
+.card > .card-body > table > thead > tr > td {
+    font-weight: 500;
+    font-size: 13px;
+    text-align: center;
+}
+
+.card > .card-body > table > thead > tr > td > span {
+    font-weight: 500;
+    font-size: 10px;
+}
+
+.card > .card-body > table > tbody > tr > td {
+    font-size: 12px;
+    text-align: center;
+}
+
+.card > .card-body > table > tbody > tr > td > a {
+    color: #666;
+}
+
+.thumbnails > .card > .card-body > table > thead > tr > td,
+.thumbnails > .card > .card-body > table > tbody > tr > td {
+    font-size: 12px;
+    color: #777;
+    word-wrap: break-word;
+    word-break: break-all;
+}
+
+.thumbnails > .card > .card-body > table > thead > tr > td:nth-child(n+2) {
+    text-align: center;
+}
+
+.thumbnails > .card > .card-body > table > tbody > tr > td:nth-child(n+2) {
+    font-weight: 700;
+    text-align: center;
+}
+
+.thumbnails > .card > .card-body > table > thead > tr > td:nth-child(1),
+.thumbnails > .card > .card-body > table > tbody > tr > td:nth-child(1) {
+    text-align: left;
+}
+
+.tools-header {
+    background: whitesmoke;
+    padding: 9px 0;
+    height: 40px;
+    border-top-left-radius: 4px;
+    border-top-right-radius: 4px;
+}
+
+.tools-header .brand {
+    font-size: 13px;
+    margin: 2px 10px;
+    font-weight: 700;
+    float: left;
+}
+
+.tools-header .brand > a {
+    color: #666;
+}
+
+.tools-header > button,
+.tools-header > select,
+.tools-header > a {
+    float: right;
+    max-width: 80px;
+    margin: 1px 10px;
+    height: 25px;
+    padding: 0 10px;
+    line-height: 25px;
+    color: #666;
+}
+
+.tools-header .paged {
+    margin-right: 0px;
+}
+
+.btn.btn-main {
+    color: #ffffff;
+    background-color: #1d9d74;
+    border-color: #1d9d74;
+}
+
+.btn:focus,
+.btn:active {
+    outline: none !important;
+}
+
+.btn-default:hover,
+.btn-default:focus,
+.btn-default:active {
+    color: #1d9d74;
+    border-color: #1d9d74;
+    background: white;
+}
+
+.btn-default-inverse {
+    color: #1d9d74;
+    border-color: #1d9d74;
+    background: white;
+}
+
+.btn-default-inverse:hover,
+.btn-default-inverse:focus,
+.btn-default:active {
+    color: #1d9d74;
+    border-color: #1d9d74;
+    background: white;
+}
+
+.btn.btn-danger-tag {
+    color: #ffffff;
+    background-color: #d9534f;
+    border-color: #d43f3a;
+    line-height: 1px;
+    font-size: 11px;
+    padding: 4px 4px;
+}
+
+.btn.btn-danger {
+    color: #333;
+    background-color: #fff;
+    border-color: #ccc;
+}
+
+.btn.btn-danger:hover,
+.btn.btn-danger:focus,
+.btn.btn-danger:active {
+    color: #d9534f;
+    border-color: #d9534f;
+    background: white;
+}
+
+.form-control {
+    height : 32px;
+}
+
+.form-control:focus {
+    border-color: #1d9d74;
+    box-shadow: 0px 0px 0px rgba(0, 0, 0, 0.075) inset, 0px 0px 0px rgba(29, 157, 116, 1);
+}
+
+.form-control {
+    border-radius: 8px;
+}
+
+.input-label:before {
+    display: inline-block;
+    content: "*";
+    color: #f44336;
+    font-family: SimSun;
+    font-size: 12px;
+    -webkit-transform: TranslateX(-10px);
+    -ms-transform: TranslateX(-10px);
+    transform: TranslateX(-10px);
+}
+
+.label.label-main {
+    color: #ffffff;
+    background-color: #1d9d74;
+    border-color: #1d9d74;
+}
+
+.badge-main {
+    color: #ffffff;
+    background-color: #1d9d74;
+    border-color: #1d9d74;
+}
+
+.bootstrap-tagsinput {
+    background-color: #fff;
+    border: 1px solid #ccc;
+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+    display: inline-block;
+    padding: 4px 6px;
+    color: #555;
+    vertical-align: middle;
+    border-radius: 4px;
+    /* max-width: 100%; */
+    width: 85%;
+    height: 100px;
+    line-height: 20px;
+    cursor: text;
+}
+
+.bootstrap-tagsinput > .dropdown-menu {
+    min-width: 40px;
+    font-size: 12px;
+}
+
+.bootstrap-tagsinput > .dropdown-menu>.active>a,
+.bootstrap-tagsinput > .dropdown-menu>.active>a:focus,
+.bootstrap-tagsinput > .dropdown-menu>.active>a:hover {
+    background-color: #1d9d74;
+    background-image: -webkit-linear-gradient(top, #1d9d74 0, #1d9d74 100%);
+    background-image: -o-linear-gradient(top, #1d9d74 0, #1d9d74 100%);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(#1d9d74), to(#1d9d74));
+    background-image: linear-gradient(to bottom, #1d9d74 0, #1d9d74 100%);
+    filter: progid: DXImageTransform.Microsoft.gradient(startColorstr='#1d9d74', endColorstr='#1d9d74', GradientType=0);
+    background-repeat: repeat-x;
+}
+
+.bootstrap-tagsinput > .dropdown-menu>.active>a,
+.bootstrap-tagsinput > .dropdown-menu>.active>a:focus,
+.bootstrap-tagsinput > .dropdown-menu>.active>a:hover {
+    color: #fff;
+    text-decoration: none;
+    background-color: #1d9d74;
+    outline: 0;
+}
+
+.bootstrap-tagsinput > .dropdown-menu>.active>a,
+.bootstrap-tagsinput > .dropdown-menu>.active>a:hover,
+.bootstrap-tagsinput > .dropdown-menu>.active>a:focus {
+    color: white;
+    text-decoration: none;
+    outline: 0;
+    background-color: #1d9d74;
+}
+
+.inputs-header {
+    padding: 9px 0;
+    height: 50px;
+    border-top-left-radius: 4px;
+    border-top-right-radius: 4px;
+}
+
+.inputs-header .brand {
+    font-size: 13px;
+    margin: 2px 10px;
+    font-weight: 700;
+    float: left;
+}
+
+.inputs-header .brand > a {
+    color: #666;
+}
+
+.inputs-header > input {
+    float: right;
+    margin: 1px 10px;
+    height: 30px;
+    padding: 0 10px;
+    color: #666;
+}
+
+.inputs-header > a {
+    float: right;
+    margin: 1px 10px;
+    height: 30px;
+    padding: 5 5px;
+}
+
+.inputs-header > select {
+    float: right;
+    max-width: 80px;
+    margin: 1px 10px;
+    height: 30px;
+    padding: 0 10px;
+    color: #666;
+    height: 25px;
+    font-size: 12px;
+}
+
+.witdh-150 {
+    max-width: 150px;
+}
+
+.witdh-200 {
+    max-width: 200px;
+}
+
+.card.highlight {
+    border-color: #d9534f;
+}
+
+.card .pagination-footer {
+    height: 40px;
+    font-size: 10px;
+    color: #777;
+    margin-top: -15px;
+    margin-bottom: 5px;
+    margin-left: 20px;
+    margin-right: 20px;
+}
+
+.card .pagination-footer .tools {
+    font-size: 12px;
+    margin: 11px 0;
+    float: right;
+    display: inline;
+    margin-right: 20px;
+}
+
+.card > .pagination-footer > .tools > span > input {
+    height: 25px;
+    max-width: 50px;
+    display: inline;
+}
+
+.pagination {
+    display: inline-block;
+    padding-left: 0;
+    margin: 8px 0;
+    float: right;
+    border-radius: 4px;
+}
+
+
+.pagination > a {
+    margin-right: 5px;
+    height: 28px;
+    width: 28px;
+    padding: 5px 0px;
+}
+
+.pagination > .btn.active {
+        color: #ffffff;
+    background-color: #449d44;
+    border-color: #449d44;
+}
+
+
+
+
+.datepicker > .table > thead > tr > td, .datepicker > .table > tbody > tr > td,
+.timepicker > .table > thead > tr > td, .timepicker > .table > tbody > tr > td   {
+    padding: 5px 3px;
+}
+
+.datepicker > .table > thead > tr > td > .btn, .datepicker > .table > tbody > tr > td > .btn,
+.timepicker > .table > thead > tr > td > .btn, .timepicker > .table > tbody > tr > td > .btn  {
+    border: 1px solid #FFFDFD;
+}
+
+.datepicker > .table > thead > tr > td > .btn-default:hover,
+.datepicker > .table > thead > tr > td > .btn-default:focus,
+.datepicker > .table > thead > tr > td > .btn-default:active,
+.datepicker > .table > tbody > tr > td > .btn-default:hover,
+.datepicker > .table > tbody > tr > td > .btn-default:focus,
+.datepicker > .table > tbody > tr > td > .btn-default:active,
+.timepicker > .table > thead > tr > td > .btn-default:hover,
+.timepicker > .table > thead > tr > td > .btn-default:focus,
+.timepicker > .table > thead > tr > td > .btn-default:active,
+.timepicker > .table > tbody > tr > td > .btn-default:hover,
+.timepicker > .table > tbody > tr > td > .btn-default:focus,
+.timepicker > .table > tbody > tr > td > .btn-default:active  {
+    color: #1d9d74;
+    border-color: #1d9d74;
+    background: white;
+}
+
+.datepicker > .table > thead > tr > td > a, .datepicker > .table > tbody > tr > td > a,
+.timepicker > .table > thead > tr > td > a, .timepicker > .table > tbody > tr > td > a {
+    height: 25px;
+    width: 25px;
+    padding: 3px 0px;
+}
+
+.datepicker > .table > tbody > tr:first-child > td > a {
+    padding: 4px 0px;
+}
+
+.datepicker > .table > thead > tr > td > a.btn.active, 
+.datepicker > .table > tbody > tr > td > a.btn.active,
+.timepicker > .table > thead > tr > td > a.btn.active, 
+.timepicker > .table > tbody > tr > td > a.btn.active {
+/*    color: #ffffff;
+    background-color: #1d9d74;
+    border-color: #1d9d74;*/
+        color: #1d9d74;
+    border-color: #1d9d74;
+    background: white;
+    box-shadow: inset 0 0px 0px rgba(0,0,0,0.125);
+}
+
+.datepicker > .table > thead > tr > td:not(:first-child):last-child > a,
+.timepicker > .table > thead > tr > td:not(:first-child):last-child > a  {
+    height: 25px;
+    width: 50px;
+    padding: 5px 0px;
+}
+
+.datepicker > .table > tbody > tr > td > a, 
+.timepicker > .table > tbody > tr > td > a {
+    margin-left: 8px;
+}
+
+
+.selectize-input-200 > .selectize-input {
+    min-width: 250px;
+}
+
+.highlight-border {
+    border-color: #1d9d74;
+    box-shadow: 0px 0px 0px rgba(0, 0, 0, 0.075) inset, 0px 0px 0px rgba(29, 157, 116, 1);
+}
+
+
+.sortorder:after {
+  content: '\25b2';   
+}
+.sortorder.reverse:after {
+  content: '\25bc';   
+}
+
+
+
+.input-control select {
+  -moz-appearance: none;
+  -webkit-appearance: none;
+  appearance: none;
+  position: relative;
+  border: 1px #d9d9d9 solid;
+  width: 100%;
+  height: 100%;
+  padding: .3125rem;
+  z-index: 0;
+}
+
+.navbar-inverse {
+    background-color: #337ab7;
+    border-color: #337ab7;
+}
+
+.sidebar {
+    z-index: 1;
+    width: 220px;
+    /*position: fixed;*/
+    top: 0;
+    left: 0;
+    height: 100%;
+}
+
+#page-wrapper {
+    position: inherit;
+    margin: 70px 0 0 220px;
+    padding: 12px 30px;
+    border-left: 0px solid #e7e7e7;
+}
+
+.sidebar .sidebar-nav.navbar-collapse {
+    padding-right: 0;
+    padding-left: 0;
+    background-color: #F5F5F5;
+    position: relative;
+    color: black;
+    width: 100%;
+    padding: 0;
+    margin: 0;
+    list-style: none inside none;
+}
+
+.sidebar a {
+    color: #555;
+}
+
+.sidebar ul li:hover {
+    color:red;
+}
+
+.form-control {
+    border-radius: 8px;
+}
+
+.form-control:focus {
+    border-color: #337ab7;
+    box-shadow: 0px 0px 0px rgba(0, 0, 0, 0.075) inset, 0px 0px 0px rgba(29, 157, 116, 1);
+}
+
+.highlight-border {
+    border-color: #337ab7;
+    box-shadow: 0px 0px 0px rgba(0, 0, 0, 0.075) inset, 0px 0px 0px rgba(29, 157, 116, 1);
+}.browsehappy {
+    margin: 0.2em 0;
+    background: #ccc;
+    color: #000;
+    padding: 0.2em 0;
+}
+
+.btn.btn-main {
+    color: #ffffff;
+    background-color: #337ab7;
+    border-color: #337ab7;
+}
+
+.btn-default-inverse {
+    color: #337ab7;
+    border-color: #337ab7;
+    background: white;
+}
+
+.btn-default-inverse:hover,
+.btn-default-inverse:focus,
+.btn-default:active {
+    color: #337ab7;
+    border-color: #337ab7;
+    background: white;
+}
+
+.btn-danger-inverse {
+    color: #d9534f;
+    border-color: #d9534f;
+    background: white;
+}
+
+.btn-danger-inverse:hover,
+.btn-danger-inverse:focus,
+.btn-danger:active {
+    color: #d9534f;
+    border-color: #d9534f;
+    background: white;
+}
+
+.btn-tab-active,
+.btn-tab-active:hover,
+.btn-tab-active:focus, 
+.btn-tab-default:hover,
+.btn-tab-default:focus,
+.btn-tab-default:active {
+    color: #337ab7;
+    border-color: #337ab7;
+    background: white;
+    font-weight: 600;
+}
+.btn-tab-default {
+    color: #777;
+    background: white;
+    font-weight: 600;
+}
+
+.pagination > .btn.active {
+    color: #ffffff;
+    background-color: #337ab7;
+    border-color: #337ab7;
+}
+
+.btn-default:hover, .btn-default:focus, .btn-default:active {
+    color: #337ab7;
+    border-color: #337ab7;
+    background: white;
+}
+
+.bootstrap-switch.bootstrap-switch-on {
+    border-color: #337ab7;
+}
+
+.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success, .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success {
+    color: #fff;
+    background: #337ab7;
+}
+
+.selectize-input-200 > .selectize-input {
+    min-width: 200px;
+    border-color: #337ab7;
+}
+
+.btn-outline-primary {
+    color: #007bff;
+    background-color: transparent;
+    background-image: none;
+    border-color: #007bff;
+}
+
+.btn-outline-primary:hover {
+    color: #fff;
+    background-color: #007bff;
+    border-color: #007bff;
+}
+
+.btn-outline-primary:focus, .btn-outline-primary.focus {
+    box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);
+}
+
+.btn-outline-primary.disabled, .btn-outline-primary:disabled {
+    color: #007bff;
+    background-color: transparent;
+}
+
+.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,
+.show > .btn-outline-primary.dropdown-toggle {
+    color: #fff;
+    background-color: #007bff;
+    border-color: #007bff;
+}
+
+.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus,
+.show > .btn-outline-primary.dropdown-toggle:focus {
+    box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);
+}
+
+.btn-outline-secondary {
+    color: #6c757d;
+    background-color: transparent;
+    background-image: none;
+    border-color: #6c757d;
+}
+
+.btn-outline-secondary:hover {
+    color: #fff;
+    background-color: #6c757d;
+    border-color: #6c757d;
+}
+
+.btn-outline-secondary:focus, .btn-outline-secondary.focus {
+    box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);
+}
+
+.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {
+    color: #6c757d;
+    background-color: transparent;
+}
+
+.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,
+.show > .btn-outline-secondary.dropdown-toggle {
+    color: #fff;
+    background-color: #6c757d;
+    border-color: #6c757d;
+}
+
+.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus,
+.show > .btn-outline-secondary.dropdown-toggle:focus {
+    box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);
+}
+
+.btn-outline-success {
+    color: #28a745;
+    background-color: transparent;
+    background-image: none;
+    border-color: #28a745;
+}
+
+.btn-outline-success:hover {
+    color: #fff;
+    background-color: #28a745;
+    border-color: #28a745;
+}
+
+.btn-outline-success:focus, .btn-outline-success.focus {
+    box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);
+}
+
+.btn-outline-success.disabled, .btn-outline-success:disabled {
+    color: #28a745;
+    background-color: transparent;
+}
+
+.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,
+.show > .btn-outline-success.dropdown-toggle {
+    color: #fff;
+    background-color: #28a745;
+    border-color: #28a745;
+}
+
+.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus,
+.show > .btn-outline-success.dropdown-toggle:focus {
+    box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);
+}
+
+.btn-outline-info {
+    color: #17a2b8;
+    background-color: transparent;
+    background-image: none;
+    border-color: #17a2b8;
+}
+
+.btn-outline-info:hover {
+    color: #fff;
+    background-color: #17a2b8;
+    border-color: #17a2b8;
+}
+
+.btn-outline-info:focus, .btn-outline-info.focus {
+    box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);
+}
+
+.btn-outline-info.disabled, .btn-outline-info:disabled {
+    color: #17a2b8;
+    background-color: transparent;
+}
+
+.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,
+.show > .btn-outline-info.dropdown-toggle {
+    color: #fff;
+    background-color: #17a2b8;
+    border-color: #17a2b8;
+}
+
+.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus,
+.show > .btn-outline-info.dropdown-toggle:focus {
+    box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);
+}
+
+.btn-outline-warning {
+    color: #ffc107;
+    background-color: transparent;
+    background-image: none;
+    border-color: #ffc107;
+}
+
+.btn-outline-warning:hover {
+    color: #212529;
+    background-color: #ffc107;
+    border-color: #ffc107;
+}
+
+.btn-outline-warning:focus, .btn-outline-warning.focus {
+    box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);
+}
+
+.btn-outline-warning.disabled, .btn-outline-warning:disabled {
+    color: #ffc107;
+    background-color: transparent;
+}
+
+.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,
+.show > .btn-outline-warning.dropdown-toggle {
+    color: #212529;
+    background-color: #ffc107;
+    border-color: #ffc107;
+}
+
+.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus,
+.show > .btn-outline-warning.dropdown-toggle:focus {
+    box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);
+}
+
+.btn-outline-danger {
+    color: #dc3545;
+    background-color: transparent;
+    background-image: none;
+    border-color: #dc3545;
+}
+
+.btn-outline-danger:hover {
+    color: #fff;
+    background-color: #dc3545;
+    border-color: #dc3545;
+}
+
+.btn-outline-danger:focus, .btn-outline-danger.focus {
+    box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);
+}
+
+.btn-outline-danger.disabled, .btn-outline-danger:disabled {
+    color: #dc3545;
+    background-color: transparent;
+}
+
+.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,
+.show > .btn-outline-danger.dropdown-toggle {
+    color: #fff;
+    background-color: #dc3545;
+    border-color: #dc3545;
+}
+
+.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus,
+.show > .btn-outline-danger.dropdown-toggle:focus {
+    box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);
+}
+
+.btn-outline-light {
+    color: #f8f9fa;
+    background-color: transparent;
+    background-image: none;
+    border-color: #f8f9fa;
+}
+
+.btn-outline-light:hover {
+    color: #212529;
+    background-color: #f8f9fa;
+    border-color: #f8f9fa;
+}
+
+.btn-outline-light:focus, .btn-outline-light.focus {
+    box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);
+}
+
+.btn-outline-light.disabled, .btn-outline-light:disabled {
+    color: #f8f9fa;
+    background-color: transparent;
+}
+
+.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,
+.show > .btn-outline-light.dropdown-toggle {
+    color: #212529;
+    background-color: #f8f9fa;
+    border-color: #f8f9fa;
+}
+
+.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus,
+.show > .btn-outline-light.dropdown-toggle:focus {
+    box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);
+}
+
+.btn-outline-dark {
+    color: #343a40;
+    background-color: transparent;
+    background-image: none;
+    border-color: #343a40;
+}
+
+.btn-outline-dark:hover {
+    color: #fff;
+    background-color: #343a40;
+    border-color: #343a40;
+}
+
+.btn-outline-dark:focus, .btn-outline-dark.focus {
+    box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);
+}
+
+.btn-outline-dark.disabled, .btn-outline-dark:disabled {
+    color: #343a40;
+    background-color: transparent;
+}
+
+.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,
+.show > .btn-outline-dark.dropdown-toggle {
+    color: #fff;
+    background-color: #343a40;
+    border-color: #343a40;
+}
+
+.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus,
+.show > .btn-outline-dark.dropdown-toggle:focus {
+    box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);
+}
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/styles/page.css b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/styles/page.css
new file mode 100644
index 0000000..af3ba44
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/styles/page.css
@@ -0,0 +1,399 @@
+/*!
+ * Start Bootstrap - SB Admin 2 Bootstrap Admin Theme (http://startbootstrap.com)
+ * Code licensed under the Apache License v2.0.
+ * For details, see http://www.apache.org/licenses/LICENSE-2.0.
+ */
+
+body {
+    background-color: #f8f8f8;
+}
+
+.example {
+  padding: .625rem 1.825rem .625rem 2.5rem;
+  border: 1px #ccc dashed;
+  position: relative;
+  margin: 0 0 .625rem 0;
+  background-color: #ffffff;
+}
+
+dl dt,
+dl dd {
+  line-height: 1.25rem;
+}
+dl dt {
+  font-style: normal;
+  font-weight: 700;
+}
+dl dd {
+  margin-left: .9375rem;
+}
+dl.horizontal dt {
+  float: left;
+  width: 10rem;
+  overflow: hidden;
+  clear: left;
+  text-align: right;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+dl.horizontal dd {
+  margin-left: 11.25rem;
+}
+
+#wrapper {
+    width: 100%;
+}
+
+#page-wrapper {
+    padding: 0 15px;
+    min-height: 568px;
+    background-color: #fff;
+}
+
+@media(min-width:768px) {
+    #page-wrapper {
+        position: inherit;
+        margin: 0 0 0 250px;
+        padding: 0 30px;
+        border-left: 1px solid #e7e7e7;
+    }
+}
+
+.navbar-top-links {
+    margin-right: 0;
+}
+
+.navbar-top-links li {
+    display: inline-block;
+}
+
+.navbar-top-links li:last-child {
+    margin-right: 15px;
+}
+
+.navbar-top-links li a {
+    padding: 15px;
+    min-height: 50px;
+}
+
+.navbar-top-links .dropdown-menu li {
+    display: block;
+}
+
+.navbar-top-links .dropdown-menu li:last-child {
+    margin-right: 0;
+}
+
+.navbar-top-links .dropdown-menu li a {
+    padding: 3px 20px;
+    min-height: 0;
+}
+
+.navbar-top-links .dropdown-menu li a div {
+    white-space: normal;
+}
+
+.navbar-top-links .dropdown-messages,
+.navbar-top-links .dropdown-tasks,
+.navbar-top-links .dropdown-alerts {
+    width: 310px;
+    min-width: 0;
+}
+
+.navbar-top-links .dropdown-messages {
+    margin-left: 5px;
+}
+
+.navbar-top-links .dropdown-tasks {
+    margin-left: -59px;
+}
+
+.navbar-top-links .dropdown-alerts {
+    margin-left: -123px;
+}
+
+.navbar-top-links .dropdown-user {
+    right: 0;
+    left: auto;
+}
+
+.sidebar .sidebar-nav.navbar-collapse {
+    padding-right: 0;
+    padding-left: 0;
+    background-color: #71b1d1;
+	color: #ffffff;
+	position: relative;
+	width: 100%;
+	padding: 0;
+	margin: 0;
+	list-style: none inside none;
+}
+
+.sidebar .sidebar-search {
+    padding: 15px;
+}
+
+.sidebar ul li {
+    border-bottom: 1px solid #e7e7e7;
+}
+
+.sidebar ul li a.active {
+  background-color: #ffffff;
+  color: #ffffff;
+}
+
+.sidebar a{
+	color: #fff;
+}
+
+.sidebar .arrow {
+    float: right;
+}
+
+.sidebar .fa.arrow:before {
+    content: "\f104";
+}
+
+.sidebar .active>a>.fa.arrow:before {
+    content: "\f107";
+}
+
+.sidebar .nav-second-level li,
+.sidebar .nav-third-level li {
+    border-bottom: 0!important;
+}
+
+.sidebar .nav-second-level li a {
+    padding-left: 37px;
+}
+
+.sidebar .nav-third-level li a {
+    padding-left: 52px;
+}
+
+@media(min-width:768px) {
+    .sidebar {
+        z-index: 1;
+        position: absolute;
+        width: 250px;
+        margin-top: 51px;
+    }
+
+    .navbar-top-links .dropdown-messages,
+    .navbar-top-links .dropdown-tasks,
+    .navbar-top-links .dropdown-alerts {
+        margin-left: auto;
+    }
+}
+
+
+.btn-outline {
+    color: inherit;
+    background-color: transparent;
+    transition: all .5s;
+}
+
+.btn-primary.btn-outline {
+    color: #428bca;
+}
+
+.btn-success.btn-outline {
+    color: #5cb85c;
+}
+
+.btn-info.btn-outline {
+    color: #5bc0de;
+}
+
+.btn-warning.btn-outline {
+    color: #f0ad4e;
+}
+
+.btn-danger.btn-outline {
+    color: #d9534f;
+}
+
+.btn-primary.btn-outline:hover,
+.btn-success.btn-outline:hover,
+.btn-info.btn-outline:hover,
+.btn-warning.btn-outline:hover,
+.btn-danger.btn-outline:hover {
+    color: #fff;
+}
+
+.chat {
+    margin: 0;
+    padding: 0;
+    list-style: none;
+}
+
+.chat li {
+    margin-bottom: 10px;
+    padding-bottom: 5px;
+    border-bottom: 1px dotted #999;
+}
+
+.chat li.left .chat-body {
+    margin-left: 60px;
+}
+
+.chat li.right .chat-body {
+    margin-right: 60px;
+}
+
+.chat li .chat-body p {
+    margin: 0;
+}
+
+.panel .slidedown .glyphicon,
+.chat .glyphicon {
+    margin-right: 5px;
+}
+
+.chat-panel .panel-body {
+    height: 350px;
+    overflow-y: scroll;
+}
+
+.login-panel {
+    margin-top: 25%;
+}
+
+.flot-chart {
+    display: block;
+    height: 400px;
+}
+
+.flot-chart-content {
+    width: 100%;
+    height: 100%;
+}
+
+.dataTables_wrapper {
+    position: relative;
+    clear: both;
+}
+
+table.dataTable thead .sorting,
+table.dataTable thead .sorting_asc,
+table.dataTable thead .sorting_desc,
+table.dataTable thead .sorting_asc_disabled,
+table.dataTable thead .sorting_desc_disabled {
+    background: 0 0;
+}
+
+table.dataTable thead .sorting_asc:after {
+    content: "\f0de";
+    float: right;
+    font-family: fontawesome;
+}
+
+table.dataTable thead .sorting_desc:after {
+    content: "\f0dd";
+    float: right;
+    font-family: fontawesome;
+}
+
+table.dataTable thead .sorting:after {
+    content: "\f0dc";
+    float: right;
+    font-family: fontawesome;
+    color: rgba(50,50,50,.5);
+}
+
+.btn-circle {
+    width: 30px;
+    height: 30px;
+    padding: 6px 0;
+    border-radius: 15px;
+    text-align: center;
+    font-size: 12px;
+    line-height: 1.428571429;
+}
+
+.btn-circle.btn-lg {
+    width: 50px;
+    height: 50px;
+    padding: 10px 16px;
+    border-radius: 25px;
+    font-size: 18px;
+    line-height: 1.33;
+}
+
+.btn-circle.btn-xl {
+    width: 70px;
+    height: 70px;
+    padding: 10px 16px;
+    border-radius: 35px;
+    font-size: 24px;
+    line-height: 1.33;
+}
+
+.show-grid [class^=col-] {
+    padding-top: 10px;
+    padding-bottom: 10px;
+    border: 1px solid #ddd;
+    background-color: #eee!important;
+}
+
+.show-grid {
+    margin: 15px 0;
+}
+
+.huge {
+    font-size: 40px;
+}
+
+.panel-green {
+    border-color: #5cb85c;
+}
+
+.panel-green .panel-heading {
+    border-color: #5cb85c;
+    color: #fff;
+    background-color: #5cb85c;
+}
+
+.panel-green a {
+    color: #5cb85c;
+}
+
+.panel-green a:hover {
+    color: #3d8b3d;
+}
+
+.panel-red {
+    border-color: #d9534f;
+}
+
+.panel-red .panel-heading {
+    border-color: #d9534f;
+    color: #fff;
+    background-color: #d9534f;
+}
+
+.panel-red a {
+    color: #d9534f;
+}
+
+.panel-red a:hover {
+    color: #b52b27;
+}
+
+.panel-yellow {
+    border-color: #f0ad4e;
+}
+
+.panel-yellow .panel-heading {
+    border-color: #f0ad4e;
+    color: #fff;
+    background-color: #f0ad4e;
+}
+
+.panel-yellow a {
+    color: #f0ad4e;
+}
+
+.panel-yellow a:hover {
+    color: #df8a13;
+}
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/styles/timeline.css b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/styles/timeline.css
new file mode 100644
index 0000000..92161eb
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/styles/timeline.css
@@ -0,0 +1,180 @@
+.timeline {
+    position: relative;
+    padding: 20px 0 20px;
+    list-style: none;
+}
+
+.timeline:before {
+    content: " ";
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 50%;
+    width: 3px;
+    margin-left: -1.5px;
+    background-color: #eeeeee;
+}
+
+.timeline > li {
+    position: relative;
+    margin-bottom: 20px;
+}
+
+.timeline > li:before,
+.timeline > li:after {
+    content: " ";
+    display: table;
+}
+
+.timeline > li:after {
+    clear: both;
+}
+
+.timeline > li:before,
+.timeline > li:after {
+    content: " ";
+    display: table;
+}
+
+.timeline > li:after {
+    clear: both;
+}
+
+.timeline > li > .timeline-panel {
+    float: left;
+    position: relative;
+    width: 46%;
+    padding: 20px;
+    border: 1px solid #d4d4d4;
+    border-radius: 2px;
+    -webkit-box-shadow: 0 1px 6px rgba(0,0,0,0.175);
+    box-shadow: 0 1px 6px rgba(0,0,0,0.175);
+}
+
+.timeline > li > .timeline-panel:before {
+    content: " ";
+    display: inline-block;
+    position: absolute;
+    top: 26px;
+    right: -15px;
+    border-top: 15px solid transparent;
+    border-right: 0 solid #ccc;
+    border-bottom: 15px solid transparent;
+    border-left: 15px solid #ccc;
+}
+
+.timeline > li > .timeline-panel:after {
+    content: " ";
+    display: inline-block;
+    position: absolute;
+    top: 27px;
+    right: -14px;
+    border-top: 14px solid transparent;
+    border-right: 0 solid #fff;
+    border-bottom: 14px solid transparent;
+    border-left: 14px solid #fff;
+}
+
+.timeline > li > .timeline-badge {
+    z-index: 100;
+    position: absolute;
+    top: 16px;
+    left: 50%;
+    width: 50px;
+    height: 50px;
+    margin-left: -25px;
+    border-radius: 50% 50% 50% 50%;
+    text-align: center;
+    font-size: 1.4em;
+    line-height: 50px;
+    color: #fff;
+    background-color: #999999;
+}
+
+.timeline > li.timeline-inverted > .timeline-panel {
+    float: right;
+}
+
+.timeline > li.timeline-inverted > .timeline-panel:before {
+    right: auto;
+    left: -15px;
+    border-right-width: 15px;
+    border-left-width: 0;
+}
+
+.timeline > li.timeline-inverted > .timeline-panel:after {
+    right: auto;
+    left: -14px;
+    border-right-width: 14px;
+    border-left-width: 0;
+}
+
+.timeline-badge.primary {
+    background-color: #2e6da4 !important;
+}
+
+.timeline-badge.success {
+    background-color: #3f903f !important;
+}
+
+.timeline-badge.warning {
+    background-color: #f0ad4e !important;
+}
+
+.timeline-badge.danger {
+    background-color: #d9534f !important;
+}
+
+.timeline-badge.info {
+    background-color: #5bc0de !important;
+}
+
+.timeline-title {
+    margin-top: 0;
+    color: inherit;
+}
+
+.timeline-body > p,
+.timeline-body > ul {
+    margin-bottom: 0;
+}
+
+.timeline-body > p + p {
+    margin-top: 5px;
+}
+
+@media(max-width:767px) {
+    ul.timeline:before {
+        left: 40px;
+    }
+
+    ul.timeline > li > .timeline-panel {
+        width: calc(100% - 90px);
+        width: -moz-calc(100% - 90px);
+        width: -webkit-calc(100% - 90px);
+    }
+
+    ul.timeline > li > .timeline-badge {
+        top: 16px;
+        left: 15px;
+        margin-left: 0;
+    }
+
+    ul.timeline > li > .timeline-panel {
+        float: right;
+    }
+
+    ul.timeline > li > .timeline-panel:before {
+        right: auto;
+        left: -15px;
+        border-right-width: 15px;
+        border-left-width: 0;
+    }
+
+    ul.timeline > li > .timeline-panel:after {
+        right: auto;
+        left: -14px;
+        border-right-width: 14px;
+        border-left-width: 0;
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/authority.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/authority.html
new file mode 100644
index 0000000..5dbdded
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/authority.html
@@ -0,0 +1,85 @@
+<div class="row" style="margin-left: 1px; margin-top:10px; height: 50px;">
+    <div class="col-md-6" style="margin-bottom: 10px;">
+        <span style="font-size: 30px;font-weight: bold;">{{app}}</span>
+    </div>
+    <div class="col-md-6">
+        <button class="btn btn-default-inverse" style="float: right; margin-right: 10px;" ng-disabled="!macInputModel" ng-click="addNewRule()">
+            <i class="fa fa-plus"></i>&nbsp;&nbsp;鏂板鎺堟潈瑙勫垯</button>
+    </div>
+</div>
+
+<div class="separator"></div>
+
+<div class="container-fluid">
+    <div class="row" style="margin-top: 20px; margin-bottom: 20px;">
+        <div class="col-md-12">
+            <div class="card">
+                <div class="inputs-header">
+                    <span class="brand" style="font-size: 13px;">鎺堟潈瑙勫垯</span>
+                    <button class="btn btn-primary" style="float: right; margin-right: 10px; height: 30px;font-size: 12px;" ng-click="getMachineRules()">鍒锋柊</button>
+                    <input class="form-control witdh-200" placeholder="鍏抽敭瀛�" ng-model="searchKey">
+                    <div class="control-group" style="float:right;margin-right: 10px;margin-bottom: -10px;">
+                        <selectize id="gsInput" class="selectize-input-200" config="macsInputConfig" options="macsInputOptions" ng-model="macInputModel"
+                                   placeholder="鏈哄櫒"></selectize>
+                    </div>
+                </div>
+
+                <!--.tools-header -->
+                <div class="card-body" style="padding: 0px 0px;">
+                    <table class="table" style="border-left: none; border-right:none;margin-top: 10px;">
+                        <thead>
+                        <tr style="background: #F3F5F7;">
+                            <td style="width: 40%">
+                                璧勬簮鍚�
+                            </td>
+                            <td style="width: 10%;">
+                                娴佹帶搴旂敤
+                            </td>
+                            <td style="width: 10%;">
+                                鎺堟潈绫诲瀷
+                            </td>
+                            <td style="width: 12%;">
+                                鎿嶄綔
+                            </td>
+                        </tr>
+                        </thead>
+                        <tbody>
+                        <tr dir-paginate="ruleEntity in rules | filter: searchKey | itemsPerPage: rulesPageConfig.pageSize " current-page="rulesPageConfig.currentPageIndex"
+                            pagination-id="entriesPagination">
+                            <td style="word-wrap:break-word;word-break:break-all;">{{ruleEntity.rule.resource}}</td>
+                            <td style="word-wrap:break-word;word-break:break-all;">{{ruleEntity.rule.limitApp }}</td>
+                            <td>
+                                <span ng-if="ruleEntity.rule.strategy == 0">鐧藉悕鍗�</span>
+                                <span ng-if="ruleEntity.rule.strategy == 1">榛戝悕鍗�</span>
+                            </td>
+                            <td>
+                                <button class="btn btn-xs btn-default" type="button" ng-click="editRule(ruleEntity)" style="font-size: 12px; height:25px;">缂栬緫</button>
+                                <button class="btn btn-xs btn-default" type="button" ng-click="deleteRule(ruleEntity)" style="font-size: 12px; height:25px;">鍒犻櫎</button>
+                            </td>
+                        </tr>
+                        </tbody>
+                    </table>
+                </div>
+                <!-- .card-body -->
+                <div class="pagination-footer">
+                    <dir-pagination-controls boundary-links="true" template-url="app/views/pagination.tpl.html" pagination-id="entriesPagination"
+                                             on-page-change="">
+                    </dir-pagination-controls>
+                    <div class="tools" style="">
+                        <span>鍏� {{rulesPageConfig.totalCount}} 鏉¤褰�, </span>
+                        <span>
+              姣忛〉
+              <input class="form-control" ng-model="rulesPageConfig.pageSize"> 鏉¤褰�
+            </span>
+                    </div>
+                    <!-- .tools -->
+                </div>
+                <!-- pagination-footer -->
+            </div>
+            <!-- .card -->
+        </div>
+        <!-- .col-md-12 -->
+    </div>
+    <!-- -->
+</div>
+<!-- .container-fluid -->
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/cluster/client.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/cluster/client.html
new file mode 100644
index 0000000..7fc751d
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/cluster/client.html
@@ -0,0 +1,30 @@
+<div class="row clearfix">
+    <form role="form" class="form-horizontal">
+        <div class="form-group" ng-if="stateVO.currentMode == 0">
+            <label class="col-sm-2 control-label">杩炴帴鐘舵��</label>
+            <div class="col-sm-4">
+                <p class="form-control-static text-danger" ng-if="stateVO.client.clientConfig.clientState === 0">鏈繛鎺�</p>
+                <p class="form-control-static" ng-if="stateVO.client.clientConfig.clientState === 1">杩炴帴涓�</p>
+                <p class="form-control-static text-success" ng-if="stateVO.client.clientConfig.clientState === 2">宸茶繛鎺�</p>
+            </div>
+        </div>
+        <div class="form-group">
+            <label class="col-sm-2 control-label">Token Server IP</label>
+            <div class="col-sm-4">
+                <input type="text" class="form-control highlight-border" ng-model='stateVO.client.clientConfig.serverHost' placeholder='璇锋寚瀹� Token Server IP' />
+            </div>
+        </div>
+        <div class="form-group">
+            <label class="col-sm-2 control-label">Token Server 绔彛</label>
+            <div class="col-sm-4">
+                <input type="number" min="0" max="65535" required class="form-control highlight-border" ng-model='stateVO.client.clientConfig.serverPort' placeholder='璇锋寚瀹� Token Server 绔彛' />
+            </div>
+        </div>
+        <div class="form-group">
+            <label class="col-sm-2 control-label">璇锋眰瓒呮椂鏃堕棿锛坢s锛�</label>
+            <div class="col-sm-4">
+                <input type="number" min="0" required class="form-control highlight-border" ng-model='stateVO.client.clientConfig.requestTimeout' placeholder='璇锋寚瀹氳姹傝秴鏃舵椂闂达紙ms锛�' />
+            </div>
+        </div>
+    </form>
+</div>
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/cluster/server.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/cluster/server.html
new file mode 100644
index 0000000..8c04587
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/cluster/server.html
@@ -0,0 +1,29 @@
+<div class="row clearfix">
+    <form role="form" class="form-horizontal">
+        <div class="form-group" ng-if="stateVO.currentMode == 1">
+            <label class="col-sm-2 control-label">Token Server 妯″紡</label>
+            <div class="col-sm-4">
+                <p class="form-control-static" ng-if="!stateVO.server.embedded">鐙珛妯″紡 (Alone)</p>
+                <p class="form-control-static" ng-if="stateVO.server.embedded">宓屽叆妯″紡 (Embedded)</p>
+            </div>
+        </div>
+        <div class="form-group">
+            <label class="col-sm-2 control-label">Token Server 绔彛</label>
+            <div class="col-sm-4">
+                <input type="number" min="1" max="65535" required class="form-control highlight-border" ng-model='stateVO.server.transport.port' placeholder='璇锋寚瀹� Token Server 绔彛' />
+            </div>
+        </div>
+        <div class="form-group">
+            <label class="col-sm-2 control-label">鍛藉悕绌洪棿闆嗗悎</label>
+            <div class="col-sm-4">
+                <input type="text" required class="form-control highlight-border" ng-model='stateVO.server.namespaceSetStr' placeholder='璇锋寚瀹氭湇鍔$鏈嶅姟鐨勫懡鍚嶇┖闂撮泦鍚堬紙浠�,鍒嗛殧锛�' />
+            </div>
+        </div>
+        <div class="form-group">
+            <label class="col-sm-2 control-label">鏈�澶у叏灞� QPS</label>
+            <div class="col-sm-4">
+                <input type="number" min="0" max="100000" required class="form-control highlight-border" ng-model='stateVO.server.flow.maxAllowedQps' placeholder='璇锋寚瀹氭湇鍔$鏈�澶у叏灞� QPS' />
+            </div>
+        </div>
+    </form>
+</div>
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_app_assign_manage.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_app_assign_manage.html
new file mode 100644
index 0000000..550ff23
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_app_assign_manage.html
@@ -0,0 +1,118 @@
+<div class="row" style="margin-left: 1px; margin-top:10px; height: 50px;">
+    <div class="col-md-6" style="margin-bottom: 10px;">
+        <span style="font-size: 30px;font-weight: bold;">{{app}}</span>
+    </div>
+</div>
+
+<div class="separator"></div>
+<div class="container-fluid">
+    <div class="row" style="margin-top: 20px; margin-bottom: 20px;">
+        <div class="col-md-12">
+            <div class="card">
+                <div class="inputs-header">
+                    <span class="brand" style="font-size: 13px;">闆嗙兢闄愭祦 - 鏈哄櫒鍒嗛厤/绠℃帶</span>
+                </div>
+
+                <!-- error panel -->
+                <div class="row clearfix" ng-if="loadError">
+                    <div class="col-md-6 col-md-offset-3">
+                        <div class="panel panel-default">
+                            <div class="panel-body">
+                                <center>
+                                    <p>{{loadError.message}}</p>
+                                </center>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+
+                <!--.tools-header -->
+                <div class="card-body" style="padding: 0px 0px;" ng-if="!loadError">
+                    <form role="form" class="form-horizontal">
+                        <div class="form-group">
+                            <label class="col-sm-2 control-label">Server 鍒楄〃</label>
+                            <div class="col-sm-4">
+                                <select ng-model="tmp.curChosenServer" ng-change="onCurrentServerChange()" size="8"
+                                        ng-options="serverGroup.machineId for serverGroup in clusterMap"
+                                        class="form-control"></select>
+                            </div>
+                            <button type="button" class="btn btn-outline-warning" ng-click="removeFromServerList()">绉婚櫎
+                            </button>
+                        </div>
+                        <div class="form-group">
+                            <label class="col-sm-2 control-label">Token Server 绔彛</label>
+                            <div class="col-sm-4">
+                                <input type="number" class="form-control highlight-border"
+                                       ng-disabled="!tmp.curChosenServer.belongToApp"
+                                       ng-model='tmp.curChosenServer.port' placeholder='port' min="1" max="65535"/>
+                            </div>
+                        </div>
+                        <div class="form-group">
+                            <label class="col-sm-2 control-label">鍛藉悕绌洪棿闆嗗悎</label>
+                            <div class="col-sm-4">
+                                <input type="text" required class="form-control highlight-border"
+                                       ng-disabled="!tmp.curChosenServer.belongToApp"
+                                       ng-model='tmp.curChosenServer.namespaceSetStr'
+                                       placeholder='璇锋寚瀹氭湇鍔$鏈嶅姟鐨勫懡鍚嶇┖闂撮泦鍚堬紙浠�,鍒嗛殧锛�'/>
+                            </div>
+                        </div>
+                    </form>
+                    <form role="form" class="form-inline" style="margin-top: 30px; margin-left: 20px;">
+                        <div>
+                            <div class="form-group">
+                                <div class="col-sm-12">
+                                    <label class="control-label" style="width: 200px; text-align: center;">褰撳墠瀵瑰簲瀹㈡埛绔垪琛�</label>
+                                    <select size="8" multiple="multiple" ng-model="tmp.curClientChosen"
+                                            ng-options="ip for ip in tmp.curChosenServer.clientSet"
+                                            class="form-control" style="width: 100%;"></select>
+                                </div>
+
+                            </div>
+                            <div class="form-group">
+                                <div class="col-sm-12">
+                                    <button type="button" class="btn btn-outline-primary"
+                                            ng-disabled="!tmp.curChosenServer || !tmp.curChosenServer.machineId"
+                                            ng-click="moveToServerGroup()">鈫�
+                                    </button>
+                                    <button type="button" class="btn btn-outline-primary"
+                                            ng-click="moveToRemainingSharePool()">鈫�
+                                    </button>
+                                </div>
+                            </div>
+
+                            <div class="form-group">
+                                <div class="col-sm-12">
+                                    <label class="control-label" style="width: 220px; text-align: center;">鏈垎閰嶆満鍣ㄥ垪琛�</label>
+                                    <div>
+                                        <select size="8" multiple="multiple" ng-model="tmp.curRemainingClientChosen"
+                                                ng-options="ip for ip in remainingClientAddressList"
+                                                class="form-control" style="width: 100%;">
+                                        </select>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <div class="col-sm-6">
+                                    <button type="button" class="btn btn-outline-primary"
+                                            ng-click="addToServerList()">娣诲姞涓� server
+                                    </button>
+                                </div>
+                            </div>
+                        </div>
+                    </form>
+                    <div class="separator"></div>
+                    <div style="margin-top: 20px;">
+                        <button type="button" style="margin: 0 10px 10px 10px;" class="btn btn-outline-success"
+                                ng-click="saveAndApplyAssign()">淇濆瓨骞舵墽琛屽垎閰�
+                        </button>
+                    </div>
+                </div>
+                <!-- .card-body -->
+            </div>
+            <!-- .card -->
+        </div>
+        <!-- .col-md-12 -->
+    </div>
+    <!-- -->
+</div>
+<!-- .container-fluid -->
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_app_client_list.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_app_client_list.html
new file mode 100644
index 0000000..b779e30
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_app_client_list.html
@@ -0,0 +1,73 @@
+<div class="row" style="margin-left: 1px; margin-top:10px; height: 50px;">
+    <div class="col-md-6" style="margin-bottom: 10px;">
+        <span style="font-size: 30px;font-weight: bold;">{{app}}</span>
+    </div>
+    <div class="col-md-6">
+        <a class="btn btn-default-inverse" style="float: right; margin-right: 10px;" ui-sref="dashboard.clusterAppServerList({app: app})">
+            Token Server 鍒楄〃
+        </a>
+    </div>
+</div>
+
+<div class="separator"></div>
+<div class="container-fluid">
+    <div class="row" style="margin-top: 20px; margin-bottom: 20px;">
+        <div class="col-md-12">
+            <div class="card">
+                <div class="inputs-header">
+                    <span class="brand" style="font-size: 13px;">闆嗙兢闄愭祦 - Token Client 鍒楄〃</span>
+                </div>
+
+                <!-- error panel -->
+                <div class="row clearfix" ng-if="loadError">
+                    <div class="col-md-6 col-md-offset-3">
+                        <div class="panel panel-default">
+                            <div class="panel-body">
+                                <center>
+                                    <p>{{loadError.message}}</p>
+                                </center>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+
+                <!--.tools-header -->
+                <div class="card-body" style="padding: 0px 0px;" ng-if="!loadError">
+                    <!-- table start -->
+                    <table class="table" style="border-left: none; border-right:none;margin-top: 10px;">
+                        <thead>
+                        <tr style="background: #F3F5F7;">
+                            <td style="min-width: 12%;">Client ID</td>
+                            <td>Server IP</td>
+                            <td>Server 绔彛</td>
+                            <td>杩炴帴鐘舵��</td>
+                            <td style="min-width: 15%;">鎿嶄綔</td>
+                        </tr>
+                        </thead>
+                        <tbody>
+                        <tr ng-repeat="clientVO in clientVOList">
+                            <td style="word-wrap:break-word;word-break:break-all;">{{clientVO.id}}</td>
+                            <td style="word-wrap:break-word;word-break:break-all;">{{clientVO.state.clientConfig.serverHost}}</td>
+                            <td>{{clientVO.state.clientConfig.serverPort}}</td>
+                            <td>
+                                <span class="form-control-static text-danger" ng-if="clientVO.state.clientConfig.clientState === 0">鏈繛鎺�</span>
+                                <span class="form-control-static" ng-if="clientVO.state.clientConfig.clientState === 1">杩炴帴涓�</span>
+                                <span class="form-control-static text-success" ng-if="clientVO.state.clientConfig.clientState === 2">宸茶繛鎺�</span>
+                            </td>
+                            <td>
+                                <button class="btn btn-xs btn-outline-primary" type="button"
+                                        ng-click="modifyClientConfigDialog(clientVO)" style="font-size: 12px; height:25px;">缂栬緫閰嶇疆</button>
+                            </td>
+                        </tr>
+                        </tbody>
+                    </table>
+                </div>
+                <!-- .card-body -->
+            </div>
+            <!-- .card -->
+        </div>
+        <!-- .col-md-12 -->
+    </div>
+    <!-- -->
+</div>
+<!-- .container-fluid -->
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_app_server_list.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_app_server_list.html
new file mode 100644
index 0000000..d47b31f
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_app_server_list.html
@@ -0,0 +1,96 @@
+<div class="row" style="margin-left: 1px; margin-top:10px; height: 50px;">
+    <div class="col-md-6" style="margin-bottom: 10px;">
+        <span style="font-size: 30px;font-weight: bold;">{{app}}</span>
+    </div>
+    <div class="col-md-6">
+        <button class="btn btn-default-inverse" style="float: right; margin-right: 10px;" ng-if="!loadError" ng-click="newServerDialog()">
+            <i class="fa fa-plus"></i>&nbsp;&nbsp;鏂板 Token Server</button>
+        <a class="btn btn-default-inverse" style="float: right; margin-right: 10px;" ui-sref="dashboard.clusterAppClientList({app: app})">
+            Token Client 鍒楄〃
+        </a>
+    </div>
+</div>
+
+<div class="separator"></div>
+<div class="container-fluid">
+    <div class="row" style="margin-top: 20px; margin-bottom: 20px;">
+        <div class="col-md-12">
+            <div class="card">
+                <div class="inputs-header">
+                    <span class="brand" style="font-size: 13px;">闆嗙兢闄愭祦 - Token Server 鍒楄〃</span>
+                    <input class="form-control width-200" placeholder="鎼滅储 server..." ng-model="searchKey">
+                </div>
+
+                <!-- error panel -->
+                <div class="row clearfix" ng-if="loadError">
+                    <div class="col-md-6 col-md-offset-3">
+                        <div class="panel panel-default">
+                            <div class="panel-body">
+                                <center>
+                                    <p>{{loadError.message}}</p>
+                                </center>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+
+                <!--.tools-header -->
+                <div class="card-body" style="padding: 0px 0px;" ng-if="!loadError">
+                    <!-- table start -->
+                    <table class="table" style="border-left: none; border-right:none;margin-top: 10px;">
+                        <thead>
+                        <tr style="background: #F3F5F7;">
+                            <td style="width: 15%;">Server ID</td>
+                            <td style="width: 10%;">Port</td>
+                            <td style="width: 15%;">鍛藉悕绌洪棿闆嗗悎</td>
+                            <td style="width: 10%;">杩愯妯″紡</td>
+                            <td>鎬昏繛鎺ユ暟</td>
+                            <td>QPS 鎬昏</td>
+                            <td style="width: 20%;">鎿嶄綔</td>
+                        </tr>
+                        </thead>
+                        <tbody>
+                        <tr ng-repeat="serverVO in serverVOList | filter: {id: searchKey}">
+                            <td style="word-wrap:break-word;word-break:break-all;">
+                                <span ng-if="serverVO.belongToApp">{{serverVO.id}}</span>
+                                <span ng-if="!serverVO.belongToApp">{{serverVO.id}}锛堣嚜涓绘寚瀹氾級</span>
+                            </td>
+                            <td>{{serverVO.port}}</td>
+                            <td style="word-wrap:break-word;word-break:break-all;">
+                                <span ng-if="serverVO.belongToApp">{{serverVO.state.namespaceSetStr}}</span>
+                                <span ng-if="!serverVO.belongToApp">鏈煡</span>
+                            </td>
+                            <td style="word-wrap:break-word;word-break:break-all;">
+                                <span ng-if="!serverVO.belongToApp">鏈煡</span>
+                                <span ng-if="serverVO.belongToApp && serverVO.state.embedded">宓屽叆妯″紡</span>
+                                <span ng-if="serverVO.belongToApp && !serverVO.state.embedded">鐙珛妯″紡</span>
+                            </td>
+                            <td style="word-wrap:break-word;word-break:break-all;">
+                                <span ng-if="serverVO.belongToApp">{{serverVO.connectedCount}}</span>
+                                <span ng-if="!serverVO.belongToApp">鏈煡</span>
+                            </td>
+                            <td>
+                                <span ng-if="serverVO.belongToApp">{{serverVO.state.requestLimitDataStr}}</span>
+                                <span ng-if="!serverVO.belongToApp">鏈煡</span>
+                            </td>
+                            <td>
+                                <button class="btn btn-xs btn-outline-primary" type="button" ng-if="serverVO.belongToApp"
+                                        ng-click="viewConnectionDetail(serverVO)" style="font-size: 12px; height:25px;">杩炴帴璇︽儏</button>
+                                <button class="btn btn-xs btn-outline-primary" type="button"
+                                        ng-click="modifyServerAssignConfig(serverVO)" style="font-size: 12px; height:25px;">绠$悊</button>
+                                <button class="btn btn-xs btn-outline-danger" type="button"
+                                        ng-click="unbindServer(serverVO.id)" style="font-size: 12px; height:25px;">绉婚櫎</button>
+                            </td>
+                        </tr>
+                        </tbody>
+                    </table>
+                </div>
+                <!-- .card-body -->
+            </div>
+            <!-- .card -->
+        </div>
+        <!-- .col-md-12 -->
+    </div>
+    <!-- -->
+</div>
+<!-- .container-fluid -->
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_app_server_overview.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_app_server_overview.html
new file mode 100644
index 0000000..4e411a2
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_app_server_overview.html
@@ -0,0 +1,88 @@
+<div class="row" style="margin-left: 1px; margin-top:10px; height: 50px;">
+    <div class="col-md-6" style="margin-bottom: 10px;">
+        <span style="font-size: 30px;font-weight: bold;">{{app}}</span>
+    </div>
+</div>
+
+<div class="separator"></div>
+<div class="container-fluid">
+    <div class="row" style="margin-top: 20px; margin-bottom: 20px;">
+        <div class="col-md-12">
+            <div class="card">
+                <div class="inputs-header">
+                    <span class="brand" style="font-size: 13px;">闆嗙兢闄愭祦 - Token Server 鎬昏</span>
+                </div>
+
+                <!-- error panel -->
+                <div class="row clearfix" ng-if="loadError">
+                    <div class="col-md-6 col-md-offset-3">
+                        <div class="panel panel-default">
+                            <div class="panel-body">
+                                <center>
+                                    <p>{{loadError.message}}</p>
+                                </center>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+
+                <!--.tools-header -->
+                <div class="card-body" style="padding: 0px 0px;" ng-if="!loadError">
+                    <form role="form" class="form-horizontal">
+                        <div class="form-group" hidden>
+                            <label class="col-sm-2 control-label">Token Server 鍒楄〃</label>
+                            <div class="col-sm-4">
+                                <select ng-model="tmp.curChosenServer" ng-change="onChosenServerChange()"
+                                        ng-options="serverEntity.id for serverEntity in serverVOList"
+                                        class="form-control"></select>
+                            </div>
+                        </div>
+                    </form>
+
+                    <!-- table start -->
+                    <table class="table" style="border-left: none; border-right:none;margin-top: 10px;">
+                        <thead>
+                        <tr style="background: #F3F5F7;">
+                            <td style="width: 12%;">Server ID</td>
+                            <td style="width: 5%;">Port</td>
+                            <td style="width: 10%;">鍛藉悕绌洪棿闆嗗悎</td>
+                            <td>鎬昏繛鎺ユ暟</td>
+                            <td>杩炴帴鎯呭喌</td>
+                            <td>QPS 鎬昏</td>
+                        </tr>
+                        </thead>
+                        <tbody>
+                        <tr ng-repeat="serverVO in clientVOList">
+                            <td style="word-wrap:break-word;word-break:break-all;">{{serverVO.id}}</td>
+                            <td>{{serverVO.port}}</td>
+                            <td style="word-wrap:break-word;word-break:break-all;">
+                                {{serverVO.state.namespaceSetStr}}
+                            </td>
+                            <td style="word-wrap:break-word;word-break:break-all;">
+                                {{serverVO.connectedCount}}
+                            </td>
+                            <td>
+                                <p ng-repeat="cg in serverVO.state.connection">
+                                    namespace: {{cg.namespace}}, 杩炴帴鏁�: {{cg.connectedCount}}, clients:
+                                    {{generateConnectionSet(cg.connectionSet)}}
+                                </p>
+                            </td>
+                            <td>
+                                <p ng-repeat="crl in serverVO.state.requestLimitData">
+                                    namespace: {{crl.namespace}}, 褰撳墠 QPS: {{crl.currentQps}}, 鏈�澶у厑璁� QPS:
+                                    {{crl.maxAllowedQps}}
+                                </p>
+                            </td>
+                        </tr>
+                        </tbody>
+                    </table>
+                </div>
+                <!-- .card-body -->
+            </div>
+            <!-- .card -->
+        </div>
+        <!-- .col-md-12 -->
+    </div>
+    <!-- -->
+</div>
+<!-- .container-fluid -->
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_single_config.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_single_config.html
new file mode 100644
index 0000000..a82f1ab
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_single_config.html
@@ -0,0 +1,95 @@
+
+<div class="row" style="margin-left: 1px; margin-top:10px; height: 50px;">
+  <div class="col-md-6" style="margin-bottom: 10px;">
+    <span style="font-size: 30px;font-weight: bold;">{{app}}</span>
+  </div>
+</div>
+
+<div class="separator"></div>
+<div class="container-fluid">
+  <div class="row" style="margin-top: 20px; margin-bottom: 20px;">
+    <div class="col-md-12">
+      <div class="card">
+        <div class="inputs-header">
+          <span class="brand" style="font-size: 13px;">闆嗙兢闄愭祦</span>
+          <input class="form-control witdh-200" placeholder="鏈哄櫒鎼滅储" ng-model="searchKey">
+          <div class="control-group" style="float:right;margin-right: 10px;margin-bottom: -10px;">
+            <selectize id="gsInput" class="selectize-input-200" config="macsInputConfig" options="macsInputOptions" ng-model="macInputModel"
+                       placeholder="鏈哄櫒"></selectize>
+          </div>
+        </div>
+
+        <!-- error panel -->
+        <div class="row clearfix" ng-if="loadError">
+          <div class="col-md-6 col-md-offset-3">
+            <div class="panel panel-default">
+              <div class="panel-body">
+                <center>
+                  <p>{{loadError.message}}</p>
+                </center>
+              </div>
+            </div>
+          </div>
+        </div>
+
+        <!--.tools-header -->
+        <div class="card-body" style="padding: 0px 0px;"  ng-if="!loadError">
+          <form role="form" class="form-horizontal">
+            <div class="form-group">
+              <label class="col-sm-2 control-label">褰撳墠妯″紡</label>
+              <p class="col-sm-6 control-label" style="text-align: left; font-weight: normal;" ng-if="stateVO.currentMode == 0">Client</p>
+              <p class="col-sm-6 control-label" style="text-align: left; font-weight: normal;" ng-if="stateVO.currentMode == 1">Server</p>
+              <p class="col-sm-6 control-label" style="text-align: left; font-weight: normal;" ng-if="stateVO.currentMode == -1">鏈紑鍚�</p>
+            </div>
+            <div class="form-group">
+              <label class="col-sm-2 control-label">闆嗙兢闄愭祦妯″紡鍙樻崲</label>
+              <div class="col-sm-4">
+                <div class="form-control highlight-border" align="center">
+                  <input type="radio" name="mode" value="0" ng-model='stateVO.stateInfo.mode' ng-disabled="!stateVO.stateInfo.clientAvailable" />&nbsp;Client&nbsp;&nbsp;
+                  <input type="radio" name="mode" value="1" ng-model='stateVO.stateInfo.mode' ng-disabled="!stateVO.stateInfo.serverAvailable" />&nbsp;Server
+                </div>
+              </div>
+            </div>
+          </form>
+          <!-- no-cluster-mode-available-panel.start -->
+          <div ng-if="!stateVO.stateInfo.clientAvailable && !stateVO.stateInfo.serverAvailable">
+            <!-- error panel -->
+            <div class="row clearfix">
+              <div class="col-md-6 col-md-offset-3">
+                <div class="panel panel-default">
+                  <div class="panel-body">
+                    <center>
+                      <p>璇ユ満鍣ㄦ湭寮曞叆 Sentinel 闆嗙兢闄愭祦瀹㈡埛绔垨鏈嶅姟绔殑鐩稿叧渚濊禆锛岃寮曞叆鐩稿叧渚濊禆銆�</p>
+                    </center>
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+          <!-- no-cluster-mode-available-panel.stop -->
+
+          <div ng-if="stateVO.stateInfo.clientAvailable || stateVO.stateInfo.serverAvailable">
+            <div ng-if="stateVO.stateInfo.clientAvailable && stateVO.stateInfo.mode == 0">
+              <div ng-include="'app/views/cluster/client.html'"></div>
+            </div>
+            <div ng-if="stateVO.stateInfo.serverAvailable && stateVO.stateInfo.mode == 1">
+              <div ng-include="'app/views/cluster/server.html'"></div>
+            </div>
+
+            <div class="separator"></div>
+            <div clss="row" style="margin-top: 20px;">
+              <button style="margin: 0 10px 10px 10px;" class="btn btn-outline-success"
+                      ng-click="saveConfig()">淇濆瓨閰嶇疆</button>
+            </div>
+          </div>
+
+        </div>
+        <!-- .card-body -->
+      </div>
+      <!-- .card -->
+    </div>
+    <!-- .col-md-12 -->
+  </div>
+  <!-- -->
+</div>
+<!-- .container-fluid -->
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dashboard/home.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dashboard/home.html
new file mode 100644
index 0000000..9a81bf5
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dashboard/home.html
@@ -0,0 +1,13 @@
+<div>
+  <div class="row">
+    <div class="col-lg-12">
+      <h1 class="page-header">娆㈣繋浣跨敤 Sentinel 鎺у埗鍙�</h1>
+    </div>
+    <!-- /.col-lg-12 -->
+  </div>
+  <!-- /.row -->
+  <!-- /.panel -->
+  <div class="row">
+  </div>
+  <!-- /.row -->
+</div>
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dashboard/main.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dashboard/main.html
new file mode 100644
index 0000000..c5abed5
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dashboard/main.html
@@ -0,0 +1,10 @@
+<div id="wrapper">
+  <!-- Navigation -->
+  <header></header>
+  <!-- /.navbar-top-links -->
+  <!-- /.navbar-static-side -->
+  <div id="page-wrapper">
+    <div ui-view></div>
+  </div>
+  <!-- /#page-wrapper -->
+</div>
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/degrade.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/degrade.html
new file mode 100644
index 0000000..9d0c817
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/degrade.html
@@ -0,0 +1,98 @@
+<div class="row" style="margin-left: 1px; margin-top:10px; height: 50px;">
+  <div class="col-md-6" style="margin-bottom: 10px;">
+    <span style="font-size: 30px;font-weight: bold;">{{app}}</span>
+  </div>
+  <div class="col-md-6">
+    <button class="btn btn-default-inverse" style="float: right; margin-right: 10px;" ng-disabled="!macInputModel" ng-click="addNewRule()">
+      <i class="fa fa-plus"></i>&nbsp;&nbsp;鏂板鐔旀柇瑙勫垯</button>
+  </div>
+</div>
+
+<div class="separator"></div>
+
+<div class="container-fluid">
+  <div class="row" style="margin-top: 20px; margin-bottom: 20px;">
+    <div class="col-md-12">
+      <div class="card">
+        <div class="inputs-header">
+          <span class="brand" style="font-size: 13px;">鐔旀柇瑙勫垯</span>
+          <!--<button class="btn btn-danger" style="float: right;margin-right: 10px;height: 30px;font-size: 12px;" ng-click="disableAll()">鍏ㄩ儴绂佺敤</button>-->
+          <button class="btn btn-primary" style="float: right; margin-right: 10px; height: 30px;font-size: 12px;" ng-click="getMachineRules()">鍒锋柊</button>
+          <input class="form-control witdh-200" placeholder="鍏抽敭瀛�" ng-model="searchKey">
+          <div class="control-group" style="float:right;margin-right: 10px;margin-bottom: -10px;">
+            <selectize id="gsInput" class="selectize-input-200" config="macsInputConfig" options="macsInputOptions" ng-model="macInputModel"
+              placeholder="鏈哄櫒"></selectize>
+          </div>
+        </div>
+
+        <!--.tools-header -->
+        <div class="card-body" style="padding: 0px 0px;">
+          <table class="table" style="border-left: none; border-right:none;margin-top: 10px;">
+            <thead>
+              <tr style="background: #F3F5F7;">
+                <td style="width: 40%">
+                  璧勬簮鍚�
+                </td>
+                <td style="width: 10%;">
+                  鐔旀柇绛栫暐
+                </td>
+                <td style="width: 10%;">
+                  闃堝��
+                </td>
+                <td style="width: 10%;">
+                  鐔旀柇鏃堕暱(s)
+                </td>
+                <td style="width: 12%;">
+                  鎿嶄綔
+                </td>
+              </tr>
+            </thead>
+            <tbody>
+              <tr dir-paginate="rule in rules | filter : searchKey | itemsPerPage: rulesPageConfig.pageSize " current-page="rulesPageConfig.currentPageIndex"
+                pagination-id="entriesPagination">
+                <td style="word-wrap:break-word;word-break:break-all;">{{rule.resource}}</td>
+                <!--<td style="word-wrap:break-word;word-break:break-all;">{{rule.limitApp }}</td>-->
+                <td>
+                  <span ng-if="rule.grade == 0">鎱㈣皟鐢ㄦ瘮渚�</span>
+                  <span ng-if="rule.grade == 1" title="寮傚父姣斾緥">寮傚父姣斾緥</span>
+                  <span ng-if="rule.grade == 2" title="寮傚父鏁�">寮傚父鏁�</span>
+                </td>
+                <td style="word-wrap:break-word;word-break:break-all;">
+                  {{rule.count}}
+                </td>
+                <td style="word-wrap:break-word;word-break:break-all;">
+                  {{rule.timeWindow}}s
+                </td>
+
+                <td>
+                  <button class="btn btn-xs btn-default" type="button" ng-click="editRule(rule)" style="font-size: 12px; height:25px;">缂栬緫</button>
+                  <button class="btn btn-xs btn-default" type="button" ng-click="deleteRule(rule)" style="font-size: 12px; height:25px;">鍒犻櫎</button>
+                </td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+        <!-- .card-body -->
+        <div class="pagination-footer">
+          <dir-pagination-controls boundary-links="true" template-url="app/views/pagination.tpl.html" pagination-id="entriesPagination"
+            on-page-change="">
+          </dir-pagination-controls>
+          <div class="tools" style="">
+            <span>鍏� {{rulesPageConfig.totalCount}} 鏉¤褰�, </span>
+            <span>
+              姣忛〉
+              <input class="form-control" ng-model="rulesPageConfig.pageSize"> 鏉¤褰�,
+            </span>
+            <span>绗� {{rulesPageConfig.currentPageIndex}} / {{rulesPageConfig.totalPage}} 椤�</span>
+          </div>
+          <!-- .tools -->
+        </div>
+        <!-- pagination-footer -->
+      </div>
+      <!-- .card -->
+    </div>
+    <!-- .col-md-12 -->
+  </div>
+  <!-- -->
+</div>
+<!-- .container-fluid -->
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/authority-rule-dialog.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/authority-rule-dialog.html
new file mode 100644
index 0000000..bd69085
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/authority-rule-dialog.html
@@ -0,0 +1,46 @@
+<div>
+    <span class="brand" style="font-weight:bold;">{{authorityRuleDialog.title}}</span>
+    <div class="card" style="margin-top: 20px;margin-bottom: 10px;">
+        <div class="panel-body">
+            <div class="row">
+                <form role="form" class="form-horizontal">
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">璧勬簮鍚�</label>
+                        <div class="col-sm-9">
+                            <input type="text" ng-if="authorityRuleDialog.type == 'edit'" class="form-control" placeholder="璧勬簮鍚�" ng-model='currentRule.rule.resource'
+                                   disabled="" />
+                            <input type="text" ng-if="authorityRuleDialog.type == 'add'" class="form-control highlight-border" placeholder="璧勬簮鍚嶇О" ng-model='currentRule.rule.resource'
+                            />
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">娴佹帶搴旂敤</label>
+                        <div class="col-sm-9">
+                            <input type="text" class="form-control highlight-border" ng-model='currentRule.rule.limitApp' placeholder='鎸囪皟鐢ㄦ柟锛屽涓皟鐢ㄦ柟鍚嶇О鐢ㄥ崐瑙掕嫳鏂囬�楀彿锛�,锛夊垎闅�'
+                            />
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">鎺堟潈绫诲瀷</label>
+                        <div class="col-sm-4">
+                            <div class="form-control highlight-border" align="center">
+                                <input type="radio" name="strategy" value="0" checked ng-model='currentRule.rule.strategy' />&nbsp;鐧藉悕鍗�&nbsp;&nbsp;
+                                <input type="radio" name="strategy" value="1" ng-model='currentRule.rule.strategy' />&nbsp;榛戝悕鍗�
+                            </div>
+                        </div>
+                    </div>
+
+                </form>
+            </div>
+            <div class="separator"></div>
+            <div clss="row" style="margin-top: 20px;">
+                <button class="btn btn-outline-danger" style="float:right; height: 30px;font-size: 12px;margin-left: 10px;" ng-click="closeThisDialog()">鍙栨秷</button>
+                <button class="btn btn-outline-success" style="float:right; height: 30px;font-size: 12px;margin-left: 10px;" ng-click="saveRule()">{{authorityRuleDialog.confirmBtnText}}</button>
+                <button ng-if="authorityRuleDialog.saveAndContinueBtnText" class="btn btn-default" style="float:right; height: 30px;font-size: 12px;"
+                        ng-click="saveRuleAndContinue()">{{authorityRuleDialog.saveAndContinueBtnText}}</button>
+            </div>
+        </div>
+    </div>
+</div>
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/cluster/cluster-client-config-dialog.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/cluster/cluster-client-config-dialog.html
new file mode 100644
index 0000000..128ab78
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/cluster/cluster-client-config-dialog.html
@@ -0,0 +1,40 @@
+<div>
+  <span class="brand" style="font-weight:bold;">淇敼 Token Client 閰嶇疆</span>
+  <div class="card" style="margin-top: 20px;margin-bottom: 10px;">
+    <div class="panel-body">
+      <div class="row">
+        <form role="form" class="form-horizontal">
+            <div class="form-group">
+                <label class="col-sm-3 control-label">Client ID</label>
+                <div class="col-sm-4">
+                    <p class="form-control-static">{{ccDialogData.clientId}}</p>
+                </div>
+            </div>
+            <div class="form-group">
+                <label class="col-sm-3 control-label">Token Server IP</label>
+                <div class="col-sm-4">
+                    <input type="text" class="form-control highlight-border" ng-model='ccDialogData.serverHost' placeholder='璇锋寚瀹� Token Server IP' />
+                </div>
+            </div>
+            <div class="form-group">
+                <label class="col-sm-3 control-label">Token Server 绔彛</label>
+                <div class="col-sm-4">
+                    <input type="number" min="0" max="65535" required class="form-control highlight-border" ng-model='ccDialogData.serverPort' placeholder='璇锋寚瀹� Token Server 绔彛' />
+                </div>
+            </div>
+            <div class="form-group">
+                <label class="col-sm-3 control-label">璇锋眰瓒呮椂鏃堕棿锛坢s锛�</label>
+                <div class="col-sm-4">
+                    <input type="number" min="0" required class="form-control highlight-border" ng-model='ccDialogData.requestTimeout' placeholder='璇锋寚瀹氳姹傝秴鏃舵椂闂达紙ms锛�' />
+                </div>
+            </div>
+        </form>
+      </div>
+      <div class="separator"></div>
+      <div clss="row" style="margin-top: 20px;">
+        <button class="btn btn-outline-danger" style="float:right; height: 30px;font-size: 12px;margin-left: 10px;" ng-click="ccDialog.close()">鍙栨秷</button>
+        <button class="btn btn-outline-success" style="float:right; height: 30px;font-size: 12px;margin-left: 10px;" ng-click="doModifyClientConfig()">淇濆瓨</button>
+      </div>
+    </div>
+  </div>
+</div>
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/cluster/cluster-server-assign-dialog.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/cluster/cluster-server-assign-dialog.html
new file mode 100644
index 0000000..350c2e4
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/cluster/cluster-server-assign-dialog.html
@@ -0,0 +1,139 @@
+<div>
+    <span class="brand" style="font-weight:bold;">{{serverAssignDialogData.title}}</span>
+    <div class="card" style="margin-top: 20px;margin-bottom: 10px;">
+        <div class="panel-body">
+            <div class="row">
+                <form role="form" class="form-horizontal">
+                    <div ng-if="serverAssignDialogData.type == 'edit'">
+                        <div class="form-group">
+                            <label class="col-sm-2 control-label">Token Server</label>
+                            <div class="col-sm-4">
+                                <p class="form-control-static">{{serverAssignDialogData.serverData.currentServer}}</p>
+                            </div>
+
+                            <label class="col-sm-2 control-label">Server 绔彛</label>
+                            <div class="col-sm-3">
+                                <input type="number" min="1" max="65535" class="form-control highlight-border"
+                                       ng-disabled="!serverAssignDialogData.serverData.belongToApp"
+                                       ng-model='serverAssignDialogData.serverData.serverPort' placeholder='璇疯緭鍏� Token Server 绔彛'/>
+                            </div>
+                        </div>
+                        <div class="form-group" ng-if="serverAssignDialogData.serverData.belongToApp">
+                            <label class="col-sm-2 control-label"
+                                   title="server 鏈�澶у厑璁哥殑鎬� QPS锛屾敞鎰� embedded 妯″紡涓嬩笉瑕佽鐨勫お澶�">鏈�澶у厑璁� QPS</label>
+                            <div class="col-sm-3">
+                                <input type="number" min="0" max="200000" class="form-control highlight-border"
+                                       ng-model='serverAssignDialogData.serverData.maxAllowedQps' placeholder='璇疯緭鍏� server 鏈�澶у厑璁� QPS'/>
+                            </div>
+                        </div>
+                    </div>
+
+                    <div ng-if="serverAssignDialogData.type == 'add'">
+                        <div class="form-group" >
+                            <label class="col-sm-2 control-label">鏈哄櫒绫诲瀷</label>
+                            <div class="col-sm-4">
+                                <div class="form-control highlight-border" align="center">
+                                    <input type="radio" name="strategy" value="0" checked ng-model='serverAssignDialogData.serverData.serverType' />&nbsp;搴旂敤鍐呮満鍣�&nbsp;&nbsp;
+                                    <input type="radio" name="strategy" value="1" ng-model='serverAssignDialogData.serverData.serverType' />&nbsp;澶栭儴鎸囧畾鏈哄櫒
+                                </div>
+                            </div>
+
+                            <div ng-if="serverAssignDialogData.serverData.serverType == 1">
+                                <div class="col-sm-6">
+                                    <p class="form-control-static text-primary" style="font-size: x-small;">鑻ユ寚瀹氬閮� server锛岃鍏堝湪鐩稿簲椤甸潰瀵瑰閮� server 杩涜閰嶇疆锛岀劧鍚庡湪姝ら〉闈㈡寚瀹氥��</p>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div ng-if="serverAssignDialogData.serverData.serverType == 0">
+                            <div class="form-group">
+                                <label class="col-sm-2 control-label">閫夋嫨鏈哄櫒</label>
+                                <div class="col-sm-4">
+                                    <select ng-model="serverAssignDialogData.serverData.currentServer" ng-change="onCurrentServerChange()"
+                                            ng-options="machineId for machineId in remainingMachineList"
+                                            class="form-control"></select>
+                                </div>
+
+                                <label class="col-sm-2 control-label">Server 绔彛</label>
+                                <div class="col-sm-3">
+                                    <input type="number" min="1" max="65535" class="form-control highlight-border"
+                                           ng-model='serverAssignDialogData.serverData.serverPort' placeholder='璇疯緭鍏� Token Server 绔彛鍙�'/>
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <label class="col-sm-2 control-label"
+                                       title="server 鏈�澶у厑璁哥殑鎬� QPS锛屾敞鎰� embedded 妯″紡涓嬩笉瑕佽鐨勫お澶�">鏈�澶у厑璁� QPS</label>
+                                <div class="col-sm-3">
+                                    <input type="number" min="0" max="200000" class="form-control highlight-border"
+                                           ng-model='serverAssignDialogData.serverData.maxAllowedQps' placeholder='璇疯緭鍏� server 鏈�澶у厑璁� QPS'/>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div ng-if="serverAssignDialogData.serverData.serverType == 1">
+                            <div class="form-group">
+                                <label class="col-sm-2 control-label">Server IP</label>
+                                <div class="col-sm-4">
+                                    <input type="text" class="form-control highlight-border"
+                                           ng-model='serverAssignDialogData.serverData.currentServer' placeholder='璇疯緭鍏ョ嫭绔嬬殑 Token Server IP'/>
+                                </div>
+
+                                <label class="col-sm-2 control-label">Server 绔彛</label>
+                                <div class="col-sm-3">
+                                    <input type="number" min="1" max="65535" class="form-control highlight-border"
+                                           ng-model='serverAssignDialogData.serverData.serverPort' placeholder='璇疯緭鍏� Token Server 绔彛鍙�'/>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </form>
+
+                <!-- assign form start -->
+                <form role="form" class="form-inline" ng-if="serverAssignDialogData.serverData.currentServer"
+                      style="margin-top: 30px; margin-left: 20px; text-align: center;">
+                    <div>
+                        <div class="form-group">
+                            <div class="col-sm-12">
+                                <label class="control-label" style="width: 220px; text-align: center;">璇蜂粠涓�夊彇 client锛�</label>
+                                <div>
+                                    <select size="8" multiple="multiple" ng-model="tmp.curRemainingClientChosen"
+                                            ng-options="ip for ip in remainingMachineList | filter: notChosenServer"
+                                            class="form-control" style="width: 100%;">
+                                    </select>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="form-group">
+                            <div class="col-sm-12">
+
+                                <button type="button" class="btn btn-outline-primary"
+                                        ng-click="moveToRemainingSharePool()">鈫�
+                                </button>
+                                <button type="button" class="btn btn-outline-primary"
+                                        ng-click="moveToServerGroup()">鈫�
+                                </button>
+                            </div>
+                        </div>
+
+                        <div class="form-group">
+                            <div class="col-sm-12">
+                                <label class="control-label" style="width: 200px; text-align: center;">宸查�夊彇鐨� client 鍒楄〃</label>
+                                <div>
+                                    <select size="8" multiple="multiple" ng-model="tmp.curClientChosen"
+                                            ng-options="ip for ip in serverAssignDialogData.serverData.clientSet"
+                                            class="form-control" style="width: 100%;"></select>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </form>
+            </div>
+            <div class="separator"></div>
+            <div clss="row" style="margin-top: 20px;">
+                <button class="btn btn-outline-danger" style="float:right; height: 30px;font-size: 12px;margin-left: 10px;" ng-click="serverAssignDialog.close()">鍙栨秷</button>
+                <button class="btn btn-outline-success" style="float:right; height: 30px;font-size: 12px;margin-left: 10px;" ng-click="saveAssignForDialog()">{{serverAssignDialogData.confirmBtnText}}</button>
+            </div>
+        </div>
+    </div>
+</div>
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/cluster/cluster-server-connection-detail-dialog.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/cluster/cluster-server-connection-detail-dialog.html
new file mode 100644
index 0000000..afbf29a
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/cluster/cluster-server-connection-detail-dialog.html
@@ -0,0 +1,37 @@
+<div>
+    <span class="brand" style="font-weight:bold;">杩炴帴璇︽儏</span>
+    <div class="card" style="margin-top: 20px;margin-bottom: 10px;">
+        <div class="panel-body">
+            <div class="row">
+                <form role="form" class="form-horizontal">
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">Token Server</label>
+                        <div class="col-sm-4">
+                            <p class="form-control-static">{{connectionDetailDialogData.serverData.id}}</p>
+                        </div>
+                    </div>
+                </form>
+
+                <div class="col-md-12">
+                    <!-- table start -->
+                    <table class="table" style="border-left: none; border-right:none;margin-top: 10px;">
+                        <thead>
+                        <tr style="background: #F3F5F7;">
+                            <td style="min-width: 15%;" class="text-center">鍛藉悕绌洪棿</td>
+                            <td class="text-center">杩炴帴鏁�</td>
+                            <td class="text-center">杩炴帴璇︽儏</td>
+                        </tr>
+                        </thead>
+                        <tbody>
+                        <tr ng-repeat="cg in connectionDetailDialogData.serverData.state.connection">
+                            <td style="word-wrap:break-word;word-break:break-all;" class="text-center">{{cg.namespace}}</td>
+                            <td style="word-wrap:break-word;word-break:break-all;" class="text-center">{{cg.connectedCount}}</td>
+                            <td class="text-center">{{generateConnectionSet(cg.connectionSet)}}</td>
+                        </tr>
+                        </tbody>
+                    </table>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/confirm-dialog.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/confirm-dialog.html
new file mode 100644
index 0000000..b7bf3d6
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/confirm-dialog.html
@@ -0,0 +1,20 @@
+<div>
+  <span class="brand" style="font-weight:bold;">{{confirmDialog.title}}</span>
+  <div class="card" style="margin-top: 20px;margin-bottom: 10px;">
+    <div class="panel-body">
+      <div class="row">
+        <p style="margin-left: 20px; margin-right: 20px;">
+          {{confirmDialog.attentionTitle}}:
+          <br/>
+          <br/>
+          <code style="word-wrap: break-word; white-space:normal">{{confirmDialog.attention}}</code>
+        </p>
+      </div>
+      <div class="separator"></div>
+      <div clss="row" style="margin-top: 20px;">
+        <button class="btn btn-default-inverse" style="float:right; height: 30px;font-size: 12px;margin-left: 10px;" ng-click="closeThisDialog()">鍙栨秷</button>
+        <button class="btn btn-outline-danger" style="float:right; height: 30px;font-size: 12px;" ng-click="confirm()">{{confirmDialog.confirmBtnText}}</button>
+      </div>
+    </div>
+  </div>
+</div>
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/degrade-rule-dialog.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/degrade-rule-dialog.html
new file mode 100644
index 0000000..b8fae0c
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/degrade-rule-dialog.html
@@ -0,0 +1,93 @@
+<div>
+	<span class="brand" style="font-weight:bold;">{{degradeRuleDialog.title}}</span>
+	<div class="card" style="margin-top: 20px;margin-bottom: 10px;">
+		<div class="panel-body">
+			<div class="row">
+				<form role="form" class="form-horizontal">
+					<div class="form-group">
+						<label class="col-sm-2 control-label">璧勬簮鍚�</label>
+						<div class="col-sm-9">
+							<input type="text" ng-if="degradeRuleDialog.type == 'edit'" class="form-control" placeholder="璧勬簮鍚�" ng-model='currentRule.resource'
+							 disabled="" />
+							<input type="text" ng-if="degradeRuleDialog.type == 'add'" class="form-control highlight-border" placeholder="璧勬簮鍚�" ng-model='currentRule.resource'
+							/>
+						</div>
+					</div>
+
+					<!--<div class="form-group">-->
+						<!--<label class="col-sm-2 control-label">娴佹帶搴旂敤</label>-->
+						<!--<div class="col-sm-9">-->
+							<!--<input type="text" class="form-control highlight-border" ng-model='currentRule.limitApp' placeholder='"default"琛ㄧず鎵�鏈夊簲鐢ㄣ��' />-->
+						<!--</div>-->
+					<!--</div>-->
+
+					<div class="form-group">
+						<label class="col-sm-2 control-label">鐔旀柇绛栫暐</label>
+						<div class="col-sm-9">
+							<div class="form-control highlight-border" align="center">
+								<input type="radio" name="grade" value="0" checked ng-model='currentRule.grade' title="鎱㈣皟鐢ㄦ瘮渚嬶紙1.8.0+ 鐗堟湰鐢熸晥锛�" />&nbsp;鎱㈣皟鐢ㄦ瘮渚�&nbsp;&nbsp;
+								<input type="radio" name="grade" value="1" ng-model='currentRule.grade' title="寮傚父姣斾緥" />&nbsp;寮傚父姣斾緥&nbsp;&nbsp;
+								<input type="radio" name="grade" value="2" ng-model='currentRule.grade' title="寮傚父鏁�" />&nbsp;寮傚父鏁�
+							</div>
+						</div>
+					</div>
+
+					<div class="form-group">
+						<label ng-if="currentRule.grade == 0" class="col-sm-2 control-label"  title="鏈�澶� RT锛岃秴杩囪鍊煎垯璁′负鎱㈣皟鐢�">鏈�澶� RT</label>
+						<label ng-if="currentRule.grade == 1" class="col-sm-2 control-label">姣斾緥闃堝��</label>
+						<label ng-if="currentRule.grade == 2" class="col-sm-2 control-label">寮傚父鏁�</label>
+						<div class="col-sm-4">
+							<input type='number' class="form-control highlight-border" ng-model='currentRule.count' ng-if="currentRule.grade == 0" placeholder="RT (姣)"/>
+							<input type='number' class="form-control highlight-border" ng-model='currentRule.count' ng-if="currentRule.grade == 1" placeholder="鍙栧�艰寖鍥� [0.0,1.0]"/>
+							<input type='number' class="form-control highlight-border" ng-model='currentRule.count' ng-if="currentRule.grade == 2" placeholder="寮傚父鏁�"/>
+						</div>
+						<div ng-if="currentRule.grade == 0">
+							<label class="col-sm-2 control-label">姣斾緥闃堝��</label>
+							<div class="col-sm-3">
+								<input type='number' min="0" class="form-control highlight-border" ng-model='currentRule.slowRatioThreshold'
+									   placeholder="鍙栧�� [0.0, 1.0]" />
+							</div>
+						</div>
+					</div>
+
+					<div class="form-group">
+						<label class="col-sm-2 control-label">鐔旀柇鏃堕暱</label>
+						<div class="col-sm-4">
+							<div class="input-group">
+								<input type='number' min="0" class="form-control highlight-border" ng-model='currentRule.timeWindow'
+									   placeholder="鐔旀柇鏃堕暱(s)" />
+								<span class="input-group-addon">s</span>
+							</div>
+						</div>
+
+						<label class="col-sm-2 control-label" style="text-align: center; padding-right: 5px;"
+							   title="瑙﹀彂鐔旀柇鐨勬渶灏忚姹傛暟鐩紝鑻ュ綋鍓嶇粺璁$獥鍙e唴鐨勮姹傛暟灏忎簬姝ゅ�硷紝鍗充娇杈惧埌鐔旀柇鏉′欢瑙勫垯涔熶笉浼氳Е鍙�">鏈�灏忚姹傛暟</label>
+						<div class="col-sm-3">
+							<input type='number' min="1" class="form-control highlight-border" ng-model='currentRule.minRequestAmount'
+								   placeholder="鏈�灏忚姹傛暟鐩�" />
+						</div>
+					</div>
+
+					<div class="form-group">
+						<label class="col-sm-2 control-label">缁熻鏃堕暱</label>
+						<div class="col-sm-4">
+							<div class="input-group">
+							<input type='number' min="1" class="form-control highlight-border" ng-model='currentRule.statIntervalMs'
+								   placeholder="缁熻鏃堕暱(ms)" />
+							<span class="input-group-addon">ms</span>
+							</div>
+						</div>
+					</div>
+
+				</form>
+			</div>
+			<div class="separator"></div>
+			<div clss="row" style="margin-top: 20px;">
+				<button class="btn btn-outline-danger" style="float:right; height: 30px;font-size: 12px;margin-left: 10px;" ng-click="closeThisDialog()">鍙栨秷</button>
+				<button class="btn btn-outline-success" style="float:right; height: 30px;font-size: 12px;margin-left: 10px;" ng-click="saveRule()">{{degradeRuleDialog.confirmBtnText}}</button>
+				<button ng-if="degradeRuleDialog.saveAndContinueBtnText" class="btn btn-default" style="float:right; height: 30px;font-size: 12px;"
+				 ng-click="saveRuleAndContinue()">{{degradeRuleDialog.saveAndContinueBtnText}}</button>
+			</div>
+		</div>
+	</div>
+</div>
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/flow-rule-dialog.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/flow-rule-dialog.html
new file mode 100644
index 0000000..957d2ce
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/flow-rule-dialog.html
@@ -0,0 +1,148 @@
+<div>
+  <span class="brand" style="font-weight:bold;">{{flowRuleDialog.title}}</span>
+  <div class="card" style="margin-top: 20px;margin-bottom: 10px;">
+    <div class="panel-body">
+      <div class="row">
+        <form role="form" class="form-horizontal">
+          <div class="form-group">
+            <label class="col-sm-2 control-label">璧勬簮鍚�</label>
+            <div class="col-sm-9">
+              <input type="text" ng-if="flowRuleDialog.type == 'edit'" class="form-control" placeholder="璧勬簮鍚�" ng-model='currentRule.resource'
+                disabled="" />
+              <input type="text" ng-if="flowRuleDialog.type == 'add'" class="form-control highlight-border" placeholder="璧勬簮鍚�" ng-model='currentRule.resource'
+              />
+            </div>
+          </div>
+
+          <div class="form-group">
+            <label class="col-sm-2 control-label" data-toggle="tooltip" title="娴佹帶閽堝鐨勬潵婧愶紝鍗虫祦閲忓叆鍙g殑璋冪敤鏉ユ簮锛坥rigin锛�">閽堝鏉ユ簮</label>
+            <div class="col-sm-9">
+              <input type="text" class="form-control highlight-border" ng-model='currentRule.limitApp' placeholder='璋冪敤鏉ユ簮锛�"default"琛ㄧず鎵�鏈夊簲鐢�'
+              />
+            </div>
+          </div>
+
+          <div class="form-group">
+            <label class="col-sm-2 control-label">闃堝�肩被鍨�</label>
+            <div class="col-sm-4">
+              <div class="form-control highlight-border" align="center">
+                <input type="radio" name="grade" value="1" checked ng-model='currentRule.grade' />&nbsp;QPS&nbsp;&nbsp;
+                <input type="radio" name="grade" value="0" ng-model='currentRule.grade' />&nbsp;骞跺彂绾跨▼鏁�
+              </div>
+            </div>
+            <div ng-if="!currentRule.clusterMode">
+              <label class="col-sm-2 control-label">鍗曟満闃堝��</label>
+              <div class="col-sm-3">
+                <input type='number' min="0" class="form-control highlight-border" ng-model='currentRule.count' placeholder="鍗曟満闃堝��" />
+              </div>
+            </div>
+            <div ng-if="currentRule.clusterMode && currentRule.clusterConfig.thresholdType == 0">
+              <label class="col-sm-2 control-label">鍧囨憡闃堝��</label>
+              <div class="col-sm-3">
+                <input type='number' min="0" class="form-control highlight-border" ng-model='currentRule.count' placeholder="鍗曟満鍧囨憡闃堝��" />
+              </div>
+            </div>
+            <div ng-if="currentRule.clusterMode && currentRule.clusterConfig.thresholdType == 1">
+              <label class="col-sm-2 control-label">闆嗙兢闃堝��</label>
+              <div class="col-sm-3">
+                <input type='number' min="0" class="form-control highlight-border" ng-model='currentRule.count' placeholder="闆嗙兢鎬讳綋闃堝��" />
+              </div>
+            </div>
+          </div>
+
+          <div class="form-group">
+            <label class="col-sm-2 control-label">鏄惁闆嗙兢</label>
+            <div class="col-sm-2">
+              <label class="checkbox-inline">
+                <input type="checkbox" name="clusterMode" ng-model="currentRule.clusterMode">
+              </label>
+            </div>
+            <div ng-if="currentRule.clusterMode">
+              <label class="col-sm-3 control-label">闆嗙兢闃堝�兼ā寮�</label>
+              <div class="col-sm-4">
+                <div class="form-control highlight-border" align="center">
+                  <input type="radio" name="clusterThresholdType" value="0" ng-model='currentRule.clusterConfig.thresholdType' />&nbsp;鍗曟満鍧囨憡&nbsp;&nbsp;
+                  <input type="radio" name="clusterThresholdType" value="1" ng-model='currentRule.clusterConfig.thresholdType' />&nbsp;鎬讳綋闃堝��
+                </div>
+              </div>
+            </div>
+          </div>
+
+          <div class="form-group" ng-if="currentRule.clusterMode">
+            <label class="col-sm-2 control-label">澶辫触閫�鍖�</label>
+            <div class="col-sm-8">
+              <label class="checkbox-inline">
+                <input type="checkbox" name="fallbackToLocalWhenFail" ng-model="currentRule.clusterConfig.fallbackToLocalWhenFail">
+                <i class="glyphicon glyphicon-info-sign"></i>&nbsp;濡傛灉 Token Server 涓嶅彲鐢ㄦ槸鍚﹂��鍖栧埌鍗曟満闄愭祦
+              </label>
+            </div>
+          </div>
+
+          <div ng-if="!flowRuleDialog.showAdvanceButton && !currentRule.clusterMode">
+            <div class="form-group">
+              <label class="col-sm-2 control-label" title="璋冪敤鍏崇郴娴佹帶妯″紡">娴佹帶妯″紡</label>
+              <div class="col-sm-9">
+                <div class="form-control highlight-border" align="center">
+                  <input type="radio" name="strategy" value="0" ng-model='currentRule.strategy' />&nbsp;鐩存帴&nbsp;&nbsp;
+                  <input type="radio" name="strategy" value="1" ng-model='currentRule.strategy' />&nbsp;鍏宠仈&nbsp;&nbsp;
+                  <input type="radio" name="strategy" value="2" ng-model='currentRule.strategy' />&nbsp;閾捐矾&nbsp;&nbsp;
+                </div>
+              </div>
+            </div>
+
+            <div class="form-group" ng-show="currentRule.strategy==1">
+              <label class="col-sm-2 control-label">鍏宠仈璧勬簮</label>
+              <div class="col-sm-9">
+                <input type="text" class="form-control highlight-border" placeholder="鍏宠仈璧勬簮" ng-model='currentRule.refResource' />
+              </div>
+            </div>
+            <div class="form-group" ng-show="currentRule.strategy==2">
+              <label class="col-sm-2 control-label">鍏ュ彛璧勬簮</label>
+              <div class="col-sm-9">
+                <input type="text" class="form-control highlight-border" placeholder="鍏ュ彛璧勬簮" ng-model='currentRule.refResource' />
+              </div>
+            </div>
+          </div>
+          <div ng-if="currentRule.grade==1 && !flowRuleDialog.showAdvanceButton && !currentRule.clusterMode">
+            <div class="form-group">
+              <label class="col-sm-2 control-label">娴佹帶鏁堟灉</label>
+              <div class="col-sm-9">
+                <div class="form-control highlight-border" align="center">
+                  <input type="radio" name="controlBehavior" value="0" checked ng-model='currentRule.controlBehavior' />&nbsp;蹇�熷け璐�&nbsp;&nbsp;
+                  <input type="radio" name="controlBehavior" value="1" ng-model='currentRule.controlBehavior' />&nbsp;Warm Up&nbsp;&nbsp;
+                  <input type="radio" name="controlBehavior" value="2" ng-model='currentRule.controlBehavior' />&nbsp;鎺掗槦绛夊緟
+                </div>
+              </div>
+
+            </div>
+            <div class="form-group">
+              <div ng-if="currentRule.controlBehavior==1">
+                <label class="col-sm-2 control-label">棰勭儹鏃堕暱</label>
+                <div class="col-sm-9">
+                  <input type='number' class="form-control highlight-border" ng-model='currentRule.warmUpPeriodSec' placeholder="绉�" />
+                </div>
+              </div>
+              <div ng-if="currentRule.controlBehavior==2">
+                <label class="col-sm-2 control-label">瓒呮椂鏃堕棿</label>
+                <div class="col-sm-9">
+                  <input type='number' class="form-control highlight-border" ng-model='currentRule.maxQueueingTimeMs' placeholder="姣" />
+                </div>
+              </div>
+            </div>
+          </div>
+          <div class="form-group text-center" ng-if="!currentRule.clusterMode">
+            <a ng-click="onOpenAdvanceClick()" ng-if="flowRuleDialog.showAdvanceButton" style="cursor: pointer;">楂樼骇閫夐」</a>
+            <a ng-click="onCloseAdvanceClick()" ng-if="!flowRuleDialog.showAdvanceButton" style="cursor: pointer;">鍏抽棴楂樼骇閫夐」</a>
+          </div>
+        </form>
+      </div>
+      <div class="separator"></div>
+      <div clss="row" style="margin-top: 20px;">
+        <button class="btn btn-outline-danger" style="float:right; height: 30px;font-size: 12px;margin-left: 10px;" ng-click="closeThisDialog()">鍙栨秷</button>
+        <button class="btn btn-outline-success" style="float:right; height: 30px;font-size: 12px;margin-left: 10px;" ng-click="saveRule()">{{flowRuleDialog.confirmBtnText}}</button>
+        <button ng-if="flowRuleDialog.saveAndContinueBtnText" class="btn btn-default" style="float:right; height: 30px;font-size: 12px;"
+          ng-click="saveRuleAndContinue()">{{flowRuleDialog.saveAndContinueBtnText}}</button>
+      </div>
+    </div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/gateway/api-dialog.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/gateway/api-dialog.html
new file mode 100644
index 0000000..8c8d461
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/gateway/api-dialog.html
@@ -0,0 +1,49 @@
+<div>
+	<span class="brand" style="font-weight:bold;">{{gatewayApiDialog.title}}</span>
+	<div class="card" style="margin-top: 20px;margin-bottom: 10px;">
+		<div class="panel-body">
+				<form role="form" class="form-horizontal">
+					<div class="form-group">
+						<label class="col-sm-2 control-label">API 鍚嶇О</label>
+						<div class="col-sm-9">
+							<input type="text" ng-if="gatewayApiDialog.type == 'edit'" class="form-control" placeholder="璇疯緭鍏�" ng-model='currentApi.apiName'
+							 disabled="" />
+							<input type="text" ng-if="gatewayApiDialog.type == 'add'" class="form-control highlight-border" placeholder="璇疯緭鍏�" ng-model='currentApi.apiName' />
+						</div>
+					</div>
+
+					<div class="form-group" ng-repeat="predicateItem in currentApi.predicateItems track by $index">
+						<label class="col-sm-2 control-label">鍖归厤妯″紡</label>
+						<div class="col-sm-4 control-label">
+							<div class="form-control highlight-border" align="center">
+								<input type="radio" value="0" checked ng-model="predicateItem.matchStrategy" title="绮剧‘" />&nbsp;绮剧‘&nbsp;&nbsp;
+								<input type="radio" value="1" ng-model="predicateItem.matchStrategy" title="鍓嶇紑" />&nbsp;鍓嶇紑&nbsp&nbsp;
+								<input type="radio" value="2" ng-model="predicateItem.matchStrategy" title="姝e垯" />&nbsp;姝e垯&nbsp&nbsp;
+							</div>
+						</div>
+						<label class="col-sm-2 control-label">鍖归厤涓�</label>
+						<div class="col-sm-3 control-label">
+							<input type='text' ng-model="predicateItem.pattern" class="form-control highlight-border" placeholder="璇疯緭鍏�" />
+						</div>
+						<div class="col-sm-1 control-label" align="center">
+							<button class="btn btn-outline-danger" ng-click="removeMatchPattern($index)"
+									align="center" ng-if="currentApi.predicateItems.length > 1">X</button>
+						</div>
+					</div>
+
+					<div class="form-group" style="text-align: center">
+						<button class="btn btn-outline-primary" ng-click="addNewMatchPattern()">
+							<i class="fa fa-plus"></i>&nbsp;鏂板鍖归厤瑙勫垯
+						</button>
+					</div>
+				</form>
+			<div class="separator"></div>
+			<div clss="row" style="margin-top: 20px;">
+				<button class="btn btn-outline-danger" style="float:right; height: 30px;font-size: 12px;margin-left: 10px;" ng-click="closeThisDialog()">鍙栨秷</button>
+				<button class="btn btn-outline-success" style="float:right; height: 30px;font-size: 12px;margin-left: 10px;" ng-click="saveApi()">{{gatewayApiDialog.confirmBtnText}}</button>
+				<button ng-if="gatewayApiDialog.saveAndContinueBtnText" class="btn btn-default" style="float:right; height: 30px;font-size: 12px;"
+				 ng-click="saveApiAndContinue()">{{gatewayApiDialog.saveAndContinueBtnText}}</button>
+			</div>
+		</div>
+	</div>
+</div>
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/gateway/flow-rule-dialog.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/gateway/flow-rule-dialog.html
new file mode 100644
index 0000000..ea744a7
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/gateway/flow-rule-dialog.html
@@ -0,0 +1,172 @@
+<div>
+	<span class="brand" style="font-weight:bold;">{{gatewayFlowRuleDialog.title}}</span>
+	<div class="card" style="margin-top: 20px;margin-bottom: 10px;">
+		<div class="panel-body">
+			<div class="row">
+				<form role="form" class="form-horizontal">
+					<div class="form-group">
+						<label class="col-sm-2 control-label">API 绫诲瀷</label>
+						<div class="col-sm-9">
+							<div class="form-control highlight-border" align="center">
+								<input type="radio" ng-if="gatewayFlowRuleDialog.type == 'edit'" value="0" checked ng-model='currentRule.resourceMode'
+											 disabled="" title="Route ID" /><span ng-if="gatewayFlowRuleDialog.type == 'edit'">&nbsp;Route ID&nbsp;&nbsp;</span>
+								<input type="radio" ng-if="gatewayFlowRuleDialog.type == 'add'" value="0" checked ng-model='currentRule.resourceMode'
+											 title="Route ID" ng-click="useRouteID()"/><span ng-if="gatewayFlowRuleDialog.type == 'add'">&nbsp;Route ID&nbsp;&nbsp;</span>
+								<input type="radio" ng-if="gatewayFlowRuleDialog.type == 'edit'" value="1" ng-model='currentRule.resourceMode'
+											 disabled="" title="API鍒嗙粍" /><span ng-if="gatewayFlowRuleDialog.type == 'edit'">&nbsp;API 鍒嗙粍&nbsp&nbsp;</span>
+								<input type="radio" ng-if="gatewayFlowRuleDialog.type == 'add'" value="1" ng-model='currentRule.resourceMode'
+											 title="API鍒嗙粍" ng-click="useCustormAPI()"/><span ng-if="gatewayFlowRuleDialog.type == 'add'">&nbsp;API 鍒嗙粍&nbsp&nbsp;</span>
+							</div>
+						</div>
+					</div>
+
+					<div class="form-group">
+						<label class="col-sm-2 control-label">API 鍚嶇О</label>
+						<div class="col-sm-9">
+							<input type="text" ng-if="currentRule.resourceMode == 0 && gatewayFlowRuleDialog.type == 'edit'" class="form-control" placeholder="璇疯緭鍏� Route ID" ng-model='currentRule.resource'
+							 disabled="" />
+							<input type="text" ng-if="currentRule.resourceMode == 0 && gatewayFlowRuleDialog.type == 'add'" class="form-control highlight-border" placeholder="璇疯緭鍏� Route ID" ng-model='currentRule.resource' />
+
+							<select ng-if="currentRule.resourceMode == 1 && gatewayFlowRuleDialog.type == 'edit'" ng-model="currentRule.resource" ng-init="selectedName = currentRule.resource"
+										disabled=""	ng-options="name for name in apiNames" class="form-control">
+							</select>
+							<select ng-if="currentRule.resourceMode == 1 && gatewayFlowRuleDialog.type == 'add'" ng-model="currentRule.resource" ng-init="currentRule.resource"
+											ng-options="name for name in apiNames" class="form-control">
+							</select>
+						</div>
+					</div>
+
+					<div class="form-group">
+						<label class="col-sm-2 control-label">閽堝璇锋眰灞炴��</label>
+						<div class="col-sm-2">
+							<label class="checkbox-inline">
+								<input type="checkbox" ng-if="currentRule.paramItem != null" checked ng-click="notUseParamItem()" />
+								<input type="checkbox" ng-if="currentRule.paramItem == null" ng-click="useParamItem()" />
+							</label>
+						</div>
+					</div>
+
+					<div class="form-group" ng-if="currentRule.paramItem != null">
+						<label class="col-sm-2 control-label">鍙傛暟灞炴��</label>
+						<div class="col-sm-9">
+							<div class="form-control highlight-border" align="center">
+								<input type="radio" name="parseStrategy" value="0" checked ng-model='currentRule.paramItem.parseStrategy' title="Client IP" />&nbsp;Client IP&nbsp;&nbsp;
+								<input type="radio" name="parseStrategy" value="1" ng-model='currentRule.paramItem.parseStrategy' title="Remote Host" />&nbsp;Remote Host&nbsp;&nbsp;
+								<input type="radio" name="parseStrategy" value="2" ng-model='currentRule.paramItem.parseStrategy' title="Header" />&nbsp;Header&nbsp;&nbsp;
+								<input type="radio" name="parseStrategy" value="3" ng-model='currentRule.paramItem.parseStrategy' title="URL 鍙傛暟" />&nbsp;URL 鍙傛暟&nbsp;&nbsp;
+								<input type="radio" name="parseStrategy" value="4" ng-model='currentRule.paramItem.parseStrategy' title="Cookie" />&nbsp;Cookie&nbsp;&nbsp;
+							</div>
+						</div>
+					</div>
+
+					<div class="form-group" ng-if="currentRule.paramItem != null && (currentRule.paramItem.parseStrategy == 2 || currentRule.paramItem.parseStrategy == 3 || currentRule.paramItem.parseStrategy == 4)">
+						<label class="col-sm-2 control-label">
+							<span ng-if="currentRule.paramItem.parseStrategy==2">Header 鍚嶇О</span>
+							<span ng-if="currentRule.paramItem.parseStrategy==3">URL 鍙傛暟鍚嶇О</span>
+							<span ng-if="currentRule.paramItem.parseStrategy==4">Cookie 鍚嶇О</span>
+						</label>
+						<div class="col-sm-9">
+							<input type="text" name="fieldName" class="form-control highlight-border" placeholder="璇疯緭鍏�" ng-model='currentRule.paramItem.fieldName' />
+						</div>
+					</div>
+
+					<div class="form-group" ng-if="currentRule.paramItem != null">
+						<label class="col-sm-2 control-label">灞炴�у�煎尮閰�</label>
+						<div class="col-sm-2">
+							<label class="checkbox-inline">
+								<input type="checkbox" ng-if="currentRule.paramItem.pattern != null" checked ng-click="notUseParamItemVal()"/>
+								<input type="checkbox" ng-if="currentRule.paramItem.pattern == null" ng-click="useParamItemVal()"/>
+							</label>
+						</div>
+					</div>
+
+					<div class="form-group" ng-if="currentRule.paramItem.pattern != null">
+						<label class="col-sm-2 control-label">鍖归厤妯″紡</label>
+						<div class="col-sm-4 control-label">
+							<div class="form-control highlight-border" align="center">
+								<input type="radio" value="0" checked ng-model="currentRule.paramItem.matchStrategy" title="绮剧‘" />&nbsp;绮剧‘&nbsp;&nbsp;
+								<input type="radio" value="3" ng-model="currentRule.paramItem.matchStrategy" title="瀛愪覆" />&nbsp;瀛愪覆&nbsp;&nbsp;
+								<input type="radio" value="2" ng-model="currentRule.paramItem.matchStrategy" title="姝e垯" />&nbsp;姝e垯&nbsp;&nbsp;
+							</div>
+						</div>
+						<label class="col-sm-2 control-label">鍖归厤涓�</label>
+						<div class="col-sm-3 control-label">
+							<input type='text' ng-model="currentRule.paramItem.pattern" class="form-control highlight-border" placeholder="鍖归厤涓�" />
+						</div>
+					</div>
+
+					<div class="form-group">
+						<label class="col-sm-2 control-label">闃堝�肩被鍨�</label>
+						<div class="col-sm-9">
+							<div class="form-control highlight-border" align="center">
+								<input type="radio" name="grade" value="1" checked ng-model="currentRule.grade" title="QPS" />&nbsp;QPS&nbsp;&nbsp;
+								<input type="radio" name="grade" value="0" ng-model="currentRule.grade" title="绾跨▼鏁�" />&nbsp;绾跨▼鏁�&nbsp;&nbsp;
+							</div>
+						</div>
+					</div>
+
+					<div class="form-group">
+						<div>
+							<label class="col-sm-2 control-label">
+								<span ng-if="currentRule.grade==1">QPS 闃堝��</span>
+								<span ng-if="currentRule.grade==0">绾跨▼鏁�</span>
+							</label>
+							<div class="col-sm-3">
+								<input type='number' min="0" class="form-control highlight-border" ng-model='currentRule.count' placeholder="闃堝��" />
+							</div>
+						</div>
+					</div>
+
+					<div class="form-group" ng-if="currentRule.grade==1">
+						<div>
+							<label class="col-sm-2 control-label">闂撮殧</label>
+							<div class="col-sm-3">
+								<input type='number' id="txtInterval" min="1" class="form-control highlight-border" ng-model='currentRule.interval' placeholder="缁熻绐楀彛鏃堕棿闀垮害" />
+							</div>
+							<div class="col-sm-2">
+								<select ng-model="currentRule.intervalUnit" ng-init="currentRule.intervalUnit"
+												ng-options="intervalUnit.val as intervalUnit.desc for intervalUnit in intervalUnits" class="form-control" ng-click="changeIntervalUnit()">
+								</select>
+							</div>
+						</div>
+					</div>
+
+					<div class="form-group" ng-if="currentRule.grade==1">
+						<label class="col-sm-2 control-label">娴佹帶鏂瑰紡</label>
+						<div class="col-sm-9">
+							<div class="form-control highlight-border" align="center">
+								<input type="radio" name="controlBehavior" value="0" checked ng-model='currentRule.controlBehavior' title="蹇�熷け璐�" />&nbsp;蹇�熷け璐�&nbsp;&nbsp;
+								<input type="radio" name="controlBehavior" value="2" ng-model='currentRule.controlBehavior' title="鍖�閫熸帓闃�" />&nbsp;鍖�閫熸帓闃�&nbsp&nbsp;
+							</div>
+						</div>
+					</div>
+
+					<div class="form-group" ng-if="currentRule.grade==1 && currentRule.controlBehavior==0">
+						<div>
+							<label class="col-sm-2 control-label">Burst size</label>
+							<div class="col-sm-3">
+								<input type='number' min="0" class="form-control highlight-border" ng-model='currentRule.burst' placeholder="绐佸彂璇锋眰棰濆鍏佽鏁�" />
+							</div>
+						</div>
+					</div>
+
+					<div class="form-group" ng-if="currentRule.grade==1 && currentRule.controlBehavior==2">
+						<div>
+							<label class="col-sm-2 control-label">瓒呮椂鏃堕棿</label>
+							<div class="col-sm-3">
+								<input type='number' min="0" class="form-control highlight-border" ng-model='currentRule.maxQueueingTimeoutMs' placeholder="鎺掗槦绛夊緟鏃堕棿(ms)" />
+							</div>
+						</div>
+					</div>
+				</form>
+			</div>
+			<div class="separator"></div>
+			<div clss="row" style="margin-top: 20px;">
+				<button class="btn btn-outline-danger" style="float:right; height: 30px;font-size: 12px;margin-left: 10px;" ng-click="closeThisDialog()">鍙栨秷</button>
+				<button class="btn btn-outline-success" style="float:right; height: 30px;font-size: 12px;margin-left: 10px;" ng-click="saveRule()">{{gatewayFlowRuleDialog.confirmBtnText}}</button>
+				<button ng-if="gatewayFlowRuleDialog.saveAndContinueBtnText" class="btn btn-default" style="float:right; height: 30px;font-size: 12px;"
+				 ng-click="saveRuleAndContinue()">{{gatewayFlowRuleDialog.saveAndContinueBtnText}}</button>
+			</div>
+		</div>
+	</div>
+</div>
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/param-flow-rule-dialog.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/param-flow-rule-dialog.html
new file mode 100644
index 0000000..02f00b0
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/param-flow-rule-dialog.html
@@ -0,0 +1,166 @@
+<div>
+	<span class="brand" style="font-weight:bold;">{{paramFlowRuleDialog.title}}</span>
+	<div class="card" style="margin-top: 20px;margin-bottom: 10px;">
+		<div class="panel-body">
+			<div class="clearfix">
+				<form role="form" class="form-horizontal">
+					<div class="form-group">
+						<label class="col-sm-2 control-label">璧勬簮鍚�</label>
+						<div class="col-sm-9">
+							<input type="text" ng-if="paramFlowRuleDialog.type == 'edit'" class="form-control" placeholder="璧勬簮鍚�" ng-model='currentRule.rule.resource' disabled="" />
+							<input type="text" ng-if="paramFlowRuleDialog.type == 'add'" class="form-control highlight-border" placeholder="璧勬簮鍚�" ng-model='currentRule.rule.resource' required />
+						</div>
+                    </div>
+                    
+                    <div class="form-group">
+						<label class="col-sm-2 control-label">闄愭祦妯″紡</label>
+						<p class="col-sm-9 control-label" style="text-align: left; font-weight: normal;">QPS 妯″紡</p>
+					</div>
+
+					<div class="form-group">
+						<label class="col-sm-2 control-label">鍙傛暟绱㈠紩</label>
+						<div class="col-sm-9">
+							<input type="number" class="form-control highlight-border" ng-model='currentRule.rule.paramIdx' placeholder='璇峰~鍏ヤ紶鍏ョ殑鐑偣鍙傛暟鐨勭储寮曪紙浠� 0 寮�濮嬶級' />
+						</div>
+                    </div>
+                    
+                    <div class="form-group">
+						<div ng-if="!currentRule.rule.clusterMode">
+							<label class="col-sm-2 control-label">鍗曟満闃堝��</label>
+							<div class="col-sm-3">
+								<input type="number" class="form-control highlight-border" ng-model='currentRule.rule.count' placeholder='鍗曟満闃堝��' />
+							</div>
+							<label class="col-sm-3 control-label" title="缁熻绐楀彛鏃堕棿闀垮害锛屽崟浣嶄负 s">缁熻绐楀彛鏃堕暱</label>
+							<div class="input-group col-sm-3">
+								<input type="number" class="form-control highlight-border"
+									   ng-model='currentRule.rule.durationInSec' min="1"
+									   placeholder='璇峰~鍏ョ粺璁$獥鍙f椂闀匡紙鍗曚綅涓� 绉掞級' />
+								<span class="input-group-addon">绉�</span>
+							</div>
+						</div>
+						<div ng-if="currentRule.rule.clusterMode && currentRule.rule.clusterConfig.thresholdType == 0">
+							<label class="col-sm-2 control-label">鍧囨憡闃堝��</label>
+							<div class="col-sm-9">
+								<input type="number" class="form-control highlight-border" ng-model='currentRule.rule.count' placeholder='闆嗙兢鍧囨憡闃堝��' />
+							</div>
+						</div>
+						<div ng-if="currentRule.rule.clusterMode && currentRule.rule.clusterConfig.thresholdType == 1">
+							<label class="col-sm-2 control-label">闆嗙兢闃堝��</label>
+							<div class="col-sm-9">
+								<input type="number" class="form-control highlight-border" ng-model='currentRule.rule.count' placeholder='闆嗙兢鎬讳綋闃堝��' />
+							</div>
+						</div>
+                    </div>
+
+					<div class="form-group">
+						<label class="col-sm-2 control-label">鏄惁闆嗙兢</label>
+						<div class="col-sm-2">
+							<input type="checkbox" name="clusterMode" ng-model="currentRule.rule.clusterMode">
+						</div>
+						<div ng-if="currentRule.rule.clusterMode">
+							<label class="col-sm-3 control-label">闆嗙兢闃堝�兼ā寮�</label>
+							<div class="col-sm-4">
+								<div class="form-control highlight-border" align="center">
+									<input type="radio" name="clusterThresholdType" value="0" ng-model='currentRule.rule.clusterConfig.thresholdType' />&nbsp;鍗曟満鍧囨憡&nbsp;&nbsp;
+									<input type="radio" name="clusterThresholdType" value="1" ng-model='currentRule.rule.clusterConfig.thresholdType' />&nbsp;鎬讳綋闃堝��
+								</div>
+							</div>
+						</div>
+					</div>
+
+					<div class="form-group" ng-if="currentRule.rule.clusterMode">
+						<label class="col-sm-2 control-label">澶辫触閫�鍖�</label>
+						<div class="col-sm-8">
+							<div class="checkbox-inline">
+								<input type="checkbox" name="fallbackToLocalWhenFail"
+									   ng-model="currentRule.rule.clusterConfig.fallbackToLocalWhenFail">
+								<i class="glyphicon glyphicon-info-sign"></i>&nbsp;鑻ラ�夋嫨锛屽垯 Token Server 涓嶅彲鐢ㄦ椂灏嗛��鍖栧埌鍗曟満闄愭祦
+							</div>
+						</div>
+					</div>
+
+                    <!-- exclusion item part start -->
+					<div ng-if="!paramFlowRuleDialog.showAdvanceButton">
+						<hr />
+						<div class="form-group">
+							<div class="form-group" style="text-align: center">
+								<label class="control-label">鍙傛暟渚嬪椤�</label>
+							</div>
+
+							<div class="form-group">
+								<label class="col-sm-2 control-label">鍙傛暟绫诲瀷</label>
+								<div class="col-md-9">
+									<select ng-model="curExItem.classType" ng-options="classType for classType in paramItemClassTypeList" class="form-control" placeholder="璇烽�夋嫨鍙傛暟绫诲瀷">
+									</select>
+								</div>
+							</div>
+
+							<div class="form-group">
+								<label class="col-sm-2 control-label">鍙傛暟鍊�</label>
+								<div class="col-md-3">
+									<input ng-model="curExItem.object" type="text" class="form-control" placeholder="渚嬪椤瑰弬鏁板��">
+								</div>
+
+								<label class="col-sm-2 control-label">闄愭祦闃堝��</label>
+								<div class="col-md-3">
+									<input type="number" ng-model="curExItem.count" class="form-control" placeholder="闄愭祦闃堝��">
+								</div>
+
+								<div class="col-md-2">
+									<button type="button" class="btn btn-success"
+											ng-disabled="notValidParamItem(curExItem)"
+											ng-click="addParamItem()">
+										<span class="fa fa-plus">&nbsp;娣诲姞</span>
+									</button>
+								</div>
+							</div>
+
+							<div>
+								<div class="col-md-12">
+									<table class="table table-condensed table-hover">
+										<thead>
+										<th>鍙傛暟鍊�</th>
+										<th>鍙傛暟绫诲瀷</th>
+										<th>闄愭祦闃堝��</th>
+										<th>鎿嶄綔</th>
+										</thead>
+										<tbody>
+										<tr ng-repeat="paramItem in currentRule.rule.paramFlowItemList">
+											<td><input ng-model="paramItem.object" type="text" class="form-control" placeholder="渚嬪椤瑰弬鏁�"></td>
+											<td>
+												<p>{{paramItem.classType}}</p>
+											</td>
+											<td>
+												<input type="number" ng-model="paramItem.count" class="form-control" placeholder="闄愭祦闃堝��">
+											</td>
+											<td>
+												<button type="button" class="btn btn-danger"
+														ng-click="removeParamItem(paramItem.object, paramItem.classType)"><span
+														class="fa fa-trash-o">&nbsp;鍒犻櫎</span></button>
+											</td>
+										</tr>
+										</tbody>
+									</table>
+								</div>
+							</div>
+
+						</div>
+					</div>
+
+					<!-- exclusion item part end -->
+					<div class="form-group text-center" ng-if="paramFlowRuleDialog.supportAdvanced">
+						<a ng-click="onOpenAdvanceClick()" ng-if="paramFlowRuleDialog.showAdvanceButton" style="cursor: pointer;">楂樼骇閫夐」</a>
+						<a ng-click="onCloseAdvanceClick()" ng-if="!paramFlowRuleDialog.showAdvanceButton" style="cursor: pointer;">鍏抽棴楂樼骇閫夐」</a>
+					</div>
+				</form>
+			</div>
+			<div class="separator"></div>
+			<div clss="row" style="margin-top: 20px;">
+				<button class="btn btn-outline-danger" style="float:right; height: 30px;font-size: 12px;margin-left: 10px;" ng-click="closeThisDialog()">鍙栨秷</button>
+				<button class="btn btn-outline-success" style="float:right; height: 30px;font-size: 12px;margin-left: 10px;" ng-click="saveRule()">{{paramFlowRuleDialog.confirmBtnText}}</button>
+				<button ng-if="paramFlowRuleDialog.saveAndContinueBtnText" class="btn btn-default" style="float:right; height: 30px;font-size: 12px;"
+				 ng-click="saveRuleAndContinue()">{{paramFlowRuleDialog.saveAndContinueBtnText}}</button>
+			</div>
+		</div>
+	</div>
+</div>
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/system-rule-dialog.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/system-rule-dialog.html
new file mode 100644
index 0000000..3dd9cd9
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/system-rule-dialog.html
@@ -0,0 +1,58 @@
+<div>
+  <span class="brand" style="font-weight:bold;">{{systemRuleDialog.title}}</span>
+  <div class="card" style="margin-top: 20px;margin-bottom: 10px;">
+    <div class="panel-body">
+      <div class="row">
+        <form role="form" class="form-horizontal">
+
+          <div class="form-group">
+            <label class="col-sm-2 control-label">闃堝�肩被鍨�</label>
+            <div class="col-sm-9">
+              <div class="form-control" ng-if="systemRuleDialog.type == 'edit'" align="center">
+                <!--highestSystemLoad -->
+                <input type="radio" name="grade" value="0" checked ng-model='currentRule.grade' ng-disabled="systemRuleDialog.type == 'edit'" />&nbsp;LOAD&nbsp;&nbsp;
+                <!--avgRt -->
+                <input type="radio" name="grade" value="1" ng-model='currentRule.grade' ng-disabled="systemRuleDialog.type == 'edit'" />&nbsp;RT&nbsp;&nbsp;
+                <!--maxThread -->
+                <input type="radio" name="grade" value="2" ng-model='currentRule.grade' ng-disabled="systemRuleDialog.type == 'edit'" />&nbsp;绾跨▼鏁�&nbsp;&nbsp;
+                <!--qps -->
+                <input type="radio" name="grade" value="3" ng-model='currentRule.grade' ng-disabled="systemRuleDialog.type == 'edit'"/>&nbsp;鍏ュ彛 QPS&nbsp;&nbsp;
+                <!--highestCpuUsage -->
+                <input type="radio" name="grade" value="4" ng-model='currentRule.grade' ng-disabled="systemRuleDialog.type == 'edit'" />&nbsp;CPU 浣跨敤鐜�&nbsp;&nbsp;
+
+              </div>
+              <div class="form-control highlight-border" ng-if="systemRuleDialog.type == 'add'" align="center">
+                <!--highestSystemLoad -->
+                <input type="radio" name="grade" value="0" ng-model='currentRule.grade' ng-disabled="systemRuleDialog.type == 'edit'" />&nbsp;LOAD&nbsp;&nbsp;
+                <!--avgRt -->
+                <input type="radio" name="grade" value="1" ng-model='currentRule.grade' ng-disabled="systemRuleDialog.type == 'edit'" />&nbsp;RT&nbsp;&nbsp;
+                <!--maxThread -->
+                <input type="radio" name="grade" value="2" ng-model='currentRule.grade' ng-disabled="systemRuleDialog.type == 'edit'" />&nbsp;绾跨▼鏁�&nbsp;&nbsp;
+                <!--qps -->
+                <input type="radio" name="grade" value="3" ng-model='currentRule.grade' ng-disabled="systemRuleDialog.type == 'edit'"/>&nbsp;鍏ュ彛 QPS&nbsp;&nbsp;
+                <!--highestCpuUsage -->
+                <input type="radio" name="grade" value="4" checked ng-model='currentRule.grade' ng-disabled="systemRuleDialog.type == 'edit'" />&nbsp;CPU 浣跨敤鐜�&nbsp;&nbsp;
+
+              </div>
+            </div>
+          </div>
+          <div class="form-group">
+            <label class="col-sm-2 control-label">闃堝��</label>
+            <div class="col-sm-9">
+              <input type='number' min="0" class="form-control highlight-border" ng-model='currentRule.highestSystemLoad' placeholder="[0, ~)鐨勬鏁存暟" ng-if="currentRule.grade == 0"/>
+              <input type='number' min="0" class="form-control highlight-border" ng-model='currentRule.avgRt' placeholder="[0, ~)鐨勬鏁存暟" ng-if="currentRule.grade == 1"/>
+              <input type='number' min="0" class="form-control highlight-border" ng-model='currentRule.maxThread' placeholder="[0, ~)鐨勬鏁存暟" ng-if="currentRule.grade == 2"/>
+              <input type='number' min="0" class="form-control highlight-border" ng-model='currentRule.qps' placeholder="[0, ~)鐨勬鏁存暟" ng-if="currentRule.grade == 3"/>
+              <input type='number' min="0" class="form-control highlight-border" ng-model='currentRule.highestCpuUsage' placeholder="[0, 1]鐨勫皬鏁帮紝浠h〃鐧惧垎姣�" ng-if="currentRule.grade == 4"/>
+            </div>
+          </div>
+        </form>
+      </div>
+      <div class="separator"></div>
+      <div clss="row" style="margin-top: 20px;">
+        <button class="btn btn-outline-danger" style="float:right; height: 30px;font-size: 12px;margin-left: 10px;" ng-click="closeThisDialog()">鍙栨秷</button>
+        <button class="btn btn-outline-success" style="float:right; height: 30px;font-size: 12px;" ng-click="saveRule()">{{systemRuleDialog.confirmBtnText}}</button>
+      </div>
+    </div>
+  </div>
+</div>
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/flow_v1.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/flow_v1.html
new file mode 100644
index 0000000..22b79c6
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/flow_v1.html
@@ -0,0 +1,117 @@
+<div class="row" style="margin-left: 1px; margin-top:10px; height: 50px;">
+  <div class="col-md-6" style="margin-bottom: 10px;">
+    <span style="font-size: 30px;font-weight: bold;">{{app}}</span>
+  </div>
+  <div class="col-md-6">
+    <button class="btn btn-default-inverse" style="float: right; margin-right: 10px;" ng-disabled="!macInputModel" ng-click="addNewRule()">
+      <i class="fa fa-plus"></i>&nbsp;&nbsp;鏂板娴佹帶瑙勫垯</button>
+    <!--<a class="btn btn-outline-success" style="float: right; margin-right: 10px;" ui-sref="dashboard.flow({app: app})">-->
+      <!--鍥炲埌闆嗙兢椤甸潰</a>-->
+  </div>
+</div>
+
+<div class="separator"></div>
+
+<div class="container-fluid">
+  <div class="row" style="margin-top: 20px; margin-bottom: 20px;">
+    <div class="col-md-12">
+      <div class="card">
+        <div class="inputs-header">
+          <span class="brand" style="font-size: 13px;">娴佹帶瑙勫垯</span>
+          <!--<button class="btn btn-danger" style="float: right;margin-right: 10px;height: 30px;font-size: 12px;" ng-click="disableAll()">鍏ㄩ儴绂佺敤</button>-->
+          <button class="btn btn-primary" style="float: right; margin-right: 10px; height: 30px;font-size: 12px;" ng-click="getMachineRules()">鍒锋柊</button>
+          <input class="form-control witdh-200" placeholder="鍏抽敭瀛�" ng-model="searchKey">
+          <div class="control-group" style="float:right;margin-right: 10px;margin-bottom: -10px;">
+            <selectize id="gsInput" class="selectize-input-200" config="macsInputConfig" options="macsInputOptions" ng-model="macInputModel"
+              placeholder="鏈哄櫒"></selectize>
+          </div>
+        </div>
+
+        <!--.tools-header -->
+        <div class="card-body" style="padding: 0px 0px;">
+          <table class="table" style="border-left: none; border-right:none;margin-top: 10px;">
+            <thead>
+              <tr style="background: #F3F5F7;">
+                <td style="width: 40%">
+                  璧勬簮鍚�
+                </td>
+                <td style="width: 8%;">
+                  鏉ユ簮搴旂敤
+                </td>
+                <td style="width: 8%;">
+                  娴佹帶妯″紡
+                </td>
+                <td style="width: 8%;">
+                  闃堝�肩被鍨�
+                </td>
+                <td style="width: 6%;">
+                  闃堝��
+                </td>
+                <td style="width: 8%;">
+                  闃堝�兼ā寮�
+                </td>
+                <td style="width: 10%;">
+                  娴佹帶鏁堟灉
+                </td>
+                <td style="width: 12%;">
+                  鎿嶄綔
+                </td>
+              </tr>
+            </thead>
+            <tbody>
+              <tr dir-paginate="rule in rules | filter: searchKey | itemsPerPage: rulesPageConfig.pageSize " current-page="rulesPageConfig.currentPageIndex"
+                pagination-id="entriesPagination">
+                <td style="word-wrap:break-word;word-break:break-all;">{{rule.resource}}</td>
+                <td style="word-wrap:break-word;word-break:break-all;">{{rule.limitApp }}</td>
+                <td>
+                  <span ng-if="rule.strategy == 0">鐩存帴</span>
+                  <span ng-if="rule.strategy == 1">鍏宠仈</span>
+                  <span ng-if="rule.strategy == 2">閾捐矾</span>
+                </td>
+                <td>
+                  {{rule.grade==0 ? '绾跨▼鏁�' : 'QPS'}}
+                </td>
+                <td style="word-wrap:break-word;word-break:break-all;">
+                  {{rule.count}}
+                </td>
+                <td>
+                  <span>{{generateThresholdTypeShow(rule)}}</span>
+                </td>
+                <td>
+                  <span ng-if="rule.controlBehavior == 0">蹇�熷け璐�</span>
+                  <span ng-if="rule.controlBehavior == 1">Warm Up</span>
+                  <span ng-if="rule.controlBehavior == 2">鎺掗槦绛夊緟</span>
+                  <span ng-if="rule.controlBehavior == 3">棰勭儹鎺掗槦</span>
+                </td>
+                <td>
+                  <button class="btn btn-xs btn-default" type="button" ng-click="editRule(rule)" style="font-size: 12px; height:25px;">缂栬緫</button>
+                  <button class="btn btn-xs btn-default" type="button" ng-click="deleteRule(rule)" style="font-size: 12px; height:25px;">鍒犻櫎</button>
+                </td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+        <!-- .card-body -->
+        <div class="pagination-footer">
+          <dir-pagination-controls boundary-links="true" template-url="app/views/pagination.tpl.html" pagination-id="entriesPagination"
+            on-page-change="">
+          </dir-pagination-controls>
+          <div class="tools" style="">
+            <span>鍏� {{rulesPageConfig.totalCount}} 鏉¤褰�, </span>
+            <span>
+              姣忛〉
+              <input class="form-control" ng-model="rulesPageConfig.pageSize"> 鏉¤褰�
+            </span>
+            <!--<span>绗� {{rulesPageConfig.currentPageIndex}} / {{rulesPageConfig.totalPage}} 椤�</span>-->
+          </div>
+          <!-- .tools -->
+        </div>
+        <!-- pagination-footer -->
+      </div>
+      <!-- .card -->
+    </div>
+    <!-- .col-md-12 -->
+  </div>
+  <!-- -->
+</div>
+<!-- .container-fluid -->
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/flow_v2.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/flow_v2.html
new file mode 100644
index 0000000..7e0dcc8
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/flow_v2.html
@@ -0,0 +1,113 @@
+<div class="row" style="margin-left: 1px; margin-top:10px; height: 50px;">
+  <div class="col-md-6" style="margin-bottom: 10px;">
+    <span style="font-size: 30px;font-weight: bold;">{{app}}</span>
+  </div>
+  <div class="col-md-6">
+    <button class="btn btn-default-inverse" style="float: right; margin-right: 10px;" ng-click="addNewRule()">
+      <i class="fa fa-plus"></i>&nbsp;&nbsp;鏂板娴佹帶瑙勫垯
+    </button>
+    <a class="btn btn-default-inverse" style="float: right; margin-right: 10px;" ui-sref="dashboard.flowV1({app: app})">
+      鍥炲埌鍗曟満椤甸潰
+    </a>
+  </div>
+</div>
+
+<div class="separator"></div>
+
+<div class="container-fluid">
+  <div class="row" style="margin-top: 20px; margin-bottom: 20px;">
+    <div class="col-md-12">
+      <div class="card">
+        <div class="inputs-header">
+          <span class="brand" style="font-size: 13px;">娴佹帶瑙勫垯</span>
+          <input class="form-control witdh-200" placeholder="鍏抽敭瀛�" ng-model="searchKey">
+        </div>
+
+        <!--.tools-header -->
+        <div class="card-body" style="padding: 0px 0px;">
+          <table class="table" style="border-left: none; border-right:none;margin-top: 10px;">
+            <thead>
+              <tr style="background: #F3F5F7;">
+                <td style="width: 40%">
+                  璧勬簮鍚�
+                </td>
+                <td style="width: 10%;">
+                  鏉ユ簮搴旂敤
+                </td>
+                <td style="width: 8%;">
+                  娴佹帶妯″紡
+                </td>
+                <td style="width: 8%;">
+                  闃堝�肩被鍨�
+                </td>
+                <td style="width: 8%;">
+                  闃堝��
+                </td>
+                <td style="width: 8%;">
+                  闃堝�兼ā寮�
+                </td>
+                <td style="width: 8%;">
+                  娴佹帶鏁堟灉
+                </td>
+                <td style="width: 12%;">
+                  鎿嶄綔
+                </td>
+              </tr>
+            </thead>
+            <tbody>
+              <tr dir-paginate="rule in rules | filter: searchKey | itemsPerPage: rulesPageConfig.pageSize " current-page="rulesPageConfig.currentPageIndex"
+                pagination-id="entriesPagination">
+                <td style="word-wrap:break-word;word-break:break-all;">{{rule.resource}}</td>
+                <td style="word-wrap:break-word;word-break:break-all;">{{rule.limitApp }}</td>
+                <td>
+                  <span ng-if="rule.strategy == 0">鐩存帴</span>
+                  <span ng-if="rule.strategy == 1">鍏宠仈</span>
+                  <span ng-if="rule.strategy == 2">閾捐矾</span>
+                </td>
+                <td>
+                  {{rule.grade == 0 ? '绾跨▼鏁�' : 'QPS'}}
+                </td>
+                <td style="word-wrap:break-word;word-break:break-all;">
+                  {{rule.count}}
+                </td>
+                <td>
+                  <span>{{generateThresholdTypeShow(rule)}}</span>
+                </td>
+                <td>
+                  <span ng-if="rule.controlBehavior == 0">蹇�熷け璐�</span>
+                  <span ng-if="rule.controlBehavior == 1">Warm Up</span>
+                  <span ng-if="rule.controlBehavior == 2">鎺掗槦绛夊緟</span>
+                  <span ng-if="rule.controlBehavior == 3">棰勭儹鎺掗槦</span>
+                </td>
+                <td>
+                  <button class="btn btn-xs btn-default" type="button" ng-click="editRule(rule)" style="font-size: 12px; height:25px;">缂栬緫</button>
+                  <button class="btn btn-xs btn-default" type="button" ng-click="deleteRule(rule)" style="font-size: 12px; height:25px;">鍒犻櫎</button>
+                </td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+        <!-- .card-body -->
+        <div class="pagination-footer">
+          <dir-pagination-controls boundary-links="true" template-url="app/views/pagination.tpl.html" pagination-id="entriesPagination"
+            on-page-change="">
+          </dir-pagination-controls>
+          <div class="tools" style="">
+            <span>鍏� {{rulesPageConfig.totalCount}} 鏉¤褰�, </span>
+            <span>
+              姣忛〉
+              <input class="form-control" ng-model="rulesPageConfig.pageSize"> 鏉¤褰�
+            </span>
+            <!--<span>绗� {{rulesPageConfig.currentPageIndex}} / {{rulesPageConfig.totalPage}} 椤�</span>-->
+          </div>
+          <!-- .tools -->
+        </div>
+        <!-- pagination-footer -->
+      </div>
+      <!-- .card -->
+    </div>
+    <!-- .col-md-12 -->
+  </div>
+  <!-- -->
+</div>
+<!-- .container-fluid -->
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/gateway/api.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/gateway/api.html
new file mode 100644
index 0000000..b4e101c
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/gateway/api.html
@@ -0,0 +1,87 @@
+<div class="row" style="margin-left: 1px; margin-top:10px; height: 50px;">
+  <div class="col-md-6" style="margin-bottom: 10px;">
+    <span style="font-size: 30px;font-weight: bold;">{{app}}</span>
+  </div>
+  <div class="col-md-6">
+    <button class="btn btn-outline-primary" style="float: right; margin-right: 10px;" ng-disabled="!macInputModel" ng-click="addNewApi()">
+      <i class="fa fa-plus"></i>&nbsp;&nbsp;鏂板 API 鍒嗙粍</button>
+  </div>
+</div>
+
+<div class="separator"></div>
+
+<div class="container-fluid">
+  <div class="row" style="margin-top: 20px; margin-bottom: 20px;">
+    <div class="col-md-12">
+      <div class="card">
+        <div class="inputs-header">
+          <span class="brand" style="font-size: 13px;">API 鍒嗙粍绠$悊</span>
+          <button class="btn btn-primary" style="float: right; margin-right: 10px; height: 30px;font-size: 12px;" ng-click="getApis()">鍒锋柊</button>
+          <input class="form-control witdh-200" placeholder="鍏抽敭瀛�" ng-model="searchKey">
+          <div class="control-group" style="float:right;margin-right: 10px;margin-bottom: -10px;">
+            <selectize id="gsInput" class="selectize-input-200" config="macsInputConfig" options="macsInputOptions" ng-model="macInputModel"
+              placeholder="鏈哄櫒"></selectize>
+          </div>
+        </div>
+
+        <!--.tools-header -->
+        <div class="card-body" style="padding: 0px 0px;">
+          <table class="table" style="border-left: none; border-right:none;margin-top: 10px;">
+            <thead>
+              <tr style="background: #F3F5F7;">
+                <td>
+                  API 鍚嶇О
+                </td>
+                <td>
+                  鍖归厤妯″紡
+                </td>
+                <td>
+                  鍖归厤涓�
+                </td>
+                <td>
+                  鎿嶄綔
+                </td>
+              </tr>
+            </thead>
+            <tbody>
+              <tr dir-paginate="api in apis | filter: searchKey | itemsPerPage: apisPageConfig.pageSize" current-page="apisPageConfig.currentPageIndex"
+                  pagination-id="entriesPagination">
+                <td ng-if="api.firstFlag==0" rowspan="{{api.itemSize}}" style="vertical-align: middle;">{{api.apiName}}</td>
+                <td>
+                  <span ng-if="api.matchStrategy == 0">绮剧‘</span>
+                  <span ng-if="api.matchStrategy == 1">鍓嶇紑</span>
+                  <span ng-if="api.matchStrategy == 2">姝e垯</span>
+                </td>
+                <td>{{api.pattern}}</td>
+                <td ng-if="api.firstFlag==0" rowspan="{{api.itemSize}}" style="vertical-align: middle;">
+                  <button class="btn btn-xs btn-outline-primary" type="button" ng-click="editApi(api)" style="font-size: 12px; height:25px;">缂栬緫</button>
+                  <button class="btn btn-xs btn-outline-danger" type="button" ng-click="deleteApi(api)" style="font-size: 12px; height:25px;">鍒犻櫎</button>
+                </td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+        <!-- .card-body -->
+        <div class="pagination-footer">
+          <dir-pagination-controls boundary-links="true" template-url="app/views/pagination.tpl.html" pagination-id="entriesPagination"
+            on-page-change="">
+          </dir-pagination-controls>
+          <div class="tools" style="">
+            <span>鍏� {{apisPageConfig.totalCount}} 鏉¤褰�, </span>
+            <span>
+              姣忛〉
+              <input class="form-control" ng-model="apisPageConfig.pageSize"> 鏉¤褰�
+            </span>
+            <!--<span>绗� {{apisPageConfig.currentPageIndex}} / {{apisPageConfig.totalPage}} 椤�</span>-->
+          </div>
+          <!-- .tools -->
+        </div>
+        <!-- pagination-footer -->
+      </div>
+      <!-- .card -->
+    </div>
+    <!-- .col-md-12 -->
+  </div>
+  <!-- -->
+</div>
+<!-- .container-fluid -->
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/gateway/flow.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/gateway/flow.html
new file mode 100644
index 0000000..62708c4
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/gateway/flow.html
@@ -0,0 +1,94 @@
+<div class="row" style="margin-left: 1px; margin-top:10px; height: 50px;">
+  <div class="col-md-6" style="margin-bottom: 10px;">
+    <span style="font-size: 30px;font-weight: bold;">{{app}}</span>
+  </div>
+  <div class="col-md-6">
+    <button class="btn btn-outline-primary" style="float: right; margin-right: 10px;" ng-disabled="!macInputModel" ng-click="addNewRule()">
+      <i class="fa fa-plus"></i>&nbsp;&nbsp;鏂板缃戝叧娴佹帶瑙勫垯</button>
+  </div>
+</div>
+
+<div class="separator"></div>
+
+<div class="container-fluid">
+  <div class="row" style="margin-top: 20px; margin-bottom: 20px;">
+    <div class="col-md-12">
+      <div class="card">
+        <div class="inputs-header">
+          <span class="brand" style="font-size: 13px;">缃戝叧娴佹帶瑙勫垯</span>
+          <button class="btn btn-primary" style="float: right; margin-right: 10px; height: 30px;font-size: 12px;" ng-click="getMachineRules()">鍒锋柊</button>
+          <input class="form-control witdh-200" placeholder="鍏抽敭瀛�" ng-model="searchKey">
+          <div class="control-group" style="float:right;margin-right: 10px;margin-bottom: -10px;">
+            <selectize id="gsInput" class="selectize-input-200" config="macsInputConfig" options="macsInputOptions" ng-model="macInputModel"
+              placeholder="鏈哄櫒"></selectize>
+          </div>
+        </div>
+
+        <!--.tools-header -->
+        <div class="card-body" style="padding: 0px 0px;">
+          <table class="table" style="border-left: none; border-right:none;margin-top: 10px;">
+            <thead>
+              <tr style="background: #F3F5F7;">
+                <td>
+                  API 鍚嶇О
+                </td>
+                <td>
+                  API 绫诲瀷
+                </td>
+                <td>
+                  闃堝�肩被鍨�
+                </td>
+                <td>
+                  鍗曟満闃堝��
+                </td>
+                <td>
+                  鎿嶄綔
+                </td>
+              </tr>
+            </thead>
+
+            <tbody>
+              <tr dir-paginate="rule in rules | filter: searchKey | itemsPerPage: rulesPageConfig.pageSize " current-page="rulesPageConfig.currentPageIndex"
+                  pagination-id="entriesPagination">
+                <td>{{rule.resource}}</td>
+                <td>
+                  <span ng-if="rule.resourceMode == 0">Route ID</span>
+                  <span ng-if="rule.resourceMode == 1">API 鍒嗙粍</span>
+                </td>
+                <td>
+                  <span ng-if="rule.grade == 1">QPS</span>
+                  <span ng-if="rule.grade == 0">绾跨▼鏁�</span>
+                </td>
+                <td>{{rule.count}}</td>
+                <td>
+                  <button class="btn btn-xs btn-outline-primary" type="button" ng-click="editRule(rule)" style="font-size: 12px; height:25px;">缂栬緫</button>
+                  <button class="btn btn-xs btn-outline-danger" type="button" ng-click="deleteRule(rule)" style="font-size: 12px; height:25px;">鍒犻櫎</button>
+                </td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+        <!-- .card-body -->
+        <div class="pagination-footer">
+          <dir-pagination-controls boundary-links="true" template-url="app/views/pagination.tpl.html" pagination-id="entriesPagination"
+            on-page-change="">
+          </dir-pagination-controls>
+          <div class="tools" style="">
+            <span>鍏� {{rulesPageConfig.totalCount}} 鏉¤褰�, </span>
+            <span>
+              姣忛〉
+              <input class="form-control" ng-model="rulesPageConfig.pageSize"> 鏉¤褰�
+            </span>
+            <!--<span>绗� {{apisPageConfig.currentPageIndex}} / {{apisPageConfig.totalPage}} 椤�</span>-->
+          </div>
+          <!-- .tools -->
+        </div>
+        <!-- pagination-footer -->
+      </div>
+      <!-- .card -->
+    </div>
+    <!-- .col-md-12 -->
+  </div>
+  <!-- -->
+</div>
+<!-- .container-fluid -->
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/gateway/identity.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/gateway/identity.html
new file mode 100644
index 0000000..0736adc
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/gateway/identity.html
@@ -0,0 +1,98 @@
+<div class="row" style="margin-left: 1px; margin-top:10px; height: 50px;">
+  <div class="col-md-6" style="margin-bottom: 10px;">
+    <span style="font-size: 30px;font-weight: bold;">{{app}}</span>
+  </div>
+</div>
+
+<div class="separator"></div>
+
+<div class="container-fluid">
+  <div class="row" style="margin-top: 20px; margin-bottom: 20px;">
+    <div class="col-md-12">
+      <div class="card">
+        <div class="inputs-header">
+          <span class="brand" style="font-size: 13px;">璇锋眰閾捐矾</span>
+          <button class="btn btn-primary" style="float: right; margin-right: 10px; height: 30px;font-size: 12px;" ng-click="queryIdentities()">鍒锋柊</button>
+          <input class="form-control witdh-200" placeholder="鍏抽敭瀛�" ng-model="searchKey" ng-change="searchChange(searchKey)">
+          <div class="control-group" style="float:right;margin-right: 10px;margin-bottom: -10px;">
+            <selectize id="gsInput" class="selectize-input-200" config="macsInputConfig" options="macsInputOptions" ng-model="macInputModel"
+              placeholder="鏈哄櫒"></selectize>
+          </div>
+        </div>
+
+        <!--.tools-header -->
+        <div class="card-body" style="padding: 0px 0px;">
+          <table rz-table id="identities" class="table" style="border-left: none; border-right:none;margin-top: 10px;">
+            <thead>
+              <thead>
+                <tr style="background: #F3F5F7;">
+                  <td style="width: 34%;">
+                    API 鍚嶇О
+                  </td>
+                  <td style="width: 8%;">
+                    API 绫诲瀷
+                  </td>
+                  <td style="width: 7%;">閫氳繃 QPS</td>
+                  <td style="width: 7%;">鎷掔粷 QPS</td>
+                  <td style="width: 5%;">绾跨▼鏁�</td>
+                  <td style="width: 6%;">骞冲潎 RT</td>
+                  <td style="width: 6%;">鍒嗛挓閫氳繃</td>
+                  <td style="width: 6%;">鍒嗛挓鎷掔粷</td>
+                  <td style="width: 20%">鎿嶄綔</td>
+                </tr>
+                <tr></tr>
+              </thead>
+              <tbody>
+                <tr dir-paginate="resource in identities | itemsPerPage: pageSize" current-page="currentPage" pagination-id="entriesPagination"
+                  data-tt-id="{{resource.ttId}}" data-tt-parent-id="{{resource.parentTtId}}" data-tt-visible="{{resource.visible}}">
+                  <td style="white-space: normal; text-align: left;">
+                    <span style="word-wrap:break-word;word-break:break-all;">{{resource.resource}}</span>
+                  </td>
+                  <td>
+                    <span ng-if="apiNames.indexOf(resource.resource) == -1">Route ID</span>
+                    <span ng-if="apiNames.indexOf(resource.resource) != -1">鑷畾涔� API</span>
+                  </td>
+                  <td>{{resource.passQps}}</td>
+                  <td>{{resource.blockQps}}</td>
+                  <td>{{resource.threadNum}}</td>
+                  <td>{{resource.averageRt}}</td>
+                  <td>{{resource.oneMinutePass}}</td>
+                  <td ng-if="$index==pageSize-1 || (currentPage>=identities.length/pageSize && $index==identities.length%pageSize-1)" ng-init="initTreeTable()">
+                    {{resource.oneMinuteBlock}}</td>
+                  <td ng-if="!($index==pageSize-1 || (currentPage>=identities.length/pageSize && $index==identities.length%pageSize-1))"> {{resource.oneMinuteBlock}}</td>
+                  <td>
+                    <div class="control-group">
+                      <button class="btn btn-xs btn-default" type="button" ng-click="addNewGatewayFlowRule(resource.resource)" style="font-size: 12px; height:25px;">
+                        <i class="fa fa-plus"></i>&nbsp;娴佹帶</button>
+                      <button class="btn btn-xs btn-default" type="button" ng-click="addNewDegradeRule(resource.resource)" style="font-size: 12px; height:25px;">
+                        <i class="fa fa-plus"></i>&nbsp;闄嶇骇</button>
+                    </div>
+                  </td>
+                </tr>
+              </tbody>
+          </table>
+        </div>
+        <!-- .card-body -->
+        <div class="pagination-footer">
+          <dir-pagination-controls boundary-links="true" template-url="app/views/pagination.tpl.html" pagination-id="entriesPagination"
+            on-page-change="">
+          </dir-pagination-controls>
+          <div class="tools">
+            <span>鍏� {{totalCount}} 鏉¤褰�, </span>
+            <span>
+              姣忛〉
+              <input class="form-control" ng-model="pageSize"> 鏉¤褰�
+            </span>
+            <!--<span>绗� {{currentPage}} / {{totalPage}} 椤�</span>-->
+          </div>
+          <!-- .tools -->
+        </div>
+        <!-- pagination-footer -->
+      </div>
+      <!-- .card -->
+    </div>
+    <!-- .col-md-12 -->
+  </div>
+  <!-- -->
+</div>
+<!-- .container-fluid -->
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/identity.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/identity.html
new file mode 100644
index 0000000..80e832d
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/identity.html
@@ -0,0 +1,110 @@
+<div class="row" style="margin-left: 1px; margin-top:10px; height: 50px;">
+  <div class="col-md-6" style="margin-bottom: 10px;">
+    <span style="font-size: 30px;font-weight: bold;">{{app}}</span>
+  </div>
+  <div class="btn-group" style="float:right; margin-right: 30px;" ng-show="!isTreeView" ng-click="treeView()">
+    <button class="btn btn-default-inverse" style="height: 30px;font-size: 12px;">鏍戠姸瑙嗗浘</button>
+    <button class="btn btn-main" style="height: 30px;font-size: 12px;">鍒楄〃瑙嗗浘</button>
+  </div>
+  <div class="btn-group" style="float:right; margin-right: 30px;" ng-show="isTreeView" ng-click="listView()">
+    <button class="btn btn-main" style="height: 30px;font-size: 12px;">鏍戠姸瑙嗗浘</button>
+    <button class="btn btn-default-inverse" style="height: 30px;font-size: 12px;">鍒楄〃瑙嗗浘</button>
+  </div>
+</div>
+
+<div class="separator"></div>
+
+<div class="container-fluid">
+  <div class="row" style="margin-top: 20px; margin-bottom: 20px;">
+    <div class="col-md-12">
+      <div class="card">
+        <div class="inputs-header">
+          <span class="brand" style="font-size: 13px;">绨囩偣閾捐矾</span>
+          <button class="btn btn-primary" style="float: right; margin-right: 10px; height: 30px;font-size: 12px;" ng-click="queryIdentities()">鍒锋柊</button>
+          <!-- <button class="btn btn-danger" style="float: right;margin-right: 10px;height: 30px;font-size: 12px;" ng-click="expandAll()"
+            ng-if="!isExpand && isTreeView">灞曞紑</button>
+          <button class="btn btn-danger" style="float: right;margin-right: 10px;height: 30px;font-size: 12px;" ng-click="collapseAll()"
+            ng-if="isExpand && isTreeView">鎶樺彔</button> -->
+          <input class="form-control witdh-200" placeholder="鍏抽敭瀛�" ng-model="searchKey" ng-change="searchChange(searchKey)">
+          <div class="control-group" style="float:right;margin-right: 10px;margin-bottom: -10px;">
+            <selectize id="gsInput" class="selectize-input-200" config="macsInputConfig" options="macsInputOptions" ng-model="macInputModel"
+              placeholder="鏈哄櫒"></selectize>
+          </div>
+        </div>
+
+        <!--.tools-header -->
+        <div class="card-body" style="padding: 0px 0px;">
+          <table rz-table id="identities" class="table" style="border-left: none; border-right:none;margin-top: 10px;">
+            <thead>
+              <thead>
+                <tr style="background: #F3F5F7;">
+                  <td style="width: 40%;">
+                    璧勬簮鍚�
+                  </td>
+                  <td style="width: 7%;">閫氳繃QPS</td>
+                  <td style="width: 7%;">鎷掔粷QPS</td>
+                  <td style="width: 5%;">骞跺彂鏁�</td>
+                  <td style="width: 6%;">骞冲潎RT</td>
+                  <td style="width: 6%;">鍒嗛挓閫氳繃</td>
+                  <td style="width: 6%;">鍒嗛挓鎷掔粷</td>
+                  <td style="width: 23%">鎿嶄綔</td>
+                </tr>
+                <tr></tr>
+              </thead>
+              <tbody>
+                <tr dir-paginate="resource in identities | itemsPerPage: pageSize" current-page="currentPage" pagination-id="entriesPagination"
+                  data-tt-id="{{resource.ttId}}" data-tt-parent-id="{{resource.parentTtId}}" data-tt-visible="{{resource.visible}}">
+                  <td style="white-space: normal; text-align: left;">
+                    <!--<a ng-click="copyIdentity(resource.resource)"-->
+                    <!--title="{{resource.resource}} 鍗曞嚮澶嶅埗鍒板壀鍒囨澘">-->
+                    <span style="word-wrap:break-word;word-break:break-all;">{{resource.resource}}</span>
+                    <!--</a>-->
+                  </td>
+                  <td>{{resource.passQps}}</td>
+                  <td>{{resource.blockQps}}</td>
+                  <td>{{resource.threadNum}}</td>
+                  <td>{{resource.averageRt}}</td>
+                  <td>{{resource.oneMinutePass}}</td>
+                  <td ng-if="$index==pageSize-1 || (currentPage>=identities.length/pageSize && $index==identities.length%pageSize-1)" ng-init="initTreeTable()">
+                    {{resource.oneMinuteBlock}}</td>
+                  <td ng-if="!($index==pageSize-1 || (currentPage>=identities.length/pageSize && $index==identities.length%pageSize-1))"> {{resource.oneMinuteBlock}}</td>
+                  <td>
+                    <div class="control-group">
+                      <button class="btn btn-xs btn-default" type="button" ng-click="addNewFlowRule(resource.resource)" style="font-size: 12px; height:25px;">
+                        <i class="fa fa-plus"></i>&nbsp;娴佹帶</button>
+                      <button class="btn btn-xs btn-default" type="button" ng-click="addNewDegradeRule(resource.resource)" style="font-size: 12px; height:25px;">
+                        <i class="fa fa-plus"></i>&nbsp;鐔旀柇</button>
+                      <button class="btn btn-xs btn-default" type="button" ng-click="addNewParamFlowRule(resource.resource)" style="font-size: 12px; height:25px;">
+                        <i class="fa fa-plus"></i>&nbsp;鐑偣</button>
+                      <button class="btn btn-xs btn-default" type="button" ng-click="addNewAuthorityRule(resource.resource)" style="font-size: 12px; height:25px;">
+                        <i class="fa fa-plus"></i>&nbsp;鎺堟潈</button>
+                    </div>
+                  </td>
+                </tr>
+              </tbody>
+          </table>
+        </div>
+        <!-- .card-body -->
+        <div class="pagination-footer">
+          <dir-pagination-controls boundary-links="true" template-url="app/views/pagination.tpl.html" pagination-id="entriesPagination"
+            on-page-change="">
+          </dir-pagination-controls>
+          <div class="tools">
+            <span>鍏� {{totalCount}} 鏉¤褰�, </span>
+            <span>
+              姣忛〉
+              <input class="form-control" ng-model="pageSize"> 鏉¤褰�
+            </span>
+            <!--<span>绗� {{currentPage}} / {{totalPage}} 椤�</span>-->
+          </div>
+          <!-- .tools -->
+        </div>
+        <!-- pagination-footer -->
+      </div>
+      <!-- .card -->
+    </div>
+    <!-- .col-md-12 -->
+  </div>
+  <!-- -->
+</div>
+<!-- .container-fluid -->
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/login.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/login.html
new file mode 100644
index 0000000..6e93f10
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/login.html
@@ -0,0 +1,34 @@
+<div class="container">
+    <div class="row" style="margin: 200px auto 15px auto; text-align: center;">
+        <img src="./assets/img/sentinel-logo.png" alt="Sentinel Logo"
+             style="max-height: 25%; max-width: 25%;">
+        <!-- <h1 id='login_title'>Sentinel 鎺у埗鍙�</h1> -->
+    </div>
+    <div class="row">
+        <div class="col-md-4" >
+        </div>
+        <div class="col-md-4">
+            <form class="form-horizontal">
+                <div class="form-group">
+                    <label class="col-md-2 control-label">鐢ㄦ埛</label>
+                    <div class="col-md-9">
+                        <input class="form-control" type="text" ng-model="username" autofocus="autofocus" required/>
+                    </div>
+                </div>
+
+                <div class="form-group">
+                    <label class="col-md-2 control-label">瀵嗙爜</label>
+                    <div class="col-md-9">
+                        <input class="form-control" type="password" ng-model="password" />
+                    </div>
+                </div>
+                <div class="row text-center" style="margin-top: 20px;">
+                    <button class="btn btn-outline-success" style="height: 30px;font-size: 12px;"
+                            ng-click="login()">鐧诲綍</button>
+                    <button class="btn btn-outline-primary" style="height: 30px;font-size: 12px;margin-left: 10px;"
+                            type="reset">娓呯┖</button>
+                </div>
+            </form>
+        </div>
+    </div>
+</div>
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/machine.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/machine.html
new file mode 100644
index 0000000..6cfcff9
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/machine.html
@@ -0,0 +1,76 @@
+<div class="row" style="margin-left: 1px; margin-top:10px; height: 50px;">
+  <div class="col-md-6" style="margin-bottom: 10px;">
+    <span style="font-size: 30px;font-weight: bold;">{{app}}</span>
+  </div>
+</div>
+
+<!--<div>-->
+<!--<span>瀹炰緥鎬绘暟 {{machines.length}}, 鍋ュ悍 {{healthyCount}}, 澶辫仈 {{machines.length-healthyCount}}</span>-->
+<!--</div>-->
+
+<div class="separator"></div>
+<div class="container-fluid">
+  <div class="row" style="margin-top: 20px; margin-bottom: 20px;">
+    <div class="col-md-12">
+      <div class="card">
+        <div class="inputs-header">
+          <span class="brand" style="font-size: 13px;">鏈哄櫒鍒楄〃</span>
+          <span>瀹炰緥鎬绘暟 {{machines.length}}, 鍋ュ悍 {{healthyCount}}, 澶辫仈 {{machines.length - healthyCount}}.</span>
+          <input class="form-control width-300" placeholder="鍏抽敭瀛�" ng-model="searchKey">
+        </div>
+
+        <!--.tools-header -->
+        <div class="card-body" style="padding: 0px 0px;">
+          <table class="table" style="border-left: none; border-right:none;margin-top: 10px;">
+            <thead>
+              <tr style="background: #F3F5F7;">
+                <td>鏈哄櫒鍚�</td>
+                <td>IP 鍦板潃</td>
+                <td>绔彛鍙�</td>
+                <td>Sentinel 瀹㈡埛绔増鏈�</td>
+                <td>鍋ュ悍鐘舵��</td>
+                <td>蹇冭烦鏃堕棿</td>
+                <td>鎿嶄綔</td>
+              </tr>
+            </thead>
+            <tbody>
+              <tr dir-paginate="entry in machines | filter : searchKey | itemsPerPage: machinesPageConfig.pageSize " current-page="machinesPageConfig.currentPageIndex"
+                pagination-id="entriesPagination">
+                <td style="word-wrap:break-word;word-break:break-all;">{{entry.hostname}}</td>
+                <td style="word-wrap:break-word;word-break:break-all;">{{entry.ip}}</td>
+                <td> {{entry.port}} </td>
+                <td> {{entry.version}} </td>
+                <td ng-if="entry.healthy">鍋ュ悍</td>
+                <td ng-if="!entry.healthy" style="color: red">澶辫仈</td>
+                <td>{{entry.lastHeartbeat | date: 'yyyy/MM/dd HH:mm:ss'}}</td>
+                <td>
+                    <button ng-if="!entry.healthy" class="btn btn-xs btn-outline-danger" style="height: 25px; font-size: 12px;" ng-click="removeMachine(entry.ip, entry.port)">绉婚櫎</button>
+                </td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+        <!-- .card-body -->
+        <div class="pagination-footer">
+          <dir-pagination-controls boundary-links="true" template-url="app/views/pagination.tpl.html" pagination-id="entriesPagination"
+            on-page-change="">
+          </dir-pagination-controls>
+          <div class="tools" style="">
+            <span>鍏� {{machinesPageConfig.totalCount}} 鏉¤褰�, </span>
+            <span>
+              姣忛〉
+              <input class="form-control" ng-model="machinesPageConfig.pageSize"> 鏉¤褰�,
+            </span>
+            <span>绗� {{machinesPageConfig.currentPageIndex}} / {{machinesPageConfig.totalPage}} 椤�</span>
+          </div>
+          <!-- .tools -->
+        </div>
+        <!-- pagination-footer -->
+      </div>
+      <!-- .card -->
+    </div>
+    <!-- .col-md-12 -->
+  </div>
+  <!-- -->
+</div>
+<!-- .container-fluid -->
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/metric.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/metric.html
new file mode 100644
index 0000000..4f0fc7f
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/metric.html
@@ -0,0 +1,117 @@
+<div class="row" style="margin-left: 1px; margin-top:10px; height: 50px;">
+  <div class="col-md-6" style="margin-bottom: 10px;">
+    <span style="font-size: 30px;font-weight: bold;">{{app}}</span>
+  </div>
+</div>
+
+<div class="separator"></div>
+<div class="container-fluid">
+  <div class="row" style="margin-top: 20px; margin-bottom: 20px;">
+    <div class="col-md-12">
+      <div class="card">
+        <div class="inputs-header">
+          <span class="brand" style="font-size: 13px;">
+            <i class="fa fa-sort-amount-asc" aria-hidden="true" ng-show="!isDescOrder"></i>
+            <i class="fa fa-sort-amount-desc" aria-hidden="true" ng-show="isDescOrder"></i>
+            {{metricTypeDesc}}&nbsp;瀹炴椂鐩戞帶
+          </span>
+          <button class="btn btn-outline-primary" style="float: right;margin-right: 10px;height: 30px;font-size: 12px;" ng-click="setDescOrder()"
+            ng-if="!isDescOrder">闄嶅簭</button>
+          <button class="btn btn-outline-primary" style="float: right;margin-right: 10px;height: 30px;font-size: 12px;" ng-click="setAscOrder()"
+            ng-if="isDescOrder">鍗囧簭</button>
+
+          <input class="form-control witdh-200" placeholder="鍏抽敭瀛�" ng-model="serviceQuery" ng-change="searchService()" style="margin-right: 20px;">
+        </div>
+        <!--.tools-header -->
+        <!--<div id="g2container"></div>-->
+        <div class="card-body">
+          <div class="row" style="margin-left: 3px;margin-right: 3px;">
+            <div class="card-body" style="padding: 0px 0px;">
+              <div class="col-md-12" ng-repeat="metric in metrics" style="padding-left: 10px;padding-right: 10px;">
+
+                <span ng-if="$index == metrics.length-1" ng-init="initAllChart()"></span>
+                <div class="card" style="margin-bottom:20px;" ng-if="$index < metrics.length-1">
+                  <div class="tools-header" style="height: 45px;">
+                    <span class="brand" style="font-weight:normal;;word-break:break-all;word-wrap:break-word;">&nbsp{{metric.resource}}</span>
+                    <a ng-href="">
+                      <i class="fa fa-align-justify"></i>
+                    </a>
+                  </div>
+                  <!-- .tools-header -->
+
+                  <div class="card-body">
+                    <div class="row">
+                      <div class="col-md-6">
+                        <!--<div ng-if="$index != metrics.length-1" id="chart{{$index}}"></div>-->
+                        <!--<div ng-if="$index == metrics.length-1" id="chart{{$index}}" ng-init="initAllChart()"></div>-->
+                        <div id="chart{{$index}}"></div>
+                      </div>
+                      <div class="col-md-6">
+                        <table class="table table-hover table-striped table-bordered">
+                          <thead>
+                            <tr style="font-size: 13px;text-align:center;font-weight: bold;">
+                              <td style="word-wrap:break-word;word-break:break-all;">鏃堕棿</td>
+                              <td style="word-wrap:break-word;word-break:break-all;" title="閫氳繃 QPS (pass qps)">閫氳繃 QPS</td>
+                              <td style="word-wrap:break-word;word-break:break-all;" title="鎷掔粷 QPS (blocked qps)">鎷掔粷QPS</td>
+                              <td style="word-wrap:break-word;word-break:break-all;" title="RT: 骞冲潎鍝嶅簲鏃堕棿锛堟绉掞級">鍝嶅簲鏃堕棿锛坢s锛�</td>
+                            </tr>
+                          </thead>
+                          <!-- thead -->
+                          <tbody>
+                            <tr style="font-size: 12px;text-align:center;" ng-repeat="tableObj in metric.shortData">
+                              <td style="word-wrap:break-word;word-break:break-all; ">{{tableObj.timestamp | date: 'HH:mm:ss'}}</td>
+                              <td style="word-wrap:break-word;word-break:break-all; ">{{tableObj.passQps | number : 1}}</td>
+                              <td style="word-wrap:break-word;word-break:break-all; ">{{tableObj.blockQps | number : 1}}</td>
+                              <td style="word-wrap:break-word;word-break:break-all;">{{tableObj.rt | number : 1}}</td>
+                            </tr>
+                            <tr style="font-size: 12px;text-align:center;" ng-repeat="_tr in [] | range : (6 - metric.shortData.length)">
+                              <td ng-repeat="_td in [] | range : 4">-</td>
+                            </tr>
+                          </tbody>
+                          <!-- tbody -->
+                        </table>
+                      </div>
+                    </div>
+                  </div>
+                  <!-- .card-body -->
+                </div>
+                <!-- .card -->
+              </div>
+              <!-- .col-md-6 -->
+
+            </div>
+            <!-- .card-body -->
+          </div>
+          <!-- .row -->
+        </div>
+
+        <div style="display:none;">
+          <li dir-paginate="empty in emptyObjs| itemsPerPage : servicePageConfig.pageSize" current-page="servicePageConfig.currentPageIndex"
+            pagination-id="servicesPagination"></li>
+        </div>
+
+        <div class="pagination-footer" style="margin-top:5px;">
+          <dir-pagination-controls boundary-links="true" template-url="app/views/pagination.tpl.html" pagination-id="servicesPagination"
+            on-page-change="pageChanged(newPageNumber)">
+          </dir-pagination-controls>
+          <div class="tools" style="">
+            <span>鍏� {{emptyObjs.length}} 鏉¤褰�, </span>
+            <span>
+              姣忛〉 {{servicePageConfig.pageSize}} 鏉¤褰�
+              <!--姣忛〉-->
+              <!--<input class="form-control" ng-model="servicePageConfig.pageSize" ng-change="pageSizeChanged()">-->
+              <!--鏉¤褰�,-->
+            </span>
+            <span>绗� {{servicePageConfig.currentPageIndex}} / {{servicePageConfig.totalPage}} 椤�</span>
+          </div>
+          <!-- .tools -->
+        </div>
+        <!-- pagination-footer -->
+        <div class="row" style="margin-bottom:20px"></div>
+      </div>
+      <!-- .card -->
+    </div>
+    <!-- .col-md-12 -->
+  </div>
+  <!-- -->
+</div>
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/pagination.tpl.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/pagination.tpl.html
new file mode 100644
index 0000000..6ebbee2
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/pagination.tpl.html
@@ -0,0 +1,18 @@
+<div class="pagination" ng-if="1 < pages.length || !autoHide">
+  <a href="" class="btn btn-default btn-xs" ng-if="boundaryLinks" ng-class="{ disabled : pagination.current == 1 }" ng-click="setCurrent(1)">
+    <i class="fa fa-angle-double-left"></i>
+  </a>
+  <a href="" class="btn btn-default btn-xs" ng-if="directionLinks" ng-class="{ disabled : pagination.current == 1 }" ng-click="setCurrent(pagination.current - 1)">
+    <i class="fa fa-angle-left"></i>
+  </a>
+  <a href="" class="btn btn-default btn-xs" ng-repeat="pageNumber in pages track by tracker(pageNumber, $index)" ng-class="{ active : pagination.current == pageNumber, disabled : pageNumber == '...' }"
+    ng-click="setCurrent(pageNumber)">{{ pageNumber }}</a>
+  <a href="" class="btn btn-default btn-xs" ng-if="directionLinks" ng-class="{ disabled : pagination.current == pagination.last }"
+    ng-click="setCurrent(pagination.current + 1)">
+    <i class="fa fa-angle-right"></i>
+  </a>
+  <a href="" class="btn btn-default btn-xs" ng-if="boundaryLinks" ng-class="{ disabled : pagination.current == pagination.last }"
+    ng-click="setCurrent(pagination.last)">
+    <i class="fa fa-angle-double-right"></i>
+  </a>
+</div>
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/param_flow.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/param_flow.html
new file mode 100644
index 0000000..c94219b
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/param_flow.html
@@ -0,0 +1,118 @@
+<div class="row" style="margin-left: 1px; margin-top:10px; height: 50px;">
+    <div class="col-md-6" style="margin-bottom: 10px;">
+      <span style="font-size: 30px;font-weight: bold;">{{app}}</span>
+    </div>
+    <div class="col-md-6" ng-if="!loadError">
+      <button class="btn btn-default-inverse" style="float: right; margin-right: 10px;" ng-disabled="!macInputModel" ng-click="addNewRule()">
+        <i class="fa fa-plus"></i>&nbsp;&nbsp;鏂板鐑偣闄愭祦瑙勫垯</button>
+    </div>
+  </div>
+  
+  <div class="separator"></div>
+  
+  <div class="container-fluid">
+    <div class="row" style="margin-top: 20px; margin-bottom: 20px;">
+      <div class="col-md-12">
+        <div class="card">
+          <div class="inputs-header">
+            <span class="brand" style="font-size: 13px;">鐑偣鍙傛暟闄愭祦瑙勫垯</span>
+            <button class="btn btn-primary" style="float: right; margin-right: 10px; height: 30px;font-size: 12px;" ng-click="getMachineRules()">鍒锋柊</button>
+            <input class="form-control witdh-200" placeholder="鍏抽敭瀛�" ng-model="searchKey">
+            <div class="control-group" style="float:right;margin-right: 10px;margin-bottom: -10px;">
+              <selectize id="gsInput" class="selectize-input-200" config="macsInputConfig" options="macsInputOptions" ng-model="macInputModel"
+                placeholder="鏈哄櫒"></selectize>
+            </div>
+          </div>
+
+            <!-- error panel -->
+            <div class="row clearfix" ng-if="loadError">
+                <div class="col-md-6 col-md-offset-3">
+                    <div class="panel panel-default">
+                        <div class="panel-body">
+                            <center>
+                                <p>{{loadError.message}}</p>
+                            </center>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <!-- Table and pagination start -->
+                <!--.tools-header -->
+                <div class="card-body" style="padding: 0px 0px;" ng-if="!loadError">
+                    <table class="table" style="border-left: none; border-right:none;margin-top: 10px;">
+                        <thead>
+                        <tr style="background: #F3F5F7;">
+                            <td style="width: 40%">
+                                璧勬簮鍚�
+                            </td>
+                            <td style="width: 10%;">
+                                鍙傛暟绱㈠紩
+                            </td>
+                            <td style="width: 10%;">
+                                娴佹帶妯″紡
+                            </td>
+                            <td style="width: 10%;">
+                                闃堝��
+                            </td>
+                            <td style="width: 8%;">
+                                鏄惁闆嗙兢
+                            </td>
+                            <td style="width: 10%;">
+                                渚嬪椤规暟鐩�
+                            </td>
+                            <td style="width: 12%;">
+                                鎿嶄綔
+                            </td>
+                        </tr>
+                        </thead>
+                        <tbody>
+                        <tr dir-paginate="ruleEntity in rules | filter: searchKey | itemsPerPage: rulesPageConfig.pageSize " current-page="rulesPageConfig.currentPageIndex"
+                            pagination-id="entriesPagination">
+                            <td style="word-wrap:break-word;word-break:break-all;">{{ruleEntity.rule.resource}}</td>
+                            <td style="word-wrap:break-word;word-break:break-all;">{{ruleEntity.rule.paramIdx}}</td>
+                            <td>
+                                {{ruleEntity.rule.grade == 1 ? 'QPS' : '鏈煡'}}
+                            </td>
+                            <td style="word-wrap:break-word;word-break:break-all;">
+                                {{ruleEntity.rule.count}}
+                            </td>
+                            <td>
+                                <span ng-if="ruleEntity.rule.clusterMode">鏄�</span>
+                                <span ng-if="!ruleEntity.rule.clusterMode">鍚�</span>
+                            </td>
+                            <td>
+                                {{ruleEntity.rule.paramFlowItemList == undefined ? 0 : ruleEntity.rule.paramFlowItemList.length}}
+                            </td>
+                            <td>
+                                <button class="btn btn-xs btn-default" type="button" ng-click="editRule(ruleEntity)" style="font-size: 12px; height:25px;">缂栬緫</button>
+                                <button class="btn btn-xs btn-default" type="button" ng-click="deleteRule(ruleEntity)" style="font-size: 12px; height:25px;">鍒犻櫎</button>
+                            </td>
+                        </tr>
+                        </tbody>
+                    </table>
+                </div>
+                <!-- .card-body -->
+                <div class="pagination-footer" ng-if="!loadError">
+                    <dir-pagination-controls boundary-links="true" template-url="app/views/pagination.tpl.html" pagination-id="entriesPagination"
+                                             on-page-change="">
+                    </dir-pagination-controls>
+                    <div class="tools" style="">
+                        <span>鍏� {{rulesPageConfig.totalCount}} 鏉¤褰�, </span>
+                        <span>姣忛〉 <input class="form-control" ng-model="rulesPageConfig.pageSize"> 鏉¤褰�</span>
+                        <!--<span>绗� {{rulesPageConfig.currentPageIndex}} / {{rulesPageConfig.totalPage}} 椤�</span>-->
+                    </div>
+                    <!-- .tools -->
+                </div>
+                <!-- pagination-footer -->
+            <!-- Table and pagination end -->
+
+        </div>
+        <!-- .card -->
+      </div>
+      <!-- .col-md-12 -->
+    </div>
+    <!-- -->
+  </div>
+  <!-- .container-fluid -->
+  
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/system.html b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/system.html
new file mode 100644
index 0000000..a42a986
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/app/views/system.html
@@ -0,0 +1,92 @@
+<div class="row" style="margin-left: 1px; margin-top:10px; height: 50px;">
+  <div class="col-md-6" style="margin-bottom: 10px;">
+    <span style="font-size: 30px;font-weight: bold;">{{app}}</span>
+  </div>
+  <div class="col-md-6">
+    <button class="btn btn-default-inverse" style="float: right; margin-right: 10px;" ng-disabled="!macInputModel" ng-click="addNewRule()">
+      <i class="fa fa-plus"></i>&nbsp;&nbsp;鏂板绯荤粺瑙勫垯</button>
+  </div>
+</div>
+
+<div class="separator"></div>
+
+<div class="container-fluid">
+  <div class="row" style="margin-top: 20px; margin-bottom: 20px;">
+    <div class="col-md-12">
+      <div class="card">
+        <div class="inputs-header">
+          <span class="brand" style="font-size: 13px;">绯荤粺瑙勫垯</span>
+          <!--<button class="btn btn-danger" style="float: right;margin-right: 10px;height: 30px;font-size: 12px;" ng-click="disableAll()">鍏ㄩ儴绂佺敤</button>-->
+          <button class="btn btn-primary" style="float: right; margin-right: 10px; height: 30px;font-size: 12px;" ng-click="getMachineRules()">鍒锋柊</button>
+          <input class="form-control witdh-200" placeholder="鍏抽敭瀛�" ng-model="searchKey">
+          <div class="control-group" style="float:right;margin-right: 10px;margin-bottom: -10px;">
+            <selectize id="gsInput" class="selectize-input-200" config="macsInputConfig" options="macsInputOptions" ng-model="macInputModel"
+              placeholder="鏈哄櫒"></selectize>
+          </div>
+        </div>
+
+        <!--.tools-header -->
+        <div class="card-body" style="padding: 0px 0px;">
+          <table class="table" style="border-left: none; border-right:none;margin-top: 10px;">
+            <thead>
+              <tr style="background: #F3F5F7;">
+                <td style="width: 40%;">
+                  闃堝�肩被鍨�
+                </td>
+                <td style="width: 40%;">
+                  鍗曟満闃堝��
+                </td>
+                <td style="width: 12%;">
+                  鎿嶄綔
+                </td>
+              </tr>
+            </thead>
+            <tbody>
+              <tr dir-paginate="rule in rules | filter : searchKey | itemsPerPage: rulesPageConfig.pageSize " current-page="rulesPageConfig.currentPageIndex"
+                pagination-id="entriesPagination">
+                <td style="word-wrap:break-word;word-break:break-all;">
+                  <span ng-if="rule.highestSystemLoad >= 0">绯荤粺 load锛堣嚜閫傚簲锛�</span>
+                  <span ng-if="rule.avgRt >= 0">骞冲潎 RT</span>
+                  <span ng-if="rule.maxThread >= 0">骞跺彂鏁�</span>
+                  <span ng-if="rule.qps >= 0">鍏ュ彛 QPS</span>
+                  <span ng-if="rule.highestCpuUsage >= 0">CPU 浣跨敤鐜�</span>
+                </td>
+                <td style="word-wrap:break-word;word-break:break-all;">
+                  <span ng-if="rule.highestSystemLoad >= 0">{{rule.highestSystemLoad}}</span>
+                  <span ng-if="rule.avgRt >= 0">{{rule.avgRt}}</span>
+                  <span ng-if="rule.maxThread >= 0">{{rule.maxThread}}</span>
+                  <span ng-if="rule.qps >= 0">{{rule.qps}}</span>
+                  <span ng-if="rule.highestCpuUsage >= 0">{{rule.highestCpuUsage}}</span>
+                </td>
+                <td>
+                  <button class="btn btn-xs btn-default" type="button" ng-click="editRule(rule)" style="font-size: 12px; height:25px;">缂栬緫</button>
+                  <button class="btn btn-xs btn-default" type="button" ng-click="deleteRule(rule)" style="font-size: 12px; height:25px;">鍒犻櫎</button>
+                </td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+        <!-- .card-body -->
+        <div class="pagination-footer">
+          <dir-pagination-controls boundary-links="true" template-url="app/views/pagination.tpl.html" pagination-id="entriesPagination"
+            on-page-change="">
+          </dir-pagination-controls>
+          <div class="tools" style="">
+            <span>鍏� {{rulesPageConfig.totalCount}} 鏉¤褰�, </span>
+            <span>
+              姣忛〉
+              <input class="form-control" ng-model="rulesPageConfig.pageSize"> 鏉¤褰�,
+            </span>
+            <span>绗� {{rulesPageConfig.currentPageIndex}} / {{rulesPageConfig.totalPage}} 椤�</span>
+          </div>
+          <!-- .tools -->
+        </div>
+        <!-- pagination-footer -->
+      </div>
+      <!-- .card -->
+    </div>
+    <!-- .col-md-12 -->
+  </div>
+  <!-- -->
+</div>
+<!-- .container-fluid -->
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/assets/img/sentinel-logo.png b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/assets/img/sentinel-logo.png
new file mode 100644
index 0000000..60e8826
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/assets/img/sentinel-logo.png
Binary files differ
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/dist/css/app.css b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/dist/css/app.css
new file mode 100644
index 0000000..a9e9075
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/dist/css/app.css
@@ -0,0 +1,5 @@
+.chat,.timeline{list-style:none}#loading-bar,#loading-bar-spinner{pointer-events:none;-webkit-pointer-events:none;-webkit-transition:350ms linear all;-moz-transition:350ms linear all;-o-transition:350ms linear all;transition:350ms linear all}#loading-bar-spinner.ng-enter,#loading-bar-spinner.ng-leave.ng-leave-active,#loading-bar.ng-enter,#loading-bar.ng-leave.ng-leave-active{opacity:0}#loading-bar-spinner.ng-enter.ng-enter-active,#loading-bar-spinner.ng-leave,#loading-bar.ng-enter.ng-enter-active,#loading-bar.ng-leave{opacity:1}#loading-bar .bar{-webkit-transition:width 350ms;-moz-transition:width 350ms;-o-transition:width 350ms;transition:width 350ms;background:#29d;position:fixed;z-index:10002;top:0;left:0;width:100%;height:2px;border-bottom-right-radius:1px;border-top-right-radius:1px}#loading-bar .peg{position:absolute;width:70px;right:0;top:0;height:2px;opacity:.45;-moz-box-shadow:#29d 1px 0 6px 1px;-ms-box-shadow:#29d 1px 0 6px 1px;-webkit-box-shadow:#29d 1px 0 6px 1px;box-shadow:#29d 1px 0 6px 1px;-moz-border-radius:100%;-webkit-border-radius:100%;border-radius:100%}#loading-bar-spinner{display:block;position:fixed;z-index:10002;top:10px;left:10px}#loading-bar-spinner .spinner-icon{width:14px;height:14px;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;-webkit-animation:loading-bar-spinner .4s linear infinite;-moz-animation:loading-bar-spinner .4s linear infinite;-ms-animation:loading-bar-spinner .4s linear infinite;-o-animation:loading-bar-spinner .4s linear infinite;animation:loading-bar-spinner .4s linear infinite}@-webkit-keyframes loading-bar-spinner{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes loading-bar-spinner{0%{-moz-transform:rotate(0);transform:rotate(0)}100%{-moz-transform:rotate(360deg);transform:rotate(360deg)}}@-o-keyframes loading-bar-spinner{0%{-o-transform:rotate(0);transform:rotate(0)}100%{-o-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes loading-bar-spinner{0%{-ms-transform:rotate(0);transform:rotate(0)}100%{-ms-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loading-bar-spinner{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.bootstrap-switch{display:inline-block;direction:ltr;cursor:pointer;border-radius:4px;border:1px solid #ccc;position:relative;text-align:left;overflow:hidden;line-height:8px;z-index:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.bootstrap-switch .bootstrap-switch-container{display:inline-block;top:0;border-radius:4px;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.bootstrap-switch .bootstrap-switch-handle-off,.bootstrap-switch .bootstrap-switch-handle-on,.bootstrap-switch .bootstrap-switch-label{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;cursor:pointer;display:table-cell;vertical-align:middle;padding:6px 12px;font-size:14px;line-height:20px}.bootstrap-switch .bootstrap-switch-handle-off,.bootstrap-switch .bootstrap-switch-handle-on{text-align:center;z-index:1}.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary,.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary{color:#fff;background:#337ab7}.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info,.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info{color:#fff;background:#5bc0de}.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning,.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning{background:#f0ad4e;color:#fff}.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger,.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger{color:#fff;background:#d9534f}.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default,.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default{color:#000;background:#eee}.bootstrap-switch .bootstrap-switch-label{text-align:center;margin-top:-1px;margin-bottom:-1px;z-index:100;color:#333;background:#fff}.bootstrap-switch span::before{content:"\200b"}.bootstrap-switch .bootstrap-switch-handle-on{border-bottom-left-radius:3px;border-top-left-radius:3px}.bootstrap-switch .bootstrap-switch-handle-off{border-bottom-right-radius:3px;border-top-right-radius:3px}.bootstrap-switch input[type=radio],.bootstrap-switch input[type=checkbox]{position:absolute!important;top:0;left:0;margin:0;z-index:-1;opacity:0;filter:alpha(opacity=0);visibility:hidden}.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-label{padding:1px 5px;font-size:12px;line-height:1.5}.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-label{padding:5px 10px;font-size:12px;line-height:1.5}.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-label{padding:6px 16px;font-size:18px;line-height:1.3333333}.bootstrap-switch.bootstrap-switch-disabled,.bootstrap-switch.bootstrap-switch-indeterminate,.bootstrap-switch.bootstrap-switch-readonly{cursor:default!important}.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-label,.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-label,.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-label{opacity:.5;filter:alpha(opacity=50);cursor:default!important}.bootstrap-switch.bootstrap-switch-animate .bootstrap-switch-container{-webkit-transition:margin-left .5s;-o-transition:margin-left .5s;transition:margin-left .5s}.bootstrap-switch.bootstrap-switch-inverse .bootstrap-switch-handle-on{border-radius:0 3px 3px 0}.bootstrap-switch.bootstrap-switch-inverse .bootstrap-switch-handle-off{border-radius:3px 0 0 3px}.bootstrap-switch.bootstrap-switch-focused{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.bootstrap-switch.bootstrap-switch-inverse.bootstrap-switch-off .bootstrap-switch-label,.bootstrap-switch.bootstrap-switch-on .bootstrap-switch-label{border-bottom-right-radius:3px;border-top-right-radius:3px}.bootstrap-switch.bootstrap-switch-inverse.bootstrap-switch-on .bootstrap-switch-label,.bootstrap-switch.bootstrap-switch-off .bootstrap-switch-label{border-bottom-left-radius:3px;border-top-left-radius:3px}.ngdialog,.ngdialog-overlay{position:fixed;top:0;right:0;bottom:0;left:0}@-webkit-keyframes ngdialog-fadeout{0%{opacity:1}100%{opacity:0}}@keyframes ngdialog-fadeout{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes ngdialog-fadein{0%{opacity:0}100%{opacity:1}}@keyframes ngdialog-fadein{0%{opacity:0}100%{opacity:1}}.ngdialog{box-sizing:border-box;overflow:auto;-webkit-overflow-scrolling:touch;z-index:10000}.ngdialog *,.ngdialog :after,.ngdialog :before{box-sizing:inherit}.ngdialog.ngdialog-disabled-animation,.ngdialog.ngdialog-disabled-animation .ngdialog-content,.ngdialog.ngdialog-disabled-animation .ngdialog-overlay{-webkit-animation:none!important;animation:none!important}.ngdialog-overlay{background:rgba(0,0,0,.4);-webkit-backface-visibility:hidden;-webkit-animation:ngdialog-fadein .5s;animation:ngdialog-fadein .5s}.ngdialog-no-overlay{pointer-events:none}.ngdialog.ngdialog-closing .ngdialog-overlay{-webkit-backface-visibility:hidden;-webkit-animation:ngdialog-fadeout .5s;animation:ngdialog-fadeout .5s}.ngdialog-content{background:#fff;-webkit-backface-visibility:hidden;-webkit-animation:ngdialog-fadein .5s;animation:ngdialog-fadein .5s;pointer-events:all}.ngdialog.ngdialog-closing .ngdialog-content{-webkit-backface-visibility:hidden;-webkit-animation:ngdialog-fadeout .5s;animation:ngdialog-fadeout .5s}.ngdialog-close:before{font-family:Helvetica,Arial,sans-serif;content:'\00D7';cursor:pointer}body.ngdialog-open,html.ngdialog-open{overflow:hidden}@-webkit-keyframes ngdialog-flyin{0%{opacity:0;-webkit-transform:translateY(-40px);transform:translateY(-40px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes ngdialog-flyin{0%{opacity:0;-webkit-transform:translateY(-40px);transform:translateY(-40px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes ngdialog-flyout{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(-40px);transform:translateY(-40px)}}@keyframes ngdialog-flyout{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(-40px);transform:translateY(-40px)}}.ngdialog.ngdialog-theme-default{padding-bottom:160px;padding-top:160px}.ngdialog.ngdialog-theme-default.ngdialog-closing .ngdialog-content{-webkit-animation:ngdialog-flyout .5s;animation:ngdialog-flyout .5s}.ngdialog.ngdialog-theme-default .ngdialog-content{-webkit-animation:ngdialog-flyin .5s;animation:ngdialog-flyin .5s;background:#f0f0f0;border-radius:5px;color:#444;font-family:Helvetica,sans-serif;font-size:1.1em;line-height:1.5em;margin:0 auto;max-width:100%;padding:1em;position:relative;width:450px}.ngdialog.ngdialog-theme-default .ngdialog-close{border-radius:5px;cursor:pointer;position:absolute;right:0;top:0}.ngdialog.ngdialog-theme-default .ngdialog-close:before{background:0 0;border-radius:3px;color:#bbb;content:'\00D7';font-size:26px;font-weight:400;height:30px;line-height:26px;position:absolute;right:3px;text-align:center;top:3px;width:30px}.ngdialog.ngdialog-theme-default .ngdialog-close:active:before,.ngdialog.ngdialog-theme-default .ngdialog-close:hover:before{color:#777}.ngdialog.ngdialog-theme-default .ngdialog-message{margin-bottom:.5em}.ngdialog.ngdialog-theme-default .ngdialog-input{margin-bottom:1em}.ngdialog.ngdialog-theme-default .ngdialog-input input[type=text],.ngdialog.ngdialog-theme-default .ngdialog-input input[type=password],.ngdialog.ngdialog-theme-default .ngdialog-input input[type=email],.ngdialog.ngdialog-theme-default .ngdialog-input input[type=url],.ngdialog.ngdialog-theme-default .ngdialog-input textarea{background:#fff;border:0;border-radius:3px;font-family:inherit;font-size:inherit;font-weight:inherit;margin:0 0 .25em;min-height:2.5em;padding:.25em .67em;width:100%}.ngdialog.ngdialog-theme-default .ngdialog-input input[type=text]:focus,.ngdialog.ngdialog-theme-default .ngdialog-input input[type=password]:focus,.ngdialog.ngdialog-theme-default .ngdialog-input input[type=email]:focus,.ngdialog.ngdialog-theme-default .ngdialog-input input[type=url]:focus,.ngdialog.ngdialog-theme-default .ngdialog-input textarea:focus{box-shadow:inset 0 0 0 2px #8dbdf1;outline:0}.ngdialog.ngdialog-theme-default .ngdialog-buttons:after{content:'';display:table;clear:both}.ngdialog.ngdialog-theme-default .ngdialog-button{border:0;border-radius:3px;cursor:pointer;float:right;font-family:inherit;font-size:.8em;letter-spacing:.1em;line-height:1em;margin:0 0 0 .5em;padding:.75em 2em;text-transform:uppercase}.ngdialog.ngdialog-theme-default .ngdialog-button:focus{-webkit-animation:ngdialog-pulse 1.1s infinite;animation:ngdialog-pulse 1.1s infinite;outline:0}.btn:active,.btn:focus,.selectize-input>input:focus{outline:0!important}@media (max-width:568px){.ngdialog.ngdialog-theme-default .ngdialog-button:focus{-webkit-animation:none;animation:none}}.ngdialog.ngdialog-theme-default .ngdialog-button.ngdialog-button-primary{background:#3288e6;color:#fff}.ngdialog.ngdialog-theme-default .ngdialog-button.ngdialog-button-secondary{background:#e0e0e0;color:#777}.datetimepicker{border-radius:4px;direction:ltr;display:block;margin-top:1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:320px}.datetimepicker>div{display:none}.datetimepicker .hour,.datetimepicker .minute{height:34px;line-height:34px;margin:0;width:25%}.datetimepicker .table{margin:0}.datetimepicker .table td,.datetimepicker .table th{border:0;border-radius:4px;height:20px;text-align:center}.datetimepicker .day:hover,.datetimepicker .hour:hover,.datetimepicker .left:hover,.datetimepicker .minute:hover,.datetimepicker .right:hover,.datetimepicker .switch:hover{background:#eee;cursor:pointer}.datetimepicker .disabled,.datetimepicker .disabled:hover{background:0 0;color:#ebebeb;cursor:default}.datetimepicker .active,.datetimepicker .active.disabled,.datetimepicker .active.disabled:hover,.datetimepicker .active:hover{background-color:#04c;background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;color:#fff;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#08c', endColorstr='#04c', GradientType=0);text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datetimepicker .current,.datetimepicker .current.disabled,.datetimepicker .current.disabled:hover,.datetimepicker .current:hover{background-color:#e5e5e5}.datetimepicker .active.active,.datetimepicker .active.disabled,.datetimepicker .active.disabled.active,.datetimepicker .active.disabled.disabled,.datetimepicker .active.disabled:active,.datetimepicker .active.disabled:hover,.datetimepicker .active.disabled:hover.active,.datetimepicker .active.disabled:hover.disabled,.datetimepicker .active.disabled:hover:active,.datetimepicker .active.disabled:hover:hover,.datetimepicker .active:active,.datetimepicker .active:hover,.datetimepicker .active:hover.active,.datetimepicker .active:hover.disabled,.datetimepicker .active:hover:active,.datetimepicker .active:hover:hover,.datetimepicker span.active.disabled:hover[disabled],.datetimepicker span.active.disabled[disabled],.datetimepicker span.active:hover[disabled],.datetimepicker span.active[disabled],.datetimepicker td.active.disabled:hover[disabled],.datetimepicker td.active.disabled[disabled],.datetimepicker td.active:hover[disabled],.datetimepicker td.active[disabled]{background-color:#04c}.datetimepicker span{border-radius:4px;cursor:pointer;display:block;float:left;height:54px;line-height:54px;margin:1%;width:23%}.datetimepicker span:hover{background:#eee}.datetimepicker .future,.datetimepicker .past{color:#999}.ui-notification{position:fixed;z-index:9999;width:300px;-webkit-transition:all ease .5s;-o-transition:all ease .5s;transition:all ease .5s;color:#fff;border-radius:0;background:#337ab7;box-shadow:5px 5px 10px rgba(0,0,0,.3)}.ui-notification.clickable{cursor:pointer}.ui-notification.clickable:hover{opacity:.7}.ui-notification.killed{-webkit-transition:opacity ease 1s;-o-transition:opacity ease 1s;transition:opacity ease 1s;opacity:0}.ui-notification>h3{font-size:14px;font-weight:700;display:block;margin:10px 10px 0;padding:0 0 5px;text-align:left;border-bottom:1px solid rgba(255,255,255,.3)}.ui-notification a{color:#fff}.ui-notification a:hover{text-decoration:underline}.ui-notification>.message{margin:10px}.ui-notification.warning{color:#fff;background:#f0ad4e}.ui-notification.error{color:#fff;background:#d9534f}.ui-notification.success{color:#fff;background:#5cb85c}.ui-notification.info{color:#fff;background:#5bc0de}table.rz-table{table-layout:fixed;border-collapse:collapse}table.rz-table th{position:relative;min-width:25px}table.rz-table th .rz-handle{width:10px;height:100%;position:absolute;top:0;right:0;cursor:ew-resize!important}table.rz-table th .rz-handle.rz-handle-active{border-right:1px dotted #000}.selectize-control.plugin-drag_drop.multi>.selectize-input>div.ui-sortable-placeholder{visibility:visible!important;background:#f2f2f2!important;background:rgba(0,0,0,.06)!important;border:0!important;-webkit-box-shadow:inset 0 0 12px 4px #fff;box-shadow:inset 0 0 12px 4px #fff}.selectize-control.plugin-drag_drop .ui-sortable-placeholder::after{content:'!';visibility:hidden}.selectize-control.plugin-drag_drop .ui-sortable-helper{-webkit-box-shadow:0 2px 5px rgba(0,0,0,.2);box-shadow:0 2px 5px rgba(0,0,0,.2)}.selectize-dropdown-header{position:relative;padding:5px 8px;border-bottom:1px solid #d0d0d0;background:#f8f8f8;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0}.selectize-dropdown-header-close{position:absolute;right:8px;top:50%;color:#303030;opacity:.4;margin-top:-12px;line-height:20px;font-size:20px!important}.selectize-dropdown-header-close:hover{color:#000}.selectize-dropdown.plugin-optgroup_columns .optgroup{border-right:1px solid #f2f2f2;border-top:0 none;float:left;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.selectize-control.plugin-remove_button [data-value] .remove,.selectize-input{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;display:inline-block}.selectize-dropdown.plugin-optgroup_columns .optgroup:last-child{border-right:0 none}.selectize-dropdown.plugin-optgroup_columns .optgroup:before{display:none}.selectize-dropdown.plugin-optgroup_columns .optgroup-header{border-top:0 none}.selectize-control.plugin-remove_button [data-value]{position:relative;padding-right:24px!important}.selectize-control.plugin-remove_button [data-value] .remove{z-index:1;position:absolute;top:0;right:0;bottom:0;width:17px;text-align:center;font-weight:700;font-size:12px;color:inherit;text-decoration:none;vertical-align:middle;padding:2px 0 0;border-left:1px solid #d0d0d0;-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0;box-sizing:border-box}.selectize-control.plugin-remove_button [data-value] .remove:hover{background:rgba(0,0,0,.05)}.selectize-control.plugin-remove_button [data-value].active .remove{border-left-color:#cacaca}.selectize-control.plugin-remove_button .disabled [data-value] .remove:hover{background:0 0}.selectize-control.plugin-remove_button .disabled [data-value] .remove{border-left-color:#fff}.selectize-control.plugin-remove_button .remove-single{position:absolute;right:0;top:0;font-size:23px}.selectize-control,.selectize-input{position:relative}.selectize-dropdown,.selectize-input,.selectize-input input{color:#303030;font-family:inherit;font-size:13px;line-height:18px;-webkit-font-smoothing:inherit}.selectize-control.single .selectize-input.input-active,.selectize-input{background:#fff;cursor:text;display:inline-block}.selectize-input{border:1px solid #d0d0d0;padding:8px;width:100%;overflow:hidden;z-index:1;box-sizing:border-box;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.1);box-shadow:inset 0 1px 1px rgba(0,0,0,.1);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.selectize-control.multi .selectize-input.has-items{padding:6px 8px 3px}.selectize-input.full{background-color:#fff}.selectize-input.disabled,.selectize-input.disabled *{cursor:default!important}.selectize-input.focus{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.15)}.selectize-input.dropdown-active{-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0}.selectize-input>*{vertical-align:baseline;display:-moz-inline-stack;display:inline-block;zoom:1}.selectize-control.multi .selectize-input>div{cursor:pointer;margin:0 3px 3px 0;padding:2px 6px;background:#f2f2f2;color:#303030;border:0 solid #d0d0d0}.selectize-control.multi .selectize-input>div.active{background:#e8e8e8;color:#303030;border:0 solid #cacaca}.selectize-control.multi .selectize-input.disabled>div,.selectize-control.multi .selectize-input.disabled>div.active{color:#7d7d7d;background:#fff;border:0 solid #fff}.selectize-input>input{display:inline-block!important;padding:0!important;min-height:0!important;max-height:none!important;max-width:100%!important;margin:0 2px 0 0!important;text-indent:0!important;border:0!important;background:0 0!important;line-height:inherit!important;-webkit-user-select:auto!important;-webkit-box-shadow:none!important;box-shadow:none!important}.selectize-input>input::-ms-clear{display:none}.selectize-input::after{content:' ';display:block;clear:left}.selectize-input.dropdown-active::before{content:' ';display:block;position:absolute;background:#f0f0f0;height:1px;bottom:0;left:0;right:0}.selectize-dropdown{position:absolute;z-index:10;border:1px solid #d0d0d0;background:#fff;margin:-1px 0 0;border-top:0 none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.1);box-shadow:0 1px 3px rgba(0,0,0,.1);-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.selectize-dropdown [data-selectable]{cursor:pointer;overflow:hidden}.selectize-dropdown [data-selectable] .highlight{background:rgba(125,168,208,.2);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.selectize-dropdown .optgroup-header,.selectize-dropdown .option{padding:5px 8px}.selectize-dropdown .option,.selectize-dropdown [data-disabled],.selectize-dropdown [data-disabled] [data-selectable].option{cursor:inherit;opacity:.5}.selectize-dropdown [data-selectable].option{opacity:1}.selectize-dropdown .optgroup:first-child .optgroup-header{border-top:0 none}.selectize-dropdown .optgroup-header{color:#303030;background:#fff;cursor:default}.selectize-dropdown .active{background-color:#f5fafd;color:#495c68}.selectize-dropdown .active.create{color:#495c68}.selectize-dropdown .create{color:rgba(48,48,48,.5)}.selectize-dropdown-content{overflow-y:auto;overflow-x:hidden;max-height:200px;-webkit-overflow-scrolling:touch}.selectize-control.single .selectize-input,.selectize-control.single .selectize-input input{cursor:pointer}.selectize-control.single .selectize-input.input-active,.selectize-control.single .selectize-input.input-active input{cursor:text}.selectize-control.single .selectize-input:after{content:' ';display:block;position:absolute;top:50%;right:15px;margin-top:-3px;width:0;height:0;border-style:solid;border-width:5px 5px 0;border-color:grey transparent transparent}.selectize-control.single .selectize-input.dropdown-active:after{margin-top:-4px;border-width:0 5px 5px;border-color:transparent transparent grey}.selectize-control.rtl.single .selectize-input:after{left:15px;right:auto}.selectize-control.rtl .selectize-input>input{margin:0 4px 0 -2px!important}.selectize-control .selectize-input.disabled{opacity:.5;background-color:#fafafa}/*!
+ * Start Bootstrap - SB Admin 2 Bootstrap Admin Theme (http://startbootstrap.com)
+ * Code licensed under the Apache License v2.0.
+ * For details, see http://www.apache.org/licenses/LICENSE-2.0.
+ */body{background-color:#f8f8f8}.example{padding:.625rem 1.825rem .625rem 2.5rem;border:1px dashed #ccc;position:relative;margin:0 0 .625rem;background-color:#fff}dl dd,dl dt{line-height:1.25rem}dl dt{font-style:normal;font-weight:700}dl dd{margin-left:.9375rem}dl.horizontal dt{float:left;width:10rem;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}dl.horizontal dd{margin-left:11.25rem}#wrapper{width:100%}#page-wrapper{min-height:568px;background-color:#fff}@media(min-width:768px){#page-wrapper{position:inherit;margin:0 0 0 250px;padding:0 30px;border-left:1px solid #e7e7e7}}.navbar-top-links{margin-right:0}.navbar-top-links li{display:inline-block}.flot-chart,.navbar-top-links .dropdown-menu li{display:block}.navbar-top-links li:last-child{margin-right:15px}.navbar-top-links li a{padding:15px;min-height:50px}.navbar-top-links .dropdown-menu li:last-child{margin-right:0}.navbar-top-links .dropdown-menu li a{padding:3px 20px;min-height:0}.navbar-top-links .dropdown-menu li a div{white-space:normal}.navbar-top-links .dropdown-alerts,.navbar-top-links .dropdown-messages,.navbar-top-links .dropdown-tasks{width:310px;min-width:0}.navbar-top-links .dropdown-messages{margin-left:5px}.navbar-top-links .dropdown-tasks{margin-left:-59px}.navbar-top-links .dropdown-alerts{margin-left:-123px}.navbar-top-links .dropdown-user{right:0;left:auto}.sidebar .sidebar-search{padding:15px}.sidebar ul li{border-bottom:1px solid #e7e7e7}.sidebar ul li a.active{background-color:#fff;color:#fff}.sidebar .arrow{float:right}.sidebar .fa.arrow:before{content:"\f104"}.sidebar .active>a>.fa.arrow:before{content:"\f107"}.sidebar .nav-second-level li,.sidebar .nav-third-level li{border-bottom:0!important}.sidebar .nav-second-level li a{padding-left:37px}.sidebar .nav-third-level li a{padding-left:52px}@media(min-width:768px){.sidebar{z-index:1;position:absolute;width:250px;margin-top:51px}.navbar-top-links .dropdown-alerts,.navbar-top-links .dropdown-messages,.navbar-top-links .dropdown-tasks{margin-left:auto}}.btn-outline{color:inherit;background-color:transparent;transition:all .5s}.btn-primary.btn-outline{color:#428bca}.btn-success.btn-outline{color:#5cb85c}.btn-info.btn-outline{color:#5bc0de}.btn-warning.btn-outline{color:#f0ad4e}.btn-danger.btn-outline{color:#d9534f}.btn-danger.btn-outline:hover,.btn-info.btn-outline:hover,.btn-primary.btn-outline:hover,.btn-success.btn-outline:hover,.btn-warning.btn-outline:hover{color:#fff}.chat{margin:0;padding:0}.chat li{margin-bottom:10px;padding-bottom:5px;border-bottom:1px dotted #999}.chat li.left .chat-body{margin-left:60px}.chat li.right .chat-body{margin-right:60px}.chat li .chat-body p{margin:0}.chat .glyphicon,.panel .slidedown .glyphicon{margin-right:5px}.chat-panel .panel-body{height:350px;overflow-y:scroll}.login-panel{margin-top:25%}.flot-chart{height:400px}.flot-chart-content{width:100%;height:100%}.dataTables_wrapper{position:relative;clear:both}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_desc_disabled{background:0 0}table.dataTable thead .sorting_asc:after{content:"\f0de";float:right;font-family:fontawesome}table.dataTable thead .sorting_desc:after{content:"\f0dd";float:right;font-family:fontawesome}table.dataTable thead .sorting:after{content:"\f0dc";float:right;font-family:fontawesome;color:rgba(50,50,50,.5)}.btn-circle{width:30px;height:30px;padding:6px 0;border-radius:15px;text-align:center;font-size:12px;line-height:1.428571429}.btn-circle.btn-lg{width:50px;height:50px;padding:10px 16px;border-radius:25px;font-size:18px;line-height:1.33}.btn-circle.btn-xl{width:70px;height:70px;padding:10px 16px;border-radius:35px;font-size:24px;line-height:1.33}.show-grid [class^=col-]{padding-top:10px;padding-bottom:10px;border:1px solid #ddd;background-color:#eee!important}.show-grid{margin:15px 0}.huge{font-size:40px}.panel-green{border-color:#5cb85c}.panel-green .panel-heading{border-color:#5cb85c;color:#fff;background-color:#5cb85c}.panel-green a{color:#5cb85c}.panel-green a:hover{color:#3d8b3d}.panel-red{border-color:#d9534f}.panel-red .panel-heading{border-color:#d9534f;color:#fff;background-color:#d9534f}.panel-red a{color:#d9534f}.panel-red a:hover{color:#b52b27}.panel-yellow{border-color:#f0ad4e}.panel-yellow .panel-heading{border-color:#f0ad4e;color:#fff;background-color:#f0ad4e}.panel-yellow a{color:#f0ad4e}.panel-yellow a:hover{color:#df8a13}.timeline{position:relative;padding:20px 0}.timeline:before{content:" ";position:absolute;top:0;bottom:0;left:50%;width:3px;margin-left:-1.5px;background-color:#eee}.timeline>li{position:relative;margin-bottom:20px}.timeline>li:after,.timeline>li:before{content:" ";display:table}.timeline>li:after{clear:both}.timeline>li>.timeline-panel{float:left;position:relative;width:46%;padding:20px;border:1px solid #d4d4d4;border-radius:2px;-webkit-box-shadow:0 1px 6px rgba(0,0,0,.175);box-shadow:0 1px 6px rgba(0,0,0,.175)}.timeline>li>.timeline-panel:before{content:" ";display:inline-block;position:absolute;top:26px;right:-15px;border-top:15px solid transparent;border-right:0 solid #ccc;border-bottom:15px solid transparent;border-left:15px solid #ccc}.timeline>li>.timeline-panel:after{content:" ";display:inline-block;position:absolute;top:27px;right:-14px;border-top:14px solid transparent;border-right:0 solid #fff;border-bottom:14px solid transparent;border-left:14px solid #fff}.timeline>li>.timeline-badge{z-index:100;position:absolute;top:16px;left:50%;width:50px;height:50px;margin-left:-25px;border-radius:50%;text-align:center;font-size:1.4em;line-height:50px;color:#fff;background-color:#999}.timeline>li.timeline-inverted>.timeline-panel{float:right}.timeline>li.timeline-inverted>.timeline-panel:before{right:auto;left:-15px;border-right-width:15px;border-left-width:0}.timeline>li.timeline-inverted>.timeline-panel:after{right:auto;left:-14px;border-right-width:14px;border-left-width:0}.timeline-badge.primary{background-color:#2e6da4!important}.timeline-badge.success{background-color:#3f903f!important}.timeline-badge.warning{background-color:#f0ad4e!important}.timeline-badge.danger{background-color:#d9534f!important}.timeline-badge.info{background-color:#5bc0de!important}.timeline-title{margin-top:0;color:inherit}.timeline-body>p,.timeline-body>ul{margin-bottom:0}.timeline-body>p+p{margin-top:5px}@media(max-width:767px){ul.timeline:before{left:40px}ul.timeline>li>.timeline-panel{width:calc(100% - 90px);width:-moz-calc(100% - 90px);width:-webkit-calc(100% - 90px);float:right}ul.timeline>li>.timeline-badge{top:16px;left:15px;margin-left:0}ul.timeline>li>.timeline-panel:before{right:auto;left:-15px;border-right-width:15px;border-left-width:0}ul.timeline>li>.timeline-panel:after{right:auto;left:-14px;border-right-width:14px;border-left-width:0}}.header,.jumbotron{border-bottom:1px solid #e5e5e5}.btn{height:32px}.width-200{max-width:200px}.width-300,.witdh-300{max-width:300px}body{padding:0}.footer,.header,.marketing{padding-left:15px;padding-right:15px}.header{margin-bottom:10px}.header h3{margin-top:0;margin-bottom:0;line-height:40px;padding-bottom:19px}.card .detail,.card .detail-brand{line-height:98px;text-align:center}.footer{padding-top:19px;color:#777;border-top:1px solid #e5e5e5}.container-narrow>hr{margin:30px 0}.jumbotron{text-align:center}.jumbotron .btn{font-size:21px;padding:14px 24px}.marketing{margin:40px 0}.marketing p+h4{margin-top:28px}@media screen and (min-width:768px){.container{width:inherit;margin-left:60px;margin-right:5px}.footer,.header,.marketing{padding-left:0;padding-right:0}.header{margin-bottom:30px}.jumbotron{border-bottom:0}}.navbar-inverse .navbar-nav>li>a{color:#b0ddce;font-size:15px}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{background-color:#1b926c}@media (min-width:900px){.navbar-right,.navbar-right~.navbar-right{margin-right:0}.navbar-left{float:left!important}.navbar-right{float:right!important}}.dropdown-menu{min-width:100px!important}.nav-sidebar li.active a{background:#DDD}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background:#1d9d74;color:#fff}.broadcast-message,.broadcast-message-preview{padding:10px;text-align:center;background:#555;color:#BBB;margin-top:50px}.card{position:relative;border:1px solid #d9d9d9;color:#666;background-color:#fff;width:100%;border-radius:5px}.card .card-header,.tools-header{border-top-left-radius:4px;border-top-right-radius:4px}.card .card-header{padding:9px 0;height:40px;background:#555;color:#fff;text-align:center}.card .card-body{padding:12px 10px}.card .card-footer{height:20px;font-size:10px;color:#777;margin:-15px 20px 5px}.card .detail-brand{float:left;width:30%;font-size:30px;color:#fff}.card .default{background:#1d9d74}.card .info{background:#6EBEE7}.card .warn{background:#ED7F54}.card .danger{background:#6583BE}.card .detail .text-default{color:#1d9d74}.card .detail .text-info{color:#6EBEE7}.card .detail .text-warn{color:#ED7F54}.card .detail .text-danger{color:#6583BE}.card .detail{float:right;width:70%}.card .detail .text{font-size:12px}.card .detail .number{font-size:30px;font-weight:500}.h100{height:100px}.inline{display:inline}.separator{height:1px;background-color:#e5e5e5;margin-top:10px}.card>.card-body>table>tbody>tr>td,.card>.card-body>table>thead>tr>td{word-wrap:break-word;word-break:break-all}.card>.card-body>table>thead>tr>td{font-weight:500;font-size:13px;text-align:center}.card>.card-body>table>thead>tr>td>span{font-weight:500;font-size:10px}.card>.card-body>table>tbody>tr>td{font-size:12px;text-align:center}.card>.card-body>table>tbody>tr>td>a{color:#666}.thumbnails>.card>.card-body>table>tbody>tr>td,.thumbnails>.card>.card-body>table>thead>tr>td{font-size:12px;color:#777;word-wrap:break-word;word-break:break-all}.thumbnails>.card>.card-body>table>thead>tr>td:nth-child(n+2){text-align:center}.thumbnails>.card>.card-body>table>tbody>tr>td:nth-child(n+2){font-weight:700;text-align:center}.thumbnails>.card>.card-body>table>tbody>tr>td:nth-child(1),.thumbnails>.card>.card-body>table>thead>tr>td:nth-child(1){text-align:left}.tools-header{background:#f5f5f5;padding:9px 0;height:40px}.tools-header .brand{font-size:13px;margin:2px 10px;font-weight:700;float:left}.tools-header .brand>a{color:#666}.tools-header>a,.tools-header>button,.tools-header>select{float:right;max-width:80px;margin:1px 10px;height:25px;padding:0 10px;line-height:25px;color:#666}.tools-header .paged{margin-right:0}.btn.btn-danger-tag{color:#fff;background-color:#d9534f;border-color:#d43f3a;line-height:1px;font-size:11px;padding:4px}.btn.btn-danger{color:#333;background-color:#fff;border-color:#ccc}.btn.btn-danger:active,.btn.btn-danger:focus,.btn.btn-danger:hover{color:#d9534f;border-color:#d9534f;background:#fff}.form-control{height:32px}.input-label:before{display:inline-block;content:"*";color:#f44336;font-family:SimSun;font-size:12px;-webkit-transform:TranslateX(-10px);-ms-transform:TranslateX(-10px);transform:TranslateX(-10px)}.badge-main,.label.label-main{color:#fff;background-color:#1d9d74;border-color:#1d9d74}.bootstrap-tagsinput{background-color:#fff;border:1px solid #ccc;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);display:inline-block;padding:4px 6px;color:#555;vertical-align:middle;border-radius:4px;width:85%;height:100px;line-height:20px;cursor:text}.bootstrap-tagsinput>.dropdown-menu{min-width:40px;font-size:12px}.bootstrap-tagsinput>.dropdown-menu>.active>a,.bootstrap-tagsinput>.dropdown-menu>.active>a:focus,.bootstrap-tagsinput>.dropdown-menu>.active>a:hover{background-image:-webkit-linear-gradient(top,#1d9d74 0,#1d9d74 100%);background-image:-o-linear-gradient(top,#1d9d74 0,#1d9d74 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#1d9d74),to(#1d9d74));background-image:linear-gradient(to bottom,#1d9d74 0,#1d9d74 100%);filter:progid: DXImageTransform.Microsoft.gradient(startColorstr='#1d9d74', endColorstr='#1d9d74', GradientType=0);background-repeat:repeat-x;color:#fff;text-decoration:none;outline:0;background-color:#1d9d74}.inputs-header{padding:9px 0;height:50px;border-top-left-radius:4px;border-top-right-radius:4px}.inputs-header .brand{font-size:13px;margin:2px 10px;font-weight:700;float:left}.inputs-header .brand>a{color:#666}.inputs-header>input{float:right;margin:1px 10px;height:30px;padding:0 10px;color:#666}.inputs-header>a{float:right;margin:1px 10px;height:30px;padding:5 5px}.inputs-header>select{float:right;max-width:80px;margin:1px 10px;padding:0 10px;color:#666;height:25px;font-size:12px}.witdh-150{max-width:150px}.witdh-200{max-width:200px}.card.highlight{border-color:#d9534f}.card .pagination-footer{height:40px;font-size:10px;color:#777;margin:-15px 20px 5px}.card .pagination-footer .tools{font-size:12px;margin:11px 20px 11px 0;float:right;display:inline}.card>.pagination-footer>.tools>span>input{height:25px;max-width:50px;display:inline}.pagination{display:inline-block;padding-left:0;margin:8px 0;float:right;border-radius:4px}.pagination>a{margin-right:5px;height:28px;width:28px;padding:5px 0}.datepicker>.table>tbody>tr>td,.datepicker>.table>thead>tr>td,.timepicker>.table>tbody>tr>td,.timepicker>.table>thead>tr>td{padding:5px 3px}.datepicker>.table>tbody>tr>td>.btn,.datepicker>.table>thead>tr>td>.btn,.timepicker>.table>tbody>tr>td>.btn,.timepicker>.table>thead>tr>td>.btn{border:1px solid #FFFDFD}.datepicker>.table>tbody>tr>td>.btn-default:active,.datepicker>.table>tbody>tr>td>.btn-default:focus,.datepicker>.table>tbody>tr>td>.btn-default:hover,.datepicker>.table>thead>tr>td>.btn-default:active,.datepicker>.table>thead>tr>td>.btn-default:focus,.datepicker>.table>thead>tr>td>.btn-default:hover,.timepicker>.table>tbody>tr>td>.btn-default:active,.timepicker>.table>tbody>tr>td>.btn-default:focus,.timepicker>.table>tbody>tr>td>.btn-default:hover,.timepicker>.table>thead>tr>td>.btn-default:active,.timepicker>.table>thead>tr>td>.btn-default:focus,.timepicker>.table>thead>tr>td>.btn-default:hover{color:#1d9d74;border-color:#1d9d74;background:#fff}.datepicker>.table>tbody>tr>td>a,.datepicker>.table>thead>tr>td>a,.timepicker>.table>tbody>tr>td>a,.timepicker>.table>thead>tr>td>a{height:25px;width:25px;padding:3px 0}.datepicker>.table>tbody>tr:first-child>td>a{padding:4px 0}.datepicker>.table>tbody>tr>td>a.btn.active,.datepicker>.table>thead>tr>td>a.btn.active,.timepicker>.table>tbody>tr>td>a.btn.active,.timepicker>.table>thead>tr>td>a.btn.active{color:#1d9d74;border-color:#1d9d74;background:#fff;box-shadow:inset 0 0 0 rgba(0,0,0,.125)}.datepicker>.table>thead>tr>td:not(:first-child):last-child>a,.timepicker>.table>thead>tr>td:not(:first-child):last-child>a{height:25px;width:50px;padding:5px 0}.datepicker>.table>tbody>tr>td>a,.timepicker>.table>tbody>tr>td>a{margin-left:8px}.sortorder:after{content:'\25b2'}.sortorder.reverse:after{content:'\25bc'}.input-control select{-moz-appearance:none;-webkit-appearance:none;appearance:none;position:relative;border:1px solid #d9d9d9;width:100%;height:100%;padding:.3125rem;z-index:0}.navbar-inverse{background-color:#337ab7;border-color:#337ab7}.sidebar{z-index:1;width:220px;top:0;left:0;height:100%}#page-wrapper{position:inherit;margin:70px 0 0 220px;padding:12px 30px;border-left:0 solid #e7e7e7}.sidebar .sidebar-nav.navbar-collapse{background-color:#F5F5F5;position:relative;color:#000;width:100%;padding:0;margin:0;list-style:none inside}.sidebar a{color:#555}.sidebar ul li:hover{color:red}.form-control{border-radius:8px}.form-control:focus,.highlight-border{border-color:#337ab7;box-shadow:0 0 0 rgba(0,0,0,.075) inset,0 0 0 rgba(29,157,116,1)}.btn-outline-primary.focus,.btn-outline-primary:focus,.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.browsehappy{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.btn.btn-main{color:#fff;background-color:#337ab7;border-color:#337ab7}.btn-default-inverse,.btn-default-inverse:focus,.btn-default-inverse:hover,.btn-default:active{color:#337ab7;border-color:#337ab7;background:#fff}.btn-danger-inverse,.btn-danger-inverse:focus,.btn-danger-inverse:hover,.btn-danger:active{color:#d9534f;border-color:#d9534f;background:#fff}.btn-tab-active,.btn-tab-active:focus,.btn-tab-active:hover,.btn-tab-default:active,.btn-tab-default:focus,.btn-tab-default:hover{color:#337ab7;border-color:#337ab7;background:#fff;font-weight:600}.btn-tab-default{color:#777;background:#fff;font-weight:600}.pagination>.btn.active{color:#fff;background-color:#337ab7;border-color:#337ab7}.btn-default:active,.btn-default:focus,.btn-default:hover{color:#337ab7;border-color:#337ab7;background:#fff}.bootstrap-switch.bootstrap-switch-on{border-color:#337ab7}.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success,.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success{color:#fff;background:#337ab7}.selectize-input-200>.selectize-input{min-width:200px;border-color:#337ab7}.btn-outline-primary{color:#007bff;background-color:transparent;background-image:none;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-secondary.focus,.btn-outline-secondary:focus,.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary{color:#6c757d;background-color:transparent;background-image:none;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-success.focus,.btn-outline-success:focus,.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success{color:#28a745;background-color:transparent;background-image:none;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-info.focus,.btn-outline-info:focus,.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-warning.focus,.btn-outline-warning:focus,.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning{color:#ffc107;background-color:transparent;background-image:none;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-danger.focus,.btn-outline-danger:focus,.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger{color:#dc3545;background-color:transparent;background-image:none;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-light.focus,.btn-outline-light:focus,.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-dark.focus,.btn-outline-dark:focus,.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/dist/js/app.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/dist/js/app.js
new file mode 100644
index 0000000..fa4c66e
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/dist/js/app.js
@@ -0,0 +1 @@
+"use strict";var app;angular.module("sentinelDashboardApp",["oc.lazyLoad","ui.router","ui.bootstrap","angular-loading-bar","ngDialog","ui.bootstrap.datetimepicker","ui-notification","rzTable","angular-clipboard","selectize","angularUtils.directives.dirPagination"]).factory("AuthInterceptor",["$window","$state",function(r,t){return{responseError:function(e){return 401===e.status&&(r.localStorage.removeItem("session_sentinel_admin"),t.go("login")),e},response:function(e){return e},request:function(e){var t=r.document.getElementsByTagName("base")[0].href;return e.url=t+e.url,e},requestError:function(e){return e}}}]).config(["$stateProvider","$urlRouterProvider","$ocLazyLoadProvider","$httpProvider",function(e,t,r,a){a.interceptors.push("AuthInterceptor"),r.config({debug:!1,events:!0}),t.otherwise("/dashboard/home"),e.state("login",{url:"/login",templateUrl:"app/views/login.html",controller:"LoginCtl",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/login.js"]})}]}}).state("dashboard",{url:"/dashboard",templateUrl:"app/views/dashboard/main.html",resolve:{loadMyDirectives:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/directives/header/header.js","app/scripts/directives/sidebar/sidebar.js","app/scripts/directives/sidebar/sidebar-search/sidebar-search.js"]})}]}}).state("dashboard.home",{url:"/home",templateUrl:"app/views/dashboard/home.html",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/main.js"]})}]}}).state("dashboard.flowV1",{templateUrl:"app/views/flow_v1.html",url:"/flow/:app",controller:"FlowControllerV1",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/flow_v1.js"]})}]}}).state("dashboard.flow",{templateUrl:"app/views/flow_v2.html",url:"/v2/flow/:app",controller:"FlowControllerV2",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/flow_v2.js"]})}]}}).state("dashboard.paramFlow",{templateUrl:"app/views/param_flow.html",url:"/paramFlow/:app",controller:"ParamFlowController",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/param_flow.js"]})}]}}).state("dashboard.clusterAppAssignManage",{templateUrl:"app/views/cluster_app_assign_manage.html",url:"/cluster/assign_manage/:app",controller:"SentinelClusterAppAssignManageController",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/cluster_app_assign_manage.js"]})}]}}).state("dashboard.clusterAppServerList",{templateUrl:"app/views/cluster_app_server_list.html",url:"/cluster/server/:app",controller:"SentinelClusterAppServerListController",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/cluster_app_server_list.js"]})}]}}).state("dashboard.clusterAppClientList",{templateUrl:"app/views/cluster_app_client_list.html",url:"/cluster/client/:app",controller:"SentinelClusterAppTokenClientListController",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/cluster_app_token_client_list.js"]})}]}}).state("dashboard.clusterSingle",{templateUrl:"app/views/cluster_single_config.html",url:"/cluster/single/:app",controller:"SentinelClusterSingleController",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/cluster_single.js"]})}]}}).state("dashboard.authority",{templateUrl:"app/views/authority.html",url:"/authority/:app",controller:"AuthorityRuleController",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/authority.js"]})}]}}).state("dashboard.degrade",{templateUrl:"app/views/degrade.html",url:"/degrade/:app",controller:"DegradeCtl",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/degrade.js"]})}]}}).state("dashboard.system",{templateUrl:"app/views/system.html",url:"/system/:app",controller:"SystemCtl",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/system.js"]})}]}}).state("dashboard.machine",{templateUrl:"app/views/machine.html",url:"/app/:app",controller:"MachineCtl",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/machine.js"]})}]}}).state("dashboard.identity",{templateUrl:"app/views/identity.html",url:"/identity/:app",controller:"IdentityCtl",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/identity.js"]})}]}}).state("dashboard.gatewayIdentity",{templateUrl:"app/views/gateway/identity.html",url:"/gateway/identity/:app",controller:"GatewayIdentityCtl",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/gateway/identity.js"]})}]}}).state("dashboard.metric",{templateUrl:"app/views/metric.html",url:"/metric/:app",controller:"MetricCtl",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/metric.js"]})}]}}).state("dashboard.gatewayApi",{templateUrl:"app/views/gateway/api.html",url:"/gateway/api/:app",controller:"GatewayApiCtl",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/gateway/api.js"]})}]}}).state("dashboard.gatewayFlow",{templateUrl:"app/views/gateway/flow.html",url:"/gateway/flow/:app",controller:"GatewayFlowCtl",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/gateway/flow.js"]})}]}})}]),(app=angular.module("sentinelDashboardApp")).filter("range",[function(){return function(e,t){if(isNaN(t)||t<=0)return[];e=[];for(var r=1;r<=t;r++)e.push(r);return e}}]),(app=angular.module("sentinelDashboardApp")).service("VersionService",["$http",function(e){this.version=function(){return e({url:"/version",method:"GET"})}}]),(app=angular.module("sentinelDashboardApp")).service("AuthService",["$http",function(t){this.check=function(){return t({url:"/auth/check",method:"POST"})},this.login=function(e){return t({url:"/auth/login",params:e,method:"POST"})},this.logout=function(){return t({url:"/auth/logout",method:"POST"})}}]),(app=angular.module("sentinelDashboardApp")).service("AppService",["$http",function(e){this.getApps=function(){return e({url:"app/briefinfos.json",method:"GET"})}}]),(app=angular.module("sentinelDashboardApp")).service("FlowServiceV1",["$http",function(a){function t(e){return void 0===e||""===e||isNaN(e)||e<=0}this.queryMachineRules=function(e,t,r){return a({url:"/v1/flow/rules",params:{app:e,ip:t,port:r},method:"GET"})},this.newRule=function(e){e.resource,e.limitApp,e.grade,e.count,e.strategy,e.refResource,e.controlBehavior,e.warmUpPeriodSec,e.maxQueueingTimeMs,e.app,e.ip,e.port;return a({url:"/v1/flow/rule",data:e,method:"POST"})},this.saveRule=function(e){var t={id:e.id,resource:e.resource,limitApp:e.limitApp,grade:e.grade,count:e.count,strategy:e.strategy,refResource:e.refResource,controlBehavior:e.controlBehavior,warmUpPeriodSec:e.warmUpPeriodSec,maxQueueingTimeMs:e.maxQueueingTimeMs};return a({url:"/v1/flow/save.json",params:t,method:"PUT"})},this.deleteRule=function(e){var t={id:e.id,app:e.app};return a({url:"/v1/flow/delete.json",params:t,method:"DELETE"})},this.checkRuleValid=function(e){return void 0===e.resource||""===e.resource?(alert("璧勬簮鍚嶇О涓嶈兘涓虹┖"),!1):void 0===e.count||e.count<0?(alert("闄愭祦闃堝�煎繀椤诲ぇ浜庣瓑浜� 0"),!1):void 0===e.strategy||e.strategy<0?(alert("鏃犳晥鐨勬祦鎺фā寮�"),!1):1!=e.strategy&&2!=e.strategy||void 0!==e.refResource&&""!=e.refResource?void 0===e.controlBehavior||e.controlBehavior<0?(alert("鏃犳晥鐨勬祦鎺ф暣褰㈡柟寮�"),!1):1==e.controlBehavior&&t(e.warmUpPeriodSec)?(alert("棰勭儹鏃堕暱蹇呴』澶т簬 0"),!1):2==e.controlBehavior&&t(e.maxQueueingTimeMs)?(alert("鎺掗槦瓒呮椂鏃堕棿蹇呴』澶т簬 0"),!1):!e.clusterMode||void 0!==e.clusterConfig&&void 0!==e.clusterConfig.thresholdType||(alert("闆嗙兢闄愭祦閰嶇疆涓嶆纭�"),!1):(alert("璇峰~鍐欏叧鑱旇祫婧愭垨鍏ュ彛"),!1)}}]),(app=angular.module("sentinelDashboardApp")).service("FlowServiceV2",["$http",function(a){function t(e){return void 0===e||""===e||isNaN(e)||e<=0}this.queryMachineRules=function(e,t,r){return a({url:"/v2/flow/rules",params:{app:e,ip:t,port:r},method:"GET"})},this.newRule=function(e){return a({url:"/v2/flow/rule",data:e,method:"POST"})},this.saveRule=function(e){return a({url:"/v2/flow/rule/"+e.id,data:e,method:"PUT"})},this.deleteRule=function(e){return a({url:"/v2/flow/rule/"+e.id,method:"DELETE"})},this.checkRuleValid=function(e){return void 0===e.resource||""===e.resource?(alert("璧勬簮鍚嶇О涓嶈兘涓虹┖"),!1):void 0===e.count||e.count<0?(alert("闄愭祦闃堝�煎繀椤诲ぇ浜庣瓑浜� 0"),!1):void 0===e.strategy||e.strategy<0?(alert("鏃犳晥鐨勬祦鎺фā寮�"),!1):1!=e.strategy&&2!=e.strategy||void 0!==e.refResource&&""!=e.refResource?void 0===e.controlBehavior||e.controlBehavior<0?(alert("鏃犳晥鐨勬祦鎺ф暣褰㈡柟寮�"),!1):1==e.controlBehavior&&t(e.warmUpPeriodSec)?(alert("棰勭儹鏃堕暱蹇呴』澶т簬 0"),!1):2==e.controlBehavior&&t(e.maxQueueingTimeMs)?(alert("鎺掗槦瓒呮椂鏃堕棿蹇呴』澶т簬 0"),!1):!e.clusterMode||void 0!==e.clusterConfig&&void 0!==e.clusterConfig.thresholdType||(alert("闆嗙兢闄愭祦閰嶇疆涓嶆纭�"),!1):(alert("璇峰~鍐欏叧鑱旇祫婧愭垨鍏ュ彛"),!1)}}]),(app=angular.module("sentinelDashboardApp")).service("DegradeService",["$http",function(a){this.queryMachineRules=function(e,t,r){return a({url:"degrade/rules.json",params:{app:e,ip:t,port:r},method:"GET"})},this.newRule=function(e){return a({url:"/degrade/rule",data:e,method:"POST"})},this.saveRule=function(e){var t={id:e.id,resource:e.resource,limitApp:e.limitApp,grade:e.grade,count:e.count,timeWindow:e.timeWindow,statIntervalMs:e.statIntervalMs,minRequestAmount:e.minRequestAmount,slowRatioThreshold:e.slowRatioThreshold};return a({url:"/degrade/rule/"+e.id,data:t,method:"PUT"})},this.deleteRule=function(e){return a({url:"/degrade/rule/"+e.id,method:"DELETE"})},this.checkRuleValid=function(e){if(void 0===e.resource||""===e.resource)return alert("璧勬簮鍚嶇О涓嶈兘涓虹┖"),!1;if(void 0===e.grade||e.grade<0)return alert("鏈煡鐨勯檷绾х瓥鐣�"),!1;if(void 0===e.count||""===e.count||e.count<0)return alert("闄嶇骇闃堝�间笉鑳戒负绌烘垨灏忎簬 0"),!1;if(null==e.timeWindow||""===e.timeWindow||e.timeWindow<=0)return alert("鐔旀柇鏃堕暱蹇呴』澶т簬 0s"),!1;if(null==e.minRequestAmount||e.minRequestAmount<=0)return alert("鏈�灏忚姹傛暟鐩渶澶т簬 0"),!1;if(null==e.statIntervalMs||e.statIntervalMs<=0)return alert("缁熻绐楀彛鏃堕暱闇�澶т簬 0s"),!1;if(void 0!==e.statIntervalMs&&12e4<e.statIntervalMs)return alert("缁熻绐楀彛鏃堕暱涓嶈兘瓒呰繃 120 鍒嗛挓"),!1;if(1==e.grade&&1<e.count)return alert("寮傚父姣旂巼瓒呭嚭鑼冨洿锛歔0.0 - 1.0]"),!1;if(0==e.grade){if(null==e.slowRatioThreshold)return alert("鎱㈣皟鐢ㄦ瘮鐜囦笉鑳戒负绌�"),!1;if(e.slowRatioThreshold<0||1<e.slowRatioThreshold)return alert("鎱㈣皟鐢ㄦ瘮鐜囪秴鍑鸿寖鍥达細[0.0 - 1.0]"),!1}return!0}}]),(app=angular.module("sentinelDashboardApp")).service("SystemService",["$http",function(a){this.queryMachineRules=function(e,t,r){return a({url:"system/rules.json",params:{app:e,ip:t,port:r},method:"GET"})},this.newRule=function(e){var t={app:e.app,ip:e.ip,port:e.port};return 0==e.grade?t.highestSystemLoad=e.highestSystemLoad:1==e.grade?t.avgRt=e.avgRt:2==e.grade?t.maxThread=e.maxThread:3==e.grade?t.qps=e.qps:4==e.grade&&(t.highestCpuUsage=e.highestCpuUsage),a({url:"/system/new.json",params:t,method:"GET"})},this.saveRule=function(e){var t={id:e.id};return 0==e.grade?t.highestSystemLoad=e.highestSystemLoad:1==e.grade?t.avgRt=e.avgRt:2==e.grade?t.maxThread=e.maxThread:3==e.grade?t.qps=e.qps:4==e.grade&&(t.highestCpuUsage=e.highestCpuUsage),a({url:"/system/save.json",params:t,method:"GET"})},this.deleteRule=function(e){var t={id:e.id,app:e.app};return a({url:"/system/delete.json",params:t,method:"GET"})}}]),(app=angular.module("sentinelDashboardApp")).service("MachineService",["$http","$httpParamSerializerJQLike",function(a,o){this.getAppMachines=function(e){return a({url:"app/"+e+"/machines.json",method:"GET"})},this.removeAppMachine=function(e,t,r){return a({url:"app/"+e+"/machine/remove.json",method:"POST",headers:{"Content-type":"application/x-www-form-urlencoded; charset=UTF-8"},data:o({ip:t,port:r})})}}]),(app=angular.module("sentinelDashboardApp")).service("IdentityService",["$http",function(a){this.fetchIdentityOfMachine=function(e,t,r){return a({url:"resource/machineResource.json",params:{ip:e,port:t,searchKey:r},method:"GET"})},this.fetchClusterNodeOfMachine=function(e,t,r){return a({url:"resource/machineResource.json",params:{ip:e,port:t,type:"cluster",searchKey:r},method:"GET"})}}]),(app=angular.module("sentinelDashboardApp")).service("MetricService",["$http",function(n){this.queryAppSortedIdentities=function(e){return n({url:"/metric/queryTopResourceMetric.json",params:e,method:"GET"})},this.queryByAppAndIdentity=function(e){return n({url:"/metric/queryByAppAndResource.json",params:e,method:"GET"})},this.queryByMachineAndIdentity=function(e,t,r,a,o){var l={ip:e,port:t,identity:r,startTime:a.getTime(),endTime:o.getTime()};return n({url:"/metric/queryByAppAndResource.json",params:l,method:"GET"})}}]),angular.module("sentinelDashboardApp").service("ParamFlowService",["$http",function(a){function o(e){return!("int"!==(r=e.classType)&&"double"!==r&&"float"!==r&&"long"!==r&&"short"!==r||void 0!==(t=e.object)&&""!==t&&!isNaN(t))||(!!("byte"===e.classType&&(a=e.object,o=-128,l=127,void 0===a||""===a||isNaN(a)||a<o||l<a))||(void 0===e.object||void 0===e.classType||(void 0===(n=e.count)||""===n||isNaN(n)||n<0)));var t,r,a,o,l,n}this.queryMachineRules=function(e,t,r){return a({url:"/paramFlow/rules",params:{app:e,ip:t,port:r},method:"GET"})},this.addNewRule=function(e){return a({url:"/paramFlow/rule",data:e,method:"POST"})},this.saveRule=function(e){return a({url:"/paramFlow/rule/"+e.id,data:e,method:"PUT"})},this.deleteRule=function(e){return a({url:"/paramFlow/rule/"+e.id,method:"DELETE"})},this.checkRuleValid=function(e){if(!e.resource||""===e.resource)return alert("璧勬簮鍚嶇О涓嶈兘涓虹┖"),!1;if(1!=e.grade)return alert("鏈煡鐨勯檺娴佹ā寮�"),!1;if(e.count<0)return alert("闄愭祦闃堝�煎繀椤诲ぇ浜庣瓑浜� 0"),!1;if(void 0===e.paramIdx||""===e.paramIdx||isNaN(e.paramIdx)||e.paramIdx<0)return alert("鐑偣鍙傛暟绱㈠紩蹇呴』澶т簬绛変簬 0"),!1;if(void 0!==e.paramFlowItemList)for(var t=0;t<e.paramFlowItemList.length;t++){var r=e.paramFlowItemList[t];if(o(r))return alert("鐑偣鍙傛暟渚嬪椤逛笉鍚堟硶锛岃妫�鏌ュ�煎拰绫诲瀷鏄惁姝g‘锛氬弬鏁颁负 "+r.object+", 绫诲瀷涓� "+r.classType+", 闄愭祦闃堝�间负 "+r.count),!1}return!0}}]),angular.module("sentinelDashboardApp").service("AuthorityRuleService",["$http",function(a){this.queryMachineRules=function(e,t,r){return a({url:"/authority/rules",params:{app:e,ip:t,port:r},method:"GET"})},this.addNewRule=function(e){return a({url:"/authority/rule",data:e,method:"POST"})},this.saveRule=function(e){return a({url:"/authority/rule/"+e.id,data:e,method:"PUT"})},this.deleteRule=function(e){return a({url:"/authority/rule/"+e.id,method:"DELETE"})},this.checkRuleValid=function(e){return void 0===e.resource||""===e.resource?(alert("璧勬簮鍚嶇О涓嶈兘涓虹┖"),!1):void 0===e.limitApp||""===e.limitApp?(alert("娴佹帶閽堝搴旂敤涓嶈兘涓虹┖"),!1):void 0!==e.strategy||(alert("蹇呴』閫夋嫨榛戠櫧鍚嶅崟妯″紡"),!1)}}]),angular.module("sentinelDashboardApp").service("ClusterStateService",["$http",function(a){this.fetchClusterUniversalStateSingle=function(e,t,r){return a({url:"/cluster/state_single",params:{app:e,ip:t,port:r},method:"GET"})},this.fetchClusterUniversalStateOfApp=function(e){return a({url:"/cluster/state/"+e,method:"GET"})},this.fetchClusterServerStateOfApp=function(e){return a({url:"/cluster/server_state/"+e,method:"GET"})},this.fetchClusterClientStateOfApp=function(e){return a({url:"/cluster/client_state/"+e,method:"GET"})},this.modifyClusterConfig=function(e){return a({url:"/cluster/config/modify_single",data:e,method:"POST"})},this.applyClusterFullAssignOfApp=function(e,t){return a({url:"/cluster/assign/all_server/"+e,data:t,method:"POST"})},this.applyClusterSingleServerAssignOfApp=function(e,t){return a({url:"/cluster/assign/single_server/"+e,data:t,method:"POST"})},this.applyClusterServerBatchUnbind=function(e,t){return a({url:"/cluster/assign/unbind_server/"+e,data:t,method:"POST"})}}]),(app=angular.module("sentinelDashboardApp")).service("GatewayApiService",["$http",function(a){this.queryApis=function(e,t,r){return a({url:"/gateway/api/list.json",params:{app:e,ip:t,port:r},method:"GET"})},this.newApi=function(e){return a({url:"/gateway/api/new.json",data:e,method:"POST"})},this.saveApi=function(e){return a({url:"/gateway/api/save.json",data:e,method:"POST"})},this.deleteApi=function(e){var t={id:e.id,app:e.app};return a({url:"/gateway/api/delete.json",params:t,method:"POST"})},this.checkApiValid=function(e,t){if(void 0===e.apiName||""===e.apiName)return alert("API鍚嶇О涓嶈兘涓虹┖"),!1;if(null==e.predicateItems||0===e.predicateItems.length)return alert("鑷冲皯鏈変竴涓尮閰嶈鍒�"),!1;for(var r=0;r<e.predicateItems.length;r++){var a=e.predicateItems[r].pattern;if(void 0===a||""===a)return alert("鍖归厤涓蹭笉鑳戒负绌猴紝璇锋鏌�"),!1}return-1===t.indexOf(e.apiName)||(alert("API鍚嶇О("+e.apiName+")宸插瓨鍦�"),!1)}}]),(app=angular.module("sentinelDashboardApp")).service("GatewayFlowService",["$http",function(a){this.queryRules=function(e,t,r){return a({url:"/gateway/flow/list.json",params:{app:e,ip:t,port:r},method:"GET"})},this.newRule=function(e){return a({url:"/gateway/flow/new.json",data:e,method:"POST"})},this.saveRule=function(e){return a({url:"/gateway/flow/save.json",data:e,method:"POST"})},this.deleteRule=function(e){var t={id:e.id,app:e.app};return a({url:"/gateway/flow/delete.json",params:t,method:"POST"})},this.checkRuleValid=function(e){if(void 0===e.resource||""===e.resource)return alert("API鍚嶇О涓嶈兘涓虹┖"),!1;if(null!=e.paramItem&&(2==e.paramItem.parseStrategy||3==e.paramItem.parseStrategy||4==e.paramItem.parseStrategy)){if(void 0===e.paramItem.fieldName||""===e.paramItem.fieldName)return alert("褰撳弬鏁板睘鎬т负Header銆乁RL鍙傛暟銆丆ookie鏃讹紝鍙傛暟鍚嶇О涓嶈兘涓虹┖"),!1;if(""===e.paramItem.pattern)return alert("鍖归厤涓蹭笉鑳戒负绌�"),!1}return!(void 0===e.count||e.count<0)||(alert((1===e.grade?"QPS闃堝��":"绾跨▼鏁�")+"蹇呴』澶т簬绛変簬 0"),!1)}}]);
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/dist/js/app.vendor.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/dist/js/app.vendor.js
new file mode 100644
index 0000000..4e60c32
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/dist/js/app.vendor.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("angular")):"function"==typeof define&&define.amd?define(["exports","angular"],t):t(e["@uirouter/angularjs"]={},e.angular)}(this,function(g,e){"use strict";var t=angular,C=e&&e.module?e:t;function u(n){var e=[].slice.apply(arguments,[1]),r=n.length;return function e(t){return t.length>=r?n.apply(null,t):function(){return e(t.concat([].slice.apply(arguments)))}}(e)}function n(){var n=arguments,r=n.length-1;return function(){for(var e=r,t=n[r].apply(this,arguments);e--;)t=n[e].call(this,t);return t}}function l(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return n.apply(null,[].slice.call(arguments).reverse())}var w=function(t){return function(e){return e&&e[t]}},v=u(function(e,t,n){return n&&n[e]===t}),S=function(e){return l.apply(null,e.split(".").map(w))},d=function(n){return function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return!n.apply(null,e)}};function r(n,r){return function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return n.apply(null,e)&&r.apply(null,e)}}function i(n,r){return function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return n.apply(null,e)||r.apply(null,e)}}var c=function(n){return function(e){return e.reduce(function(e,t){return e&&!!n(t)},!0)}},p=function(n){return function(e){return e.reduce(function(e,t){return e||!!n(t)},!1)}},h=function(t){return function(e){return null!=e&&e.constructor===t||e instanceof t}},o=function(t){return function(e){return t===e}},f=function(e){return function(){return e}};function a(t,n){return function(e){return e[t].apply(e,n)}}function m(n){return function(e){for(var t=0;t<n.length;t++)if(n[t][0](e))return n[t][1](e)}}var s=Object.prototype.toString,y=function(t){return function(e){return typeof e===t}},b=y("undefined"),k=d(b),$=function(e){return null===e},_=i($,b),D=y("function"),x=y("number"),O=y("string"),T=function(e){return null!==e&&"object"==typeof e},E=Array.isArray,A=function(e){return"[object Date]"===s.call(e)},P=function(e){return"[object RegExp]"===s.call(e)};function M(e){if(E(e)&&e.length){var t=e.slice(0,-1),n=e.slice(-1);return!(t.filter(d(O)).length||n.filter(d(D)).length)}return D(e)}var R=r(T,l(w("then"),D)),I=function(e){return function(){throw new Error(e+"(): No coreservices implementation for UI-Router is loaded.")}},V={$q:void 0,$injector:void 0},F="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||void 0,L=F.angular||{},j=L.fromJson||JSON.parse.bind(JSON),H=L.toJson||JSON.stringify.bind(JSON),Y=L.forEach||function(t,n,e){if(E(t))return t.forEach(n,e);Object.keys(t).forEach(function(e){return n(t[e],e)})},N=Object.assign||Oe,q=L.equals||Te;function U(e){return e}function z(){}function B(t,r,n,e,i){void 0===i&&(i=!1);var o=function(e){return t()[e].bind(n())};return(e=e||Object.keys(t())).reduce(function(e,t){var n;return e[t]=i?(n=t,function(){return r[n]=o(n),r[n].apply(null,arguments)}):o(t),e},r)}var W=function(e,t){return N(Object.create(e),t)},G=u(K);function K(e,t){return-1!==e.indexOf(t)}var Q=u(Z);function Z(e,t){var n=e.indexOf(t);return 0<=n&&e.splice(n,1),e}var X=u(J);function J(e,t){return e.push(t),t}var ee=function(t){return t.slice().forEach(function(e){"function"==typeof e&&e(),Q(t,e)})};function te(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];var r=N.apply(void 0,[{}].concat(t.reverse()));return N(r,ie(e||{},Object.keys(r)))}var ne=function(e,t){return N(e,t)};function re(e,t){var n=[];for(var r in e.path){if(e.path[r]!==t.path[r])break;n.push(e.path[r])}return n}function ie(e,t){var n={};for(var r in e)-1!==t.indexOf(r)&&(n[r]=e[r]);return n}function oe(n,e){return Object.keys(n).filter(d(G(e))).reduce(function(e,t){return e[t]=n[t],e},{})}function ae(e,t){return ce(e,w(t))}function se(e,n){var t=E(e),r=t?[]:{},i=t?function(e){return r.push(e)}:function(e,t){return r[t]=e};return Y(e,function(e,t){n(e,t)&&i(e,t)}),r}function le(e,n){var r;return Y(e,function(e,t){r||n(e,t)&&(r=e)}),r}var ue=ce;function ce(e,n,r){return r=r||(E(e)?[]:{}),Y(e,function(e,t){return r[t]=n(e,t)}),r}var de=function(t){return Object.keys(t).map(function(e){return t[e]})},pe=function(e,t){return e&&t},he=function(e,t){return e||t},fe=function(e,t){return e.concat(t)},ge=function(e,t){return E(t)?e.concat(t.reduce(ge,[])):me(e,t)};function me(e,t){return e.push(t),e}var ve=function(e,t){return G(e,t)?e:me(e,t)},ye=function(e){return e.reduce(fe,[])},we=function(e){return e.reduce(ge,[])},be=_e,$e=_e;function _e(n,r){return void 0===r&&(r="assert failure"),function(e){var t=n(e);if(!t)throw new Error(D(r)?r(e):r);return t}}var Ce=function(t){return Object.keys(t).map(function(e){return[e,t[e]]})};function Se(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];if(0===e.length)return[];for(var n=e.reduce(function(e,t){return Math.min(t.length,e)},9007199254740991),r=[],i=function(t){switch(e.length){case 1:r.push([e[0][t]]);break;case 2:r.push([e[0][t],e[1][t]]);break;case 3:r.push([e[0][t],e[1][t],e[2][t]]);break;case 4:r.push([e[0][t],e[1][t],e[2][t],e[3][t]]);break;default:r.push(e.map(function(e){return e[t]}))}},o=0;o<n;o++)i(o);return r}function ke(e,t){var n,r;if(E(t)&&(n=t[0],r=t[1]),!O(n))throw new Error("invalid parameters to applyPairs");return e[n]=r,e}function De(e){return e.length&&e[e.length-1]||void 0}function xe(e,t){return t&&Object.keys(t).forEach(function(e){return delete t[e]}),t||(t={}),N(t,e)}function Oe(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];if(n)for(var r=Object.keys(n),i=0;i<r.length;i++)e[r[i]]=n[r[i]]}return e}function Te(e,t){if(e===t)return!0;if(null===e||null===t)return!1;if(e!=e&&t!=t)return!0;var n=typeof e;if(n!==typeof t||"object"!==n)return!1;var r,i,o=[e,t];if(c(E)(o))return i=t,(r=e).length===i.length&&Se(r,i).reduce(function(e,t){return e&&Te(t[0],t[1])},!0);if(c(A)(o))return e.getTime()===t.getTime();if(c(P)(o))return e.toString()===t.toString();if(c(D)(o))return!0;if([D,E,A,P].map(p).reduce(function(e,t){return e||!!t(o)},!1))return!1;var a={};for(var s in e){if(!Te(e[s],t[s]))return!1;a[s]=!0}for(var s in t)if(!a[s])return!1;return!0}var Ee,Ae=function(e){return e.catch(function(e){return 0})&&e},Pe=function(e){return Ae(V.$q.reject(e))},Me=function(){function t(e){this.text=e,this.glob=e.split(".");var t=this.text.split(".").map(function(e){return"**"===e?"(?:|(?:\\.[^.]*)*)":"*"===e?"\\.[^.]*":"\\."+e}).join("");this.regexp=new RegExp("^"+t+"$")}return t.is=function(e){return!!/[!,*]+/.exec(e)},t.fromString=function(e){return t.is(e)?new t(e):null},t.prototype.matches=function(e){return this.regexp.test("."+e)},t}(),Re=function(){function e(e,t){void 0===e&&(e=[]),void 0===t&&(t=null),this._items=e,this._limit=t,this._evictListeners=[],this.onEvict=X(this._evictListeners)}return e.prototype.enqueue=function(e){var t=this._items;return t.push(e),this._limit&&t.length>this._limit&&this.evict(),e},e.prototype.evict=function(){var t=this._items.shift();return this._evictListeners.forEach(function(e){return e(t)}),t},e.prototype.dequeue=function(){if(this.size())return this._items.splice(0,1)[0]},e.prototype.clear=function(){var e=this._items;return this._items=[],e},e.prototype.size=function(){return this._items.length},e.prototype.remove=function(e){var t=this._items.indexOf(e);return-1<t&&this._items.splice(t,1)[0]},e.prototype.peekTail=function(){return this._items[this._items.length-1]},e.prototype.peekHead=function(){if(this.size())return this._items[0]},e}();(Ee=g.RejectType||(g.RejectType={}))[Ee.SUPERSEDED=2]="SUPERSEDED",Ee[Ee.ABORTED=3]="ABORTED",Ee[Ee.INVALID=4]="INVALID",Ee[Ee.IGNORED=5]="IGNORED",Ee[Ee.ERROR=6]="ERROR";var Ie=0,Ve=function(){function r(e,t,n){this.$id=Ie++,this.type=e,this.message=t,this.detail=n}return r.isRejectionPromise=function(e){return e&&"function"==typeof e.then&&h(r)(e._transitionRejection)},r.superseded=function(e,t){var n=new r(g.RejectType.SUPERSEDED,"The transition has been superseded by a different transition",e);return t&&t.redirected&&(n.redirected=!0),n},r.redirected=function(e){return r.superseded(e,{redirected:!0})},r.invalid=function(e){return new r(g.RejectType.INVALID,"This transition is invalid",e)},r.ignored=function(e){return new r(g.RejectType.IGNORED,"The transition was ignored",e)},r.aborted=function(e){return new r(g.RejectType.ABORTED,"The transition has been aborted",e)},r.errored=function(e){return new r(g.RejectType.ERROR,"The transition errored",e)},r.normalize=function(e){return h(r)(e)?e:r.errored(e)},r.prototype.toString=function(){var e,t=(e=this.detail)&&e.toString!==Object.prototype.toString?e.toString():Ue(e);return"Transition Rejection($id: "+this.$id+" type: "+this.type+", message: "+this.message+", detail: "+t+")"},r.prototype.toPromise=function(){return N(Pe(this),{_transitionRejection:this})},r}();function Fe(e,t){return t.length<=e?t:t.substr(0,e-3)+"..."}function Le(e,t){for(;t.length<e;)t+=" ";return t}function je(e){return e.replace(/^([A-Z])/,function(e){return e.toLowerCase()}).replace(/([A-Z])/g,function(e){return"-"+e.toLowerCase()})}function He(e){var t=Ye(e),n=t.match(/^(function [^ ]+\([^)]*\))/),r=n?n[1]:t,i=e.name||"";return i&&r.match(/function \(/)?"function "+i+r.substr(9):r}function Ye(e){var t=E(e)?e.slice(-1)[0]:e;return t&&t.toString()||"undefined"}var Ne=Ve.isRejectionPromise,qe=m([[b,f("undefined")],[$,f("null")],[R,f("[Promise]")],[Ne,function(e){return e._transitionRejection.toString()}],[function(e){return T(e)&&!E(e)&&e.constructor!==Object&&D(e.toString)},function(e){return e.toString()}],[M,He],[f(!0),U]]);function Ue(e){var t=[];function n(e){if(T(e)){if(-1!==t.indexOf(e))return"[circular ref]";t.push(e)}return qe(e)}return b(e)?n(e):JSON.stringify(e,function(e,t){return n(t)}).replace(/\\"/g,'"')}var ze=function(n){return function(e){if(!e)return["",""];var t=e.indexOf(n);return-1===t?[e,""]:[e.substr(0,t),e.substr(t+1)]}},Be=new RegExp("^(?:[a-z]+:)?//[^/]+/"),We=function(e){return e.replace(/\/[^/]*$/,"")},Ge=ze("#"),Ke=ze("?"),Qe=ze("="),Ze=function(e){return e?e.replace(/^#/,""):""};function Xe(e){var t=new RegExp("("+e+")","g");return function(e){return e.split(t).filter(U)}}function Je(e,t){return O(De(e))&&O(t)?e.slice(0,-1).concat(De(e)+t):me(e,t)}function et(e){if(!e)return"ui-view (defunct)";var t=e.creationContext?e.creationContext.name||"(root)":"(none)";return"[ui-view#"+e.id+" "+e.$type+":"+e.fqn+" ("+e.name+"@"+t+")]"}function tt(e){return x(e)?g.Category[e]:g.Category[g.Category[e]]}var nt,rt=Function.prototype.bind.call(console.log,console),it=D(console.table)?console.table.bind(console):rt.bind(console);(nt=g.Category||(g.Category={}))[nt.RESOLVE=0]="RESOLVE",nt[nt.TRANSITION=1]="TRANSITION",nt[nt.HOOK=2]="HOOK",nt[nt.UIVIEW=3]="UIVIEW",nt[nt.VIEWCONFIG=4]="VIEWCONFIG";var ot=S("$id"),at=S("router.$id"),st=function(e){return"Transition #"+ot(e)+"-"+at(e)},lt=function(){function e(){this._enabled={},this.approximateDigests=0}return e.prototype._set=function(t,e){var n=this;e.length||(e=Object.keys(g.Category).map(function(e){return parseInt(e,10)}).filter(function(e){return!isNaN(e)}).map(function(e){return g.Category[e]})),e.map(tt).forEach(function(e){return n._enabled[e]=t})},e.prototype.enable=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this._set(!0,e)},e.prototype.disable=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this._set(!1,e)},e.prototype.enabled=function(e){return!!this._enabled[tt(e)]},e.prototype.traceTransitionStart=function(e){this.enabled(g.Category.TRANSITION)&&console.log(st(e)+": Started  -> "+Ue(e))},e.prototype.traceTransitionIgnored=function(e){this.enabled(g.Category.TRANSITION)&&console.log(st(e)+": Ignored  <> "+Ue(e))},e.prototype.traceHookInvocation=function(e,t,n){if(this.enabled(g.Category.HOOK)){var r=S("traceData.hookType")(n)||"internal",i=S("traceData.context.state.name")(n)||S("traceData.context")(n)||"unknown",o=He(e.registeredHook.callback);console.log(st(t)+":   Hook -> "+r+" context: "+i+", "+Fe(200,o))}},e.prototype.traceHookResult=function(e,t,n){this.enabled(g.Category.HOOK)&&console.log(st(t)+":   <- Hook returned: "+Fe(200,Ue(e)))},e.prototype.traceResolvePath=function(e,t,n){this.enabled(g.Category.RESOLVE)&&console.log(st(n)+":         Resolving "+e+" ("+t+")")},e.prototype.traceResolvableResolved=function(e,t){this.enabled(g.Category.RESOLVE)&&console.log(st(t)+":               <- Resolved  "+e+" to: "+Fe(200,Ue(e.data)))},e.prototype.traceError=function(e,t){this.enabled(g.Category.TRANSITION)&&console.log(st(t)+": <- Rejected "+Ue(t)+", reason: "+e)},e.prototype.traceSuccess=function(e,t){this.enabled(g.Category.TRANSITION)&&console.log(st(t)+": <- Success  "+Ue(t)+", final state: "+e.name)},e.prototype.traceUIViewEvent=function(e,t,n){void 0===n&&(n=""),this.enabled(g.Category.UIVIEW)&&console.log("ui-view: "+Le(30,e)+" "+et(t)+n)},e.prototype.traceUIViewConfigUpdated=function(e,t){this.enabled(g.Category.UIVIEW)&&this.traceUIViewEvent("Updating",e," with ViewConfig from context='"+t+"'")},e.prototype.traceUIViewFill=function(e,t){this.enabled(g.Category.UIVIEW)&&this.traceUIViewEvent("Fill",e," with: "+Fe(200,t))},e.prototype.traceViewSync=function(e){if(this.enabled(g.Category.VIEWCONFIG)){var a="uiview component fqn",t=e.map(function(e){var t,n=e.uiView,r=e.viewConfig,i=n&&n.fqn,o=r&&r.viewDecl.$context.name+": ("+r.viewDecl.$name+")";return(t={})[a]=i,t["view config state (view name)"]=o,t}).sort(function(e,t){return(e[a]||"").localeCompare(t[a]||"")});it(t)}},e.prototype.traceViewServiceEvent=function(e,t){var n,r,i;this.enabled(g.Category.VIEWCONFIG)&&console.log("VIEWCONFIG: "+e+" "+(r=(n=t).viewDecl,i=r.$context.name||"(root)","[View#"+n.$id+" from '"+i+"' state]: target ui-view: '"+r.$uiViewName+"@"+r.$uiViewContextAnchor+"'"))},e.prototype.traceViewServiceUIViewEvent=function(e,t){this.enabled(g.Category.VIEWCONFIG)&&console.log("VIEWCONFIG: "+e+" "+et(t))},e}(),ut=new lt,ct=function(){function e(e){this.pattern=/.*/,this.inherit=!0,N(this,e)}return e.prototype.is=function(e,t){return!0},e.prototype.encode=function(e,t){return e},e.prototype.decode=function(e,t){return e},e.prototype.equals=function(e,t){return e==t},e.prototype.$subPattern=function(){var e=this.pattern.toString();return e.substr(1,e.length-2)},e.prototype.toString=function(){return"{ParamType:"+this.name+"}"},e.prototype.$normalize=function(e){return this.is(e)?e:this.decode(e)},e.prototype.$asArray=function(e,t){if(!e)return this;if("auto"===e&&!t)throw new Error("'auto' array mode is for query parameters only");return new dt(this,e)},e}();function dt(r,i){var o=this;function a(e){return E(e)?e:k(e)?[e]:[]}function s(n,r){return function(e){if(E(e)&&0===e.length)return e;var t=ce(a(e),n);return!0===r?0===se(t,function(e){return!e}).length:function(e){switch(e.length){case 0:return;case 1:return"auto"===i?e[0]:e;default:return e}}(t)}}function l(o){return function(e,t){var n=a(e),r=a(t);if(n.length!==r.length)return!1;for(var i=0;i<n.length;i++)if(!o(n[i],r[i]))return!1;return!0}}["encode","decode","equals","$normalize"].forEach(function(e){var t=r[e].bind(r),n="equals"===e?l:s;o[e]=n(t)}),N(this,{dynamic:r.dynamic,name:r.name,pattern:r.pattern,inherit:r.inherit,raw:r.raw,is:s(r.is.bind(r),!0),$arrayMode:i})}var pt,ht=Object.prototype.hasOwnProperty,ft=function(e){return 0===["value","type","squash","array","dynamic"].filter(ht.bind(e||{})).length};function gt(e,t,n){var r=!1===n.reloadOnSearch&&t===g.DefType.SEARCH||void 0,i=[n.dynamic,r].find(k),o=k(i)?{dynamic:i}:{},a=function(e){function t(){return e.value}e=ft(e)?{value:e}:e,t.__cacheable=!0;var n=M(e.value)?e.value:t;return N(e,{$$fn:n})}(n&&n.params&&n.params[e]);return N(o,a)}(pt=g.DefType||(g.DefType={}))[pt.PATH=0]="PATH",pt[pt.SEARCH=1]="SEARCH",pt[pt.CONFIG=2]="CONFIG";var mt,vt=function(){function r(e,t,n,r,i){var o=gt(e,n,i);t=function(e,t,n,r,i){if(e.type&&t&&"string"!==t.name)throw new Error("Param '"+r+"' has two type configurations.");if(e.type&&t&&"string"===t.name&&i.type(e.type))return i.type(e.type);if(t)return t;if(e.type)return e.type instanceof ct?e.type:i.type(e.type);var o=n===g.DefType.CONFIG?"any":n===g.DefType.PATH?"path":n===g.DefType.SEARCH?"query":"string";return i.type(o)}(o,t,n,e,r.paramTypes);var a,s,l=(a={array:n===g.DefType.SEARCH&&"auto"},s=e.match(/\[\]$/)?{array:!0}:{},N(a,s,o).array);t=l?t.$asArray(l,n===g.DefType.SEARCH):t;var u=void 0!==o.value||n===g.DefType.SEARCH,c=k(o.dynamic)?!!o.dynamic:!!t.dynamic,d=k(o.raw)?!!o.raw:!!t.raw,p=function(e,t,n){var r=e.squash;if(!t||!1===r)return!1;if(!k(r)||null==r)return n;if(!0===r||O(r))return r;throw new Error("Invalid squash policy: '"+r+"'. Valid policies: false, true, or arbitrary string")}(o,u,r.defaultSquashPolicy()),h=function(e,t,n,r){var i=[{from:"",to:n||t?void 0:""},{from:null,to:n||t?void 0:""}],o=E(e.replace)?e.replace:[];O(r)&&o.push({from:r,to:void 0});var a=ce(o,w("from"));return se(i,function(e){return-1===a.indexOf(e.from)}).concat(o)}(o,l,u,p),f=k(o.inherit)?!!o.inherit:!!t.inherit;N(this,{id:e,type:t,location:n,isOptional:u,dynamic:c,raw:d,squash:p,replace:h,inherit:f,array:l,config:o})}return r.values=function(e,t){void 0===t&&(t={});for(var n={},r=0,i=e;r<i.length;r++){var o=i[r];n[o.id]=o.value(t[o.id])}return n},r.changed=function(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),e.filter(function(e){return!e.type.equals(t[e.id],n[e.id])})},r.equals=function(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),0===r.changed(e,t,n).length},r.validates=function(e,t){return void 0===t&&(t={}),e.map(function(e){return e.validates(t[e.id])}).reduce(pe,!0)},r.prototype.isDefaultValue=function(e){return this.isOptional&&this.type.equals(this.value(),e)},r.prototype.value=function(e){var i=this;return e=function(e){for(var t=0,n=i.replace;t<n.length;t++){var r=n[t];if(r.from===e)return r.to}return e}(e),b(e)?function(){if(i._defaultValueCache)return i._defaultValueCache.defaultValue;if(!V.$injector)throw new Error("Injectable functions cannot be called at configuration time");var e=V.$injector.invoke(i.config.$$fn);if(null!=e&&!i.type.is(e))throw new Error("Default value ("+e+") for parameter '"+i.id+"' is not an instance of ParamType ("+i.type.name+")");return i.config.$$fn.__cacheable&&(i._defaultValueCache={defaultValue:e}),e}():this.type.$normalize(e)},r.prototype.isSearch=function(){return this.location===g.DefType.SEARCH},r.prototype.validates=function(e){if((b(e)||null===e)&&this.isOptional)return!0;var t=this.type.$normalize(e);if(!this.type.is(t))return!1;var n=this.type.encode(t);return!(O(n)&&!this.type.pattern.exec(n))},r.prototype.toString=function(){return"{Param:"+this.id+" "+this.type+" squash: '"+this.squash+"' optional: "+this.isOptional+"}"},r}(),yt=function(){function e(){this.enqueue=!0,this.typeQueue=[],this.defaultTypes=ie(e.prototype,["hash","string","query","path","int","bool","date","json","any"]);this.types=W(ce(this.defaultTypes,function(e,t){return new ct(N({name:t},e))}),{})}return e.prototype.dispose=function(){this.types={}},e.prototype.type=function(e,t,n){if(!k(t))return this.types[e];if(this.types.hasOwnProperty(e))throw new Error("A type named '"+e+"' has already been defined.");return this.types[e]=new ct(N({name:e},t)),n&&(this.typeQueue.push({name:e,def:n}),this.enqueue||this._flushTypeQueue()),this},e.prototype._flushTypeQueue=function(){for(;this.typeQueue.length;){var e=this.typeQueue.shift();if(e.pattern)throw new Error("You cannot override a type's .pattern at runtime.");N(this.types[e.name],V.$injector.invoke(e.def))}},e}();mt=function(e){var t=function(e){return null!=e?e.toString():e},n={encode:t,decode:t,is:h(String),pattern:/.*/,equals:function(e,t){return e==t}};return N({},n,e)},N(yt.prototype,{string:mt({}),path:mt({pattern:/[^/]*/}),query:mt({}),hash:mt({inherit:!1}),int:mt({decode:function(e){return parseInt(e,10)},is:function(e){return!_(e)&&this.decode(e.toString())===e},pattern:/-?\d+/}),bool:mt({encode:function(e){return e?1:0},decode:function(e){return 0!==parseInt(e,10)},is:h(Boolean),pattern:/0|1/}),date:mt({encode:function(e){return this.is(e)?[e.getFullYear(),("0"+(e.getMonth()+1)).slice(-2),("0"+e.getDate()).slice(-2)].join("-"):void 0},decode:function(e){if(this.is(e))return e;var t=this.capture.exec(e);return t?new Date(t[1],t[2]-1,t[3]):void 0},is:function(e){return e instanceof Date&&!isNaN(e.valueOf())},equals:function(n,r){return["getFullYear","getMonth","getDate"].reduce(function(e,t){return e&&n[t]()===r[t]()},!0)},pattern:/[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-2][0-9]|3[0-1])/,capture:/([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/}),json:mt({encode:H,decode:j,is:h(Object),equals:q,pattern:/[^/]*/}),any:mt({encode:U,decode:U,is:function(){return!0},equals:q})});var wt=function(){function e(e){void 0===e&&(e={}),N(this,e)}return e.prototype.$inherit=function(e,t,n){var r,i=re(t,n),o={},a=[];for(var s in i)if(i[s]&&i[s].params&&(r=Object.keys(i[s].params)).length)for(var l in r)0<=a.indexOf(r[l])||(a.push(r[l]),o[r[l]]=this[r[l]]);return N({},o,e)},e}(),bt=function(){function r(e){if(e instanceof r){var t=e;this.state=t.state,this.paramSchema=t.paramSchema.slice(),this.paramValues=N({},t.paramValues),this.resolvables=t.resolvables.slice(),this.views=t.views&&t.views.slice()}else{var n=e;this.state=n,this.paramSchema=n.parameters({inherit:!1}),this.paramValues={},this.resolvables=n.resolvables.map(function(e){return e.clone()})}}return r.prototype.clone=function(){return new r(this)},r.prototype.applyRawParams=function(r){return this.paramValues=this.paramSchema.reduce(function(e,t){return ke(e,[(n=t).id,n.value(r[n.id])]);var n},{}),this},r.prototype.parameter=function(e){return le(this.paramSchema,v("id",e))},r.prototype.equals=function(e,t){var n=this.diff(e,t);return n&&0===n.length},r.prototype.diff=function(e,t){if(this.state!==e.state)return!1;var n=t?t(this):this.paramSchema;return vt.changed(n,this.paramValues,e.paramValues)},r.clone=function(e){return e.clone()},r}(),$t=function(){function r(e,t,n,r){this._stateRegistry=e,this._identifier=t,this._identifier=t,this._params=N({},n||{}),this._options=N({},r||{}),this._definition=e.matcher.find(t,this._options.relative)}return r.prototype.name=function(){return this._definition&&this._definition.name||this._identifier},r.prototype.identifier=function(){return this._identifier},r.prototype.params=function(){return this._params},r.prototype.$state=function(){return this._definition},r.prototype.state=function(){return this._definition&&this._definition.self},r.prototype.options=function(){return this._options},r.prototype.exists=function(){return!(!this._definition||!this._definition.self)},r.prototype.valid=function(){return!this.error()},r.prototype.error=function(){var e=this.options().relative;if(this._definition||!e)return this._definition?this._definition.self?void 0:"State '"+this.name()+"' has an invalid definition":"No such state '"+this.name()+"'";var t=e.name?e.name:e;return"Could not resolve '"+this.name()+"' from state '"+t+"'"},r.prototype.toString=function(){return"'"+this.name()+"'"+Ue(this.params())},r.prototype.withState=function(e){return new r(this._stateRegistry,e,this._params,this._options)},r.prototype.withParams=function(e,t){void 0===t&&(t=!1);var n=t?e:N({},this._params,e);return new r(this._stateRegistry,this._identifier,n,this._options)},r.prototype.withOptions=function(e,t){void 0===t&&(t=!1);var n=t?e:N({},this._options,e);return new r(this._stateRegistry,this._identifier,this._params,n)},r.isDef=function(e){return e&&e.state&&(O(e.state)||O(e.state.name))},r}(),_t=function(){function p(){}return p.makeTargetState=function(e,t){var n=De(t).state;return new $t(e,n,t.map(w("paramValues")).reduce(ne,{}),{})},p.buildPath=function(e){var t=e.params();return e.$state().path.map(function(e){return new bt(e).applyRawParams(t)})},p.buildToPath=function(e,t){var n=p.buildPath(t);return t.options().inherit?p.inheritParams(e,n,Object.keys(t.params())):n},p.applyViewConfigs=function(i,o,t){o.filter(function(e){return G(t,e.state)}).forEach(function(t){var e=de(t.state.views||{}),n=p.subPath(o,function(e){return e===t}),r=e.map(function(e){return i.createViewConfig(n,e)});t.views=r.reduce(fe,[])})},p.inheritParams=function(l,e,u){void 0===u&&(u=[]);var c=l.map(function(e){return e.paramSchema}).reduce(fe,[]).filter(function(e){return!e.inherit}).map(w("id"));return e.map(function(e){var t=N({},e&&e.paramValues),n=ie(t,u);t=oe(t,u);var r,i,o,a=oe((r=l,i=e.state,o=le(r,v("state",i)),N({},o&&o.paramValues)||{}),c),s=N(t,a,n);return new bt(e.state).applyRawParams(s)})},p.treeChanges=function(e,r,t){for(var n,i,o,a,s,l,u=Math.min(e.length,r.length),c=0;c<u&&e[c].state!==t&&(n=e[c],i=r[c],n.equals(i,p.nonDynamicParams));)c++;a=(o=e).slice(0,c),s=o.slice(c);var d=a.map(function(e,t){var n=e.clone();return n.paramValues=r[t].paramValues,n});return l=r.slice(c),{from:o,to:d.concat(l),retained:a,retainedWithToParams:d,exiting:s,entering:l}},p.matching=function(e,t,i){var o=!1;return Se(e,t).reduce(function(e,t){var n=t[0],r=t[1];return(o=o||!n.equals(r,i))?e:e.concat(n)},[])},p.equals=function(e,t,n){return e.length===t.length&&p.matching(e,t,n).length===e.length},p.subPath=function(e,t){var n=le(e,t),r=e.indexOf(n);return-1===r?void 0:e.slice(0,r+1)},p.nonDynamicParams=function(e){return e.state.parameters({inherit:!1}).filter(function(e){return!e.dynamic})},p.paramValues=function(e){return e.reduce(function(e,t){return N(e,t.paramValues)},{})},p}(),Ct={when:{LAZY:"LAZY",EAGER:"EAGER"},async:{WAIT:"WAIT",NOWAIT:"NOWAIT",RXWAIT:"RXWAIT"}},St={when:"LAZY",async:"WAIT"},kt=function(){function a(e,t,n,r,i){if(this.resolved=!1,this.promise=void 0,e instanceof a)N(this,e);else if(D(t)){if(_(e))throw new Error("new Resolvable(): token argument is required");if(!D(t))throw new Error("new Resolvable(): resolveFn argument must be a function");this.token=e,this.policy=r,this.resolveFn=t,this.deps=n||[],this.data=i,this.resolved=void 0!==i,this.promise=this.resolved?V.$q.when(this.data):void 0}else if(T(e)&&e.token&&(e.hasOwnProperty("resolveFn")||e.hasOwnProperty("data"))){var o=e;return new a(o.token,o.resolveFn,o.deps,o.policy,o.data)}}return a.prototype.getPolicy=function(e){var t=this.policy||{},n=e&&e.resolvePolicy||{};return{when:t.when||n.when||St.when,async:t.async||n.async||St.async}},a.prototype.resolve=function(t,n){var r=this,e=V.$q,i=t.findNode(this),o=i&&i.state,a="RXWAIT"===this.getPolicy(o).async?function(e){var t=e.cache(1);return t.take(1).toPromise().then(function(){return t})}:U;return this.promise=e.when().then(function(){return e.all(t.getDependencies(r).map(function(e){return e.get(t,n)}))}).then(function(e){return r.resolveFn.apply(null,e)}).then(a).then(function(e){return r.data=e,r.resolved=!0,r.resolveFn=null,ut.traceResolvableResolved(r,n),r.data})},a.prototype.get=function(e,t){return this.promise||this.resolve(e,t)},a.prototype.toString=function(){return"Resolvable(token: "+Ue(this.token)+", requires: ["+this.deps.map(Ue)+"])"},a.prototype.clone=function(){return new a(this)},a.fromData=function(e,t){return new a(e,function(){return t},null,null,t)},a}(),Dt=Ct.when,xt=[Dt.EAGER,Dt.LAZY],Ot=[Dt.EAGER],Tt="Native Injector",Et=function(){function e(e){this._path=e}return e.prototype.getTokens=function(){return this._path.reduce(function(e,t){return e.concat(t.resolvables.map(function(e){return e.token}))},[]).reduce(ve,[])},e.prototype.getResolvable=function(t){return De(this._path.map(function(e){return e.resolvables}).reduce(fe,[]).filter(function(e){return e.token===t}))},e.prototype.getPolicy=function(e){var t=this.findNode(e);return e.getPolicy(t.state)},e.prototype.subContext=function(t){return new e(_t.subPath(this._path,function(e){return e.state===t}))},e.prototype.addResolvables=function(e,t){var n=le(this._path,v("state",t)),r=e.map(function(e){return e.token});n.resolvables=n.resolvables.filter(function(e){return-1===r.indexOf(e.token)}).concat(e)},e.prototype.resolvePath=function(e,s){var l=this;void 0===e&&(e="LAZY");var u=(G(xt,e)?e:"LAZY")===Ct.when.EAGER?Ot:xt;ut.traceResolvePath(this._path,e,s);var c=function(t,n){return function(e){return G(t,l.getPolicy(e)[n])}},t=this._path.reduce(function(e,t){var n=t.resolvables.filter(c(u,"when")),r=n.filter(c(["NOWAIT"],"async")),i=n.filter(d(c(["NOWAIT"],"async"))),o=l.subContext(t.state),a=function(t){return t.get(o,s).then(function(e){return{token:t.token,value:e}})};return r.forEach(a),e.concat(i.map(a))},[]);return V.$q.all(t)},e.prototype.injector=function(){return this._injector||(this._injector=new At(this))},e.prototype.findNode=function(t){return le(this._path,function(e){return G(e.resolvables,t)})},e.prototype.getDependencies=function(t){var r=this,n=this.findNode(t),i=(_t.subPath(this._path,function(e){return e===n})||this._path).reduce(function(e,t){return e.concat(t.resolvables)},[]).filter(function(e){return e!==t});return t.deps.map(function(t){var e=i.filter(function(e){return e.token===t});if(e.length)return De(e);var n=r.injector().getNative(t);if(b(n))throw new Error("Could not find Dependency Injection token: "+Ue(t));return new kt(t,function(){return n},[],n)})},e}(),At=function(){function e(e){this.context=e,this.native=this.get(Tt)||V.$injector}return e.prototype.get=function(e){var t=this.context.getResolvable(e);if(t){if("NOWAIT"===this.context.getPolicy(t).async)return t.get(this.context);if(!t.resolved)throw new Error("Resolvable async .get() not complete:"+Ue(t.token));return t.data}return this.getNative(e)},e.prototype.getAsync=function(e){var t=this.context.getResolvable(e);return t?t.get(this.context):V.$q.when(this.native.get(e))},e.prototype.getNative=function(e){return this.native&&this.native.get(e)},e}();function Pt(e){return e.name}function Mt(e){return e.self.$$state=function(){return e},e.self}function Rt(e){return e.parent&&e.parent.data&&(e.data=e.self.data=W(e.parent.data,e.data)),e.data}var It=function(o,a){return function(e){var t=e.self;t&&t.url&&t.name&&t.name.match(/\.\*\*$/)&&(t.url+="{remainder:any}");var n=e.parent,r=function(e){if(!O(e))return!1;var t="^"===e.charAt(0);return{val:t?e.substring(1):e,root:t}}(t.url),i=r?o.compile(r.val,{state:t}):t.url;if(!i)return null;if(!o.isMatcher(i))throw new Error("Invalid url '"+i+"' in state '"+e+"'");return r&&r.root?i:(n&&n.navigable||a()).url.append(i)}};function Vt(e){return e.parent?e.parent.path.concat(e):[e]}function Ft(e){var t=e.parent?N({},e.parent.includes):{};return t[e.name]=!0,t}function Lt(e){var t,n,r=function(e){return e.provide||e.token},i=m([[w("resolveFn"),function(e){return new kt(r(e),e.resolveFn,e.deps,e.policy)}],[w("useFactory"),function(e){return new kt(r(e),e.useFactory,e.deps||e.dependencies,e.policy)}],[w("useClass"),function(e){return new kt(r(e),function(){return new e.useClass},[],e.policy)}],[w("useValue"),function(e){return new kt(r(e),function(){return e.useValue},[],e.policy,e.useValue)}],[w("useExisting"),function(e){return new kt(r(e),U,[e.useExisting],e.policy)}]]),o=m([[l(w("val"),O),function(e){return new kt(e.token,U,[e.val],e.policy)}],[l(w("val"),E),function(e){return new kt(e.token,De(e.val),e.val.slice(0,-1),e.policy)}],[l(w("val"),D),function(e){return new kt(e.token,e.val,(t=e.val,n=V.$injector,t.$inject||n&&n.annotate(t,n.strictDi)||"deferred"),e.policy);var t,n}]]),a=m([[h(kt),function(e){return e}],[function(e){return!(!e.token||!e.resolveFn)},i],[function(e){return!(!e.provide&&!e.token||!(e.useValue||e.useFactory||e.useExisting||e.useClass))},i],[function(e){return!!(e&&e.val&&(O(e.val)||E(e.val)||D(e.val)))},o],[f(!0),function(e){throw new Error("Invalid resolve value: "+Ue(e))}]]),s=e.resolve;return(E(s)?s:(t=s,n=e.resolvePolicy||{},Object.keys(t||{}).map(function(e){return{token:e,val:t[e],deps:void 0,policy:n[e]}}))).map(a)}var jt,Ht,Yt=function(){function e(t,e){this.matcher=t;var r,n,i=this,o=function(){return t.find("")},a=function(e){return""===e.name};this.builders={name:[Pt],self:[Mt],parent:[function(e){return a(e)?null:t.find(i.parentName(e))||o()}],data:[Rt],url:[It(e,o)],navigable:[(n=a,function(e){return!n(e)&&e.url?e:e.parent?e.parent.navigable:null})],params:[(r=e.paramFactory,function(n){var e=n.url&&n.url.parameters({inherit:!1})||[],t=de(ue(oe(n.params||{},e.map(w("id"))),function(e,t){return r.fromConfig(t,null,n.self)}));return e.concat(t).map(function(e){return[e.id,e]}).reduce(ke,{})})],views:[],path:[Vt],includes:[Ft],resolvables:[Lt]}}return e.prototype.builder=function(e,t){var n=this.builders,r=n[e]||[];return O(e)&&!k(t)?1<r.length?r:r[0]:O(e)&&D(t)?(n[e]=r,n[e].push(t),function(){return n[e].splice(n[e].indexOf(t,1))&&null}):void 0},e.prototype.build=function(e){var t=this.matcher,n=this.builders,r=this.parentName(e);if(r&&!t.find(r,void 0,!1))return null;for(var i in n)if(n.hasOwnProperty(i)){var o=n[i].reduce(function(t,n){return function(e){return n(e,t)}},z);e[i]=o(e)}return e},e.prototype.parentName=function(e){var t=e.name||"",n=t.split(".");if("**"===n.pop()&&n.pop(),n.length){if(e.parent)throw new Error("States that specify the 'parent:' property should not have a '.' in their name ("+t+")");return n.join(".")}return e.parent?O(e.parent)?e.parent:e.parent.name:""},e.prototype.name=function(e){var t=e.name;if(-1!==t.indexOf(".")||!e.parent)return t;var n=O(e.parent)?e.parent:e.parent.name;return n?n+"."+t:t},e}(),Nt=function(){function n(e){return n.create(e||{})}return n.create=function(e){e=n.isStateClass(e)?new e:e;var t=W(W(e,n.prototype));return e.$$state=function(){return t},t.self=e,t.__stateObjectCache={nameGlob:Me.fromString(t.name)},t},n.prototype.is=function(e){return this===e||this.self===e||this.fqn()===e},n.prototype.fqn=function(){if(!(this.parent&&this.parent instanceof this.constructor))return this.name;var e=this.parent.fqn();return e?e+"."+this.name:this.name},n.prototype.root=function(){return this.parent&&this.parent.root()||this},n.prototype.parameters=function(t){return((t=te(t,{inherit:!0,matchingKeys:null})).inherit&&this.parent&&this.parent.parameters()||[]).concat(de(this.params)).filter(function(e){return!t.matchingKeys||t.matchingKeys.hasOwnProperty(e.id)})},n.prototype.parameter=function(e,t){return void 0===t&&(t={}),this.url&&this.url.parameter(e,t)||le(de(this.params),v("id",e))||t.inherit&&this.parent&&this.parent.parameter(e)},n.prototype.toString=function(){return this.fqn()},n.isStateClass=function(e){return D(e)&&!0===e.__uiRouterState},n.isState=function(e){return T(e.__stateObjectCache)},n}(),qt=function(){function e(e){this._states=e}return e.prototype.isRelative=function(e){return 0===(e=e||"").indexOf(".")||0===e.indexOf("^")},e.prototype.find=function(e,t,n){if(void 0===n&&(n=!0),e||""===e){var r=O(e),i=r?e:e.name;this.isRelative(i)&&(i=this.resolvePath(i,t));var o=this._states[i];if(o&&(r||!(r||o!==e&&o.self!==e)))return o;if(r&&n){var a=de(this._states).filter(function(e){return e.__stateObjectCache.nameGlob&&e.__stateObjectCache.nameGlob.matches(i)});return 1<a.length&&console.log("stateMatcher.find: Found multiple matches for "+i+" using glob: ",a.map(function(e){return e.name})),a[0]}}},e.prototype.resolvePath=function(e,t){if(!t)throw new Error("No reference point given for path '"+e+"'");for(var n=this.find(t),r=e.split("."),i=r.length,o=0,a=n;o<i;o++)if(""!==r[o]||0!==o){if("^"!==r[o])break;if(!a.parent)throw new Error("Path '"+e+"' not valid for state '"+n.name+"'");a=a.parent}else a=n;var s=r.slice(o).join(".");return a.name+(a.name&&s?".":"")+s},e}(),Ut=function(){function e(e,t,n,r,i){this.$registry=e,this.$urlRouter=t,this.states=n,this.builder=r,this.listeners=i,this.queue=[],this.matcher=e.matcher}return e.prototype.dispose=function(){this.queue=[]},e.prototype.register=function(e){var t=this.queue,n=Nt.create(e),r=n.name;if(!O(r))throw new Error("State must have a valid name");if(this.states.hasOwnProperty(r)||G(t.map(w("name")),r))throw new Error("State '"+r+"' is already defined");return t.push(n),this.flush(),n},e.prototype.flush=function(){for(var t=this,e=this.queue,n=this.states,r=this.builder,i=[],o=[],a={},s=function(e){return t.states.hasOwnProperty(e)&&t.states[e]},l=function(){i.length&&t.listeners.forEach(function(e){return e("registered",i.map(function(e){return e.self}))})};0<e.length;){var u=e.shift(),c=u.name,d=r.build(u),p=o.indexOf(u);if(d){var h=s(c);if(h&&h.name===c)throw new Error("State '"+c+"' is already defined");var f=s(c+".**");f&&this.$registry.deregister(f),n[c]=u,this.attachRoute(u),0<=p&&o.splice(p,1),i.push(u)}else{var g=a[c];if(a[c]=e.length,0<=p&&g===e.length)return e.push(u),l(),n;p<0&&o.push(u),e.push(u)}}return l(),n},e.prototype.attachRoute=function(e){!e.abstract&&e.url&&this.$urlRouter.rule(this.$urlRouter.urlRuleFactory.create(e))},e}(),zt=function(){function e(e){this._router=e,this.states={},this.listeners=[],this.matcher=new qt(this.states),this.builder=new Yt(this.matcher,e.urlMatcherFactory),this.stateQueue=new Ut(this,e.urlRouter,this.states,this.builder,this.listeners),this._registerRoot()}return e.prototype._registerRoot=function(){(this._root=this.stateQueue.register({name:"",url:"^",views:null,params:{"#":{value:null,type:"hash",dynamic:!0}},abstract:!0})).navigable=null},e.prototype.dispose=function(){var t=this;this.stateQueue.dispose(),this.listeners=[],this.get().forEach(function(e){return t.get(e)&&t.deregister(e)})},e.prototype.onStatesChanged=function(e){return this.listeners.push(e),function(){Q(this.listeners)(e)}.bind(this)},e.prototype.root=function(){return this._root},e.prototype.register=function(e){return this.stateQueue.register(e)},e.prototype._deregisterTree=function(e){var n=this,r=this.get().map(function(e){return e.$$state()}),i=function(t){var e=r.filter(function(e){return-1!==t.indexOf(e.parent)});return 0===e.length?e:e.concat(i(e))},t=i([e]),o=[e].concat(t).reverse();return o.forEach(function(e){var t=n._router.urlRouter;t.rules().filter(v("state",e)).forEach(t.removeRule.bind(t)),delete n.states[e.name]}),o},e.prototype.deregister=function(e){var t=this.get(e);if(!t)throw new Error("Can't deregister state; not found: "+e);var n=this._deregisterTree(t.$$state());return this.listeners.forEach(function(e){return e("deregistered",n.map(function(e){return e.self}))}),n},e.prototype.get=function(e,t){var n=this;if(0===arguments.length)return Object.keys(this.states).map(function(e){return n.states[e].self});var r=this.matcher.find(e,t);return r&&r.self||null},e.prototype.decorator=function(e,t){return this.builder.builder(e,t)},e}();(jt=g.TransitionHookPhase||(g.TransitionHookPhase={}))[jt.CREATE=0]="CREATE",jt[jt.BEFORE=1]="BEFORE",jt[jt.RUN=2]="RUN",jt[jt.SUCCESS=3]="SUCCESS",jt[jt.ERROR=4]="ERROR",(Ht=g.TransitionHookScope||(g.TransitionHookScope={}))[Ht.TRANSITION=0]="TRANSITION",Ht[Ht.STATE=1]="STATE";var Bt={current:z,transition:null,traceData:{},bind:null},Wt=function(){function o(e,t,n,r){var i=this;this.transition=e,this.stateContext=t,this.registeredHook=n,this.options=r,this.isSuperseded=function(){return i.type.hookPhase===g.TransitionHookPhase.RUN&&!i.options.transition.isActive()},this.options=te(r,Bt),this.type=n.eventType}return o.chain=function(e,t){return e.reduce(function(e,t){return e.then(function(){return t.invokeHook()})},t||V.$q.when())},o.invokeHooks=function(e,t){for(var n=0;n<e.length;n++){var r=e[n].invokeHook();if(R(r)){var i=e.slice(n+1);return o.chain(i,r).then(t)}}return t()},o.runAllHooks=function(e){e.forEach(function(e){return e.invokeHook()})},o.prototype.logError=function(e){this.transition.router.stateService.defaultErrorHandler()(e)},o.prototype.invokeHook=function(){var t=this,n=this.registeredHook;if(!n._deregistered){var e=this.getNotCurrentRejection();if(e)return e;var r=this.options;ut.traceHookInvocation(this,this.transition,r);var i=function(e){return n.eventType.getErrorHandler(t)(e)},o=function(e){return n.eventType.getResultHandler(t)(e)};try{var a=n.callback.call(r.bind,t.transition,t.stateContext);return!this.type.synchronous&&R(a)?a.catch(function(e){return Ve.normalize(e).toPromise()}).then(o,i):o(a)}catch(e){return i(Ve.normalize(e))}finally{n.invokeLimit&&++n.invokeCount>=n.invokeLimit&&n.deregister()}}},o.prototype.handleHookResult=function(e){var t=this,n=this.getNotCurrentRejection();return n||(R(e)?e.then(function(e){return t.handleHookResult(e)}):(ut.traceHookResult(e,this.transition,this.options),!1===e?Ve.aborted("Hook aborted transition").toPromise():h($t)(e)?Ve.redirected(e).toPromise():void 0))},o.prototype.getNotCurrentRejection=function(){var e=this.transition.router;return e._disposed?Ve.aborted("UIRouter instance #"+e.$id+" has been stopped (disposed)").toPromise():this.transition._aborted?Ve.aborted().toPromise():this.isSuperseded()?Ve.superseded(this.options.current()).toPromise():void 0},o.prototype.toString=function(){var e=this.options,t=this.registeredHook;return(S("traceData.hookType")(e)||"internal")+" context: "+(S("traceData.context.state.name")(e)||S("traceData.context")(e)||"unknown")+", "+Fe(200,Ye(t.callback))},o.HANDLE_RESULT=function(t){return function(e){return t.handleHookResult(e)}},o.LOG_REJECTED_RESULT=function(t){return function(e){R(e)&&e.catch(function(e){return t.logError(Ve.normalize(e))})}},o.LOG_ERROR=function(t){return function(e){return t.logError(e)}},o.REJECT_ERROR=function(e){return function(e){return Pe(e)}},o.THROW_ERROR=function(e){return function(e){throw e}},o}();function Gt(e,t){var i=O(t)?[t]:t;return!!(D(i)?i:function(e){for(var t=i,n=0;n<t.length;n++){var r=new Me(t[n]);if(r&&r.matches(e.name)||!r&&t[n]===e.name)return!0}return!1})(e)}var Kt=function(){function e(e,t,n,r,i,o){void 0===o&&(o={}),this.tranSvc=e,this.eventType=t,this.callback=n,this.matchCriteria=r,this.removeHookFromRegistry=i,this.invokeCount=0,this._deregistered=!1,this.priority=o.priority||0,this.bind=o.bind||null,this.invokeLimit=o.invokeLimit}return e.prototype._matchingNodes=function(e,t){if(!0===t)return e;var n=e.filter(function(e){return Gt(e.state,t)});return n.length?n:null},e.prototype._getDefaultMatchCriteria=function(){return ue(this.tranSvc._pluginapi._getPathTypes(),function(){return!0})},e.prototype._getMatchingNodes=function(o){var a=this,s=N(this._getDefaultMatchCriteria(),this.matchCriteria);return de(this.tranSvc._pluginapi._getPathTypes()).reduce(function(e,t){var n=t.scope===g.TransitionHookScope.STATE,r=o[t.name]||[],i=n?r:[De(r)];return e[t.name]=a._matchingNodes(i,s[t.name]),e},{})},e.prototype.matches=function(e){var t=this._getMatchingNodes(e);return de(t).every(U)?t:null},e.prototype.deregister=function(){this.removeHookFromRegistry(this),this._deregistered=!0},e}();function Qt(e,i,o){var a=(e._registeredHooks=e._registeredHooks||{})[o.name]=[],s=Q(a);function t(e,t,n){void 0===n&&(n={});var r=new Kt(i,o,t,e,s,n);return a.push(r),r.deregister.bind(r)}return e[o.name]=t}var Zt=function(){function e(e){this.transition=e}return e.prototype.buildHooksForPhase=function(e){var t=this;return this.transition.router.transitionService._pluginapi._getEvents(e).map(function(e){return t.buildHooks(e)}).reduce(fe,[]).filter(U)},e.prototype.buildHooks=function(o){var a=this.transition,e=a.treeChanges(),t=this.getMatchingHooks(o,e);if(!t)return[];var s={transition:a,current:a.options().current};return t.map(function(i){return i.matches(e)[o.criteriaMatchPath.name].map(function(e){var t=N({bind:i.bind,traceData:{hookType:o.name,context:e}},s),n=o.criteriaMatchPath.scope===g.TransitionHookScope.STATE?e.state.self:null,r=new Wt(a,n,i,t);return{hook:i,node:e,transitionHook:r}})}).reduce(fe,[]).sort(function(i){void 0===i&&(i=!1);return function(e,t){var n=i?-1:1,r=(e.node.state.path.length-t.node.state.path.length)*n;return 0!==r?r:t.hook.priority-e.hook.priority}}(o.reverseSort)).map(function(e){return e.transitionHook})},e.prototype.getMatchingHooks=function(t,n){var e=t.hookPhase===g.TransitionHookPhase.CREATE,r=this.transition.router.transitionService;return(e?[r]:[this.transition,r]).map(function(e){return e.getHooks(t.name)}).filter(be(E,"broken event named: "+t.name)).reduce(fe,[]).filter(function(e){return e.matches(n)})},e}();var Xt=w("self"),Jt=function(){function t(e,t,n){var r=this;if(this._deferred=V.$q.defer(),this.promise=this._deferred.promise,this._registeredHooks={},this._hookBuilder=new Zt(this),this.isActive=function(){return r.router.globals.transition===r},this.router=n,!(this._targetState=t).valid())throw new Error(t.error());this._options=N({current:f(this)},t.options()),this.$id=n.transitionService._transitionCount++;var i=_t.buildToPath(e,t);this._treeChanges=_t.treeChanges(e,i,this._options.reloadState),this.createTransitionHookRegFns();var o=this._hookBuilder.buildHooksForPhase(g.TransitionHookPhase.CREATE);Wt.invokeHooks(o,function(){return null}),this.applyViewConfigs(n)}return t.prototype.onBefore=function(e,t,n){},t.prototype.onStart=function(e,t,n){},t.prototype.onExit=function(e,t,n){},t.prototype.onRetain=function(e,t,n){},t.prototype.onEnter=function(e,t,n){},t.prototype.onFinish=function(e,t,n){},t.prototype.onSuccess=function(e,t,n){},t.prototype.onError=function(e,t,n){},t.prototype.createTransitionHookRegFns=function(){var t=this;this.router.transitionService._pluginapi._getEvents().filter(function(e){return e.hookPhase!==g.TransitionHookPhase.CREATE}).forEach(function(e){return Qt(t,t.router.transitionService,e)})},t.prototype.getHooks=function(e){return this._registeredHooks[e]},t.prototype.applyViewConfigs=function(e){var t=this._treeChanges.entering.map(function(e){return e.state});_t.applyViewConfigs(e.transitionService.$view,this._treeChanges.to,t)},t.prototype.$from=function(){return De(this._treeChanges.from).state},t.prototype.$to=function(){return De(this._treeChanges.to).state},t.prototype.from=function(){return this.$from().self},t.prototype.to=function(){return this.$to().self},t.prototype.targetState=function(){return this._targetState},t.prototype.is=function(e){return e instanceof t?this.is({to:e.$to().name,from:e.$from().name}):!(e.to&&!Gt(this.$to(),e.to)||e.from&&!Gt(this.$from(),e.from))},t.prototype.params=function(e){return void 0===e&&(e="to"),Object.freeze(this._treeChanges[e].map(w("paramValues")).reduce(ne,{}))},t.prototype.paramsChanged=function(){var e=this.params("from"),n=this.params("to"),t=[].concat(this._treeChanges.to).concat(this._treeChanges.from).map(function(e){return e.paramSchema}).reduce(ge,[]).reduce(ve,[]);return vt.changed(t,e,n).reduce(function(e,t){return e[t.id]=n[t.id],e},{})},t.prototype.injector=function(t,e){void 0===e&&(e="to");var n=this._treeChanges[e];return t&&(n=_t.subPath(n,function(e){return e.state===t||e.state.name===t})),new Et(n).injector()},t.prototype.getResolveTokens=function(e){return void 0===e&&(e="to"),new Et(this._treeChanges[e]).getTokens()},t.prototype.addResolvable=function(e,t){void 0===t&&(t=""),e=h(kt)(e)?e:new kt(e);var n="string"==typeof t?t:t.name,r=this._treeChanges.to,i=le(r,function(e){return e.state.name===n});new Et(r).addResolvables([e],i.state)},t.prototype.redirectedFrom=function(){return this._options.redirectedFrom||null},t.prototype.originalTransition=function(){var e=this.redirectedFrom();return e&&e.originalTransition()||this},t.prototype.options=function(){return this._options},t.prototype.entering=function(){return ce(this._treeChanges.entering,w("state")).map(Xt)},t.prototype.exiting=function(){return ce(this._treeChanges.exiting,w("state")).map(Xt).reverse()},t.prototype.retained=function(){return ce(this._treeChanges.retained,w("state")).map(Xt)},t.prototype.views=function(e,t){void 0===e&&(e="entering");var n=this._treeChanges[e];return(n=t?n.filter(v("state",t)):n).map(w("views")).filter(U).reduce(fe,[])},t.prototype.treeChanges=function(e){return e?this._treeChanges[e]:this._treeChanges},t.prototype.redirect=function(e){for(var t=1,n=this;null!=(n=n.redirectedFrom());)if(20<++t)throw new Error("Too many consecutive Transition redirects (20+)");var r={redirectedFrom:this,source:"redirect"};"url"===this.options().source&&!1!==e.options().location&&(r.location="replace");var i=N({},this.options(),e.options(),r);e=e.withOptions(i,!0);var o,a=this.router.transitionService.create(this._treeChanges.from,e),s=this._treeChanges.entering,l=a._treeChanges.entering;return _t.matching(l,s,_t.nonDynamicParams).filter(d((o=e.options().reloadState,function(e){return o&&e.state.includes[o.name]}))).forEach(function(e,t){e.resolvables=s[t].resolvables}),a},t.prototype._changedParams=function(){var e=this._treeChanges;if(!this._options.reload&&(!e.exiting.length&&!e.entering.length&&e.to.length===e.from.length&&!Se(e.to,e.from).map(function(e){return e[0].state!==e[1].state}).reduce(he,!1))){var t=e.to.map(function(e){return e.paramSchema}),n=[e.to,e.from].map(function(e){return e.map(function(e){return e.paramValues})});return Se(t,n[0],n[1]).map(function(e){var t=e[0],n=e[1],r=e[2];return vt.changed(t,n,r)}).reduce(fe,[])}},t.prototype.dynamic=function(){var e=this._changedParams();return!!e&&e.map(function(e){return e.dynamic}).reduce(he,!1)},t.prototype.ignored=function(){return!!this._ignoredReason()},t.prototype._ignoredReason=function(){var e=this.router.globals.transition,r=this._options.reloadState,t=function(e,t){if(e.length!==t.length)return!1;var n=_t.matching(e,t);return e.length===n.filter(function(e){return!r||!e.state.includes[r.name]}).length},n=this.treeChanges(),i=e&&e.treeChanges();return i&&t(i.to,n.to)&&t(i.exiting,n.exiting)?"SameAsPending":0===n.exiting.length&&0===n.entering.length&&t(n.from,n.to)?"SameAsCurrent":void 0},t.prototype.run=function(){var t=this,n=Wt.runAllHooks,r=function(e){return t._hookBuilder.buildHooksForPhase(e)},e=r(g.TransitionHookPhase.BEFORE);return Wt.invokeHooks(e,function(){var e=t.router.globals;return e.lastStartedTransitionId=t.$id,e.transition=t,e.transitionHistory.enqueue(t),ut.traceTransitionStart(t),V.$q.when(void 0)}).then(function(){var e=r(g.TransitionHookPhase.RUN);return Wt.invokeHooks(e,function(){return V.$q.when(void 0)})}).then(function(){ut.traceSuccess(t.$to(),t),t.success=!0,t._deferred.resolve(t.to()),n(r(g.TransitionHookPhase.SUCCESS))},function(e){ut.traceError(e,t),t.success=!1,t._deferred.reject(e),t._error=e,n(r(g.TransitionHookPhase.ERROR))}),this.promise},t.prototype.valid=function(){return!this.error()||void 0!==this.success},t.prototype.abort=function(){b(this.success)&&(this._aborted=!0)},t.prototype.error=function(){var e=this.$to();if(e.self.abstract)return Ve.invalid("Cannot transition to abstract state '"+e.name+"'");var t=e.parameters(),n=this.params(),r=t.filter(function(e){return!e.validates(n[e.id])});if(r.length){var i=r.map(function(e){return"["+e.id+":"+Ue(n[e.id])+"]"}).join(", "),o="The following parameter values are not valid for state '"+e.name+"': "+i;return Ve.invalid(o)}return!1===this.success?this._error:void 0},t.prototype.toString=function(){var e=this.from(),t=this.to(),n=function(e){return null!==e["#"]&&void 0!==e["#"]?e:oe(e,["#"])};return"Transition#"+this.$id+"( '"+(T(e)?e.name:e)+"'"+Ue(n(this._treeChanges.from.map(w("paramValues")).reduce(ne,{})))+" -> "+(this.valid()?"":"(X) ")+"'"+(T(t)?t.name:t)+"'"+Ue(n(this.params()))+" )"},t.diToken=t}();function en(e,t){var n=["",""],r=e.replace(/[\\\[\]\^$*+?.()|{}]/g,"\\$&");if(!t)return r;switch(t.squash){case!1:n=["(",")"+(t.isOptional?"?":"")];break;case!0:r=r.replace(/\/$/,""),n=["(?:/(",")|/)?"];break;default:n=["("+t.squash+"|",")?"]}return r+n[0]+t.type.pattern.source+n[1]}var tn=Xe("/"),nn={state:{params:{}},strict:!0,caseInsensitive:!0},rn=function(){function m(o,a,e,t){var s=this;this._cache={path:[this]},this._children=[],this._params=[],this._segments=[],this._compiled=[],this.config=t=te(t,nn),this.pattern=o;for(var n,r,i,l=/([:*])([\w\[\]]+)|\{([\w\[\]]+)(?:\:\s*((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,u=/([:]?)([\w\[\].-]+)|\{([\w\[\].-]+)(?:\:\s*((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,c=[],d=0,p=function(e){if(!m.nameValidator.test(e))throw new Error("Invalid parameter name '"+e+"' in pattern '"+o+"'");if(le(s._params,v("id",e)))throw new Error("Duplicate parameter name '"+e+"' in pattern '"+o+"'")},h=function(e,t){var n,r=e[2]||e[3],i=t?e[4]:e[4]||("*"===e[1]?"[\\s\\S]*":null);return{id:r,regexp:i,segment:o.substring(d,e.index),type:i?a.type(i)||(n=i,W(a.type(t?"query":"path"),{pattern:new RegExp(n,s.config.caseInsensitive?"i":void 0)})):null}};(n=l.exec(o))&&!(0<=(r=h(n,!1)).segment.indexOf("?"));)p(r.id),this._params.push(e.fromPath(r.id,r.type,t.state)),this._segments.push(r.segment),c.push([r.segment,De(this._params)]),d=l.lastIndex;var f=(i=o.substring(d)).indexOf("?");if(0<=f){var g=i.substring(f);if(i=i.substring(0,f),0<g.length)for(d=0;n=u.exec(g);)p((r=h(n,!0)).id),this._params.push(e.fromSearch(r.id,r.type,t.state)),d=l.lastIndex}this._segments.push(i),this._compiled=c.map(function(e){return en.apply(null,e)}).concat(en(i))}return m.encodeDashes=function(e){return encodeURIComponent(e).replace(/-/g,function(e){return"%5C%"+e.charCodeAt(0).toString(16).toUpperCase()})},m.pathSegmentsAndParams=function(e){return Se(e._segments,e._params.filter(function(e){return e.location===g.DefType.PATH}).concat(void 0)).reduce(fe,[]).filter(function(e){return""!==e&&k(e)})},m.queryParams=function(e){return e._params.filter(function(e){return e.location===g.DefType.SEARCH})},m.compare=function(e,t){var n=function(e){return e._cache.weights=e._cache.weights||(t=e,t._cache.segments=t._cache.segments||t._cache.path.map(m.pathSegmentsAndParams).reduce(fe,[]).reduce(Je,[]).map(function(e){return O(e)?tn(e):e}).reduce(fe,[])).map(function(e){return"/"===e?1:O(e)?2:e instanceof vt?3:void 0});var t},r=n(e),i=n(t);!function(e,t,n){for(var r=Math.max(e.length,t.length);e.length<r;)e.push(n);for(;t.length<r;)t.push(n)}(r,i,0);var o,a,s=Se(r,i);for(a=0;a<s.length;a++)if(0!==(o=s[a][0]-s[a][1]))return o;return 0},m.prototype.append=function(e){return this._children.push(e),e._cache={path:this._cache.path.concat(e),parent:this,pattern:null},e},m.prototype.isRoot=function(){return this._cache.path[0]===this},m.prototype.toString=function(){return this.pattern},m.prototype.exec=function(e,r,t,n){var i=this;void 0===r&&(r={}),void 0===n&&(n={});var o,a,s,l=(o=this._cache,a="pattern",s=function(){return new RegExp(["^",ye(i._cache.path.map(w("_compiled"))).join(""),!1===i.config.strict?"/?":"","$"].join(""),i.config.caseInsensitive?"i":void 0)},o[a]=o[a]||s()).exec(e);if(!l)return null;var u,c=this.parameters(),d=c.filter(function(e){return!e.isSearch()}),p=c.filter(function(e){return e.isSearch()}),h=this._cache.path.map(function(e){return e._segments.length-1}).reduce(function(e,t){return e+t}),f={};if(h!==l.length-1)throw new Error("Unbalanced capture group in route '"+this.pattern+"'");for(var g=0;g<h;g++){for(var m=d[g],v=l[g+1],y=0;y<m.replace.length;y++)m.replace[y].from===v&&(v=m.replace[y].to);v&&!0===m.array&&(void 0,v=ce(ce((u=function(e){return e.split("").reverse().join("")})(v).split(/-(?!\\)/),u),function(e){return e.replace(/\\-/g,"-")}).reverse()),k(v)&&(v=m.type.decode(v)),f[m.id]=m.value(v)}return p.forEach(function(e){for(var t=r[e.id],n=0;n<e.replace.length;n++)e.replace[n].from===t&&(t=e.replace[n].to);k(t)&&(t=e.type.decode(t)),f[e.id]=e.value(t)}),t&&(f["#"]=t),f},m.prototype.parameters=function(e){return void 0===e&&(e={}),!1===e.inherit?this._params:ye(this._cache.path.map(function(e){return e._params}))},m.prototype.parameter=function(r,e){var i=this;void 0===e&&(e={});var t=this._cache.parent;return function(){for(var e=0,t=i._params;e<t.length;e++){var n=t[e];if(n.id===r)return n}}()||!1!==e.inherit&&t&&t.parameter(r,e)||null},m.prototype.validates=function(r){return r=r||{},this.parameters().filter(function(e){return r.hasOwnProperty(e.id)}).map(function(e){return n=r[(t=e).id],!t||t.validates(n);var t,n}).reduce(pe,!0)},m.prototype.format=function(a){void 0===a&&(a={});var e=this._cache.path,t=e.map(m.pathSegmentsAndParams).reduce(fe,[]).map(function(e){return O(e)?e:r(e)}),n=e.map(m.queryParams).reduce(fe,[]).map(r);if(t.concat(n).filter(function(e){return!1===e.isValid}).length)return null;function r(e){var t=e.value(a[e.id]),n=e.validates(t),r=e.isDefaultValue(t),i=!!r&&e.squash,o=e.type.encode(t);return{param:e,value:t,isValid:n,isDefaultValue:r,squash:i,encoded:o}}var i=t.reduce(function(e,t){if(O(t))return e+t;var n=t.squash,r=t.encoded,i=t.param;return!0===n?e.match(/\/$/)?e.slice(0,-1):e:O(n)?e+n:!1!==n?e:null==r?e:E(r)?e+ce(r,m.encodeDashes).join("-"):i.raw?e+r:e+encodeURIComponent(r)},""),o=n.map(function(e){var t=e.param,n=e.squash,r=e.encoded,i=e.isDefaultValue;if(!(null==r||i&&!1!==n)&&(E(r)||(r=[r]),0!==r.length))return t.raw||(r=ce(r,encodeURIComponent)),r.map(function(e){return t.id+"="+e})}).filter(U).reduce(fe,[]).join("&");return i+(o?"?"+o:"")+(a["#"]?"#"+a["#"]:"")},m.nameValidator=/^\w+([-.]+\w+)*(?:\[\])?$/,m}(),on=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var i in t=arguments[n])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e},an=function(){function e(e){this.umf=e}return e.prototype.fromConfig=function(e,t,n){return new vt(e,t,g.DefType.CONFIG,this.umf,n)},e.prototype.fromPath=function(e,t,n){return new vt(e,t,g.DefType.PATH,this.umf,n)},e.prototype.fromSearch=function(e,t,n){return new vt(e,t,g.DefType.SEARCH,this.umf,n)},e}(),sn=function(){function e(){this.paramTypes=new yt,this._isCaseInsensitive=!1,this._isStrictMode=!0,this._defaultSquashPolicy=!1,this.paramFactory=new an(this),N(this,{UrlMatcher:rn,Param:vt})}return e.prototype.caseInsensitive=function(e){return this._isCaseInsensitive=k(e)?e:this._isCaseInsensitive},e.prototype.strictMode=function(e){return this._isStrictMode=k(e)?e:this._isStrictMode},e.prototype.defaultSquashPolicy=function(e){if(k(e)&&!0!==e&&!1!==e&&!O(e))throw new Error("Invalid squash policy: "+e+". Valid policies: false, true, arbitrary-string");return this._defaultSquashPolicy=k(e)?e:this._defaultSquashPolicy},e.prototype.compile=function(e,t){var n=t&&!t.state&&t.params;t=n?on({state:{params:n}},t):t;var r={strict:this._isStrictMode,caseInsensitive:this._isCaseInsensitive};return new rn(e,this.paramTypes,this.paramFactory,N(r,t))},e.prototype.isMatcher=function(n){if(!T(n))return!1;var r=!0;return Y(rn.prototype,function(e,t){D(e)&&(r=r&&k(n[t])&&D(n[t]))}),r},e.prototype.type=function(e,t,n){var r=this.paramTypes.type(e,t,n);return k(t)?this:r},e.prototype.$get=function(){return this.paramTypes.enqueue=!1,this.paramTypes._flushTypeQueue(),this},e.prototype.dispose=function(){this.paramTypes.dispose()},e}(),ln=function(){function e(e){this.router=e}return e.prototype.compile=function(e){return this.router.urlMatcherFactory.compile(e)},e.prototype.create=function(e,t){var n=this,r=Nt.isState,i=m([[O,function(e){return i(n.compile(e))}],[h(rn),function(e){return n.fromUrlMatcher(e,t)}],[r,function(e){return n.fromState(e,n.router)}],[h(RegExp),function(e){return n.fromRegExp(e,t)}],[D,function(e){return new un(e,t)}]]),o=i(e);if(!o)throw new Error("invalid 'what' in when()");return o},e.prototype.fromUrlMatcher=function(n,t){var e=t;O(t)&&(t=this.router.urlMatcherFactory.compile(t)),h(rn)(t)&&(e=function(e){return t.format(e)});var r={urlMatcher:n,matchPriority:function(t){var e=n.parameters().filter(function(e){return e.isOptional});return e.length?e.filter(function(e){return t[e.id]}).length/e.length:1e-6},type:"URLMATCHER"};return N(new un(function(e){var t=n.exec(e.path,e.search,e.hash);return n.validates(t)&&t},e),r)},e.prototype.fromState=function(r,i){var e={state:r,type:"STATE"};return N(this.fromUrlMatcher(r.url,function(e){var t=i.stateService,n=i.globals;t.href(r,e)!==t.href(n.current,n.params)&&t.transitionTo(r,e,{inherit:!0,source:"url"})}),e)},e.prototype.fromRegExp=function(t,e){if(t.global||t.sticky)throw new Error("Rule RegExp must not be global or sticky");var n=O(e)?function(n){return e.replace(/\$(\$|\d{1,2})/,function(e,t){return n["$"===t?0:Number(t)]})}:e,r={regexp:t,type:"REGEXP"};return N(new un(function(e){return t.exec(e.path)},n),r)},e.isUrlRule=function(t){return t&&["type","match","handler"].every(function(e){return k(t[e])})},e}(),un=function(e,t){var n=this;this.match=e,this.type="RAW",this.matchPriority=function(e){return 0-n.$id},this.handler=t||U};var cn;cn=function(e,t){var n,r,i,o,a,s,l,u,c=(n=e,(t.priority||0)-(n.priority||0));return 0!==c?c:(r=t,0!==(c=((i={STATE:4,URLMATCHER:4,REGEXP:3,RAW:2,OTHER:1})[e.type]||0)-(i[r.type]||0))?c:(a=t,0!==(c=(o=e).urlMatcher&&a.urlMatcher?rn.compare(o.urlMatcher,a.urlMatcher):0)?c:(l=t,(u={STATE:!0,URLMATCHER:!0})[(s=e).type]&&u[l.type]?0:(s.$id||0)-(l.$id||0))))};var dn=function(){function t(e){this._sortFn=cn,this._rules=[],this.interceptDeferred=!1,this._id=0,this._sorted=!1,this._router=e,this.urlRuleFactory=new ln(e),B(f(t.prototype),this,f(this))}return t.prototype.dispose=function(){this.listen(!1),this._rules=[],delete this._otherwiseFn},t.prototype.sort=function(e){this._rules=this.stableSort(this._rules,this._sortFn=e||this._sortFn),this._sorted=!0},t.prototype.ensureSorted=function(){this._sorted||this.sort()},t.prototype.stableSort=function(e,r){var t=e.map(function(e,t){return{elem:e,idx:t}});return t.sort(function(e,t){var n=r(e.elem,t.elem);return 0===n?e.idx-t.idx:n}),t.map(function(e){return e.elem})},t.prototype.match=function(e){var t=this;this.ensureSorted(),e=N({path:"",search:{},hash:""},e);var n=this.rules();this._otherwiseFn&&n.push(this._otherwiseFn);for(var r,i,o,a=0;a<n.length&&(!r||0===this._sortFn(n[a],r.rule));a++){var s=(i=n[a],void 0,(o=i.match(e,t._router))&&{match:o,rule:i,weight:i.matchPriority(o)});r=!r||s&&s.weight>r.weight?s:r}return r},t.prototype.sync=function(e){if(!e||!e.defaultPrevented){var t=this._router,n=t.urlService,r=t.stateService,i={path:n.path(),search:n.search(),hash:n.hash()},o=this.match(i);m([[O,function(e){return n.url(e,!0)}],[$t.isDef,function(e){return r.go(e.state,e.params,e.options)}],[h($t),function(e){return r.go(e.state(),e.params(),e.options())}]])(o&&o.rule.handler(o.match,i,t))}},t.prototype.listen=function(e){var t=this;if(!1!==e)return this._stopFn=this._stopFn||this._router.urlService.onChange(function(e){return t.sync(e)});this._stopFn&&this._stopFn(),delete this._stopFn},t.prototype.update=function(e){var t=this._router.locationService;e?this.location=t.url():t.url()!==this.location&&t.url(this.location,!0)},t.prototype.push=function(e,t,n){var r=n&&!!n.replace;this._router.urlService.url(e.format(t||{}),r)},t.prototype.href=function(e,t,n){var r=e.format(t);if(null==r)return null;n=n||{absolute:!1};var i,o,a,s,l=this._router.urlService.config,u=l.html5Mode();if(u||null===r||(r="#"+l.hashPrefix()+r),i=r,o=u,a=n.absolute,r="/"===(s=l.baseHref())?i:o?We(s)+i:a?s.slice(1)+i:i,!n.absolute||!r)return r;var c=!u&&r?"/":"",d=l.port(),p=80===d||443===d?"":":"+d;return[l.protocol(),"://",l.host(),p,c,r].join("")},t.prototype.rule=function(e){var t=this;if(!ln.isUrlRule(e))throw new Error("invalid rule");return e.$id=this._id++,e.priority=e.priority||0,this._rules.push(e),this._sorted=!1,function(){return t.removeRule(e)}},t.prototype.removeRule=function(e){Q(this._rules,e)},t.prototype.rules=function(){return this.ensureSorted(),this._rules.slice()},t.prototype.otherwise=function(e){var t=pn(e);this._otherwiseFn=this.urlRuleFactory.create(f(!0),t),this._sorted=!1},t.prototype.initial=function(e){var t=pn(e);this.rule(this.urlRuleFactory.create(function(e,t){return 0===t.globals.transitionHistory.size()&&!!/^\/?$/.exec(e.path)},t))},t.prototype.when=function(e,t,n){var r=this.urlRuleFactory.create(e,t);return k(n&&n.priority)&&(r.priority=n.priority),this.rule(r),r},t.prototype.deferIntercept=function(e){void 0===e&&(e=!0),this.interceptDeferred=e},t}();function pn(e){if(!(D(e)||O(e)||h($t)(e)||$t.isDef(e)))throw new Error("'handler' must be a string, function, TargetState, or have a state: 'newtarget' property");return D(e)?e:f(e)}var hn=function(){function l(e){var n=this;this.router=e,this._uiViews=[],this._viewConfigs=[],this._viewConfigFactories={},this._listeners=[],this._pluginapi={_rootViewContext:this._rootViewContext.bind(this),_viewConfigFactory:this._viewConfigFactory.bind(this),_registeredUIView:function(t){return le(n._uiViews,function(e){return n.router.$id+"."+e.id===t})},_registeredUIViews:function(){return n._uiViews},_activeViewConfigs:function(){return n._viewConfigs},_onSync:function(e){return n._listeners.push(e),function(){return Q(n._listeners,e)}}}}return l.normalizeUIViewTarget=function(e,t){void 0===t&&(t="");var n=t.split("@"),r=n[0]||"$default",i=O(n[1])?n[1]:"^",o=/^(\^(?:\.\^)*)\.(.*$)/.exec(r);o&&(i=o[1],r=o[2]),"!"===r.charAt(0)&&(r=r.substr(1),i="");/^(\^(?:\.\^)*)$/.exec(i)?i=i.split(".").reduce(function(e,t){return e.parent},e).name:"."===i&&(i=e.name);return{uiViewName:r,uiViewContextAnchor:i}},l.prototype._rootViewContext=function(e){return this._rootContext=e||this._rootContext},l.prototype._viewConfigFactory=function(e,t){this._viewConfigFactories[e]=t},l.prototype.createViewConfig=function(e,t){var n=this._viewConfigFactories[t.$type];if(!n)throw new Error("ViewService: No view config factory registered for type "+t.$type);var r=n(e,t);return E(r)?r:[r]},l.prototype.deactivateViewConfig=function(e){ut.traceViewServiceEvent("<- Removing",e),Q(this._viewConfigs,e)},l.prototype.activateViewConfig=function(e){ut.traceViewServiceEvent("-> Registering",e),this._viewConfigs.push(e)},l.prototype.sync=function(){var n=this,r=this._uiViews.map(function(e){return[e.fqn,e]}).reduce(ke,{});function i(e){for(var t=e.viewDecl.$context,n=0;++n&&t.parent;)t=t.parent;return n}var o=u(function(e,t,n,r){return t*(e(n)-e(r))}),e=this._uiViews.sort(o(function(e){var t=function(e){return e&&e.parent?t(e.parent)+1:1};return 1e4*e.fqn.split(".").length+t(e.creationContext)},1)).map(function(e){var t=n._viewConfigs.filter(l.matches(r,e));return 1<t.length&&t.sort(o(i,-1)),{uiView:e,viewConfig:t[0]}}),t=e.map(function(e){return e.viewConfig}),a=this._viewConfigs.filter(function(e){return!G(t,e)}).map(function(e){return{uiView:void 0,viewConfig:e}});e.forEach(function(e){-1!==n._uiViews.indexOf(e.uiView)&&e.uiView.configUpdated(e.viewConfig)});var s=e.concat(a);this._listeners.forEach(function(e){return e(s)}),ut.traceViewSync(s)},l.prototype.registerUIView=function(t){ut.traceViewServiceUIViewEvent("-> Registering",t);var e=this._uiViews;return e.filter(function(e){return e.fqn===t.fqn&&e.$type===t.$type}).length&&ut.traceViewServiceUIViewEvent("!!!! duplicate uiView named:",t),e.push(t),this.sync(),function(){-1!==e.indexOf(t)?(ut.traceViewServiceUIViewEvent("<- Deregistering",t),Q(e)(t)):ut.traceViewServiceUIViewEvent("Tried removing non-registered uiView",t)}},l.prototype.available=function(){return this._uiViews.map(w("fqn"))},l.prototype.active=function(){return this._uiViews.filter(w("$config")).map(w("name"))},l.matches=function(s,l){return function(e){if(l.$type!==e.viewDecl.$type)return!1;var t=e.viewDecl,n=t.$uiViewName.split("."),r=l.fqn.split(".");if(!q(n,r.slice(0-n.length)))return!1;var i=1-n.length||void 0,o=r.slice(0,i).join("."),a=s[o].creationContext;return t.$uiViewContextAnchor===(a&&a.name)}},l}(),fn=function(){function e(){this.params=new wt,this.lastStartedTransitionId=-1,this.transitionHistory=new Re([],1),this.successfulTransitions=new Re([],1)}return e.prototype.dispose=function(){this.transitionHistory.clear(),this.successfulTransitions.clear(),this.transition=null},e}(),gn=function(e){return e.reduce(function(e,t){return e[t]=I(t),e},{dispose:z})},mn=["url","path","search","hash","onChange"],vn=["port","protocol","host","baseHref","html5Mode","hashPrefix"],yn=["type","caseInsensitive","strictMode","defaultSquashPolicy"],wn=["sort","when","initial","otherwise","rules","rule","removeRule"],bn=["deferIntercept","listen","sync","match"],$n=function(){function e(e,t){void 0===t&&(t=!0),this.router=e,this.rules={},this.config={};var n=function(){return e.locationService};B(n,this,n,mn,t);var r=function(){return e.locationConfig};B(r,this.config,r,vn,t);var i=function(){return e.urlMatcherFactory};B(i,this.config,i,yn);var o=function(){return e.urlRouter};B(o,this.rules,o,wn),B(o,this,o,bn)}return e.prototype.url=function(e,t,n){},e.prototype.path=function(){},e.prototype.search=function(){},e.prototype.hash=function(){},e.prototype.onChange=function(e){},e.prototype.parts=function(){return{path:this.path(),search:this.search(),hash:this.hash()}},e.prototype.dispose=function(){},e.prototype.sync=function(e){},e.prototype.listen=function(e){},e.prototype.deferIntercept=function(e){},e.prototype.match=function(e){},e.locationServiceStub=gn(mn),e.locationConfigStub=gn(vn),e}(),_n=0,Cn=function(){function e(e,t){void 0===e&&(e=$n.locationServiceStub),void 0===t&&(t=$n.locationConfigStub),this.locationService=e,this.locationConfig=t,this.$id=_n++,this._disposed=!1,this._disposables=[],this.trace=ut,this.viewService=new hn(this),this.globals=new fn,this.transitionService=new zn(this),this.urlMatcherFactory=new sn,this.urlRouter=new dn(this),this.stateRegistry=new zt(this),this.stateService=new Bn(this),this.urlService=new $n(this),this._plugins={},this.viewService._pluginapi._rootViewContext(this.stateRegistry.root()),this.globals.$current=this.stateRegistry.root(),this.globals.current=this.globals.$current.self,this.disposable(this.globals),this.disposable(this.stateService),this.disposable(this.stateRegistry),this.disposable(this.transitionService),this.disposable(this.urlRouter),this.disposable(e),this.disposable(t)}return e.prototype.disposable=function(e){this._disposables.push(e)},e.prototype.dispose=function(e){var t=this;e&&D(e.dispose)?e.dispose(this):(this._disposed=!0,this._disposables.slice().forEach(function(e){try{"function"==typeof e.dispose&&e.dispose(t),Q(t._disposables,e)}catch(e){}}))},e.prototype.plugin=function(e,t){void 0===t&&(t={});var n=new e(this,t);if(!n.name)throw new Error("Required property `name` missing on plugin: "+n);return this._disposables.push(n),this._plugins[n.name]=n},e.prototype.getPlugin=function(e){return e?this._plugins[e]:de(this._plugins)},e}();function Sn(t){t.addResolvable(kt.fromData(Cn,t.router),""),t.addResolvable(kt.fromData(Jt,t),""),t.addResolvable(kt.fromData("$transition$",t),""),t.addResolvable(kt.fromData("$stateParams",t.params()),""),t.entering().forEach(function(e){t.addResolvable(kt.fromData("$state$",e),e)})}var kn=G(["$transition$",Jt]),Dn=function(e){var t=de(e.treeChanges()).reduce(fe,[]).reduce(ve,[]),n=function(e){return kn(e.token)?kt.fromData(e.token,null):e};t.forEach(function(e){e.resolvables=e.resolvables.map(n)})},xn=function(t){var e=t.to().redirectTo;if(e){var n=t.router.stateService;return D(e)?V.$q.when(e(t)).then(r):r(e)}function r(e){if(e)return e instanceof $t?e:O(e)?n.target(e,t.params(),t.options()):e.state||e.params?n.target(e.state||t.to(),e.params||t.params(),t.options()):void 0}};function On(n){return function(e,t){return(0,t.$$state()[n])(e,t)}}var Tn=On("onExit"),En=On("onRetain"),An=On("onEnter"),Pn=function(e){return new Et(e.treeChanges().to).resolvePath("EAGER",e).then(z)},Mn=function(e,t){return new Et(e.treeChanges().to).subContext(t.$$state()).resolvePath("LAZY",e).then(z)},Rn=function(e){return new Et(e.treeChanges().to).resolvePath("LAZY",e).then(z)},In=function(e){var t=V.$q,n=e.views("entering");if(n.length)return t.all(n.map(function(e){return t.when(e.load())})).then(z)},Vn=function(e){var t=e.views("entering"),n=e.views("exiting");if(t.length||n.length){var r=e.router.viewService;n.forEach(function(e){return r.deactivateViewConfig(e)}),t.forEach(function(e){return r.activateViewConfig(e)}),r.sync()}},Fn=function(e){var t=e.router.globals,n=function(){t.transition===e&&(t.transition=null)};e.onSuccess({},function(){t.successfulTransitions.enqueue(e),t.$current=e.$to(),t.current=t.$current.self,xe(e.params(),t.params)},{priority:1e4}),e.promise.then(n,n)},Ln=function(e){var t=e.options(),n=e.router.stateService,r=e.router.urlRouter;if("url"!==t.source&&t.location&&n.$current.navigable){var i={replace:"replace"===t.location};r.push(n.$current.navigable.url,n.params,i)}r.update(!0)},jn=function(a){var s=a.router;var e=a.entering().filter(function(e){return!!e.$$state().lazyLoad}).map(function(e){return Hn(a,e)});return V.$q.all(e).then(function(){if("url"!==a.originalTransition().options().source){var e=a.targetState();return s.stateService.target(e.identifier(),e.params(),e.options())}var t=s.urlService,n=t.match(t.parts()),r=n&&n.rule;if(r&&"STATE"===r.type){var i=r.state,o=n.match;return s.stateService.target(i,o,a.options())}s.urlService.sync()})};function Hn(t,n){var r=n.$$state().lazyLoad,e=r._promise;if(!e){e=r._promise=V.$q.when(r(t,n)).then(function(e){e&&Array.isArray(e.states)&&e.states.forEach(function(e){return t.router.stateRegistry.register(e)});return e}).then(function(e){return delete n.lazyLoad,delete n.$$state().lazyLoad,delete r._promise,e},function(e){return delete r._promise,V.$q.reject(e)})}return e}var Yn=function(e,t,n,r,i,o,a,s){void 0===i&&(i=!1),void 0===o&&(o=Wt.HANDLE_RESULT),void 0===a&&(a=Wt.REJECT_ERROR),void 0===s&&(s=!1),this.name=e,this.hookPhase=t,this.hookOrder=n,this.criteriaMatchPath=r,this.reverseSort=i,this.getResultHandler=o,this.getErrorHandler=a,this.synchronous=s};function Nn(e){var t=e._ignoredReason();if(t){ut.traceTransitionIgnored(e);var n=e.router.globals.transition;return"SameAsCurrent"===t&&n&&n.abort(),Ve.ignored().toPromise()}}function qn(e){if(!e.valid())throw new Error(e.error().toString())}var Un={location:!0,relative:null,inherit:!1,notify:!0,reload:!1,custom:{},current:function(){return null},source:"unknown"},zn=function(){function e(e){this._transitionCount=0,this._eventTypes=[],this._registeredHooks={},this._criteriaPaths={},this._router=e,this.$view=e.viewService,this._deregisterHookFns={},this._pluginapi=B(f(this),{},f(this),["_definePathType","_defineEvent","_getPathTypes","_getEvents","getHooks"]),this._defineCorePaths(),this._defineCoreEvents(),this._registerCoreTransitionHooks(),e.globals.successfulTransitions.onEvict(Dn)}return e.prototype.onCreate=function(e,t,n){},e.prototype.onBefore=function(e,t,n){},e.prototype.onStart=function(e,t,n){},e.prototype.onExit=function(e,t,n){},e.prototype.onRetain=function(e,t,n){},e.prototype.onEnter=function(e,t,n){},e.prototype.onFinish=function(e,t,n){},e.prototype.onSuccess=function(e,t,n){},e.prototype.onError=function(e,t,n){},e.prototype.dispose=function(e){de(this._registeredHooks).forEach(function(t){return t.forEach(function(e){e._deregistered=!0,Q(t,e)})})},e.prototype.create=function(e,t){return new Jt(e,t,this._router)},e.prototype._defineCoreEvents=function(){var e=g.TransitionHookPhase,t=Wt,n=this._criteriaPaths;this._defineEvent("onCreate",e.CREATE,0,n.to,!1,t.LOG_REJECTED_RESULT,t.THROW_ERROR,!0),this._defineEvent("onBefore",e.BEFORE,0,n.to),this._defineEvent("onStart",e.RUN,0,n.to),this._defineEvent("onExit",e.RUN,100,n.exiting,!0),this._defineEvent("onRetain",e.RUN,200,n.retained),this._defineEvent("onEnter",e.RUN,300,n.entering),this._defineEvent("onFinish",e.RUN,400,n.to),this._defineEvent("onSuccess",e.SUCCESS,0,n.to,!1,t.LOG_REJECTED_RESULT,t.LOG_ERROR,!0),this._defineEvent("onError",e.ERROR,0,n.to,!1,t.LOG_REJECTED_RESULT,t.LOG_ERROR,!0)},e.prototype._defineCorePaths=function(){var e=g.TransitionHookScope.STATE,t=g.TransitionHookScope.TRANSITION;this._definePathType("to",t),this._definePathType("from",t),this._definePathType("exiting",e),this._definePathType("retained",e),this._definePathType("entering",e)},e.prototype._defineEvent=function(e,t,n,r,i,o,a,s){void 0===i&&(i=!1),void 0===o&&(o=Wt.HANDLE_RESULT),void 0===a&&(a=Wt.REJECT_ERROR),void 0===s&&(s=!1);var l=new Yn(e,t,n,r,i,o,a,s);this._eventTypes.push(l),Qt(this,this,l)},e.prototype._getEvents=function(t){return(k(t)?this._eventTypes.filter(function(e){return e.hookPhase===t}):this._eventTypes.slice()).sort(function(e,t){var n=e.hookPhase-t.hookPhase;return 0===n?e.hookOrder-t.hookOrder:n})},e.prototype._definePathType=function(e,t){this._criteriaPaths[e]={name:e,scope:t}},e.prototype._getPathTypes=function(){return this._criteriaPaths},e.prototype.getHooks=function(e){return this._registeredHooks[e]},e.prototype._registerCoreTransitionHooks=function(){var e=this._deregisterHookFns;e.addCoreResolves=this.onCreate({},Sn),e.ignored=this.onBefore({},Nn,{priority:-9999}),e.invalid=this.onBefore({},qn,{priority:-1e4}),e.redirectTo=this.onStart({to:function(e){return!!e.redirectTo}},xn),e.onExit=this.onExit({exiting:function(e){return!!e.onExit}},Tn),e.onRetain=this.onRetain({retained:function(e){return!!e.onRetain}},En),e.onEnter=this.onEnter({entering:function(e){return!!e.onEnter}},An),e.eagerResolve=this.onStart({},Pn,{priority:1e3}),e.lazyResolve=this.onEnter({entering:f(!0)},Mn,{priority:1e3}),e.resolveAll=this.onFinish({},Rn,{priority:1e3}),e.loadViews=this.onFinish({},In),e.activateViews=this.onSuccess({},Vn),e.updateGlobals=this.onCreate({},Fn),e.updateUrl=this.onSuccess({},Ln,{priority:9999}),e.lazyLoad=this.onBefore({entering:function(e){return!!e.lazyLoad}},jn)},e}(),Bn=function(){function n(e){this.router=e,this.invalidCallbacks=[],this._defaultErrorHandler=function(e){e instanceof Error&&e.stack?(console.error(e),console.error(e.stack)):e instanceof Ve?(console.error(e.toString()),e.detail&&e.detail.stack&&console.error(e.detail.stack)):console.error(e)};var t=Object.keys(n.prototype).filter(d(G(["current","$current","params","transition"])));B(f(n.prototype),this,f(this),t)}return Object.defineProperty(n.prototype,"transition",{get:function(){return this.router.globals.transition},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"params",{get:function(){return this.router.globals.params},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"current",{get:function(){return this.router.globals.current},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"$current",{get:function(){return this.router.globals.$current},enumerable:!0,configurable:!0}),n.prototype.dispose=function(){this.defaultErrorHandler(z),this.invalidCallbacks=[]},n.prototype._handleInvalidTargetState=function(e,n){var r=this,i=_t.makeTargetState(this.router.stateRegistry,e),t=this.router.globals,o=function(){return t.transitionHistory.peekTail()},a=o(),s=new Re(this.invalidCallbacks.slice()),l=new Et(e).injector(),u=function(e){if(e instanceof $t){var t=e;return(t=r.target(t.identifier(),t.params(),t.options())).valid()?o()!==a?Ve.superseded().toPromise():r.transitionTo(t.identifier(),t.params(),t.options()):Ve.invalid(t.error()).toPromise()}};return function t(){var e=s.dequeue();return void 0===e?Ve.invalid(n.error()).toPromise():V.$q.when(e(n,i,l)).then(u).then(function(e){return e||t()})}()},n.prototype.onInvalid=function(e){return this.invalidCallbacks.push(e),function(){Q(this.invalidCallbacks)(e)}.bind(this)},n.prototype.reload=function(e){return this.transitionTo(this.current,this.params,{reload:!k(e)||e,inherit:!1,notify:!1})},n.prototype.go=function(e,t,n){var r=te(n,{relative:this.$current,inherit:!0},Un);return this.transitionTo(e,t,r)},n.prototype.target=function(e,t,n){if(void 0===n&&(n={}),T(n.reload)&&!n.reload.name)throw new Error("Invalid reload state object");var r=this.router.stateRegistry;if(n.reloadState=!0===n.reload?r.root():r.matcher.find(n.reload,n.relative),n.reload&&!n.reloadState)throw new Error("No such reload state '"+(O(n.reload)?n.reload:n.reload.name)+"'");return new $t(this.router.stateRegistry,e,t,n)},n.prototype.getCurrentPath=function(){var e=this,t=this.router.globals.successfulTransitions.peekTail();return t?t.treeChanges().to:[new bt(e.router.stateRegistry.root())]},n.prototype.transitionTo=function(e,t,n){var o=this;void 0===t&&(t={}),void 0===n&&(n={});var a=this.router,s=a.globals;n=te(n,Un);n=N(n,{current:function(){return s.transition}});var r=this.target(e,t,n),i=this.getCurrentPath();if(!r.exists())return this._handleInvalidTargetState(i,r);if(!r.valid())return Pe(r.error());var l=function(i){return function(e){if(e instanceof Ve){var t=a.globals.lastStartedTransitionId===i.$id;if(e.type===g.RejectType.IGNORED)return t&&a.urlRouter.update(),V.$q.when(s.current);var n=e.detail;if(e.type===g.RejectType.SUPERSEDED&&e.redirected&&n instanceof $t){var r=i.redirect(n);return r.run().catch(l(r))}if(e.type===g.RejectType.ABORTED)return t&&a.urlRouter.update(),V.$q.reject(e)}return o.defaultErrorHandler()(e),V.$q.reject(e)}},u=this.router.transitionService.create(i,r),c=u.run().catch(l(u));return Ae(c),N(c,{transition:u})},n.prototype.is=function(e,t,n){n=te(n,{relative:this.$current});var r=this.router.stateRegistry.matcher.find(e,n.relative);if(k(r)){if(this.$current!==r)return!1;if(!t)return!0;var i=r.parameters({inherit:!0,matchingKeys:t});return vt.equals(i,vt.values(i,t),this.params)}},n.prototype.includes=function(e,t,n){n=te(n,{relative:this.$current});var r=O(e)&&Me.fromString(e);if(r){if(!r.matches(this.$current.name))return!1;e=this.$current.name}var i=this.router.stateRegistry.matcher.find(e,n.relative),o=this.$current.includes;if(k(i)){if(!k(o[i.name]))return!1;if(!t)return!0;var a=i.parameters({inherit:!0,matchingKeys:t});return vt.equals(a,vt.values(a,t),this.params)}},n.prototype.href=function(e,t,n){n=te(n,{lossy:!0,inherit:!0,absolute:!1,relative:this.$current}),t=t||{};var r=this.router.stateRegistry.matcher.find(e,n.relative);if(!k(r))return null;n.inherit&&(t=this.params.$inherit(t,this.$current,r));var i=r&&n.lossy?r.navigable:r;return i&&void 0!==i.url&&null!==i.url?this.router.urlRouter.href(i.url,t,{absolute:n.absolute}):null},n.prototype.defaultErrorHandler=function(e){return this._defaultErrorHandler=e||this._defaultErrorHandler},n.prototype.get=function(e,t){var n=this.router.stateRegistry;return 0===arguments.length?n.get():n.get(e,t||this.$current)},n.prototype.lazyLoad=function(e,t){var n=this.get(e);if(!n||!n.lazyLoad)throw new Error("Can not lazy load "+e);var r=this.getCurrentPath(),i=_t.makeTargetState(this.router.stateRegistry,r);return Hn(t=t||this.router.transitionService.create(r,i),n)},n}(),Wn={when:function(n){return new Promise(function(e,t){return e(n)})},reject:function(n){return new Promise(function(e,t){t(n)})},defer:function(){var n={};return n.promise=new Promise(function(e,t){n.resolve=e,n.reject=t}),n},all:function(e){if(E(e))return Promise.all(e);if(T(e)){var t=Object.keys(e).map(function(t){return e[t].then(function(e){return{key:t,val:e}})});return Wn.all(t).then(function(e){return e.reduce(function(e,t){return e[t.key]=t.val,e},{})})}}},Gn={},Kn=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm,Qn=/([^\s,]+)/g,Zn={get:function(e){return Gn[e]},has:function(e){return null!=Zn.get(e)},invoke:function(e,t,n){var r=N({},Gn,n||{}),i=Zn.annotate(e),o=be(function(e){return r.hasOwnProperty(e)},function(e){return"DI can't find injectable: '"+e+"'"}),a=i.filter(o).map(function(e){return r[e]});return D(e)?e.apply(t,a):e.slice(-1)[0].apply(t,a)},annotate:function(e){if(!M(e))throw new Error("Not an injectable function: "+e);if(e&&e.$inject)return e.$inject;if(E(e))return e.slice(0,-1);var t=e.toString().replace(Kn,"");return t.slice(t.indexOf("(")+1,t.indexOf(")")).match(Qn)||[]}},Xn=function(e,t){var n=t[0],r=t[1];return e.hasOwnProperty(n)?E(e[n])?e[n].push(r):e[n]=[e[n],r]:e[n]=r,e},Jn=function(e){return e.split("&").filter(U).map(Qe).reduce(Xn,{})};function er(e){var t=function(e){return e||""},n=Ge(e).map(t),r=n[0],i=n[1],o=Ke(r).map(t);return{path:o[0],search:o[1],hash:i,url:e}}var tr=function(e){var t=e.path(),n=e.search(),r=e.hash(),i=Object.keys(n).map(function(t){var e=n[t];return(E(e)?e:[e]).map(function(e){return t+"="+e})}).reduce(fe,[]).join("&");return t+(i?"?"+i:"")+(r?"#"+r:"")};function nr(r,i,o,a){return function(e){var t=e.locationService=new o(e),n=e.locationConfig=new a(e,i);return{name:r,service:t,configuration:n,dispose:function(e){e.dispose(t),e.dispose(n)}}}}var rr,ir,or,ar=function(){function e(e,t){var n=this;this.fireAfterUpdate=t,this._listeners=[],this._listener=function(t){return n._listeners.forEach(function(e){return e(t)})},this.hash=function(){return er(n._get()).hash},this.path=function(){return er(n._get()).path},this.search=function(){return Jn(er(n._get()).search)},this._location=F.location,this._history=F.history}return e.prototype.url=function(t,e){return void 0===e&&(e=!0),k(t)&&t!==this._get()&&(this._set(null,null,t,e),this.fireAfterUpdate&&this._listeners.forEach(function(e){return e({url:t})})),tr(this)},e.prototype.onChange=function(e){var t=this;return this._listeners.push(e),function(){return Q(t._listeners,e)}},e.prototype.dispose=function(e){ee(this._listeners)},e}(),sr=(rr=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])},function(e,t){function n(){this.constructor=e}rr(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),lr=function(n){function e(e){var t=n.call(this,e,!1)||this;return F.addEventListener("hashchange",t._listener,!1),t}return sr(e,n),e.prototype._get=function(){return Ze(this._location.hash)},e.prototype._set=function(e,t,n,r){this._location.hash=n},e.prototype.dispose=function(e){n.prototype.dispose.call(this,e),F.removeEventListener("hashchange",this._listener)},e}(ar),ur=(ir=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])},function(e,t){function n(){this.constructor=e}ir(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),cr=function(t){function e(e){return t.call(this,e,!0)||this}return ur(e,t),e.prototype._get=function(){return this._url},e.prototype._set=function(e,t,n,r){this._url=n},e}(ar),dr=(or=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])},function(e,t){function n(){this.constructor=e}or(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),pr=function(n){function e(e){var t=n.call(this,e,!0)||this;return t._config=e.urlService.config,F.addEventListener("popstate",t._listener,!1),t}return dr(e,n),e.prototype._getBasePrefix=function(){return We(this._config.baseHref())},e.prototype._get=function(){var e=this._location,t=e.pathname,n=e.hash,r=e.search;r=Ke(r)[1],n=Ge(n)[1];var i=this._getBasePrefix(),o=t===this._config.baseHref(),a=t.substr(0,i.length)===i;return(t=o?"/":a?t.substring(i.length):t)+(r?"?"+r:"")+(n?"#"+n:"")},e.prototype._set=function(e,t,n,r){var i=this._getBasePrefix(),o=n&&"/"!==n[0]?"/":"",a=""===n||"/"===n?this._config.baseHref():i+o+n;r?this._history.replaceState(e,t,a):this._history.pushState(e,t,a)},e.prototype.dispose=function(e){n.prototype.dispose.call(this,e),F.removeEventListener("popstate",this._listener)},e}(ar),hr=function(){var t=this;this.dispose=z,this._baseHref="",this._port=80,this._protocol="http",this._host="localhost",this._hashPrefix="",this.port=function(){return t._port},this.protocol=function(){return t._protocol},this.host=function(){return t._host},this.baseHref=function(){return t._baseHref},this.html5Mode=function(){return!1},this.hashPrefix=function(e){return k(e)?t._hashPrefix=e:t._hashPrefix}},fr=function(){function e(e,t){void 0===t&&(t=!1),this._isHtml5=t,this._baseHref=void 0,this._hashPrefix=""}return e.prototype.port=function(){return location.port?Number(location.port):"https"===this.protocol()?443:80},e.prototype.protocol=function(){return location.protocol.replace(/:/g,"")},e.prototype.host=function(){return location.hostname},e.prototype.html5Mode=function(){return this._isHtml5},e.prototype.hashPrefix=function(e){return k(e)?this._hashPrefix=e:this._hashPrefix},e.prototype.baseHref=function(e){return k(e)&&(this._baseHref=e),b(this._baseHref)&&(this._baseHref=this.getBaseHref()),this._baseHref},e.prototype.getBaseHref=function(){var e=document.getElementsByTagName("base")[0];return e&&e.href?e.href.replace(/^(https?:)?\/\/[^/]*/,""):location.pathname||"/"},e.prototype.dispose=function(){},e}();function gr(e){return V.$injector=Zn,{name:"vanilla.services",$q:V.$q=Wn,$injector:Zn,dispose:function(){return null}}}var mr=nr("vanilla.hashBangLocation",!1,lr,fr),vr=nr("vanilla.pushStateLocation",!0,pr,fr),yr=nr("vanilla.memoryLocation",!1,cr,hr),wr=function(){function e(){}return e.prototype.dispose=function(e){},e}(),br=Object.freeze({root:F,fromJson:j,toJson:H,forEach:Y,extend:N,equals:q,identity:U,noop:z,createProxyFunctions:B,inherit:W,inArray:G,_inArray:K,removeFrom:Q,_removeFrom:Z,pushTo:X,_pushTo:J,deregAll:ee,defaults:te,mergeR:ne,ancestors:re,pick:ie,omit:oe,pluck:ae,filter:se,find:le,mapObj:ue,map:ce,values:de,allTrueR:pe,anyTrueR:he,unnestR:fe,flattenR:ge,pushR:me,uniqR:ve,unnest:ye,flatten:we,assertPredicate:be,assertMap:$e,assertFn:_e,pairs:Ce,arrayTuples:Se,applyPairs:ke,tail:De,copy:xe,_extend:Oe,silenceUncaughtInPromise:Ae,silentRejection:Pe,notImplemented:I,services:V,Glob:Me,curry:u,compose:n,pipe:l,prop:w,propEq:v,parse:S,not:d,and:r,or:i,all:c,any:p,is:h,eq:o,val:f,invoke:a,pattern:m,isUndefined:b,isDefined:k,isNull:$,isNullOrUndefined:_,isFunction:D,isNumber:x,isString:O,isObject:T,isArray:E,isDate:A,isRegExp:P,isInjectable:M,isPromise:R,Queue:Re,maxLength:Fe,padString:Le,kebobString:je,functionToString:He,fnToString:Ye,stringify:Ue,beforeAfterSubstr:ze,hostRegex:Be,stripLastPathElement:We,splitHash:Ge,splitQuery:Ke,splitEqual:Qe,trimHashVal:Ze,splitOnDelim:Xe,joinNeighborsR:Je,get Category(){return g.Category},Trace:lt,trace:ut,get DefType(){return g.DefType},Param:vt,ParamTypes:yt,StateParams:wt,ParamType:ct,PathNode:bt,PathUtils:_t,resolvePolicies:Ct,defaultResolvePolicy:St,Resolvable:kt,NATIVE_INJECTOR_TOKEN:Tt,ResolveContext:Et,resolvablesBuilder:Lt,StateBuilder:Yt,StateObject:Nt,StateMatcher:qt,StateQueueManager:Ut,StateRegistry:zt,StateService:Bn,TargetState:$t,get TransitionHookPhase(){return g.TransitionHookPhase},get TransitionHookScope(){return g.TransitionHookScope},HookBuilder:Zt,matchState:Gt,RegisteredHook:Kt,makeEvent:Qt,get RejectType(){return g.RejectType},Rejection:Ve,Transition:Jt,TransitionHook:Wt,TransitionEventType:Yn,defaultTransOpts:Un,TransitionService:zn,UrlMatcher:rn,ParamFactory:an,UrlMatcherFactory:sn,UrlRouter:dn,UrlRuleFactory:ln,BaseUrlRule:un,UrlService:$n,ViewService:hn,UIRouterGlobals:fn,UIRouter:Cn,$q:Wn,$injector:Zn,BaseLocationServices:ar,HashLocationService:lr,MemoryLocationService:cr,PushStateLocationService:pr,MemoryLocationConfig:hr,BrowserLocationConfig:fr,keyValsToObjectR:Xn,getParams:Jn,parseUrl:er,buildUrl:tr,locationPluginFactory:nr,servicesPlugin:gr,hashLocationPlugin:mr,pushStateLocationPlugin:vr,memoryLocationPlugin:yr,UIRouterPluginBase:wr});function $r(){var n=null;return function(e,t){return n=n||V.$injector.get("$templateFactory"),[new kr(e,t,n)]}}var _r=function(e,n){return e.reduce(function(e,t){return e||k(n[t])},!1)};function Cr(r){if(!r.parent)return{};var i=["component","bindings","componentProvider"],o=["templateProvider","templateUrl","template","notify","async"].concat(["controller","controllerProvider","controllerAs","resolveAs"]),e=i.concat(o);if(k(r.views)&&_r(e,r))throw new Error("State '"+r.name+"' has a 'views' object. It cannot also have \"view properties\" at the state level.  Move the following properties into a view (in the 'views' object):  "+e.filter(function(e){return k(r[e])}).join(", "));var a={},t=r.views||{$default:ie(r,e)};return Y(t,function(e,t){if(t=t||"$default",O(e)&&(e={component:e}),e=N({},e),_r(i,e)&&_r(o,e))throw new Error("Cannot combine: "+i.join("|")+" with: "+o.join("|")+" in stateview: '"+t+"@"+r.name+"'");e.resolveAs=e.resolveAs||"$resolve",e.$type="ng1",e.$context=r,e.$name=t;var n=hn.normalizeUIViewTarget(e.$context,e.$name);e.$uiViewName=n.uiViewName,e.$uiViewContextAnchor=n.uiViewContextAnchor,a[t]=e}),a}var Sr=0,kr=function(){function e(e,t,n){var r=this;this.path=e,this.viewDecl=t,this.factory=n,this.$id=Sr++,this.loaded=!1,this.getTemplate=function(e,t){return r.component?r.factory.makeComponentTemplate(e,t,r.component,r.viewDecl.bindings):r.template}}return e.prototype.load=function(){var t=this,e=V.$q,n=new Et(this.path),r=this.path.reduce(function(e,t){return N(e,t.paramValues)},{}),i={template:e.when(this.factory.fromConfig(this.viewDecl,r,n)),controller:e.when(this.getController(n))};return e.all(i).then(function(e){return ut.traceViewServiceEvent("Loaded",t),t.controller=e.controller,N(t,e.template),t})},e.prototype.getController=function(e){var t=this.viewDecl.controllerProvider;if(!M(t))return this.viewDecl.controller;var n=V.$injector.annotate(t),r=E(t)?De(t):t;return new kt("",r,n).get(e)},e}(),Dr=function(){function e(){var r=this;this._useHttp=C.version.minor<3,this.$get=["$http","$templateCache","$injector",function(e,t,n){return r.$templateRequest=n.has&&n.has("$templateRequest")&&n.get("$templateRequest"),r.$http=e,r.$templateCache=t,r}]}return e.prototype.useHttpService=function(e){this._useHttp=e},e.prototype.fromConfig=function(e,t,n){var r=function(e){return V.$q.when(e).then(function(e){return{template:e}})},i=function(e){return V.$q.when(e).then(function(e){return{component:e}})};return k(e.template)?r(this.fromString(e.template,t)):k(e.templateUrl)?r(this.fromUrl(e.templateUrl,t)):k(e.templateProvider)?r(this.fromProvider(e.templateProvider,t,n)):k(e.component)?i(e.component):k(e.componentProvider)?i(this.fromComponentProvider(e.componentProvider,t,n)):r("<ui-view></ui-view>")},e.prototype.fromString=function(e,t){return D(e)?e(t):e},e.prototype.fromUrl=function(e,t){return D(e)&&(e=e(t)),null==e?null:this._useHttp?this.$http.get(e,{cache:this.$templateCache,headers:{Accept:"text/html"}}).then(function(e){return e.data}):this.$templateRequest(e)},e.prototype.fromProvider=function(e,t,n){var r=V.$injector.annotate(e),i=E(e)?De(e):e;return new kt("",i,r).get(n)},e.prototype.fromComponentProvider=function(e,t,n){var r=V.$injector.annotate(e),i=E(e)?De(e):e;return new kt("",i,r).get(n)},e.prototype.makeComponentTemplate=function(l,u,e,c){c=c||{};var d=3<=C.version.minor?"::":"",p=function(e){var t=je(e);return/^(x|data)-/.exec(t)?"x-"+t:t},t=function(e){var t=V.$injector.get(e+"Directive");if(!t||!t.length)throw new Error("Unable to find component named '"+e+"'");return t.map(xr).reduce(fe,[])}(e).map(function(e){var t=e.name,n=e.type,r=p(t);if(l.attr(r)&&!c[t])return r+"='"+l.attr(r)+"'";var i=c[t]||t;if("@"===n)return r+"='{{"+d+"$resolve."+i+"}}'";if("&"!==n)return r+"='"+d+"$resolve."+i+"'";var o=u.getResolvable(i),a=o&&o.data,s=a&&V.$injector.annotate(a)||[];return r+"='$resolve."+i+(E(a)?"["+(a.length-1)+"]":"")+"("+s.join(",")+")'"}).join(" "),n=p(e);return"<"+n+" "+t+"></"+n+">"},e}();var xr=function(e){return T(e.bindToController)?Or(e.bindToController):Or(e.scope)},Or=function(t){return Object.keys(t||{}).map(function(e){return[e,/^([=<@&])[?]?(.*)/.exec(t[e])]}).filter(function(e){return k(e)&&E(e[1])}).map(function(e){return{name:e[1][2]||e[0],type:e[1][1]}})},Tr=function(){function n(e,t){this.stateRegistry=e,this.stateService=t,B(f(n.prototype),this,f(this))}return n.prototype.decorator=function(e,t){return this.stateRegistry.decorator(e,t)||this},n.prototype.state=function(e,t){return T(e)?t=e:t.name=e,this.stateRegistry.register(t),this},n.prototype.onInvalid=function(e){return this.stateService.onInvalid(e)},n}(),Er=function(n){return function(e,t){var i=e[n],o="onExit"===n?"from":"to";return i?function(e,t){var n=new Et(e.treeChanges(o)).subContext(t.$$state()),r=N(Wr(n),{$state$:t,$transition$:e});return V.$injector.invoke(i,this,r)}:void 0}},Ar=function(){function e(e){this._urlListeners=[],this.$locationProvider=e;var t=f(e);B(t,this,t,["hashPrefix"])}return e.monkeyPatchPathParameterType=function(e){var t=e.urlMatcherFactory.type("path");t.encode=function(e){return null!=e?e.toString().replace(/(~|\/)/g,function(e){return{"~":"~~","/":"~2F"}[e]}):e},t.decode=function(e){return null!=e?e.toString().replace(/(~~|~2F)/g,function(e){return{"~~":"~","~2F":"/"}[e]}):e}},e.prototype.dispose=function(){},e.prototype.onChange=function(e){var t=this;return this._urlListeners.push(e),function(){return Q(t._urlListeners)(e)}},e.prototype.html5Mode=function(){var e=this.$locationProvider.html5Mode();return(e=T(e)?e.enabled:e)&&this.$sniffer.history},e.prototype.baseHref=function(){return this._baseHref||(this._baseHref=this.$browser.baseHref()||this.$window.location.pathname)},e.prototype.url=function(e,t,n){return void 0===t&&(t=!1),k(e)&&this.$location.url(e),t&&this.$location.replace(),n&&this.$location.state(n),this.$location.url()},e.prototype._runtimeServices=function(e,t,n,r,i){var o=this;this.$location=t,this.$sniffer=n,this.$browser=r,this.$window=i,e.$on("$locationChangeSuccess",function(t){return o._urlListeners.forEach(function(e){return e(t)})});var a=f(t);B(a,this,a,["replace","path","search","hash"]),B(a,this,a,["port","protocol","host"])},e}(),Pr=function(){function n(e){this._router=e,this._urlRouter=e.urlRouter}return n.injectableHandler=function(t,n){return function(e){return V.$injector.invoke(n,null,{$match:e,$stateParams:t.globals.params})}},n.prototype.$get=function(){var e=this._urlRouter;return e.update(!0),e.interceptDeferred||e.listen(),e},n.prototype.rule=function(e){var t=this;if(!D(e))throw new Error("'rule' must be a function");var n=new un(function(){return e(V.$injector,t._router.locationService)},U);return this._urlRouter.rule(n),this},n.prototype.otherwise=function(e){var t=this,n=this._urlRouter;if(O(e))n.otherwise(e);else{if(!D(e))throw new Error("'rule' must be a string or function");n.otherwise(function(){return e(V.$injector,t._router.locationService)})}return this},n.prototype.when=function(e,t){return(E(t)||D(t))&&(t=n.injectableHandler(this._router,t)),this._urlRouter.when(e,t),this},n.prototype.deferIntercept=function(e){this._urlRouter.deferIntercept(e)},n}();C.module("ui.router.angular1",[]);var Mr=C.module("ui.router.init",["ng"]),Rr=C.module("ui.router.util",["ui.router.init"]),Ir=C.module("ui.router.router",["ui.router.util"]),Vr=C.module("ui.router.state",["ui.router.router","ui.router.util","ui.router.angular1"]),Fr=C.module("ui.router",["ui.router.init","ui.router.state","ui.router.angular1"]),Lr=(C.module("ui.router.compat",["ui.router"]),null);function jr(e){(Lr=this.router=new Cn).stateProvider=new Tr(Lr.stateRegistry,Lr.stateService),Lr.stateRegistry.decorator("views",Cr),Lr.stateRegistry.decorator("onExit",Er("onExit")),Lr.stateRegistry.decorator("onRetain",Er("onRetain")),Lr.stateRegistry.decorator("onEnter",Er("onEnter")),Lr.viewService._pluginapi._viewConfigFactory("ng1",$r());var s=Lr.locationService=Lr.locationConfig=new Ar(e);function t(e,t,n,r,i,o,a){return s._runtimeServices(i,e,r,t,n),delete Lr.router,delete Lr.$get,Lr}return Ar.monkeyPatchPathParameterType(Lr),((Lr.router=Lr).$get=t).$inject=["$location","$browser","$window","$sniffer","$rootScope","$http","$templateCache"],Lr}jr.$inject=["$locationProvider"];var Hr=function(n){return["$uiRouterProvider",function(e){var t=e.router[n];return t.$get=function(){return t},t}]};function Yr(t,e,n){if(V.$injector=t,V.$q=e,!t.hasOwnProperty("strictDi"))try{t.invoke(function(e){})}catch(e){t.strictDi=!!/strict mode/.exec(e&&e.toString())}n.stateRegistry.get().map(function(e){return e.$$state().resolvables}).reduce(fe,[]).filter(function(e){return"deferred"===e.deps}).forEach(function(e){return e.deps=t.annotate(e.resolveFn,t.strictDi)})}Yr.$inject=["$injector","$q","$uiRouter"];function Nr(e){e.$watch(function(){ut.approximateDigests++})}Nr.$inject=["$rootScope"],Mr.provider("$uiRouter",jr),Ir.provider("$urlRouter",["$uiRouterProvider",function(e){return e.urlRouterProvider=new Pr(e)}]),Rr.provider("$urlService",Hr("urlService")),Rr.provider("$urlMatcherFactory",["$uiRouterProvider",function(){return Lr.urlMatcherFactory}]),Rr.provider("$templateFactory",function(){return new Dr}),Vr.provider("$stateRegistry",Hr("stateRegistry")),Vr.provider("$uiRouterGlobals",Hr("globals")),Vr.provider("$transitions",Hr("transitionService")),Vr.provider("$state",["$uiRouterProvider",function(){return N(Lr.stateProvider,{$get:function(){return Lr.stateService}})}]),Vr.factory("$stateParams",["$uiRouter",function(e){return e.globals.params}]),Fr.factory("$view",function(){return Lr.viewService}),Fr.service("$trace",function(){return ut}),Fr.run(Nr),Rr.run(["$urlMatcherFactory",function(e){}]),Vr.run(["$state",function(e){}]),Ir.run(["$urlRouter",function(e){}]),Mr.run(Yr);var qr,Ur,zr,Br,Wr=function(n){return n.getTokens().filter(O).map(function(e){var t=n.getResolvable(e);return[e,"NOWAIT"===n.getPolicy(t).async?t.promise:t.data]}).reduce(ke,{})};function Gr(e){var t,n=e.match(/^\s*({[^}]*})\s*$/);if(n&&(e="("+n[1]+")"),!(t=e.replace(/\n/g," ").match(/^\s*([^(]*?)\s*(\((.*)\))?\s*$/))||4!==t.length)throw new Error("Invalid state ref '"+e+"'");return{state:t[1]||null,paramExpr:t[3]||null}}function Kr(e){var t=e.parent().inheritedData("$uiView"),n=S("$cfg.path")(t);return n?De(n).state.name:void 0}function Qr(e,t,n){var r,i=n.uiState||e.current.name,o=N((r=e,{relative:Kr(t)||r.$current,inherit:!0,source:"sref"}),n.uiStateOpts||{}),a=e.href(i,n.uiStateParams,o);return{uiState:i,uiStateParams:n.uiStateParams,uiStateOpts:o,href:a}}function Zr(e){var t="[object SVGAnimatedString]"===Object.prototype.toString.call(e.prop("href")),n="FORM"===e[0].nodeName;return{attr:n?"action":t?"xlink:href":"href",isAnchor:"A"===e.prop("tagName").toUpperCase(),clickable:!n}}function Xr(o,a,s,l,u){return function(e){var t=e.which||e.button,n=u();if(!(1<t||e.ctrlKey||e.metaKey||e.shiftKey||o.attr("target"))){var r=s(function(){o.attr("disabled")||a.go(n.uiState,n.uiStateParams,n.uiStateOpts)});e.preventDefault();var i=l.isAnchor&&!n.href?1:0;e.preventDefault=function(){i--<=0&&s.cancel(r)}}}}function Jr(i,e,o,t){var a;t&&(a=t.events),E(a)||(a=["click"]);for(var n=i.on?"on":"bind",r=0,s=a;r<s.length;r++){var l=s[r];i[n](l,o)}e.$on("$destroy",function(){for(var e=i.off?"off":"unbind",t=0,n=a;t<n.length;t++){var r=n[t];i[e](r,o)}})}function ei(r){var e=function(e,t,n){return r.is(e,t,n)};return e.$stateful=!0,e}function ti(r){var e=function(e,t,n){return r.includes(e,t,n)};return e.$stateful=!0,e}function ni(g,m,v,e,y,t){var w=S("viewDecl.controllerAs"),b=S("viewDecl.resolveAs");return{restrict:"ECA",priority:-400,compile:function(e){var f=e.html();return e.empty(),function(t,n){var e=n.data("$uiView");if(!e)return n.html(f),void g(n.contents())(t);var r=e.$cfg||{viewDecl:{},getTemplate:z},i=r.path&&new Et(r.path);n.html(r.getTemplate(n,i)||f),ut.traceUIViewFill(e.$uiView,n.html());var o=g(n.contents()),a=r.controller,s=w(r),l=b(r),u=i&&Wr(i);if(t[l]=u,a){var c=m(a,N({},u,{$scope:t,$element:n}));s&&(t[s]=c,t[s][l]=u),n.data("$ngControllerController",c),n.children().data("$ngControllerController",c),oi(y,v,c,t,r)}if(O(r.component))var d=je(r.component),p=new RegExp("^(x-|data-)?"+d+"$","i"),h=t.$watch(function(){var e=[].slice.call(n[0].children).filter(function(e){return e&&e.tagName&&p.exec(e.tagName)});return e&&C.element(e).data("$"+r.component+"Controller")},function(e){e&&(oi(y,v,e,t,r),h())});o(t)}}}}qr=["$uiRouter","$timeout",function(p,h){var f=p.stateService;return{restrict:"A",require:["?^uiSrefActive","?^uiSrefActiveEq"],link:function(e,t,n,r){var i,o=Zr(t),a=r[1]||r[0],s=null,l={},u=function(){return Qr(f,t,l)},c=Gr(n.uiSref);function d(){var e=u();s&&s(),a&&(s=a.$$addStateInfo(e.uiState,e.uiStateParams)),null!=e.href&&n.$set(o.attr,e.href)}l.uiState=c.state,l.uiStateOpts=n.uiSrefOpts?e.$eval(n.uiSrefOpts):{},c.paramExpr&&(e.$watch(c.paramExpr,function(e){l.uiStateParams=N({},e),d()},!0),l.uiStateParams=N({},e.$eval(c.paramExpr))),d(),e.$on("$destroy",p.stateRegistry.onStatesChanged(d)),e.$on("$destroy",p.transitionService.onSuccess({},d)),o.clickable&&(i=Xr(t,f,h,o,u),Jr(t,e,i,l.uiStateOpts))}}}],Ur=["$uiRouter","$timeout",function(h,f){var g=h.stateService;return{restrict:"A",require:["?^uiSrefActive","?^uiSrefActiveEq"],link:function(n,e,r,t){var i,o=Zr(e),a=t[1]||t[0],s=null,l={},u=function(){return Qr(g,e,l)},c=["uiState","uiStateParams","uiStateOpts"],d=c.reduce(function(e,t){return e[t]=z,e},{});function p(){var e=u();s&&s(),a&&(s=a.$$addStateInfo(e.uiState,e.uiStateParams)),null!=e.href&&r.$set(o.attr,e.href)}c.forEach(function(t){l[t]=r[t]?n.$eval(r[t]):null,r.$observe(t,function(e){d[t](),d[t]=n.$watch(e,function(e){l[t]=e,p()},!0)})}),p(),n.$on("$destroy",h.stateRegistry.onStatesChanged(p)),n.$on("$destroy",h.transitionService.onSuccess({},p)),o.clickable&&(i=Xr(e,g,f,o,u),Jr(e,n,i,l.uiStateOpts))}}}],zr=["$state","$stateParams","$interpolate","$uiRouter",function(f,e,g,m){return{restrict:"A",controller:["$scope","$element","$attrs",function(s,l,e){var u,r,t,n,i,c=[];u=g(e.uiSrefActiveEq||"",!1)(s);try{r=s.$eval(e.uiSrefActive)}catch(e){}function o(e){e.promise.then(h,z)}function a(){d(r)}function d(e){T(e)&&(c=[],Y(e,function(e,t){var n=function(e,t){var n=Gr(e);p(n.state,s.$eval(n.paramExpr),t)};O(e)?n(e,t):E(e)&&Y(e,function(e){n(e,t)})}))}function p(e,t,n){var r={state:f.get(e,Kr(l))||{name:e},params:t,activeClass:n};return c.push(r),function(){Q(c)(r)}}function h(){var t=function(e){return e.split(/\s/).filter(U)},e=function(e){return e.map(function(e){return e.activeClass}).map(t).reduce(fe,[])},n=e(c).concat(t(u)).reduce(ve,[]),r=e(c.filter(function(e){return f.includes(e.state.name,e.params)})),i=!!c.filter(function(e){return f.is(e.state.name,e.params)}).length?t(u):[],o=r.concat(i).reduce(ve,[]),a=n.filter(function(e){return!G(o,e)});s.$evalAsync(function(){o.forEach(function(e){return l.addClass(e)}),a.forEach(function(e){return l.removeClass(e)})})}d(r=r||g(e.uiSrefActive||"",!1)(s)),this.$$addStateInfo=function(e,t){if(!(T(r)&&0<c.length)){var n=p(e,t,r);return h(),n}},s.$on("$destroy",(t=m.stateRegistry.onStatesChanged(a),n=m.transitionService.onStart({},o),i=s.$on("$stateChangeSuccess",h),function(){t(),n(),i()})),m.globals.transition&&o(m.globals.transition),h()}]}}],C.module("ui.router.state").directive("uiSref",qr).directive("uiSrefActive",zr).directive("uiSrefActiveEq",zr).directive("uiState",Ur),ei.$inject=["$state"],ti.$inject=["$state"],C.module("ui.router.state").filter("isState",ei).filter("includedByState",ti),Br=["$view","$animate","$uiViewScroll","$interpolate","$q",function(i,o,y,w,b){var $={$cfg:{viewDecl:{$context:i._pluginapi._rootViewContext()}},$uiView:{}},_={count:0,restrict:"ECA",terminal:!0,priority:400,transclude:"element",compile:function(e,t,v){return function(a,s,e){var l,u,c,d,t,p=e.onload||"",h=e.autoscroll,f={enter:function(e,t,n){2<C.version.minor?o.enter(e,null,t).then(n):o.enter(e,null,t,n)},leave:function(e,t){2<C.version.minor?o.leave(e).then(t):o.leave(e,t)}},n=s.inheritedData("$uiView")||$,g=w(e.uiView||e.name||"")(a)||"$default",m={$type:"ng1",id:_.count++,name:g,fqn:n.$uiView.fqn?n.$uiView.fqn+"."+g:g,config:null,configUpdated:function(e){if(e&&!(e instanceof kr))return;if(t=d,n=e,t===n)return;var t,n;ut.traceUIViewConfigUpdated(m,e&&e.viewDecl&&e.viewDecl.$context),r(d=e)},get creationContext(){var e=S("$cfg.viewDecl.$context")(n),t=S("$uiView.creationContext")(n);return e||t}};function r(e){var t=a.$new(),n=b.defer(),r=b.defer(),i={$cfg:e,$uiView:m},o={$animEnter:n.promise,$animLeave:r.promise,$$animLeave:r};t.$emit("$viewContentLoading",g),u=v(t,function(e){e.data("$uiViewAnim",o),e.data("$uiView",i),f.enter(e,s,function(){n.resolve(),c&&c.$emit("$viewContentAnimationEnded"),(k(h)&&!h||a.$eval(h))&&y(e)}),function(){if(l&&(ut.traceUIViewEvent("Removing (previous) el",l.data("$uiView")),l.remove(),l=null),c&&(ut.traceUIViewEvent("Destroying scope",m),c.$destroy(),c=null),u){var e=u.data("$uiViewAnim");ut.traceUIViewEvent("Animate out",e),f.leave(u,function(){e.$$animLeave.resolve(),l=null}),l=u,u=null}}()}),(c=t).$emit("$viewContentLoaded",e||d),c.$eval(p)}ut.traceUIViewEvent("Linking",m),s.data("$uiView",{$uiView:m}),r(),t=i.registerUIView(m),a.$on("$destroy",function(){ut.traceUIViewEvent("Destroying/Unregistering",m),t()})}}};return _}],ni.$inject=["$compile","$controller","$transitions","$view","$q","$timeout"];var ri="function"==typeof C.module("ui.router").component,ii=0;function oi(r,e,u,t,n){!D(u.$onInit)||n.viewDecl.component&&ri||u.$onInit();var c=De(n.path).state.self,i={bind:u};if(D(u.uiOnParamsChanged)){var d=new Et(n.path).getResolvable("$transition$").data;t.$on("$destroy",e.onSuccess({},function(e){if(e!==d&&-1===e.exiting().indexOf(c)){var n=e.params("to"),r=e.params("from"),t=function(e){return e.paramSchema},i=e.treeChanges("to").map(t).reduce(fe,[]),o=e.treeChanges("from").map(t).reduce(fe,[]),a=i.filter(function(e){var t=o.indexOf(e);return-1===t||!o[t].type.equals(n[e.id],r[e.id])});if(a.length){var s=a.map(function(e){return e.id}),l=se(n,function(e,t){return-1!==s.indexOf(t)});u.uiOnParamsChanged(l,e)}}},i))}if(D(u.uiCanExit)){var o=ii++,a="_uiCanExitIds",s=function(e){return!!e&&(e[a]&&!0===e[a][o]||s(e.redirectedFrom()))},l={exiting:c.name};t.$on("$destroy",e.onBefore(l,function(e){var t,n=e[a]=e[a]||{};return s(e)||(t=r.when(u.uiCanExit(e))).then(function(e){return n[o]=!1!==e}),t},i))}}C.module("ui.router.state").directive("uiView",Br),C.module("ui.router.state").directive("uiView",ni),C.module("ui.router.state").provider("$uiViewScroll",function(){var n=!1;this.useAnchorScroll=function(){n=!0},this.$get=["$anchorScroll","$timeout",function(e,t){return n?e:function(e){return t(function(){e[0].scrollIntoView()},0,!1)}}]});g.default="ui.router",g.core=br,g.watchDigests=Nr,g.getLocals=Wr,g.getNg1ViewConfigFactory=$r,g.ng1ViewsBuilder=Cr,g.Ng1ViewConfig=kr,g.StateProvider=Tr,g.UrlRouterProvider=Pr,g.root=F,g.fromJson=j,g.toJson=H,g.forEach=Y,g.extend=N,g.equals=q,g.identity=U,g.noop=z,g.createProxyFunctions=B,g.inherit=W,g.inArray=G,g._inArray=K,g.removeFrom=Q,g._removeFrom=Z,g.pushTo=X,g._pushTo=J,g.deregAll=ee,g.defaults=te,g.mergeR=ne,g.ancestors=re,g.pick=ie,g.omit=oe,g.pluck=ae,g.filter=se,g.find=le,g.mapObj=ue,g.map=ce,g.values=de,g.allTrueR=pe,g.anyTrueR=he,g.unnestR=fe,g.flattenR=ge,g.pushR=me,g.uniqR=ve,g.unnest=ye,g.flatten=we,g.assertPredicate=be,g.assertMap=$e,g.assertFn=_e,g.pairs=Ce,g.arrayTuples=Se,g.applyPairs=ke,g.tail=De,g.copy=xe,g._extend=Oe,g.silenceUncaughtInPromise=Ae,g.silentRejection=Pe,g.notImplemented=I,g.services=V,g.Glob=Me,g.curry=u,g.compose=n,g.pipe=l,g.prop=w,g.propEq=v,g.parse=S,g.not=d,g.and=r,g.or=i,g.all=c,g.any=p,g.is=h,g.eq=o,g.val=f,g.invoke=a,g.pattern=m,g.isUndefined=b,g.isDefined=k,g.isNull=$,g.isNullOrUndefined=_,g.isFunction=D,g.isNumber=x,g.isString=O,g.isObject=T,g.isArray=E,g.isDate=A,g.isRegExp=P,g.isInjectable=M,g.isPromise=R,g.Queue=Re,g.maxLength=Fe,g.padString=Le,g.kebobString=je,g.functionToString=He,g.fnToString=Ye,g.stringify=Ue,g.beforeAfterSubstr=ze,g.hostRegex=Be,g.stripLastPathElement=We,g.splitHash=Ge,g.splitQuery=Ke,g.splitEqual=Qe,g.trimHashVal=Ze,g.splitOnDelim=Xe,g.joinNeighborsR=Je,g.Trace=lt,g.trace=ut,g.Param=vt,g.ParamTypes=yt,g.StateParams=wt,g.ParamType=ct,g.PathNode=bt,g.PathUtils=_t,g.resolvePolicies=Ct,g.defaultResolvePolicy=St,g.Resolvable=kt,g.NATIVE_INJECTOR_TOKEN=Tt,g.ResolveContext=Et,g.resolvablesBuilder=Lt,g.StateBuilder=Yt,g.StateObject=Nt,g.StateMatcher=qt,g.StateQueueManager=Ut,g.StateRegistry=zt,g.StateService=Bn,g.TargetState=$t,g.HookBuilder=Zt,g.matchState=Gt,g.RegisteredHook=Kt,g.makeEvent=Qt,g.Rejection=Ve,g.Transition=Jt,g.TransitionHook=Wt,g.TransitionEventType=Yn,g.defaultTransOpts=Un,g.TransitionService=zn,g.UrlMatcher=rn,g.ParamFactory=an,g.UrlMatcherFactory=sn,g.UrlRouter=dn,g.UrlRuleFactory=ln,g.BaseUrlRule=un,g.UrlService=$n,g.ViewService=hn,g.UIRouterGlobals=fn,g.UIRouter=Cn,g.$q=Wn,g.$injector=Zn,g.BaseLocationServices=ar,g.HashLocationService=lr,g.MemoryLocationService=cr,g.PushStateLocationService=pr,g.MemoryLocationConfig=hr,g.BrowserLocationConfig=fr,g.keyValsToObjectR=Xn,g.getParams=Jn,g.parseUrl=er,g.buildUrl=tr,g.locationPluginFactory=nr,g.servicesPlugin=gr,g.hashLocationPlugin=mr,g.pushStateLocationPlugin=vr,g.memoryLocationPlugin=yr,g.UIRouterPluginBase=wr,Object.defineProperty(g,"__esModule",{value:!0})}),function($,l){"use strict";var _=["ng","oc.lazyLoad"],C={},S=[],k=[],u=[],D=[],x=$.noop,O={},T=[];$.module("oc.lazyLoad",["ng"]).provider("$ocLazyLoad",["$controllerProvider","$provide","$compileProvider","$filterProvider","$injector","$animateProvider",function(e,t,n,r,i,o){function c(e,t,n){if(t){var r,i,o,a=[];for(r=t.length-1;0<=r;r--)if(i=t[r],$.isString(i)||(i=h(i)),i&&-1===T.indexOf(i)&&(!f[i]||-1!==u.indexOf(i))){var s=-1===_.indexOf(i);if(o=A(i),s&&(_.push(i),c(e,o.requires,n)),0<o._runBlocks.length)for(O[i]=[];0<o._runBlocks.length;)O[i].push(o._runBlocks.shift());$.isDefined(O[i])&&(s||n.rerun)&&(a=a.concat(O[i])),d(e,o._invokeQueue,i,n.reconfig),d(e,o._configBlocks,i,n.reconfig),x(s?"ocLazyLoad.moduleLoaded":"ocLazyLoad.moduleReloaded",i),t.pop(),T.push(i)}var l=e.getInstanceInjector();$.forEach(a,function(e){l.invoke(e)})}}function p(e,a){function s(e){return $.isArray(e)?b(e.toString()):$.isObject(e)?b(w(e)):$.isDefined(e)&&null!==e?b(e.toString()):e}var n=e[2][0],l=e[1],u=!1;$.isUndefined(C[a])&&(C[a]={}),$.isUndefined(C[a][l])&&(C[a][l]={});var r=function(e,t){var n,r,i,o;C[a][l].hasOwnProperty(e)||(C[a][l][e]=[]),n=t,r=C[a][l][e],o=!0,r.length&&(i=s(n),$.forEach(r,function(e){o=o&&s(e)!==i})),o&&(u=!0,C[a][l][e].push(t),x("ocLazyLoad.componentLoaded",[a,l,e]))};if($.isString(n))r(n,e[2][1]);else{if(!$.isObject(n))return!1;$.forEach(n,function(e,t){$.isString(e)?r(e,n[1]):r(t,e)})}return u}function d(e,t,n,r){var i,o,a,s;if(t)for(i=0,o=t.length;i<o;i++)if(a=t[i],$.isArray(a)){if(null!==e){if(!e.hasOwnProperty(a[0]))throw new Error("unsupported provider "+a[0]);s=e[a[0]]}var l=p(a,n);if("invoke"!==a[1])l&&$.isDefined(s)&&s[a[1]].apply(s,a[2]);else{var u=function(e){var t=S.indexOf(n+"-"+e);(-1===t||r)&&(-1===t&&S.push(n+"-"+e),$.isDefined(s)&&s[a[1]].apply(s,a[2]))};if($.isFunction(a[2][0]))u(a[2][0]);else if($.isArray(a[2][0]))for(var c=0,d=a[2][0].length;c<d;c++)$.isFunction(a[2][0][c])&&u(a[2][0][c])}}}function h(e){var t=null;return $.isString(e)?t=e:$.isObject(e)&&e.hasOwnProperty("name")&&$.isString(e.name)&&(t=e.name),t}function a(e){if(!$.isString(e))return!1;try{return A(e)}catch(e){if(/No module/.test(e)||-1<e.message.indexOf("$injector:nomod"))return!1}}var f={},s={$controllerProvider:e,$compileProvider:n,$filterProvider:r,$provide:t,$injector:i,$animateProvider:o},g=!1,m=!1,v=[],y={};v.push=function(e){-1===this.indexOf(e)&&Array.prototype.push.apply(this,arguments)},this.config=function(e){$.isDefined(e.modules)&&($.isArray(e.modules)?$.forEach(e.modules,function(e){f[e.name]=e}):f[e.modules.name]=e.modules),$.isDefined(e.debug)&&(g=e.debug),$.isDefined(e.events)&&(m=e.events)},this._init=function(r){if(0===k.length){var t=[r],i=["ng:app","ng-app","x-ng-app","data-ng-app"],o=/\sng[:\-]app(:\s*([\w\d_]+);?)?\s/,n=function(e){return e&&t.push(e)};$.forEach(i,function(e){i[e]=!0,n(document.getElementById(e)),e=e.replace(":","\\:"),void 0!==r[0]&&r[0].querySelectorAll&&($.forEach(r[0].querySelectorAll("."+e),n),$.forEach(r[0].querySelectorAll("."+e+"\\:"),n),$.forEach(r[0].querySelectorAll("["+e+"]"),n))}),$.forEach(t,function(e){if(0===k.length){var t=" "+r.className+" ",n=o.exec(t);n?k.push((n[2]||"").replace(/\s+/g,",")):$.forEach(e.attributes,function(e){0===k.length&&i[e.name]&&k.push(e.value)})}})}0!==k.length||(l.jasmine||l.mocha)&&$.isDefined($.mock)||console.error("No module found during bootstrap, unable to init ocLazyLoad. You should always use the ng-app directive or angular.boostrap when you use ocLazyLoad.");$.forEach(k,function(e){!function e(t){if(-1===_.indexOf(t)){_.push(t);var n=$.module(t);d(null,n._invokeQueue,t),d(null,n._configBlocks,t),$.forEach(n.requires,e)}}(e)}),k=[],D.pop()};var w=function(t){try{return JSON.stringify(t)}catch(e){var n=[];return JSON.stringify(t,function(e,t){if($.isObject(t)&&null!==t){if(-1!==n.indexOf(t))return;n.push(t)}return t})}},b=function(e){var t,n,r=0;if(0==e.length)return r;for(t=0,n=e.length;t<n;t++)r=(r<<5)-r+e.charCodeAt(t),r|=0;return r};this.$get=["$log","$rootElement","$rootScope","$cacheFactory","$q",function(n,e,r,t,l){function u(e){var t=l.defer();return n.error(e.message),t.reject(e),t.promise}var i,o=t("ocLazyLoad");return g||((n={}).error=$.noop,n.warn=$.noop,n.info=$.noop),s.getInstanceInjector=function(){return i||(i=e.data("$injector")||$.injector())},{_broadcast:x=function(e,t){m&&r.$broadcast(e,t),g&&n.info(e,t)},_$log:n,_getFilesCache:function(){return o},toggleWatch:function(e){e?D.push(!0):D.pop()},getModuleConfig:function(e){if(!$.isString(e))throw new Error("You need to give the name of the module to get");return f[e]?$.copy(f[e]):null},setModuleConfig:function(e){if(!$.isObject(e))throw new Error("You need to give the module config object to set");return f[e.name]=e},getModules:function(){return _},isLoaded:function(e){var t,n;if($.isString(e)&&(e=[e]),$.isArray(e)){var r,i;for(r=0,i=e.length;r<i;r++)if(t=e[r],n=void 0,(n=-1<_.indexOf(t))||(n=!!a(t)),!n)return!1;return!0}throw new Error("You need to define the module(s) name(s)")},_getModuleName:h,_getModule:function(t){try{return A(t)}catch(e){throw(/No module/.test(e)||-1<e.message.indexOf("$injector:nomod"))&&(e.message='The module "'+w(t)+'" that you are trying to load does not exist. '+e.message),e}},moduleExists:a,_loadDependencies:function(r,i){var e,t,o,a=[],s=this;if(null===(r=s._getModuleName(r)))return l.when();try{e=s._getModule(r)}catch(e){return u(e)}return t=s.getRequires(e),$.forEach(t,function(t){if($.isString(t)){var e=s.getModuleConfig(t);if(null===e)return void v.push(t);(t=e).name=void 0}if(s.moduleExists(t.name))return 0!==(o=t.files.filter(function(e){return s.getModuleConfig(t.name).files.indexOf(e)<0})).length&&s._$log.warn('Module "',r,'" attempted to redefine configuration for dependency. "',t.name,'"\n Additional Files Loaded:',o),$.isDefined(s.filesLoader)?void a.push(s.filesLoader(t,i).then(function(){return s._loadDependencies(t)})):u(new Error("Error: New dependencies need to be loaded from external files ("+t.files+"), but no loader has been defined."));if($.isArray(t)){var n=[];$.forEach(t,function(e){var t=s.getModuleConfig(e);null===t?n.push(e):t.files&&(n=n.concat(t.files))}),0<n.length&&(t={files:n})}else $.isObject(t)&&t.hasOwnProperty("name")&&t.name&&(s.setModuleConfig(t),v.push(t.name));if($.isDefined(t.files)&&0!==t.files.length){if(!$.isDefined(s.filesLoader))return u(new Error('Error: the module "'+t.name+'" is defined in external files ('+t.files+"), but no loader has been defined."));a.push(s.filesLoader(t,i).then(function(){return s._loadDependencies(t)}))}}),l.all(a)},inject:function(e){var n=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],t=!(arguments.length<=2||void 0===arguments[2])&&arguments[2],r=this,i=l.defer();if($.isDefined(e)&&null!==e){if($.isArray(e)){var o=[];return $.forEach(e,function(e){o.push(r.inject(e,n,t))}),l.all(o)}r._addToLoadList(r._getModuleName(e),!0,t)}if(0<k.length){var a=k.slice();!function e(t){v.push(t),y[t]=i.promise,r._loadDependencies(t,n).then(function(){try{T=[],c(s,v,n)}catch(e){return r._$log.error(e.message),void i.reject(e)}0<k.length?e(k.shift()):i.resolve(a)},function(e){i.reject(e)})}(k.shift())}else{if(n&&n.name&&y[n.name])return y[n.name];i.resolve()}return i.promise},getRequires:function(e){var t=[];return $.forEach(e.requires,function(e){-1===_.indexOf(e)&&t.push(e)}),t},_invokeQueue:d,_registerInvokeList:p,_register:c,_addToLoadList:E,_unregister:function(e){$.isDefined(e)&&$.isArray(e)&&$.forEach(e,function(e){C[e]=void 0})}}}],this._init($.element(l.document))}]);var r=$.bootstrap;$.bootstrap=function(e,t,n){return _=["ng","oc.lazyLoad"],C={},S=[],k=[],u=[],D=[],x=$.noop,O={},T=[],$.forEach(t.slice(),function(e){E(e,!0,!0)}),r(e,t,n)};var E=function(e,t,n){(0<D.length||t)&&$.isString(e)&&-1===k.indexOf(e)&&(k.push(e),n&&u.push(e))},A=$.module;$.module=function(e,t,n){return E(e,!1,!0),A(e,t,n)},"undefined"!=typeof module&&"undefined"!=typeof exports&&module.exports===exports&&(module.exports="oc.lazyLoad")}(angular,window),function(u){"use strict";u.module("oc.lazyLoad").directive("ocLazyLoad",["$ocLazyLoad","$compile","$animate","$parse","$timeout",function(o,a,s,l,e){return{restrict:"A",terminal:!0,priority:1e3,compile:function(e,t){var i=e[0].innerHTML;return e.html(""),function(t,n,e){var r=l(e.ocLazyLoad);t.$watch(function(){return r(t)||e.ocLazyLoad},function(e){u.isDefined(e)&&o.load(e).then(function(){s.enter(i,n),a(n.contents())(t)})},!0)}}}}])}(angular),function(C){"use strict";C.module("oc.lazyLoad").config(["$provide",function(e){e.decorator("$ocLazyLoad",["$delegate","$q","$window","$interval",function(v,y,w,b){var $=!1,_=w.document.getElementsByTagName("head")[0]||w.document.getElementsByTagName("body")[0];return v.buildElement=function(e,t,n){var r,i,o=y.defer(),a=v._getFilesCache(),s=function(e){var t=(new Date).getTime();return 0<=e.indexOf("?")?"&"===e.substring(0,e.length-1)?e+"_dc="+t:e+"&_dc="+t:e+"?_dc="+t};switch(C.isUndefined(a.get(t))&&a.put(t,o.promise),e){case"css":(r=w.document.createElement("link")).type="text/css",r.rel="stylesheet",r.href=!1===n.cache?s(t):t;break;case"js":(r=w.document.createElement("script")).src=!1===n.cache?s(t):t;break;default:a.remove(t),o.reject(new Error('Requested type "'+e+'" is not known. Could not inject "'+t+'"'))}r.onload=r.onreadystatechange=function(e){r.readyState&&!/^c|loade/.test(r.readyState)||i||(r.onload=r.onreadystatechange=null,i=1,v._broadcast("ocLazyLoad.fileLoaded",t),o.resolve(r))},r.onerror=function(){a.remove(t),o.reject(new Error("Unable to load "+t))},r.async=n.serie?0:1;var l=_.lastChild;if(n.insertBefore){var u=C.element(C.isDefined(window.jQuery)?n.insertBefore:document.querySelector(n.insertBefore));u&&0<u.length&&(l=u[0])}if(l.parentNode.insertBefore(r,l),"css"==e){var c=w.navigator.userAgent.toLowerCase();if(-1<c.indexOf("phantomjs/1.9"))$=!0;else if(/iP(hone|od|ad)/.test(w.navigator.platform)){var d=w.navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/),p=parseFloat([parseInt(d[1],10),parseInt(d[2],10),parseInt(d[3]||0,10)].join("."));$=p<6}else if(-1<c.indexOf("android")){var h=parseFloat(c.slice(c.indexOf("android")+8));$=h<4.4}else if(-1<c.indexOf("safari")){var f=c.match(/version\/([\.\d]+)/i);$=f&&f[1]&&parseFloat(f[1])<6}if($)var g=1e3,m=b(function(){try{r.sheet.cssRules,b.cancel(m),r.onload()}catch(e){--g<=0&&r.onerror()}},20)}return o.promise},v}])}])}(angular),function(m){"use strict";m.module("oc.lazyLoad").config(["$provide",function(e){e.decorator("$ocLazyLoad",["$delegate","$q",function(f,g){return f.filesLoader=function(e){var r=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],i=[],o=[],a=[],s=[],l=null,u=f._getFilesCache();f.toggleWatch(!0),m.extend(r,e);var t=function(e){var t,n=null;if(m.isObject(e)&&(n=e.type,e=e.path),l=u.get(e),m.isUndefined(l)||!1===r.cache){if(null!==(t=/^(css|less|html|htm|js)?(?=!)/.exec(e))&&(n=t[1],e=e.substr(t[1].length+1,e.length)),!n)if(null!==(t=/[.](css|less|html|htm|js)?((\?|#).*)?$/.exec(e)))n=t[1];else{if(f.jsLoader.hasOwnProperty("ocLazyLoadLoader")||!f.jsLoader.hasOwnProperty("requirejs"))return void f._$log.error("File type could not be determined. "+e);n="js"}"css"!==n&&"less"!==n||-1!==i.indexOf(e)?"html"!==n&&"htm"!==n||-1!==o.indexOf(e)?"js"===n||-1===a.indexOf(e)?a.push(e):f._$log.error("File type is not valid. "+e):o.push(e):i.push(e)}else l&&s.push(l)};if(r.serie?t(r.files.shift()):m.forEach(r.files,function(e){t(e)}),0<i.length){var n=g.defer();f.cssLoader(i,function(e){m.isDefined(e)&&f.cssLoader.hasOwnProperty("ocLazyLoadLoader")?(f._$log.error(e),n.reject(e)):n.resolve()},r),s.push(n.promise)}if(0<o.length){var c=g.defer();f.templatesLoader(o,function(e){m.isDefined(e)&&f.templatesLoader.hasOwnProperty("ocLazyLoadLoader")?(f._$log.error(e),c.reject(e)):c.resolve()},r),s.push(c.promise)}if(0<a.length){var d=g.defer();f.jsLoader(a,function(e){m.isDefined(e)&&(f.jsLoader.hasOwnProperty("ocLazyLoadLoader")||f.jsLoader.hasOwnProperty("requirejs"))?(f._$log.error(e),d.reject(e)):d.resolve()},r),s.push(d.promise)}if(0!==s.length)return r.serie&&0<r.files.length?g.all(s).then(function(){return f.filesLoader(e,r)}):g.all(s).finally(function(e){return f.toggleWatch(!1),e});var p=g.defer(),h="Error: no file to load has been found, if you're trying to load an existing module you should use the 'inject' method instead of 'load'.";return f._$log.error(h),p.reject(h),p.promise},f.load=function(e){var t,n=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],r=this,i=null,o=[],a=g.defer(),s=m.copy(e),l=m.copy(n);if(m.isArray(s))return m.forEach(s,function(e){o.push(r.load(e,l))}),g.all(o).then(function(e){a.resolve(e)},function(e){a.reject(e)}),a.promise;if(m.isString(s)?(i=r.getModuleConfig(s))||(i={files:[s]}):m.isObject(s)&&(i=m.isDefined(s.path)&&m.isDefined(s.type)?{files:[s]}:r.setModuleConfig(s)),null===i)return t='Module "'+(r._getModuleName(s)||"unknown")+'" is not configured, cannot load.',f._$log.error(t),a.reject(new Error(t)),a.promise;m.isDefined(i.template)&&(m.isUndefined(i.files)&&(i.files=[]),m.isString(i.template)?i.files.push(i.template):m.isArray(i.template)&&i.files.concat(i.template));var u=m.extend({},l,i);return m.isUndefined(i.files)&&m.isDefined(i.name)&&f.moduleExists(i.name)?f.inject(i.name,u,!0):(f.filesLoader(i,u).then(function(){f.inject(null,u).then(function(e){a.resolve(e)},function(e){a.reject(e)})},function(e){a.reject(e)}),a.promise)},f}])}])}(angular),function(a){"use strict";a.module("oc.lazyLoad").config(["$provide",function(e){e.decorator("$ocLazyLoad",["$delegate","$q",function(i,o){return i.cssLoader=function(e,t,n){var r=[];a.forEach(e,function(e){r.push(i.buildElement("css",e,n))}),o.all(r).then(function(){t()},function(e){t(e)})},i.cssLoader.ocLazyLoadLoader=!0,i}])}])}(angular),function(a){"use strict";a.module("oc.lazyLoad").config(["$provide",function(e){e.decorator("$ocLazyLoad",["$delegate","$q",function(i,o){return i.jsLoader=function(e,t,n){var r=[];a.forEach(e,function(e){r.push(i.buildElement("js",e,n))}),o.all(r).then(function(){t()},function(e){t(e)})},i.jsLoader.ocLazyLoadLoader=!0,i}])}])}(angular),function(c){"use strict";c.module("oc.lazyLoad").config(["$provide",function(e){e.decorator("$ocLazyLoad",["$delegate","$templateCache","$q","$http",function(n,s,l,u){return n.templatesLoader=function(e,t,i){var o=[],a=n._getFilesCache();return c.forEach(e,function(n){var r=l.defer();o.push(r.promise),u.get(n,i).then(function(e){var t=e.data;c.isString(t)&&0<t.length&&c.forEach(c.element(t),function(e){"SCRIPT"===e.nodeName&&"text/ng-template"===e.type&&s.put(e.id,e.innerHTML)}),c.isUndefined(a.get(n))&&a.put(n,!0),r.resolve()}).catch(function(e){r.reject(new Error('Unable to load template file "'+n+'": '+e.data))})}),l.all(o).then(function(){t()},function(e){t(e)})},n.templatesLoader.ocLazyLoadLoader=!0,n}])}])}(angular),Array.prototype.indexOf||(Array.prototype.indexOf=function(e,t){var n;if(null==this)throw new TypeError('"this" is null or not defined');var r=Object(this),i=r.length>>>0;if(0===i)return-1;var o=+t||0;if(Math.abs(o)===1/0&&(o=0),i<=o)return-1;for(n=Math.max(0<=o?o:i-Math.abs(o),0);n<i;){if(n in r&&r[n]===e)return n;n++}return-1}),function(){"use strict";angular.module("angular-loading-bar",["cfp.loadingBarInterceptor"]),angular.module("chieffancypants.loadingBar",["cfp.loadingBarInterceptor"]),angular.module("cfp.loadingBarInterceptor",["cfp.loadingBar"]).config(["$httpProvider",function(h){var e=["$q","$cacheFactory","$timeout","$rootScope","$log","cfpLoadingBar",function(t,o,n,r,i,a){function s(){n.cancel(u),a.complete(),c=d=0}function l(e){var t,n=o.get("$http"),r=h.defaults;!e.cache&&!r.cache||!1===e.cache||"GET"!==e.method&&"JSONP"!==e.method||(t=angular.isObject(e.cache)?e.cache:angular.isObject(r.cache)?r.cache:n);var i=void 0!==t&&void 0!==t.get(e.url);return void 0!==e.cached&&i!==e.cached?e.cached:e.cached=i}var u,c=0,d=0,p=a.latencyThreshold;return{request:function(e){return e.ignoreLoadingBar||l(e)||(r.$broadcast("cfpLoadingBar:loading",{url:e.url}),0===c&&(u=n(function(){a.start()},p)),c++,a.set(d/c)),e},response:function(e){return e&&e.config?e.config.ignoreLoadingBar||l(e.config)||(d++,r.$broadcast("cfpLoadingBar:loaded",{url:e.config.url,result:e}),c<=d?s():a.set(d/c)):i.error("Broken interceptor detected: Config object not supplied in response:\n https://github.com/chieffancypants/angular-loading-bar/pull/50"),e},responseError:function(e){return e&&e.config?e.config.ignoreLoadingBar||l(e.config)||(d++,r.$broadcast("cfpLoadingBar:loaded",{url:e.config.url,result:e}),c<=d?s():a.set(d/c)):i.error("Broken interceptor detected: Config object not supplied in rejection:\n https://github.com/chieffancypants/angular-loading-bar/pull/50"),t.reject(e)}}}];h.interceptors.push(e)}]),angular.module("cfp.loadingBar",[]).provider("cfpLoadingBar",function(){this.autoIncrement=!0,this.includeSpinner=!0,this.includeBar=!0,this.latencyThreshold=100,this.startSize=.02,this.parentSelector="body",this.spinnerTemplate='<div id="loading-bar-spinner"><div class="spinner-icon"></div></div>',this.loadingBarTemplate='<div id="loading-bar"><div class="bar"><div class="peg"></div></div></div>',this.$get=["$injector","$document","$timeout","$rootScope",function(i,o,a,s){function l(e){if(m){var t=100*e+"%";f.css("width",t),v=e,y&&(a.cancel(c),c=a(function(){n()},250))}}function n(){if(!(1<=r())){var e,t=r();e=0<=t&&t<.25?(3*Math.random()+3)/100:.25<=t&&t<.65?3*Math.random()/100:.65<=t&&t<.9?2*Math.random()/100:.9<=t&&t<.99?.005:0,l(r()+e)}}function r(){return v}function t(){v=0,m=!1}var u,c,d,p=this.parentSelector,h=angular.element(this.loadingBarTemplate),f=h.find("div").eq(0),g=angular.element(this.spinnerTemplate),m=!1,v=0,y=this.autoIncrement,w=this.includeSpinner,b=this.includeBar,$=this.startSize;return{start:function(){if(u||(u=i.get("$animate")),a.cancel(d),!m){var e=o[0],t=e.querySelector?e.querySelector(p):o.find(p)[0];t||(t=e.getElementsByTagName("body")[0]);var n=angular.element(t),r=t.lastChild&&angular.element(t.lastChild);s.$broadcast("cfpLoadingBar:started"),m=!0,b&&u.enter(h,n,r),w&&u.enter(g,n,h),l($)}},set:l,status:r,inc:n,complete:function(){u||(u=i.get("$animate")),s.$broadcast("cfpLoadingBar:completed"),l(1),a.cancel(d),d=a(function(){var e=u.leave(h,t);e&&e.then&&e.then(t),u.leave(g)},500)},autoIncrement:this.autoIncrement,includeSpinner:this.includeSpinner,latencyThreshold:this.latencyThreshold,parentSelector:this.parentSelector,startSize:this.startSize}}]})}(),angular.module("ui.bootstrap",["ui.bootstrap.tpls","ui.bootstrap.transition","ui.bootstrap.collapse","ui.bootstrap.accordion","ui.bootstrap.alert","ui.bootstrap.bindHtml","ui.bootstrap.buttons","ui.bootstrap.carousel","ui.bootstrap.dateparser","ui.bootstrap.position","ui.bootstrap.datepicker","ui.bootstrap.dropdown","ui.bootstrap.modal","ui.bootstrap.pagination","ui.bootstrap.tooltip","ui.bootstrap.popover","ui.bootstrap.progressbar","ui.bootstrap.rating","ui.bootstrap.tabs","ui.bootstrap.timepicker","ui.bootstrap.typeahead"]),angular.module("ui.bootstrap.tpls",["template/accordion/accordion-group.html","template/accordion/accordion.html","template/alert/alert.html","template/carousel/carousel.html","template/carousel/slide.html","template/datepicker/datepicker.html","template/datepicker/day.html","template/datepicker/month.html","template/datepicker/popup.html","template/datepicker/year.html","template/modal/backdrop.html","template/modal/window.html","template/pagination/pager.html","template/pagination/pagination.html","template/tooltip/tooltip-html-unsafe-popup.html","template/tooltip/tooltip-popup.html","template/popover/popover.html","template/progressbar/bar.html","template/progressbar/progress.html","template/progressbar/progressbar.html","template/rating/rating.html","template/tabs/tab.html","template/tabs/tabset.html","template/timepicker/timepicker.html","template/typeahead/typeahead-match.html","template/typeahead/typeahead-popup.html"]),angular.module("ui.bootstrap.transition",[]).factory("$transition",["$q","$timeout","$rootScope",function(a,s,l){function e(e){for(var t in e)if(void 0!==n.style[t])return e[t]}var u=function(e,t,n){n=n||{};var r=a.defer(),i=u[n.animation?"animationEndEventName":"transitionEndEventName"],o=function(){l.$apply(function(){e.unbind(i,o),r.resolve(e)})};return i&&e.bind(i,o),s(function(){angular.isString(t)?e.addClass(t):angular.isFunction(t)?t(e):angular.isObject(t)&&e.css(t),i||r.resolve(e)}),r.promise.cancel=function(){i&&e.unbind(i,o),r.reject("Transition cancelled")},r.promise},n=document.createElement("trans");return u.transitionEndEventName=e({WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",transition:"transitionend"}),u.animationEndEventName=e({WebkitTransition:"webkitAnimationEnd",MozTransition:"animationend",OTransition:"oAnimationEnd",transition:"animationend"}),u}]),angular.module("ui.bootstrap.collapse",["ui.bootstrap.transition"]).directive("collapse",["$transition",function(l){return{link:function(e,r,t){function n(e){function t(){a===n&&(a=void 0)}var n=l(r,e);return a&&a.cancel(),(a=n).then(t,t),n}function i(){r.removeClass("collapsing"),r.addClass("collapse in"),r.css({height:"auto"})}function o(){r.removeClass("collapsing"),r.addClass("collapse")}var a,s=!0;e.$watch(t.collapse,function(e){e?s?(s=!1,o(),r.css({height:0})):(r.css({height:r[0].scrollHeight+"px"}),r[0].offsetWidth,r.removeClass("collapse in").addClass("collapsing"),n({height:0}).then(o)):s?(s=!1,i()):(r.removeClass("collapse").addClass("collapsing"),n({height:r[0].scrollHeight+"px"}).then(i))})}}}]),angular.module("ui.bootstrap.accordion",["ui.bootstrap.collapse"]).constant("accordionConfig",{closeOthers:!0}).controller("AccordionController",["$scope","$attrs","accordionConfig",function(e,n,r){this.groups=[],this.closeOthers=function(t){(angular.isDefined(n.closeOthers)?e.$eval(n.closeOthers):r.closeOthers)&&angular.forEach(this.groups,function(e){e!==t&&(e.isOpen=!1)})},this.addGroup=function(e){var t=this;this.groups.push(e),e.$on("$destroy",function(){t.removeGroup(e)})},this.removeGroup=function(e){var t=this.groups.indexOf(e);-1!==t&&this.groups.splice(t,1)}}]).directive("accordion",function(){return{restrict:"EA",controller:"AccordionController",transclude:!0,replace:!1,templateUrl:"template/accordion/accordion.html"}}).directive("accordionGroup",function(){return{require:"^accordion",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/accordion/accordion-group.html",scope:{heading:"@",isOpen:"=?",isDisabled:"=?"},controller:function(){this.setHeading=function(e){this.heading=e}},link:function(t,e,n,r){r.addGroup(t),t.$watch("isOpen",function(e){e&&r.closeOthers(t)}),t.toggleOpen=function(){t.isDisabled||(t.isOpen=!t.isOpen)}}}}).directive("accordionHeading",function(){return{restrict:"EA",transclude:!0,template:"",replace:!0,require:"^accordionGroup",link:function(e,t,n,r,i){r.setHeading(i(e,function(){}))}}}).directive("accordionTransclude",function(){return{require:"^accordionGroup",link:function(e,t,n,r){e.$watch(function(){return r[n.accordionTransclude]},function(e){e&&(t.html(""),t.append(e))})}}}),angular.module("ui.bootstrap.alert",[]).controller("AlertController",["$scope","$attrs",function(e,t){e.closeable="close"in t,this.close=e.close}]).directive("alert",function(){return{restrict:"EA",controller:"AlertController",templateUrl:"template/alert/alert.html",transclude:!0,replace:!0,scope:{type:"@",close:"&"}}}).directive("dismissOnTimeout",["$timeout",function(i){return{require:"alert",link:function(e,t,n,r){i(function(){r.close()},parseInt(n.dismissOnTimeout,10))}}}]),angular.module("ui.bootstrap.bindHtml",[]).directive("bindHtmlUnsafe",function(){return function(e,t,n){t.addClass("ng-binding").data("$binding",n.bindHtmlUnsafe),e.$watch(n.bindHtmlUnsafe,function(e){t.html(e||"")})}}),angular.module("ui.bootstrap.buttons",[]).constant("buttonConfig",{activeClass:"active",toggleEvent:"click"}).controller("ButtonsController",["buttonConfig",function(e){this.activeClass=e.activeClass||"active",this.toggleEvent=e.toggleEvent||"click"}]).directive("btnRadio",function(){return{require:["btnRadio","ngModel"],controller:"ButtonsController",link:function(t,n,r,e){var i=e[0],o=e[1];o.$render=function(){n.toggleClass(i.activeClass,angular.equals(o.$modelValue,t.$eval(r.btnRadio)))},n.bind(i.toggleEvent,function(){var e=n.hasClass(i.activeClass);(!e||angular.isDefined(r.uncheckable))&&t.$apply(function(){o.$setViewValue(e?null:t.$eval(r.btnRadio)),o.$render()})})}}}).directive("btnCheckbox",function(){return{require:["btnCheckbox","ngModel"],controller:"ButtonsController",link:function(r,e,t,n){function i(){return o(t.btnCheckboxTrue,!0)}function o(e,t){var n=r.$eval(e);return angular.isDefined(n)?n:t}var a=n[0],s=n[1];s.$render=function(){e.toggleClass(a.activeClass,angular.equals(s.$modelValue,i()))},e.bind(a.toggleEvent,function(){r.$apply(function(){s.$setViewValue(e.hasClass(a.activeClass)?o(t.btnCheckboxFalse,!1):i()),s.$render()})})}}}),angular.module("ui.bootstrap.carousel",["ui.bootstrap.transition"]).controller("CarouselController",["$scope","$timeout","$interval","$transition",function(a,t,n,s){function l(){r();var e=+a.interval;!isNaN(e)&&0<e&&(o=n(i,e))}function r(){o&&(n.cancel(o),o=null)}function i(){var e=+a.interval;u&&!isNaN(e)&&0<e?a.next():a.pause()}var o,u,c=this,d=c.slides=a.slides=[],p=-1;c.currentSlide=null;var h=!1;c.select=a.select=function(n,r){function e(){var e,t;h||(c.currentSlide&&angular.isString(r)&&!a.noTransition&&n.$element?(n.$element.addClass(r),n.$element[0].offsetWidth,angular.forEach(d,function(e){angular.extend(e,{direction:"",entering:!1,leaving:!1,active:!1})}),angular.extend(n,{direction:r,active:!0,entering:!0}),angular.extend(c.currentSlide||{},{direction:r,leaving:!0}),a.$currentTransition=s(n.$element,{}),e=n,t=c.currentSlide,a.$currentTransition.then(function(){i(e,t)},function(){i(e,t)})):i(n,c.currentSlide),c.currentSlide=n,p=o,l())}function i(e,t){angular.extend(e,{direction:"",active:!0,leaving:!1,entering:!1}),angular.extend(t||{},{direction:"",active:!1,leaving:!1,entering:!1}),a.$currentTransition=null}var o=d.indexOf(n);void 0===r&&(r=p<o?"next":"prev"),n&&n!==c.currentSlide&&(a.$currentTransition?(a.$currentTransition.cancel(),t(e)):e())},a.$on("$destroy",function(){h=!0}),c.indexOfSlide=function(e){return d.indexOf(e)},a.next=function(){var e=(p+1)%d.length;return a.$currentTransition?void 0:c.select(d[e],"next")},a.prev=function(){var e=p-1<0?d.length-1:p-1;return a.$currentTransition?void 0:c.select(d[e],"prev")},a.isActive=function(e){return c.currentSlide===e},a.$watch("interval",l),a.$on("$destroy",r),a.play=function(){u||(u=!0,l())},a.pause=function(){a.noPause||(u=!1,r())},c.addSlide=function(e,t){e.$element=t,d.push(e),1===d.length||e.active?(c.select(d[d.length-1]),1==d.length&&a.play()):e.active=!1},c.removeSlide=function(e){var t=d.indexOf(e);d.splice(t,1),0<d.length&&e.active?c.select(t>=d.length?d[t-1]:d[t]):t<p&&p--}}]).directive("carousel",[function(){return{restrict:"EA",transclude:!0,replace:!0,controller:"CarouselController",require:"carousel",templateUrl:"template/carousel/carousel.html",scope:{interval:"=",noTransition:"=",noPause:"="}}}]).directive("slide",function(){return{require:"^carousel",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/carousel/slide.html",scope:{active:"=?"},link:function(t,e,n,r){r.addSlide(t,e),t.$on("$destroy",function(){r.removeSlide(t)}),t.$watch("active",function(e){e&&r.select(t)})}}}),angular.module("ui.bootstrap.dateparser",[]).service("dateParser",["$locale","orderByFilter",function(v,y){this.parsers={};var w={yyyy:{regex:"\\d{4}",apply:function(e){this.year=+e}},yy:{regex:"\\d{2}",apply:function(e){this.year=+e+2e3}},y:{regex:"\\d{1,4}",apply:function(e){this.year=+e}},MMMM:{regex:v.DATETIME_FORMATS.MONTH.join("|"),apply:function(e){this.month=v.DATETIME_FORMATS.MONTH.indexOf(e)}},MMM:{regex:v.DATETIME_FORMATS.SHORTMONTH.join("|"),apply:function(e){this.month=v.DATETIME_FORMATS.SHORTMONTH.indexOf(e)}},MM:{regex:"0[1-9]|1[0-2]",apply:function(e){this.month=e-1}},M:{regex:"[1-9]|1[0-2]",apply:function(e){this.month=e-1}},dd:{regex:"[0-2][0-9]{1}|3[0-1]{1}",apply:function(e){this.date=+e}},d:{regex:"[1-2]?[0-9]{1}|3[0-1]{1}",apply:function(e){this.date=+e}},EEEE:{regex:v.DATETIME_FORMATS.DAY.join("|")},EEE:{regex:v.DATETIME_FORMATS.SHORTDAY.join("|")}};this.parse=function(e,t){if(!angular.isString(e)||!t)return e;var o,a,s;t=v.DATETIME_FORMATS[t]||t,this.parsers[t]||(this.parsers[t]=(a=[],s=(o=t).split(""),angular.forEach(w,function(e,t){var n=o.indexOf(t);if(-1<n){o=o.split(""),s[n]="("+e.regex+")",o[n]="$";for(var r=n+1,i=n+t.length;r<i;r++)s[r]="",o[r]="$";o=o.join(""),a.push({index:n,apply:e.apply})}}),{regex:new RegExp("^"+s.join("")+"$"),map:y(a,"index")}));var n,r,i,l=this.parsers[t],u=l.regex,c=l.map,d=e.match(u);if(d&&d.length){for(var p,h={year:1900,month:0,date:1,hours:0},f=1,g=d.length;f<g;f++){var m=c[f-1];m.apply&&m.apply.call(h,d[f])}return n=h.year,i=h.date,(1===(r=h.month)&&28<i?29===i&&(n%4==0&&n%100!=0||n%400==0):3!==r&&5!==r&&8!==r&&10!==r||i<31)&&(p=new Date(h.year,h.month,h.date,h.hours)),p}}}]),angular.module("ui.bootstrap.position",[]).factory("$position",["$document","$window",function(o,r){function a(e){return"static"===(n="position",((t=e).currentStyle?t.currentStyle[n]:r.getComputedStyle?r.getComputedStyle(t)[n]:t.style[n])||"static");var t,n}return{position:function(e){var t=this.offset(e),n={top:0,left:0},r=function(e){for(var t=o[0],n=e.offsetParent||t;n&&n!==t&&a(n);)n=n.offsetParent;return n||t}(e[0]);r!=o[0]&&((n=this.offset(angular.element(r))).top+=r.clientTop-r.scrollTop,n.left+=r.clientLeft-r.scrollLeft);var i=e[0].getBoundingClientRect();return{width:i.width||e.prop("offsetWidth"),height:i.height||e.prop("offsetHeight"),top:t.top-n.top,left:t.left-n.left}},offset:function(e){var t=e[0].getBoundingClientRect();return{width:t.width||e.prop("offsetWidth"),height:t.height||e.prop("offsetHeight"),top:t.top+(r.pageYOffset||o[0].documentElement.scrollTop),left:t.left+(r.pageXOffset||o[0].documentElement.scrollLeft)}},positionElements:function(e,t,n,r){var i,o,a,s,l=n.split("-"),u=l[0],c=l[1]||"center";i=r?this.offset(e):this.position(e),o=t.prop("offsetWidth"),a=t.prop("offsetHeight");var d={center:function(){return i.left+i.width/2-o/2},left:function(){return i.left},right:function(){return i.left+i.width}},p={center:function(){return i.top+i.height/2-a/2},top:function(){return i.top},bottom:function(){return i.top+i.height}};switch(u){case"right":s={top:p[c](),left:d[u]()};break;case"left":s={top:p[c](),left:i.left-o};break;case"bottom":s={top:p[u](),left:d[c]()};break;default:s={top:i.top-a,left:d[c]()}}return s}}}]),angular.module("ui.bootstrap.datepicker",["ui.bootstrap.dateparser","ui.bootstrap.position"]).constant("datepickerConfig",{formatDay:"dd",formatMonth:"MMMM",formatYear:"yyyy",formatDayHeader:"EEE",formatDayTitle:"MMMM yyyy",formatMonthTitle:"yyyy",datepickerMode:"day",minMode:"day",maxMode:"year",showWeeks:!0,startingDay:0,yearRange:20,minDate:null,maxDate:null}).controller("DatepickerController",["$scope","$attrs","$parse","$interpolate","$timeout","$log","dateFilter","datepickerConfig",function(n,r,e,i,t,o,a,s){var l=this,u={$setViewValue:angular.noop};this.modes=["day","month","year"],angular.forEach(["formatDay","formatMonth","formatYear","formatDayHeader","formatDayTitle","formatMonthTitle","minMode","maxMode","showWeeks","startingDay","yearRange"],function(e,t){l[e]=angular.isDefined(r[e])?t<8?i(r[e])(n.$parent):n.$parent.$eval(r[e]):s[e]}),angular.forEach(["minDate","maxDate"],function(t){r[t]?n.$parent.$watch(e(r[t]),function(e){l[t]=e?new Date(e):null,l.refreshView()}):l[t]=s[t]?new Date(s[t]):null}),n.datepickerMode=n.datepickerMode||s.datepickerMode,n.uniqueId="datepicker-"+n.$id+"-"+Math.floor(1e4*Math.random()),this.activeDate=angular.isDefined(r.initDate)?n.$parent.$eval(r.initDate):new Date,n.isActive=function(e){return 0===l.compare(e.date,l.activeDate)&&(n.activeDateId=e.uid,!0)},this.init=function(e){(u=e).$render=function(){l.render()}},this.render=function(){if(u.$modelValue){var e=new Date(u.$modelValue),t=!isNaN(e);t?this.activeDate=e:o.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.'),u.$setValidity("date",t)}this.refreshView()},this.refreshView=function(){if(this.element){this._refreshView();var e=u.$modelValue?new Date(u.$modelValue):null;u.$setValidity("date-disabled",!e||this.element&&!this.isDisabled(e))}},this.createDateObject=function(e,t){var n=u.$modelValue?new Date(u.$modelValue):null;return{date:e,label:a(e,t),selected:n&&0===this.compare(e,n),disabled:this.isDisabled(e),current:0===this.compare(e,new Date)}},this.isDisabled=function(e){return this.minDate&&this.compare(e,this.minDate)<0||this.maxDate&&0<this.compare(e,this.maxDate)||r.dateDisabled&&n.dateDisabled({date:e,mode:n.datepickerMode})},this.split=function(e,t){for(var n=[];0<e.length;)n.push(e.splice(0,t));return n},n.select=function(e){if(n.datepickerMode===l.minMode){var t=u.$modelValue?new Date(u.$modelValue):new Date(0,0,0,0,0,0,0);t.setFullYear(e.getFullYear(),e.getMonth(),e.getDate()),u.$setViewValue(t),u.$render()}else l.activeDate=e,n.datepickerMode=l.modes[l.modes.indexOf(n.datepickerMode)-1]},n.move=function(e){var t=l.activeDate.getFullYear()+e*(l.step.years||0),n=l.activeDate.getMonth()+e*(l.step.months||0);l.activeDate.setFullYear(t,n,1),l.refreshView()},n.toggleMode=function(e){e=e||1,n.datepickerMode===l.maxMode&&1===e||n.datepickerMode===l.minMode&&-1===e||(n.datepickerMode=l.modes[l.modes.indexOf(n.datepickerMode)+e])},n.keys={13:"enter",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down"};var c=function(){t(function(){l.element[0].focus()},0,!1)};n.$on("datepicker.focus",c),n.keydown=function(e){var t=n.keys[e.which];if(t&&!e.shiftKey&&!e.altKey)if(e.preventDefault(),e.stopPropagation(),"enter"===t||"space"===t){if(l.isDisabled(l.activeDate))return;n.select(l.activeDate),c()}else!e.ctrlKey||"up"!==t&&"down"!==t?(l.handleKeyDown(t,e),l.refreshView()):(n.toggleMode("up"===t?1:-1),c())}}]).directive("datepicker",function(){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/datepicker.html",scope:{datepickerMode:"=?",dateDisabled:"&"},require:["datepicker","?^ngModel"],controller:"DatepickerController",link:function(e,t,n,r){var i=r[0],o=r[1];o&&i.init(o)}}}).directive("daypicker",["dateFilter",function(h){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/day.html",require:"^datepicker",link:function(d,e,t,p){function r(e,t){return 1!==t||e%4!=0||e%100==0&&e%400!=0?n[t]:29}d.showWeeks=p.showWeeks,p.step={months:1},p.element=e;var n=[31,28,31,30,31,30,31,31,30,31,30,31];p._refreshView=function(){var e=p.activeDate.getFullYear(),t=p.activeDate.getMonth(),n=new Date(e,t,1),r=p.startingDay-n.getDay(),i=0<r?7-r:-r,o=new Date(n);0<i&&o.setDate(1-i);for(var a=function(e,t){var n=new Array(t),r=new Date(e),i=0;for(r.setHours(12);i<t;)n[i++]=new Date(r),r.setDate(r.getDate()+1);return n}(o,42),s=0;s<42;s++)a[s]=angular.extend(p.createDateObject(a[s],p.formatDay),{secondary:a[s].getMonth()!==t,uid:d.uniqueId+"-"+s});d.labels=new Array(7);for(var l=0;l<7;l++)d.labels[l]={abbr:h(a[l].date,p.formatDayHeader),full:h(a[l].date,"EEEE")};if(d.title=h(p.activeDate,p.formatDayTitle),d.rows=p.split(a,7),d.showWeeks){d.weekNumbers=[];for(var u=function(e){var t=new Date(e);t.setDate(t.getDate()+4-(t.getDay()||7));var n=t.getTime();return t.setMonth(0),t.setDate(1),Math.floor(Math.round((n-t)/864e5)/7)+1}(d.rows[0][0].date),c=d.rows.length;d.weekNumbers.push(u++)<c;);}},p.compare=function(e,t){return new Date(e.getFullYear(),e.getMonth(),e.getDate())-new Date(t.getFullYear(),t.getMonth(),t.getDate())},p.handleKeyDown=function(e){var t=p.activeDate.getDate();if("left"===e)t-=1;else if("up"===e)t-=7;else if("right"===e)t+=1;else if("down"===e)t+=7;else if("pageup"===e||"pagedown"===e){var n=p.activeDate.getMonth()+("pageup"===e?-1:1);p.activeDate.setMonth(n,1),t=Math.min(r(p.activeDate.getFullYear(),p.activeDate.getMonth()),t)}else"home"===e?t=1:"end"===e&&(t=r(p.activeDate.getFullYear(),p.activeDate.getMonth()));p.activeDate.setDate(t)},p.refreshView()}}}]).directive("monthpicker",["dateFilter",function(o){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/month.html",require:"^datepicker",link:function(r,e,t,i){i.step={years:1},i.element=e,i._refreshView=function(){for(var e=new Array(12),t=i.activeDate.getFullYear(),n=0;n<12;n++)e[n]=angular.extend(i.createDateObject(new Date(t,n,1),i.formatMonth),{uid:r.uniqueId+"-"+n});r.title=o(i.activeDate,i.formatMonthTitle),r.rows=i.split(e,3)},i.compare=function(e,t){return new Date(e.getFullYear(),e.getMonth())-new Date(t.getFullYear(),t.getMonth())},i.handleKeyDown=function(e){var t=i.activeDate.getMonth();if("left"===e)t-=1;else if("up"===e)t-=3;else if("right"===e)t+=1;else if("down"===e)t+=3;else if("pageup"===e||"pagedown"===e){var n=i.activeDate.getFullYear()+("pageup"===e?-1:1);i.activeDate.setFullYear(n)}else"home"===e?t=0:"end"===e&&(t=11);i.activeDate.setMonth(t)},i.refreshView()}}}]).directive("yearpicker",["dateFilter",function(){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/year.html",require:"^datepicker",link:function(r,e,t,i){function o(e){return parseInt((e-1)/a,10)*a+1}var a=i.yearRange;i.step={years:a},i.element=e,i._refreshView=function(){for(var e=new Array(a),t=0,n=o(i.activeDate.getFullYear());t<a;t++)e[t]=angular.extend(i.createDateObject(new Date(n+t,0,1),i.formatYear),{uid:r.uniqueId+"-"+t});r.title=[e[0].label,e[a-1].label].join(" - "),r.rows=i.split(e,5)},i.compare=function(e,t){return e.getFullYear()-t.getFullYear()},i.handleKeyDown=function(e){var t=i.activeDate.getFullYear();"left"===e?t-=1:"up"===e?t-=5:"right"===e?t+=1:"down"===e?t+=5:"pageup"===e||"pagedown"===e?t+=("pageup"===e?-1:1)*i.step.years:"home"===e?t=o(i.activeDate.getFullYear()):"end"===e&&(t=o(i.activeDate.getFullYear())+a-1),i.activeDate.setFullYear(t)},i.refreshView()}}}]).constant("datepickerPopupConfig",{datepickerPopup:"yyyy-MM-dd",currentText:"Today",clearText:"Clear",closeText:"Done",closeOnDateSelection:!0,appendToBody:!1,showButtonBar:!0}).directive("datepickerPopup",["$compile","$parse","$document","$position","dateFilter","dateParser","datepickerPopupConfig",function(f,g,m,v,y,w,b){return{restrict:"EA",require:"ngModel",scope:{isOpen:"=?",currentText:"@",clearText:"@",closeText:"@",dateDisabled:"&"},link:function(r,t,i,n){function o(e){return e.replace(/([A-Z])/g,function(e){return"-"+e.toLowerCase()})}function a(e){if(!e)return n.$setValidity("date",!0),null;if(angular.isDate(e)&&!isNaN(e))return n.$setValidity("date",!0),e;if(angular.isString(e)){var t=w.parse(e,s)||new Date(e);return isNaN(t)?void n.$setValidity("date",!1):(n.$setValidity("date",!0),t)}n.$setValidity("date",!1)}var s,l=angular.isDefined(i.closeOnDateSelection)?r.$parent.$eval(i.closeOnDateSelection):b.closeOnDateSelection,u=angular.isDefined(i.datepickerAppendToBody)?r.$parent.$eval(i.datepickerAppendToBody):b.appendToBody;r.showButtonBar=angular.isDefined(i.showButtonBar)?r.$parent.$eval(i.showButtonBar):b.showButtonBar,r.getText=function(e){return r[e+"Text"]||b[e+"Text"]},i.$observe("datepickerPopup",function(e){s=e||b.datepickerPopup,n.$render()});var e=angular.element("<div datepicker-popup-wrap><div datepicker></div></div>");e.attr({"ng-model":"date","ng-change":"dateSelection()"});var c=angular.element(e.children()[0]);i.datepickerOptions&&angular.forEach(r.$parent.$eval(i.datepickerOptions),function(e,t){c.attr(o(t),e)}),r.watchData={},angular.forEach(["minDate","maxDate","datepickerMode"],function(t){if(i[t]){var e=g(i[t]);if(r.$parent.$watch(e,function(e){r.watchData[t]=e}),c.attr(o(t),"watchData."+t),"datepickerMode"===t){var n=e.assign;r.$watch("watchData."+t,function(e,t){e!==t&&n(r.$parent,e)})}}}),i.dateDisabled&&c.attr("date-disabled","dateDisabled({ date: date, mode: mode })"),n.$parsers.unshift(a),r.dateSelection=function(e){angular.isDefined(e)&&(r.date=e),n.$setViewValue(r.date),n.$render(),l&&(r.isOpen=!1,t[0].focus())},t.bind("input change keyup",function(){r.$apply(function(){r.date=n.$modelValue})}),n.$render=function(){var e=n.$viewValue?y(n.$viewValue,s):"";t.val(e),r.date=a(n.$modelValue)};var d=function(e){r.isOpen&&e.target!==t[0]&&r.$apply(function(){r.isOpen=!1})},p=function(e){r.keydown(e)};t.bind("keydown",p),r.keydown=function(e){27===e.which?(e.preventDefault(),e.stopPropagation(),r.close()):40!==e.which||r.isOpen||(r.isOpen=!0)},r.$watch("isOpen",function(e){e?(r.$broadcast("datepicker.focus"),r.position=u?v.offset(t):v.position(t),r.position.top=r.position.top+t.prop("offsetHeight"),m.bind("click",d)):m.unbind("click",d)}),r.select=function(e){if("today"===e){var t=new Date;angular.isDate(n.$modelValue)?(e=new Date(n.$modelValue)).setFullYear(t.getFullYear(),t.getMonth(),t.getDate()):e=new Date(t.setHours(0,0,0,0))}r.dateSelection(e)},r.close=function(){r.isOpen=!1,t[0].focus()};var h=f(e)(r);e.remove(),u?m.find("body").append(h):t.after(h),r.$on("$destroy",function(){h.remove(),t.unbind("keydown",p),m.unbind("click",d)})}}}]).directive("datepickerPopupWrap",function(){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"template/datepicker/popup.html",link:function(e,t){t.bind("click",function(e){e.preventDefault(),e.stopPropagation()})}}}),angular.module("ui.bootstrap.dropdown",[]).constant("dropdownConfig",{openClass:"open"}).service("dropdownService",["$document",function(t){var n=null;this.open=function(e){n||(t.bind("click",r),t.bind("keydown",i)),n&&n!==e&&(n.isOpen=!1),n=e},this.close=function(e){n===e&&(n=null,t.unbind("click",r),t.unbind("keydown",i))};var r=function(e){if(n){var t=n.getToggleElement();e&&t&&t[0].contains(e.target)||n.$apply(function(){n.isOpen=!1})}},i=function(e){27===e.which&&(n.focusToggleElement(),r())}}]).controller("DropdownController",["$scope","$attrs","$parse","dropdownConfig","dropdownService","$animate",function(n,t,r,e,i,o){var a,s=this,l=n.$new(),u=e.openClass,c=angular.noop,d=t.onToggle?r(t.onToggle):angular.noop;this.init=function(e){s.$element=e,t.isOpen&&(a=r(t.isOpen),c=a.assign,n.$watch(a,function(e){l.isOpen=!!e}))},this.toggle=function(e){return l.isOpen=arguments.length?!!e:!l.isOpen},this.isOpen=function(){return l.isOpen},l.getToggleElement=function(){return s.toggleElement},l.focusToggleElement=function(){s.toggleElement&&s.toggleElement[0].focus()},l.$watch("isOpen",function(e,t){o[e?"addClass":"removeClass"](s.$element,u),e?(l.focusToggleElement(),i.open(l)):i.close(l),c(n,e),angular.isDefined(e)&&e!==t&&d(n,{open:!!e})}),n.$on("$locationChangeSuccess",function(){l.isOpen=!1}),n.$on("$destroy",function(){l.$destroy()})}]).directive("dropdown",function(){return{controller:"DropdownController",link:function(e,t,n,r){r.init(t)}}}).directive("dropdownToggle",function(){return{require:"?^dropdown",link:function(t,n,r,i){if(i){i.toggleElement=n;var e=function(e){e.preventDefault(),n.hasClass("disabled")||r.disabled||t.$apply(function(){i.toggle()})};n.bind("click",e),n.attr({"aria-haspopup":!0,"aria-expanded":!1}),t.$watch(i.isOpen,function(e){n.attr("aria-expanded",!!e)}),t.$on("$destroy",function(){n.unbind("click",e)})}}}}),angular.module("ui.bootstrap.modal",["ui.bootstrap.transition"]).factory("$$stackedMap",function(){return{createNew:function(){var r=[];return{add:function(e,t){r.push({key:e,value:t})},get:function(e){for(var t=0;t<r.length;t++)if(e==r[t].key)return r[t]},keys:function(){for(var e=[],t=0;t<r.length;t++)e.push(r[t].key);return e},top:function(){return r[r.length-1]},remove:function(e){for(var t=-1,n=0;n<r.length;n++)if(e==r[n].key){t=n;break}return r.splice(t,1)[0]},removeTop:function(){return r.splice(r.length-1,1)[0]},length:function(){return r.length}}}}}).directive("modalBackdrop",["$timeout",function(r){return{restrict:"EA",replace:!0,templateUrl:"template/modal/backdrop.html",link:function(e,t,n){e.backdropClass=n.backdropClass||"",e.animate=!1,r(function(){e.animate=!0})}}}]).directive("modalWindow",["$modalStack","$timeout",function(r,i){return{restrict:"EA",scope:{index:"@",animate:"="},replace:!0,transclude:!0,templateUrl:function(e,t){return t.templateUrl||"template/modal/window.html"},link:function(e,t,n){t.addClass(n.windowClass||""),e.size=n.size,i(function(){e.animate=!0,t[0].querySelectorAll("[autofocus]").length||t[0].focus()}),e.close=function(e){var t=r.getTop();t&&t.value.backdrop&&"static"!=t.value.backdrop&&e.target===e.currentTarget&&(e.preventDefault(),e.stopPropagation(),r.dismiss(t.key,"backdrop click"))}}}}]).directive("modalTransclude",function(){return{link:function(e,t,n,r,i){i(e.$parent,function(e){t.empty(),t.append(e)})}}}).factory("$modalStack",["$transition","$timeout","$document","$compile","$rootScope","$$stackedMap",function(s,l,u,c,d,e){function p(){for(var e=-1,t=m.keys(),n=0;n<t.length;n++)m.get(t[n]).value.backdrop&&(e=n);return e}function r(e){var t=u.find("body").eq(0),n=m.get(e).value;m.remove(e),i(n.modalDomEl,n.modalScope,300,function(){n.modalScope.$destroy(),t.toggleClass(g,0<m.length()),function(){if(h&&-1==p()){var e=f;i(h,f,150,function(){e.$destroy(),e=null}),f=h=void 0}}()})}function i(e,t,n,r){function i(){i.done||(i.done=!0,e.remove(),r&&r())}t.animate=!1;var o=s.transitionEndEventName;if(o){var a=l(i,n);e.bind(o,function(){l.cancel(a),i(),t.$apply()})}else l(i)}var h,f,g="modal-open",m=e.createNew(),n={};return d.$watch(p,function(e){f&&(f.index=e)}),u.bind("keydown",function(e){var t;27===e.which&&((t=m.top())&&t.value.keyboard&&(e.preventDefault(),d.$apply(function(){n.dismiss(t.key,"escape key press")})))}),n.open=function(e,t){m.add(e,{deferred:t.deferred,modalScope:t.scope,backdrop:t.backdrop,keyboard:t.keyboard});var n=u.find("body").eq(0),r=p();if(0<=r&&!h){(f=d.$new(!0)).index=r;var i=angular.element("<div modal-backdrop></div>");i.attr("backdrop-class",t.backdropClass),h=c(i)(f),n.append(h)}var o=angular.element("<div modal-window></div>");o.attr({"template-url":t.windowTemplateUrl,"window-class":t.windowClass,size:t.size,index:m.length()-1,animate:"animate"}).html(t.content);var a=c(o)(t.scope);m.top().value.modalDomEl=a,n.append(a),n.addClass(g)},n.close=function(e,t){var n=m.get(e);n&&(n.value.deferred.resolve(t),r(e))},n.dismiss=function(e,t){var n=m.get(e);n&&(n.value.deferred.reject(t),r(e))},n.dismissAll=function(e){for(var t=this.getTop();t;)this.dismiss(t.key,e),t=this.getTop()},n.getTop=function(){return m.top()},n}]).provider("$modal",function(){var g={options:{backdrop:!0,keyboard:!0},$get:["$injector","$rootScope","$q","$http","$templateCache","$controller","$modalStack",function(l,u,c,d,p,h,f){var e={};return e.open=function(o){var a=c.defer(),e=c.defer(),s={result:a.promise,opened:e.promise,close:function(e){f.close(s,e)},dismiss:function(e){f.dismiss(s,e)}};if((o=angular.extend({},g.options,o)).resolve=o.resolve||{},!o.template&&!o.templateUrl)throw new Error("One of template or templateUrl options is required.");var t,n,r,i=c.all([(r=o,r.template?c.when(r.template):d.get(angular.isFunction(r.templateUrl)?r.templateUrl():r.templateUrl,{cache:p}).then(function(e){return e.data}))].concat((t=o.resolve,n=[],angular.forEach(t,function(e){(angular.isFunction(e)||angular.isArray(e))&&n.push(c.when(l.invoke(e)))}),n)));return i.then(function(n){var e=(o.scope||u).$new();e.$close=s.close,e.$dismiss=s.dismiss;var t,r={},i=1;o.controller&&(r.$scope=e,r.$modalInstance=s,angular.forEach(o.resolve,function(e,t){r[t]=n[i++]}),t=h(o.controller,r),o.controllerAs&&(e[o.controllerAs]=t)),f.open(s,{scope:e,deferred:a,content:n[0],backdrop:o.backdrop,keyboard:o.keyboard,backdropClass:o.backdropClass,windowClass:o.windowClass,windowTemplateUrl:o.windowTemplateUrl,size:o.size})},function(e){a.reject(e)}),i.then(function(){e.resolve(!0)},function(){e.reject(!1)}),s},e}]};return g}),angular.module("ui.bootstrap.pagination",[]).controller("PaginationController",["$scope","$attrs","$parse",function(n,r,i){var o=this,a={$setViewValue:angular.noop},t=r.numPages?i(r.numPages).assign:angular.noop;this.init=function(e,t){a=e,this.config=t,a.$render=function(){o.render()},r.itemsPerPage?n.$parent.$watch(i(r.itemsPerPage),function(e){o.itemsPerPage=parseInt(e,10),n.totalPages=o.calculateTotalPages()}):this.itemsPerPage=t.itemsPerPage},this.calculateTotalPages=function(){var e=this.itemsPerPage<1?1:Math.ceil(n.totalItems/this.itemsPerPage);return Math.max(e||0,1)},this.render=function(){n.page=parseInt(a.$viewValue,10)||1},n.selectPage=function(e){n.page!==e&&0<e&&e<=n.totalPages&&(a.$setViewValue(e),a.$render())},n.getText=function(e){return n[e+"Text"]||o.config[e+"Text"]},n.noPrevious=function(){return 1===n.page},n.noNext=function(){return n.page===n.totalPages},n.$watch("totalItems",function(){n.totalPages=o.calculateTotalPages()}),n.$watch("totalPages",function(e){t(n.$parent,e),n.page>e?n.selectPage(e):a.$render()})}]).constant("paginationConfig",{itemsPerPage:10,boundaryLinks:!1,directionLinks:!0,firstText:"First",previousText:"Previous",nextText:"Next",lastText:"Last",rotate:!0}).directive("pagination",["$parse","paginationConfig",function(s,l){return{restrict:"EA",scope:{totalItems:"=",firstText:"@",previousText:"@",nextText:"@",lastText:"@"},require:["pagination","?ngModel"],controller:"PaginationController",templateUrl:"template/pagination/pagination.html",replace:!0,link:function(e,t,n,r){function c(e,t,n){return{number:e,text:t,active:n}}var i=r[0],o=r[1];if(o){var d=angular.isDefined(n.maxSize)?e.$parent.$eval(n.maxSize):l.maxSize,p=angular.isDefined(n.rotate)?e.$parent.$eval(n.rotate):l.rotate;e.boundaryLinks=angular.isDefined(n.boundaryLinks)?e.$parent.$eval(n.boundaryLinks):l.boundaryLinks,e.directionLinks=angular.isDefined(n.directionLinks)?e.$parent.$eval(n.directionLinks):l.directionLinks,i.init(o,l),n.maxSize&&e.$parent.$watch(s(n.maxSize),function(e){d=parseInt(e,10),i.render()});var a=i.render;i.render=function(){a(),0<e.page&&e.page<=e.totalPages&&(e.pages=function(e,t){var n=[],r=1,i=t,o=angular.isDefined(d)&&d<t;o&&(p?t<(i=(r=Math.max(e-Math.floor(d/2),1))+d-1)&&(r=(i=t)-d+1):(r=(Math.ceil(e/d)-1)*d+1,i=Math.min(r+d-1,t)));for(var a=r;a<=i;a++){var s=c(a,a,a===e);n.push(s)}if(o&&!p){if(1<r){var l=c(r-1,"...",!1);n.unshift(l)}if(i<t){var u=c(i+1,"...",!1);n.push(u)}}return n}(e.page,e.totalPages))}}}}}]).constant("pagerConfig",{itemsPerPage:10,previousText:"芦 Previous",nextText:"Next 禄",align:!0}).directive("pager",["pagerConfig",function(a){return{restrict:"EA",scope:{totalItems:"=",previousText:"@",nextText:"@"},require:["pager","?ngModel"],controller:"PaginationController",templateUrl:"template/pagination/pager.html",replace:!0,link:function(e,t,n,r){var i=r[0],o=r[1];o&&(e.align=angular.isDefined(n.align)?e.$parent.$eval(n.align):a.align,i.init(o,a))}}}]),angular.module("ui.bootstrap.tooltip",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).provider("$tooltip",function(){var s={placement:"top",animation:!0,popupDelay:0},l={mouseenter:"mouseleave",click:"click",focus:"blur"},u={};this.options=function(e){angular.extend(u,e)},this.setTriggers=function(e){angular.extend(l,e)},this.$get=["$window","$compile","$timeout","$document","$position","$interpolate",function(e,o,x,O,T,a){return function(C,S,n){function k(e){var t=e||D.trigger||n;return{show:t,hide:l[t]||t}}var D=angular.extend({},s,u),e=C.replace(/[A-Z]/g,function(e,t){return(t?"-":"")+e.toLowerCase()}),t=a.startSymbol(),r=a.endSymbol(),i="<div "+e+'-popup title="'+t+"title"+r+'" content="'+t+"content"+r+'" placement="'+t+"placement"+r+'" animation="animation" is-open="isOpen"></div>';return{restrict:"EA",compile:function(){var _=o(i);return function(r,t,i){function e(){m.isOpen?o():n()}function n(){var e,t,n;(!g||r.$eval(i[S+"Enable"]))&&(n=i[S+"Placement"],m.placement=angular.isDefined(n)?n:D.placement,e=i[S+"PopupDelay"],t=parseInt(e,10),m.popupDelay=isNaN(t)?D.popupDelay:t,m.popupDelay?p||(p=x(a,m.popupDelay,!1)).then(function(e){e()}):a()())}function o(){r.$apply(function(){s()})}function a(){return p=null,d&&(x.cancel(d),d=null),m.content?(u&&l(),c=m.$new(),(u=_(c,function(e){h?O.find("body").append(e):t.after(e)})).css({top:0,left:0,display:"block"}),m.$digest(),v(),m.isOpen=!0,m.$digest(),v):angular.noop}function s(){m.isOpen=!1,x.cancel(p),p=null,m.animation?d||(d=x(l,500)):l()}function l(){d=null,u&&(u.remove(),u=null),c&&(c.$destroy(),c=null)}var u,c,d,p,h=!!angular.isDefined(D.appendToBody)&&D.appendToBody,f=k(void 0),g=angular.isDefined(i[S+"Enable"]),m=r.$new(!0),v=function(){var e=T.positionElements(t,u,m.placement,h);e.top+="px",e.left+="px",u.css(e)};m.isOpen=!1,i.$observe(C,function(e){!(m.content=e)&&m.isOpen&&s()}),i.$observe(S+"Title",function(e){m.title=e});var y,w=function(){t.unbind(f.show,n),t.unbind(f.hide,o)};y=i[S+"Trigger"],w(),(f=k(y)).show===f.hide?t.bind(f.show,e):(t.bind(f.show,n),t.bind(f.hide,o));var b=r.$eval(i[S+"Animation"]);m.animation=angular.isDefined(b)?!!b:D.animation;var $=r.$eval(i[S+"AppendToBody"]);(h=angular.isDefined($)?$:h)&&r.$on("$locationChangeSuccess",function(){m.isOpen&&s()}),r.$on("$destroy",function(){x.cancel(d),x.cancel(p),w(),l(),m=null})}}}}}]}).directive("tooltipPopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-popup.html"}}).directive("tooltip",["$tooltip",function(e){return e("tooltip","tooltip","mouseenter")}]).directive("tooltipHtmlUnsafePopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-html-unsafe-popup.html"}}).directive("tooltipHtmlUnsafe",["$tooltip",function(e){return e("tooltipHtmlUnsafe","tooltip","mouseenter")}]),angular.module("ui.bootstrap.popover",["ui.bootstrap.tooltip"]).directive("popoverPopup",function(){return{restrict:"EA",replace:!0,scope:{title:"@",content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/popover/popover.html"}}).directive("popover",["$tooltip",function(e){return e("popover","popover","click")}]),angular.module("ui.bootstrap.progressbar",[]).constant("progressConfig",{animate:!0,max:100}).controller("ProgressController",["$scope","$attrs","progressConfig",function(n,e,t){var r=this,i=angular.isDefined(e.animate)?n.$parent.$eval(e.animate):t.animate;this.bars=[],n.max=angular.isDefined(e.max)?n.$parent.$eval(e.max):t.max,this.addBar=function(t,e){i||e.css({transition:"none"}),this.bars.push(t),t.$watch("value",function(e){t.percent=+(100*e/n.max).toFixed(2)}),t.$on("$destroy",function(){e=null,r.removeBar(t)})},this.removeBar=function(e){this.bars.splice(this.bars.indexOf(e),1)}}]).directive("progress",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",require:"progress",scope:{},templateUrl:"template/progressbar/progress.html"}}).directive("bar",function(){return{restrict:"EA",replace:!0,transclude:!0,require:"^progress",scope:{value:"=",type:"@"},templateUrl:"template/progressbar/bar.html",link:function(e,t,n,r){r.addBar(e,t)}}}).directive("progressbar",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",scope:{value:"=",type:"@"},templateUrl:"template/progressbar/progressbar.html",link:function(e,t,n,r){r.addBar(e,angular.element(t.children()[0]))}}}),angular.module("ui.bootstrap.rating",[]).constant("ratingConfig",{max:5,stateOn:null,stateOff:null}).controller("RatingController",["$scope","$attrs","ratingConfig",function(n,r,i){var o={$setViewValue:angular.noop};this.init=function(e){(o=e).$render=this.render,this.stateOn=angular.isDefined(r.stateOn)?n.$parent.$eval(r.stateOn):i.stateOn,this.stateOff=angular.isDefined(r.stateOff)?n.$parent.$eval(r.stateOff):i.stateOff;var t=angular.isDefined(r.ratingStates)?n.$parent.$eval(r.ratingStates):new Array(angular.isDefined(r.max)?n.$parent.$eval(r.max):i.max);n.range=this.buildTemplateObjects(t)},this.buildTemplateObjects=function(e){for(var t=0,n=e.length;t<n;t++)e[t]=angular.extend({index:t},{stateOn:this.stateOn,stateOff:this.stateOff},e[t]);return e},n.rate=function(e){!n.readonly&&0<=e&&e<=n.range.length&&(o.$setViewValue(e),o.$render())},n.enter=function(e){n.readonly||(n.value=e),n.onHover({value:e})},n.reset=function(){n.value=o.$viewValue,n.onLeave()},n.onKeydown=function(e){/(37|38|39|40)/.test(e.which)&&(e.preventDefault(),e.stopPropagation(),n.rate(n.value+(38===e.which||39===e.which?1:-1)))},this.render=function(){n.value=o.$viewValue}}]).directive("rating",function(){return{restrict:"EA",require:["rating","ngModel"],scope:{readonly:"=?",onHover:"&",onLeave:"&"},controller:"RatingController",templateUrl:"template/rating/rating.html",replace:!0,link:function(e,t,n,r){var i=r[0],o=r[1];o&&i.init(o)}}}),angular.module("ui.bootstrap.tabs",[]).controller("TabsetController",["$scope",function(e){var r,i=this,o=i.tabs=e.tabs=[];i.select=function(t){angular.forEach(o,function(e){e.active&&e!==t&&(e.active=!1,e.onDeselect())}),t.active=!0,t.onSelect()},i.addTab=function(e){o.push(e),1===o.length?e.active=!0:e.active&&i.select(e)},i.removeTab=function(e){var t=o.indexOf(e);if(e.active&&1<o.length&&!r){var n=t==o.length-1?t-1:t+1;i.select(o[n])}o.splice(t,1)},e.$on("$destroy",function(){r=!0})}]).directive("tabset",function(){return{restrict:"EA",transclude:!0,replace:!0,scope:{type:"@"},controller:"TabsetController",templateUrl:"template/tabs/tabset.html",link:function(e,t,n){e.vertical=!!angular.isDefined(n.vertical)&&e.$parent.$eval(n.vertical),e.justified=!!angular.isDefined(n.justified)&&e.$parent.$eval(n.justified)}}}).directive("tab",["$parse",function(o){return{require:"^tabset",restrict:"EA",replace:!0,templateUrl:"template/tabs/tab.html",transclude:!0,scope:{active:"=?",heading:"@",onSelect:"&select",onDeselect:"&deselect"},controller:function(){},compile:function(e,t,i){return function(t,e,n,r){t.$watch("active",function(e){e&&r.select(t)}),t.disabled=!1,n.disabled&&t.$parent.$watch(o(n.disabled),function(e){t.disabled=!!e}),t.select=function(){t.disabled||(t.active=!0)},r.addTab(t),t.$on("$destroy",function(){r.removeTab(t)}),t.$transcludeFn=i}}}}]).directive("tabHeadingTransclude",[function(){return{restrict:"A",require:"^tab",link:function(e,t){e.$watch("headingElement",function(e){e&&(t.html(""),t.append(e))})}}}]).directive("tabContentTransclude",function(){return{restrict:"A",require:"^tabset",link:function(e,n,t){var r=e.$eval(t.tabContentTransclude);r.$transcludeFn(r.$parent,function(e){angular.forEach(e,function(e){var t;(t=e).tagName&&(t.hasAttribute("tab-heading")||t.hasAttribute("data-tab-heading")||"tab-heading"===t.tagName.toLowerCase()||"data-tab-heading"===t.tagName.toLowerCase())?r.headingElement=e:n.append(e)})})}}}),angular.module("ui.bootstrap.timepicker",[]).constant("timepickerConfig",{hourStep:1,minuteStep:1,showMeridian:!0,meridians:null,readonlyInput:!1,mousewheel:!0}).controller("TimepickerController",["$scope","$attrs","$parse","$log","$locale","timepickerConfig",function(i,o,e,t,n,a){function r(){var e=parseInt(i.hours,10);return(i.showMeridian?0<e&&e<13:0<=e&&e<24)?(i.showMeridian&&(12===e&&(e=0),i.meridian===g[1]&&(e+=12)),e):void 0}function s(){var e=parseInt(i.minutes,10);return 0<=e&&e<60?e:void 0}function l(e){return angular.isDefined(e)&&e.toString().length<2?"0"+e:e}function u(e){c(),f.$setViewValue(new Date(h)),d(e)}function c(){f.$setValidity("time",!0),i.invalidHours=!1,i.invalidMinutes=!1}function d(e){var t=h.getHours(),n=h.getMinutes();i.showMeridian&&(t=0===t||12===t?12:t%12),i.hours="h"===e?t:l(t),i.minutes="m"===e?n:l(n),i.meridian=h.getHours()<12?g[0]:g[1]}function p(e){var t=new Date(h.getTime()+6e4*e);h.setHours(t.getHours(),t.getMinutes()),u()}var h=new Date,f={$setViewValue:angular.noop},g=angular.isDefined(o.meridians)?i.$parent.$eval(o.meridians):a.meridians||n.DATETIME_FORMATS.AMPMS;this.init=function(e,t){(f=e).$render=this.render;var n=t.eq(0),r=t.eq(1);(angular.isDefined(o.mousewheel)?i.$parent.$eval(o.mousewheel):a.mousewheel)&&this.setupMousewheelEvents(n,r),i.readonlyInput=angular.isDefined(o.readonlyInput)?i.$parent.$eval(o.readonlyInput):a.readonlyInput,this.setupInputEvents(n,r)};var m=a.hourStep;o.hourStep&&i.$parent.$watch(e(o.hourStep),function(e){m=parseInt(e,10)});var v=a.minuteStep;o.minuteStep&&i.$parent.$watch(e(o.minuteStep),function(e){v=parseInt(e,10)}),i.showMeridian=a.showMeridian,o.showMeridian&&i.$parent.$watch(e(o.showMeridian),function(e){if(i.showMeridian=!!e,f.$error.time){var t=r(),n=s();angular.isDefined(t)&&angular.isDefined(n)&&(h.setHours(t),u())}else d()}),this.setupMousewheelEvents=function(e,t){var n=function(e){e.originalEvent&&(e=e.originalEvent);var t=e.wheelDelta?e.wheelDelta:-e.deltaY;return e.detail||0<t};e.bind("mousewheel wheel",function(e){i.$apply(n(e)?i.incrementHours():i.decrementHours()),e.preventDefault()}),t.bind("mousewheel wheel",function(e){i.$apply(n(e)?i.incrementMinutes():i.decrementMinutes()),e.preventDefault()})},this.setupInputEvents=function(e,t){if(i.readonlyInput)return i.updateHours=angular.noop,void(i.updateMinutes=angular.noop);var n=function(e,t){f.$setViewValue(null),f.$setValidity("time",!1),angular.isDefined(e)&&(i.invalidHours=e),angular.isDefined(t)&&(i.invalidMinutes=t)};i.updateHours=function(){var e=r();angular.isDefined(e)?(h.setHours(e),u("h")):n(!0)},e.bind("blur",function(){!i.invalidHours&&i.hours<10&&i.$apply(function(){i.hours=l(i.hours)})}),i.updateMinutes=function(){var e=s();angular.isDefined(e)?(h.setMinutes(e),u("m")):n(void 0,!0)},t.bind("blur",function(){!i.invalidMinutes&&i.minutes<10&&i.$apply(function(){i.minutes=l(i.minutes)})})},this.render=function(){var e=f.$modelValue?new Date(f.$modelValue):null;isNaN(e)?(f.$setValidity("time",!1),t.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')):(e&&(h=e),c(),d())},i.incrementHours=function(){p(60*m)},i.decrementHours=function(){p(60*-m)},i.incrementMinutes=function(){p(v)},i.decrementMinutes=function(){p(-v)},i.toggleMeridian=function(){p(720*(h.getHours()<12?1:-1))}}]).directive("timepicker",function(){return{restrict:"EA",require:["timepicker","?^ngModel"],controller:"TimepickerController",replace:!0,scope:{},templateUrl:"template/timepicker/timepicker.html",link:function(e,t,n,r){var i=r[0],o=r[1];o&&i.init(o,t.find("input"))}}}),angular.module("ui.bootstrap.typeahead",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).factory("typeaheadParser",["$parse",function(n){var r=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+([\s\S]+?)$/;return{parse:function(e){var t=e.match(r);if(!t)throw new Error('Expected typeahead specification in form of "_modelValue_ (as _label_)? for _item_ in _collection_" but got "'+e+'".');return{itemName:t[3],source:n(t[4]),viewMapper:n(t[2]||t[1]),modelMapper:n(t[1])}}}}]).directive("typeahead",["$compile","$parse","$q","$timeout","$document","$position","typeaheadParser",function(k,D,x,O,T,E,A){var P=[9,13,27,38,40];return{require:"ngModel",link:function(o,a,e,s){var l,n=o.$eval(e.typeaheadMinLength)||1,r=o.$eval(e.typeaheadWaitMs)||0,i=!1!==o.$eval(e.typeaheadEditable),u=D(e.typeaheadLoading).assign||angular.noop,c=D(e.typeaheadOnSelect),d=e.typeaheadInputFormatter?D(e.typeaheadInputFormatter):void 0,p=!!e.typeaheadAppendToBody&&o.$eval(e.typeaheadAppendToBody),h=!1!==o.$eval(e.typeaheadFocusFirst),f=D(e.ngModel).assign,g=A.parse(e.typeahead),m=o.$new();o.$on("$destroy",function(){m.$destroy()});var t="typeahead-"+m.$id+"-"+Math.floor(1e4*Math.random());a.attr({"aria-autocomplete":"list","aria-expanded":!1,"aria-owns":t});var v=angular.element("<div typeahead-popup></div>");v.attr({id:t,matches:"matches",active:"activeIdx",select:"select(activeIdx)",query:"query",position:"position"}),angular.isDefined(e.typeaheadTemplateUrl)&&v.attr("template-url",e.typeaheadTemplateUrl);var y=function(){m.matches=[],m.activeIdx=-1,a.attr("aria-expanded",!1)},w=function(e){return t+"-option-"+e};m.$watch("activeIdx",function(e){e<0?a.removeAttr("aria-activedescendant"):a.attr("aria-activedescendant",w(e))});var b=function(r){var i={$viewValue:r};u(o,!0),x.when(g.source(o,i)).then(function(e){var t=r===s.$viewValue;if(t&&l)if(0<e.length){m.activeIdx=h?0:-1;for(var n=m.matches.length=0;n<e.length;n++)i[g.itemName]=e[n],m.matches.push({id:w(n),label:g.viewMapper(m,i),model:e[n]});m.query=r,m.position=p?E.offset(a):E.position(a),m.position.top=m.position.top+a.prop("offsetHeight"),a.attr("aria-expanded",!0)}else y();t&&u(o,!1)},function(){y(),u(o,!1)})};y(),m.query=void 0;var $,_=function(){$&&O.cancel($)};s.$parsers.unshift(function(e){return l=!0,e&&e.length>=n?0<r?(_(),t=e,$=O(function(){b(t)},r)):b(e):(u(o,!1),_(),y()),i?e:e?void s.$setValidity("editable",!1):(s.$setValidity("editable",!0),e);var t}),s.$formatters.push(function(e){var t,n={};return d?(n.$model=e,d(o,n)):(n[g.itemName]=e,t=g.viewMapper(o,n),n[g.itemName]=void 0,t!==g.viewMapper(o,n)?t:e)}),m.select=function(e){var t,n,r={};r[g.itemName]=n=m.matches[e].model,t=g.modelMapper(o,r),f(o,t),s.$setValidity("editable",!0),c(o,{$item:n,$model:t,$label:g.viewMapper(o,r)}),y(),O(function(){a[0].focus()},0,!1)},a.bind("keydown",function(e){0!==m.matches.length&&-1!==P.indexOf(e.which)&&(-1!=m.activeIdx||13!==e.which&&9!==e.which)&&(e.preventDefault(),40===e.which?(m.activeIdx=(m.activeIdx+1)%m.matches.length,m.$digest()):38===e.which?(m.activeIdx=(0<m.activeIdx?m.activeIdx:m.matches.length)-1,m.$digest()):13===e.which||9===e.which?m.$apply(function(){m.select(m.activeIdx)}):27===e.which&&(e.stopPropagation(),y(),m.$digest()))}),a.bind("blur",function(){l=!1});var C=function(e){a[0]!==e.target&&(y(),m.$digest())};T.bind("click",C),o.$on("$destroy",function(){T.unbind("click",C),p&&S.remove()});var S=k(v)(m);p?T.find("body").append(S):a.after(S)}}}]).directive("typeaheadPopup",function(){return{restrict:"EA",scope:{matches:"=",query:"=",active:"=",position:"=",select:"&"},replace:!0,templateUrl:"template/typeahead/typeahead-popup.html",link:function(t,e,n){t.templateUrl=n.templateUrl,t.isOpen=function(){return 0<t.matches.length},t.isActive=function(e){return t.active==e},t.selectActive=function(e){t.active=e},t.selectMatch=function(e){t.select({activeIdx:e})}}}}).directive("typeaheadMatch",["$http","$templateCache","$compile","$parse",function(i,o,a,s){return{restrict:"EA",scope:{index:"=",match:"=",query:"="},link:function(t,n,e){var r=s(e.templateUrl)(t.$parent)||"template/typeahead/typeahead-match.html";i.get(r,{cache:o}).success(function(e){n.replaceWith(a(e.trim())(t))})}}}]).filter("typeaheadHighlight",function(){return function(e,t){return t?(""+e).replace(new RegExp(t.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1"),"gi"),"<strong>$&</strong>"):e}}),angular.module("template/accordion/accordion-group.html",[]).run(["$templateCache",function(e){e.put("template/accordion/accordion-group.html",'<div class="panel panel-default">\n  <div class="panel-heading">\n    <h4 class="panel-title">\n      <a href class="accordion-toggle" ng-click="toggleOpen()" accordion-transclude="heading"><span ng-class="{\'text-muted\': isDisabled}">{{heading}}</span></a>\n    </h4>\n  </div>\n  <div class="panel-collapse" collapse="!isOpen">\n\t  <div class="panel-body" ng-transclude></div>\n  </div>\n</div>\n')}]),angular.module("template/accordion/accordion.html",[]).run(["$templateCache",function(e){e.put("template/accordion/accordion.html",'<div class="panel-group" ng-transclude></div>')}]),angular.module("template/alert/alert.html",[]).run(["$templateCache",function(e){e.put("template/alert/alert.html",'<div class="alert" ng-class="[\'alert-\' + (type || \'warning\'), closeable ? \'alert-dismissable\' : null]" role="alert">\n    <button ng-show="closeable" type="button" class="close" ng-click="close()">\n        <span aria-hidden="true">&times;</span>\n        <span class="sr-only">Close</span>\n    </button>\n    <div ng-transclude></div>\n</div>\n')}]),angular.module("template/carousel/carousel.html",[]).run(["$templateCache",function(e){e.put("template/carousel/carousel.html",'<div ng-mouseenter="pause()" ng-mouseleave="play()" class="carousel" ng-swipe-right="prev()" ng-swipe-left="next()">\n    <ol class="carousel-indicators" ng-show="slides.length > 1">\n        <li ng-repeat="slide in slides track by $index" ng-class="{active: isActive(slide)}" ng-click="select(slide)"></li>\n    </ol>\n    <div class="carousel-inner" ng-transclude></div>\n    <a class="left carousel-control" ng-click="prev()" ng-show="slides.length > 1"><span class="glyphicon glyphicon-chevron-left"></span></a>\n    <a class="right carousel-control" ng-click="next()" ng-show="slides.length > 1"><span class="glyphicon glyphicon-chevron-right"></span></a>\n</div>\n')}]),angular.module("template/carousel/slide.html",[]).run(["$templateCache",function(e){e.put("template/carousel/slide.html","<div ng-class=\"{\n    'active': leaving || (active && !entering),\n    'prev': (next || active) && direction=='prev',\n    'next': (next || active) && direction=='next',\n    'right': direction=='prev',\n    'left': direction=='next'\n  }\" class=\"item text-center\" ng-transclude></div>\n")}]),angular.module("template/datepicker/datepicker.html",[]).run(["$templateCache",function(e){e.put("template/datepicker/datepicker.html",'<div ng-switch="datepickerMode" role="application" ng-keydown="keydown($event)">\n  <daypicker ng-switch-when="day" tabindex="0"></daypicker>\n  <monthpicker ng-switch-when="month" tabindex="0"></monthpicker>\n  <yearpicker ng-switch-when="year" tabindex="0"></yearpicker>\n</div>')}]),angular.module("template/datepicker/day.html",[]).run(["$templateCache",function(e){e.put("template/datepicker/day.html",'<table role="grid" aria-labelledby="{{uniqueId}}-title" aria-activedescendant="{{activeDateId}}">\n  <thead>\n    <tr>\n      <th><button type="button" class="btn btn-default btn-sm pull-left" ng-click="move(-1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-left"></i></button></th>\n      <th colspan="{{5 + showWeeks}}"><button id="{{uniqueId}}-title" role="heading" aria-live="assertive" aria-atomic="true" type="button" class="btn btn-default btn-sm" ng-click="toggleMode()" tabindex="-1" style="width:100%;"><strong>{{title}}</strong></button></th>\n      <th><button type="button" class="btn btn-default btn-sm pull-right" ng-click="move(1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-right"></i></button></th>\n    </tr>\n    <tr>\n      <th ng-show="showWeeks" class="text-center"></th>\n      <th ng-repeat="label in labels track by $index" class="text-center"><small aria-label="{{label.full}}">{{label.abbr}}</small></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr ng-repeat="row in rows track by $index">\n      <td ng-show="showWeeks" class="text-center h6"><em>{{ weekNumbers[$index] }}</em></td>\n      <td ng-repeat="dt in row track by dt.date" class="text-center" role="gridcell" id="{{dt.uid}}" aria-disabled="{{!!dt.disabled}}">\n        <button type="button" style="width:100%;" class="btn btn-default btn-sm" ng-class="{\'btn-info\': dt.selected, active: isActive(dt)}" ng-click="select(dt.date)" ng-disabled="dt.disabled" tabindex="-1"><span ng-class="{\'text-muted\': dt.secondary, \'text-info\': dt.current}">{{dt.label}}</span></button>\n      </td>\n    </tr>\n  </tbody>\n</table>\n')}]),angular.module("template/datepicker/month.html",[]).run(["$templateCache",function(e){e.put("template/datepicker/month.html",'<table role="grid" aria-labelledby="{{uniqueId}}-title" aria-activedescendant="{{activeDateId}}">\n  <thead>\n    <tr>\n      <th><button type="button" class="btn btn-default btn-sm pull-left" ng-click="move(-1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-left"></i></button></th>\n      <th><button id="{{uniqueId}}-title" role="heading" aria-live="assertive" aria-atomic="true" type="button" class="btn btn-default btn-sm" ng-click="toggleMode()" tabindex="-1" style="width:100%;"><strong>{{title}}</strong></button></th>\n      <th><button type="button" class="btn btn-default btn-sm pull-right" ng-click="move(1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-right"></i></button></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr ng-repeat="row in rows track by $index">\n      <td ng-repeat="dt in row track by dt.date" class="text-center" role="gridcell" id="{{dt.uid}}" aria-disabled="{{!!dt.disabled}}">\n        <button type="button" style="width:100%;" class="btn btn-default" ng-class="{\'btn-info\': dt.selected, active: isActive(dt)}" ng-click="select(dt.date)" ng-disabled="dt.disabled" tabindex="-1"><span ng-class="{\'text-info\': dt.current}">{{dt.label}}</span></button>\n      </td>\n    </tr>\n  </tbody>\n</table>\n')}]),angular.module("template/datepicker/popup.html",[]).run(["$templateCache",function(e){e.put("template/datepicker/popup.html",'<ul class="dropdown-menu" ng-style="{display: (isOpen && \'block\') || \'none\', top: position.top+\'px\', left: position.left+\'px\'}" ng-keydown="keydown($event)">\n\t<li ng-transclude></li>\n\t<li ng-if="showButtonBar" style="padding:10px 9px 2px">\n\t\t<span class="btn-group pull-left">\n\t\t\t<button type="button" class="btn btn-sm btn-info" ng-click="select(\'today\')">{{ getText(\'current\') }}</button>\n\t\t\t<button type="button" class="btn btn-sm btn-danger" ng-click="select(null)">{{ getText(\'clear\') }}</button>\n\t\t</span>\n\t\t<button type="button" class="btn btn-sm btn-success pull-right" ng-click="close()">{{ getText(\'close\') }}</button>\n\t</li>\n</ul>\n')}]),angular.module("template/datepicker/year.html",[]).run(["$templateCache",function(e){e.put("template/datepicker/year.html",'<table role="grid" aria-labelledby="{{uniqueId}}-title" aria-activedescendant="{{activeDateId}}">\n  <thead>\n    <tr>\n      <th><button type="button" class="btn btn-default btn-sm pull-left" ng-click="move(-1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-left"></i></button></th>\n      <th colspan="3"><button id="{{uniqueId}}-title" role="heading" aria-live="assertive" aria-atomic="true" type="button" class="btn btn-default btn-sm" ng-click="toggleMode()" tabindex="-1" style="width:100%;"><strong>{{title}}</strong></button></th>\n      <th><button type="button" class="btn btn-default btn-sm pull-right" ng-click="move(1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-right"></i></button></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr ng-repeat="row in rows track by $index">\n      <td ng-repeat="dt in row track by dt.date" class="text-center" role="gridcell" id="{{dt.uid}}" aria-disabled="{{!!dt.disabled}}">\n        <button type="button" style="width:100%;" class="btn btn-default" ng-class="{\'btn-info\': dt.selected, active: isActive(dt)}" ng-click="select(dt.date)" ng-disabled="dt.disabled" tabindex="-1"><span ng-class="{\'text-info\': dt.current}">{{dt.label}}</span></button>\n      </td>\n    </tr>\n  </tbody>\n</table>\n')}]),angular.module("template/modal/backdrop.html",[]).run(["$templateCache",function(e){e.put("template/modal/backdrop.html",'<div class="modal-backdrop fade {{ backdropClass }}"\n     ng-class="{in: animate}"\n     ng-style="{\'z-index\': 1040 + (index && 1 || 0) + index*10}"\n></div>\n')}]),angular.module("template/modal/window.html",[]).run(["$templateCache",function(e){e.put("template/modal/window.html",'<div tabindex="-1" role="dialog" class="modal fade" ng-class="{in: animate}" ng-style="{\'z-index\': 1050 + index*10, display: \'block\'}" ng-click="close($event)">\n    <div class="modal-dialog" ng-class="{\'modal-sm\': size == \'sm\', \'modal-lg\': size == \'lg\'}"><div class="modal-content" modal-transclude></div></div>\n</div>')}]),angular.module("template/pagination/pager.html",[]).run(["$templateCache",function(e){e.put("template/pagination/pager.html",'<ul class="pager">\n  <li ng-class="{disabled: noPrevious(), previous: align}"><a href ng-click="selectPage(page - 1)">{{getText(\'previous\')}}</a></li>\n  <li ng-class="{disabled: noNext(), next: align}"><a href ng-click="selectPage(page + 1)">{{getText(\'next\')}}</a></li>\n</ul>')}]),angular.module("template/pagination/pagination.html",[]).run(["$templateCache",function(e){e.put("template/pagination/pagination.html",'<ul class="pagination">\n  <li ng-if="boundaryLinks" ng-class="{disabled: noPrevious()}"><a href ng-click="selectPage(1)">{{getText(\'first\')}}</a></li>\n  <li ng-if="directionLinks" ng-class="{disabled: noPrevious()}"><a href ng-click="selectPage(page - 1)">{{getText(\'previous\')}}</a></li>\n  <li ng-repeat="page in pages track by $index" ng-class="{active: page.active}"><a href ng-click="selectPage(page.number)">{{page.text}}</a></li>\n  <li ng-if="directionLinks" ng-class="{disabled: noNext()}"><a href ng-click="selectPage(page + 1)">{{getText(\'next\')}}</a></li>\n  <li ng-if="boundaryLinks" ng-class="{disabled: noNext()}"><a href ng-click="selectPage(totalPages)">{{getText(\'last\')}}</a></li>\n</ul>')}]),angular.module("template/tooltip/tooltip-html-unsafe-popup.html",[]).run(["$templateCache",function(e){e.put("template/tooltip/tooltip-html-unsafe-popup.html",'<div class="tooltip {{placement}}" ng-class="{ in: isOpen(), fade: animation() }">\n  <div class="tooltip-arrow"></div>\n  <div class="tooltip-inner" bind-html-unsafe="content"></div>\n</div>\n')}]),angular.module("template/tooltip/tooltip-popup.html",[]).run(["$templateCache",function(e){e.put("template/tooltip/tooltip-popup.html",'<div class="tooltip {{placement}}" ng-class="{ in: isOpen(), fade: animation() }">\n  <div class="tooltip-arrow"></div>\n  <div class="tooltip-inner" ng-bind="content"></div>\n</div>\n')}]),angular.module("template/popover/popover.html",[]).run(["$templateCache",function(e){e.put("template/popover/popover.html",'<div class="popover {{placement}}" ng-class="{ in: isOpen(), fade: animation() }">\n  <div class="arrow"></div>\n\n  <div class="popover-inner">\n      <h3 class="popover-title" ng-bind="title" ng-show="title"></h3>\n      <div class="popover-content" ng-bind="content"></div>\n  </div>\n</div>\n')}]),angular.module("template/progressbar/bar.html",[]).run(["$templateCache",function(e){e.put("template/progressbar/bar.html",'<div class="progress-bar" ng-class="type && \'progress-bar-\' + type" role="progressbar" aria-valuenow="{{value}}" aria-valuemin="0" aria-valuemax="{{max}}" ng-style="{width: percent + \'%\'}" aria-valuetext="{{percent | number:0}}%" ng-transclude></div>')}]),angular.module("template/progressbar/progress.html",[]).run(["$templateCache",function(e){e.put("template/progressbar/progress.html",'<div class="progress" ng-transclude></div>')}]),angular.module("template/progressbar/progressbar.html",[]).run(["$templateCache",function(e){e.put("template/progressbar/progressbar.html",'<div class="progress">\n  <div class="progress-bar" ng-class="type && \'progress-bar-\' + type" role="progressbar" aria-valuenow="{{value}}" aria-valuemin="0" aria-valuemax="{{max}}" ng-style="{width: percent + \'%\'}" aria-valuetext="{{percent | number:0}}%" ng-transclude></div>\n</div>')}]),angular.module("template/rating/rating.html",[]).run(["$templateCache",function(e){e.put("template/rating/rating.html",'<span ng-mouseleave="reset()" ng-keydown="onKeydown($event)" tabindex="0" role="slider" aria-valuemin="0" aria-valuemax="{{range.length}}" aria-valuenow="{{value}}">\n    <i ng-repeat="r in range track by $index" ng-mouseenter="enter($index + 1)" ng-click="rate($index + 1)" class="glyphicon" ng-class="$index < value && (r.stateOn || \'glyphicon-star\') || (r.stateOff || \'glyphicon-star-empty\')">\n        <span class="sr-only">({{ $index < value ? \'*\' : \' \' }})</span>\n    </i>\n</span>')}]),angular.module("template/tabs/tab.html",[]).run(["$templateCache",function(e){e.put("template/tabs/tab.html",'<li ng-class="{active: active, disabled: disabled}">\n  <a href ng-click="select()" tab-heading-transclude>{{heading}}</a>\n</li>\n')}]),angular.module("template/tabs/tabset.html",[]).run(["$templateCache",function(e){e.put("template/tabs/tabset.html",'<div>\n  <ul class="nav nav-{{type || \'tabs\'}}" ng-class="{\'nav-stacked\': vertical, \'nav-justified\': justified}" ng-transclude></ul>\n  <div class="tab-content">\n    <div class="tab-pane" \n         ng-repeat="tab in tabs" \n         ng-class="{active: tab.active}"\n         tab-content-transclude="tab">\n    </div>\n  </div>\n</div>\n')}]),angular.module("template/timepicker/timepicker.html",[]).run(["$templateCache",function(e){e.put("template/timepicker/timepicker.html",'<table>\n\t<tbody>\n\t\t<tr class="text-center">\n\t\t\t<td><a ng-click="incrementHours()" class="btn btn-link"><span class="glyphicon glyphicon-chevron-up"></span></a></td>\n\t\t\t<td>&nbsp;</td>\n\t\t\t<td><a ng-click="incrementMinutes()" class="btn btn-link"><span class="glyphicon glyphicon-chevron-up"></span></a></td>\n\t\t\t<td ng-show="showMeridian"></td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td style="width:50px;" class="form-group" ng-class="{\'has-error\': invalidHours}">\n\t\t\t\t<input type="text" ng-model="hours" ng-change="updateHours()" class="form-control text-center" ng-mousewheel="incrementHours()" ng-readonly="readonlyInput" maxlength="2">\n\t\t\t</td>\n\t\t\t<td>:</td>\n\t\t\t<td style="width:50px;" class="form-group" ng-class="{\'has-error\': invalidMinutes}">\n\t\t\t\t<input type="text" ng-model="minutes" ng-change="updateMinutes()" class="form-control text-center" ng-readonly="readonlyInput" maxlength="2">\n\t\t\t</td>\n\t\t\t<td ng-show="showMeridian"><button type="button" class="btn btn-default text-center" ng-click="toggleMeridian()">{{meridian}}</button></td>\n\t\t</tr>\n\t\t<tr class="text-center">\n\t\t\t<td><a ng-click="decrementHours()" class="btn btn-link"><span class="glyphicon glyphicon-chevron-down"></span></a></td>\n\t\t\t<td>&nbsp;</td>\n\t\t\t<td><a ng-click="decrementMinutes()" class="btn btn-link"><span class="glyphicon glyphicon-chevron-down"></span></a></td>\n\t\t\t<td ng-show="showMeridian"></td>\n\t\t</tr>\n\t</tbody>\n</table>\n')}]),angular.module("template/typeahead/typeahead-match.html",[]).run(["$templateCache",function(e){e.put("template/typeahead/typeahead-match.html",'<a tabindex="-1" bind-html-unsafe="match.label | typeaheadHighlight:query"></a>')}]),angular.module("template/typeahead/typeahead-popup.html",[]).run(["$templateCache",function(e){e.put("template/typeahead/typeahead-popup.html",'<ul class="dropdown-menu" ng-show="isOpen()" ng-style="{top: position.top+\'px\', left: position.left+\'px\'}" style="display: block;" role="listbox" aria-hidden="{{!isOpen()}}">\n    <li ng-repeat="match in matches track by $index" ng-class="{active: isActive($index) }" ng-mouseenter="selectActive($index)" ng-click="selectMatch($index)" role="option" id="{{match.id}}">\n        <div typeahead-match index="$index" match="match" query="query" template-url="templateUrl"></div>\n    </li>\n</ul>\n')}]),function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.moment=t()}(this,function(){"use strict";var e,i;function p(){return e.apply(null,arguments)}function s(e){return e instanceof Array||"[object Array]"===Object.prototype.toString.call(e)}function l(e){return null!=e&&"[object Object]"===Object.prototype.toString.call(e)}function u(e){return void 0===e}function c(e){return"number"==typeof e||"[object Number]"===Object.prototype.toString.call(e)}function d(e){return e instanceof Date||"[object Date]"===Object.prototype.toString.call(e)}function h(e,t){var n,r=[];for(n=0;n<e.length;++n)r.push(t(e[n],n));return r}function f(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function g(e,t){for(var n in t)f(t,n)&&(e[n]=t[n]);return f(t,"toString")&&(e.toString=t.toString),f(t,"valueOf")&&(e.valueOf=t.valueOf),e}function m(e,t,n,r){return Dt(e,t,n,r,!0).utc()}function v(e){return null==e._pf&&(e._pf={empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],meridiem:null,rfc2822:!1,weekdayMismatch:!1}),e._pf}function y(e){if(null==e._isValid){var t=v(e),n=i.call(t.parsedDateParts,function(e){return null!=e}),r=!isNaN(e._d.getTime())&&t.overflow<0&&!t.empty&&!t.invalidMonth&&!t.invalidWeekday&&!t.weekdayMismatch&&!t.nullInput&&!t.invalidFormat&&!t.userInvalidated&&(!t.meridiem||t.meridiem&&n);if(e._strict&&(r=r&&0===t.charsLeftOver&&0===t.unusedTokens.length&&void 0===t.bigHour),null!=Object.isFrozen&&Object.isFrozen(e))return r;e._isValid=r}return e._isValid}function w(e){var t=m(NaN);return null!=e?g(v(t),e):v(t).userInvalidated=!0,t}i=Array.prototype.some?Array.prototype.some:function(e){for(var t=Object(this),n=t.length>>>0,r=0;r<n;r++)if(r in t&&e.call(this,t[r],r,t))return!0;return!1};var o=p.momentProperties=[];function b(e,t){var n,r,i;if(u(t._isAMomentObject)||(e._isAMomentObject=t._isAMomentObject),u(t._i)||(e._i=t._i),u(t._f)||(e._f=t._f),u(t._l)||(e._l=t._l),u(t._strict)||(e._strict=t._strict),u(t._tzm)||(e._tzm=t._tzm),u(t._isUTC)||(e._isUTC=t._isUTC),u(t._offset)||(e._offset=t._offset),u(t._pf)||(e._pf=v(t)),u(t._locale)||(e._locale=t._locale),0<o.length)for(n=0;n<o.length;n++)u(i=t[r=o[n]])||(e[r]=i);return e}var t=!1;function $(e){b(this,e),this._d=new Date(null!=e._d?e._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),!1===t&&(t=!0,p.updateOffset(this),t=!1)}function _(e){return e instanceof $||null!=e&&null!=e._isAMomentObject}function C(e){return e<0?Math.ceil(e)||0:Math.floor(e)}function S(e){var t=+e,n=0;return 0!==t&&isFinite(t)&&(n=C(t)),n}function a(e,t,n){var r,i=Math.min(e.length,t.length),o=Math.abs(e.length-t.length),a=0;for(r=0;r<i;r++)(n&&e[r]!==t[r]||!n&&S(e[r])!==S(t[r]))&&a++;return a+o}function k(e){!1===p.suppressDeprecationWarnings&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+e)}function n(i,o){var a=!0;return g(function(){if(null!=p.deprecationHandler&&p.deprecationHandler(null,i),a){for(var e,t=[],n=0;n<arguments.length;n++){if(e="","object"==typeof arguments[n]){for(var r in e+="\n["+n+"] ",arguments[0])e+=r+": "+arguments[0][r]+", ";e=e.slice(0,-2)}else e=arguments[n];t.push(e)}k(i+"\nArguments: "+Array.prototype.slice.call(t).join("")+"\n"+(new Error).stack),a=!1}return o.apply(this,arguments)},o)}var r,D={};function x(e,t){null!=p.deprecationHandler&&p.deprecationHandler(e,t),D[e]||(k(t),D[e]=!0)}function O(e){return e instanceof Function||"[object Function]"===Object.prototype.toString.call(e)}function T(e,t){var n,r=g({},e);for(n in t)f(t,n)&&(l(e[n])&&l(t[n])?(r[n]={},g(r[n],e[n]),g(r[n],t[n])):null!=t[n]?r[n]=t[n]:delete r[n]);for(n in e)f(e,n)&&!f(t,n)&&l(e[n])&&(r[n]=g({},r[n]));return r}function E(e){null!=e&&this.set(e)}p.suppressDeprecationWarnings=!1,p.deprecationHandler=null,r=Object.keys?Object.keys:function(e){var t,n=[];for(t in e)f(e,t)&&n.push(t);return n};var A={};function P(e,t){var n=e.toLowerCase();A[n]=A[n+"s"]=A[t]=e}function M(e){return"string"==typeof e?A[e]||A[e.toLowerCase()]:void 0}function R(e){var t,n,r={};for(n in e)f(e,n)&&(t=M(n))&&(r[t]=e[n]);return r}var I={};function V(e,t){I[e]=t}function F(e,t,n){var r=""+Math.abs(e),i=t-r.length;return(0<=e?n?"+":"":"-")+Math.pow(10,Math.max(0,i)).toString().substr(1)+r}var L=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,j=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,H={},Y={};function N(e,t,n,r){var i=r;"string"==typeof r&&(i=function(){return this[r]()}),e&&(Y[e]=i),t&&(Y[t[0]]=function(){return F(i.apply(this,arguments),t[1],t[2])}),n&&(Y[n]=function(){return this.localeData().ordinal(i.apply(this,arguments),e)})}function q(e,t){return e.isValid()?(t=U(t,e.localeData()),H[t]=H[t]||function(r){var e,i,t,o=r.match(L);for(e=0,i=o.length;e<i;e++)Y[o[e]]?o[e]=Y[o[e]]:o[e]=(t=o[e]).match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"");return function(e){var t,n="";for(t=0;t<i;t++)n+=O(o[t])?o[t].call(e,r):o[t];return n}}(t),H[t](e)):e.localeData().invalidDate()}function U(e,t){var n=5;function r(e){return t.longDateFormat(e)||e}for(j.lastIndex=0;0<=n&&j.test(e);)e=e.replace(j,r),j.lastIndex=0,n-=1;return e}var z=/\d/,B=/\d\d/,W=/\d{3}/,G=/\d{4}/,K=/[+-]?\d{6}/,Q=/\d\d?/,Z=/\d\d\d\d?/,X=/\d\d\d\d\d\d?/,J=/\d{1,3}/,ee=/\d{1,4}/,te=/[+-]?\d{1,6}/,ne=/\d+/,re=/[+-]?\d+/,ie=/Z|[+-]\d\d:?\d\d/gi,oe=/Z|[+-]\d\d(?::?\d\d)?/gi,ae=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,se={};function le(e,n,r){se[e]=O(n)?n:function(e,t){return e&&r?r:n}}function ue(e,t){return f(se,e)?se[e](t._strict,t._locale):new RegExp(ce(e.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(e,t,n,r,i){return t||n||r||i})))}function ce(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var de={};function pe(e,n){var t,r=n;for("string"==typeof e&&(e=[e]),c(n)&&(r=function(e,t){t[n]=S(e)}),t=0;t<e.length;t++)de[e[t]]=r}function he(e,i){pe(e,function(e,t,n,r){n._w=n._w||{},i(e,n._w,n,r)})}var fe=0,ge=1,me=2,ve=3,ye=4,we=5,be=6,$e=7,_e=8;function Ce(e){return Se(e)?366:365}function Se(e){return e%4==0&&e%100!=0||e%400==0}N("Y",0,0,function(){var e=this.year();return e<=9999?""+e:"+"+e}),N(0,["YY",2],0,function(){return this.year()%100}),N(0,["YYYY",4],0,"year"),N(0,["YYYYY",5],0,"year"),N(0,["YYYYYY",6,!0],0,"year"),P("year","y"),V("year",1),le("Y",re),le("YY",Q,B),le("YYYY",ee,G),le("YYYYY",te,K),le("YYYYYY",te,K),pe(["YYYYY","YYYYYY"],fe),pe("YYYY",function(e,t){t[fe]=2===e.length?p.parseTwoDigitYear(e):S(e)}),pe("YY",function(e,t){t[fe]=p.parseTwoDigitYear(e)}),pe("Y",function(e,t){t[fe]=parseInt(e,10)}),p.parseTwoDigitYear=function(e){return S(e)+(68<S(e)?1900:2e3)};var ke,De=xe("FullYear",!0);function xe(t,n){return function(e){return null!=e?(Te(this,t,e),p.updateOffset(this,n),this):Oe(this,t)}}function Oe(e,t){return e.isValid()?e._d["get"+(e._isUTC?"UTC":"")+t]():NaN}function Te(e,t,n){e.isValid()&&!isNaN(n)&&("FullYear"===t&&Se(e.year())&&1===e.month()&&29===e.date()?e._d["set"+(e._isUTC?"UTC":"")+t](n,e.month(),Ee(n,e.month())):e._d["set"+(e._isUTC?"UTC":"")+t](n))}function Ee(e,t){if(isNaN(e)||isNaN(t))return NaN;var n,r=(t%(n=12)+n)%n;return e+=(t-r)/12,1===r?Se(e)?29:28:31-r%7%2}ke=Array.prototype.indexOf?Array.prototype.indexOf:function(e){var t;for(t=0;t<this.length;++t)if(this[t]===e)return t;return-1},N("M",["MM",2],"Mo",function(){return this.month()+1}),N("MMM",0,0,function(e){return this.localeData().monthsShort(this,e)}),N("MMMM",0,0,function(e){return this.localeData().months(this,e)}),P("month","M"),V("month",8),le("M",Q),le("MM",Q,B),le("MMM",function(e,t){return t.monthsShortRegex(e)}),le("MMMM",function(e,t){return t.monthsRegex(e)}),pe(["M","MM"],function(e,t){t[ge]=S(e)-1}),pe(["MMM","MMMM"],function(e,t,n,r){var i=n._locale.monthsParse(e,r,n._strict);null!=i?t[ge]=i:v(n).invalidMonth=e});var Ae=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,Pe="January_February_March_April_May_June_July_August_September_October_November_December".split("_");var Me="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_");function Re(e,t){var n;if(!e.isValid())return e;if("string"==typeof t)if(/^\d+$/.test(t))t=S(t);else if(!c(t=e.localeData().monthsParse(t)))return e;return n=Math.min(e.date(),Ee(e.year(),t)),e._d["set"+(e._isUTC?"UTC":"")+"Month"](t,n),e}function Ie(e){return null!=e?(Re(this,e),p.updateOffset(this,!0),this):Oe(this,"Month")}var Ve=ae;var Fe=ae;function Le(){function e(e,t){return t.length-e.length}var t,n,r=[],i=[],o=[];for(t=0;t<12;t++)n=m([2e3,t]),r.push(this.monthsShort(n,"")),i.push(this.months(n,"")),o.push(this.months(n,"")),o.push(this.monthsShort(n,""));for(r.sort(e),i.sort(e),o.sort(e),t=0;t<12;t++)r[t]=ce(r[t]),i[t]=ce(i[t]);for(t=0;t<24;t++)o[t]=ce(o[t]);this._monthsRegex=new RegExp("^("+o.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+i.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+r.join("|")+")","i")}function je(e){var t=new Date(Date.UTC.apply(null,arguments));return e<100&&0<=e&&isFinite(t.getUTCFullYear())&&t.setUTCFullYear(e),t}function He(e,t,n){var r=7+t-n;return-((7+je(e,0,r).getUTCDay()-t)%7)+r-1}function Ye(e,t,n,r,i){var o,a,s=1+7*(t-1)+(7+n-r)%7+He(e,r,i);return a=s<=0?Ce(o=e-1)+s:s>Ce(e)?(o=e+1,s-Ce(e)):(o=e,s),{year:o,dayOfYear:a}}function Ne(e,t,n){var r,i,o=He(e.year(),t,n),a=Math.floor((e.dayOfYear()-o-1)/7)+1;return a<1?r=a+qe(i=e.year()-1,t,n):a>qe(e.year(),t,n)?(r=a-qe(e.year(),t,n),i=e.year()+1):(i=e.year(),r=a),{week:r,year:i}}function qe(e,t,n){var r=He(e,t,n),i=He(e+1,t,n);return(Ce(e)-r+i)/7}N("w",["ww",2],"wo","week"),N("W",["WW",2],"Wo","isoWeek"),P("week","w"),P("isoWeek","W"),V("week",5),V("isoWeek",5),le("w",Q),le("ww",Q,B),le("W",Q),le("WW",Q,B),he(["w","ww","W","WW"],function(e,t,n,r){t[r.substr(0,1)]=S(e)});N("d",0,"do","day"),N("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),N("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),N("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),N("e",0,0,"weekday"),N("E",0,0,"isoWeekday"),P("day","d"),P("weekday","e"),P("isoWeekday","E"),V("day",11),V("weekday",11),V("isoWeekday",11),le("d",Q),le("e",Q),le("E",Q),le("dd",function(e,t){return t.weekdaysMinRegex(e)}),le("ddd",function(e,t){return t.weekdaysShortRegex(e)}),le("dddd",function(e,t){return t.weekdaysRegex(e)}),he(["dd","ddd","dddd"],function(e,t,n,r){var i=n._locale.weekdaysParse(e,r,n._strict);null!=i?t.d=i:v(n).invalidWeekday=e}),he(["d","e","E"],function(e,t,n,r){t[r]=S(e)});var Ue="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_");var ze="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_");var Be="Su_Mo_Tu_We_Th_Fr_Sa".split("_");var We=ae;var Ge=ae;var Ke=ae;function Qe(){function e(e,t){return t.length-e.length}var t,n,r,i,o,a=[],s=[],l=[],u=[];for(t=0;t<7;t++)n=m([2e3,1]).day(t),r=this.weekdaysMin(n,""),i=this.weekdaysShort(n,""),o=this.weekdays(n,""),a.push(r),s.push(i),l.push(o),u.push(r),u.push(i),u.push(o);for(a.sort(e),s.sort(e),l.sort(e),u.sort(e),t=0;t<7;t++)s[t]=ce(s[t]),l[t]=ce(l[t]),u[t]=ce(u[t]);this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+a.join("|")+")","i")}function Ze(){return this.hours()%12||12}function Xe(e,t){N(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function Je(e,t){return t._meridiemParse}N("H",["HH",2],0,"hour"),N("h",["hh",2],0,Ze),N("k",["kk",2],0,function(){return this.hours()||24}),N("hmm",0,0,function(){return""+Ze.apply(this)+F(this.minutes(),2)}),N("hmmss",0,0,function(){return""+Ze.apply(this)+F(this.minutes(),2)+F(this.seconds(),2)}),N("Hmm",0,0,function(){return""+this.hours()+F(this.minutes(),2)}),N("Hmmss",0,0,function(){return""+this.hours()+F(this.minutes(),2)+F(this.seconds(),2)}),Xe("a",!0),Xe("A",!1),P("hour","h"),V("hour",13),le("a",Je),le("A",Je),le("H",Q),le("h",Q),le("k",Q),le("HH",Q,B),le("hh",Q,B),le("kk",Q,B),le("hmm",Z),le("hmmss",X),le("Hmm",Z),le("Hmmss",X),pe(["H","HH"],ve),pe(["k","kk"],function(e,t,n){var r=S(e);t[ve]=24===r?0:r}),pe(["a","A"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e}),pe(["h","hh"],function(e,t,n){t[ve]=S(e),v(n).bigHour=!0}),pe("hmm",function(e,t,n){var r=e.length-2;t[ve]=S(e.substr(0,r)),t[ye]=S(e.substr(r)),v(n).bigHour=!0}),pe("hmmss",function(e,t,n){var r=e.length-4,i=e.length-2;t[ve]=S(e.substr(0,r)),t[ye]=S(e.substr(r,2)),t[we]=S(e.substr(i)),v(n).bigHour=!0}),pe("Hmm",function(e,t,n){var r=e.length-2;t[ve]=S(e.substr(0,r)),t[ye]=S(e.substr(r))}),pe("Hmmss",function(e,t,n){var r=e.length-4,i=e.length-2;t[ve]=S(e.substr(0,r)),t[ye]=S(e.substr(r,2)),t[we]=S(e.substr(i))});var et,tt=xe("Hours",!0),nt={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:Pe,monthsShort:Me,week:{dow:0,doy:6},weekdays:Ue,weekdaysMin:Be,weekdaysShort:ze,meridiemParse:/[ap]\.?m?\.?/i},rt={},it={};function ot(e){return e?e.toLowerCase().replace("_","-"):e}function at(e){var t=null;if(!rt[e]&&"undefined"!=typeof module&&module&&module.exports)try{t=et._abbr,require("./locale/"+e),st(t)}catch(e){}return rt[e]}function st(e,t){var n;return e&&((n=u(t)?ut(e):lt(e,t))?et=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),et._abbr}function lt(e,t){if(null===t)return delete rt[e],null;var n,r=nt;if(t.abbr=e,null!=rt[e])x("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),r=rt[e]._config;else if(null!=t.parentLocale)if(null!=rt[t.parentLocale])r=rt[t.parentLocale]._config;else{if(null==(n=at(t.parentLocale)))return it[t.parentLocale]||(it[t.parentLocale]=[]),it[t.parentLocale].push({name:e,config:t}),null;r=n._config}return rt[e]=new E(T(r,t)),it[e]&&it[e].forEach(function(e){lt(e.name,e.config)}),st(e),rt[e]}function ut(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return et;if(!s(e)){if(t=at(e))return t;e=[e]}return function(e){for(var t,n,r,i,o=0;o<e.length;){for(t=(i=ot(e[o]).split("-")).length,n=(n=ot(e[o+1]))?n.split("-"):null;0<t;){if(r=at(i.slice(0,t).join("-")))return r;if(n&&n.length>=t&&a(i,n,!0)>=t-1)break;t--}o++}return et}(e)}function ct(e){var t,n=e._a;return n&&-2===v(e).overflow&&(t=n[ge]<0||11<n[ge]?ge:n[me]<1||n[me]>Ee(n[fe],n[ge])?me:n[ve]<0||24<n[ve]||24===n[ve]&&(0!==n[ye]||0!==n[we]||0!==n[be])?ve:n[ye]<0||59<n[ye]?ye:n[we]<0||59<n[we]?we:n[be]<0||999<n[be]?be:-1,v(e)._overflowDayOfYear&&(t<fe||me<t)&&(t=me),v(e)._overflowWeeks&&-1===t&&(t=$e),v(e)._overflowWeekday&&-1===t&&(t=_e),v(e).overflow=t),e}function dt(e,t,n){return null!=e?e:null!=t?t:n}function pt(e){var t,n,r,i,o,a=[];if(!e._d){var s,l;for(s=e,l=new Date(p.now()),r=s._useUTC?[l.getUTCFullYear(),l.getUTCMonth(),l.getUTCDate()]:[l.getFullYear(),l.getMonth(),l.getDate()],e._w&&null==e._a[me]&&null==e._a[ge]&&function(e){var t,n,r,i,o,a,s,l;if(null!=(t=e._w).GG||null!=t.W||null!=t.E)o=1,a=4,n=dt(t.GG,e._a[fe],Ne(xt(),1,4).year),r=dt(t.W,1),((i=dt(t.E,1))<1||7<i)&&(l=!0);else{o=e._locale._week.dow,a=e._locale._week.doy;var u=Ne(xt(),o,a);n=dt(t.gg,e._a[fe],u.year),r=dt(t.w,u.week),null!=t.d?((i=t.d)<0||6<i)&&(l=!0):null!=t.e?(i=t.e+o,(t.e<0||6<t.e)&&(l=!0)):i=o}r<1||r>qe(n,o,a)?v(e)._overflowWeeks=!0:null!=l?v(e)._overflowWeekday=!0:(s=Ye(n,r,i,o,a),e._a[fe]=s.year,e._dayOfYear=s.dayOfYear)}(e),null!=e._dayOfYear&&(o=dt(e._a[fe],r[fe]),(e._dayOfYear>Ce(o)||0===e._dayOfYear)&&(v(e)._overflowDayOfYear=!0),n=je(o,0,e._dayOfYear),e._a[ge]=n.getUTCMonth(),e._a[me]=n.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=a[t]=r[t];for(;t<7;t++)e._a[t]=a[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[ve]&&0===e._a[ye]&&0===e._a[we]&&0===e._a[be]&&(e._nextDay=!0,e._a[ve]=0),e._d=(e._useUTC?je:function(e,t,n,r,i,o,a){var s=new Date(e,t,n,r,i,o,a);return e<100&&0<=e&&isFinite(s.getFullYear())&&s.setFullYear(e),s}).apply(null,a),i=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[ve]=24),e._w&&void 0!==e._w.d&&e._w.d!==i&&(v(e).weekdayMismatch=!0)}}var ht=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,ft=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,gt=/Z|[+-]\d\d(?::?\d\d)?/,mt=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],vt=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],yt=/^\/?Date\((\-?\d+)/i;function wt(e){var t,n,r,i,o,a,s=e._i,l=ht.exec(s)||ft.exec(s);if(l){for(v(e).iso=!0,t=0,n=mt.length;t<n;t++)if(mt[t][1].exec(l[1])){i=mt[t][0],r=!1!==mt[t][2];break}if(null==i)return void(e._isValid=!1);if(l[3]){for(t=0,n=vt.length;t<n;t++)if(vt[t][1].exec(l[3])){o=(l[2]||" ")+vt[t][0];break}if(null==o)return void(e._isValid=!1)}if(!r&&null!=o)return void(e._isValid=!1);if(l[4]){if(!gt.exec(l[4]))return void(e._isValid=!1);a="Z"}e._f=i+(o||"")+(a||""),St(e)}else e._isValid=!1}var bt=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/;function $t(e,t,n,r,i,o){var a=[function(e){var t=parseInt(e,10);{if(t<=49)return 2e3+t;if(t<=999)return 1900+t}return t}(e),Me.indexOf(t),parseInt(n,10),parseInt(r,10),parseInt(i,10)];return o&&a.push(parseInt(o,10)),a}var _t={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function Ct(e){var t,n,r,i=bt.exec(e._i.replace(/\([^)]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").replace(/^\s\s*/,"").replace(/\s\s*$/,""));if(i){var o=$t(i[4],i[3],i[2],i[5],i[6],i[7]);if(t=i[1],n=o,r=e,t&&ze.indexOf(t)!==new Date(n[0],n[1],n[2]).getDay()&&(v(r).weekdayMismatch=!0,!(r._isValid=!1)))return;e._a=o,e._tzm=function(e,t,n){if(e)return _t[e];if(t)return 0;var r=parseInt(n,10),i=r%100;return(r-i)/100*60+i}(i[8],i[9],i[10]),e._d=je.apply(null,e._a),e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),v(e).rfc2822=!0}else e._isValid=!1}function St(e){if(e._f!==p.ISO_8601)if(e._f!==p.RFC_2822){e._a=[],v(e).empty=!0;var t,n,r,i,o,a,s,l,u=""+e._i,c=u.length,d=0;for(r=U(e._f,e._locale).match(L)||[],t=0;t<r.length;t++)i=r[t],(n=(u.match(ue(i,e))||[])[0])&&(0<(o=u.substr(0,u.indexOf(n))).length&&v(e).unusedInput.push(o),u=u.slice(u.indexOf(n)+n.length),d+=n.length),Y[i]?(n?v(e).empty=!1:v(e).unusedTokens.push(i),a=i,l=e,null!=(s=n)&&f(de,a)&&de[a](s,l._a,l,a)):e._strict&&!n&&v(e).unusedTokens.push(i);v(e).charsLeftOver=c-d,0<u.length&&v(e).unusedInput.push(u),e._a[ve]<=12&&!0===v(e).bigHour&&0<e._a[ve]&&(v(e).bigHour=void 0),v(e).parsedDateParts=e._a.slice(0),v(e).meridiem=e._meridiem,e._a[ve]=function(e,t,n){var r;if(null==n)return t;return null!=e.meridiemHour?e.meridiemHour(t,n):(null!=e.isPM&&((r=e.isPM(n))&&t<12&&(t+=12),r||12!==t||(t=0)),t)}(e._locale,e._a[ve],e._meridiem),pt(e),ct(e)}else Ct(e);else wt(e)}function kt(e){var t,n,r,i,o=e._i,a=e._f;return e._locale=e._locale||ut(e._l),null===o||void 0===a&&""===o?w({nullInput:!0}):("string"==typeof o&&(e._i=o=e._locale.preparse(o)),_(o)?new $(ct(o)):(d(o)?e._d=o:s(a)?function(e){var t,n,r,i,o;if(0===e._f.length)return v(e).invalidFormat=!0,e._d=new Date(NaN);for(i=0;i<e._f.length;i++)o=0,t=b({},e),null!=e._useUTC&&(t._useUTC=e._useUTC),t._f=e._f[i],St(t),y(t)&&(o+=v(t).charsLeftOver,o+=10*v(t).unusedTokens.length,v(t).score=o,(null==r||o<r)&&(r=o,n=t));g(e,n||t)}(e):a?St(e):u(n=(t=e)._i)?t._d=new Date(p.now()):d(n)?t._d=new Date(n.valueOf()):"string"==typeof n?(r=t,null===(i=yt.exec(r._i))?(wt(r),!1===r._isValid&&(delete r._isValid,Ct(r),!1===r._isValid&&(delete r._isValid,p.createFromInputFallback(r)))):r._d=new Date(+i[1])):s(n)?(t._a=h(n.slice(0),function(e){return parseInt(e,10)}),pt(t)):l(n)?function(e){if(!e._d){var t=R(e._i);e._a=h([t.year,t.month,t.day||t.date,t.hour,t.minute,t.second,t.millisecond],function(e){return e&&parseInt(e,10)}),pt(e)}}(t):c(n)?t._d=new Date(n):p.createFromInputFallback(t),y(e)||(e._d=null),e))}function Dt(e,t,n,r,i){var o,a={};return!0!==n&&!1!==n||(r=n,n=void 0),(l(e)&&function(e){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(e).length;var t;for(t in e)if(e.hasOwnProperty(t))return!1;return!0}(e)||s(e)&&0===e.length)&&(e=void 0),a._isAMomentObject=!0,a._useUTC=a._isUTC=i,a._l=n,a._i=e,a._f=t,a._strict=r,(o=new $(ct(kt(a))))._nextDay&&(o.add(1,"d"),o._nextDay=void 0),o}function xt(e,t,n,r){return Dt(e,t,n,r,!1)}p.createFromInputFallback=n("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(e){e._d=new Date(e._i+(e._useUTC?" UTC":""))}),p.ISO_8601=function(){},p.RFC_2822=function(){};var Ot=n("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var e=xt.apply(null,arguments);return this.isValid()&&e.isValid()?e<this?this:e:w()}),Tt=n("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var e=xt.apply(null,arguments);return this.isValid()&&e.isValid()?this<e?this:e:w()});function Et(e,t){var n,r;if(1===t.length&&s(t[0])&&(t=t[0]),!t.length)return xt();for(n=t[0],r=1;r<t.length;++r)t[r].isValid()&&!t[r][e](n)||(n=t[r]);return n}var At=["year","quarter","month","week","day","hour","minute","second","millisecond"];function Pt(e){var t=R(e),n=t.year||0,r=t.quarter||0,i=t.month||0,o=t.week||0,a=t.day||0,s=t.hour||0,l=t.minute||0,u=t.second||0,c=t.millisecond||0;this._isValid=function(e){for(var t in e)if(-1===ke.call(At,t)||null!=e[t]&&isNaN(e[t]))return!1;for(var n=!1,r=0;r<At.length;++r)if(e[At[r]]){if(n)return!1;parseFloat(e[At[r]])!==S(e[At[r]])&&(n=!0)}return!0}(t),this._milliseconds=+c+1e3*u+6e4*l+1e3*s*60*60,this._days=+a+7*o,this._months=+i+3*r+12*n,this._data={},this._locale=ut(),this._bubble()}function Mt(e){return e instanceof Pt}function Rt(e){return e<0?-1*Math.round(-1*e):Math.round(e)}function It(e,n){N(e,0,0,function(){var e=this.utcOffset(),t="+";return e<0&&(e=-e,t="-"),t+F(~~(e/60),2)+n+F(~~e%60,2)})}It("Z",":"),It("ZZ",""),le("Z",oe),le("ZZ",oe),pe(["Z","ZZ"],function(e,t,n){n._useUTC=!0,n._tzm=Ft(oe,e)});var Vt=/([\+\-]|\d\d)/gi;function Ft(e,t){var n=(t||"").match(e);if(null===n)return null;var r=((n[n.length-1]||[])+"").match(Vt)||["-",0,0],i=60*r[1]+S(r[2]);return 0===i?0:"+"===r[0]?i:-i}function Lt(e,t){var n,r;return t._isUTC?(n=t.clone(),r=(_(e)||d(e)?e.valueOf():xt(e).valueOf())-n.valueOf(),n._d.setTime(n._d.valueOf()+r),p.updateOffset(n,!1),n):xt(e).local()}function jt(e){return 15*-Math.round(e._d.getTimezoneOffset()/15)}function Ht(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}p.updateOffset=function(){};var Yt=/^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,Nt=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function qt(e,t){var n,r,i,o=e,a=null;return Mt(e)?o={ms:e._milliseconds,d:e._days,M:e._months}:c(e)?(o={},t?o[t]=e:o.milliseconds=e):(a=Yt.exec(e))?(n="-"===a[1]?-1:1,o={y:0,d:S(a[me])*n,h:S(a[ve])*n,m:S(a[ye])*n,s:S(a[we])*n,ms:S(Rt(1e3*a[be]))*n}):(a=Nt.exec(e))?(n="-"===a[1]?-1:(a[1],1),o={y:Ut(a[2],n),M:Ut(a[3],n),w:Ut(a[4],n),d:Ut(a[5],n),h:Ut(a[6],n),m:Ut(a[7],n),s:Ut(a[8],n)}):null==o?o={}:"object"==typeof o&&("from"in o||"to"in o)&&(i=function(e,t){var n;if(!e.isValid()||!t.isValid())return{milliseconds:0,months:0};t=Lt(t,e),e.isBefore(t)?n=zt(e,t):((n=zt(t,e)).milliseconds=-n.milliseconds,n.months=-n.months);return n}(xt(o.from),xt(o.to)),(o={}).ms=i.milliseconds,o.M=i.months),r=new Pt(o),Mt(e)&&f(e,"_locale")&&(r._locale=e._locale),r}function Ut(e,t){var n=e&&parseFloat(e.replace(",","."));return(isNaN(n)?0:n)*t}function zt(e,t){var n={milliseconds:0,months:0};return n.months=t.month()-e.month()+12*(t.year()-e.year()),e.clone().add(n.months,"M").isAfter(t)&&--n.months,n.milliseconds=+t-+e.clone().add(n.months,"M"),n}function Bt(r,i){return function(e,t){var n;return null===t||isNaN(+t)||(x(i,"moment()."+i+"(period, number) is deprecated. Please use moment()."+i+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),n=e,e=t,t=n),Wt(this,qt(e="string"==typeof e?+e:e,t),r),this}}function Wt(e,t,n,r){var i=t._milliseconds,o=Rt(t._days),a=Rt(t._months);e.isValid()&&(r=null==r||r,a&&Re(e,Oe(e,"Month")+a*n),o&&Te(e,"Date",Oe(e,"Date")+o*n),i&&e._d.setTime(e._d.valueOf()+i*n),r&&p.updateOffset(e,o||a))}qt.fn=Pt.prototype,qt.invalid=function(){return qt(NaN)};var Gt=Bt(1,"add"),Kt=Bt(-1,"subtract");function Qt(e,t){var n=12*(t.year()-e.year())+(t.month()-e.month()),r=e.clone().add(n,"months");return-(n+(t-r<0?(t-r)/(r-e.clone().add(n-1,"months")):(t-r)/(e.clone().add(n+1,"months")-r)))||0}function Zt(e){var t;return void 0===e?this._locale._abbr:(null!=(t=ut(e))&&(this._locale=t),this)}p.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",p.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var Xt=n("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(e){return void 0===e?this.localeData():this.locale(e)});function Jt(){return this._locale}function en(e,t){N(0,[e,e.length],0,t)}function tn(e,t,n,r,i){var o;return null==e?Ne(this,r,i).year:((o=qe(e,r,i))<t&&(t=o),function(e,t,n,r,i){var o=Ye(e,t,n,r,i),a=je(o.year,0,o.dayOfYear);return this.year(a.getUTCFullYear()),this.month(a.getUTCMonth()),this.date(a.getUTCDate()),this}.call(this,e,t,n,r,i))}N(0,["gg",2],0,function(){return this.weekYear()%100}),N(0,["GG",2],0,function(){return this.isoWeekYear()%100}),en("gggg","weekYear"),en("ggggg","weekYear"),en("GGGG","isoWeekYear"),en("GGGGG","isoWeekYear"),P("weekYear","gg"),P("isoWeekYear","GG"),V("weekYear",1),V("isoWeekYear",1),le("G",re),le("g",re),le("GG",Q,B),le("gg",Q,B),le("GGGG",ee,G),le("gggg",ee,G),le("GGGGG",te,K),le("ggggg",te,K),he(["gggg","ggggg","GGGG","GGGGG"],function(e,t,n,r){t[r.substr(0,2)]=S(e)}),he(["gg","GG"],function(e,t,n,r){t[r]=p.parseTwoDigitYear(e)}),N("Q",0,"Qo","quarter"),P("quarter","Q"),V("quarter",7),le("Q",z),pe("Q",function(e,t){t[ge]=3*(S(e)-1)}),N("D",["DD",2],"Do","date"),P("date","D"),V("date",9),le("D",Q),le("DD",Q,B),le("Do",function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient}),pe(["D","DD"],me),pe("Do",function(e,t){t[me]=S(e.match(Q)[0])});var nn=xe("Date",!0);N("DDD",["DDDD",3],"DDDo","dayOfYear"),P("dayOfYear","DDD"),V("dayOfYear",4),le("DDD",J),le("DDDD",W),pe(["DDD","DDDD"],function(e,t,n){n._dayOfYear=S(e)}),N("m",["mm",2],0,"minute"),P("minute","m"),V("minute",14),le("m",Q),le("mm",Q,B),pe(["m","mm"],ye);var rn=xe("Minutes",!1);N("s",["ss",2],0,"second"),P("second","s"),V("second",15),le("s",Q),le("ss",Q,B),pe(["s","ss"],we);var on,an=xe("Seconds",!1);for(N("S",0,0,function(){return~~(this.millisecond()/100)}),N(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),N(0,["SSS",3],0,"millisecond"),N(0,["SSSS",4],0,function(){return 10*this.millisecond()}),N(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),N(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),N(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),N(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),N(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),P("millisecond","ms"),V("millisecond",16),le("S",J,z),le("SS",J,B),le("SSS",J,W),on="SSSS";on.length<=9;on+="S")le(on,ne);function sn(e,t){t[be]=S(1e3*("0."+e))}for(on="S";on.length<=9;on+="S")pe(on,sn);var ln=xe("Milliseconds",!1);N("z",0,0,"zoneAbbr"),N("zz",0,0,"zoneName");var un=$.prototype;function cn(e){return e}un.add=Gt,un.calendar=function(e,t){var n=e||xt(),r=Lt(n,this).startOf("day"),i=p.calendarFormat(this,r)||"sameElse",o=t&&(O(t[i])?t[i].call(this,n):t[i]);return this.format(o||this.localeData().calendar(i,this,xt(n)))},un.clone=function(){return new $(this)},un.diff=function(e,t,n){var r,i,o;if(!this.isValid())return NaN;if(!(r=Lt(e,this)).isValid())return NaN;switch(i=6e4*(r.utcOffset()-this.utcOffset()),t=M(t)){case"year":o=Qt(this,r)/12;break;case"month":o=Qt(this,r);break;case"quarter":o=Qt(this,r)/3;break;case"second":o=(this-r)/1e3;break;case"minute":o=(this-r)/6e4;break;case"hour":o=(this-r)/36e5;break;case"day":o=(this-r-i)/864e5;break;case"week":o=(this-r-i)/6048e5;break;default:o=this-r}return n?o:C(o)},un.endOf=function(e){return void 0===(e=M(e))||"millisecond"===e?this:("date"===e&&(e="day"),this.startOf(e).add(1,"isoWeek"===e?"week":e).subtract(1,"ms"))},un.format=function(e){e||(e=this.isUtc()?p.defaultFormatUtc:p.defaultFormat);var t=q(this,e);return this.localeData().postformat(t)},un.from=function(e,t){return this.isValid()&&(_(e)&&e.isValid()||xt(e).isValid())?qt({to:this,from:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},un.fromNow=function(e){return this.from(xt(),e)},un.to=function(e,t){return this.isValid()&&(_(e)&&e.isValid()||xt(e).isValid())?qt({from:this,to:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},un.toNow=function(e){return this.to(xt(),e)},un.get=function(e){return O(this[e=M(e)])?this[e]():this},un.invalidAt=function(){return v(this).overflow},un.isAfter=function(e,t){var n=_(e)?e:xt(e);return!(!this.isValid()||!n.isValid())&&("millisecond"===(t=M(u(t)?"millisecond":t))?this.valueOf()>n.valueOf():n.valueOf()<this.clone().startOf(t).valueOf())},un.isBefore=function(e,t){var n=_(e)?e:xt(e);return!(!this.isValid()||!n.isValid())&&("millisecond"===(t=M(u(t)?"millisecond":t))?this.valueOf()<n.valueOf():this.clone().endOf(t).valueOf()<n.valueOf())},un.isBetween=function(e,t,n,r){return("("===(r=r||"()")[0]?this.isAfter(e,n):!this.isBefore(e,n))&&(")"===r[1]?this.isBefore(t,n):!this.isAfter(t,n))},un.isSame=function(e,t){var n,r=_(e)?e:xt(e);return!(!this.isValid()||!r.isValid())&&("millisecond"===(t=M(t||"millisecond"))?this.valueOf()===r.valueOf():(n=r.valueOf(),this.clone().startOf(t).valueOf()<=n&&n<=this.clone().endOf(t).valueOf()))},un.isSameOrAfter=function(e,t){return this.isSame(e,t)||this.isAfter(e,t)},un.isSameOrBefore=function(e,t){return this.isSame(e,t)||this.isBefore(e,t)},un.isValid=function(){return y(this)},un.lang=Xt,un.locale=Zt,un.localeData=Jt,un.max=Tt,un.min=Ot,un.parsingFlags=function(){return g({},v(this))},un.set=function(e,t){if("object"==typeof e)for(var n=function(e){var t=[];for(var n in e)t.push({unit:n,priority:I[n]});return t.sort(function(e,t){return e.priority-t.priority}),t}(e=R(e)),r=0;r<n.length;r++)this[n[r].unit](e[n[r].unit]);else if(O(this[e=M(e)]))return this[e](t);return this},un.startOf=function(e){switch(e=M(e)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":case"date":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===e&&this.weekday(0),"isoWeek"===e&&this.isoWeekday(1),"quarter"===e&&this.month(3*Math.floor(this.month()/3)),this},un.subtract=Kt,un.toArray=function(){return[this.year(),this.month(),this.date(),this.hour(),this.minute(),this.second(),this.millisecond()]},un.toObject=function(){return{years:this.year(),months:this.month(),date:this.date(),hours:this.hours(),minutes:this.minutes(),seconds:this.seconds(),milliseconds:this.milliseconds()}},un.toDate=function(){return new Date(this.valueOf())},un.toISOString=function(e){if(!this.isValid())return null;var t=!0!==e,n=t?this.clone().utc():this;return n.year()<0||9999<n.year()?q(n,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):O(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",q(n,"Z")):q(n,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},un.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var e="moment",t="";this.isLocal()||(e=0===this.utcOffset()?"moment.utc":"moment.parseZone",t="Z");var n="["+e+'("]',r=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",i=t+'[")]';return this.format(n+r+"-MM-DD[T]HH:mm:ss.SSS"+i)},un.toJSON=function(){return this.isValid()?this.toISOString():null},un.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},un.unix=function(){return Math.floor(this.valueOf()/1e3)},un.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},un.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},un.year=De,un.isLeapYear=function(){return Se(this.year())},un.weekYear=function(e){return tn.call(this,e,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},un.isoWeekYear=function(e){return tn.call(this,e,this.isoWeek(),this.isoWeekday(),1,4)},un.quarter=un.quarters=function(e){return null==e?Math.ceil((this.month()+1)/3):this.month(3*(e-1)+this.month()%3)},un.month=Ie,un.daysInMonth=function(){return Ee(this.year(),this.month())},un.week=un.weeks=function(e){var t=this.localeData().week(this);return null==e?t:this.add(7*(e-t),"d")},un.isoWeek=un.isoWeeks=function(e){var t=Ne(this,1,4).week;return null==e?t:this.add(7*(e-t),"d")},un.weeksInYear=function(){var e=this.localeData()._week;return qe(this.year(),e.dow,e.doy)},un.isoWeeksInYear=function(){return qe(this.year(),1,4)},un.date=nn,un.day=un.days=function(e){if(!this.isValid())return null!=e?this:NaN;var t,n,r=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=e?(t=e,n=this.localeData(),e="string"!=typeof t?t:isNaN(t)?"number"==typeof(t=n.weekdaysParse(t))?t:null:parseInt(t,10),this.add(e-r,"d")):r},un.weekday=function(e){if(!this.isValid())return null!=e?this:NaN;var t=(this.day()+7-this.localeData()._week.dow)%7;return null==e?t:this.add(e-t,"d")},un.isoWeekday=function(e){if(!this.isValid())return null!=e?this:NaN;if(null==e)return this.day()||7;var t,n,r=(t=e,n=this.localeData(),"string"==typeof t?n.weekdaysParse(t)%7||7:isNaN(t)?null:t);return this.day(this.day()%7?r:r-7)},un.dayOfYear=function(e){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==e?t:this.add(e-t,"d")},un.hour=un.hours=tt,un.minute=un.minutes=rn,un.second=un.seconds=an,un.millisecond=un.milliseconds=ln,un.utcOffset=function(e,t,n){var r,i=this._offset||0;if(!this.isValid())return null!=e?this:NaN;if(null==e)return this._isUTC?i:jt(this);if("string"==typeof e){if(null===(e=Ft(oe,e)))return this}else Math.abs(e)<16&&!n&&(e*=60);return!this._isUTC&&t&&(r=jt(this)),this._offset=e,this._isUTC=!0,null!=r&&this.add(r,"m"),i!==e&&(!t||this._changeInProgress?Wt(this,qt(e-i,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,p.updateOffset(this,!0),this._changeInProgress=null)),this},un.utc=function(e){return this.utcOffset(0,e)},un.local=function(e){return this._isUTC&&(this.utcOffset(0,e),this._isUTC=!1,e&&this.subtract(jt(this),"m")),this},un.parseZone=function(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var e=Ft(ie,this._i);null!=e?this.utcOffset(e):this.utcOffset(0,!0)}return this},un.hasAlignedHourOffset=function(e){return!!this.isValid()&&(e=e?xt(e).utcOffset():0,(this.utcOffset()-e)%60==0)},un.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},un.isLocal=function(){return!!this.isValid()&&!this._isUTC},un.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},un.isUtc=Ht,un.isUTC=Ht,un.zoneAbbr=function(){return this._isUTC?"UTC":""},un.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},un.dates=n("dates accessor is deprecated. Use date instead.",nn),un.months=n("months accessor is deprecated. Use month instead",Ie),un.years=n("years accessor is deprecated. Use year instead",De),un.zone=n("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(e,t){return null!=e?("string"!=typeof e&&(e=-e),this.utcOffset(e,t),this):-this.utcOffset()}),un.isDSTShifted=n("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!u(this._isDSTShifted))return this._isDSTShifted;var e={};if(b(e,this),(e=kt(e))._a){var t=e._isUTC?m(e._a):xt(e._a);this._isDSTShifted=this.isValid()&&0<a(e._a,t.toArray())}else this._isDSTShifted=!1;return this._isDSTShifted});var dn=E.prototype;function pn(e,t,n,r){var i=ut(),o=m().set(r,t);return i[n](o,e)}function hn(e,t,n){if(c(e)&&(t=e,e=void 0),e=e||"",null!=t)return pn(e,t,n,"month");var r,i=[];for(r=0;r<12;r++)i[r]=pn(e,r,n,"month");return i}function fn(e,t,n,r){t=("boolean"==typeof e?c(t)&&(n=t,t=void 0):(t=e,e=!1,c(n=t)&&(n=t,t=void 0)),t||"");var i,o=ut(),a=e?o._week.dow:0;if(null!=n)return pn(t,(n+a)%7,r,"day");var s=[];for(i=0;i<7;i++)s[i]=pn(t,(i+a)%7,r,"day");return s}dn.calendar=function(e,t,n){var r=this._calendar[e]||this._calendar.sameElse;return O(r)?r.call(t,n):r},dn.longDateFormat=function(e){var t=this._longDateFormat[e],n=this._longDateFormat[e.toUpperCase()];return t||!n?t:(this._longDateFormat[e]=n.replace(/MMMM|MM|DD|dddd/g,function(e){return e.slice(1)}),this._longDateFormat[e])},dn.invalidDate=function(){return this._invalidDate},dn.ordinal=function(e){return this._ordinal.replace("%d",e)},dn.preparse=cn,dn.postformat=cn,dn.relativeTime=function(e,t,n,r){var i=this._relativeTime[n];return O(i)?i(e,t,n,r):i.replace(/%d/i,e)},dn.pastFuture=function(e,t){var n=this._relativeTime[0<e?"future":"past"];return O(n)?n(t):n.replace(/%s/i,t)},dn.set=function(e){var t,n;for(n in e)O(t=e[n])?this[n]=t:this["_"+n]=t;this._config=e,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},dn.months=function(e,t){return e?s(this._months)?this._months[e.month()]:this._months[(this._months.isFormat||Ae).test(t)?"format":"standalone"][e.month()]:s(this._months)?this._months:this._months.standalone},dn.monthsShort=function(e,t){return e?s(this._monthsShort)?this._monthsShort[e.month()]:this._monthsShort[Ae.test(t)?"format":"standalone"][e.month()]:s(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},dn.monthsParse=function(e,t,n){var r,i,o;if(this._monthsParseExact)return function(e,t,n){var r,i,o,a=e.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],r=0;r<12;++r)o=m([2e3,r]),this._shortMonthsParse[r]=this.monthsShort(o,"").toLocaleLowerCase(),this._longMonthsParse[r]=this.months(o,"").toLocaleLowerCase();return n?"MMM"===t?-1!==(i=ke.call(this._shortMonthsParse,a))?i:null:-1!==(i=ke.call(this._longMonthsParse,a))?i:null:"MMM"===t?-1!==(i=ke.call(this._shortMonthsParse,a))?i:-1!==(i=ke.call(this._longMonthsParse,a))?i:null:-1!==(i=ke.call(this._longMonthsParse,a))?i:-1!==(i=ke.call(this._shortMonthsParse,a))?i:null}.call(this,e,t,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),r=0;r<12;r++){if(i=m([2e3,r]),n&&!this._longMonthsParse[r]&&(this._longMonthsParse[r]=new RegExp("^"+this.months(i,"").replace(".","")+"$","i"),this._shortMonthsParse[r]=new RegExp("^"+this.monthsShort(i,"").replace(".","")+"$","i")),n||this._monthsParse[r]||(o="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[r]=new RegExp(o.replace(".",""),"i")),n&&"MMMM"===t&&this._longMonthsParse[r].test(e))return r;if(n&&"MMM"===t&&this._shortMonthsParse[r].test(e))return r;if(!n&&this._monthsParse[r].test(e))return r}},dn.monthsRegex=function(e){return this._monthsParseExact?(f(this,"_monthsRegex")||Le.call(this),e?this._monthsStrictRegex:this._monthsRegex):(f(this,"_monthsRegex")||(this._monthsRegex=Fe),this._monthsStrictRegex&&e?this._monthsStrictRegex:this._monthsRegex)},dn.monthsShortRegex=function(e){return this._monthsParseExact?(f(this,"_monthsRegex")||Le.call(this),e?this._monthsShortStrictRegex:this._monthsShortRegex):(f(this,"_monthsShortRegex")||(this._monthsShortRegex=Ve),this._monthsShortStrictRegex&&e?this._monthsShortStrictRegex:this._monthsShortRegex)},dn.week=function(e){return Ne(e,this._week.dow,this._week.doy).week},dn.firstDayOfYear=function(){return this._week.doy},dn.firstDayOfWeek=function(){return this._week.dow},dn.weekdays=function(e,t){return e?s(this._weekdays)?this._weekdays[e.day()]:this._weekdays[this._weekdays.isFormat.test(t)?"format":"standalone"][e.day()]:s(this._weekdays)?this._weekdays:this._weekdays.standalone},dn.weekdaysMin=function(e){return e?this._weekdaysMin[e.day()]:this._weekdaysMin},dn.weekdaysShort=function(e){return e?this._weekdaysShort[e.day()]:this._weekdaysShort},dn.weekdaysParse=function(e,t,n){var r,i,o;if(this._weekdaysParseExact)return function(e,t,n){var r,i,o,a=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],r=0;r<7;++r)o=m([2e3,1]).day(r),this._minWeekdaysParse[r]=this.weekdaysMin(o,"").toLocaleLowerCase(),this._shortWeekdaysParse[r]=this.weekdaysShort(o,"").toLocaleLowerCase(),this._weekdaysParse[r]=this.weekdays(o,"").toLocaleLowerCase();return n?"dddd"===t?-1!==(i=ke.call(this._weekdaysParse,a))?i:null:"ddd"===t?-1!==(i=ke.call(this._shortWeekdaysParse,a))?i:null:-1!==(i=ke.call(this._minWeekdaysParse,a))?i:null:"dddd"===t?-1!==(i=ke.call(this._weekdaysParse,a))?i:-1!==(i=ke.call(this._shortWeekdaysParse,a))?i:-1!==(i=ke.call(this._minWeekdaysParse,a))?i:null:"ddd"===t?-1!==(i=ke.call(this._shortWeekdaysParse,a))?i:-1!==(i=ke.call(this._weekdaysParse,a))?i:-1!==(i=ke.call(this._minWeekdaysParse,a))?i:null:-1!==(i=ke.call(this._minWeekdaysParse,a))?i:-1!==(i=ke.call(this._weekdaysParse,a))?i:-1!==(i=ke.call(this._shortWeekdaysParse,a))?i:null}.call(this,e,t,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),r=0;r<7;r++){if(i=m([2e3,1]).day(r),n&&!this._fullWeekdaysParse[r]&&(this._fullWeekdaysParse[r]=new RegExp("^"+this.weekdays(i,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[r]=new RegExp("^"+this.weekdaysShort(i,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[r]=new RegExp("^"+this.weekdaysMin(i,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[r]||(o="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[r]=new RegExp(o.replace(".",""),"i")),n&&"dddd"===t&&this._fullWeekdaysParse[r].test(e))return r;if(n&&"ddd"===t&&this._shortWeekdaysParse[r].test(e))return r;if(n&&"dd"===t&&this._minWeekdaysParse[r].test(e))return r;if(!n&&this._weekdaysParse[r].test(e))return r}},dn.weekdaysRegex=function(e){return this._weekdaysParseExact?(f(this,"_weekdaysRegex")||Qe.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(f(this,"_weekdaysRegex")||(this._weekdaysRegex=We),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)},dn.weekdaysShortRegex=function(e){return this._weekdaysParseExact?(f(this,"_weekdaysRegex")||Qe.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(f(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Ge),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},dn.weekdaysMinRegex=function(e){return this._weekdaysParseExact?(f(this,"_weekdaysRegex")||Qe.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(f(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Ke),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},dn.isPM=function(e){return"p"===(e+"").toLowerCase().charAt(0)},dn.meridiem=function(e,t,n){return 11<e?n?"pm":"PM":n?"am":"AM"},st("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10;return e+(1===S(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")}}),p.lang=n("moment.lang is deprecated. Use moment.locale instead.",st),p.langData=n("moment.langData is deprecated. Use moment.localeData instead.",ut);var gn=Math.abs;function mn(e,t,n,r){var i=qt(t,n);return e._milliseconds+=r*i._milliseconds,e._days+=r*i._days,e._months+=r*i._months,e._bubble()}function vn(e){return e<0?Math.floor(e):Math.ceil(e)}function yn(e){return 4800*e/146097}function wn(e){return 146097*e/4800}function bn(e){return function(){return this.as(e)}}var $n=bn("ms"),_n=bn("s"),Cn=bn("m"),Sn=bn("h"),kn=bn("d"),Dn=bn("w"),xn=bn("M"),On=bn("y");function Tn(e){return function(){return this.isValid()?this._data[e]:NaN}}var En=Tn("milliseconds"),An=Tn("seconds"),Pn=Tn("minutes"),Mn=Tn("hours"),Rn=Tn("days"),In=Tn("months"),Vn=Tn("years");var Fn=Math.round,Ln={ss:44,s:45,m:45,h:22,d:26,M:11};var jn=Math.abs;function Hn(e){return(0<e)-(e<0)||+e}function Yn(){if(!this.isValid())return this.localeData().invalidDate();var e,t,n=jn(this._milliseconds)/1e3,r=jn(this._days),i=jn(this._months);t=C((e=C(n/60))/60),n%=60,e%=60;var o=C(i/12),a=i%=12,s=r,l=t,u=e,c=n?n.toFixed(3).replace(/\.?0+$/,""):"",d=this.asSeconds();if(!d)return"P0D";var p=d<0?"-":"",h=Hn(this._months)!==Hn(d)?"-":"",f=Hn(this._days)!==Hn(d)?"-":"",g=Hn(this._milliseconds)!==Hn(d)?"-":"";return p+"P"+(o?h+o+"Y":"")+(a?h+a+"M":"")+(s?f+s+"D":"")+(l||u||c?"T":"")+(l?g+l+"H":"")+(u?g+u+"M":"")+(c?g+c+"S":"")}var Nn=Pt.prototype;return Nn.isValid=function(){return this._isValid},Nn.abs=function(){var e=this._data;return this._milliseconds=gn(this._milliseconds),this._days=gn(this._days),this._months=gn(this._months),e.milliseconds=gn(e.milliseconds),e.seconds=gn(e.seconds),e.minutes=gn(e.minutes),e.hours=gn(e.hours),e.months=gn(e.months),e.years=gn(e.years),this},Nn.add=function(e,t){return mn(this,e,t,1)},Nn.subtract=function(e,t){return mn(this,e,t,-1)},Nn.as=function(e){if(!this.isValid())return NaN;var t,n,r=this._milliseconds;if("month"===(e=M(e))||"year"===e)return t=this._days+r/864e5,n=this._months+yn(t),"month"===e?n:n/12;switch(t=this._days+Math.round(wn(this._months)),e){case"week":return t/7+r/6048e5;case"day":return t+r/864e5;case"hour":return 24*t+r/36e5;case"minute":return 1440*t+r/6e4;case"second":return 86400*t+r/1e3;case"millisecond":return Math.floor(864e5*t)+r;default:throw new Error("Unknown unit "+e)}},Nn.asMilliseconds=$n,Nn.asSeconds=_n,Nn.asMinutes=Cn,Nn.asHours=Sn,Nn.asDays=kn,Nn.asWeeks=Dn,Nn.asMonths=xn,Nn.asYears=On,Nn.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*S(this._months/12):NaN},Nn._bubble=function(){var e,t,n,r,i,o=this._milliseconds,a=this._days,s=this._months,l=this._data;return 0<=o&&0<=a&&0<=s||o<=0&&a<=0&&s<=0||(o+=864e5*vn(wn(s)+a),s=a=0),l.milliseconds=o%1e3,e=C(o/1e3),l.seconds=e%60,t=C(e/60),l.minutes=t%60,n=C(t/60),l.hours=n%24,s+=i=C(yn(a+=C(n/24))),a-=vn(wn(i)),r=C(s/12),s%=12,l.days=a,l.months=s,l.years=r,this},Nn.clone=function(){return qt(this)},Nn.get=function(e){return e=M(e),this.isValid()?this[e+"s"]():NaN},Nn.milliseconds=En,Nn.seconds=An,Nn.minutes=Pn,Nn.hours=Mn,Nn.days=Rn,Nn.weeks=function(){return C(this.days()/7)},Nn.months=In,Nn.years=Vn,Nn.humanize=function(e){if(!this.isValid())return this.localeData().invalidDate();var t,n,r,i,o,a,s,l,u,c,d,p=this.localeData(),h=(n=!e,r=p,i=qt(t=this).abs(),o=Fn(i.as("s")),a=Fn(i.as("m")),s=Fn(i.as("h")),l=Fn(i.as("d")),u=Fn(i.as("M")),c=Fn(i.as("y")),(d=o<=Ln.ss&&["s",o]||o<Ln.s&&["ss",o]||a<=1&&["m"]||a<Ln.m&&["mm",a]||s<=1&&["h"]||s<Ln.h&&["hh",s]||l<=1&&["d"]||l<Ln.d&&["dd",l]||u<=1&&["M"]||u<Ln.M&&["MM",u]||c<=1&&["y"]||["yy",c])[2]=n,d[3]=0<+t,d[4]=r,function(e,t,n,r,i){return i.relativeTime(t||1,!!n,e,r)}.apply(null,d));return e&&(h=p.pastFuture(+this,h)),p.postformat(h)},Nn.toISOString=Yn,Nn.toString=Yn,Nn.toJSON=Yn,Nn.locale=Zt,Nn.localeData=Jt,Nn.toIsoString=n("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Yn),Nn.lang=Xt,N("X",0,0,"unix"),N("x",0,0,"valueOf"),le("x",re),le("X",/[+-]?\d+(\.\d{1,3})?/),pe("X",function(e,t,n){n._d=new Date(1e3*parseFloat(e,10))}),pe("x",function(e,t,n){n._d=new Date(S(e))}),p.version="2.22.2",e=xt,p.fn=un,p.min=function(){return Et("isBefore",[].slice.call(arguments,0))},p.max=function(){return Et("isAfter",[].slice.call(arguments,0))},p.now=function(){return Date.now?Date.now():+new Date},p.utc=m,p.unix=function(e){return xt(1e3*e)},p.months=function(e,t){return hn(e,t,"months")},p.isDate=d,p.locale=st,p.invalid=w,p.duration=qt,p.isMoment=_,p.weekdays=function(e,t,n){return fn(e,t,n,"weekdays")},p.parseZone=function(){return xt.apply(null,arguments).parseZone()},p.localeData=ut,p.isDuration=Mt,p.monthsShort=function(e,t){return hn(e,t,"monthsShort")},p.weekdaysMin=function(e,t,n){return fn(e,t,n,"weekdaysMin")},p.defineLocale=lt,p.updateLocale=function(e,t){if(null!=t){var n,r,i=nt;null!=(r=at(e))&&(i=r._config),(n=new E(t=T(i,t))).parentLocale=rt[e],rt[e]=n,st(e)}else null!=rt[e]&&(null!=rt[e].parentLocale?rt[e]=rt[e].parentLocale:null!=rt[e]&&delete rt[e]);return rt[e]},p.locales=function(){return r(rt)},p.weekdaysShort=function(e,t,n){return fn(e,t,n,"weekdaysShort")},p.normalizeUnits=M,p.relativeTimeRounding=function(e){return void 0===e?Fn:"function"==typeof e&&(Fn=e,!0)},p.relativeTimeThreshold=function(e,t){return void 0!==Ln[e]&&(void 0===t?Ln[e]:(Ln[e]=t,"s"===e&&(Ln.ss=t-1),!0))},p.calendarFormat=function(e,t){var n=e.diff(t,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"},p.prototype=un,p.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"YYYY-[W]WW",MONTH:"YYYY-MM"},p}),function(e,t){"use strict";"undefined"!=typeof module&&module.exports?(t("undefined"==typeof angular?require("angular"):angular,"undefined"==typeof moment?require("moment"):moment),module.exports="ui.bootstrap.datetimepicker"):"function"==typeof define&&define.amd?define(["angular","moment"],t):t(e.angular,e.moment)}(this,function(d,p){"use strict";function e(){return function(e,t,n){var r,i;switch(e){case"Date":r=o(function(e){return a(e).toDate()});break;case"moment":r=o(a);break;case"milliseconds":r=o(function(e){return p.utc(e,t,p.locale(),n).valueOf()});break;default:r=o((i=e,function(e){return a(e).format(i)}))}return r;function o(t){return function(e){return d.isUndefined(e)||""===e||null===e?null:t(e)}}function a(e){return p(e,t,p.locale(),n)}}}function t(c){return{require:"ngModel",restrict:"A",scope:{dateFormats:"="},link:function(e,t,n,r){if(d.isDefined(e.dateFormats)&&!d.isString(e.dateFormats)&&!d.isArray(e.dateFormats))throw new Error("date-formats must be a single string or an array of strings i.e. date-formats=\"['YYYY-MM-DD']\" ");if(d.isDefined(n.modelType)&&(!d.isString(n.modelType)||0===n.modelType.length))throw new Error('model-type must be "Date", "moment", "milliseconds", or a moment format string');var i=n.dateTimeInput||p.defaultFormat,o=void 0===n.dateParseStrict||"true"===n.dateParseStrict,a=n.modelType||"Date",s=[n.dateTimeInput,a].concat(e.dateFormats).concat([p.ISO_8601]).filter(u),l=[a].concat(s).filter(u);function u(e,t,n){return-1===["Date","moment","milliseconds",void 0].indexOf(e)&&n.indexOf(e)===t}r.$parsers.unshift(c(a,s,o)),r.$formatters.push(function(e){if(d.isUndefined(e)||""===e||null===e)return null;{if(d.isDate(e))return p(e).format(i);if(d.isNumber(e))return p.utc(e).format(i)}return p(e,l,p.locale(),o).format(i)}),r.$validators.dateTimeInput=function(e,t){if(d.isUndefined(t)||""===t||null===t)return!0;return p(t,s,p.locale(),o).isValid()},t.bind("blur",function(){function e(){return!0}function t(e,t){return t(e)}r.$viewValue=r.$formatters.filter(e).reverse().reduce(t,r.$modelValue),r.$render()})}}}d.module("ui.dateTimeInput",[]).service("dateTimeParserFactory",e).directive("dateTimeInput",t),e.$inject=[],t.$inject=["dateTimeParserFactory"]}),function(e,t){"use strict";"undefined"!=typeof module&&module.exports?(t("undefined"==typeof angular?require("angular"):angular,"undefined"==typeof moment?require("moment"):moment),module.exports="ui.bootstrap.datetimepicker"):"function"==typeof define&&define.amd?define(["angular","moment"],t):t(e.angular,e.moment)}(this,function(a,b){"use strict";function e(i,o){var e={bindToController:!1,controller:t,controllerAs:"dateTimePickerController",replace:!0,require:"ngModel",restrict:"E",scope:{beforeRender:"&",onSetTime:"&"},templateUrl:"templates/datetimepicker.html"};function t(u,e,n){var m=e.controller("ngModel"),v=t();u.screenReader=v.screenReader,u.changeView=function(e,t,n){n&&(n.stopPropagation(),n.preventDefault());if(e&&t.utcDateValue>-1/0&&t.selectable&&c[e]){var r=c[e](t.utcDateValue),i=[];if(r.weeks)for(var o=0;o<r.weeks.length;o+=1)for(var a=r.weeks[o],s=0;s<a.dates.length;s+=1){var l=a.dates[s];i.push(l)}u.beforeRender({$view:r.currentView,$dates:r.dates||i,$leftDate:r.leftDate,$upDate:r.previousViewDate,$rightDate:r.rightDate}),u.data=r}},m.$render=function(){u.changeView(v.startView,new w({utcDateValue:function(e){var t=new Date;if(e){var n=r(e);if(!n.isValid())throw new Error("Invalid date: "+e);t=n.toDate()}return t.getTime()-6e4*t.getTimezoneOffset()}(m.$viewValue)}))},v.configureOn&&u.$on(v.configureOn,function(){v=t(),u.screenReader=v.screenReader,m.$render()}),v.renderOn&&u.$on(v.renderOn,m.$render);var c={year:function(e){for(var t=b.utc(e).startOf("year"),n=10*parseInt(t.year()/10,10),r=b.utc(d(e)).subtract(1,"year").startOf("year"),i="YYYY",o=y(m.$modelValue,i),a=b().format(i),s={currentView:"year",nextView:"year"===v.minView?"setTime":"month",previousViewDate:new w({utcDateValue:null,display:n+"-"+(n+9)}),leftDate:new w({utcDateValue:b.utc(r).subtract(9,"year").valueOf()}),rightDate:new w({utcDateValue:b.utc(r).add(11,"year").valueOf()}),dates:[]},l=0;l<12;l+=1){var u=b.utc(r).add(l,"years"),c={active:u.format(i)===o,current:u.format(i)===a,display:u.format(i),future:u.year()>n+9,past:u.year()<n,utcDateValue:u.valueOf()};s.dates.push(new w(c))}return s},month:function(e){for(var t=b.utc(e).startOf("year"),n=d(e),r="YYYY-MMM",i=y(m.$modelValue,r),o=b().format(r),a={previousView:"year",currentView:"month",nextView:"month"===v.minView?"setTime":"day",previousViewDate:new w({utcDateValue:n.valueOf(),display:t.format("YYYY")}),leftDate:new w({utcDateValue:b.utc(t).subtract(1,"year").valueOf()}),rightDate:new w({utcDateValue:b.utc(t).add(1,"year").valueOf()}),dates:[]},s=0;s<12;s+=1){var l=b.utc(t).add(s,"months"),u={active:l.format(r)===i,current:l.format(r)===o,display:l.format("MMM"),utcDateValue:l.valueOf()};a.dates.push(new w(u))}return a},day:function(e){for(var t=b.utc(e),n=b.utc(t).startOf("month"),r=b.utc(t).startOf("year"),i=b.utc(t).endOf("month"),o=b.utc(n).subtract(Math.abs(n.weekday()),"days"),a="YYYY-MMM-DD",s=y(m.$modelValue,a),l=b().format(a),u={previousView:"month",currentView:"day",nextView:"day"===v.minView?"setTime":"hour",previousViewDate:new w({utcDateValue:r.valueOf(),display:n.format("YYYY-MMM")}),leftDate:new w({utcDateValue:b.utc(n).subtract(1,"months").valueOf()}),rightDate:new w({utcDateValue:b.utc(n).add(1,"months").valueOf()}),dayNames:[],weeks:[]},c=0;c<7;c+=1)u.dayNames.push(b.utc().weekday(c).format("dd"));for(var d=0;d<6;d+=1){for(var p={dates:[]},h=0;h<7;h+=1){var f=b.utc(o).add(7*d+h,"days"),g={active:f.format(a)===s,current:f.format(a)===l,display:f.format("D"),future:f.isAfter(i),past:f.isBefore(n),utcDateValue:f.valueOf()};p.dates.push(new w(g))}u.weeks.push(p)}return u},hour:function(e){for(var t=b.utc(e).startOf("day"),n=b.utc(t).startOf("month"),r="YYYY-MM-DD H",i=y(m.$modelValue,r),o=b().format(r),a={previousView:"day",currentView:"hour",nextView:"hour"===v.minView?"setTime":"minute",previousViewDate:new w({utcDateValue:n.valueOf(),display:t.format("ll")}),leftDate:new w({utcDateValue:b.utc(t).subtract(1,"days").valueOf()}),rightDate:new w({utcDateValue:b.utc(t).add(1,"days").valueOf()}),dates:[]},s=0;s<24;s+=1){var l=b.utc(t).add(s,"hours"),u={active:l.format(r)===i,current:l.format(r)===o,display:l.format("LT"),utcDateValue:l.valueOf()};a.dates.push(new w(u))}return a},minute:function(e){for(var t=b.utc(e).startOf("hour"),n=b.utc(t).startOf("day"),r="YYYY-MM-DD H:mm",i=y(m.$modelValue,r),o=b().format(r),a={previousView:"hour",currentView:"minute",nextView:"setTime",previousViewDate:new w({utcDateValue:n.valueOf(),display:t.format("lll")}),leftDate:new w({utcDateValue:b.utc(t).subtract(1,"hours").valueOf()}),rightDate:new w({utcDateValue:b.utc(t).add(1,"hours").valueOf()}),dates:[]},s=60/v.minuteStep,l=0;l<s;l+=1){var u=b.utc(t).add(l*v.minuteStep,"minute"),c={active:u.format(r)===i,current:u.format(r)===o,display:u.format("LT"),utcDateValue:u.valueOf()};a.dates.push(new w(c))}return a},setTime:function(e){var t=new Date(e),n=new Date(t.getUTCFullYear(),t.getUTCMonth(),t.getUTCDate(),t.getUTCHours(),t.getUTCMinutes(),t.getUTCSeconds(),t.getUTCMilliseconds());switch(v.modelType){case"Date":break;case"moment":n=b([t.getUTCFullYear(),t.getUTCMonth(),t.getUTCDate(),t.getUTCHours(),t.getUTCMinutes(),t.getUTCSeconds(),t.getUTCMilliseconds()]);break;case"milliseconds":n=e;break;default:n=b([t.getUTCFullYear(),t.getUTCMonth(),t.getUTCDate(),t.getUTCHours(),t.getUTCMinutes(),t.getUTCSeconds(),t.getUTCMilliseconds()]).format(v.modelType)}var r=m.$modelValue;m.$setViewValue(n),v.dropdownSelector&&jQuery(v.dropdownSelector).dropdown("toggle");return u.onSetTime({newDate:n,oldDate:r}),c[v.startView](e)}};function d(e){var t=10*parseInt(b.utc(e).year()/10,10);return b.utc(e).year(t).startOf("year")}function y(e,t){return e?r(e).format(t):""}function r(e){return b(e,a.isString(e)?v.parseFormat:void 0)}function t(){var e={};n.datetimepickerConfig&&(e=u.$parent.$eval(n.datetimepickerConfig));var t=a.extend({},i,e);return o.validate(t),t}}function w(){var e=new Date(arguments[0].utcDateValue),t=6e4*e.getTimezoneOffset();this.utcDateValue=e.getTime(),this.selectable=!0,this.localDateValue=function(){return this.utcDateValue+t};var n=["active","current","display","future","past","selectable","utcDateValue"],r=arguments[0];Object.keys(r).filter(function(e){return 0<=n.indexOf(e)}).forEach(function(e){this[e]=r[e]},this)}return t.$inject=["$scope","$element","$attrs"],e}function t(i){return{validate:function(e){var t=["configureOn","dropdownSelector","minuteStep","minView","modelType","parseFormat","renderOn","startView","screenReader"],n=Object.keys(e).filter(function(e){return t.indexOf(e)<0});if(n.length)throw new Error("Invalid options: "+n.join(", "));var r=["minute","hour","day","month","year"];if(r.indexOf(e.startView)<0)throw new Error("invalid startView value: "+e.startView);if(r.indexOf(e.minView)<0)throw new Error("invalid minView value: "+e.minView);if(r.indexOf(e.minView)>r.indexOf(e.startView))throw new Error("startView must be greater than minView");if(!a.isNumber(e.minuteStep))throw new Error("minuteStep must be numeric");if(e.minuteStep<=0||60<=e.minuteStep)throw new Error("minuteStep must be greater than zero and less than 60");if(null!==e.configureOn&&!a.isString(e.configureOn))throw new Error("configureOn must be a string");if(null!==e.configureOn&&e.configureOn.length<1)throw new Error("configureOn must not be an empty string");if(null!==e.renderOn&&!a.isString(e.renderOn))throw new Error("renderOn must be a string");if(null!==e.renderOn&&e.renderOn.length<1)throw new Error("renderOn must not be an empty string");if(null!==e.modelType&&!a.isString(e.modelType))throw new Error("modelType must be a string");if(null!==e.modelType&&e.modelType.length<1)throw new Error("modelType must not be an empty string");"Date"!==e.modelType&&"moment"!==e.modelType&&"milliseconds"!==e.modelType&&(e.parseFormat=e.modelType);if(null!==e.dropdownSelector&&!a.isString(e.dropdownSelector))throw new Error("dropdownSelector must be a string");null===e.dropdownSelector||"undefined"!=typeof jQuery&&"function"==typeof jQuery().dropdown||(i.error("Please DO NOT specify the dropdownSelector option unless you are using jQuery AND Bootstrap.js. Please include jQuery AND Bootstrap.js, or write code to close the dropdown in the on-set-time callback. \n\nThe dropdownSelector configuration option is being removed because it will not function properly."),delete e.dropdownSelector)}}}a.module("ui.bootstrap.datetimepicker",[]).service("dateTimePickerConfig",function(){var e={bg:{previous:"锌褉械写懈褕薪邪",next:"褋谢械写胁邪褖邪"},ca:{previous:"anterior",next:"seg眉ent"},da:{previous:"forrige",next:"n忙ste"},de:{previous:"vorige",next:"weiter"},"en-au":{previous:"previous",next:"next"},"en-gb":{previous:"previous",next:"next"},en:{previous:"previous",next:"next"},"es-us":{previous:"atr谩s",next:"siguiente"},es:{previous:"atr谩s",next:"siguiente"},fi:{previous:"edellinen",next:"seuraava"},fr:{previous:"pr茅c茅dent",next:"suivant"},hu:{previous:"el艖z艖",next:"k枚vetkez艖"},it:{previous:"precedente",next:"successivo"},ja:{previous:"鍓嶃伕",next:"娆°伕"},ml:{previous:"啻祦嗟秽椽嗟佮闯嗟嵿闯啻む祶",next:"啻呧礋嗟佮搐嗟嵿搐啻む祶"},nl:{previous:"vorige",next:"volgende"},pl:{previous:"poprzednia",next:"nast臋pna"},"pt-br":{previous:"anteriores",next:"pr贸ximos"},pt:{previous:"anterior",next:"pr贸ximo"},ro:{previous:"anterior",next:"urm膬tor"},ru:{previous:"锌褉械写褘写褍褖邪褟",next:"褋谢械写褍褞褖邪褟"},sk:{previous:"predo拧l谩",next:"膹al拧ia"},sv:{previous:"f枚reg氓ende",next:"n盲sta"},tr:{previous:"枚nceki",next:"sonraki"},uk:{previous:"薪邪蟹邪写",next:"写邪谢褨"},"zh-cn":{previous:"涓婁竴椤�",next:"涓嬩竴椤�"},"zh-tw":{previous:"涓婁竴闋�",next:"涓嬩竴闋�"}}[b.locale().toLowerCase()];return a.extend({},{configureOn:null,dropdownSelector:null,minuteStep:5,minView:"minute",modelType:"Date",parseFormat:"YYYY-MM-DDTHH:mm:ss.SSSZZ",renderOn:null,startView:"day"},{screenReader:e})}).service("dateTimePickerValidator",t).directive("datetimepicker",e),e.$inject=["dateTimePickerConfig","dateTimePickerValidator"],t.$inject=["$log"]}),angular.module("rzTable",[]),angular.module("rzTable").directive("rzTable",["resizeStorage","$injector","$parse",function(g,i,u){function e(e){}function c(n,r,i){return function(e,t){!0!==i.busy&&void 0!==t&&t!==e&&(d(n),p(n,r,i))}}function d(e){k=!0,l.map(function(e){e.remove()}),l=[]}function p(e,t,n){if(!n.busy){b=$(e).find("th"),v=n.mode,y=!angular.isDefined(n.saveTableSizes)||n.saveTableSizes,w=n.profile;var r=function(t,e){try{var n=e.rzMode?t.mode:"BasicResizer",r=i.get(n);return r}catch(e){return console.error("The resizer "+t.mode+" was not found"),null}}(n,t);r&&(S=new r(e,b,h),y&&(D=g.loadTableSizes(e,n.mode,n.profile)),s=S.handles(b),a=S.ctrlColumns,S.setup(),(o=D)&&($(C).width("auto"),a.each(function(e,t){var n=angular.element(t).scope(),r=n.rzCol||$(t).attr("id"),i=o[r];$(t).css({width:i})}),S.onTableReady()),s.each(function(e,t){!function(e,t,n){var r=$("<div>",{class:e.options.handleClass||"rz-handle"});$(n).prepend(r),l.push(r);var i=S.handleMiddleware(r,n);p=e,h=r,f=i,$(h).mousedown(function(e){k&&(S.onFirstDrag(f,h),S.onTableReady(),k=!1),p.options.onResizeStarted&&p.options.onResizeStarted(f);var t={};S.intervene&&(((t=S.intervene.selector(f)).column=t).orgWidth=$(t).width()),e.preventDefault(),$(h).addClass(p.options.handleClassActive||"rz-handle-active");var n,r,i,o,a,s,l,u,c=e.clientX,d=$(f).width();o=p,a=f,s=c,l=d,u=t,_=function(e){var t=e.clientX,n=t-s,r=S.calculate(l,n);if(!(r<m(a)||S.restrict(r,n))){if(S.intervene){var i=S.intervene.calculator(u.orgWidth,n);if(i<m(u.column))return;if(S.intervene.restrict(i,n))return;$(u.column).width(i)}o.options.onResizeInProgress&&o.options.onResizeInProgress(a,r,n),$(a).width(r)}},$(window).mousemove(_),$(window).one("mouseup",(n=p,r=f,i=h,function(){$(i).removeClass(n.options.handleClassActive||"rz-handle-active"),_&&$(window).unbind("mousemove",_),n.options.onResizeEnded&&n.options.onResizeEnded(r),S.onEndDrag(),y&&(D||(D={}),$(b).each(function(e,t){var n=angular.element(t).scope(),r=n.rzCol||$(t).attr("id");r&&(D[r]=S.saveAttr(t))}),g.saveTableSizes(C,v,w,D))}))});var p,h,f}(n,0,t)}))}var o}function m(e){return parseInt($(e).css("min-width"))||0}var v,y,w,b=null,a=null,s=null,_=null,l=[],C=null,h=null,S=null,k=!0,D=null;return e.$inject=["$scope","$attrs","$element"],{restrict:"A",link:function(e,t,n){var r,i,o,a,s,l;C=t,h=e.container?$(e.container):$(C).parent(),e.options=n.rzOptions&&e.options||{},$(C).addClass(e.options.tableClass||"rz-table"),p(C,n,e),function(t,e,n){if(e.rzModel){var r=u(e.rzModel);r.assign(n.$parent,{update:function(){d(),p(t,e,n)},reset:function(){var e;e=t,$(e).outerWidth("100%"),$(e).find("th").width("auto"),this.clearStorageActive(),this.update()},clearStorage:function(){g.clearAll()},clearStorageActive:function(){g.clearCurrent(t,v,w)}})}}(C,n,e),a=C,s=n,(l=e).$watch(function(){return $(a).find("th").length},c(a,s,l)),r=C,i=n,(o=e).$watch("profile",c(r,i,o)),o.$watch("mode",c(r,i,o)),o.$watch("busy",c(r,i,o))},controller:e,scope:{mode:"=rzMode",profile:"=?rzProfile",busy:"=?rzBusy",saveTableSizes:"=?rzSave",options:"=?rzOptions",model:"=rzModel",container:"@rzContainer"}}}]),angular.module("rzTable").directive("rzCol",[function(){return{restrict:"A",priority:650,link:function(e,t,n){e.rzCol=e.$eval(n.rzCol)},require:"^^rzTable",scope:!0}}]),angular.module("rzTable").service("resizeStorage",["$window",function(a){function s(e,t,n){return e.attr("id")?r+"."+e.attr("id")+"."+t+(n?"."+n:""):void console.error("Table has no id",e)}var r="ngColumnResize";this.loadTableSizes=function(e,t,n){var r=s(e,t,n),i=a.localStorage.getItem(r);return JSON.parse(i)},this.saveTableSizes=function(e,t,n,r){var i=s(e,t,n);if(i){var o=JSON.stringify(r);a.localStorage.setItem(i,o)}},this.clearAll=function(){for(var e=[],t=0;t<a.localStorage.length;++t){var n=localStorage.key(t);n&&n.startsWith(r)&&e.push(n)}e.map(function(e){a.localStorage.removeItem(e)})},this.clearCurrent=function(e,t,n){var r=s(e,t,n);r&&a.localStorage.removeItem(r)}}]),angular.module("rzTable").factory("ResizerModel",[function(){function e(e,t,n){this.table=e,this.columns=t,this.container=n,this.handleColumns=this.handles(),this.ctrlColumns=this.ctrlColumns()}return e.prototype.setup=function(){$(this.container).css({overflowX:"hidden"})},e.prototype.onTableReady=function(){$(this.table).outerWidth("100%")},e.prototype.getMinWidth=function(e){return parseInt($(e).css("min-width"))||0},e.prototype.handles=function(){return this.columns},e.prototype.ctrlColumns=function(){return this.handleColumns},e.prototype.onFirstDrag=function(){$(this.ctrlColumns).each(function(e,t){$(t).width($(t).width())})},e.prototype.handleMiddleware=function(e,t){return t},e.prototype.restrict=function(e){return!1},e.prototype.calculate=function(e,t){return e+t},e.prototype.onEndDrag=function(){},e.prototype.saveAttr=function(e){return $(e).outerWidth()},e}]),angular.module("rzTable").factory("BasicResizer",["ResizerModel",function(r){function e(e,t,n){r.call(this,e,t,n),this.ctrlColumns=this.columns,this.intervene={selector:i,calculator:o,restrict:a}}function i(e){return $(e).next()}function o(e,t){return e-t}function a(e){return e<25}return(e.prototype=Object.create(r.prototype)).setup=function(){$(this.container).css({overflowX:"hidden"}),$(this.table).css({width:"100%"})},e.prototype.handles=function(){return $(this.columns).not(":last")},e.prototype.onFirstDrag=function(){this.onEndDrag()},e.prototype.onEndDrag=function(){var r=$(this.table).outerWidth(),i=[];$(this.columns).each(function(e,t){var n=$(t).outerWidth()/r*100+"%";i.push(function(){$(t).css({width:n})})}),i.map(function(e){e()})},e.prototype.saveAttr=function(e){return $(e)[0].style.width},e}]),angular.module("rzTable").factory("FixedResizer",["ResizerModel",function(r){function e(e,t,n){r.call(this,e,t,n),this.fixedColumn=$(e).find("th").first(),this.bound=!1}return(e.prototype=Object.create(r.prototype)).setup=function(){$(this.container).css({overflowX:"hidden"}),$(this.table).css({width:"100%"}),$(this.columns).first().css({width:"auto"})},e.prototype.handles=function(){return $(this.columns).not(":last")},e.prototype.ctrlColumns=function(){return $(this.columns).not(":first")},e.prototype.onFirstDrag=function(){$(this.ctrlColumns).each(function(e,t){$(t).width($(t).width())})},e.prototype.handleMiddleware=function(e,t){return $(t).next()},e.prototype.restrict=function(e,t){return this.bound&&this.bound<t?this.bound=!1:!!(this.bound&&this.bound>t)||(this.fixedColumn.width()<=this.getMinWidth(this.fixedColumn)?(this.bound=t,$(this.fixedColumn).width(this.minWidth),!0):void 0)},e.prototype.onEndDrag=function(){this.bound=!1},e.prototype.calculate=function(e,t){return e-t},e}]),angular.module("rzTable").factory("OverflowResizer",["ResizerModel",function(r){function e(e,t,n){r.call(this,e,t,n)}return(e.prototype=Object.create(r.prototype)).setup=function(){$(this.container).css({overflow:"auto"})},e.prototype.onTableReady=function(){$(this.table).width(1)},e}]),function(e,t){"function"==typeof define&&define.amd?define(["angular"],t):"object"==typeof module&&module.exports?module.exports=t(require("angular")):e.angularClipboard=t(e.angular)}(this,function(i){return i.module("angular-clipboard",[]).factory("clipboard",["$document","$window",function(s,l){return{copyText:function(e,t){var n,r,i=l.pageXOffset||s[0].documentElement.scrollLeft,o=l.pageYOffset||s[0].documentElement.scrollTop,a=(n=e,(r=s[0].createElement("textarea")).style.position="absolute",r.style.fontSize="12pt",r.style.border="0",r.style.padding="0",r.style.margin="0",r.style.left="-10000px",r.style.top=(l.pageYOffset||s[0].documentElement.scrollTop)+"px",r.textContent=n,r);s[0].body.appendChild(a),function(e){try{s[0].body.style.webkitUserSelect="initial";var t=s[0].getSelection();t.removeAllRanges();var n=document.createRange();n.selectNodeContents(e),t.addRange(n),e.select(),e.setSelectionRange(0,999999);try{if(!s[0].execCommand("copy"))throw"failure copy"}finally{t.removeAllRanges()}}finally{s[0].body.style.webkitUserSelect=""}}(a),l.scrollTo(i,o),s[0].body.removeChild(a)},supported:"queryCommandSupported"in s[0]&&s[0].queryCommandSupported("copy")}}]).directive("clipboard",["clipboard",function(r){return{restrict:"A",scope:{onCopied:"&",onError:"&",text:"=",supported:"=?"},link:function(t,n){t.supported=r.supported,n.on("click",function(e){try{r.copyText(t.text,n[0]),i.isFunction(t.onCopied)&&t.$evalAsync(t.onCopied())}catch(e){i.isFunction(t.onError)&&t.$evalAsync(t.onError({err:e}))}})}}}])}),function(e,t){"function"==typeof define&&define.amd?define("sifter",t):"object"==typeof exports?module.exports=t():e.Sifter=t()}(this,function(){var e=function(e,t){this.items=e,this.settings=t||{diacritics:!0}};e.prototype.tokenize=function(e){if(!(e=s(String(e||"").toLowerCase()))||!e.length)return[];var t,n,r,i,o=[],a=e.split(/ +/);for(t=0,n=a.length;t<n;t++){if(r=l(a[t]),this.settings.diacritics)for(i in u)u.hasOwnProperty(i)&&(r=r.replace(new RegExp(i,"g"),u[i]));o.push({string:a[t],regex:new RegExp(r,"i")})}return o},e.prototype.iterator=function(e,t){(a(e)?Array.prototype.forEach||function(e){for(var t=0,n=this.length;t<n;t++)e(this[t],t,this)}:function(e){for(var t in this)this.hasOwnProperty(t)&&e(this[t],t,this)}).apply(e,[t])},e.prototype.getScoreFunction=function(e,t){var i,o,a,s;e=this.prepareSearch(e,t),o=e.tokens,i=e.options.fields,a=o.length,s=e.options.nesting;var l,u=function(e,t){var n,r;return e?-1===(r=(e=String(e||"")).search(t.regex))?0:(n=t.string.length/e.length,0===r&&(n+=.5),n):0},c=(l=i.length)?1===l?function(e,t){return u(f(t,i[0],s),e)}:function(e,t){for(var n=0,r=0;n<l;n++)r+=u(f(t,i[n],s),e);return r/l}:function(){return 0};return a?1===a?function(e){return c(o[0],e)}:"and"===e.options.conjunction?function(e){for(var t,n=0,r=0;n<a;n++){if((t=c(o[n],e))<=0)return 0;r+=t}return r/a}:function(e){for(var t=0,n=0;t<a;t++)n+=c(o[t],e);return n/a}:function(){return 0}},e.prototype.getSortFunction=function(e,n){var t,r,i,o,a,s,l,u,c,d,p;if(p=!(e=(i=this).prepareSearch(e,n)).query&&n.sort_empty||n.sort,c=function(e,t){return"$score"===e?t.score:f(i.items[t.id],e,n.nesting)},a=[],p)for(t=0,r=p.length;t<r;t++)(e.query||"$score"!==p[t].field)&&a.push(p[t]);if(e.query){for(d=!0,t=0,r=a.length;t<r;t++)if("$score"===a[t].field){d=!1;break}d&&a.unshift({field:"$score",direction:"desc"})}else for(t=0,r=a.length;t<r;t++)if("$score"===a[t].field){a.splice(t,1);break}for(u=[],t=0,r=a.length;t<r;t++)u.push("desc"===a[t].direction?-1:1);return(s=a.length)?1===s?(o=a[0].field,l=u[0],function(e,t){return l*h(c(o,e),c(o,t))}):function(e,t){var n,r,i;for(n=0;n<s;n++)if(i=a[n].field,r=u[n]*h(c(i,e),c(i,t)))return r;return 0}:null},e.prototype.prepareSearch=function(e,t){if("object"==typeof e)return e;var n=(t=o({},t)).fields,r=t.sort,i=t.sort_empty;return n&&!a(n)&&(t.fields=[n]),r&&!a(r)&&(t.sort=[r]),i&&!a(i)&&(t.sort_empty=[i]),{options:t,query:String(e||"").toLowerCase(),tokens:this.tokenize(e),total:0,items:[]}},e.prototype.search=function(e,n){var r,i,t,o;return i=this.prepareSearch(e,n),n=i.options,e=i.query,o=n.score||this.getScoreFunction(i),e.length?this.iterator(this.items,function(e,t){r=o(e),(!1===n.filter||0<r)&&i.items.push({score:r,id:t})}):this.iterator(this.items,function(e,t){i.items.push({score:1,id:t})}),(t=this.getSortFunction(i,n))&&i.items.sort(t),i.total=i.items.length,"number"==typeof n.limit&&(i.items=i.items.slice(0,n.limit)),i};var h=function(e,t){return"number"==typeof e&&"number"==typeof t?t<e?1:e<t?-1:0:(e=n(String(e||"")),(t=n(String(t||"")))<e?1:e<t?-1:0)},o=function(e,t){var n,r,i,o;for(n=1,r=arguments.length;n<r;n++)if(o=arguments[n])for(i in o)o.hasOwnProperty(i)&&(e[i]=o[i]);return e},f=function(e,t,n){if(e&&t){if(!n)return e[t];for(var r=t.split(".");r.length&&(e=e[r.shift()]););return e}},s=function(e){return(e+"").replace(/^\s+|\s+$|/g,"")},l=function(e){return(e+"").replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")},a=Array.isArray||"undefined"!=typeof $&&$.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)},u={a:"[a岣�岣伳偰兠偯⑶嵡幦衡饱圈颧岷犪骸脛盲脌脿脕谩膧膩脙茫脜氓膮膭脙膮膭]",b:"[b鈵⑽参払喔筐悓佱洅]",c:"[c膯膰膱膲膶膷膴膵C虅c虅脟莽岣堘笁然燃茋茍蓵岽勶迹锝僝",d:"[d膸膹岣娽笅岣愥笐岣屷笉岣掅笓岣庒笍膼膽D苔d苔茐蓶茒蓷茓茖岬秮岫懭♂磪锛わ絼冒]",e:"[e脡茅脠猫脢锚岣樶笝臍臎臄臅岷坚航岣氠笡岷横夯臇臈脣毛膾膿权醛臉臋岫捝喩嚾勅呩壕岷酷粈峄佱粍峄呩粋峄冡笢岣濁笘岣椺笖岣暼喨囜焊岷贯粏峄団备岽囷讥锝吷樓澠徠愇礭",f:"[f茟茠岣炨笩]",g:"[g散鈧睬でツ溎澞災熌⒛F撋犇犇",h:"[h膜磨摩魔岣ㄡ俯岷栣簴岣め弗岣⑨福搔拾嵌茣]",i:"[i脥铆脤矛默沫脦卯菑菒脧茂岣腐抹末漠寞莫墨峄堘粔葓葔葕葖峄娽粙岣腑茥扫扫虇岬会稏陌iI谋瑟锛╋綁]",j:"[j确拇牡蓤蓧蕽蔁什]",k:"[k茦茩隄�隄佱赴岣鼻ㄇ┽覆岣翅复岣滴合扳偔]",l:"[l艁艂慕木幕募墓暮岣夺阜岣羔腹岣坚附岣横富目艀冉茪獗犫薄獗⑸秴森却薀锛綄]",n:"[n艃艅歉枪艊艌脩帽峁勧箙艆艈峁嗎箛峁娽箣峁堘箟N虉n虉茲刹葼茷岬搬秶沙鹊纱锛綆艎艐]",o:"[o脴酶脰枚脫贸脪貌脭么菓菕艕艖艓艔犬券峄屷粛茻傻茽啤峄庒粡艑艒脮玫仟谦葘葝諘謪]",p:"[p峁斸箷峁栣箺獗a到皮匹岬盷",q:"[q隄栮潡薁蓨蓩隄橁潤q虄]",r:"[r艛艜蓪蓫艠艡艝艞峁樶箼葠葢葤葥峁氠箾獗ど絔",s:"[s艢艣峁犪埂峁⑨梗隇灘艤艥艩拧艦艧葮葯S虉s虉]",t:"[t扭钮峁公泞牛峁弓飘蕡葰葲峁搬贡峁汞片骗]",u:"[u努怒蓜蕢峄め互脺眉脷煤脵霉脹没菗菙虐疟努怒漂瓢峄︶户弄奴浓农挪懦葦葧鈭猐",v:"[v峁坚菇峁踞箍撇蕥隄炾潫獗笔媇",w:"[w岷傖簝岷�岷伵磁滇簞岷呩簡岷囜簣岷塢",x:"[x岷屷簫岷娽簨蠂]",y:"[y脻媒峄册怀哦欧鸥每峄羔还岷庒簭峄瘁坏蓭蓮瞥拼]",z:"[z殴藕岷愥簯沤啪呕偶岷掅簱岷斸簳频贫]"},n=function(){var e,t,n,r,i="",o={};for(n in u)if(u.hasOwnProperty(n))for(i+=r=u[n].substring(2,u[n].length-1),e=0,t=r.length;e<t;e++)o[r.charAt(e)]=n;var a=new RegExp("["+i+"]","g");return function(e){return e.replace(a,function(e){return o[e]}).toLowerCase()}}();return e}),function(e,t){"function"==typeof define&&define.amd?define("microplugin",t):"object"==typeof exports?module.exports=t():e.MicroPlugin=t()}(this,function(){var e={mixin:function(r){r.plugins={},r.prototype.initializePlugins=function(e){var t,n,r,i=[];if(this.plugins={names:[],settings:{},requested:{},loaded:{}},o.isArray(e))for(t=0,n=e.length;t<n;t++)"string"==typeof e[t]?i.push(e[t]):(this.plugins.settings[e[t].name]=e[t].options,i.push(e[t].name));else if(e)for(r in e)e.hasOwnProperty(r)&&(this.plugins.settings[r]=e[r],i.push(r));for(;i.length;)this.require(i.shift())},r.prototype.loadPlugin=function(e){var t=this.plugins,n=r.plugins[e];if(!r.plugins.hasOwnProperty(e))throw new Error('Unable to find "'+e+'" plugin');t.requested[e]=!0,t.loaded[e]=n.fn.apply(this,[this.plugins.settings[e]||{}]),t.names.push(e)},r.prototype.require=function(e){var t=this.plugins;if(!this.plugins.loaded.hasOwnProperty(e)){if(t.requested[e])throw new Error('Plugin has circular dependency ("'+e+'")');this.loadPlugin(e)}return t.loaded[e]},r.define=function(e,t){r.plugins[e]={name:e,fn:t}}}},o={isArray:Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)}};return e}),function(e,t){"function"==typeof define&&define.amd?define("selectize",["jquery","sifter","microplugin"],t):"object"==typeof exports?module.exports=t(require("jquery"),require("sifter"),require("microplugin")):e.Selectize=t(e.jQuery,e.Sifter,e.MicroPlugin)}(this,function(S,d,e){"use strict";var k=function(e,t){if("string"!=typeof t||t.length){var l="string"==typeof t?new RegExp(t,"i"):t,u=function(e){var t=0;if(3===e.nodeType){var n=e.data.search(l);if(0<=n&&0<e.data.length){var r=e.data.match(l),i=document.createElement("span");i.className="highlight";var o=e.splitText(n),a=(o.splitText(r[0].length),o.cloneNode(!0));i.appendChild(a),o.parentNode.replaceChild(i,o),t=1}}else if(1===e.nodeType&&e.childNodes&&!/(script|style)/i.test(e.tagName)&&("highlight"!==e.className||"SPAN"!==e.tagName))for(var s=0;s<e.childNodes.length;++s)s+=u(e.childNodes[s]);return t};return e.each(function(){u(this)})}};S.fn.removeHighlight=function(){return this.find("span.highlight").each(function(){this.parentNode.firstChild.nodeName;var e=this.parentNode;e.replaceChild(this.firstChild,this),e.normalize()}).end()};var r=function(){};r.prototype={on:function(e,t){this._events=this._events||{},this._events[e]=this._events[e]||[],this._events[e].push(t)},off:function(e,t){var n=arguments.length;return 0===n?delete this._events:1===n?delete this._events[e]:(this._events=this._events||{},void(e in this._events!=!1&&this._events[e].splice(this._events[e].indexOf(t),1)))},trigger:function(e){if(this._events=this._events||{},e in this._events!=!1)for(var t=0;t<this._events[e].length;t++)this._events[e][t].apply(this,Array.prototype.slice.call(arguments,1))}},r.mixin=function(e){for(var t=["on","off","trigger"],n=0;n<t.length;n++)e.prototype[t[n]]=r.prototype[t[n]]};var $=/Mac/.test(navigator.userAgent),_=$?91:17,C=$?18:17,D=!/android/i.test(window.navigator.userAgent)&&!!document.createElement("input").validity,u=function(e){return void 0!==e},x=function(e){return null==e?null:"boolean"==typeof e?e?"1":"0":e+""},s=function(e){return(e+"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")},t={before:function(e,t,n){var r=e[t];e[t]=function(){return n.apply(e,arguments),r.apply(e,arguments)}},after:function(t,e,n){var r=t[e];t[e]=function(){var e=r.apply(t,arguments);return n.apply(t,arguments),e}}},n=function(t,n,e){var r,i=t.trigger,o={};for(r in t.trigger=function(){var e=arguments[0];if(-1===n.indexOf(e))return i.apply(t,arguments);o[e]=arguments},e.apply(t,[]),t.trigger=i,o)o.hasOwnProperty(r)&&i.apply(t,o[r])},f=function(e){var t={};if("selectionStart"in e)t.start=e.selectionStart,t.length=e.selectionEnd-t.start;else if(document.selection){e.focus();var n=document.selection.createRange(),r=document.selection.createRange().text.length;n.moveStart("character",-e.value.length),t.start=n.text.length-r,t.length=r}return t},O=function(p){var h=null,e=function(e,t){var n,r,i,o,a,s,l,u,c,d;(t=t||{},(e=e||window.event||{}).metaKey||e.altKey)||(t.force||!1!==p.data("grow"))&&(n=p.val(),e.type&&"keydown"===e.type.toLowerCase()&&(i=48<=(r=e.keyCode)&&r<=57||65<=r&&r<=90||96<=r&&r<=111||186<=r&&r<=222||32===r,46===r||8===r?(u=f(p[0])).length?n=n.substring(0,u.start)+n.substring(u.start+u.length):8===r&&u.start?n=n.substring(0,u.start-1)+n.substring(u.start+1):46===r&&void 0!==u.start&&(n=n.substring(0,u.start)+n.substring(u.start+1)):i&&(s=e.shiftKey,l=String.fromCharCode(e.keyCode),n+=l=s?l.toUpperCase():l.toLowerCase())),o=p.attr("placeholder"),!n&&o&&(n=o),d=p,(a=((c=n)?(w.$testInput||(w.$testInput=S("<span />").css({position:"absolute",top:-99999,left:-99999,width:"auto",padding:0,whiteSpace:"pre"}).appendTo("body")),w.$testInput.text(c),function(e,t,n){var r,i,o={};if(n)for(r=0,i=n.length;r<i;r++)o[n[r]]=e.css(n[r]);else o=e.css();t.css(o)}(d,w.$testInput,["letterSpacing","fontSize","fontFamily","fontWeight","textTransform"]),w.$testInput.width()):0)+4)!==h&&(h=a,p.width(a),p.triggerHandler("resize")))};p.on("keydown keyup update blur",e),e()},w=function(e,t){var n,r,i,o,a=this;(o=e[0]).selectize=a;var s,l,u,c=window.getComputedStyle&&window.getComputedStyle(o,null);if(i=(i=c?c.getPropertyValue("direction"):o.currentStyle&&o.currentStyle.direction)||e.parents("[dir]:first").attr("dir")||"",S.extend(a,{order:0,settings:t,$input:e,tabIndex:e.attr("tabindex")||"",tagType:"select"===o.tagName.toLowerCase()?1:2,rtl:/rtl/i.test(i),eventNS:".selectize"+ ++w.count,highlightedValue:null,isBlurring:!1,isOpen:!1,isDisabled:!1,isRequired:e.is("[required]"),isInvalid:!1,isLocked:!1,isFocused:!1,isInputHidden:!1,isSetup:!1,isShiftDown:!1,isCmdDown:!1,isCtrlDown:!1,ignoreFocus:!1,ignoreBlur:!1,ignoreHover:!1,hasOptions:!1,currentResults:null,lastValue:"",caretPos:0,loading:0,loadedSearches:{},$activeOption:null,$activeItems:[],optgroups:{},options:{},userOptions:{},items:[],renderCache:{},onSearchChange:null===t.loadThrottle?a.onSearchChange:(s=a.onSearchChange,l=t.loadThrottle,function(){var e=this,t=arguments;window.clearTimeout(u),u=window.setTimeout(function(){s.apply(e,t)},l)})}),a.sifter=new d(this.options,{diacritics:t.diacritics}),a.settings.options){for(n=0,r=a.settings.options.length;n<r;n++)a.registerOption(a.settings.options[n]);delete a.settings.options}if(a.settings.optgroups){for(n=0,r=a.settings.optgroups.length;n<r;n++)a.registerOptionGroup(a.settings.optgroups[n]);delete a.settings.optgroups}a.settings.mode=a.settings.mode||(1===a.settings.maxItems?"single":"multi"),"boolean"!=typeof a.settings.hideSelected&&(a.settings.hideSelected="multi"===a.settings.mode),a.initializePlugins(a.settings.plugins),a.setupCallbacks(),a.setupTemplates(),a.setup()};return r.mixin(w),void 0!==e?e.mixin(w):function(e,t){t||(t={});console.error("Selectize: "+e),t.explanation&&(console.group&&console.group(),console.error(t.explanation),console.group&&console.groupEnd())}("Dependency MicroPlugin is missing",{explanation:'Make sure you either: (1) are using the "standalone" version of Selectize, or (2) require MicroPlugin before you load Selectize.'}),S.extend(w.prototype,{setup:function(){var e,t,n,r,i,o,a,s,l,u,c,d,p,h,f=this,g=f.settings,m=f.eventNS,v=S(window),y=S(document),w=f.$input;if(a=f.settings.mode,s=w.attr("class")||"",e=S("<div>").addClass(g.wrapperClass).addClass(s).addClass(a),t=S("<div>").addClass(g.inputClass).addClass("items").appendTo(e),n=S('<input type="text" autocomplete="off" />').appendTo(t).attr("tabindex",w.is(":disabled")?"-1":f.tabIndex),o=S(g.dropdownParent||e),r=S("<div>").addClass(g.dropdownClass).addClass(a).hide().appendTo(o),i=S("<div>").addClass(g.dropdownContentClass).appendTo(r),(u=w.attr("id"))&&(n.attr("id",u+"-selectized"),S("label[for='"+u+"']").attr("for",u+"-selectized")),f.settings.copyClassesToDropdown&&r.addClass(s),e.css({width:w[0].style.width}),f.plugins.names.length&&(l="plugin-"+f.plugins.names.join(" plugin-"),e.addClass(l),r.addClass(l)),(null===g.maxItems||1<g.maxItems)&&1===f.tagType&&w.attr("multiple","multiple"),f.settings.placeholder&&n.attr("placeholder",g.placeholder),!f.settings.splitOn&&f.settings.delimiter){var b=f.settings.delimiter.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&");f.settings.splitOn=new RegExp("\\s*"+b+"+\\s*")}w.attr("autocorrect")&&n.attr("autocorrect",w.attr("autocorrect")),w.attr("autocapitalize")&&n.attr("autocapitalize",w.attr("autocapitalize")),n[0].type=w[0].type,f.$wrapper=e,f.$control=t,f.$control_input=n,f.$dropdown=r,f.$dropdown_content=i,r.on("mouseenter mousedown click","[data-disabled]>[data-selectable]",function(e){e.stopImmediatePropagation()}),r.on("mouseenter","[data-selectable]",function(){return f.onOptionHover.apply(f,arguments)}),r.on("mousedown click","[data-selectable]",function(){return f.onOptionSelect.apply(f,arguments)}),d="mousedown",p="*:not(input)",h=function(){return f.onItemSelect.apply(f,arguments)},(c=t).on(d,p,function(e){for(var t=e.target;t&&t.parentNode!==c[0];)t=t.parentNode;return e.currentTarget=t,h.apply(this,[e])}),O(n),t.on({mousedown:function(){return f.onMouseDown.apply(f,arguments)},click:function(){return f.onClick.apply(f,arguments)}}),n.on({mousedown:function(e){e.stopPropagation()},keydown:function(){return f.onKeyDown.apply(f,arguments)},keyup:function(){return f.onKeyUp.apply(f,arguments)},keypress:function(){return f.onKeyPress.apply(f,arguments)},resize:function(){f.positionDropdown.apply(f,[])},blur:function(){return f.onBlur.apply(f,arguments)},focus:function(){return f.ignoreBlur=!1,f.onFocus.apply(f,arguments)},paste:function(){return f.onPaste.apply(f,arguments)}}),y.on("keydown"+m,function(e){f.isCmdDown=e[$?"metaKey":"ctrlKey"],f.isCtrlDown=e[$?"altKey":"ctrlKey"],f.isShiftDown=e.shiftKey}),y.on("keyup"+m,function(e){e.keyCode===C&&(f.isCtrlDown=!1),16===e.keyCode&&(f.isShiftDown=!1),e.keyCode===_&&(f.isCmdDown=!1)}),y.on("mousedown"+m,function(e){if(f.isFocused){if(e.target===f.$dropdown[0]||e.target.parentNode===f.$dropdown[0])return!1;f.$control.has(e.target).length||e.target===f.$control[0]||f.blur(e.target)}}),v.on(["scroll"+m,"resize"+m].join(" "),function(){f.isOpen&&f.positionDropdown.apply(f,arguments)}),v.on("mousemove"+m,function(){f.ignoreHover=!1}),this.revertSettings={$children:w.children().detach(),tabindex:w.attr("tabindex")},w.attr("tabindex",-1).hide().after(f.$wrapper),S.isArray(g.items)&&(f.setValue(g.items),delete g.items),D&&w.on("invalid"+m,function(e){e.preventDefault(),f.isInvalid=!0,f.refreshState()}),f.updateOriginalInput(),f.refreshItems(),f.refreshState(),f.updatePlaceholder(),f.isSetup=!0,w.is(":disabled")&&f.disable(),f.on("change",this.onChange),w.data("selectize",f),w.addClass("selectized"),f.trigger("initialize"),!0===g.preload&&f.onSearchChange("")},setupTemplates:function(){var n=this.settings.labelField,r=this.settings.optgroupLabelField,e={optgroup:function(e){return'<div class="optgroup">'+e.html+"</div>"},optgroup_header:function(e,t){return'<div class="optgroup-header">'+t(e[r])+"</div>"},option:function(e,t){return'<div class="option">'+t(e[n])+"</div>"},item:function(e,t){return'<div class="item">'+t(e[n])+"</div>"},option_create:function(e,t){return'<div class="create">Add <strong>'+t(e.input)+"</strong>&hellip;</div>"}};this.settings.render=S.extend({},e,this.settings.render)},setupCallbacks:function(){var e,t,n={initialize:"onInitialize",change:"onChange",item_add:"onItemAdd",item_remove:"onItemRemove",clear:"onClear",option_add:"onOptionAdd",option_remove:"onOptionRemove",option_clear:"onOptionClear",optgroup_add:"onOptionGroupAdd",optgroup_remove:"onOptionGroupRemove",optgroup_clear:"onOptionGroupClear",dropdown_open:"onDropdownOpen",dropdown_close:"onDropdownClose",type:"onType",load:"onLoad",focus:"onFocus",blur:"onBlur"};for(e in n)n.hasOwnProperty(e)&&(t=this.settings[n[e]])&&this.on(e,t)},onClick:function(e){this.isFocused&&this.isOpen||(this.focus(),e.preventDefault())},onMouseDown:function(e){var t=this,n=e.isDefaultPrevented();S(e.target);if(t.isFocused){if(e.target!==t.$control_input[0])return"single"===t.settings.mode?t.isOpen?t.close():t.open():n||t.setActiveItem(null),!1}else n||window.setTimeout(function(){t.focus()},0)},onChange:function(){this.$input.trigger("change")},onPaste:function(e){var i=this;i.isFull()||i.isInputHidden||i.isLocked?e.preventDefault():i.settings.splitOn&&setTimeout(function(){var e=i.$control_input.val();if(e.match(i.settings.splitOn))for(var t=S.trim(e).split(i.settings.splitOn),n=0,r=t.length;n<r;n++)i.createItem(t[n])},0)},onKeyPress:function(e){if(this.isLocked)return e&&e.preventDefault();var t=String.fromCharCode(e.keyCode||e.which);return this.settings.create&&"multi"===this.settings.mode&&t===this.settings.delimiter?(this.createItem(),e.preventDefault(),!1):void 0},onKeyDown:function(e){e.target,this.$control_input[0];var t=this;if(t.isLocked)9!==e.keyCode&&e.preventDefault();else{switch(e.keyCode){case 65:if(t.isCmdDown)return void t.selectAll();break;case 27:return void(t.isOpen&&(e.preventDefault(),e.stopPropagation(),t.close()));case 78:if(!e.ctrlKey||e.altKey)break;case 40:if(!t.isOpen&&t.hasOptions)t.open();else if(t.$activeOption){t.ignoreHover=!0;var n=t.getAdjacentOption(t.$activeOption,1);n.length&&t.setActiveOption(n,!0,!0)}return void e.preventDefault();case 80:if(!e.ctrlKey||e.altKey)break;case 38:if(t.$activeOption){t.ignoreHover=!0;var r=t.getAdjacentOption(t.$activeOption,-1);r.length&&t.setActiveOption(r,!0,!0)}return void e.preventDefault();case 13:return void(t.isOpen&&t.$activeOption&&(t.onOptionSelect({currentTarget:t.$activeOption}),e.preventDefault()));case 37:return void t.advanceSelection(-1,e);case 39:return void t.advanceSelection(1,e);case 9:return t.settings.selectOnTab&&t.isOpen&&t.$activeOption&&(t.onOptionSelect({currentTarget:t.$activeOption}),t.isFull()||e.preventDefault()),void(t.settings.create&&t.createItem()&&e.preventDefault());case 8:case 46:return void t.deleteSelection(e)}!t.isFull()&&!t.isInputHidden||($?e.metaKey:e.ctrlKey)||e.preventDefault()}},onKeyUp:function(e){if(this.isLocked)return e&&e.preventDefault();var t=this.$control_input.val()||"";this.lastValue!==t&&(this.lastValue=t,this.onSearchChange(t),this.refreshOptions(),this.trigger("type",t))},onSearchChange:function(t){var n=this,r=n.settings.load;r&&(n.loadedSearches.hasOwnProperty(t)||(n.loadedSearches[t]=!0,n.load(function(e){r.apply(n,[t,e])})))},onFocus:function(e){var t=this,n=t.isFocused;if(t.isDisabled)return t.blur(),e&&e.preventDefault(),!1;t.ignoreFocus||(t.isFocused=!0,"focus"===t.settings.preload&&t.onSearchChange(""),n||t.trigger("focus"),t.$activeItems.length||(t.showInput(),t.setActiveItem(null),t.refreshOptions(!!t.settings.openOnFocus)),t.refreshState())},onBlur:function(e,t){var n=this;if(n.isFocused&&(n.isFocused=!1,!n.ignoreFocus)){if(!n.ignoreBlur&&document.activeElement===n.$dropdown_content[0])return n.ignoreBlur=!0,void n.onFocus(e);var r=function(){n.close(),n.setTextboxValue(""),n.setActiveItem(null),n.setActiveOption(null),n.setCaret(n.items.length),n.refreshState(),t&&t.focus&&t.focus(),n.isBlurring=!1,n.ignoreFocus=!1,n.trigger("blur")};n.isBlurring=!0,n.ignoreFocus=!0,n.settings.create&&n.settings.createOnBlur?n.createItem(null,!1,r):r()}},onOptionHover:function(e){this.ignoreHover||this.setActiveOption(e.currentTarget,!1)},onOptionSelect:function(e){var t,n,r=this;e.preventDefault&&(e.preventDefault(),e.stopPropagation()),(n=S(e.currentTarget)).hasClass("create")?r.createItem(null,function(){r.settings.closeAfterSelect&&r.close()}):void 0!==(t=n.attr("data-value"))&&(r.lastQuery=null,r.setTextboxValue(""),r.addItem(t),r.settings.closeAfterSelect?r.close():!r.settings.hideSelected&&e.type&&/mouse/.test(e.type)&&r.setActiveOption(r.getOption(t)))},onItemSelect:function(e){this.isLocked||"multi"===this.settings.mode&&(e.preventDefault(),this.setActiveItem(e.currentTarget,e))},load:function(e){var t=this,n=t.$wrapper.addClass(t.settings.loadingClass);t.loading++,e.apply(t,[function(e){t.loading=Math.max(t.loading-1,0),e&&e.length&&(t.addOption(e),t.refreshOptions(t.isFocused&&!t.isInputHidden)),t.loading||n.removeClass(t.settings.loadingClass),t.trigger("load",e)}])},setTextboxValue:function(e){var t=this.$control_input;t.val()!==e&&(t.val(e).triggerHandler("update"),this.lastValue=e)},getValue:function(){return 1===this.tagType&&this.$input.attr("multiple")?this.items:this.items.join(this.settings.delimiter)},setValue:function(e,t){n(this,t?[]:["change"],function(){this.clear(t),this.addItems(e,t)})},setActiveItem:function(e,t){var n,r,i,o,a,s,l,u,c=this;if("single"!==c.settings.mode){if(!(e=S(e)).length)return S(c.$activeItems).removeClass("active"),c.$activeItems=[],void(c.isFocused&&c.showInput());if("mousedown"===(n=t&&t.type.toLowerCase())&&c.isShiftDown&&c.$activeItems.length){for(u=c.$control.children(".active:last"),o=Array.prototype.indexOf.apply(c.$control[0].childNodes,[u[0]]),(a=Array.prototype.indexOf.apply(c.$control[0].childNodes,[e[0]]))<o&&(l=o,o=a,a=l),r=o;r<=a;r++)s=c.$control[0].childNodes[r],-1===c.$activeItems.indexOf(s)&&(S(s).addClass("active"),c.$activeItems.push(s));t.preventDefault()}else"mousedown"===n&&c.isCtrlDown||"keydown"===n&&this.isShiftDown?e.hasClass("active")?(i=c.$activeItems.indexOf(e[0]),c.$activeItems.splice(i,1),e.removeClass("active")):c.$activeItems.push(e.addClass("active")[0]):(S(c.$activeItems).removeClass("active"),c.$activeItems=[e.addClass("active")[0]]);c.hideInput(),this.isFocused||c.focus()}},setActiveOption:function(e,t,n){var r,i,o,a,s,l=this;l.$activeOption&&l.$activeOption.removeClass("active"),l.$activeOption=null,(e=S(e)).length&&(l.$activeOption=e.addClass("active"),!t&&u(t)||(r=l.$dropdown_content.height(),i=l.$activeOption.outerHeight(!0),t=l.$dropdown_content.scrollTop()||0,s=(a=o=l.$activeOption.offset().top-l.$dropdown_content.offset().top+t)-r+i,r+t<o+i?l.$dropdown_content.stop().animate({scrollTop:s},n?l.settings.scrollDuration:0):o<t&&l.$dropdown_content.stop().animate({scrollTop:a},n?l.settings.scrollDuration:0)))},selectAll:function(){"single"!==this.settings.mode&&(this.$activeItems=Array.prototype.slice.apply(this.$control.children(":not(input)").addClass("active")),this.$activeItems.length&&(this.hideInput(),this.close()),this.focus())},hideInput:function(){this.setTextboxValue(""),this.$control_input.css({opacity:0,position:"absolute",left:this.rtl?1e4:-1e4}),this.isInputHidden=!0},showInput:function(){this.$control_input.css({opacity:1,position:"relative",left:0}),this.isInputHidden=!1},focus:function(){var e=this;e.isDisabled||(e.ignoreFocus=!0,e.$control_input[0].focus(),window.setTimeout(function(){e.ignoreFocus=!1,e.onFocus()},0))},blur:function(e){this.$control_input[0].blur(),this.onBlur(null,e)},getScoreFunction:function(e){return this.sifter.getScoreFunction(e,this.getSearchOptions())},getSearchOptions:function(){var e=this.settings,t=e.sortField;return"string"==typeof t&&(t=[{field:t}]),{fields:e.searchField,conjunction:e.searchConjunction,sort:t,nesting:e.nesting}},search:function(e){var t,n,r,i=this.settings,o=this.getSearchOptions();if(i.score&&"function"!=typeof(r=this.settings.score.apply(this,[e])))throw new Error('Selectize "score" setting must be a function that returns a function');if(e!==this.lastQuery?(this.lastQuery=e,n=this.sifter.search(e,S.extend(o,{score:r})),this.currentResults=n):n=S.extend(!0,{},this.currentResults),i.hideSelected)for(t=n.items.length-1;0<=t;t--)-1!==this.items.indexOf(x(n.items[t].id))&&n.items.splice(t,1);return n},refreshOptions:function(e){var t,n,r,i,o,a,s,l,u,c,d,p,h,f,g,m;void 0===e&&(e=!0);var v,y,w=this,b=S.trim(w.$control_input.val()),$=w.search(b),_=w.$dropdown_content,C=w.$activeOption&&x(w.$activeOption.attr("data-value"));for(i=$.items.length,"number"==typeof w.settings.maxOptions&&(i=Math.min(i,w.settings.maxOptions)),o={},a=[],t=0;t<i;t++)for(s=w.options[$.items[t].id],l=w.render("option",s),u=s[w.settings.optgroupField]||"",n=0,r=(c=S.isArray(u)?u:[u])&&c.length;n<r;n++)u=c[n],w.optgroups.hasOwnProperty(u)||(u=""),o.hasOwnProperty(u)||(o[u]=document.createDocumentFragment(),a.push(u)),o[u].appendChild(l);for(this.settings.lockOptgroupOrder&&a.sort(function(e,t){return(w.optgroups[e].$order||0)-(w.optgroups[t].$order||0)}),d=document.createDocumentFragment(),t=0,i=a.length;t<i;t++)u=a[t],w.optgroups.hasOwnProperty(u)&&o[u].childNodes.length?((p=document.createDocumentFragment()).appendChild(w.render("optgroup_header",w.optgroups[u])),p.appendChild(o[u]),d.appendChild(w.render("optgroup",S.extend({},w.optgroups[u],{html:(v=p,y=void 0,y=document.createElement("div"),y.appendChild(v.cloneNode(!0)),y.innerHTML),dom:p})))):d.appendChild(o[u]);if(_.html(d),w.settings.highlight&&(_.removeHighlight(),$.query.length&&$.tokens.length))for(t=0,i=$.tokens.length;t<i;t++)k(_,$.tokens[t].regex);if(!w.settings.hideSelected)for(t=0,i=w.items.length;t<i;t++)w.getOption(w.items[t]).addClass("selected");(h=w.canCreate(b))&&(_.prepend(w.render("option_create",{input:b})),m=S(_[0].childNodes[0])),w.hasOptions=0<$.items.length||h,w.hasOptions?(0<$.items.length?((g=C&&w.getOption(C))&&g.length?f=g:"single"===w.settings.mode&&w.items.length&&(f=w.getOption(w.items[0])),f&&f.length||(f=m&&!w.settings.addPrecedence?w.getAdjacentOption(m,1):_.find("[data-selectable]:first"))):f=m,w.setActiveOption(f),e&&!w.isOpen&&w.open()):(w.setActiveOption(null),e&&w.isOpen&&w.close())},addOption:function(e){var t,n,r;if(S.isArray(e))for(t=0,n=e.length;t<n;t++)this.addOption(e[t]);else(r=this.registerOption(e))&&(this.userOptions[r]=!0,this.lastQuery=null,this.trigger("option_add",r,e))},registerOption:function(e){var t=x(e[this.settings.valueField]);return null!=t&&!this.options.hasOwnProperty(t)&&(e.$order=e.$order||++this.order,this.options[t]=e,t)},registerOptionGroup:function(e){var t=x(e[this.settings.optgroupValueField]);return!!t&&(e.$order=e.$order||++this.order,this.optgroups[t]=e,t)},addOptionGroup:function(e,t){t[this.settings.optgroupValueField]=e,(e=this.registerOptionGroup(t))&&this.trigger("optgroup_add",e,t)},removeOptionGroup:function(e){this.optgroups.hasOwnProperty(e)&&(delete this.optgroups[e],this.renderCache={},this.trigger("optgroup_remove",e))},clearOptionGroups:function(){this.optgroups={},this.renderCache={},this.trigger("optgroup_clear")},updateOption:function(e,t){var n,r,i,o,a,s,l,u=this;if(e=x(e),i=x(t[u.settings.valueField]),null!==e&&u.options.hasOwnProperty(e)){if("string"!=typeof i)throw new Error("Value must be set in option data");l=u.options[e].$order,i!==e&&(delete u.options[e],-1!==(o=u.items.indexOf(e))&&u.items.splice(o,1,i)),t.$order=t.$order||l,u.options[i]=t,a=u.renderCache.item,s=u.renderCache.option,a&&(delete a[e],delete a[i]),s&&(delete s[e],delete s[i]),-1!==u.items.indexOf(i)&&(n=u.getItem(e),r=S(u.render("item",t)),n.hasClass("active")&&r.addClass("active"),n.replaceWith(r)),u.lastQuery=null,u.isOpen&&u.refreshOptions(!1)}},removeOption:function(e,t){e=x(e);var n=this.renderCache.item,r=this.renderCache.option;n&&delete n[e],r&&delete r[e],delete this.userOptions[e],delete this.options[e],this.lastQuery=null,this.trigger("option_remove",e),this.removeItem(e,t)},clearOptions:function(){var n=this;n.loadedSearches={},n.userOptions={},n.renderCache={};var r=n.options;S.each(n.options,function(e,t){-1==n.items.indexOf(e)&&delete r[e]}),n.options=n.sifter.items=r,n.lastQuery=null,n.trigger("option_clear")},getOption:function(e){return this.getElementWithValue(e,this.$dropdown_content.find("[data-selectable]"))},getAdjacentOption:function(e,t){var n=this.$dropdown.find("[data-selectable]"),r=n.index(e)+t;return 0<=r&&r<n.length?n.eq(r):S()},getElementWithValue:function(e,t){if(null!=(e=x(e)))for(var n=0,r=t.length;n<r;n++)if(t[n].getAttribute("data-value")===e)return S(t[n]);return S()},getItem:function(e){return this.getElementWithValue(e,this.$control.children())},addItems:function(e,t){this.buffer=document.createDocumentFragment();for(var n=this.$control[0].childNodes,r=0;r<n.length;r++)this.buffer.appendChild(n[r]);for(var i=S.isArray(e)?e:[e],o=(r=0,i.length);r<o;r++)this.isPending=r<o-1,this.addItem(i[r],t);var a=this.$control[0];a.insertBefore(this.buffer,a.firstChild),this.buffer=null},addItem:function(s,l){n(this,l?[]:["change"],function(){var e,t,n,r,i,o=this,a=o.settings.mode;s=x(s),-1===o.items.indexOf(s)?o.options.hasOwnProperty(s)&&("single"===a&&o.clear(l),"multi"===a&&o.isFull()||(e=S(o.render("item",o.options[s])),i=o.isFull(),o.items.splice(o.caretPos,0,s),o.insertAtCaret(e),(!o.isPending||!i&&o.isFull())&&o.refreshState(),o.isSetup&&(n=o.$dropdown_content.find("[data-selectable]"),o.isPending||(t=o.getOption(s),r=o.getAdjacentOption(t,1).attr("data-value"),o.refreshOptions(o.isFocused&&"single"!==a),r&&o.setActiveOption(o.getOption(r))),!n.length||o.isFull()?o.close():o.isPending||o.positionDropdown(),o.updatePlaceholder(),o.trigger("item_add",s,e),o.isPending||o.updateOriginalInput({silent:l})))):"single"===a&&o.close()})},removeItem:function(e,t){var n,r,i,o=this;n=e instanceof S?e:o.getItem(e),e=x(n.attr("data-value")),-1!==(r=o.items.indexOf(e))&&(n.remove(),n.hasClass("active")&&(i=o.$activeItems.indexOf(n[0]),o.$activeItems.splice(i,1)),o.items.splice(r,1),o.lastQuery=null,!o.settings.persist&&o.userOptions.hasOwnProperty(e)&&o.removeOption(e,t),r<o.caretPos&&o.setCaret(o.caretPos-1),o.refreshState(),o.updatePlaceholder(),o.updateOriginalInput({silent:t}),o.positionDropdown(),o.trigger("item_remove",e,n))},createItem:function(e,n){var r=this,i=r.caretPos;e=e||S.trim(r.$control_input.val()||"");var o=arguments[arguments.length-1];if("function"!=typeof o&&(o=function(){}),"boolean"!=typeof n&&(n=!0),!r.canCreate(e))return o(),!1;r.lock();var t,a,s="function"==typeof r.settings.create?this.settings.create:function(e){var t={};return t[r.settings.labelField]=e,t[r.settings.valueField]=e,t},l=(a=!(t=function(e){if(r.unlock(),!e||"object"!=typeof e)return o();var t=x(e[r.settings.valueField]);if("string"!=typeof t)return o();r.setTextboxValue(""),r.addOption(e),r.setCaret(i),r.addItem(t),r.refreshOptions(n&&"single"!==r.settings.mode),o(e)}),function(){a||(a=!0,t.apply(this,arguments))}),u=s.apply(this,[e,l]);return void 0!==u&&l(u),!0},refreshItems:function(){this.lastQuery=null,this.isSetup&&this.addItem(this.items),this.refreshState(),this.updateOriginalInput()},refreshState:function(){this.refreshValidityState(),this.refreshClasses()},refreshValidityState:function(){if(!this.isRequired)return!1;var e=!this.items.length;this.isInvalid=e,this.$control_input.prop("required",e),this.$input.prop("required",!e)},refreshClasses:function(){var e=this,t=e.isFull(),n=e.isLocked;e.$wrapper.toggleClass("rtl",e.rtl),e.$control.toggleClass("focus",e.isFocused).toggleClass("disabled",e.isDisabled).toggleClass("required",e.isRequired).toggleClass("invalid",e.isInvalid).toggleClass("locked",n).toggleClass("full",t).toggleClass("not-full",!t).toggleClass("input-active",e.isFocused&&!e.isInputHidden).toggleClass("dropdown-active",e.isOpen).toggleClass("has-options",!S.isEmptyObject(e.options)).toggleClass("has-items",0<e.items.length),e.$control_input.data("grow",!t&&!n)},isFull:function(){return null!==this.settings.maxItems&&this.items.length>=this.settings.maxItems},updateOriginalInput:function(e){var t,n,r,i,o=this;if(e=e||{},1===o.tagType){for(r=[],t=0,n=o.items.length;t<n;t++)i=o.options[o.items[t]][o.settings.labelField]||"",r.push('<option value="'+s(o.items[t])+'" selected="selected">'+s(i)+"</option>");r.length||this.$input.attr("multiple")||r.push('<option value="" selected="selected"></option>'),o.$input.html(r.join(""))}else o.$input.val(o.getValue()),o.$input.attr("value",o.$input.val());o.isSetup&&(e.silent||o.trigger("change",o.$input.val()))},updatePlaceholder:function(){if(this.settings.placeholder){var e=this.$control_input;this.items.length?e.removeAttr("placeholder"):e.attr("placeholder",this.settings.placeholder),e.triggerHandler("update",{force:!0})}},open:function(){var e=this;e.isLocked||e.isOpen||"multi"===e.settings.mode&&e.isFull()||(e.focus(),e.isOpen=!0,e.refreshState(),e.$dropdown.css({visibility:"hidden",display:"block"}),e.positionDropdown(),e.$dropdown.css({visibility:"visible"}),e.trigger("dropdown_open",e.$dropdown))},close:function(){var e=this,t=e.isOpen;"single"===e.settings.mode&&e.items.length&&(e.hideInput(),e.isBlurring||e.$control_input.blur()),e.isOpen=!1,e.$dropdown.hide(),e.setActiveOption(null),e.refreshState(),t&&e.trigger("dropdown_close",e.$dropdown)},positionDropdown:function(){var e=this.$control,t="body"===this.settings.dropdownParent?e.offset():e.position();t.top+=e.outerHeight(!0),this.$dropdown.css({width:e[0].getBoundingClientRect().width,top:t.top,left:t.left})},clear:function(e){var t=this;t.items.length&&(t.$control.children(":not(input)").remove(),t.items=[],t.lastQuery=null,t.setCaret(0),t.setActiveItem(null),t.updatePlaceholder(),t.updateOriginalInput({silent:e}),t.refreshState(),t.showInput(),t.trigger("clear"))},insertAtCaret:function(e){var t=Math.min(this.caretPos,this.items.length),n=e[0],r=this.buffer||this.$control[0];0===t?r.insertBefore(n,r.firstChild):r.insertBefore(n,r.childNodes[t]),this.setCaret(t+1)},deleteSelection:function(e){var t,n,r,i,o,a,s,l,u,c=this;if(r=e&&8===e.keyCode?-1:1,i=f(c.$control_input[0]),c.$activeOption&&!c.settings.hideSelected&&(s=c.getAdjacentOption(c.$activeOption,-1).attr("data-value")),o=[],c.$activeItems.length){for(u=c.$control.children(".active:"+(0<r?"last":"first")),a=c.$control.children(":not(input)").index(u),0<r&&a++,t=0,n=c.$activeItems.length;t<n;t++)o.push(S(c.$activeItems[t]).attr("data-value"));e&&(e.preventDefault(),e.stopPropagation())}else(c.isFocused||"single"===c.settings.mode)&&c.items.length&&(r<0&&0===i.start&&0===i.length?o.push(c.items[c.caretPos-1]):0<r&&i.start===c.$control_input.val().length&&o.push(c.items[c.caretPos]));if(!o.length||"function"==typeof c.settings.onDelete&&!1===c.settings.onDelete.apply(c,[o]))return!1;for(void 0!==a&&c.setCaret(a);o.length;)c.removeItem(o.pop());return c.showInput(),c.positionDropdown(),c.refreshOptions(!0),s&&(l=c.getOption(s)).length&&c.setActiveOption(l),!0},advanceSelection:function(e,t){var n,r,i,o,a,s=this;0!==e&&(s.rtl&&(e*=-1),n=0<e?"last":"first",r=f(s.$control_input[0]),s.isFocused&&!s.isInputHidden?(o=s.$control_input.val().length,(e<0?0===r.start&&0===r.length:r.start===o)&&!o&&s.advanceCaret(e,t)):(a=s.$control.children(".active:"+n)).length&&(i=s.$control.children(":not(input)").index(a),s.setActiveItem(null),s.setCaret(0<e?i+1:i)))},advanceCaret:function(e,t){var n,r;0!==e&&(n=0<e?"next":"prev",this.isShiftDown?(r=this.$control_input[n]()).length&&(this.hideInput(),this.setActiveItem(r),t&&t.preventDefault()):this.setCaret(this.caretPos+e))},setCaret:function(e){var t,n,r,i;if(e="single"===this.settings.mode?this.items.length:Math.max(0,Math.min(this.items.length,e)),!this.isPending)for(t=0,n=(r=this.$control.children(":not(input)")).length;t<n;t++)i=S(r[t]).detach(),t<e?this.$control_input.before(i):this.$control.append(i);this.caretPos=e},lock:function(){this.close(),this.isLocked=!0,this.refreshState()},unlock:function(){this.isLocked=!1,this.refreshState()},disable:function(){this.$input.prop("disabled",!0),this.$control_input.prop("disabled",!0).prop("tabindex",-1),this.isDisabled=!0,this.lock()},enable:function(){this.$input.prop("disabled",!1),this.$control_input.prop("disabled",!1).prop("tabindex",this.tabIndex),this.isDisabled=!1,this.unlock()},destroy:function(){var e=this,t=e.eventNS,n=e.revertSettings;e.trigger("destroy"),e.off(),e.$wrapper.remove(),e.$dropdown.remove(),e.$input.html("").append(n.$children).removeAttr("tabindex").removeClass("selectized").attr({tabindex:n.tabindex}).show(),e.$control_input.removeData("grow"),e.$input.removeData("selectize"),0==--w.count&&w.$testInput&&(w.$testInput.remove(),w.$testInput=void 0),S(window).off(t),S(document).off(t),S(document.body).off(t),delete e.$input[0].selectize},render:function(e,t){var n,r,i="",o=!1,a=this;return"option"!==e&&"item"!==e||(o=!!(n=x(t[a.settings.valueField]))),o&&(u(a.renderCache[e])||(a.renderCache[e]={}),a.renderCache[e].hasOwnProperty(n))?a.renderCache[e][n]:(i=S(a.settings.render[e].apply(this,[t,s])),"option"===e||"option_create"===e?t[a.settings.disabledField]||i.attr("data-selectable",""):"optgroup"===e&&(r=t[a.settings.optgroupValueField]||"",i.attr("data-group",r),t[a.settings.disabledField]&&i.attr("data-disabled","")),"option"!==e&&"item"!==e||i.attr("data-value",n||""),o&&(a.renderCache[e][n]=i[0]),i[0])},clearCache:function(e){void 0===e?this.renderCache={}:delete this.renderCache[e]},canCreate:function(e){if(!this.settings.create)return!1;var t=this.settings.createFilter;return e.length&&("function"!=typeof t||t.apply(this,[e]))&&("string"!=typeof t||new RegExp(t).test(e))&&(!(t instanceof RegExp)||t.test(e))}}),w.count=0,w.defaults={options:[],optgroups:[],plugins:[],delimiter:",",splitOn:null,persist:!0,diacritics:!0,create:!1,createOnBlur:!1,createFilter:null,highlight:!0,openOnFocus:!0,maxOptions:1e3,maxItems:null,hideSelected:null,addPrecedence:!1,selectOnTab:!1,preload:!1,allowEmptyOption:!1,closeAfterSelect:!1,scrollDuration:60,loadThrottle:300,loadingClass:"loading",dataAttr:"data-data",optgroupField:"optgroup",valueField:"value",labelField:"text",disabledField:"disabled",optgroupLabelField:"label",optgroupValueField:"value",lockOptgroupOrder:!1,sortField:"$order",searchField:["text"],searchConjunction:"and",mode:null,wrapperClass:"selectize-control",inputClass:"selectize-input",dropdownClass:"selectize-dropdown",dropdownContentClass:"selectize-dropdown-content",dropdownParent:null,copyClassesToDropdown:!0,render:{}},S.fn.selectize=function(i){var o=S.fn.selectize.defaults,d=S.extend({},o,i),p=d.dataAttr,h=d.labelField,f=d.valueField,g=d.disabledField,m=d.optgroupField,v=d.optgroupLabelField,y=d.optgroupValueField;return this.each(function(){if(!this.selectize){var e=S(this),t=this.tagName.toLowerCase(),n=e.attr("placeholder")||e.attr("data-placeholder");n||d.allowEmptyOption||(n=e.children('option[value=""]').text());var r={placeholder:n,options:[],optgroups:[],items:[]};"select"===t?function(e,a){var t,n,r,i,o=a.options,s={},l=function(e){var t=p&&e.attr(p);return"string"==typeof t&&t.length?JSON.parse(t):null},u=function(e,t){e=S(e);var n=x(e.val());if(n||d.allowEmptyOption)if(s.hasOwnProperty(n)){if(t){var r=s[n][m];r?S.isArray(r)?r.push(t):s[n][m]=[r,t]:s[n][m]=t}}else{var i=l(e)||{};i[h]=i[h]||e.text(),i[f]=i[f]||n,i[g]=i[g]||e.prop("disabled"),i[m]=i[m]||t,s[n]=i,o.push(i),e.is(":selected")&&a.items.push(n)}},c=function(e){var t,n,r,i,o;for((r=(e=S(e)).attr("label"))&&((i=l(e)||{})[v]=r,i[y]=r,i[g]=e.prop("disabled"),a.optgroups.push(i)),t=0,n=(o=S("option",e)).length;t<n;t++)u(o[t],r)};for(a.maxItems=e.attr("multiple")?null:1,t=0,n=(i=e.children()).length;t<n;t++)"optgroup"===(r=i[t].tagName.toLowerCase())?c(i[t]):"option"===r&&u(i[t])}(e,r):function(e,t){var n,r,i,o,a=e.attr(p);if(a)for(t.options=JSON.parse(a),n=0,r=t.options.length;n<r;n++)t.items.push(t.options[n][f]);else{var s=S.trim(e.val()||"");if(!d.allowEmptyOption&&!s.length)return;for(n=0,r=(i=s.split(d.delimiter)).length;n<r;n++)(o={})[h]=i[n],o[f]=i[n],t.options.push(o);t.items=i}}(e,r),new w(e,S.extend(!0,{},o,r,i))}})},S.fn.selectize.defaults=w.defaults,S.fn.selectize.support={validity:D},w.define("drag_drop",function(e){if(!S.fn.sortable)throw new Error('The "drag_drop" plugin requires jQuery UI "sortable".');if("multi"===this.settings.mode){var t,n,r,i=this;i.lock=(t=i.lock,function(){var e=i.$control.data("sortable");return e&&e.disable(),t.apply(i,arguments)}),i.unlock=(n=i.unlock,function(){var e=i.$control.data("sortable");return e&&e.enable(),n.apply(i,arguments)}),i.setup=(r=i.setup,function(){r.apply(this,arguments);var n=i.$control.sortable({items:"[data-value]",forcePlaceholderSize:!0,disabled:i.isLocked,start:function(e,t){t.placeholder.css("width",t.helper.css("width")),n.css({overflow:"visible"})},stop:function(){n.css({overflow:"hidden"});var e=i.$activeItems?i.$activeItems.slice():null,t=[];n.children("[data-value]").each(function(){t.push(S(this).attr("data-value"))}),i.setValue(t),i.setActiveItem(e)}})})}}),w.define("dropdown_header",function(e){var t,n=this;e=S.extend({title:"Untitled",headerClass:"selectize-dropdown-header",titleRowClass:"selectize-dropdown-header-title",labelClass:"selectize-dropdown-header-label",closeClass:"selectize-dropdown-header-close",html:function(e){return'<div class="'+e.headerClass+'"><div class="'+e.titleRowClass+'"><span class="'+e.labelClass+'">'+e.title+'</span><a href="javascript:void(0)" class="'+e.closeClass+'">&times;</a></div></div>'}},e),n.setup=(t=n.setup,function(){t.apply(n,arguments),n.$dropdown_header=S(e.html(e)),n.$dropdown.prepend(n.$dropdown_header)})}),w.define("optgroup_columns",function(s){var o,l=this;s=S.extend({equalizeWidth:!0,equalizeHeight:!0},s),this.getAdjacentOption=function(e,t){var n=e.closest("[data-group]").find("[data-selectable]"),r=n.index(e)+t;return 0<=r&&r<n.length?n.eq(r):S()},this.onKeyDown=(o=l.onKeyDown,function(e){var t,n,r,i;return!this.isOpen||37!==e.keyCode&&39!==e.keyCode?o.apply(this,arguments):(l.ignoreHover=!0,t=(i=this.$activeOption.closest("[data-group]")).find("[data-selectable]").index(this.$activeOption),void((n=(r=(i=37===e.keyCode?i.prev("[data-group]"):i.next("[data-group]")).find("[data-selectable]")).eq(Math.min(r.length-1,t))).length&&this.setActiveOption(n)))});var u=function(){var e,t=u.width,n=document;return void 0===t&&((e=n.createElement("div")).innerHTML='<div style="width:50px;height:50px;position:absolute;left:-50px;top:-50px;overflow:auto;"><div style="width:1px;height:100px;"></div></div>',e=e.firstChild,n.body.appendChild(e),t=u.width=e.offsetWidth-e.clientWidth,n.body.removeChild(e)),t},e=function(){var e,t,n,r,i,o,a;if((t=(a=S("[data-group]",l.$dropdown_content)).length)&&l.$dropdown_content.width()){if(s.equalizeHeight){for(e=n=0;e<t;e++)n=Math.max(n,a.eq(e).height());a.css({height:n})}s.equalizeWidth&&(o=l.$dropdown_content.innerWidth()-u(),r=Math.round(o/t),a.css({width:r}),1<t&&(i=o-r*(t-1),a.eq(t-1).css({width:i})))}};(s.equalizeHeight||s.equalizeWidth)&&(t.after(this,"positionDropdown",e),t.after(this,"refreshOptions",e))}),w.define("remove_button",function(e){e=S.extend({label:"&times;",title:"Remove",className:"remove",append:!0},e);var o,t,n,r,a;"single"!==this.settings.mode?(r=o=this,a='<a href="javascript:void(0)" class="'+(t=e).className+'" tabindex="-1" title="'+s(t.title)+'">'+t.label+"</a>",o.setup=(n=r.setup,function(){if(t.append){var i=r.settings.render.item;r.settings.render.item=function(e){return t=i.apply(o,arguments),n=a,r=t.search(/(<\/[^>]+>\s*)$/),t.substring(0,r)+n+t.substring(r);var t,n,r}}n.apply(o,arguments),o.$control.on("click","."+t.className,function(e){if(e.preventDefault(),!r.isLocked){var t=S(e.currentTarget).parent();r.setActiveItem(t),r.deleteSelection()&&r.setCaret(r.items.length)}})})):function(i,t){t.className="remove-single";var n,o=i,a='<a href="javascript:void(0)" class="'+t.className+'" tabindex="-1" title="'+s(t.title)+'">'+t.label+"</a>";i.setup=(n=o.setup,function(){if(t.append){var e=S(o.$input.context).attr("id"),r=(S("#"+e),o.settings.render.item);o.settings.render.item=function(e){return t=r.apply(i,arguments),n=a,S("<span>").append(t).append(n);var t,n}}n.apply(i,arguments),i.$control.on("click","."+t.className,function(e){e.preventDefault(),o.isLocked||o.clear()})})}(this,e)}),w.define("restore_on_backspace",function(r){var i,e=this;r.text=r.text||function(e){return e[this.settings.labelField]},this.onKeyDown=(i=e.onKeyDown,function(e){var t,n;return 8===e.keyCode&&""===this.$control_input.val()&&!this.$activeItems.length&&0<=(t=this.caretPos-1)&&t<this.items.length?(n=this.options[this.items[t]],this.deleteSelection(e)&&(this.setTextboxValue(r.text.apply(this,[n])),this.refreshOptions(!0)),void e.preventDefault()):i.apply(this,arguments)})}),w}),angular.module("selectize",[]).value("selectizeConfig",{}).directive("selectize",["selectizeConfig",function(p){return{restrict:"EA",require:"^ngModel",scope:{ngModel:"=",config:"=?",options:"=?",ngDisabled:"=",ngRequired:"&"},link:function(n,e,t,r){Selectize.defaults.maxItems=null;var i,o=angular.extend({},Selectize.defaults,p,n.config);function a(e){e?i.disable():i.enable()}r.$isEmpty=function(e){return null==e||!e.length};function s(e){return e?(e=angular.isArray(e)||angular.isObject(e)?e:[e],$.map(e,function(e){return"string"==typeof e?(t=e,(n={})[o.labelField]=t,n[o.valueField]=t,n):e;var t,n})):[]}function l(){var e;e=(n.ngRequired()||t.required||o.required)&&r.$isEmpty(n.ngModel),r.$setValidity("required",!e),i.$control.toggleClass("ng-valid",r.$valid),i.$control.toggleClass("ng-invalid",r.$invalid),i.$control.toggleClass("ng-dirty",r.$dirty),i.$control.toggleClass("ng-pristine",r.$pristine),angular.equals(i.items,n.ngModel)||(i.addOption(s(n.ngModel)),i.setValue(n.ngModel))}var u=o.onChange,c=o.onOptionAdd;o.onChange=function(){n.disableOnChange||(angular.equals(i.items,n.ngModel)||n.$evalAsync(function(){var e=angular.copy(i.items);1==o.maxItems&&(e=e[0]),r.$setViewValue(e)}),u&&u.apply(this,arguments))},o.onOptionAdd=function(e,t){-1===n.options.indexOf(t)&&(n.options.push(t),c&&c.apply(this,arguments))},n.options?n.options.splice(0,n.options.length,s(n.options)):n.options=s(angular.copy(n.ngModel));var d=o.onInitialize;o.onInitialize=function(){(i=e[0].selectize).addOption(n.options),i.setValue(n.ngModel),d&&d(i),n.$watch("options",function(){n.disableOnChange=!0,i.clearOptions(),i.addOption(n.options),i.setValue(n.ngModel),n.disableOnChange=!1},!0),n.$watchCollection("ngModel",l),n.$watch("ngDisabled",a)},e.selectize(o),e.on("$destroy",function(){i&&(i.destroy(),e=null)})}}}]),function(e,t){"function"==typeof define&&define.amd?define(["jquery"],t):"undefined"!=typeof exports?t(require("jquery")):(t(e.jquery),e.bootstrapSwitch={})}(this,function(e){"use strict";var t,n=(t=e)&&t.__esModule?t:{default:t},r=Object.assign||function(e){for(var t,n=1;n<arguments.length;n++)for(var r in t=arguments[n])Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e},i=function(){function r(e,t){for(var n,r=0;r<t.length;r++)(n=t[r]).enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}return function(e,t,n){return t&&r(e.prototype,t),n&&r(e,n),e}}(),s=n.default||window.jQuery||window.$,l=function(){function t(r){var i=this,e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{};(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")})(this,t),this.$element=s(r),this.options=s.extend({},s.fn.bootstrapSwitch.defaults,this._getElementOptions(),e),this.prevOptions={},this.$wrapper=s("<div>",{class:function(){var e=[];return e.push(i.options.state?"on":"off"),i.options.size&&e.push(i.options.size),i.options.disabled&&e.push("disabled"),i.options.readonly&&e.push("readonly"),i.options.indeterminate&&e.push("indeterminate"),i.options.inverse&&e.push("inverse"),i.$element.attr("id")&&e.push("id-"+i.$element.attr("id")),e.map(i._getClass.bind(i)).concat([i.options.baseClass],i._getClasses(i.options.wrapperClass)).join(" ")}}),this.$container=s("<div>",{class:this._getClass("container")}),this.$on=s("<span>",{html:this.options.onText,class:this._getClass("handle-on")+" "+this._getClass(this.options.onColor)}),this.$off=s("<span>",{html:this.options.offText,class:this._getClass("handle-off")+" "+this._getClass(this.options.offColor)}),this.$label=s("<span>",{html:this.options.labelText,class:this._getClass("label")}),this.$element.on("init.bootstrapSwitch",this.options.onInit.bind(this,r)),this.$element.on("switchChange.bootstrapSwitch",function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];!1===i.options.onSwitchChange.apply(r,t)&&(i.$element.is(":radio")?s('[name="'+i.$element.attr("name")+'"]').trigger("previousState.bootstrapSwitch",!0):i.$element.trigger("previousState.bootstrapSwitch",!0))}),this.$container=this.$element.wrap(this.$container).parent(),this.$wrapper=this.$container.wrap(this.$wrapper).parent(),this.$element.before(this.options.inverse?this.$off:this.$on).before(this.$label).before(this.options.inverse?this.$on:this.$off),this.options.indeterminate&&this.$element.prop("indeterminate",!0),this._init(),this._elementHandlers(),this._handleHandlers(),this._labelHandlers(),this._formHandler(),this._externalLabelHandler(),this.$element.trigger("init.bootstrapSwitch",this.options.state)}return i(t,[{key:"setPrevOptions",value:function(){this.prevOptions=r({},this.options)}},{key:"state",value:function(e,t){return void 0===e?this.options.state:(this.options.disabled||this.options.readonly||this.options.state&&!this.options.radioAllOff&&this.$element.is(":radio")||(this.$element.is(":radio")?s('[name="'+this.$element.attr("name")+'"]').trigger("setPreviousOptions.bootstrapSwitch"):this.$element.trigger("setPreviousOptions.bootstrapSwitch"),this.options.indeterminate&&this.indeterminate(!1),this.$element.prop("checked",!!e).trigger("change.bootstrapSwitch",t)),this.$element)}},{key:"toggleState",value:function(e){return this.options.disabled||this.options.readonly?this.$element:this.options.indeterminate?(this.indeterminate(!1),this.state(!0)):this.$element.prop("checked",!this.options.state).trigger("change.bootstrapSwitch",e)}},{key:"size",value:function(e){return void 0===e?this.options.size:(null!=this.options.size&&this.$wrapper.removeClass(this._getClass(this.options.size)),e&&this.$wrapper.addClass(this._getClass(e)),this._width(),this._containerPosition(),this.options.size=e,this.$element)}},{key:"animate",value:function(e){return void 0===e?this.options.animate:this.options.animate===!!e?this.$element:this.toggleAnimate()}},{key:"toggleAnimate",value:function(){return this.options.animate=!this.options.animate,this.$wrapper.toggleClass(this._getClass("animate")),this.$element}},{key:"disabled",value:function(e){return void 0===e?this.options.disabled:this.options.disabled===!!e?this.$element:this.toggleDisabled()}},{key:"toggleDisabled",value:function(){return this.options.disabled=!this.options.disabled,this.$element.prop("disabled",this.options.disabled),this.$wrapper.toggleClass(this._getClass("disabled")),this.$element}},{key:"readonly",value:function(e){return void 0===e?this.options.readonly:this.options.readonly===!!e?this.$element:this.toggleReadonly()}},{key:"toggleReadonly",value:function(){return this.options.readonly=!this.options.readonly,this.$element.prop("readonly",this.options.readonly),this.$wrapper.toggleClass(this._getClass("readonly")),this.$element}},{key:"indeterminate",value:function(e){return void 0===e?this.options.indeterminate:this.options.indeterminate===!!e?this.$element:this.toggleIndeterminate()}},{key:"toggleIndeterminate",value:function(){return this.options.indeterminate=!this.options.indeterminate,this.$element.prop("indeterminate",this.options.indeterminate),this.$wrapper.toggleClass(this._getClass("indeterminate")),this._containerPosition(),this.$element}},{key:"inverse",value:function(e){return void 0===e?this.options.inverse:this.options.inverse===!!e?this.$element:this.toggleInverse()}},{key:"toggleInverse",value:function(){this.$wrapper.toggleClass(this._getClass("inverse"));var e=this.$on.clone(!0),t=this.$off.clone(!0);return this.$on.replaceWith(t),this.$off.replaceWith(e),this.$on=t,this.$off=e,this.options.inverse=!this.options.inverse,this.$element}},{key:"onColor",value:function(e){return void 0===e?this.options.onColor:(this.options.onColor&&this.$on.removeClass(this._getClass(this.options.onColor)),this.$on.addClass(this._getClass(e)),this.options.onColor=e,this.$element)}},{key:"offColor",value:function(e){return void 0===e?this.options.offColor:(this.options.offColor&&this.$off.removeClass(this._getClass(this.options.offColor)),this.$off.addClass(this._getClass(e)),this.options.offColor=e,this.$element)}},{key:"onText",value:function(e){return void 0===e?this.options.onText:(this.$on.html(e),this._width(),this._containerPosition(),this.options.onText=e,this.$element)}},{key:"offText",value:function(e){return void 0===e?this.options.offText:(this.$off.html(e),this._width(),this._containerPosition(),this.options.offText=e,this.$element)}},{key:"labelText",value:function(e){return void 0===e?this.options.labelText:(this.$label.html(e),this._width(),this.options.labelText=e,this.$element)}},{key:"handleWidth",value:function(e){return void 0===e?this.options.handleWidth:(this.options.handleWidth=e,this._width(),this._containerPosition(),this.$element)}},{key:"labelWidth",value:function(e){return void 0===e?this.options.labelWidth:(this.options.labelWidth=e,this._width(),this._containerPosition(),this.$element)}},{key:"baseClass",value:function(){return this.options.baseClass}},{key:"wrapperClass",value:function(e){return void 0===e?this.options.wrapperClass:(e||(e=s.fn.bootstrapSwitch.defaults.wrapperClass),this.$wrapper.removeClass(this._getClasses(this.options.wrapperClass).join(" ")),this.$wrapper.addClass(this._getClasses(e).join(" ")),this.options.wrapperClass=e,this.$element)}},{key:"radioAllOff",value:function(e){if(void 0===e)return this.options.radioAllOff;var t=!!e;return this.options.radioAllOff===t||(this.options.radioAllOff=t),this.$element}},{key:"onInit",value:function(e){return void 0===e?this.options.onInit:(e||(e=s.fn.bootstrapSwitch.defaults.onInit),this.options.onInit=e,this.$element)}},{key:"onSwitchChange",value:function(e){return void 0===e?this.options.onSwitchChange:(e||(e=s.fn.bootstrapSwitch.defaults.onSwitchChange),this.options.onSwitchChange=e,this.$element)}},{key:"destroy",value:function(){var e=this.$element.closest("form");return e.length&&e.off("reset.bootstrapSwitch").removeData("bootstrap-switch"),this.$container.children().not(this.$element).remove(),this.$element.unwrap().unwrap().off(".bootstrapSwitch").removeData("bootstrap-switch"),this.$element}},{key:"_getElementOptions",value:function(){return{state:this.$element.is(":checked"),size:this.$element.data("size"),animate:this.$element.data("animate"),disabled:this.$element.is(":disabled"),readonly:this.$element.is("[readonly]"),indeterminate:this.$element.data("indeterminate"),inverse:this.$element.data("inverse"),radioAllOff:this.$element.data("radio-all-off"),onColor:this.$element.data("on-color"),offColor:this.$element.data("off-color"),onText:this.$element.data("on-text"),offText:this.$element.data("off-text"),labelText:this.$element.data("label-text"),handleWidth:this.$element.data("handle-width"),labelWidth:this.$element.data("label-width"),baseClass:this.$element.data("base-class"),wrapperClass:this.$element.data("wrapper-class")}}},{key:"_width",value:function(){var n=this,e=this.$on.add(this.$off).add(this.$label).css("width",""),r="auto"===this.options.handleWidth?Math.round(Math.max(this.$on.width(),this.$off.width())):this.options.handleWidth;return e.width(r),this.$label.width(function(e,t){return"auto"===n.options.labelWidth?t<r?r:t:n.options.labelWidth}),this._handleWidth=this.$on.outerWidth(),this._labelWidth=this.$label.outerWidth(),this.$container.width(2*this._handleWidth+this._labelWidth),this.$wrapper.width(this._handleWidth+this._labelWidth)}},{key:"_containerPosition",value:function(){var t=this,n=0<arguments.length&&void 0!==arguments[0]?arguments[0]:this.options.state;arguments[1];this.$container.css("margin-left",function(){var e=[0,"-"+t._handleWidth+"px"];return t.options.indeterminate?"-"+t._handleWidth/2+"px":n?t.options.inverse?e[1]:e[0]:t.options.inverse?e[0]:e[1]})}},{key:"_init",value:function(){var e=this,t=function(){e.setPrevOptions(),e._width(),e._containerPosition(),setTimeout(function(){if(e.options.animate)return e.$wrapper.addClass(e._getClass("animate"))},50)};if(this.$wrapper.is(":visible"))t();else var n=window.setInterval(function(){if(e.$wrapper.is(":visible"))return t(),window.clearInterval(n)},50)}},{key:"_elementHandlers",value:function(){var r=this;return this.$element.on({"setPreviousOptions.bootstrapSwitch":this.setPrevOptions.bind(this),"previousState.bootstrapSwitch":function(){r.options=r.prevOptions,r.options.indeterminate&&r.$wrapper.addClass(r._getClass("indeterminate")),r.$element.prop("checked",r.options.state).trigger("change.bootstrapSwitch",!0)},"change.bootstrapSwitch":function(e,t){e.preventDefault(),e.stopImmediatePropagation();var n=r.$element.is(":checked");r._containerPosition(n),n===r.options.state||(r.options.state=n,r.$wrapper.toggleClass(r._getClass("off")).toggleClass(r._getClass("on")),!t&&(r.$element.is(":radio")&&s('[name="'+r.$element.attr("name")+'"]').not(r.$element).prop("checked",!1).trigger("change.bootstrapSwitch",!0),r.$element.trigger("switchChange.bootstrapSwitch",[n])))},"focus.bootstrapSwitch":function(e){e.preventDefault(),r.$wrapper.addClass(r._getClass("focused"))},"blur.bootstrapSwitch":function(e){e.preventDefault(),r.$wrapper.removeClass(r._getClass("focused"))},"keydown.bootstrapSwitch":function(e){!e.which||r.options.disabled||r.options.readonly||(37===e.which||39===e.which)&&(e.preventDefault(),e.stopImmediatePropagation(),r.state(39===e.which))}})}},{key:"_handleHandlers",value:function(){var t=this;return this.$on.on("click.bootstrapSwitch",function(e){return e.preventDefault(),e.stopPropagation(),t.state(!1),t.$element.trigger("focus.bootstrapSwitch")}),this.$off.on("click.bootstrapSwitch",function(e){return e.preventDefault(),e.stopPropagation(),t.state(!0),t.$element.trigger("focus.bootstrapSwitch")})}},{key:"_labelHandlers",value:function(){var n=this;this.$label.on({click:function(e){e.stopPropagation()},"mousedown.bootstrapSwitch touchstart.bootstrapSwitch":function(e){n._dragStart||n.options.disabled||n.options.readonly||(e.preventDefault(),e.stopPropagation(),n._dragStart=(e.pageX||e.originalEvent.touches[0].pageX)-parseInt(n.$container.css("margin-left"),10),n.options.animate&&n.$wrapper.removeClass(n._getClass("animate")),n.$element.trigger("focus.bootstrapSwitch"))},"mousemove.bootstrapSwitch touchmove.bootstrapSwitch":function(e){if(null!=n._dragStart){var t=(e.pageX||e.originalEvent.touches[0].pageX)-n._dragStart;e.preventDefault(),t<-n._handleWidth||0<t||(n._dragEnd=t,n.$container.css("margin-left",n._dragEnd+"px"))}},"mouseup.bootstrapSwitch touchend.bootstrapSwitch":function(e){if(n._dragStart){if(e.preventDefault(),n.options.animate&&n.$wrapper.addClass(n._getClass("animate")),n._dragEnd){var t=n._dragEnd>-n._handleWidth/2;n._dragEnd=!1,n.state(n.options.inverse?!t:t)}else n.state(!n.options.state);n._dragStart=!1}},"mouseleave.bootstrapSwitch":function(){n.$label.trigger("mouseup.bootstrapSwitch")}})}},{key:"_externalLabelHandler",value:function(){var t=this,n=this.$element.closest("label");n.on("click",function(e){e.preventDefault(),e.stopImmediatePropagation(),e.target===n[0]&&t.toggleState()})}},{key:"_formHandler",value:function(){var e=this.$element.closest("form");e.data("bootstrap-switch")||e.on("reset.bootstrapSwitch",function(){window.setTimeout(function(){e.find("input").filter(function(){return s(this).data("bootstrap-switch")}).each(function(){return s(this).bootstrapSwitch("state",this.checked)})},1)}).data("bootstrap-switch",!0)}},{key:"_getClass",value:function(e){return this.options.baseClass+"-"+e}},{key:"_getClasses",value:function(e){return s.isArray(e)?e.map(this._getClass.bind(this)):[this._getClass(e)]}}]),t}();s.fn.bootstrapSwitch=function(o){for(var e=arguments.length,a=Array(1<e?e-1:0),t=1;t<e;t++)a[t-1]=arguments[t];return Array.prototype.reduce.call(this,function(e,t){var n=s(t),r=n.data("bootstrap-switch"),i=r||new l(t,o);return r||n.data("bootstrap-switch",i),"string"==typeof o?i[o].apply(i,a):e},this)},s.fn.bootstrapSwitch.Constructor=l,s.fn.bootstrapSwitch.defaults={state:!0,size:null,animate:!0,disabled:!1,readonly:!1,indeterminate:!1,inverse:!1,radioAllOff:!1,onColor:"primary",offColor:"default",onText:"ON",offText:"OFF",labelText:"&nbsp",handleWidth:"auto",labelWidth:"auto",baseClass:"bootstrap-switch",wrapperClass:"wrapper",onInit:function(){},onSwitchChange:function(){}}}),function(e,t){"undefined"!=typeof module&&module.exports?("undefined"==typeof angular?t(require("angular")):t(angular),module.exports="ngDialog"):"function"==typeof define&&define.amd?define(["angular"],t):t(e.angular)}(this,function(O){"use strict";var e=O.module("ngDialog",[]),T=O.element,t=O.isDefined,n=(document.body||document.documentElement).style,u=t(n.animation)||t(n.WebkitAnimation)||t(n.MozAnimation)||t(n.MsAnimation)||t(n.OAnimation),c="animationend webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend",r={html:!1,body:!1},E={},A=[],P=!1,M=!1;return e.provider("ngDialog",function(){var C=this.defaults={className:"ngdialog-theme-default",appendClassName:"",disableAnimation:!1,plain:!1,showClose:!0,closeByDocument:!0,closeByEscape:!0,closeByNavigation:!1,appendTo:!1,preCloseCallback:!1,overlay:!0,cache:!0,trapFocus:!0,preserveFocus:!0,ariaAuto:!0,ariaRole:null,ariaLabelledById:null,ariaLabelledBySelector:null,ariaDescribedById:null,ariaDescribedBySelector:null,bodyClassName:"ngdialog-open",width:null,height:null};this.setForceHtmlReload=function(e){r.html=e||!1},this.setForceBodyReload=function(e){r.body=e||!1},this.setDefaults=function(e){O.extend(C,e)},this.setOpenOnePerName=function(e){M=e||!1};var S,k=0,D=0,x={};this.$get=["$document","$templateCache","$compile","$q","$http","$rootScope","$timeout","$window","$controller","$injector",function(n,o,g,a,s,m,v,y,w,l){var b=[],$={onDocumentKeydown:function(e){27===e.keyCode&&_.close("$escape")},activate:function(e){e.data("$ngDialogOptions").trapFocus&&(e.on("keydown",$.onTrapFocusKeydown),b.body.on("keydown",$.onTrapFocusKeydown))},deactivate:function(e){e.off("keydown",$.onTrapFocusKeydown),b.body.off("keydown",$.onTrapFocusKeydown)},deactivateAll:function(e){O.forEach(e,function(e){var t=O.element(e);$.deactivate(t)})},setBodyPadding:function(e){var t=parseInt(b.body.css("padding-right")||0,10);b.body.css("padding-right",t+e+"px"),b.body.data("ng-dialog-original-padding",t),m.$broadcast("ngDialog.setPadding",e)},resetBodyPadding:function(){var e=b.body.data("ng-dialog-original-padding");e?b.body.css("padding-right",e+"px"):b.body.css("padding-right",""),m.$broadcast("ngDialog.setPadding",0)},performCloseDialog:function(e,t){var n=e.data("$ngDialogOptions"),r=e.attr("id"),i=E[r];if(i){if(void 0!==y.Hammer){var o=i.hammerTime;o.off("tap",S),o.destroy&&o.destroy(),delete i.hammerTime}else e.unbind("click");1===D&&b.body.unbind("keydown",$.onDocumentKeydown),e.hasClass("ngdialog-closing")||(D-=1);var a=e.data("$ngDialogPreviousFocus");a&&a.focus&&a.focus(),m.$broadcast("ngDialog.closing",e,t),D=D<0?0:D,u&&!n.disableAnimation?(i.$destroy(),e.unbind(c).bind(c,function(){$.closeDialogElement(e,t)}).addClass("ngdialog-closing")):(i.$destroy(),$.closeDialogElement(e,t)),x[r]&&(x[r].resolve({id:r,value:t,$dialog:e,remainingDialogs:D}),delete x[r]),E[r]&&delete E[r],A.splice(A.indexOf(r),1),A.length||(b.body.unbind("keydown",$.onDocumentKeydown),P=!1)}},closeDialogElement:function(e,t){var n=e.data("$ngDialogOptions");e.remove(),0===D&&(b.html.removeClass(n.bodyClassName),b.body.removeClass(n.bodyClassName),$.resetBodyPadding()),m.$broadcast("ngDialog.closed",e,t)},closeDialog:function(e,t){var n=e.data("$ngDialogPreCloseCallback");if(n&&O.isFunction(n)){var r=n.call(e,t);if(O.isObject(r))r.closePromise?r.closePromise.then(function(){$.performCloseDialog(e,t)},function(){return!1}):r.then(function(){$.performCloseDialog(e,t)},function(){return!1});else{if(!1===r)return!1;$.performCloseDialog(e,t)}}else $.performCloseDialog(e,t)},onTrapFocusKeydown:function(e){var t,n=O.element(e.currentTarget);if(n.hasClass("ngdialog"))t=n;else if(null===(t=$.getActiveDialog()))return;var r=9===e.keyCode,i=!0===e.shiftKey;r&&$.handleTab(t,e,i)},handleTab:function(e,t,n){var r=$.getFocusableElements(e);if(0!==r.length){var i=document.activeElement,o=Array.prototype.indexOf.call(r,i),a=-1===o,s=0===o,l=o===r.length-1,u=!1;n?(a||s)&&(r[r.length-1].focus(),u=!0):(a||l)&&(r[0].focus(),u=!0),u&&(t.preventDefault(),t.stopPropagation())}else document.activeElement&&document.activeElement.blur&&document.activeElement.blur()},autoFocus:function(e){var t=e[0],n=t.querySelector("*[autofocus]");if(null===n||(n.focus(),document.activeElement!==n)){var r=$.getFocusableElements(e);if(0<r.length)r[0].focus();else{var i=$.filterVisibleElements(t.querySelectorAll("h1,h2,h3,h4,h5,h6,p,span"));if(0<i.length){var o=i[0];T(o).attr("tabindex","-1").css("outline","0"),o.focus()}}}},getFocusableElements:function(e){var t=e[0].querySelectorAll("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]"),n=$.filterTabbableElements(t);return $.filterVisibleElements(n)},filterTabbableElements:function(e){for(var t=[],n=0;n<e.length;n++){var r=e[n];"-1"!==T(r).attr("tabindex")&&t.push(r)}return t},filterVisibleElements:function(e){for(var t=[],n=0;n<e.length;n++){var r=e[n];(0<r.offsetWidth||0<r.offsetHeight)&&t.push(r)}return t},getActiveDialog:function(){var e=document.querySelectorAll(".ngdialog");return 0===e.length?null:T(e[e.length-1])},applyAriaAttributes:function(e,t){if(t.ariaAuto){if(!t.ariaRole){var n=0<$.getFocusableElements(e).length?"dialog":"alertdialog";t.ariaRole=n}t.ariaLabelledBySelector||(t.ariaLabelledBySelector="h1,h2,h3,h4,h5,h6"),t.ariaDescribedBySelector||(t.ariaDescribedBySelector="article,section,p")}t.ariaRole&&e.attr("role",t.ariaRole),$.applyAriaAttribute(e,"aria-labelledby",t.ariaLabelledById,t.ariaLabelledBySelector),$.applyAriaAttribute(e,"aria-describedby",t.ariaDescribedById,t.ariaDescribedBySelector)},applyAriaAttribute:function(e,t,n,r){if(n&&e.attr(t,n),r){var i=e.attr("id"),o=e[0].querySelector(r);if(!o)return;var a=i+"-"+t;return T(o).attr("id",a),e.attr(t,a),a}},detectUIRouter:function(){try{return O.module("ui.router"),!0}catch(e){return!1}},getRouterLocationEventName:function(){return $.detectUIRouter()?"$stateChangeStart":"$locationChangeStart"}},_={__PRIVATE__:$,open:function(e){var u=null;if(e=e||{},!(M&&e.name&&(u=e.name.toLowerCase().replace(/\s/g,"-")+"-dialog",this.isOpen(u)))){var t,c,d,p,h,f=O.copy(C),n=++k;u=u||"ngdialog"+n,A.push(u),void 0!==f.data&&(void 0===e.data&&(e.data={}),e.data=O.merge(O.copy(f.data),e.data)),O.extend(f,e),x[u]=t=a.defer(),E[u]=c=O.isObject(f.scope)?f.scope.$new():m.$new();var r=O.extend({},f.resolve);return O.forEach(r,function(e,t){r[t]=O.isString(e)?l.get(e):l.invoke(e,null,null,t)}),a.all({template:function(e){if(!e)return"Empty template";if(O.isString(e)&&f.plain)return e;return"boolean"!=typeof f.cache||f.cache?i(e,{cache:o}):i(e,{cache:!1})}(f.template||f.templateUrl),locals:a.all(r)}).then(function(e){var t=e.template,n=e.locals;f.showClose&&(t+='<div class="ngdialog-close"></div>');var r,i=f.overlay?"":" ngdialog-no-overlay";if((d=T('<div id="'+u+'" class="ngdialog'+i+'"></div>')).html(f.overlay?'<div class="ngdialog-overlay"></div><div class="ngdialog-content" role="document">'+t+"</div>":'<div class="ngdialog-content" role="document">'+t+"</div>"),d.data("$ngDialogOptions",f),c.ngDialogId=u,f.data&&O.isString(f.data)){var o=f.data.replace(/^\s*/,"")[0];c.ngDialogData="{"===o||"["===o?O.fromJson(f.data):new String(f.data),c.ngDialogData.ngDialogId=u}else f.data&&O.isObject(f.data)&&(c.ngDialogData=f.data,c.ngDialogData.ngDialogId=u);(f.className&&d.addClass(f.className),f.appendClassName&&d.addClass(f.appendClassName),f.width&&(h=d[0].querySelector(".ngdialog-content"),O.isString(f.width)?h.style.width=f.width:h.style.width=f.width+"px"),f.height&&(h=d[0].querySelector(".ngdialog-content"),O.isString(f.height)?h.style.height=f.height:h.style.height=f.height+"px"),f.disableAnimation&&d.addClass("ngdialog-disabled-animation"),p=f.appendTo&&O.isString(f.appendTo)?O.element(document.querySelector(f.appendTo)):b.body,$.applyAriaAttributes(d,f),f.preCloseCallback)&&(O.isFunction(f.preCloseCallback)?r=f.preCloseCallback:O.isString(f.preCloseCallback)&&c&&(O.isFunction(c[f.preCloseCallback])?r=c[f.preCloseCallback]:c.$parent&&O.isFunction(c.$parent[f.preCloseCallback])?r=c.$parent[f.preCloseCallback]:m&&O.isFunction(m[f.preCloseCallback])&&(r=m[f.preCloseCallback])),r&&d.data("$ngDialogPreCloseCallback",r));if(c.closeThisDialog=function(e){$.closeDialog(d,e)},f.controller&&(O.isString(f.controller)||O.isArray(f.controller)||O.isFunction(f.controller))){var a;f.controllerAs&&O.isString(f.controllerAs)&&(a=f.controllerAs);var s=w(f.controller,O.extend(n,{$scope:c,$element:d}),!0,a);f.bindToController&&O.extend(s.instance,{ngDialogId:c.ngDialogId,ngDialogData:c.ngDialogData,closeThisDialog:c.closeThisDialog,confirm:c.confirm}),"function"==typeof s?d.data("$ngDialogControllerController",s()):d.data("$ngDialogControllerController",s)}if(v(function(){var e=document.querySelectorAll(".ngdialog");$.deactivateAll(e),g(d)(c);var t=y.innerWidth-b.body.prop("clientWidth");b.html.addClass(f.bodyClassName),b.body.addClass(f.bodyClassName);var n=t-(y.innerWidth-b.body.prop("clientWidth"));0<n&&$.setBodyPadding(n),p.append(d),$.activate(d),f.trapFocus&&$.autoFocus(d),f.name?m.$broadcast("ngDialog.opened",{dialog:d,name:f.name}):m.$broadcast("ngDialog.opened",d)}),P||(b.body.bind("keydown",$.onDocumentKeydown),P=!0),f.closeByNavigation){var l=$.getRouterLocationEventName();m.$on(l,function(e){!1===$.closeDialog(d)&&e.preventDefault()})}(f.preserveFocus&&d.data("$ngDialogPreviousFocus",document.activeElement),S=function(e){var t=!!f.closeByDocument&&T(e.target).hasClass("ngdialog-overlay"),n=T(e.target).hasClass("ngdialog-close");(t||n)&&_.close(d.attr("id"),n?"$closeButton":"$document")},void 0!==y.Hammer)?(c.hammerTime=y.Hammer(d[0])).on("tap",S):d.bind("click",S);return D+=1,_}),{id:u,closePromise:t.promise,close:function(e){$.closeDialog(d,e)}}}function i(t,e){return(e=e||{}).headers=e.headers||{},O.extend(e.headers,{Accept:"text/html"}),m.$broadcast("ngDialog.templateLoading",t),s.get(t,e).then(function(e){return m.$broadcast("ngDialog.templateLoaded",t),e.data||""})}},openConfirm:function(e){var n=a.defer(),t=O.copy(C);e=e||{},void 0!==t.data&&(void 0===e.data&&(e.data={}),e.data=O.merge(O.copy(t.data),e.data)),O.extend(t,e),t.scope=O.isObject(t.scope)?t.scope.$new():m.$new(),t.scope.confirm=function(e){n.resolve(e);var t=T(document.getElementById(r.id));$.performCloseDialog(t,e)};var r=_.open(t);if(r)return r.closePromise.then(function(e){return e?n.reject(e.value):n.reject()}),n.promise},isOpen:function(e){return 0<T(document.getElementById(e)).length},close:function(e,t){var n=T(document.getElementById(e));if(n.length)$.closeDialog(n,t);else if("$escape"===e){var r=A[A.length-1];(n=T(document.getElementById(r))).data("$ngDialogOptions").closeByEscape&&$.closeDialog(n,"$escape")}else _.closeAll(t);return _},closeAll:function(e){for(var t=document.querySelectorAll(".ngdialog"),n=t.length-1;0<=n;n--){var r=t[n];$.closeDialog(T(r),e)}},getOpenDialogs:function(){return A},getDefaults:function(){return C}};return O.forEach(["html","body"],function(e){if(b[e]=n.find(e),r[e]){var t=$.getRouterLocationEventName();m.$on(t,function(){b[e]=n.find(e)})}}),_}]}),e.directive("ngDialog",["ngDialog",function(o){return{restrict:"A",scope:{ngDialogScope:"="},link:function(r,e,i){e.on("click",function(e){e.preventDefault();var t=O.isDefined(r.ngDialogScope)?r.ngDialogScope:"noScope";O.isDefined(i.ngDialogClosePrevious)&&o.close(i.ngDialogClosePrevious);var n=o.getDefaults();o.open({template:i.ngDialog,className:i.ngDialogClass||n.className,appendClassName:i.ngDialogAppendClass,controller:i.ngDialogController,controllerAs:i.ngDialogControllerAs,bindToController:i.ngDialogBindToController,disableAnimation:i.ngDialogDisableAnimation,scope:t,data:i.ngDialogData,showClose:"false"!==i.ngDialogShowClose&&("true"===i.ngDialogShowClose||n.showClose),closeByDocument:"false"!==i.ngDialogCloseByDocument&&("true"===i.ngDialogCloseByDocument||n.closeByDocument),closeByEscape:"false"!==i.ngDialogCloseByEscape&&("true"===i.ngDialogCloseByEscape||n.closeByEscape),overlay:"false"!==i.ngDialogOverlay&&("true"===i.ngDialogOverlay||n.overlay),preCloseCallback:i.ngDialogPreCloseCallback||n.preCloseCallback,bodyClassName:i.ngDialogBodyClass||n.bodyClassName})})}}}]),e}),angular.module("ui-notification",[]),angular.module("ui-notification").provider("Notification",function(){this.options={delay:5e3,startTop:10,startRight:10,verticalSpacing:10,horizontalSpacing:10,positionX:"right",positionY:"top",replaceMessage:!1,templateUrl:"angular-ui-notification.html",onClose:void 0,closeOnClick:!0,maxCount:0,container:"body",priority:10},this.setOptions=function(e){if(!angular.isObject(e))throw new Error("Options should be an object!");this.options=angular.extend({},this.options,e)},this.$get=["$timeout","$http","$compile","$templateCache","$rootScope","$injector","$sce","$q","$window",function(u,r,c,i,o,e,f,a,g){var m=this.options,v=m.startTop,y=m.startRight,w=m.verticalSpacing,b=m.horizontalSpacing,s=m.delay,$=[],_=!1,t=function(h,e){function t(e){function t(t){["-webkit-transition","-o-transition","transition"].forEach(function(e){i.css(e,t)})}var n=h.scope.$new();n.message=f.trustAsHtml(h.message),n.title=f.trustAsHtml(h.title),n.t=h.type.substr(0,1),n.delay=h.delay,n.onClose=h.onClose;var d=function(e,t){return e._priority-t._priority},p=function(e,t){return t._priority-e._priority},r=function(){var e=0,t=0,n=y,r=[];"top"===h.positionY?$.sort(d):"bottom"===h.positionY&&$.sort(p);for(var i=$.length-1;0<=i;i--){var o=$[i];if(h.replaceMessage&&i<$.length-1)o.addClass("killed");else{var a=parseInt(o[0].offsetHeight),s=parseInt(o[0].offsetWidth),l=r[o._positionY+o._positionX];u+a>window.innerHeight&&(l=v,t++,e=0);var u=l?0===e?l:l+w:v,c=n+t*(b+s);o.css(o._positionY,u+"px"),"center"==o._positionX?o.css("left",parseInt(window.innerWidth/2-s/2)+"px"):o.css(o._positionX,c+"px"),r[o._positionY+o._positionX]=u+a,0<m.maxCount&&$.length>m.maxCount&&0===i&&o.scope().kill(!0),e++}}},i=c(e)(n);i._positionY=h.positionY,i._positionX=h.positionX,i._priority=h.priority,i.addClass(h.type);var o=function(e){("click"===(e=e.originalEvent||e).type||"opacity"===e.propertyName&&1<=e.elapsedTime)&&(n.onClose&&n.$apply(n.onClose(i)),i.remove(),$.splice($.indexOf(i),1),n.$destroy(),r())};h.closeOnClick&&(i.addClass("clickable"),i.bind("click",o)),i.bind("webkitTransitionEnd oTransitionEnd otransitionend transitionend msTransitionEnd",o),angular.isNumber(h.delay)&&u(function(){i.addClass("killed")},h.delay),t("none"),angular.element(document.querySelector(h.container)).append(i);var a=-(parseInt(i[0].offsetHeight)+50);if(i.css(i._positionY,a+"px"),$.push(i),"center"==h.positionX){var s=parseInt(i[0].offsetWidth);i.css("left",parseInt(window.innerWidth/2-s/2)+"px")}u(function(){t("")}),n._templateElement=i,n.kill=function(e){e?(n.onClose&&n.$apply(n.onClose(n._templateElement)),$.splice($.indexOf(n._templateElement),1),n._templateElement.remove(),n.$destroy(),u(r)):n._templateElement.addClass("killed")},u(r),_||(angular.element(g).bind("resize",function(e){u(r)}),_=!0),l.resolve(n)}var l=a.defer();"object"==typeof h&&null!==h||(h={message:h}),h.scope=h.scope?h.scope:o,h.template=h.templateUrl?h.templateUrl:m.templateUrl,h.delay=angular.isUndefined(h.delay)?s:h.delay,h.type=e||h.type||m.type||"",h.positionY=h.positionY?h.positionY:m.positionY,h.positionX=h.positionX?h.positionX:m.positionX,h.replaceMessage=h.replaceMessage?h.replaceMessage:m.replaceMessage,h.onClose=h.onClose?h.onClose:m.onClose,h.closeOnClick=null!==h.closeOnClick&&void 0!==h.closeOnClick?h.closeOnClick:m.closeOnClick,h.container=h.container?h.container:m.container,h.priority=h.priority?h.priority:m.priority;var n=i.get(h.template);return n?t(n):r.get(h.template,{cache:!0}).then(function(e){t(e.data)}).catch(function(e){throw new Error("Template ("+h.template+") could not be loaded. "+e)}),l.promise};return t.primary=function(e){return this(e,"primary")},t.error=function(e){return this(e,"error")},t.success=function(e){return this(e,"success")},t.info=function(e){return this(e,"info")},t.warning=function(e){return this(e,"warning")},t.clearAll=function(){angular.forEach($,function(e){e.addClass("killed")})},t}]}),angular.module("ui-notification").run(["$templateCache",function(e){e.put("angular-ui-notification.html",'<div class="ui-notification"><h3 ng-show="title" ng-bind-html="title"></h3><div class="message" ng-bind-html="message"></div></div>')}]),function(){var w="__default";angular.module("angularUtils.directives.dirPagination",[]).directive("dirPaginate",["$compile","$parse","paginationService",function(m,v,y){return{terminal:!0,multiElement:!0,priority:100,compile:function(e,t){var f=t.dirPaginate,n=f.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/),r=/\|\s*itemsPerPage\s*:\s*(.*\(\s*\w*\)|([^\)]*?(?=\s+as\s+))|[^\)]*)/;if(null===n[2].match(r))throw"pagination directive: the 'itemsPerPage' filter must be set.";var i=n[2].replace(r,""),g=v(i);o=e,angular.forEach(o,function(e){1===e.nodeType&&angular.element(e).attr("dir-paginate-no-compile",!0)});var o;var a=t.paginationId||w;return y.registerInstance(a),function(e,t,n){var r=v(n.paginationId)(e)||n.paginationId||w;y.registerInstance(r);var i,o,a,s,l,u,c,d=(u=r,c=!!(l=f).match(/(\|\s*itemsPerPage\s*:[^|]*:[^|]*)/),u===w||c?l:l.replace(/(\|\s*itemsPerPage\s*:\s*[^|\s]*)/,"$1 : '"+u+"'"));o=n,a=d,(i=t)[0].hasAttribute("dir-paginate-start")||i[0].hasAttribute("data-dir-paginate-start")?(o.$set("ngRepeatStart",a),i.eq(i.length-1).attr("ng-repeat-end",!0)):o.$set("ngRepeat",a),s=t,angular.forEach(s,function(e){1===e.nodeType&&angular.element(e).removeAttr("dir-paginate-no-compile")}),s.eq(0).removeAttr("dir-paginate-start").removeAttr("dir-paginate").removeAttr("data-dir-paginate-start").removeAttr("data-dir-paginate"),s.eq(s.length-1).removeAttr("dir-paginate-end").removeAttr("data-dir-paginate-end");var p=m(t),h=function(e,t,n){var r;if(t.currentPage)r=v(t.currentPage);else{var i=(n+"__currentPage").replace(/\W/g,"_");e[i]=1,r=v(i)}return r}(e,n,r);y.setCurrentPageParser(r,h,e),void 0!==n.totalItems?(y.setAsyncModeTrue(r),e.$watch(function(){return v(n.totalItems)(e)},function(e){0<=e&&y.setCollectionLength(r,e)})):(y.setAsyncModeFalse(r),e.$watchCollection(function(){return g(e)},function(e){if(e){var t=e instanceof Array?e.length:Object.keys(e).length;y.setCollectionLength(r,t)}})),p(e)}}}}]).directive("dirPaginateNoCompile",function(){return{priority:5e3,terminal:!0}}).directive("dirPaginationControls",["paginationService","paginationTemplate",function(d,n){var p=/^\d+$/,e={restrict:"AE",scope:{maxSize:"=?",onPageChange:"&?",paginationId:"=?",autoHide:"=?"},link:function(r,e,t){var n=t.paginationId||w,i=r.paginationId||t.paginationId||w;if(!d.isRegistered(i)&&!d.isRegistered(n)){var o=i!==w?" (id: "+i+") ":" ";window.console&&console.warn("Pagination directive: the pagination controls"+o+"cannot be used without the corresponding pagination directive, which was not found at link time.")}r.maxSize||(r.maxSize=9);r.autoHide=void 0===r.autoHide||r.autoHide,r.directionLinks=!angular.isDefined(t.directionLinks)||r.$parent.$eval(t.directionLinks),r.boundaryLinks=!!angular.isDefined(t.boundaryLinks)&&r.$parent.$eval(t.boundaryLinks);var a=Math.max(r.maxSize,5);function s(e){if(d.isRegistered(i)&&c(e)){var t=r.pagination.current;r.pages=h(e,d.getCollectionLength(i),d.getItemsPerPage(i),a),r.pagination.current=e,u(),r.onPageChange&&r.onPageChange({newPageNumber:e,oldPageNumber:t})}}function l(){if(d.isRegistered(i)){var e=parseInt(d.getCurrentPage(i))||1;r.pages=h(e,d.getCollectionLength(i),d.getItemsPerPage(i),a),r.pagination.current=e,r.pagination.last=r.pages[r.pages.length-1],r.pagination.last<r.pagination.current?r.setCurrent(r.pagination.last):u()}}function u(){if(d.isRegistered(i)){var e=d.getCurrentPage(i),t=d.getItemsPerPage(i),n=d.getCollectionLength(i);r.range.lower=(e-1)*t+1,r.range.upper=Math.min(e*t,n),r.range.total=n}}function c(e){return p.test(e)&&0<e&&e<=r.pagination.last}r.pages=[],r.pagination={last:1,current:1},r.range={lower:1,upper:1,total:1},r.$watch("maxSize",function(e){e&&(a=Math.max(r.maxSize,5),l())}),r.$watch(function(){if(d.isRegistered(i))return(d.getCollectionLength(i)+1)*d.getItemsPerPage(i)},function(e){0<e&&l()}),r.$watch(function(){if(d.isRegistered(i))return d.getItemsPerPage(i)},function(e,t){e!=t&&void 0!==t&&s(r.pagination.current)}),r.$watch(function(){if(d.isRegistered(i))return d.getCurrentPage(i)},function(e,t){e!=t&&s(e)}),r.setCurrent=function(e){d.isRegistered(i)&&c(e)&&(e=parseInt(e,10),d.setCurrentPage(i,e))},r.tracker=function(e,t){return e+"_"+t}}},t=n.getString();void 0!==t?e.template=t:e.templateUrl=function(e,t){return t.templateUrl||n.getPath()};return e;function h(e,t,n,r){var i,o=[],a=Math.ceil(t/n),s=Math.ceil(r/2);i=e<=s?"start":a-s<e?"end":"middle";for(var l=r<a,u=1;u<=a&&u<=r;){var c=f(u,e,r,a),d=2===u&&("middle"===i||"end"===i),p=u===r-1&&("middle"===i||"start"===i);l&&(d||p)?o.push("..."):o.push(c),u++}return o}function f(e,t,n,r){var i=Math.ceil(n/2);return e===n?r:1===e?e:n<r?r-i<t?r-n+e:i<t?t-i+e:e:e}}]).filter("itemsPerPage",["paginationService",function(a){return function(t,e,n){if(void 0===n&&(n=w),!a.isRegistered(n))throw"pagination directive: the itemsPerPage id argument (id: "+n+") does not match a registered pagination-id.";var r,i;if(angular.isObject(t)){if(e=parseInt(e)||9999999999,i=a.isAsyncMode(n)?0:(a.getCurrentPage(n)-1)*e,r=i+e,a.setItemsPerPage(n,e),t instanceof Array)return t.slice(i,r);var o={};return angular.forEach(function(e){{if(Object.keys)return Object.keys(e);var t=[];for(var n in e)e.hasOwnProperty(n)&&t.push(n);return t}}(t).slice(i,r),function(e){o[e]=t[e]}),o}return t}}]).service("paginationService",function(){var t,r={};this.registerInstance=function(e){void 0===r[e]&&(r[e]={asyncMode:!1},t=e)},this.deregisterInstance=function(e){delete r[e]},this.isRegistered=function(e){return void 0!==r[e]},this.getLastInstanceId=function(){return t},this.setCurrentPageParser=function(e,t,n){r[e].currentPageParser=t,r[e].context=n},this.setCurrentPage=function(e,t){r[e].currentPageParser.assign(r[e].context,t)},this.getCurrentPage=function(e){var t=r[e].currentPageParser;return t?t(r[e].context):1},this.setItemsPerPage=function(e,t){r[e].itemsPerPage=t},this.getItemsPerPage=function(e){return r[e].itemsPerPage},this.setCollectionLength=function(e,t){r[e].collectionLength=t},this.getCollectionLength=function(e){return r[e].collectionLength},this.setAsyncModeTrue=function(e){r[e].asyncMode=!0},this.setAsyncModeFalse=function(e){r[e].asyncMode=!1},this.isAsyncMode=function(e){return r[e].asyncMode}}).provider("paginationTemplate",function(){var t,n="angularUtils.directives.dirPagination.template";this.setPath=function(e){n=e},this.setString=function(e){t=e},this.$get=function(){return{getPath:function(){return n},getString:function(){return t}}}}).run(["$templateCache",function(e){e.put("angularUtils.directives.dirPagination.template",'<ul class="pagination" ng-if="1 < pages.length || !autoHide"><li ng-if="boundaryLinks" ng-class="{ disabled : pagination.current == 1 }"><a href="" ng-click="setCurrent(1)">&laquo;</a></li><li ng-if="directionLinks" ng-class="{ disabled : pagination.current == 1 }"><a href="" ng-click="setCurrent(pagination.current - 1)">&lsaquo;</a></li><li ng-repeat="pageNumber in pages track by tracker(pageNumber, $index)" ng-class="{ active : pagination.current == pageNumber, disabled : pageNumber == \'...\' || ( ! autoHide && pages.length === 1 ) }"><a href="" ng-click="setCurrent(pageNumber)">{{ pageNumber }}</a></li><li ng-if="directionLinks" ng-class="{ disabled : pagination.current == pagination.last }"><a href="" ng-click="setCurrent(pagination.current + 1)">&rsaquo;</a></li><li ng-if="boundaryLinks"  ng-class="{ disabled : pagination.current == pagination.last }"><a href="" ng-click="setCurrent(pagination.last)">&raquo;</a></li></ul>')}])}();var com_github_culmat_jsTreeTable=function(){function l(e,r,i){return i=i||"children",$.each(e,function(e,t){!function n(e){e[i]&&$.each(e[i],function(e,t){n(t)}),r(e)}(t)}),e}function t(e,n,o,a){var t=e;n=n||"id",o=o||"parent",a=a||"children";var s=[];$.each(t,function(e,t){s[t[n]]=t});var l=[];return $.each(t,function(e,r){var t=r[o];if($.isArray(t)||(t=[t]),0==t.length)l.push(r);else{var i=!1;$.each(t,function(e,t){var n=s[t];n&&(n[a]||(n[a]=[]),$.inArray(r,n[a])<0&&n[a].push(r),i=!0)}),i||l.push(r)}}),l}function u(e,u,c,d,p,t){u=u||"children",c=c||"id",t=t||{};var n=0,r=$("<table>");$.each(t,function(e,t){"class"==e&&"jsTT"!=t?r.addClass(t):r.attr(e,t)});var i=$("<thead>"),o=$("<tr>"),h=$("<tbody>");return r.append(i),i.append(o),r.append(h),d?$.each(d,function(e,t){$(o).append($("<th>"+t+"</th>"))}):($(o).append($("<th>"+c+"</th>")),$.each(e[0],function(e,t){e!=u&&e!=c&&$(o).append($("<th>"+e+"</th>"))})),function o(e,a,s,l){n=Math.max(n,s),$.each(e,function(e,n){var r,t,i;n["data-tt-level"]=s,r=n,t=l,i=$("<tr>"),$(i).attr("data-tt-id",r[c]),$(i).attr("data-tt-level",r["data-tt-level"]),r[u]&&0!=r[u].length?$(i).attr("data-tt-isnode",!0):$(i).attr("data-tt-isleaf",!0),t&&$(i).attr("data-tt-parent-id",t[c]),p?p($(i),r):d?$.each(d,function(e,t){$(i).append($("<td>"+r[e]+"</td>"))}):($(i).append($("<td>"+r[c]+"</td>")),$.each(r,function(e,t){e!=u&&e!=c&&"data-tt-level"!=e&&$(i).append($("<td>"+t+"</td>"))})),h.append(i),n[a]&&$.each(n[a],function(e,t){o([t],a,s+1,n)})})}(e,u,1),e[0]&&(e[0].maxLevel=n),r}function n(e,t){return $.each(e,function(e,n){$.each(t,function(e,t){n[t]=$(n).attr(t)})}),e}function c(i){i.addClass("jsTT"),i.expandLevel=function(n){$("tr[data-tt-level]",i).each(function(e){var t=parseInt($(this).attr("data-tt-level"));n-1<t?this.trCollapse(!0):t==n-1&&this.trExpand(!0)})},$("tr[data-tt-id]",i).each(function(e,t){(t=$(t)).attr("data-tt-level",function e(t){var n=t.attr("data-tt-level");if(null!=n)return parseInt(n);var r=t.attr("data-tt-parent-id");return null==r?0:e($('tr[data-tt-id="'+r+'"]',i).first())+1}(t))});var e=$("tr[data-tt-level]",i).get();$.each(e,function(e,t){t.trChildrenVisible=!0,t.trChildren=[]}),e=t(e=n(e,["data-tt-id","data-tt-parent-id"]),"data-tt-id","data-tt-parent-id","trChildren");var o="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAHFJREFUeNpi/P//PwMlgImBQsA44C6gvhfa29v3MzAwOODRc6CystIRbxi0t7fjDJjKykpGYrwwi1hxnLHQ3t7+jIGBQRJJ6HllZaUUKYEYRYBPOB0gBShKwKGA////48VtbW3/8clTnBIH3gCKkzJgAGvBX0dDm0sCAAAAAElFTkSuQmCC";return $("tr[data-tt-level]",i).each(function(e,t){var n=$(t).attr("data-tt-level"),r=$("td",t).first();0<t.trChildren.length?r.prepend($('<img id="state" style="cursor:pointer" src="'+o+'"/>')):r.prepend($('<span style="padding-left:16px;" /></span>')),r.prepend($('<span style="padding-left:'+15*parseInt(n-1)+'px;" /></span>')),t.trExpand=function(e){if(!(this.trChildren.length<1)){e&&(this.trChildrenVisible=!0,$("#state",this).get(0).src=o);var n=e||this.trChildrenVisible;$.each(this.trChildren,function(e,t){n&&$(t).css("display","table-row"),t.trExpand()})}},t.trCollapse=function(e){this.trChildren.length<1||(e&&(this.trChildrenVisible=!1,$("#state",this).get(0).src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAHlJREFUeNrcU1sNgDAQ6wgmcAM2MICGGlg1gJnNzWQcvwQGy1j4oUl/7tH0mpwzM7SgQyO+EZAUWh2MkkzSWhJwuRAlHYsJwEwyvs1gABDuzqoJcTw5qxaIJN0bgQRgIjnlmn1heSO5PE6Y2YXe+5Cr5+h++gs12AcAS6FS+7YOsj4AAAAASUVORK5CYII="),$.each(this.trChildren,function(e,t){$(t).css("display","none"),t.trCollapse()}))},$(t).click(function(){this.trChildrenVisible?this.trCollapse(!0):this.trExpand(!0)})}),i}return{depthFirst:l,makeTree:t,renderTree:u,attr2attr:n,treeTable:c,appendTreetable:function(e,t){(t=t||{}).idAttr=t.idAttr||"id",t.childrenAttr=t.childrenAttr||"children";var n=t.controls||[];t.mountPoint||(t.mountPoint=$("body")),t.depthFirst&&l(e,t.depthFirst,t.childrenAttr);var r=u(e,t.childrenAttr,t.idAttr,t.renderedAttr,t.renderer,t.tableAttributes);c(r),t.replaceContent&&t.mountPoint.html("");var i,o,a=t.initialExpandLevel?parseInt(t.initialExpandLevel):-1;if(a=Math.min(a,e[0].maxLevel),r.expandLevel(a),t.slider){var s=$('<div style="margin-right: 15px;">');s.width("200px"),s.slider({min:1,max:e[0].maxLevel,range:"min",value:a,slide:function(e,t){r.expandLevel(t.value)}}),n=[s].concat(t.controls)}return 0<n.length&&t.mountPoint.append((i=n,o=$("<tr>"),$.each(i,function(e,t){o.append($('<td style="padding-right: 20px;">').append(t))}),$('<table border="0"/>').append(o))),t.mountPoint.append(r),r},jsTreeTable:"1.0",register:function(n){$.each(this,function(e,t){"register"!=e&&(n[e]=t)})}}}();
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/gulpfile.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/gulpfile.js
new file mode 100644
index 0000000..06ea3fc
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/gulpfile.js
@@ -0,0 +1,134 @@
+const gulp = require('gulp');
+const plugins = require('gulp-load-plugins')();
+const open = require('open');
+const app = {
+  srcPath: 'app/', // 婧愪唬鐮�
+  devPath: 'tmp/', // 寮�鍙戞墦鍖�
+  prdPath: 'dist/' // 鐢熶骇鎵撳寘
+};
+
+const JS_LIBS = [
+  'node_modules/angular-ui-router/release/angular-ui-router.js',
+  'node_modules/oclazyload/dist/ocLazyLoad.min.js',
+  'node_modules/angular-loading-bar/build/loading-bar.min.js',
+  'node_modules/angular-bootstrap/ui-bootstrap-tpls.min.js',
+  'node_modules/moment/moment.js',
+  'node_modules/angular-date-time-input/src/dateTimeInput.js',
+  'node_modules/angularjs-bootstrap-datetimepicker/src/js/datetimepicker.js',
+  'node_modules/angular-table-resize/dist/angular-table-resize.min.js',
+  'node_modules/angular-clipboard/angular-clipboard.js',
+  'node_modules/selectize/dist/js/standalone/selectize.js',
+  'node_modules/angular-selectize2/dist/selectize.js',
+  'node_modules/bootstrap-switch/dist/js/bootstrap-switch.min.js',
+  'node_modules/ng-dialog/js/ngDialog.js',
+  'node_modules/angular-ui-notification/dist/angular-ui-notification.min.js',
+  'node_modules/angular-utils-pagination/dirPagination.js',
+  'app/scripts/libs/treeTable.js',
+];
+
+const CSS_APP = [
+  'node_modules/angular-loading-bar/build/loading-bar.min.css',
+  'node_modules/bootstrap-switch/dist/css/bootstrap3/bootstrap-switch.css',
+  'node_modules/ng-dialog/css/ngDialog.min.css',
+  'node_modules/ng-dialog/css/ngDialog-theme-default.css',
+  'node_modules/angularjs-bootstrap-datetimepicker/src/css/datetimepicker.css',
+  'node_modules/angular-ui-notification/dist/angular-ui-notification.min.css',
+  'node_modules/angular-table-resize/dist/angular-table-resize.css',
+  'node_modules/selectize/dist/css/selectize.css',
+  'app/styles/page.css',
+  'app/styles/timeline.css',
+  'app/styles/main.css'
+];
+
+const JS_APP = [
+  'app/scripts/app.js',
+  'app/scripts/filters/filters.js',
+  'app/scripts/services/version_service.js',
+  'app/scripts/services/auth_service.js',
+  'app/scripts/services/appservice.js',
+  'app/scripts/services/flow_service_v1.js',
+  'app/scripts/services/flow_service_v2.js',
+  'app/scripts/services/degrade_service.js',
+  'app/scripts/services/systemservice.js',
+  'app/scripts/services/machineservice.js',
+  'app/scripts/services/identityservice.js',
+  'app/scripts/services/metricservice.js',
+  'app/scripts/services/param_flow_service.js',
+  'app/scripts/services/authority_service.js',
+  'app/scripts/services/cluster_state_service.js',
+  'app/scripts/services/gateway/api_service.js',
+  'app/scripts/services/gateway/flow_service.js',
+];
+
+gulp.task('lib', function () {
+  gulp.src(JS_LIBS)
+    .pipe(plugins.concat('app.vendor.js'))
+    .pipe(gulp.dest(app.devPath + 'js'))
+    .pipe(plugins.uglify())
+    .pipe(gulp.dest(app.prdPath + 'js'))
+    .pipe(plugins.connect.reload());
+});
+
+/*
+* css浠诲姟
+* 鍦╯rc涓嬪垱寤簊tyle鏂囦欢澶癸紝閲岄潰瀛樻斁less鏂囦欢銆� 
+*/
+gulp.task('css', function () {
+  gulp.src(CSS_APP)
+    .pipe(plugins.concat('app.css'))
+    .pipe(gulp.dest(app.devPath + 'css'))
+    .pipe(plugins.cssmin())
+    .pipe(gulp.dest(app.prdPath + 'css'))
+    .pipe(plugins.connect.reload());
+});
+
+/*
+* js浠诲姟
+* 鍦╯rc鐩綍涓嬪垱寤簊cript鏂囦欢澶癸紝閲岄潰瀛樻斁鎵�鏈夌殑js鏂囦欢
+*/
+gulp.task('js', function () {
+  gulp.src(JS_APP)
+    .pipe(plugins.concat('app.js'))
+    .pipe(gulp.dest(app.devPath + 'js'))
+    .pipe(plugins.uglify())
+    .pipe(gulp.dest(app.prdPath + 'js'))
+    .pipe(plugins.connect.reload());
+});
+
+/*
+* js浠诲姟
+* 鍦╯rc鐩綍涓嬪垱寤簊cript鏂囦欢澶癸紝閲岄潰瀛樻斁鎵�鏈夌殑js鏂囦欢
+*/
+gulp.task('jshint', function () {
+  gulp.src(JS_APP)
+    .pipe(plugins.jshint())
+    .pipe(plugins.jshint.reporter());
+});
+
+// 姣忔鍙戝竷鐨勬椂鍊欙紝鍙兘闇�瑕佹妸涔嬪墠鐩綍鍐呯殑鍐呭娓呴櫎锛岄伩鍏嶆棫鐨勬枃浠跺鏂扮殑瀹规湁鎵�褰卞搷銆� 闇�瑕佸湪姣忔鍙戝竷鍓嶅垹闄ist鍜宐uild鐩綍
+gulp.task('clean', function () {
+  gulp.src([app.devPath, app.prdPath])
+    .pipe(plugins.clean());
+});
+
+// 鎬讳换鍔�
+gulp.task('build', ['clean', 'jshint', 'lib', 'js', 'css']);
+
+// 鏈嶅姟
+gulp.task('serve', ['build'], function () {
+  plugins.connect.server({ //鍚姩涓�涓湇鍔″櫒
+    root: [app.devPath], // 鏈嶅姟鍣ㄤ粠鍝釜璺緞寮�濮嬭鍙栵紝榛樿浠庡紑鍙戣矾寰勮鍙�
+    livereload: true, // 鑷姩鍒锋柊
+    port: 1234
+  });
+  // 鎵撳紑娴忚鍣�
+  setTimeout(() => {
+    open('http://localhost:8080/index_dev.htm')
+  }, 200);
+  // 鐩戝惉
+  gulp.watch(app.srcPath + '**/*.js', ['js']);
+  gulp.watch(app.srcPath + '**/*.css', ['css']);
+});
+
+// 瀹氫箟default浠诲姟
+gulp.task('default', ['serve']);
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/index.htm b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/index.htm
new file mode 100644
index 0000000..268ab10
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/index.htm
@@ -0,0 +1,30 @@
+<!doctype html>
+<html class="no-js">
+
+<head>
+  <meta charset="utf-8">
+  <title>Sentinel Dashboard</title>
+  <meta name="description" content="Sentinel 鎺у埗鍙�,Sentinel Dashboard,Admin">
+  <meta name="viewport" content="width=device-width">
+
+  <link rel="stylesheet" href="./lib/css/bootstrap.min.css" />
+  <link rel="stylesheet" href="./lib/css/font-awesome.min.css">
+  <link rel="stylesheet" href="./dist/css/app.css">
+  <link rel="icon" type="image/x-icon" href="./static/favicon.ico">
+  <base href="./">
+</head>
+
+<body>
+  <div ng-app="sentinelDashboardApp">
+    <div ui-view></div>
+  </div>
+  <script src="./lib/js/jquery.min.js"></script>
+  <script src="./lib/js/bootstrap.min.js"></script>
+  <script src="./lib/js/angular.min.js"></script>
+  <script src="./lib/js/g2.min.js"></script>
+
+  <script src="./dist/js/app.vendor.js"></script>
+  <script src="./dist/js/app.js"></script>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/index_dev.htm b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/index_dev.htm
new file mode 100644
index 0000000..008fcfb
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/index_dev.htm
@@ -0,0 +1,30 @@
+<!doctype html>
+<html class="no-js">
+
+<head>
+  <meta charset="utf-8">
+  <title>Sentinel 鎺у埗鍙�</title>
+  <meta name="description" content="Sentinel 鎺у埗鍙�,Dashboard,Admin">
+  <meta name="viewport" content="width=device-width">
+
+  <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.0.3/css/bootstrap.min.css" />
+  <link rel="stylesheet" href="//cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css">
+  <link rel="stylesheet" href="http://localhost:1234/css/app.css">
+  <link rel="icon" type="image/x-icon" href="./static/favicon.ico">
+  <base href="./">
+</head>
+
+<body>
+  <div ng-app="sentinelDashboardApp">
+    <div ui-view></div>
+  </div>
+  <script src="//cdn.bootcss.com/jquery/2.1.4/jquery.min.js"></script>
+  <script src="//cdn.bootcss.com/bootstrap/3.0.3/js/bootstrap.min.js"></script>
+  <script src="//cdn.bootcss.com/angular.js/1.4.8/angular.js"></script>
+  <script src="//gw.alipayobjects.com/os/antv/pkg/_antv.g2-3.4.10/dist/g2.min.js"></script>
+
+  <script src="http://localhost:1234/js/app.vendor.js"></script>
+  <script src="http://localhost:1234/js/app.js"></script>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/css/bootstrap.min.css b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/css/bootstrap.min.css
new file mode 100644
index 0000000..c547283
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/css/bootstrap.min.css
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.0.3 (http://getbootstrap.com)
+ * Copyright 2013 Twitter, Inc.
+ * Licensed under http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+/*! normalize.css v2.1.3 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a{background:transparent}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{margin:.67em 0;font-size:2em}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}mark{color:#000;background:#ff0}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid #c0c0c0}legend{padding:0;border:0}button,input,select,textarea{margin:0;font-family:inherit;font-size:100%}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{padding:0;box-sizing:border-box}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:2cm .5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}img{vertical-align:middle}.img-responsive{display:block;height:auto;max-width:100%}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{margin-top:20px;margin-bottom:10px}h1 small,h2 small,h3 small,h1 .small,h2 .small,h3 .small{font-size:65%}h4,h5,h6{margin-top:10px;margin-bottom:10px}h4 small,h5 small,h6 small,h4 .small,h5 .small,h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media(min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-muted{color:#999}.text-primary{color:#428bca}.text-primary:hover{color:#3071a9}.text-warning{color:#8a6d3b}.text-warning:hover{color:#66512c}.text-danger{color:#a94442}.text-danger:hover{color:#843534}.text-success{color:#3c763d}.text-success:hover{color:#2b542c}.text-info{color:#31708f}.text-info:hover{color:#245269}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}.list-inline>li:first-child{padding-left:0}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.428571429}dt{font-weight:bold}dd{margin-left:0}@media(min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small,blockquote .small{display:block;line-height:1.428571429;color:#999}blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small,blockquote.pull-right .small{text-align:right}blockquote.pull-right small:before,blockquote.pull-right .small:before{content:''}blockquote.pull-right small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.428571429}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}@media(min-width:768px){.container{width:750px}}@media(min-width:992px){.container{width:970px}}@media(min-width:1200px){.container{width:1170px}}.row{margin-right:-15px;margin-left:-15px}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666666666666%}.col-xs-10{width:83.33333333333334%}.col-xs-9{width:75%}.col-xs-8{width:66.66666666666666%}.col-xs-7{width:58.333333333333336%}.col-xs-6{width:50%}.col-xs-5{width:41.66666666666667%}.col-xs-4{width:33.33333333333333%}.col-xs-3{width:25%}.col-xs-2{width:16.666666666666664%}.col-xs-1{width:8.333333333333332%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666666666666%}.col-xs-pull-10{right:83.33333333333334%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666666666666%}.col-xs-pull-7{right:58.333333333333336%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666666666667%}.col-xs-pull-4{right:33.33333333333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.666666666666664%}.col-xs-pull-1{right:8.333333333333332%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666666666666%}.col-xs-push-10{left:83.33333333333334%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666666666666%}.col-xs-push-7{left:58.333333333333336%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666666666667%}.col-xs-push-4{left:33.33333333333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.666666666666664%}.col-xs-push-1{left:8.333333333333332%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666666666666%}.col-xs-offset-10{margin-left:83.33333333333334%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666666666666%}.col-xs-offset-7{margin-left:58.333333333333336%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666666666667%}.col-xs-offset-4{margin-left:33.33333333333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.666666666666664%}.col-xs-offset-1{margin-left:8.333333333333332%}.col-xs-offset-0{margin-left:0}@media(min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666666666666%}.col-sm-10{width:83.33333333333334%}.col-sm-9{width:75%}.col-sm-8{width:66.66666666666666%}.col-sm-7{width:58.333333333333336%}.col-sm-6{width:50%}.col-sm-5{width:41.66666666666667%}.col-sm-4{width:33.33333333333333%}.col-sm-3{width:25%}.col-sm-2{width:16.666666666666664%}.col-sm-1{width:8.333333333333332%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666666666666%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666666666666%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-0{margin-left:0}}@media(min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666666666666%}.col-md-10{width:83.33333333333334%}.col-md-9{width:75%}.col-md-8{width:66.66666666666666%}.col-md-7{width:58.333333333333336%}.col-md-6{width:50%}.col-md-5{width:41.66666666666667%}.col-md-4{width:33.33333333333333%}.col-md-3{width:25%}.col-md-2{width:16.666666666666664%}.col-md-1{width:8.333333333333332%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666666666666%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666666666666%}.col-md-push-10{left:83.33333333333334%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666666666666%}.col-md-push-7{left:58.333333333333336%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666666666667%}.col-md-push-4{left:33.33333333333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.666666666666664%}.col-md-push-1{left:8.333333333333332%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666666666666%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-0{margin-left:0}}@media(min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666666666666%}.col-lg-10{width:83.33333333333334%}.col-lg-9{width:75%}.col-lg-8{width:66.66666666666666%}.col-lg-7{width:58.333333333333336%}.col-lg-6{width:50%}.col-lg-5{width:41.66666666666667%}.col-lg-4{width:33.33333333333333%}.col-lg-3{width:25%}.col-lg-2{width:16.666666666666664%}.col-lg-1{width:8.333333333333332%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666666666666%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666666666666%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{position:static;display:table-column;float:none}table td[class*="col-"],table th[class*="col-"]{display:table-cell;float:none}.table>thead>tr>.active,.table>tbody>tr>.active,.table>tfoot>tr>.active,.table>thead>.active>td,.table>tbody>.active>td,.table>tfoot>.active>td,.table>thead>.active>th,.table>tbody>.active>th,.table>tfoot>.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>.active:hover,.table-hover>tbody>.active:hover>td,.table-hover>tbody>.active:hover>th{background-color:#e8e8e8}.table>thead>tr>.success,.table>tbody>tr>.success,.table>tfoot>tr>.success,.table>thead>.success>td,.table>tbody>.success>td,.table>tfoot>.success>td,.table>thead>.success>th,.table>tbody>.success>th,.table>tfoot>.success>th{background-color:#dff0d8}.table-hover>tbody>tr>.success:hover,.table-hover>tbody>.success:hover>td,.table-hover>tbody>.success:hover>th{background-color:#d0e9c6}.table>thead>tr>.danger,.table>tbody>tr>.danger,.table>tfoot>tr>.danger,.table>thead>.danger>td,.table>tbody>.danger>td,.table>tfoot>.danger>td,.table>thead>.danger>th,.table>tbody>.danger>th,.table>tfoot>.danger>th{background-color:#f2dede}.table-hover>tbody>tr>.danger:hover,.table-hover>tbody>.danger:hover>td,.table-hover>tbody>.danger:hover>th{background-color:#ebcccc}.table>thead>tr>.warning,.table>tbody>tr>.warning,.table>tfoot>tr>.warning,.table>thead>.warning>td,.table>tbody>.warning>td,.table>tfoot>.warning>td,.table>thead>.warning>th,.table>tbody>.warning>th,.table>tfoot>.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>.warning:hover,.table-hover>tbody>.warning:hover>td,.table-hover>tbody>.warning:hover>th{background-color:#faf2cc}@media(max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:scroll;overflow-y:hidden;border:1px solid #ddd;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}select[multiple],select[size]{height:auto}select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}input[type="number"]::-webkit-outer-spin-button,input[type="number"]::-webkit-inner-spin-button{height:auto}output{display:block;padding-top:7px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}textarea.form-control{height:auto}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.radio label,.checkbox label{display:inline;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:normal;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm{height:auto}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg{height:auto}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media(min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block}.form-inline select.form-control{width:auto}.form-inline .radio,.form-inline .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:none;margin-left:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-control-static{padding-top:7px}@media(min-width:768px){.form-horizontal .control-label{text-align:right}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:normal;line-height:1.428571429;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#fff}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-link{font-weight:normal;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:normal;line-height:1;-moz-osx-font-smoothing:grayscale}.glyphicon:empty{width:1em}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.428571429;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media(min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar .btn-group{float:left}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group,.btn-toolbar>.btn-group+.btn-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-bottom-left-radius:4px;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child>.btn:last-child,.btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-right:0;padding-left:0}.input-group .form-control{width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;white-space:nowrap}.input-group-btn:first-child>.btn{margin-right:-1px}.input-group-btn:last-child>.btn{margin-left:-1px}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-4px}.input-group-btn>.btn:hover,.input-group-btn>.btn:active{z-index:2}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}@media(min-width:768px){.navbar{border-radius:4px}}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}@media(min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse.in{overflow-y:auto}@media(min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.container>.navbar-header,.container>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media(min-width:768px){.container>.navbar-header,.container>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media(min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media(min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media(min-width:768px){.navbar>.container .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media(min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media(max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media(min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media(min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}@media(min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block}.navbar-form select.form-control{width:auto}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{float:none;margin-left:0}}@media(max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media(min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-nav.pull-right>li>.dropdown-menu,.navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media(min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#ccc}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}@media(max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}@media(max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.428571429;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{background-color:#eee}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:#808080}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{line-height:1;color:inherit}.jumbotron p{line-height:1.4}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{display:block;height:auto;max-width:100%;margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0}.panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel>.list-group .list-group-item:last-child{border-bottom:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child th,.panel>.table>tbody:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:last-child>th,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:last-child>td,.panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-group .panel{margin-bottom:0;overflow:hidden;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:auto;overflow-y:scroll}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;z-index:1050;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1030;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.428571429}.modal-body{position:relative;padding:20px}.modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}}.tooltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0;content:" "}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0;content:" "}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;height:auto;max-width:100%;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);opacity:.5;filter:alpha(opacity=50)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.5) 0),color-stop(rgba(0,0,0,0.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#00000000',GradientType=1)}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.0001) 0),color-stop(rgba(0,0,0,0.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#80000000',GradientType=1)}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;outline:0;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicons-chevron-left,.carousel-control .glyphicons-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after{display:table;content:" "}.clearfix:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,tr.visible-xs,th.visible-xs,td.visible-xs{display:none!important}@media(max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-xs.visible-sm{display:block!important}table.visible-xs.visible-sm{display:table}tr.visible-xs.visible-sm{display:table-row!important}th.visible-xs.visible-sm,td.visible-xs.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-xs.visible-md{display:block!important}table.visible-xs.visible-md{display:table}tr.visible-xs.visible-md{display:table-row!important}th.visible-xs.visible-md,td.visible-xs.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-xs.visible-lg{display:block!important}table.visible-xs.visible-lg{display:table}tr.visible-xs.visible-lg{display:table-row!important}th.visible-xs.visible-lg,td.visible-xs.visible-lg{display:table-cell!important}}.visible-sm,tr.visible-sm,th.visible-sm,td.visible-sm{display:none!important}@media(max-width:767px){.visible-sm.visible-xs{display:block!important}table.visible-sm.visible-xs{display:table}tr.visible-sm.visible-xs{display:table-row!important}th.visible-sm.visible-xs,td.visible-sm.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-sm.visible-md{display:block!important}table.visible-sm.visible-md{display:table}tr.visible-sm.visible-md{display:table-row!important}th.visible-sm.visible-md,td.visible-sm.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-sm.visible-lg{display:block!important}table.visible-sm.visible-lg{display:table}tr.visible-sm.visible-lg{display:table-row!important}th.visible-sm.visible-lg,td.visible-sm.visible-lg{display:table-cell!important}}.visible-md,tr.visible-md,th.visible-md,td.visible-md{display:none!important}@media(max-width:767px){.visible-md.visible-xs{display:block!important}table.visible-md.visible-xs{display:table}tr.visible-md.visible-xs{display:table-row!important}th.visible-md.visible-xs,td.visible-md.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-md.visible-sm{display:block!important}table.visible-md.visible-sm{display:table}tr.visible-md.visible-sm{display:table-row!important}th.visible-md.visible-sm,td.visible-md.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-md.visible-lg{display:block!important}table.visible-md.visible-lg{display:table}tr.visible-md.visible-lg{display:table-row!important}th.visible-md.visible-lg,td.visible-md.visible-lg{display:table-cell!important}}.visible-lg,tr.visible-lg,th.visible-lg,td.visible-lg{display:none!important}@media(max-width:767px){.visible-lg.visible-xs{display:block!important}table.visible-lg.visible-xs{display:table}tr.visible-lg.visible-xs{display:table-row!important}th.visible-lg.visible-xs,td.visible-lg.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-lg.visible-sm{display:block!important}table.visible-lg.visible-sm{display:table}tr.visible-lg.visible-sm{display:table-row!important}th.visible-lg.visible-sm,td.visible-lg.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-lg.visible-md{display:block!important}table.visible-lg.visible-md{display:table}tr.visible-lg.visible-md{display:table-row!important}th.visible-lg.visible-md,td.visible-lg.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}.hidden-xs{display:block!important}table.hidden-xs{display:table}tr.hidden-xs{display:table-row!important}th.hidden-xs,td.hidden-xs{display:table-cell!important}@media(max-width:767px){.hidden-xs,tr.hidden-xs,th.hidden-xs,td.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-xs.hidden-sm,tr.hidden-xs.hidden-sm,th.hidden-xs.hidden-sm,td.hidden-xs.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-xs.hidden-md,tr.hidden-xs.hidden-md,th.hidden-xs.hidden-md,td.hidden-xs.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-xs.hidden-lg,tr.hidden-xs.hidden-lg,th.hidden-xs.hidden-lg,td.hidden-xs.hidden-lg{display:none!important}}.hidden-sm{display:block!important}table.hidden-sm{display:table}tr.hidden-sm{display:table-row!important}th.hidden-sm,td.hidden-sm{display:table-cell!important}@media(max-width:767px){.hidden-sm.hidden-xs,tr.hidden-sm.hidden-xs,th.hidden-sm.hidden-xs,td.hidden-sm.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-sm,tr.hidden-sm,th.hidden-sm,td.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-sm.hidden-md,tr.hidden-sm.hidden-md,th.hidden-sm.hidden-md,td.hidden-sm.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-sm.hidden-lg,tr.hidden-sm.hidden-lg,th.hidden-sm.hidden-lg,td.hidden-sm.hidden-lg{display:none!important}}.hidden-md{display:block!important}table.hidden-md{display:table}tr.hidden-md{display:table-row!important}th.hidden-md,td.hidden-md{display:table-cell!important}@media(max-width:767px){.hidden-md.hidden-xs,tr.hidden-md.hidden-xs,th.hidden-md.hidden-xs,td.hidden-md.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-md.hidden-sm,tr.hidden-md.hidden-sm,th.hidden-md.hidden-sm,td.hidden-md.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-md,tr.hidden-md,th.hidden-md,td.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-md.hidden-lg,tr.hidden-md.hidden-lg,th.hidden-md.hidden-lg,td.hidden-md.hidden-lg{display:none!important}}.hidden-lg{display:block!important}table.hidden-lg{display:table}tr.hidden-lg{display:table-row!important}th.hidden-lg,td.hidden-lg{display:table-cell!important}@media(max-width:767px){.hidden-lg.hidden-xs,tr.hidden-lg.hidden-xs,th.hidden-lg.hidden-xs,td.hidden-lg.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-lg.hidden-sm,tr.hidden-lg.hidden-sm,th.hidden-lg.hidden-sm,td.hidden-lg.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-lg.hidden-md,tr.hidden-lg.hidden-md,th.hidden-lg.hidden-md,td.hidden-lg.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-lg,tr.hidden-lg,th.hidden-lg,td.hidden-lg{display:none!important}}.visible-print,tr.visible-print,th.visible-print,td.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}.hidden-print,tr.hidden-print,th.hidden-print,td.hidden-print{display:none!important}}
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/css/font-awesome.min.css b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/css/font-awesome.min.css
new file mode 100644
index 0000000..540440c
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/css/font-awesome.min.css
@@ -0,0 +1,4 @@
+/*!
+ *  Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
+ *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/fonts/fontawesome-webfont.ttf b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/fonts/fontawesome-webfont.ttf
new file mode 100644
index 0000000..35acda2
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/fonts/fontawesome-webfont.ttf
Binary files differ
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/fonts/fontawesome-webfont.woff b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/fonts/fontawesome-webfont.woff
new file mode 100644
index 0000000..400014a
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/fonts/fontawesome-webfont.woff
Binary files differ
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/fonts/fontawesome-webfont.woff2 b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/fonts/fontawesome-webfont.woff2
new file mode 100644
index 0000000..4d13fc6
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/fonts/fontawesome-webfont.woff2
Binary files differ
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/fonts/glyphicons-halflings-regular.ttf b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/fonts/glyphicons-halflings-regular.ttf
new file mode 100644
index 0000000..a498ef4
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/fonts/glyphicons-halflings-regular.ttf
Binary files differ
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/fonts/glyphicons-halflings-regular.woff b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/fonts/glyphicons-halflings-regular.woff
new file mode 100644
index 0000000..d83c539
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/fonts/glyphicons-halflings-regular.woff
Binary files differ
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/js/angular.min.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/js/angular.min.js
new file mode 100644
index 0000000..b4f9b07
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/js/angular.min.js
@@ -0,0 +1,295 @@
+/*
+ AngularJS v1.4.8
+ (c) 2010-2015 Google, Inc. http://angularjs.org
+ License: MIT
+*/
+(function(S,X,u){'use strict';function G(a){return function(){var b=arguments[0],d;d="["+(a?a+":":"")+b+"] http://errors.angularjs.org/1.4.8/"+(a?a+"/":"")+b;for(b=1;b<arguments.length;b++){d=d+(1==b?"?":"&")+"p"+(b-1)+"=";var c=encodeURIComponent,e;e=arguments[b];e="function"==typeof e?e.toString().replace(/ \{[\s\S]*$/,""):"undefined"==typeof e?"undefined":"string"!=typeof e?JSON.stringify(e):e;d+=c(e)}return Error(d)}}function za(a){if(null==a||Xa(a))return!1;if(I(a)||E(a)||B&&a instanceof B)return!0;
+var b="length"in Object(a)&&a.length;return Q(b)&&(0<=b&&b-1 in a||"function"==typeof a.item)}function n(a,b,d){var c,e;if(a)if(z(a))for(c in a)"prototype"==c||"length"==c||"name"==c||a.hasOwnProperty&&!a.hasOwnProperty(c)||b.call(d,a[c],c,a);else if(I(a)||za(a)){var f="object"!==typeof a;c=0;for(e=a.length;c<e;c++)(f||c in a)&&b.call(d,a[c],c,a)}else if(a.forEach&&a.forEach!==n)a.forEach(b,d,a);else if(nc(a))for(c in a)b.call(d,a[c],c,a);else if("function"===typeof a.hasOwnProperty)for(c in a)a.hasOwnProperty(c)&&
+b.call(d,a[c],c,a);else for(c in a)qa.call(a,c)&&b.call(d,a[c],c,a);return a}function oc(a,b,d){for(var c=Object.keys(a).sort(),e=0;e<c.length;e++)b.call(d,a[c[e]],c[e]);return c}function pc(a){return function(b,d){a(d,b)}}function Td(){return++nb}function Mb(a,b,d){for(var c=a.$$hashKey,e=0,f=b.length;e<f;++e){var g=b[e];if(H(g)||z(g))for(var h=Object.keys(g),k=0,l=h.length;k<l;k++){var m=h[k],r=g[m];d&&H(r)?da(r)?a[m]=new Date(r.valueOf()):Ma(r)?a[m]=new RegExp(r):r.nodeName?a[m]=r.cloneNode(!0):
+Nb(r)?a[m]=r.clone():(H(a[m])||(a[m]=I(r)?[]:{}),Mb(a[m],[r],!0)):a[m]=r}}c?a.$$hashKey=c:delete a.$$hashKey;return a}function M(a){return Mb(a,ra.call(arguments,1),!1)}function Ud(a){return Mb(a,ra.call(arguments,1),!0)}function ea(a){return parseInt(a,10)}function Ob(a,b){return M(Object.create(a),b)}function x(){}function Ya(a){return a}function na(a){return function(){return a}}function qc(a){return z(a.toString)&&a.toString!==sa}function q(a){return"undefined"===typeof a}function y(a){return"undefined"!==
+typeof a}function H(a){return null!==a&&"object"===typeof a}function nc(a){return null!==a&&"object"===typeof a&&!rc(a)}function E(a){return"string"===typeof a}function Q(a){return"number"===typeof a}function da(a){return"[object Date]"===sa.call(a)}function z(a){return"function"===typeof a}function Ma(a){return"[object RegExp]"===sa.call(a)}function Xa(a){return a&&a.window===a}function Za(a){return a&&a.$evalAsync&&a.$watch}function $a(a){return"boolean"===typeof a}function sc(a){return a&&Q(a.length)&&
+Vd.test(sa.call(a))}function Nb(a){return!(!a||!(a.nodeName||a.prop&&a.attr&&a.find))}function Wd(a){var b={};a=a.split(",");var d;for(d=0;d<a.length;d++)b[a[d]]=!0;return b}function ta(a){return F(a.nodeName||a[0]&&a[0].nodeName)}function ab(a,b){var d=a.indexOf(b);0<=d&&a.splice(d,1);return d}function bb(a,b){function d(a,b){var d=b.$$hashKey,e;if(I(a)){e=0;for(var f=a.length;e<f;e++)b.push(c(a[e]))}else if(nc(a))for(e in a)b[e]=c(a[e]);else if(a&&"function"===typeof a.hasOwnProperty)for(e in a)a.hasOwnProperty(e)&&
+(b[e]=c(a[e]));else for(e in a)qa.call(a,e)&&(b[e]=c(a[e]));d?b.$$hashKey=d:delete b.$$hashKey;return b}function c(a){if(!H(a))return a;var b=e.indexOf(a);if(-1!==b)return f[b];if(Xa(a)||Za(a))throw Aa("cpws");var b=!1,c;I(a)?(c=[],b=!0):sc(a)?c=new a.constructor(a):da(a)?c=new Date(a.getTime()):Ma(a)?(c=new RegExp(a.source,a.toString().match(/[^\/]*$/)[0]),c.lastIndex=a.lastIndex):z(a.cloneNode)?c=a.cloneNode(!0):(c=Object.create(rc(a)),b=!0);e.push(a);f.push(c);return b?d(a,c):c}var e=[],f=[];if(b){if(sc(b))throw Aa("cpta");
+if(a===b)throw Aa("cpi");I(b)?b.length=0:n(b,function(a,c){"$$hashKey"!==c&&delete b[c]});e.push(a);f.push(b);return d(a,b)}return c(a)}function ia(a,b){if(I(a)){b=b||[];for(var d=0,c=a.length;d<c;d++)b[d]=a[d]}else if(H(a))for(d in b=b||{},a)if("$"!==d.charAt(0)||"$"!==d.charAt(1))b[d]=a[d];return b||a}function ma(a,b){if(a===b)return!0;if(null===a||null===b)return!1;if(a!==a&&b!==b)return!0;var d=typeof a,c;if(d==typeof b&&"object"==d)if(I(a)){if(!I(b))return!1;if((d=a.length)==b.length){for(c=
+0;c<d;c++)if(!ma(a[c],b[c]))return!1;return!0}}else{if(da(a))return da(b)?ma(a.getTime(),b.getTime()):!1;if(Ma(a))return Ma(b)?a.toString()==b.toString():!1;if(Za(a)||Za(b)||Xa(a)||Xa(b)||I(b)||da(b)||Ma(b))return!1;d=$();for(c in a)if("$"!==c.charAt(0)&&!z(a[c])){if(!ma(a[c],b[c]))return!1;d[c]=!0}for(c in b)if(!(c in d)&&"$"!==c.charAt(0)&&y(b[c])&&!z(b[c]))return!1;return!0}return!1}function cb(a,b,d){return a.concat(ra.call(b,d))}function tc(a,b){var d=2<arguments.length?ra.call(arguments,2):
+[];return!z(b)||b instanceof RegExp?b:d.length?function(){return arguments.length?b.apply(a,cb(d,arguments,0)):b.apply(a,d)}:function(){return arguments.length?b.apply(a,arguments):b.call(a)}}function Xd(a,b){var d=b;"string"===typeof a&&"$"===a.charAt(0)&&"$"===a.charAt(1)?d=u:Xa(b)?d="$WINDOW":b&&X===b?d="$DOCUMENT":Za(b)&&(d="$SCOPE");return d}function db(a,b){if("undefined"===typeof a)return u;Q(b)||(b=b?2:null);return JSON.stringify(a,Xd,b)}function uc(a){return E(a)?JSON.parse(a):a}function vc(a,
+b){var d=Date.parse("Jan 01, 1970 00:00:00 "+a)/6E4;return isNaN(d)?b:d}function Pb(a,b,d){d=d?-1:1;var c=vc(b,a.getTimezoneOffset());b=a;a=d*(c-a.getTimezoneOffset());b=new Date(b.getTime());b.setMinutes(b.getMinutes()+a);return b}function ua(a){a=B(a).clone();try{a.empty()}catch(b){}var d=B("<div>").append(a).html();try{return a[0].nodeType===Na?F(d):d.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+F(b)})}catch(c){return F(d)}}function wc(a){try{return decodeURIComponent(a)}catch(b){}}
+function xc(a){var b={};n((a||"").split("&"),function(a){var c,e,f;a&&(e=a=a.replace(/\+/g,"%20"),c=a.indexOf("="),-1!==c&&(e=a.substring(0,c),f=a.substring(c+1)),e=wc(e),y(e)&&(f=y(f)?wc(f):!0,qa.call(b,e)?I(b[e])?b[e].push(f):b[e]=[b[e],f]:b[e]=f))});return b}function Qb(a){var b=[];n(a,function(a,c){I(a)?n(a,function(a){b.push(ja(c,!0)+(!0===a?"":"="+ja(a,!0)))}):b.push(ja(c,!0)+(!0===a?"":"="+ja(a,!0)))});return b.length?b.join("&"):""}function ob(a){return ja(a,!0).replace(/%26/gi,"&").replace(/%3D/gi,
+"=").replace(/%2B/gi,"+")}function ja(a,b){return encodeURIComponent(a).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,b?"%20":"+")}function Yd(a,b){var d,c,e=Oa.length;for(c=0;c<e;++c)if(d=Oa[c]+b,E(d=a.getAttribute(d)))return d;return null}function Zd(a,b){var d,c,e={};n(Oa,function(b){b+="app";!d&&a.hasAttribute&&a.hasAttribute(b)&&(d=a,c=a.getAttribute(b))});n(Oa,function(b){b+="app";var e;!d&&(e=a.querySelector("["+b.replace(":",
+"\\:")+"]"))&&(d=e,c=e.getAttribute(b))});d&&(e.strictDi=null!==Yd(d,"strict-di"),b(d,c?[c]:[],e))}function yc(a,b,d){H(d)||(d={});d=M({strictDi:!1},d);var c=function(){a=B(a);if(a.injector()){var c=a[0]===X?"document":ua(a);throw Aa("btstrpd",c.replace(/</,"&lt;").replace(/>/,"&gt;"));}b=b||[];b.unshift(["$provide",function(b){b.value("$rootElement",a)}]);d.debugInfoEnabled&&b.push(["$compileProvider",function(a){a.debugInfoEnabled(!0)}]);b.unshift("ng");c=eb(b,d.strictDi);c.invoke(["$rootScope",
+"$rootElement","$compile","$injector",function(a,b,c,d){a.$apply(function(){b.data("$injector",d);c(b)(a)})}]);return c},e=/^NG_ENABLE_DEBUG_INFO!/,f=/^NG_DEFER_BOOTSTRAP!/;S&&e.test(S.name)&&(d.debugInfoEnabled=!0,S.name=S.name.replace(e,""));if(S&&!f.test(S.name))return c();S.name=S.name.replace(f,"");fa.resumeBootstrap=function(a){n(a,function(a){b.push(a)});return c()};z(fa.resumeDeferredBootstrap)&&fa.resumeDeferredBootstrap()}function $d(){S.name="NG_ENABLE_DEBUG_INFO!"+S.name;S.location.reload()}
+function ae(a){a=fa.element(a).injector();if(!a)throw Aa("test");return a.get("$$testability")}function zc(a,b){b=b||"_";return a.replace(be,function(a,c){return(c?b:"")+a.toLowerCase()})}function ce(){var a;if(!Ac){var b=pb();(oa=q(b)?S.jQuery:b?S[b]:u)&&oa.fn.on?(B=oa,M(oa.fn,{scope:Pa.scope,isolateScope:Pa.isolateScope,controller:Pa.controller,injector:Pa.injector,inheritedData:Pa.inheritedData}),a=oa.cleanData,oa.cleanData=function(b){var c;if(Rb)Rb=!1;else for(var e=0,f;null!=(f=b[e]);e++)(c=
+oa._data(f,"events"))&&c.$destroy&&oa(f).triggerHandler("$destroy");a(b)}):B=N;fa.element=B;Ac=!0}}function qb(a,b,d){if(!a)throw Aa("areq",b||"?",d||"required");return a}function Qa(a,b,d){d&&I(a)&&(a=a[a.length-1]);qb(z(a),b,"not a function, got "+(a&&"object"===typeof a?a.constructor.name||"Object":typeof a));return a}function Ra(a,b){if("hasOwnProperty"===a)throw Aa("badname",b);}function Bc(a,b,d){if(!b)return a;b=b.split(".");for(var c,e=a,f=b.length,g=0;g<f;g++)c=b[g],a&&(a=(e=a)[c]);return!d&&
+z(a)?tc(e,a):a}function rb(a){for(var b=a[0],d=a[a.length-1],c,e=1;b!==d&&(b=b.nextSibling);e++)if(c||a[e]!==b)c||(c=B(ra.call(a,0,e))),c.push(b);return c||a}function $(){return Object.create(null)}function de(a){function b(a,b,c){return a[b]||(a[b]=c())}var d=G("$injector"),c=G("ng");a=b(a,"angular",Object);a.$$minErr=a.$$minErr||G;return b(a,"module",function(){var a={};return function(f,g,h){if("hasOwnProperty"===f)throw c("badname","module");g&&a.hasOwnProperty(f)&&(a[f]=null);return b(a,f,function(){function a(b,
+d,e,f){f||(f=c);return function(){f[e||"push"]([b,d,arguments]);return v}}function b(a,d){return function(b,e){e&&z(e)&&(e.$$moduleName=f);c.push([a,d,arguments]);return v}}if(!g)throw d("nomod",f);var c=[],e=[],t=[],A=a("$injector","invoke","push",e),v={_invokeQueue:c,_configBlocks:e,_runBlocks:t,requires:g,name:f,provider:b("$provide","provider"),factory:b("$provide","factory"),service:b("$provide","service"),value:a("$provide","value"),constant:a("$provide","constant","unshift"),decorator:b("$provide",
+"decorator"),animation:b("$animateProvider","register"),filter:b("$filterProvider","register"),controller:b("$controllerProvider","register"),directive:b("$compileProvider","directive"),config:A,run:function(a){t.push(a);return this}};h&&A(h);return v})}})}function ee(a){M(a,{bootstrap:yc,copy:bb,extend:M,merge:Ud,equals:ma,element:B,forEach:n,injector:eb,noop:x,bind:tc,toJson:db,fromJson:uc,identity:Ya,isUndefined:q,isDefined:y,isString:E,isFunction:z,isObject:H,isNumber:Q,isElement:Nb,isArray:I,
+version:fe,isDate:da,lowercase:F,uppercase:sb,callbacks:{counter:0},getTestability:ae,$$minErr:G,$$csp:Ba,reloadWithDebugInfo:$d});Sb=de(S);Sb("ng",["ngLocale"],["$provide",function(a){a.provider({$$sanitizeUri:ge});a.provider("$compile",Cc).directive({a:he,input:Dc,textarea:Dc,form:ie,script:je,select:ke,style:le,option:me,ngBind:ne,ngBindHtml:oe,ngBindTemplate:pe,ngClass:qe,ngClassEven:re,ngClassOdd:se,ngCloak:te,ngController:ue,ngForm:ve,ngHide:we,ngIf:xe,ngInclude:ye,ngInit:ze,ngNonBindable:Ae,
+ngPluralize:Be,ngRepeat:Ce,ngShow:De,ngStyle:Ee,ngSwitch:Fe,ngSwitchWhen:Ge,ngSwitchDefault:He,ngOptions:Ie,ngTransclude:Je,ngModel:Ke,ngList:Le,ngChange:Me,pattern:Ec,ngPattern:Ec,required:Fc,ngRequired:Fc,minlength:Gc,ngMinlength:Gc,maxlength:Hc,ngMaxlength:Hc,ngValue:Ne,ngModelOptions:Oe}).directive({ngInclude:Pe}).directive(tb).directive(Ic);a.provider({$anchorScroll:Qe,$animate:Re,$animateCss:Se,$$animateQueue:Te,$$AnimateRunner:Ue,$browser:Ve,$cacheFactory:We,$controller:Xe,$document:Ye,$exceptionHandler:Ze,
+$filter:Jc,$$forceReflow:$e,$interpolate:af,$interval:bf,$http:cf,$httpParamSerializer:df,$httpParamSerializerJQLike:ef,$httpBackend:ff,$xhrFactory:gf,$location:hf,$log:jf,$parse:kf,$rootScope:lf,$q:mf,$$q:nf,$sce:of,$sceDelegate:pf,$sniffer:qf,$templateCache:rf,$templateRequest:sf,$$testability:tf,$timeout:uf,$window:vf,$$rAF:wf,$$jqLite:xf,$$HashMap:yf,$$cookieReader:zf})}])}function fb(a){return a.replace(Af,function(a,d,c,e){return e?c.toUpperCase():c}).replace(Bf,"Moz$1")}function Kc(a){a=a.nodeType;
+return 1===a||!a||9===a}function Lc(a,b){var d,c,e=b.createDocumentFragment(),f=[];if(Tb.test(a)){d=d||e.appendChild(b.createElement("div"));c=(Cf.exec(a)||["",""])[1].toLowerCase();c=ka[c]||ka._default;d.innerHTML=c[1]+a.replace(Df,"<$1></$2>")+c[2];for(c=c[0];c--;)d=d.lastChild;f=cb(f,d.childNodes);d=e.firstChild;d.textContent=""}else f.push(b.createTextNode(a));e.textContent="";e.innerHTML="";n(f,function(a){e.appendChild(a)});return e}function N(a){if(a instanceof N)return a;var b;E(a)&&(a=U(a),
+b=!0);if(!(this instanceof N)){if(b&&"<"!=a.charAt(0))throw Ub("nosel");return new N(a)}if(b){b=X;var d;a=(d=Ef.exec(a))?[b.createElement(d[1])]:(d=Lc(a,b))?d.childNodes:[]}Mc(this,a)}function Vb(a){return a.cloneNode(!0)}function ub(a,b){b||vb(a);if(a.querySelectorAll)for(var d=a.querySelectorAll("*"),c=0,e=d.length;c<e;c++)vb(d[c])}function Nc(a,b,d,c){if(y(c))throw Ub("offargs");var e=(c=wb(a))&&c.events,f=c&&c.handle;if(f)if(b){var g=function(b){var c=e[b];y(d)&&ab(c||[],d);y(d)&&c&&0<c.length||
+(a.removeEventListener(b,f,!1),delete e[b])};n(b.split(" "),function(a){g(a);xb[a]&&g(xb[a])})}else for(b in e)"$destroy"!==b&&a.removeEventListener(b,f,!1),delete e[b]}function vb(a,b){var d=a.ng339,c=d&&gb[d];c&&(b?delete c.data[b]:(c.handle&&(c.events.$destroy&&c.handle({},"$destroy"),Nc(a)),delete gb[d],a.ng339=u))}function wb(a,b){var d=a.ng339,d=d&&gb[d];b&&!d&&(a.ng339=d=++Ff,d=gb[d]={events:{},data:{},handle:u});return d}function Wb(a,b,d){if(Kc(a)){var c=y(d),e=!c&&b&&!H(b),f=!b;a=(a=wb(a,
+!e))&&a.data;if(c)a[b]=d;else{if(f)return a;if(e)return a&&a[b];M(a,b)}}}function yb(a,b){return a.getAttribute?-1<(" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").indexOf(" "+b+" "):!1}function zb(a,b){b&&a.setAttribute&&n(b.split(" "),function(b){a.setAttribute("class",U((" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").replace(" "+U(b)+" "," ")))})}function Ab(a,b){if(b&&a.setAttribute){var d=(" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ");n(b.split(" "),
+function(a){a=U(a);-1===d.indexOf(" "+a+" ")&&(d+=a+" ")});a.setAttribute("class",U(d))}}function Mc(a,b){if(b)if(b.nodeType)a[a.length++]=b;else{var d=b.length;if("number"===typeof d&&b.window!==b){if(d)for(var c=0;c<d;c++)a[a.length++]=b[c]}else a[a.length++]=b}}function Oc(a,b){return Bb(a,"$"+(b||"ngController")+"Controller")}function Bb(a,b,d){9==a.nodeType&&(a=a.documentElement);for(b=I(b)?b:[b];a;){for(var c=0,e=b.length;c<e;c++)if(y(d=B.data(a,b[c])))return d;a=a.parentNode||11===a.nodeType&&
+a.host}}function Pc(a){for(ub(a,!0);a.firstChild;)a.removeChild(a.firstChild)}function Xb(a,b){b||ub(a);var d=a.parentNode;d&&d.removeChild(a)}function Gf(a,b){b=b||S;if("complete"===b.document.readyState)b.setTimeout(a);else B(b).on("load",a)}function Qc(a,b){var d=Cb[b.toLowerCase()];return d&&Rc[ta(a)]&&d}function Hf(a,b){var d=function(c,d){c.isDefaultPrevented=function(){return c.defaultPrevented};var f=b[d||c.type],g=f?f.length:0;if(g){if(q(c.immediatePropagationStopped)){var h=c.stopImmediatePropagation;
+c.stopImmediatePropagation=function(){c.immediatePropagationStopped=!0;c.stopPropagation&&c.stopPropagation();h&&h.call(c)}}c.isImmediatePropagationStopped=function(){return!0===c.immediatePropagationStopped};var k=f.specialHandlerWrapper||If;1<g&&(f=ia(f));for(var l=0;l<g;l++)c.isImmediatePropagationStopped()||k(a,c,f[l])}};d.elem=a;return d}function If(a,b,d){d.call(a,b)}function Jf(a,b,d){var c=b.relatedTarget;c&&(c===a||Kf.call(a,c))||d.call(a,b)}function xf(){this.$get=function(){return M(N,
+{hasClass:function(a,b){a.attr&&(a=a[0]);return yb(a,b)},addClass:function(a,b){a.attr&&(a=a[0]);return Ab(a,b)},removeClass:function(a,b){a.attr&&(a=a[0]);return zb(a,b)}})}}function Ca(a,b){var d=a&&a.$$hashKey;if(d)return"function"===typeof d&&(d=a.$$hashKey()),d;d=typeof a;return d="function"==d||"object"==d&&null!==a?a.$$hashKey=d+":"+(b||Td)():d+":"+a}function Sa(a,b){if(b){var d=0;this.nextUid=function(){return++d}}n(a,this.put,this)}function Lf(a){return(a=a.toString().replace(Sc,"").match(Tc))?
+"function("+(a[1]||"").replace(/[\s\r\n]+/," ")+")":"fn"}function eb(a,b){function d(a){return function(b,c){if(H(b))n(b,pc(a));else return a(b,c)}}function c(a,b){Ra(a,"service");if(z(b)||I(b))b=t.instantiate(b);if(!b.$get)throw Da("pget",a);return r[a+"Provider"]=b}function e(a,b){return function(){var c=v.invoke(b,this);if(q(c))throw Da("undef",a);return c}}function f(a,b,d){return c(a,{$get:!1!==d?e(a,b):b})}function g(a){qb(q(a)||I(a),"modulesToLoad","not an array");var b=[],c;n(a,function(a){function d(a){var b,
+c;b=0;for(c=a.length;b<c;b++){var e=a[b],f=t.get(e[0]);f[e[1]].apply(f,e[2])}}if(!m.get(a)){m.put(a,!0);try{E(a)?(c=Sb(a),b=b.concat(g(c.requires)).concat(c._runBlocks),d(c._invokeQueue),d(c._configBlocks)):z(a)?b.push(t.invoke(a)):I(a)?b.push(t.invoke(a)):Qa(a,"module")}catch(e){throw I(a)&&(a=a[a.length-1]),e.message&&e.stack&&-1==e.stack.indexOf(e.message)&&(e=e.message+"\n"+e.stack),Da("modulerr",a,e.stack||e.message||e);}}});return b}function h(a,c){function d(b,e){if(a.hasOwnProperty(b)){if(a[b]===
+k)throw Da("cdep",b+" <- "+l.join(" <- "));return a[b]}try{return l.unshift(b),a[b]=k,a[b]=c(b,e)}catch(f){throw a[b]===k&&delete a[b],f;}finally{l.shift()}}function e(a,c,f,g){"string"===typeof f&&(g=f,f=null);var h=[],k=eb.$$annotate(a,b,g),l,m,t;m=0;for(l=k.length;m<l;m++){t=k[m];if("string"!==typeof t)throw Da("itkn",t);h.push(f&&f.hasOwnProperty(t)?f[t]:d(t,g))}I(a)&&(a=a[l]);return a.apply(c,h)}return{invoke:e,instantiate:function(a,b,c){var d=Object.create((I(a)?a[a.length-1]:a).prototype||
+null);a=e(a,d,b,c);return H(a)||z(a)?a:d},get:d,annotate:eb.$$annotate,has:function(b){return r.hasOwnProperty(b+"Provider")||a.hasOwnProperty(b)}}}b=!0===b;var k={},l=[],m=new Sa([],!0),r={$provide:{provider:d(c),factory:d(f),service:d(function(a,b){return f(a,["$injector",function(a){return a.instantiate(b)}])}),value:d(function(a,b){return f(a,na(b),!1)}),constant:d(function(a,b){Ra(a,"constant");r[a]=b;A[a]=b}),decorator:function(a,b){var c=t.get(a+"Provider"),d=c.$get;c.$get=function(){var a=
+v.invoke(d,c);return v.invoke(b,null,{$delegate:a})}}}},t=r.$injector=h(r,function(a,b){fa.isString(b)&&l.push(b);throw Da("unpr",l.join(" <- "));}),A={},v=A.$injector=h(A,function(a,b){var c=t.get(a+"Provider",b);return v.invoke(c.$get,c,u,a)});n(g(a),function(a){a&&v.invoke(a)});return v}function Qe(){var a=!0;this.disableAutoScrolling=function(){a=!1};this.$get=["$window","$location","$rootScope",function(b,d,c){function e(a){var b=null;Array.prototype.some.call(a,function(a){if("a"===ta(a))return b=
+a,!0});return b}function f(a){if(a){a.scrollIntoView();var c;c=g.yOffset;z(c)?c=c():Nb(c)?(c=c[0],c="fixed"!==b.getComputedStyle(c).position?0:c.getBoundingClientRect().bottom):Q(c)||(c=0);c&&(a=a.getBoundingClientRect().top,b.scrollBy(0,a-c))}else b.scrollTo(0,0)}function g(a){a=E(a)?a:d.hash();var b;a?(b=h.getElementById(a))?f(b):(b=e(h.getElementsByName(a)))?f(b):"top"===a&&f(null):f(null)}var h=b.document;a&&c.$watch(function(){return d.hash()},function(a,b){a===b&&""===a||Gf(function(){c.$evalAsync(g)})});
+return g}]}function hb(a,b){if(!a&&!b)return"";if(!a)return b;if(!b)return a;I(a)&&(a=a.join(" "));I(b)&&(b=b.join(" "));return a+" "+b}function Mf(a){E(a)&&(a=a.split(" "));var b=$();n(a,function(a){a.length&&(b[a]=!0)});return b}function Ea(a){return H(a)?a:{}}function Nf(a,b,d,c){function e(a){try{a.apply(null,ra.call(arguments,1))}finally{if(v--,0===v)for(;T.length;)try{T.pop()()}catch(b){d.error(b)}}}function f(){L=null;g();h()}function g(){a:{try{p=m.state;break a}catch(a){}p=void 0}p=q(p)?
+null:p;ma(p,J)&&(p=J);J=p}function h(){if(w!==k.url()||C!==p)w=k.url(),C=p,n(aa,function(a){a(k.url(),p)})}var k=this,l=a.location,m=a.history,r=a.setTimeout,t=a.clearTimeout,A={};k.isMock=!1;var v=0,T=[];k.$$completeOutstandingRequest=e;k.$$incOutstandingRequestCount=function(){v++};k.notifyWhenNoOutstandingRequests=function(a){0===v?a():T.push(a)};var p,C,w=l.href,ga=b.find("base"),L=null;g();C=p;k.url=function(b,d,e){q(e)&&(e=null);l!==a.location&&(l=a.location);m!==a.history&&(m=a.history);if(b){var f=
+C===e;if(w===b&&(!c.history||f))return k;var h=w&&Fa(w)===Fa(b);w=b;C=e;if(!c.history||h&&f){if(!h||L)L=b;d?l.replace(b):h?(d=l,e=b.indexOf("#"),e=-1===e?"":b.substr(e),d.hash=e):l.href=b;l.href!==b&&(L=b)}else m[d?"replaceState":"pushState"](e,"",b),g(),C=p;return k}return L||l.href.replace(/%27/g,"'")};k.state=function(){return p};var aa=[],D=!1,J=null;k.onUrlChange=function(b){if(!D){if(c.history)B(a).on("popstate",f);B(a).on("hashchange",f);D=!0}aa.push(b);return b};k.$$applicationDestroyed=function(){B(a).off("hashchange popstate",
+f)};k.$$checkUrlChange=h;k.baseHref=function(){var a=ga.attr("href");return a?a.replace(/^(https?\:)?\/\/[^\/]*/,""):""};k.defer=function(a,b){var c;v++;c=r(function(){delete A[c];e(a)},b||0);A[c]=!0;return c};k.defer.cancel=function(a){return A[a]?(delete A[a],t(a),e(x),!0):!1}}function Ve(){this.$get=["$window","$log","$sniffer","$document",function(a,b,d,c){return new Nf(a,c,b,d)}]}function We(){this.$get=function(){function a(a,c){function e(a){a!=r&&(t?t==a&&(t=a.n):t=a,f(a.n,a.p),f(a,r),r=a,
+r.n=null)}function f(a,b){a!=b&&(a&&(a.p=b),b&&(b.n=a))}if(a in b)throw G("$cacheFactory")("iid",a);var g=0,h=M({},c,{id:a}),k=$(),l=c&&c.capacity||Number.MAX_VALUE,m=$(),r=null,t=null;return b[a]={put:function(a,b){if(!q(b)){if(l<Number.MAX_VALUE){var c=m[a]||(m[a]={key:a});e(c)}a in k||g++;k[a]=b;g>l&&this.remove(t.key);return b}},get:function(a){if(l<Number.MAX_VALUE){var b=m[a];if(!b)return;e(b)}return k[a]},remove:function(a){if(l<Number.MAX_VALUE){var b=m[a];if(!b)return;b==r&&(r=b.p);b==t&&
+(t=b.n);f(b.n,b.p);delete m[a]}a in k&&(delete k[a],g--)},removeAll:function(){k=$();g=0;m=$();r=t=null},destroy:function(){m=h=k=null;delete b[a]},info:function(){return M({},h,{size:g})}}}var b={};a.info=function(){var a={};n(b,function(b,e){a[e]=b.info()});return a};a.get=function(a){return b[a]};return a}}function rf(){this.$get=["$cacheFactory",function(a){return a("templates")}]}function Cc(a,b){function d(a,b,c){var d=/^\s*([@&]|=(\*?))(\??)\s*(\w*)\s*$/,e={};n(a,function(a,f){var g=a.match(d);
+if(!g)throw ha("iscp",b,f,a,c?"controller bindings definition":"isolate scope definition");e[f]={mode:g[1][0],collection:"*"===g[2],optional:"?"===g[3],attrName:g[4]||f}});return e}function c(a){var b=a.charAt(0);if(!b||b!==F(b))throw ha("baddir",a);if(a!==a.trim())throw ha("baddir",a);}var e={},f=/^\s*directive\:\s*([\w\-]+)\s+(.*)$/,g=/(([\w\-]+)(?:\:([^;]+))?;?)/,h=Wd("ngSrc,ngSrcset,src,srcset"),k=/^(?:(\^\^?)?(\?)?(\^\^?)?)?/,l=/^(on[a-z]+|formaction)$/;this.directive=function t(b,f){Ra(b,"directive");
+E(b)?(c(b),qb(f,"directiveFactory"),e.hasOwnProperty(b)||(e[b]=[],a.factory(b+"Directive",["$injector","$exceptionHandler",function(a,c){var f=[];n(e[b],function(e,g){try{var h=a.invoke(e);z(h)?h={compile:na(h)}:!h.compile&&h.link&&(h.compile=na(h.link));h.priority=h.priority||0;h.index=g;h.name=h.name||b;h.require=h.require||h.controller&&h.name;h.restrict=h.restrict||"EA";var k=h,l=h,m=h.name,t={isolateScope:null,bindToController:null};H(l.scope)&&(!0===l.bindToController?(t.bindToController=d(l.scope,
+m,!0),t.isolateScope={}):t.isolateScope=d(l.scope,m,!1));H(l.bindToController)&&(t.bindToController=d(l.bindToController,m,!0));if(H(t.bindToController)){var v=l.controller,R=l.controllerAs;if(!v)throw ha("noctrl",m);var V;a:if(R&&E(R))V=R;else{if(E(v)){var n=Uc.exec(v);if(n){V=n[3];break a}}V=void 0}if(!V)throw ha("noident",m);}var s=k.$$bindings=t;H(s.isolateScope)&&(h.$$isolateBindings=s.isolateScope);h.$$moduleName=e.$$moduleName;f.push(h)}catch(u){c(u)}});return f}])),e[b].push(f)):n(b,pc(t));
+return this};this.aHrefSanitizationWhitelist=function(a){return y(a)?(b.aHrefSanitizationWhitelist(a),this):b.aHrefSanitizationWhitelist()};this.imgSrcSanitizationWhitelist=function(a){return y(a)?(b.imgSrcSanitizationWhitelist(a),this):b.imgSrcSanitizationWhitelist()};var m=!0;this.debugInfoEnabled=function(a){return y(a)?(m=a,this):m};this.$get=["$injector","$interpolate","$exceptionHandler","$templateRequest","$parse","$controller","$rootScope","$document","$sce","$animate","$$sanitizeUri",function(a,
+b,c,d,p,C,w,ga,L,aa,D){function J(a,b){try{a.addClass(b)}catch(c){}}function K(a,b,c,d,e){a instanceof B||(a=B(a));n(a,function(b,c){b.nodeType==Na&&b.nodeValue.match(/\S+/)&&(a[c]=B(b).wrap("<span></span>").parent()[0])});var f=O(a,b,a,c,d,e);K.$$addScopeClass(a);var g=null;return function(b,c,d){qb(b,"scope");e&&e.needsNewScope&&(b=b.$parent.$new());d=d||{};var h=d.parentBoundTranscludeFn,k=d.transcludeControllers;d=d.futureParentElement;h&&h.$$boundTransclude&&(h=h.$$boundTransclude);g||(g=(d=
+d&&d[0])?"foreignobject"!==ta(d)&&d.toString().match(/SVG/)?"svg":"html":"html");d="html"!==g?B(Yb(g,B("<div>").append(a).html())):c?Pa.clone.call(a):a;if(k)for(var l in k)d.data("$"+l+"Controller",k[l].instance);K.$$addScopeInfo(d,b);c&&c(d,b);f&&f(b,d,d,h);return d}}function O(a,b,c,d,e,f){function g(a,c,d,e){var f,k,l,m,t,w,D;if(p)for(D=Array(c.length),m=0;m<h.length;m+=3)f=h[m],D[f]=c[f];else D=c;m=0;for(t=h.length;m<t;)k=D[h[m++]],c=h[m++],f=h[m++],c?(c.scope?(l=a.$new(),K.$$addScopeInfo(B(k),
+l)):l=a,w=c.transcludeOnThisElement?R(a,c.transclude,e):!c.templateOnThisElement&&e?e:!e&&b?R(a,b):null,c(f,l,k,d,w)):f&&f(a,k.childNodes,u,e)}for(var h=[],k,l,m,t,p,w=0;w<a.length;w++){k=new fa;l=V(a[w],[],k,0===w?d:u,e);(f=l.length?Z(l,a[w],k,b,c,null,[],[],f):null)&&f.scope&&K.$$addScopeClass(k.$$element);k=f&&f.terminal||!(m=a[w].childNodes)||!m.length?null:O(m,f?(f.transcludeOnThisElement||!f.templateOnThisElement)&&f.transclude:b);if(f||k)h.push(w,f,k),t=!0,p=p||f;f=null}return t?g:null}function R(a,
+b,c){return function(d,e,f,g,h){d||(d=a.$new(!1,h),d.$$transcluded=!0);return b(d,e,{parentBoundTranscludeFn:c,transcludeControllers:f,futureParentElement:g})}}function V(a,b,c,d,e){var h=c.$attr,k;switch(a.nodeType){case 1:P(b,va(ta(a)),"E",d,e);for(var l,m,t,p=a.attributes,w=0,D=p&&p.length;w<D;w++){var K=!1,A=!1;l=p[w];k=l.name;m=U(l.value);l=va(k);if(t=ka.test(l))k=k.replace(Vc,"").substr(8).replace(/_(.)/g,function(a,b){return b.toUpperCase()});(l=l.match(la))&&G(l[1])&&(K=k,A=k.substr(0,k.length-
+5)+"end",k=k.substr(0,k.length-6));l=va(k.toLowerCase());h[l]=k;if(t||!c.hasOwnProperty(l))c[l]=m,Qc(a,l)&&(c[l]=!0);W(a,b,m,l,t);P(b,l,"A",d,e,K,A)}a=a.className;H(a)&&(a=a.animVal);if(E(a)&&""!==a)for(;k=g.exec(a);)l=va(k[2]),P(b,l,"C",d,e)&&(c[l]=U(k[3])),a=a.substr(k.index+k[0].length);break;case Na:if(11===Ha)for(;a.parentNode&&a.nextSibling&&a.nextSibling.nodeType===Na;)a.nodeValue+=a.nextSibling.nodeValue,a.parentNode.removeChild(a.nextSibling);N(b,a.nodeValue);break;case 8:try{if(k=f.exec(a.nodeValue))l=
+va(k[1]),P(b,l,"M",d,e)&&(c[l]=U(k[2]))}catch(R){}}b.sort(Ia);return b}function Ta(a,b,c){var d=[],e=0;if(b&&a.hasAttribute&&a.hasAttribute(b)){do{if(!a)throw ha("uterdir",b,c);1==a.nodeType&&(a.hasAttribute(b)&&e++,a.hasAttribute(c)&&e--);d.push(a);a=a.nextSibling}while(0<e)}else d.push(a);return B(d)}function s(a,b,c){return function(d,e,f,g,h){e=Ta(e[0],b,c);return a(d,e,f,g,h)}}function Z(a,b,d,e,f,g,h,l,m){function t(a,b,c,d){if(a){c&&(a=s(a,c,d));a.require=q.require;a.directiveName=x;if(O===
+q||q.$$isolateScope)a=ca(a,{isolateScope:!0});h.push(a)}if(b){c&&(b=s(b,c,d));b.require=q.require;b.directiveName=x;if(O===q||q.$$isolateScope)b=ca(b,{isolateScope:!0});l.push(b)}}function p(a,b,c,d){var e;if(E(b)){var f=b.match(k);b=b.substring(f[0].length);var g=f[1]||f[3],f="?"===f[2];"^^"===g?c=c.parent():e=(e=d&&d[b])&&e.instance;e||(d="$"+b+"Controller",e=g?c.inheritedData(d):c.data(d));if(!e&&!f)throw ha("ctreq",b,a);}else if(I(b))for(e=[],g=0,f=b.length;g<f;g++)e[g]=p(a,b[g],c,d);return e||
+null}function w(a,b,c,d,e,f){var g=$(),h;for(h in d){var k=d[h],l={$scope:k===O||k.$$isolateScope?e:f,$element:a,$attrs:b,$transclude:c},m=k.controller;"@"==m&&(m=b[k.name]);l=C(m,l,!0,k.controllerAs);g[k.name]=l;aa||a.data("$"+k.name+"Controller",l.instance)}return g}function D(a,c,e,f,g){function k(a,b,c){var d;Za(a)||(c=b,b=a,a=u);aa&&(d=v);c||(c=aa?V.parent():V);return g(a,b,d,c,Ta)}var m,t,A,v,C,V,Ga;b===e?(f=d,V=d.$$element):(V=B(e),f=new fa(V,d));A=c;O?t=c.$new(!0):R&&(A=c.$parent);g&&(C=k,
+C.$$boundTransclude=g);T&&(v=w(V,f,C,T,t,c));O&&(K.$$addScopeInfo(V,t,!0,!(J&&(J===O||J===O.$$originalDirective))),K.$$addScopeClass(V,!0),t.$$isolateBindings=O.$$isolateBindings,(Ga=ba(c,f,t,t.$$isolateBindings,O))&&t.$on("$destroy",Ga));for(var n in v){Ga=T[n];var ga=v[n],L=Ga.$$bindings.bindToController;ga.identifier&&L&&(m=ba(A,f,ga.instance,L,Ga));var q=ga();q!==ga.instance&&(ga.instance=q,V.data("$"+Ga.name+"Controller",q),m&&m(),m=ba(A,f,ga.instance,L,Ga))}F=0;for(M=h.length;F<M;F++)m=h[F],
+ea(m,m.isolateScope?t:c,V,f,m.require&&p(m.directiveName,m.require,V,v),C);var Ta=c;O&&(O.template||null===O.templateUrl)&&(Ta=t);a&&a(Ta,e.childNodes,u,g);for(F=l.length-1;0<=F;F--)m=l[F],ea(m,m.isolateScope?t:c,V,f,m.require&&p(m.directiveName,m.require,V,v),C)}m=m||{};for(var A=-Number.MAX_VALUE,R=m.newScopeDirective,T=m.controllerDirectives,O=m.newIsolateScopeDirective,J=m.templateDirective,n=m.nonTlbTranscludeDirective,ga=!1,L=!1,aa=m.hasElementTranscludeDirective,Z=d.$$element=B(b),q,x,P,Ia=
+e,G,F=0,M=a.length;F<M;F++){q=a[F];var N=q.$$start,Q=q.$$end;N&&(Z=Ta(b,N,Q));P=u;if(A>q.priority)break;if(P=q.scope)q.templateUrl||(H(P)?(Ua("new/isolated scope",O||R,q,Z),O=q):Ua("new/isolated scope",O,q,Z)),R=R||q;x=q.name;!q.templateUrl&&q.controller&&(P=q.controller,T=T||$(),Ua("'"+x+"' controller",T[x],q,Z),T[x]=q);if(P=q.transclude)ga=!0,q.$$tlb||(Ua("transclusion",n,q,Z),n=q),"element"==P?(aa=!0,A=q.priority,P=Z,Z=d.$$element=B(X.createComment(" "+x+": "+d[x]+" ")),b=Z[0],Y(f,ra.call(P,0),
+b),Ia=K(P,e,A,g&&g.name,{nonTlbTranscludeDirective:n})):(P=B(Vb(b)).contents(),Z.empty(),Ia=K(P,e,u,u,{needsNewScope:q.$$isolateScope||q.$$newScope}));if(q.template)if(L=!0,Ua("template",J,q,Z),J=q,P=z(q.template)?q.template(Z,d):q.template,P=ja(P),q.replace){g=q;P=Tb.test(P)?Xc(Yb(q.templateNamespace,U(P))):[];b=P[0];if(1!=P.length||1!==b.nodeType)throw ha("tplrt",x,"");Y(f,Z,b);P={$attr:{}};var Wc=V(b,[],P),W=a.splice(F+1,a.length-(F+1));(O||R)&&y(Wc,O,R);a=a.concat(Wc).concat(W);S(d,P);M=a.length}else Z.html(P);
+if(q.templateUrl)L=!0,Ua("template",J,q,Z),J=q,q.replace&&(g=q),D=Of(a.splice(F,a.length-F),Z,d,f,ga&&Ia,h,l,{controllerDirectives:T,newScopeDirective:R!==q&&R,newIsolateScopeDirective:O,templateDirective:J,nonTlbTranscludeDirective:n}),M=a.length;else if(q.compile)try{G=q.compile(Z,d,Ia),z(G)?t(null,G,N,Q):G&&t(G.pre,G.post,N,Q)}catch(da){c(da,ua(Z))}q.terminal&&(D.terminal=!0,A=Math.max(A,q.priority))}D.scope=R&&!0===R.scope;D.transcludeOnThisElement=ga;D.templateOnThisElement=L;D.transclude=Ia;
+m.hasElementTranscludeDirective=aa;return D}function y(a,b,c){for(var d=0,e=a.length;d<e;d++)a[d]=Ob(a[d],{$$isolateScope:b,$$newScope:c})}function P(b,d,f,g,h,k,l){if(d===h)return null;h=null;if(e.hasOwnProperty(d)){var m;d=a.get(d+"Directive");for(var p=0,w=d.length;p<w;p++)try{m=d[p],(q(g)||g>m.priority)&&-1!=m.restrict.indexOf(f)&&(k&&(m=Ob(m,{$$start:k,$$end:l})),b.push(m),h=m)}catch(D){c(D)}}return h}function G(b){if(e.hasOwnProperty(b))for(var c=a.get(b+"Directive"),d=0,f=c.length;d<f;d++)if(b=
+c[d],b.multiElement)return!0;return!1}function S(a,b){var c=b.$attr,d=a.$attr,e=a.$$element;n(a,function(d,e){"$"!=e.charAt(0)&&(b[e]&&b[e]!==d&&(d+=("style"===e?";":" ")+b[e]),a.$set(e,d,!0,c[e]))});n(b,function(b,f){"class"==f?(J(e,b),a["class"]=(a["class"]?a["class"]+" ":"")+b):"style"==f?(e.attr("style",e.attr("style")+";"+b),a.style=(a.style?a.style+";":"")+b):"$"==f.charAt(0)||a.hasOwnProperty(f)||(a[f]=b,d[f]=c[f])})}function Of(a,b,c,e,f,g,h,k){var l=[],m,t,p=b[0],w=a.shift(),D=Ob(w,{templateUrl:null,
+transclude:null,replace:null,$$originalDirective:w}),A=z(w.templateUrl)?w.templateUrl(b,c):w.templateUrl,K=w.templateNamespace;b.empty();d(A).then(function(d){var T,v;d=ja(d);if(w.replace){d=Tb.test(d)?Xc(Yb(K,U(d))):[];T=d[0];if(1!=d.length||1!==T.nodeType)throw ha("tplrt",w.name,A);d={$attr:{}};Y(e,b,T);var C=V(T,[],d);H(w.scope)&&y(C,!0);a=C.concat(a);S(c,d)}else T=p,b.html(d);a.unshift(D);m=Z(a,T,c,f,b,w,g,h,k);n(e,function(a,c){a==T&&(e[c]=b[0])});for(t=O(b[0].childNodes,f);l.length;){d=l.shift();
+v=l.shift();var ga=l.shift(),L=l.shift(),C=b[0];if(!d.$$destroyed){if(v!==p){var q=v.className;k.hasElementTranscludeDirective&&w.replace||(C=Vb(T));Y(ga,B(v),C);J(B(C),q)}v=m.transcludeOnThisElement?R(d,m.transclude,L):L;m(t,d,C,e,v)}}l=null});return function(a,b,c,d,e){a=e;b.$$destroyed||(l?l.push(b,c,d,a):(m.transcludeOnThisElement&&(a=R(b,m.transclude,e)),m(t,b,c,d,a)))}}function Ia(a,b){var c=b.priority-a.priority;return 0!==c?c:a.name!==b.name?a.name<b.name?-1:1:a.index-b.index}function Ua(a,
+b,c,d){function e(a){return a?" (module: "+a+")":""}if(b)throw ha("multidir",b.name,e(b.$$moduleName),c.name,e(c.$$moduleName),a,ua(d));}function N(a,c){var d=b(c,!0);d&&a.push({priority:0,compile:function(a){a=a.parent();var b=!!a.length;b&&K.$$addBindingClass(a);return function(a,c){var e=c.parent();b||K.$$addBindingClass(e);K.$$addBindingInfo(e,d.expressions);a.$watch(d,function(a){c[0].nodeValue=a})}}})}function Yb(a,b){a=F(a||"html");switch(a){case "svg":case "math":var c=X.createElement("div");
+c.innerHTML="<"+a+">"+b+"</"+a+">";return c.childNodes[0].childNodes;default:return b}}function Q(a,b){if("srcdoc"==b)return L.HTML;var c=ta(a);if("xlinkHref"==b||"form"==c&&"action"==b||"img"!=c&&("src"==b||"ngSrc"==b))return L.RESOURCE_URL}function W(a,c,d,e,f){var g=Q(a,e);f=h[e]||f;var k=b(d,!0,g,f);if(k){if("multiple"===e&&"select"===ta(a))throw ha("selmulti",ua(a));c.push({priority:100,compile:function(){return{pre:function(a,c,h){c=h.$$observers||(h.$$observers=$());if(l.test(e))throw ha("nodomevents");
+var m=h[e];m!==d&&(k=m&&b(m,!0,g,f),d=m);k&&(h[e]=k(a),(c[e]||(c[e]=[])).$$inter=!0,(h.$$observers&&h.$$observers[e].$$scope||a).$watch(k,function(a,b){"class"===e&&a!=b?h.$updateClass(a,b):h.$set(e,a)}))}}}})}}function Y(a,b,c){var d=b[0],e=b.length,f=d.parentNode,g,h;if(a)for(g=0,h=a.length;g<h;g++)if(a[g]==d){a[g++]=c;h=g+e-1;for(var k=a.length;g<k;g++,h++)h<k?a[g]=a[h]:delete a[g];a.length-=e-1;a.context===d&&(a.context=c);break}f&&f.replaceChild(c,d);a=X.createDocumentFragment();a.appendChild(d);
+B.hasData(d)&&(B.data(c,B.data(d)),oa?(Rb=!0,oa.cleanData([d])):delete B.cache[d[B.expando]]);d=1;for(e=b.length;d<e;d++)f=b[d],B(f).remove(),a.appendChild(f),delete b[d];b[0]=c;b.length=1}function ca(a,b){return M(function(){return a.apply(null,arguments)},a,b)}function ea(a,b,d,e,f,g){try{a(b,d,e,f,g)}catch(h){c(h,ua(d))}}function ba(a,c,d,e,f){var g=[];n(e,function(e,h){var k=e.attrName,l=e.optional,m,t,w,D;switch(e.mode){case "@":l||qa.call(c,k)||(d[h]=c[k]=void 0);c.$observe(k,function(a){E(a)&&
+(d[h]=a)});c.$$observers[k].$$scope=a;E(c[k])&&(d[h]=b(c[k])(a));break;case "=":if(!qa.call(c,k)){if(l)break;c[k]=void 0}if(l&&!c[k])break;t=p(c[k]);D=t.literal?ma:function(a,b){return a===b||a!==a&&b!==b};w=t.assign||function(){m=d[h]=t(a);throw ha("nonassign",c[k],f.name);};m=d[h]=t(a);l=function(b){D(b,d[h])||(D(b,m)?w(a,b=d[h]):d[h]=b);return m=b};l.$stateful=!0;l=e.collection?a.$watchCollection(c[k],l):a.$watch(p(c[k],l),null,t.literal);g.push(l);break;case "&":t=c.hasOwnProperty(k)?p(c[k]):
+x;if(t===x&&l)break;d[h]=function(b){return t(a,b)}}});return g.length&&function(){for(var a=0,b=g.length;a<b;++a)g[a]()}}var fa=function(a,b){if(b){var c=Object.keys(b),d,e,f;d=0;for(e=c.length;d<e;d++)f=c[d],this[f]=b[f]}else this.$attr={};this.$$element=a};fa.prototype={$normalize:va,$addClass:function(a){a&&0<a.length&&aa.addClass(this.$$element,a)},$removeClass:function(a){a&&0<a.length&&aa.removeClass(this.$$element,a)},$updateClass:function(a,b){var c=Yc(a,b);c&&c.length&&aa.addClass(this.$$element,
+c);(c=Yc(b,a))&&c.length&&aa.removeClass(this.$$element,c)},$set:function(a,b,d,e){var f=Qc(this.$$element[0],a),g=Zc[a],h=a;f?(this.$$element.prop(a,b),e=f):g&&(this[g]=b,h=g);this[a]=b;e?this.$attr[a]=e:(e=this.$attr[a])||(this.$attr[a]=e=zc(a,"-"));f=ta(this.$$element);if("a"===f&&"href"===a||"img"===f&&"src"===a)this[a]=b=D(b,"src"===a);else if("img"===f&&"srcset"===a){for(var f="",g=U(b),k=/(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/,k=/\s/.test(g)?k:/(,)/,g=g.split(k),k=Math.floor(g.length/2),l=0;l<
+k;l++)var m=2*l,f=f+D(U(g[m]),!0),f=f+(" "+U(g[m+1]));g=U(g[2*l]).split(/\s/);f+=D(U(g[0]),!0);2===g.length&&(f+=" "+U(g[1]));this[a]=b=f}!1!==d&&(null===b||q(b)?this.$$element.removeAttr(e):this.$$element.attr(e,b));(a=this.$$observers)&&n(a[h],function(a){try{a(b)}catch(d){c(d)}})},$observe:function(a,b){var c=this,d=c.$$observers||(c.$$observers=$()),e=d[a]||(d[a]=[]);e.push(b);w.$evalAsync(function(){e.$$inter||!c.hasOwnProperty(a)||q(c[a])||b(c[a])});return function(){ab(e,b)}}};var da=b.startSymbol(),
+ia=b.endSymbol(),ja="{{"==da||"}}"==ia?Ya:function(a){return a.replace(/\{\{/g,da).replace(/}}/g,ia)},ka=/^ngAttr[A-Z]/,la=/^(.+)Start$/;K.$$addBindingInfo=m?function(a,b){var c=a.data("$binding")||[];I(b)?c=c.concat(b):c.push(b);a.data("$binding",c)}:x;K.$$addBindingClass=m?function(a){J(a,"ng-binding")}:x;K.$$addScopeInfo=m?function(a,b,c,d){a.data(c?d?"$isolateScopeNoTemplate":"$isolateScope":"$scope",b)}:x;K.$$addScopeClass=m?function(a,b){J(a,b?"ng-isolate-scope":"ng-scope")}:x;return K}]}function va(a){return fb(a.replace(Vc,
+""))}function Yc(a,b){var d="",c=a.split(/\s+/),e=b.split(/\s+/),f=0;a:for(;f<c.length;f++){for(var g=c[f],h=0;h<e.length;h++)if(g==e[h])continue a;d+=(0<d.length?" ":"")+g}return d}function Xc(a){a=B(a);var b=a.length;if(1>=b)return a;for(;b--;)8===a[b].nodeType&&Pf.call(a,b,1);return a}function Xe(){var a={},b=!1;this.register=function(b,c){Ra(b,"controller");H(b)?M(a,b):a[b]=c};this.allowGlobals=function(){b=!0};this.$get=["$injector","$window",function(d,c){function e(a,b,c,d){if(!a||!H(a.$scope))throw G("$controller")("noscp",
+d,b);a.$scope[b]=c}return function(f,g,h,k){var l,m,r;h=!0===h;k&&E(k)&&(r=k);if(E(f)){k=f.match(Uc);if(!k)throw Qf("ctrlfmt",f);m=k[1];r=r||k[3];f=a.hasOwnProperty(m)?a[m]:Bc(g.$scope,m,!0)||(b?Bc(c,m,!0):u);Qa(f,m,!0)}if(h)return h=(I(f)?f[f.length-1]:f).prototype,l=Object.create(h||null),r&&e(g,r,l,m||f.name),M(function(){var a=d.invoke(f,l,g,m);a!==l&&(H(a)||z(a))&&(l=a,r&&e(g,r,l,m||f.name));return l},{instance:l,identifier:r});l=d.instantiate(f,g,m);r&&e(g,r,l,m||f.name);return l}}]}function Ye(){this.$get=
+["$window",function(a){return B(a.document)}]}function Ze(){this.$get=["$log",function(a){return function(b,d){a.error.apply(a,arguments)}}]}function Zb(a){return H(a)?da(a)?a.toISOString():db(a):a}function df(){this.$get=function(){return function(a){if(!a)return"";var b=[];oc(a,function(a,c){null===a||q(a)||(I(a)?n(a,function(a,d){b.push(ja(c)+"="+ja(Zb(a)))}):b.push(ja(c)+"="+ja(Zb(a))))});return b.join("&")}}}function ef(){this.$get=function(){return function(a){function b(a,e,f){null===a||q(a)||
+(I(a)?n(a,function(a,c){b(a,e+"["+(H(a)?c:"")+"]")}):H(a)&&!da(a)?oc(a,function(a,c){b(a,e+(f?"":"[")+c+(f?"":"]"))}):d.push(ja(e)+"="+ja(Zb(a))))}if(!a)return"";var d=[];b(a,"",!0);return d.join("&")}}}function $b(a,b){if(E(a)){var d=a.replace(Rf,"").trim();if(d){var c=b("Content-Type");(c=c&&0===c.indexOf($c))||(c=(c=d.match(Sf))&&Tf[c[0]].test(d));c&&(a=uc(d))}}return a}function ad(a){var b=$(),d;E(a)?n(a.split("\n"),function(a){d=a.indexOf(":");var e=F(U(a.substr(0,d)));a=U(a.substr(d+1));e&&
+(b[e]=b[e]?b[e]+", "+a:a)}):H(a)&&n(a,function(a,d){var f=F(d),g=U(a);f&&(b[f]=b[f]?b[f]+", "+g:g)});return b}function bd(a){var b;return function(d){b||(b=ad(a));return d?(d=b[F(d)],void 0===d&&(d=null),d):b}}function cd(a,b,d,c){if(z(c))return c(a,b,d);n(c,function(c){a=c(a,b,d)});return a}function cf(){var a=this.defaults={transformResponse:[$b],transformRequest:[function(a){return H(a)&&"[object File]"!==sa.call(a)&&"[object Blob]"!==sa.call(a)&&"[object FormData]"!==sa.call(a)?db(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"},
+post:ia(ac),put:ia(ac),patch:ia(ac)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",paramSerializer:"$httpParamSerializer"},b=!1;this.useApplyAsync=function(a){return y(a)?(b=!!a,this):b};var d=!0;this.useLegacyPromiseExtensions=function(a){return y(a)?(d=!!a,this):d};var c=this.interceptors=[];this.$get=["$httpBackend","$$cookieReader","$cacheFactory","$rootScope","$q","$injector",function(e,f,g,h,k,l){function m(b){function c(a){var b=M({},a);b.data=cd(a.data,a.headers,a.status,f.transformResponse);
+a=a.status;return 200<=a&&300>a?b:k.reject(b)}function e(a,b){var c,d={};n(a,function(a,e){z(a)?(c=a(b),null!=c&&(d[e]=c)):d[e]=a});return d}if(!fa.isObject(b))throw G("$http")("badreq",b);var f=M({method:"get",transformRequest:a.transformRequest,transformResponse:a.transformResponse,paramSerializer:a.paramSerializer},b);f.headers=function(b){var c=a.headers,d=M({},b.headers),f,g,h,c=M({},c.common,c[F(b.method)]);a:for(f in c){g=F(f);for(h in d)if(F(h)===g)continue a;d[f]=c[f]}return e(d,ia(b))}(b);
+f.method=sb(f.method);f.paramSerializer=E(f.paramSerializer)?l.get(f.paramSerializer):f.paramSerializer;var g=[function(b){var d=b.headers,e=cd(b.data,bd(d),u,b.transformRequest);q(e)&&n(d,function(a,b){"content-type"===F(b)&&delete d[b]});q(b.withCredentials)&&!q(a.withCredentials)&&(b.withCredentials=a.withCredentials);return r(b,e).then(c,c)},u],h=k.when(f);for(n(v,function(a){(a.request||a.requestError)&&g.unshift(a.request,a.requestError);(a.response||a.responseError)&&g.push(a.response,a.responseError)});g.length;){b=
+g.shift();var m=g.shift(),h=h.then(b,m)}d?(h.success=function(a){Qa(a,"fn");h.then(function(b){a(b.data,b.status,b.headers,f)});return h},h.error=function(a){Qa(a,"fn");h.then(null,function(b){a(b.data,b.status,b.headers,f)});return h}):(h.success=dd("success"),h.error=dd("error"));return h}function r(c,d){function g(a,c,d,e){function f(){l(c,a,d,e)}J&&(200<=a&&300>a?J.put(R,[a,c,ad(d),e]):J.remove(R));b?h.$applyAsync(f):(f(),h.$$phase||h.$apply())}function l(a,b,d,e){b=-1<=b?b:0;(200<=b&&300>b?n.resolve:
+n.reject)({data:a,status:b,headers:bd(d),config:c,statusText:e})}function r(a){l(a.data,a.status,ia(a.headers()),a.statusText)}function v(){var a=m.pendingRequests.indexOf(c);-1!==a&&m.pendingRequests.splice(a,1)}var n=k.defer(),D=n.promise,J,K,O=c.headers,R=t(c.url,c.paramSerializer(c.params));m.pendingRequests.push(c);D.then(v,v);!c.cache&&!a.cache||!1===c.cache||"GET"!==c.method&&"JSONP"!==c.method||(J=H(c.cache)?c.cache:H(a.cache)?a.cache:A);J&&(K=J.get(R),y(K)?K&&z(K.then)?K.then(r,r):I(K)?l(K[1],
+K[0],ia(K[2]),K[3]):l(K,200,{},"OK"):J.put(R,D));q(K)&&((K=ed(c.url)?f()[c.xsrfCookieName||a.xsrfCookieName]:u)&&(O[c.xsrfHeaderName||a.xsrfHeaderName]=K),e(c.method,R,d,g,O,c.timeout,c.withCredentials,c.responseType));return D}function t(a,b){0<b.length&&(a+=(-1==a.indexOf("?")?"?":"&")+b);return a}var A=g("$http");a.paramSerializer=E(a.paramSerializer)?l.get(a.paramSerializer):a.paramSerializer;var v=[];n(c,function(a){v.unshift(E(a)?l.get(a):l.invoke(a))});m.pendingRequests=[];(function(a){n(arguments,
+function(a){m[a]=function(b,c){return m(M({},c||{},{method:a,url:b}))}})})("get","delete","head","jsonp");(function(a){n(arguments,function(a){m[a]=function(b,c,d){return m(M({},d||{},{method:a,url:b,data:c}))}})})("post","put","patch");m.defaults=a;return m}]}function gf(){this.$get=function(){return function(){return new S.XMLHttpRequest}}}function ff(){this.$get=["$browser","$window","$document","$xhrFactory",function(a,b,d,c){return Uf(a,c,a.defer,b.angular.callbacks,d[0])}]}function Uf(a,b,d,
+c,e){function f(a,b,d){var f=e.createElement("script"),m=null;f.type="text/javascript";f.src=a;f.async=!0;m=function(a){f.removeEventListener("load",m,!1);f.removeEventListener("error",m,!1);e.body.removeChild(f);f=null;var g=-1,A="unknown";a&&("load"!==a.type||c[b].called||(a={type:"error"}),A=a.type,g="error"===a.type?404:200);d&&d(g,A)};f.addEventListener("load",m,!1);f.addEventListener("error",m,!1);e.body.appendChild(f);return m}return function(e,h,k,l,m,r,t,A){function v(){C&&C();w&&w.abort()}
+function T(b,c,e,f,g){y(L)&&d.cancel(L);C=w=null;b(c,e,f,g);a.$$completeOutstandingRequest(x)}a.$$incOutstandingRequestCount();h=h||a.url();if("jsonp"==F(e)){var p="_"+(c.counter++).toString(36);c[p]=function(a){c[p].data=a;c[p].called=!0};var C=f(h.replace("JSON_CALLBACK","angular.callbacks."+p),p,function(a,b){T(l,a,c[p].data,"",b);c[p]=x})}else{var w=b(e,h);w.open(e,h,!0);n(m,function(a,b){y(a)&&w.setRequestHeader(b,a)});w.onload=function(){var a=w.statusText||"",b="response"in w?w.response:w.responseText,
+c=1223===w.status?204:w.status;0===c&&(c=b?200:"file"==wa(h).protocol?404:0);T(l,c,b,w.getAllResponseHeaders(),a)};e=function(){T(l,-1,null,null,"")};w.onerror=e;w.onabort=e;t&&(w.withCredentials=!0);if(A)try{w.responseType=A}catch(ga){if("json"!==A)throw ga;}w.send(q(k)?null:k)}if(0<r)var L=d(v,r);else r&&z(r.then)&&r.then(v)}}function af(){var a="{{",b="}}";this.startSymbol=function(b){return b?(a=b,this):a};this.endSymbol=function(a){return a?(b=a,this):b};this.$get=["$parse","$exceptionHandler",
+"$sce",function(d,c,e){function f(a){return"\\\\\\"+a}function g(c){return c.replace(m,a).replace(r,b)}function h(f,h,m,r){function p(a){try{var b=a;a=m?e.getTrusted(m,b):e.valueOf(b);var d;if(r&&!y(a))d=a;else if(null==a)d="";else{switch(typeof a){case "string":break;case "number":a=""+a;break;default:a=db(a)}d=a}return d}catch(g){c(Ja.interr(f,g))}}r=!!r;for(var C,w,n=0,L=[],s=[],D=f.length,J=[],K=[];n<D;)if(-1!=(C=f.indexOf(a,n))&&-1!=(w=f.indexOf(b,C+k)))n!==C&&J.push(g(f.substring(n,C))),n=f.substring(C+
+k,w),L.push(n),s.push(d(n,p)),n=w+l,K.push(J.length),J.push("");else{n!==D&&J.push(g(f.substring(n)));break}m&&1<J.length&&Ja.throwNoconcat(f);if(!h||L.length){var O=function(a){for(var b=0,c=L.length;b<c;b++){if(r&&q(a[b]))return;J[K[b]]=a[b]}return J.join("")};return M(function(a){var b=0,d=L.length,e=Array(d);try{for(;b<d;b++)e[b]=s[b](a);return O(e)}catch(g){c(Ja.interr(f,g))}},{exp:f,expressions:L,$$watchDelegate:function(a,b){var c;return a.$watchGroup(s,function(d,e){var f=O(d);z(b)&&b.call(this,
+f,d!==e?c:f,a);c=f})}})}}var k=a.length,l=b.length,m=new RegExp(a.replace(/./g,f),"g"),r=new RegExp(b.replace(/./g,f),"g");h.startSymbol=function(){return a};h.endSymbol=function(){return b};return h}]}function bf(){this.$get=["$rootScope","$window","$q","$$q",function(a,b,d,c){function e(e,h,k,l){var m=4<arguments.length,r=m?ra.call(arguments,4):[],t=b.setInterval,A=b.clearInterval,v=0,n=y(l)&&!l,p=(n?c:d).defer(),C=p.promise;k=y(k)?k:0;C.then(null,null,m?function(){e.apply(null,r)}:e);C.$$intervalId=
+t(function(){p.notify(v++);0<k&&v>=k&&(p.resolve(v),A(C.$$intervalId),delete f[C.$$intervalId]);n||a.$apply()},h);f[C.$$intervalId]=p;return C}var f={};e.cancel=function(a){return a&&a.$$intervalId in f?(f[a.$$intervalId].reject("canceled"),b.clearInterval(a.$$intervalId),delete f[a.$$intervalId],!0):!1};return e}]}function bc(a){a=a.split("/");for(var b=a.length;b--;)a[b]=ob(a[b]);return a.join("/")}function fd(a,b){var d=wa(a);b.$$protocol=d.protocol;b.$$host=d.hostname;b.$$port=ea(d.port)||Vf[d.protocol]||
+null}function gd(a,b){var d="/"!==a.charAt(0);d&&(a="/"+a);var c=wa(a);b.$$path=decodeURIComponent(d&&"/"===c.pathname.charAt(0)?c.pathname.substring(1):c.pathname);b.$$search=xc(c.search);b.$$hash=decodeURIComponent(c.hash);b.$$path&&"/"!=b.$$path.charAt(0)&&(b.$$path="/"+b.$$path)}function pa(a,b){if(0===b.indexOf(a))return b.substr(a.length)}function Fa(a){var b=a.indexOf("#");return-1==b?a:a.substr(0,b)}function ib(a){return a.replace(/(#.+)|#$/,"$1")}function cc(a,b,d){this.$$html5=!0;d=d||"";
+fd(a,this);this.$$parse=function(a){var d=pa(b,a);if(!E(d))throw Db("ipthprfx",a,b);gd(d,this);this.$$path||(this.$$path="/");this.$$compose()};this.$$compose=function(){var a=Qb(this.$$search),d=this.$$hash?"#"+ob(this.$$hash):"";this.$$url=bc(this.$$path)+(a?"?"+a:"")+d;this.$$absUrl=b+this.$$url.substr(1)};this.$$parseLinkUrl=function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;y(f=pa(a,c))?(g=f,g=y(f=pa(d,f))?b+(pa("/",f)||f):a+g):y(f=pa(b,c))?g=b+f:b==c+"/"&&(g=b);g&&this.$$parse(g);
+return!!g}}function dc(a,b,d){fd(a,this);this.$$parse=function(c){var e=pa(a,c)||pa(b,c),f;q(e)||"#"!==e.charAt(0)?this.$$html5?f=e:(f="",q(e)&&(a=c,this.replace())):(f=pa(d,e),q(f)&&(f=e));gd(f,this);c=this.$$path;var e=a,g=/^\/[A-Z]:(\/.*)/;0===f.indexOf(e)&&(f=f.replace(e,""));g.exec(f)||(c=(f=g.exec(c))?f[1]:c);this.$$path=c;this.$$compose()};this.$$compose=function(){var b=Qb(this.$$search),e=this.$$hash?"#"+ob(this.$$hash):"";this.$$url=bc(this.$$path)+(b?"?"+b:"")+e;this.$$absUrl=a+(this.$$url?
+d+this.$$url:"")};this.$$parseLinkUrl=function(b,d){return Fa(a)==Fa(b)?(this.$$parse(b),!0):!1}}function hd(a,b,d){this.$$html5=!0;dc.apply(this,arguments);this.$$parseLinkUrl=function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;a==Fa(c)?f=c:(g=pa(b,c))?f=a+d+g:b===c+"/"&&(f=b);f&&this.$$parse(f);return!!f};this.$$compose=function(){var b=Qb(this.$$search),e=this.$$hash?"#"+ob(this.$$hash):"";this.$$url=bc(this.$$path)+(b?"?"+b:"")+e;this.$$absUrl=a+d+this.$$url}}function Eb(a){return function(){return this[a]}}
+function id(a,b){return function(d){if(q(d))return this[a];this[a]=b(d);this.$$compose();return this}}function hf(){var a="",b={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(b){return y(b)?(a=b,this):a};this.html5Mode=function(a){return $a(a)?(b.enabled=a,this):H(a)?($a(a.enabled)&&(b.enabled=a.enabled),$a(a.requireBase)&&(b.requireBase=a.requireBase),$a(a.rewriteLinks)&&(b.rewriteLinks=a.rewriteLinks),this):b};this.$get=["$rootScope","$browser","$sniffer","$rootElement","$window",
+function(d,c,e,f,g){function h(a,b,d){var e=l.url(),f=l.$$state;try{c.url(a,b,d),l.$$state=c.state()}catch(g){throw l.url(e),l.$$state=f,g;}}function k(a,b){d.$broadcast("$locationChangeSuccess",l.absUrl(),a,l.$$state,b)}var l,m;m=c.baseHref();var r=c.url(),t;if(b.enabled){if(!m&&b.requireBase)throw Db("nobase");t=r.substring(0,r.indexOf("/",r.indexOf("//")+2))+(m||"/");m=e.history?cc:hd}else t=Fa(r),m=dc;var A=t.substr(0,Fa(t).lastIndexOf("/")+1);l=new m(t,A,"#"+a);l.$$parseLinkUrl(r,r);l.$$state=
+c.state();var v=/^\s*(javascript|mailto):/i;f.on("click",function(a){if(b.rewriteLinks&&!a.ctrlKey&&!a.metaKey&&!a.shiftKey&&2!=a.which&&2!=a.button){for(var e=B(a.target);"a"!==ta(e[0]);)if(e[0]===f[0]||!(e=e.parent())[0])return;var h=e.prop("href"),k=e.attr("href")||e.attr("xlink:href");H(h)&&"[object SVGAnimatedString]"===h.toString()&&(h=wa(h.animVal).href);v.test(h)||!h||e.attr("target")||a.isDefaultPrevented()||!l.$$parseLinkUrl(h,k)||(a.preventDefault(),l.absUrl()!=c.url()&&(d.$apply(),g.angular["ff-684208-preventDefault"]=
+!0))}});ib(l.absUrl())!=ib(r)&&c.url(l.absUrl(),!0);var n=!0;c.onUrlChange(function(a,b){q(pa(A,a))?g.location.href=a:(d.$evalAsync(function(){var c=l.absUrl(),e=l.$$state,f;a=ib(a);l.$$parse(a);l.$$state=b;f=d.$broadcast("$locationChangeStart",a,c,b,e).defaultPrevented;l.absUrl()===a&&(f?(l.$$parse(c),l.$$state=e,h(c,!1,e)):(n=!1,k(c,e)))}),d.$$phase||d.$digest())});d.$watch(function(){var a=ib(c.url()),b=ib(l.absUrl()),f=c.state(),g=l.$$replace,m=a!==b||l.$$html5&&e.history&&f!==l.$$state;if(n||
+m)n=!1,d.$evalAsync(function(){var b=l.absUrl(),c=d.$broadcast("$locationChangeStart",b,a,l.$$state,f).defaultPrevented;l.absUrl()===b&&(c?(l.$$parse(a),l.$$state=f):(m&&h(b,g,f===l.$$state?null:l.$$state),k(a,f)))});l.$$replace=!1});return l}]}function jf(){var a=!0,b=this;this.debugEnabled=function(b){return y(b)?(a=b,this):a};this.$get=["$window",function(d){function c(a){a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&
+(a=a.message+"\n"+a.sourceURL+":"+a.line));return a}function e(a){var b=d.console||{},e=b[a]||b.log||x;a=!1;try{a=!!e.apply}catch(k){}return a?function(){var a=[];n(arguments,function(b){a.push(c(b))});return e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){a&&c.apply(b,arguments)}}()}}]}function Va(a,b){if("__defineGetter__"===a||"__defineSetter__"===a||"__lookupGetter__"===a||"__lookupSetter__"===
+a||"__proto__"===a)throw ba("isecfld",b);return a}function jd(a,b){a+="";if(!E(a))throw ba("iseccst",b);return a}function xa(a,b){if(a){if(a.constructor===a)throw ba("isecfn",b);if(a.window===a)throw ba("isecwindow",b);if(a.children&&(a.nodeName||a.prop&&a.attr&&a.find))throw ba("isecdom",b);if(a===Object)throw ba("isecobj",b);}return a}function kd(a,b){if(a){if(a.constructor===a)throw ba("isecfn",b);if(a===Wf||a===Xf||a===Yf)throw ba("isecff",b);}}function ld(a,b){if(a&&(a===(0).constructor||a===
+(!1).constructor||a==="".constructor||a==={}.constructor||a===[].constructor||a===Function.constructor))throw ba("isecaf",b);}function Zf(a,b){return"undefined"!==typeof a?a:b}function md(a,b){return"undefined"===typeof a?b:"undefined"===typeof b?a:a+b}function W(a,b){var d,c;switch(a.type){case s.Program:d=!0;n(a.body,function(a){W(a.expression,b);d=d&&a.expression.constant});a.constant=d;break;case s.Literal:a.constant=!0;a.toWatch=[];break;case s.UnaryExpression:W(a.argument,b);a.constant=a.argument.constant;
+a.toWatch=a.argument.toWatch;break;case s.BinaryExpression:W(a.left,b);W(a.right,b);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.left.toWatch.concat(a.right.toWatch);break;case s.LogicalExpression:W(a.left,b);W(a.right,b);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.constant?[]:[a];break;case s.ConditionalExpression:W(a.test,b);W(a.alternate,b);W(a.consequent,b);a.constant=a.test.constant&&a.alternate.constant&&a.consequent.constant;a.toWatch=a.constant?[]:[a];break;case s.Identifier:a.constant=
+!1;a.toWatch=[a];break;case s.MemberExpression:W(a.object,b);a.computed&&W(a.property,b);a.constant=a.object.constant&&(!a.computed||a.property.constant);a.toWatch=[a];break;case s.CallExpression:d=a.filter?!b(a.callee.name).$stateful:!1;c=[];n(a.arguments,function(a){W(a,b);d=d&&a.constant;a.constant||c.push.apply(c,a.toWatch)});a.constant=d;a.toWatch=a.filter&&!b(a.callee.name).$stateful?c:[a];break;case s.AssignmentExpression:W(a.left,b);W(a.right,b);a.constant=a.left.constant&&a.right.constant;
+a.toWatch=[a];break;case s.ArrayExpression:d=!0;c=[];n(a.elements,function(a){W(a,b);d=d&&a.constant;a.constant||c.push.apply(c,a.toWatch)});a.constant=d;a.toWatch=c;break;case s.ObjectExpression:d=!0;c=[];n(a.properties,function(a){W(a.value,b);d=d&&a.value.constant;a.value.constant||c.push.apply(c,a.value.toWatch)});a.constant=d;a.toWatch=c;break;case s.ThisExpression:a.constant=!1,a.toWatch=[]}}function nd(a){if(1==a.length){a=a[0].expression;var b=a.toWatch;return 1!==b.length?b:b[0]!==a?b:u}}
+function od(a){return a.type===s.Identifier||a.type===s.MemberExpression}function pd(a){if(1===a.body.length&&od(a.body[0].expression))return{type:s.AssignmentExpression,left:a.body[0].expression,right:{type:s.NGValueParameter},operator:"="}}function qd(a){return 0===a.body.length||1===a.body.length&&(a.body[0].expression.type===s.Literal||a.body[0].expression.type===s.ArrayExpression||a.body[0].expression.type===s.ObjectExpression)}function rd(a,b){this.astBuilder=a;this.$filter=b}function sd(a,
+b){this.astBuilder=a;this.$filter=b}function Fb(a){return"constructor"==a}function ec(a){return z(a.valueOf)?a.valueOf():$f.call(a)}function kf(){var a=$(),b=$();this.$get=["$filter",function(d){function c(a,b){return null==a||null==b?a===b:"object"===typeof a&&(a=ec(a),"object"===typeof a)?!1:a===b||a!==a&&b!==b}function e(a,b,d,e,f){var g=e.inputs,h;if(1===g.length){var k=c,g=g[0];return a.$watch(function(a){var b=g(a);c(b,k)||(h=e(a,u,u,[b]),k=b&&ec(b));return h},b,d,f)}for(var l=[],m=[],r=0,n=
+g.length;r<n;r++)l[r]=c,m[r]=null;return a.$watch(function(a){for(var b=!1,d=0,f=g.length;d<f;d++){var k=g[d](a);if(b||(b=!c(k,l[d])))m[d]=k,l[d]=k&&ec(k)}b&&(h=e(a,u,u,m));return h},b,d,f)}function f(a,b,c,d){var e,f;return e=a.$watch(function(a){return d(a)},function(a,c,d){f=a;z(b)&&b.apply(this,arguments);y(a)&&d.$$postDigest(function(){y(f)&&e()})},c)}function g(a,b,c,d){function e(a){var b=!0;n(a,function(a){y(a)||(b=!1)});return b}var f,g;return f=a.$watch(function(a){return d(a)},function(a,
+c,d){g=a;z(b)&&b.call(this,a,c,d);e(a)&&d.$$postDigest(function(){e(g)&&f()})},c)}function h(a,b,c,d){var e;return e=a.$watch(function(a){return d(a)},function(a,c,d){z(b)&&b.apply(this,arguments);e()},c)}function k(a,b){if(!b)return a;var c=a.$$watchDelegate,d=!1,c=c!==g&&c!==f?function(c,e,f,g){f=d&&g?g[0]:a(c,e,f,g);return b(f,c,e)}:function(c,d,e,f){e=a(c,d,e,f);c=b(e,c,d);return y(e)?c:e};a.$$watchDelegate&&a.$$watchDelegate!==e?c.$$watchDelegate=a.$$watchDelegate:b.$stateful||(c.$$watchDelegate=
+e,d=!a.inputs,c.inputs=a.inputs?a.inputs:[a]);return c}var l=Ba().noUnsafeEval,m={csp:l,expensiveChecks:!1},r={csp:l,expensiveChecks:!0};return function(c,l,v){var n,p,q;switch(typeof c){case "string":q=c=c.trim();var w=v?b:a;n=w[q];n||(":"===c.charAt(0)&&":"===c.charAt(1)&&(p=!0,c=c.substring(2)),v=v?r:m,n=new fc(v),n=(new gc(n,d,v)).parse(c),n.constant?n.$$watchDelegate=h:p?n.$$watchDelegate=n.literal?g:f:n.inputs&&(n.$$watchDelegate=e),w[q]=n);return k(n,l);case "function":return k(c,l);default:return x}}}]}
+function mf(){this.$get=["$rootScope","$exceptionHandler",function(a,b){return td(function(b){a.$evalAsync(b)},b)}]}function nf(){this.$get=["$browser","$exceptionHandler",function(a,b){return td(function(b){a.defer(b)},b)}]}function td(a,b){function d(a,b,c){function d(b){return function(c){e||(e=!0,b.call(a,c))}}var e=!1;return[d(b),d(c)]}function c(){this.$$state={status:0}}function e(a,b){return function(c){b.call(a,c)}}function f(c){!c.processScheduled&&c.pending&&(c.processScheduled=!0,a(function(){var a,
+d,e;e=c.pending;c.processScheduled=!1;c.pending=u;for(var f=0,g=e.length;f<g;++f){d=e[f][0];a=e[f][c.status];try{z(a)?d.resolve(a(c.value)):1===c.status?d.resolve(c.value):d.reject(c.value)}catch(h){d.reject(h),b(h)}}}))}function g(){this.promise=new c;this.resolve=e(this,this.resolve);this.reject=e(this,this.reject);this.notify=e(this,this.notify)}var h=G("$q",TypeError);M(c.prototype,{then:function(a,b,c){if(q(a)&&q(b)&&q(c))return this;var d=new g;this.$$state.pending=this.$$state.pending||[];
+this.$$state.pending.push([d,a,b,c]);0<this.$$state.status&&f(this.$$state);return d.promise},"catch":function(a){return this.then(null,a)},"finally":function(a,b){return this.then(function(b){return l(b,!0,a)},function(b){return l(b,!1,a)},b)}});M(g.prototype,{resolve:function(a){this.promise.$$state.status||(a===this.promise?this.$$reject(h("qcycle",a)):this.$$resolve(a))},$$resolve:function(a){var c,e;e=d(this,this.$$resolve,this.$$reject);try{if(H(a)||z(a))c=a&&a.then;z(c)?(this.promise.$$state.status=
+-1,c.call(a,e[0],e[1],this.notify)):(this.promise.$$state.value=a,this.promise.$$state.status=1,f(this.promise.$$state))}catch(g){e[1](g),b(g)}},reject:function(a){this.promise.$$state.status||this.$$reject(a)},$$reject:function(a){this.promise.$$state.value=a;this.promise.$$state.status=2;f(this.promise.$$state)},notify:function(c){var d=this.promise.$$state.pending;0>=this.promise.$$state.status&&d&&d.length&&a(function(){for(var a,e,f=0,g=d.length;f<g;f++){e=d[f][0];a=d[f][3];try{e.notify(z(a)?
+a(c):c)}catch(h){b(h)}}})}});var k=function(a,b){var c=new g;b?c.resolve(a):c.reject(a);return c.promise},l=function(a,b,c){var d=null;try{z(c)&&(d=c())}catch(e){return k(e,!1)}return d&&z(d.then)?d.then(function(){return k(a,b)},function(a){return k(a,!1)}):k(a,b)},m=function(a,b,c,d){var e=new g;e.resolve(a);return e.promise.then(b,c,d)},r=function A(a){if(!z(a))throw h("norslvr",a);if(!(this instanceof A))return new A(a);var b=new g;a(function(a){b.resolve(a)},function(a){b.reject(a)});return b.promise};
+r.defer=function(){return new g};r.reject=function(a){var b=new g;b.reject(a);return b.promise};r.when=m;r.resolve=m;r.all=function(a){var b=new g,c=0,d=I(a)?[]:{};n(a,function(a,e){c++;m(a).then(function(a){d.hasOwnProperty(e)||(d[e]=a,--c||b.resolve(d))},function(a){d.hasOwnProperty(e)||b.reject(a)})});0===c&&b.resolve(d);return b.promise};return r}function wf(){this.$get=["$window","$timeout",function(a,b){var d=a.requestAnimationFrame||a.webkitRequestAnimationFrame,c=a.cancelAnimationFrame||a.webkitCancelAnimationFrame||
+a.webkitCancelRequestAnimationFrame,e=!!d,f=e?function(a){var b=d(a);return function(){c(b)}}:function(a){var c=b(a,16.66,!1);return function(){b.cancel(c)}};f.supported=e;return f}]}function lf(){function a(a){function b(){this.$$watchers=this.$$nextSibling=this.$$childHead=this.$$childTail=null;this.$$listeners={};this.$$listenerCount={};this.$$watchersCount=0;this.$id=++nb;this.$$ChildScope=null}b.prototype=a;return b}var b=10,d=G("$rootScope"),c=null,e=null;this.digestTtl=function(a){arguments.length&&
+(b=a);return b};this.$get=["$injector","$exceptionHandler","$parse","$browser",function(f,g,h,k){function l(a){a.currentScope.$$destroyed=!0}function m(a){9===Ha&&(a.$$childHead&&m(a.$$childHead),a.$$nextSibling&&m(a.$$nextSibling));a.$parent=a.$$nextSibling=a.$$prevSibling=a.$$childHead=a.$$childTail=a.$root=a.$$watchers=null}function r(){this.$id=++nb;this.$$phase=this.$parent=this.$$watchers=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null;this.$root=this;this.$$destroyed=
+!1;this.$$listeners={};this.$$listenerCount={};this.$$watchersCount=0;this.$$isolateBindings=null}function t(a){if(w.$$phase)throw d("inprog",w.$$phase);w.$$phase=a}function A(a,b){do a.$$watchersCount+=b;while(a=a.$parent)}function v(a,b,c){do a.$$listenerCount[c]-=b,0===a.$$listenerCount[c]&&delete a.$$listenerCount[c];while(a=a.$parent)}function s(){}function p(){for(;aa.length;)try{aa.shift()()}catch(a){g(a)}e=null}function C(){null===e&&(e=k.defer(function(){w.$apply(p)}))}r.prototype={constructor:r,
+$new:function(b,c){var d;c=c||this;b?(d=new r,d.$root=this.$root):(this.$$ChildScope||(this.$$ChildScope=a(this)),d=new this.$$ChildScope);d.$parent=c;d.$$prevSibling=c.$$childTail;c.$$childHead?(c.$$childTail.$$nextSibling=d,c.$$childTail=d):c.$$childHead=c.$$childTail=d;(b||c!=this)&&d.$on("$destroy",l);return d},$watch:function(a,b,d,e){var f=h(a);if(f.$$watchDelegate)return f.$$watchDelegate(this,b,d,f,a);var g=this,k=g.$$watchers,l={fn:b,last:s,get:f,exp:e||a,eq:!!d};c=null;z(b)||(l.fn=x);k||
+(k=g.$$watchers=[]);k.unshift(l);A(this,1);return function(){0<=ab(k,l)&&A(g,-1);c=null}},$watchGroup:function(a,b){function c(){h=!1;k?(k=!1,b(e,e,g)):b(e,d,g)}var d=Array(a.length),e=Array(a.length),f=[],g=this,h=!1,k=!0;if(!a.length){var l=!0;g.$evalAsync(function(){l&&b(e,e,g)});return function(){l=!1}}if(1===a.length)return this.$watch(a[0],function(a,c,f){e[0]=a;d[0]=c;b(e,a===c?e:d,f)});n(a,function(a,b){var k=g.$watch(a,function(a,f){e[b]=a;d[b]=f;h||(h=!0,g.$evalAsync(c))});f.push(k)});return function(){for(;f.length;)f.shift()()}},
+$watchCollection:function(a,b){function c(a){e=a;var b,d,g,h;if(!q(e)){if(H(e))if(za(e))for(f!==r&&(f=r,n=f.length=0,l++),a=e.length,n!==a&&(l++,f.length=n=a),b=0;b<a;b++)h=f[b],g=e[b],d=h!==h&&g!==g,d||h===g||(l++,f[b]=g);else{f!==t&&(f=t={},n=0,l++);a=0;for(b in e)qa.call(e,b)&&(a++,g=e[b],h=f[b],b in f?(d=h!==h&&g!==g,d||h===g||(l++,f[b]=g)):(n++,f[b]=g,l++));if(n>a)for(b in l++,f)qa.call(e,b)||(n--,delete f[b])}else f!==e&&(f=e,l++);return l}}c.$stateful=!0;var d=this,e,f,g,k=1<b.length,l=0,m=
+h(a,c),r=[],t={},p=!0,n=0;return this.$watch(m,function(){p?(p=!1,b(e,e,d)):b(e,g,d);if(k)if(H(e))if(za(e)){g=Array(e.length);for(var a=0;a<e.length;a++)g[a]=e[a]}else for(a in g={},e)qa.call(e,a)&&(g[a]=e[a]);else g=e})},$digest:function(){var a,f,h,l,m,r,n=b,A,q=[],v,C;t("$digest");k.$$checkUrlChange();this===w&&null!==e&&(k.defer.cancel(e),p());c=null;do{r=!1;for(A=this;u.length;){try{C=u.shift(),C.scope.$eval(C.expression,C.locals)}catch(aa){g(aa)}c=null}a:do{if(l=A.$$watchers)for(m=l.length;m--;)try{if(a=
+l[m])if((f=a.get(A))!==(h=a.last)&&!(a.eq?ma(f,h):"number"===typeof f&&"number"===typeof h&&isNaN(f)&&isNaN(h)))r=!0,c=a,a.last=a.eq?bb(f,null):f,a.fn(f,h===s?f:h,A),5>n&&(v=4-n,q[v]||(q[v]=[]),q[v].push({msg:z(a.exp)?"fn: "+(a.exp.name||a.exp.toString()):a.exp,newVal:f,oldVal:h}));else if(a===c){r=!1;break a}}catch(y){g(y)}if(!(l=A.$$watchersCount&&A.$$childHead||A!==this&&A.$$nextSibling))for(;A!==this&&!(l=A.$$nextSibling);)A=A.$parent}while(A=l);if((r||u.length)&&!n--)throw w.$$phase=null,d("infdig",
+b,q);}while(r||u.length);for(w.$$phase=null;L.length;)try{L.shift()()}catch(x){g(x)}},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy");this.$$destroyed=!0;this===w&&k.$$applicationDestroyed();A(this,-this.$$watchersCount);for(var b in this.$$listenerCount)v(this,this.$$listenerCount[b],b);a&&a.$$childHead==this&&(a.$$childHead=this.$$nextSibling);a&&a.$$childTail==this&&(a.$$childTail=this.$$prevSibling);this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=
+this.$$nextSibling);this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling);this.$destroy=this.$digest=this.$apply=this.$evalAsync=this.$applyAsync=x;this.$on=this.$watch=this.$watchGroup=function(){return x};this.$$listeners={};this.$$nextSibling=null;m(this)}},$eval:function(a,b){return h(a)(this,b)},$evalAsync:function(a,b){w.$$phase||u.length||k.defer(function(){u.length&&w.$digest()});u.push({scope:this,expression:a,locals:b})},$$postDigest:function(a){L.push(a)},$apply:function(a){try{t("$apply");
+try{return this.$eval(a)}finally{w.$$phase=null}}catch(b){g(b)}finally{try{w.$digest()}catch(c){throw g(c),c;}}},$applyAsync:function(a){function b(){c.$eval(a)}var c=this;a&&aa.push(b);C()},$on:function(a,b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]);c.push(b);var d=this;do d.$$listenerCount[a]||(d.$$listenerCount[a]=0),d.$$listenerCount[a]++;while(d=d.$parent);var e=this;return function(){var d=c.indexOf(b);-1!==d&&(c[d]=null,v(e,1,a))}},$emit:function(a,b){var c=[],d,e=this,f=!1,h=
+{name:a,targetScope:e,stopPropagation:function(){f=!0},preventDefault:function(){h.defaultPrevented=!0},defaultPrevented:!1},k=cb([h],arguments,1),l,m;do{d=e.$$listeners[a]||c;h.currentScope=e;l=0;for(m=d.length;l<m;l++)if(d[l])try{d[l].apply(null,k)}catch(r){g(r)}else d.splice(l,1),l--,m--;if(f)return h.currentScope=null,h;e=e.$parent}while(e);h.currentScope=null;return h},$broadcast:function(a,b){var c=this,d=this,e={name:a,targetScope:this,preventDefault:function(){e.defaultPrevented=!0},defaultPrevented:!1};
+if(!this.$$listenerCount[a])return e;for(var f=cb([e],arguments,1),h,k;c=d;){e.currentScope=c;d=c.$$listeners[a]||[];h=0;for(k=d.length;h<k;h++)if(d[h])try{d[h].apply(null,f)}catch(l){g(l)}else d.splice(h,1),h--,k--;if(!(d=c.$$listenerCount[a]&&c.$$childHead||c!==this&&c.$$nextSibling))for(;c!==this&&!(d=c.$$nextSibling);)c=c.$parent}e.currentScope=null;return e}};var w=new r,u=w.$$asyncQueue=[],L=w.$$postDigestQueue=[],aa=w.$$applyAsyncQueue=[];return w}]}function ge(){var a=/^\s*(https?|ftp|mailto|tel|file):/,
+b=/^\s*((https?|ftp|file|blob):|data:image\/)/;this.aHrefSanitizationWhitelist=function(b){return y(b)?(a=b,this):a};this.imgSrcSanitizationWhitelist=function(a){return y(a)?(b=a,this):b};this.$get=function(){return function(d,c){var e=c?b:a,f;f=wa(d).href;return""===f||f.match(e)?d:"unsafe:"+f}}}function ag(a){if("self"===a)return a;if(E(a)){if(-1<a.indexOf("***"))throw ya("iwcard",a);a=ud(a).replace("\\*\\*",".*").replace("\\*","[^:/.?&;]*");return new RegExp("^"+a+"$")}if(Ma(a))return new RegExp("^"+
+a.source+"$");throw ya("imatcher");}function vd(a){var b=[];y(a)&&n(a,function(a){b.push(ag(a))});return b}function pf(){this.SCE_CONTEXTS=la;var a=["self"],b=[];this.resourceUrlWhitelist=function(b){arguments.length&&(a=vd(b));return a};this.resourceUrlBlacklist=function(a){arguments.length&&(b=vd(a));return b};this.$get=["$injector",function(d){function c(a,b){return"self"===a?ed(b):!!a.exec(b.href)}function e(a){var b=function(a){this.$$unwrapTrustedValue=function(){return a}};a&&(b.prototype=
+new a);b.prototype.valueOf=function(){return this.$$unwrapTrustedValue()};b.prototype.toString=function(){return this.$$unwrapTrustedValue().toString()};return b}var f=function(a){throw ya("unsafe");};d.has("$sanitize")&&(f=d.get("$sanitize"));var g=e(),h={};h[la.HTML]=e(g);h[la.CSS]=e(g);h[la.URL]=e(g);h[la.JS]=e(g);h[la.RESOURCE_URL]=e(h[la.URL]);return{trustAs:function(a,b){var c=h.hasOwnProperty(a)?h[a]:null;if(!c)throw ya("icontext",a,b);if(null===b||q(b)||""===b)return b;if("string"!==typeof b)throw ya("itype",
+a);return new c(b)},getTrusted:function(d,e){if(null===e||q(e)||""===e)return e;var g=h.hasOwnProperty(d)?h[d]:null;if(g&&e instanceof g)return e.$$unwrapTrustedValue();if(d===la.RESOURCE_URL){var g=wa(e.toString()),r,t,n=!1;r=0;for(t=a.length;r<t;r++)if(c(a[r],g)){n=!0;break}if(n)for(r=0,t=b.length;r<t;r++)if(c(b[r],g)){n=!1;break}if(n)return e;throw ya("insecurl",e.toString());}if(d===la.HTML)return f(e);throw ya("unsafe");},valueOf:function(a){return a instanceof g?a.$$unwrapTrustedValue():a}}}]}
+function of(){var a=!0;this.enabled=function(b){arguments.length&&(a=!!b);return a};this.$get=["$parse","$sceDelegate",function(b,d){if(a&&8>Ha)throw ya("iequirks");var c=ia(la);c.isEnabled=function(){return a};c.trustAs=d.trustAs;c.getTrusted=d.getTrusted;c.valueOf=d.valueOf;a||(c.trustAs=c.getTrusted=function(a,b){return b},c.valueOf=Ya);c.parseAs=function(a,d){var e=b(d);return e.literal&&e.constant?e:b(d,function(b){return c.getTrusted(a,b)})};var e=c.parseAs,f=c.getTrusted,g=c.trustAs;n(la,function(a,
+b){var d=F(b);c[fb("parse_as_"+d)]=function(b){return e(a,b)};c[fb("get_trusted_"+d)]=function(b){return f(a,b)};c[fb("trust_as_"+d)]=function(b){return g(a,b)}});return c}]}function qf(){this.$get=["$window","$document",function(a,b){var d={},c=ea((/android (\d+)/.exec(F((a.navigator||{}).userAgent))||[])[1]),e=/Boxee/i.test((a.navigator||{}).userAgent),f=b[0]||{},g,h=/^(Moz|webkit|ms)(?=[A-Z])/,k=f.body&&f.body.style,l=!1,m=!1;if(k){for(var r in k)if(l=h.exec(r)){g=l[0];g=g.substr(0,1).toUpperCase()+
+g.substr(1);break}g||(g="WebkitOpacity"in k&&"webkit");l=!!("transition"in k||g+"Transition"in k);m=!!("animation"in k||g+"Animation"in k);!c||l&&m||(l=E(k.webkitTransition),m=E(k.webkitAnimation))}return{history:!(!a.history||!a.history.pushState||4>c||e),hasEvent:function(a){if("input"===a&&11>=Ha)return!1;if(q(d[a])){var b=f.createElement("div");d[a]="on"+a in b}return d[a]},csp:Ba(),vendorPrefix:g,transitions:l,animations:m,android:c}}]}function sf(){this.$get=["$templateCache","$http","$q","$sce",
+function(a,b,d,c){function e(f,g){e.totalPendingRequests++;E(f)&&a.get(f)||(f=c.getTrustedResourceUrl(f));var h=b.defaults&&b.defaults.transformResponse;I(h)?h=h.filter(function(a){return a!==$b}):h===$b&&(h=null);return b.get(f,{cache:a,transformResponse:h})["finally"](function(){e.totalPendingRequests--}).then(function(b){a.put(f,b.data);return b.data},function(a){if(!g)throw ha("tpload",f,a.status,a.statusText);return d.reject(a)})}e.totalPendingRequests=0;return e}]}function tf(){this.$get=["$rootScope",
+"$browser","$location",function(a,b,d){return{findBindings:function(a,b,d){a=a.getElementsByClassName("ng-binding");var g=[];n(a,function(a){var c=fa.element(a).data("$binding");c&&n(c,function(c){d?(new RegExp("(^|\\s)"+ud(b)+"(\\s|\\||$)")).test(c)&&g.push(a):-1!=c.indexOf(b)&&g.push(a)})});return g},findModels:function(a,b,d){for(var g=["ng-","data-ng-","ng\\:"],h=0;h<g.length;++h){var k=a.querySelectorAll("["+g[h]+"model"+(d?"=":"*=")+'"'+b+'"]');if(k.length)return k}},getLocation:function(){return d.url()},
+setLocation:function(b){b!==d.url()&&(d.url(b),a.$digest())},whenStable:function(a){b.notifyWhenNoOutstandingRequests(a)}}}]}function uf(){this.$get=["$rootScope","$browser","$q","$$q","$exceptionHandler",function(a,b,d,c,e){function f(f,k,l){z(f)||(l=k,k=f,f=x);var m=ra.call(arguments,3),r=y(l)&&!l,t=(r?c:d).defer(),n=t.promise,q;q=b.defer(function(){try{t.resolve(f.apply(null,m))}catch(b){t.reject(b),e(b)}finally{delete g[n.$$timeoutId]}r||a.$apply()},k);n.$$timeoutId=q;g[q]=t;return n}var g={};
+f.cancel=function(a){return a&&a.$$timeoutId in g?(g[a.$$timeoutId].reject("canceled"),delete g[a.$$timeoutId],b.defer.cancel(a.$$timeoutId)):!1};return f}]}function wa(a){Ha&&(Y.setAttribute("href",a),a=Y.href);Y.setAttribute("href",a);return{href:Y.href,protocol:Y.protocol?Y.protocol.replace(/:$/,""):"",host:Y.host,search:Y.search?Y.search.replace(/^\?/,""):"",hash:Y.hash?Y.hash.replace(/^#/,""):"",hostname:Y.hostname,port:Y.port,pathname:"/"===Y.pathname.charAt(0)?Y.pathname:"/"+Y.pathname}}function ed(a){a=
+E(a)?wa(a):a;return a.protocol===wd.protocol&&a.host===wd.host}function vf(){this.$get=na(S)}function xd(a){function b(a){try{return decodeURIComponent(a)}catch(b){return a}}var d=a[0]||{},c={},e="";return function(){var a,g,h,k,l;a=d.cookie||"";if(a!==e)for(e=a,a=e.split("; "),c={},h=0;h<a.length;h++)g=a[h],k=g.indexOf("="),0<k&&(l=b(g.substring(0,k)),q(c[l])&&(c[l]=b(g.substring(k+1))));return c}}function zf(){this.$get=xd}function Jc(a){function b(d,c){if(H(d)){var e={};n(d,function(a,c){e[c]=
+b(c,a)});return e}return a.factory(d+"Filter",c)}this.register=b;this.$get=["$injector",function(a){return function(b){return a.get(b+"Filter")}}];b("currency",yd);b("date",zd);b("filter",bg);b("json",cg);b("limitTo",dg);b("lowercase",eg);b("number",Ad);b("orderBy",Bd);b("uppercase",fg)}function bg(){return function(a,b,d){if(!za(a)){if(null==a)return a;throw G("filter")("notarray",a);}var c;switch(hc(b)){case "function":break;case "boolean":case "null":case "number":case "string":c=!0;case "object":b=
+gg(b,d,c);break;default:return a}return Array.prototype.filter.call(a,b)}}function gg(a,b,d){var c=H(a)&&"$"in a;!0===b?b=ma:z(b)||(b=function(a,b){if(q(a))return!1;if(null===a||null===b)return a===b;if(H(b)||H(a)&&!qc(a))return!1;a=F(""+a);b=F(""+b);return-1!==a.indexOf(b)});return function(e){return c&&!H(e)?Ka(e,a.$,b,!1):Ka(e,a,b,d)}}function Ka(a,b,d,c,e){var f=hc(a),g=hc(b);if("string"===g&&"!"===b.charAt(0))return!Ka(a,b.substring(1),d,c);if(I(a))return a.some(function(a){return Ka(a,b,d,c)});
+switch(f){case "object":var h;if(c){for(h in a)if("$"!==h.charAt(0)&&Ka(a[h],b,d,!0))return!0;return e?!1:Ka(a,b,d,!1)}if("object"===g){for(h in b)if(e=b[h],!z(e)&&!q(e)&&(f="$"===h,!Ka(f?a:a[h],e,d,f,f)))return!1;return!0}return d(a,b);case "function":return!1;default:return d(a,b)}}function hc(a){return null===a?"null":typeof a}function yd(a){var b=a.NUMBER_FORMATS;return function(a,c,e){q(c)&&(c=b.CURRENCY_SYM);q(e)&&(e=b.PATTERNS[1].maxFrac);return null==a?a:Cd(a,b.PATTERNS[1],b.GROUP_SEP,b.DECIMAL_SEP,
+e).replace(/\u00A4/g,c)}}function Ad(a){var b=a.NUMBER_FORMATS;return function(a,c){return null==a?a:Cd(a,b.PATTERNS[0],b.GROUP_SEP,b.DECIMAL_SEP,c)}}function Cd(a,b,d,c,e){if(H(a))return"";var f=0>a;a=Math.abs(a);var g=Infinity===a;if(!g&&!isFinite(a))return"";var h=a+"",k="",l=!1,m=[];g&&(k="\u221e");if(!g&&-1!==h.indexOf("e")){var r=h.match(/([\d\.]+)e(-?)(\d+)/);r&&"-"==r[2]&&r[3]>e+1?a=0:(k=h,l=!0)}if(g||l)0<e&&1>a&&(k=a.toFixed(e),a=parseFloat(k),k=k.replace(ic,c));else{g=(h.split(ic)[1]||"").length;
+q(e)&&(e=Math.min(Math.max(b.minFrac,g),b.maxFrac));a=+(Math.round(+(a.toString()+"e"+e)).toString()+"e"+-e);var g=(""+a).split(ic),h=g[0],g=g[1]||"",r=0,t=b.lgSize,n=b.gSize;if(h.length>=t+n)for(r=h.length-t,l=0;l<r;l++)0===(r-l)%n&&0!==l&&(k+=d),k+=h.charAt(l);for(l=r;l<h.length;l++)0===(h.length-l)%t&&0!==l&&(k+=d),k+=h.charAt(l);for(;g.length<e;)g+="0";e&&"0"!==e&&(k+=c+g.substr(0,e))}0===a&&(f=!1);m.push(f?b.negPre:b.posPre,k,f?b.negSuf:b.posSuf);return m.join("")}function Gb(a,b,d){var c="";
+0>a&&(c="-",a=-a);for(a=""+a;a.length<b;)a="0"+a;d&&(a=a.substr(a.length-b));return c+a}function ca(a,b,d,c){d=d||0;return function(e){e=e["get"+a]();if(0<d||e>-d)e+=d;0===e&&-12==d&&(e=12);return Gb(e,b,c)}}function Hb(a,b){return function(d,c){var e=d["get"+a](),f=sb(b?"SHORT"+a:a);return c[f][e]}}function Dd(a){var b=(new Date(a,0,1)).getDay();return new Date(a,0,(4>=b?5:12)-b)}function Ed(a){return function(b){var d=Dd(b.getFullYear());b=+new Date(b.getFullYear(),b.getMonth(),b.getDate()+(4-b.getDay()))-
++d;b=1+Math.round(b/6048E5);return Gb(b,a)}}function jc(a,b){return 0>=a.getFullYear()?b.ERAS[0]:b.ERAS[1]}function zd(a){function b(a){var b;if(b=a.match(d)){a=new Date(0);var f=0,g=0,h=b[8]?a.setUTCFullYear:a.setFullYear,k=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=ea(b[9]+b[10]),g=ea(b[9]+b[11]));h.call(a,ea(b[1]),ea(b[2])-1,ea(b[3]));f=ea(b[4]||0)-f;g=ea(b[5]||0)-g;h=ea(b[6]||0);b=Math.round(1E3*parseFloat("0."+(b[7]||0)));k.call(a,f,g,h,b)}return a}var d=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;
+return function(c,d,f){var g="",h=[],k,l;d=d||"mediumDate";d=a.DATETIME_FORMATS[d]||d;E(c)&&(c=hg.test(c)?ea(c):b(c));Q(c)&&(c=new Date(c));if(!da(c)||!isFinite(c.getTime()))return c;for(;d;)(l=ig.exec(d))?(h=cb(h,l,1),d=h.pop()):(h.push(d),d=null);var m=c.getTimezoneOffset();f&&(m=vc(f,c.getTimezoneOffset()),c=Pb(c,f,!0));n(h,function(b){k=jg[b];g+=k?k(c,a.DATETIME_FORMATS,m):b.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return g}}function cg(){return function(a,b){q(b)&&(b=2);return db(a,b)}}function dg(){return function(a,
+b,d){b=Infinity===Math.abs(Number(b))?Number(b):ea(b);if(isNaN(b))return a;Q(a)&&(a=a.toString());if(!I(a)&&!E(a))return a;d=!d||isNaN(d)?0:ea(d);d=0>d?Math.max(0,a.length+d):d;return 0<=b?a.slice(d,d+b):0===d?a.slice(b,a.length):a.slice(Math.max(0,d+b),d)}}function Bd(a){function b(b,d){d=d?-1:1;return b.map(function(b){var c=1,h=Ya;if(z(b))h=b;else if(E(b)){if("+"==b.charAt(0)||"-"==b.charAt(0))c="-"==b.charAt(0)?-1:1,b=b.substring(1);if(""!==b&&(h=a(b),h.constant))var k=h(),h=function(a){return a[k]}}return{get:h,
+descending:c*d}})}function d(a){switch(typeof a){case "number":case "boolean":case "string":return!0;default:return!1}}return function(a,e,f){if(!za(a))return a;I(e)||(e=[e]);0===e.length&&(e=["+"]);var g=b(e,f);g.push({get:function(){return{}},descending:f?-1:1});a=Array.prototype.map.call(a,function(a,b){return{value:a,predicateValues:g.map(function(c){var e=c.get(a);c=typeof e;if(null===e)c="string",e="null";else if("string"===c)e=e.toLowerCase();else if("object"===c)a:{if("function"===typeof e.valueOf&&
+(e=e.valueOf(),d(e)))break a;if(qc(e)&&(e=e.toString(),d(e)))break a;e=b}return{value:e,type:c}})}});a.sort(function(a,b){for(var c=0,d=0,e=g.length;d<e;++d){var c=a.predicateValues[d],f=b.predicateValues[d],n=0;c.type===f.type?c.value!==f.value&&(n=c.value<f.value?-1:1):n=c.type<f.type?-1:1;if(c=n*g[d].descending)break}return c});return a=a.map(function(a){return a.value})}}function La(a){z(a)&&(a={link:a});a.restrict=a.restrict||"AC";return na(a)}function Fd(a,b,d,c,e){var f=this,g=[];f.$error=
+{};f.$$success={};f.$pending=u;f.$name=e(b.name||b.ngForm||"")(d);f.$dirty=!1;f.$pristine=!0;f.$valid=!0;f.$invalid=!1;f.$submitted=!1;f.$$parentForm=Ib;f.$rollbackViewValue=function(){n(g,function(a){a.$rollbackViewValue()})};f.$commitViewValue=function(){n(g,function(a){a.$commitViewValue()})};f.$addControl=function(a){Ra(a.$name,"input");g.push(a);a.$name&&(f[a.$name]=a);a.$$parentForm=f};f.$$renameControl=function(a,b){var c=a.$name;f[c]===a&&delete f[c];f[b]=a;a.$name=b};f.$removeControl=function(a){a.$name&&
+f[a.$name]===a&&delete f[a.$name];n(f.$pending,function(b,c){f.$setValidity(c,null,a)});n(f.$error,function(b,c){f.$setValidity(c,null,a)});n(f.$$success,function(b,c){f.$setValidity(c,null,a)});ab(g,a);a.$$parentForm=Ib};Gd({ctrl:this,$element:a,set:function(a,b,c){var d=a[b];d?-1===d.indexOf(c)&&d.push(c):a[b]=[c]},unset:function(a,b,c){var d=a[b];d&&(ab(d,c),0===d.length&&delete a[b])},$animate:c});f.$setDirty=function(){c.removeClass(a,Wa);c.addClass(a,Jb);f.$dirty=!0;f.$pristine=!1;f.$$parentForm.$setDirty()};
+f.$setPristine=function(){c.setClass(a,Wa,Jb+" ng-submitted");f.$dirty=!1;f.$pristine=!0;f.$submitted=!1;n(g,function(a){a.$setPristine()})};f.$setUntouched=function(){n(g,function(a){a.$setUntouched()})};f.$setSubmitted=function(){c.addClass(a,"ng-submitted");f.$submitted=!0;f.$$parentForm.$setSubmitted()}}function kc(a){a.$formatters.push(function(b){return a.$isEmpty(b)?b:b.toString()})}function jb(a,b,d,c,e,f){var g=F(b[0].type);if(!e.android){var h=!1;b.on("compositionstart",function(a){h=!0});
+b.on("compositionend",function(){h=!1;k()})}var k=function(a){l&&(f.defer.cancel(l),l=null);if(!h){var e=b.val();a=a&&a.type;"password"===g||d.ngTrim&&"false"===d.ngTrim||(e=U(e));(c.$viewValue!==e||""===e&&c.$$hasNativeValidators)&&c.$setViewValue(e,a)}};if(e.hasEvent("input"))b.on("input",k);else{var l,m=function(a,b,c){l||(l=f.defer(function(){l=null;b&&b.value===c||k(a)}))};b.on("keydown",function(a){var b=a.keyCode;91===b||15<b&&19>b||37<=b&&40>=b||m(a,this,this.value)});if(e.hasEvent("paste"))b.on("paste cut",
+m)}b.on("change",k);c.$render=function(){var a=c.$isEmpty(c.$viewValue)?"":c.$viewValue;b.val()!==a&&b.val(a)}}function Kb(a,b){return function(d,c){var e,f;if(da(d))return d;if(E(d)){'"'==d.charAt(0)&&'"'==d.charAt(d.length-1)&&(d=d.substring(1,d.length-1));if(kg.test(d))return new Date(d);a.lastIndex=0;if(e=a.exec(d))return e.shift(),f=c?{yyyy:c.getFullYear(),MM:c.getMonth()+1,dd:c.getDate(),HH:c.getHours(),mm:c.getMinutes(),ss:c.getSeconds(),sss:c.getMilliseconds()/1E3}:{yyyy:1970,MM:1,dd:1,HH:0,
+mm:0,ss:0,sss:0},n(e,function(a,c){c<b.length&&(f[b[c]]=+a)}),new Date(f.yyyy,f.MM-1,f.dd,f.HH,f.mm,f.ss||0,1E3*f.sss||0)}return NaN}}function kb(a,b,d,c){return function(e,f,g,h,k,l,m){function r(a){return a&&!(a.getTime&&a.getTime()!==a.getTime())}function n(a){return y(a)&&!da(a)?d(a)||u:a}Hd(e,f,g,h);jb(e,f,g,h,k,l);var A=h&&h.$options&&h.$options.timezone,v;h.$$parserName=a;h.$parsers.push(function(a){return h.$isEmpty(a)?null:b.test(a)?(a=d(a,v),A&&(a=Pb(a,A)),a):u});h.$formatters.push(function(a){if(a&&
+!da(a))throw lb("datefmt",a);if(r(a))return(v=a)&&A&&(v=Pb(v,A,!0)),m("date")(a,c,A);v=null;return""});if(y(g.min)||g.ngMin){var s;h.$validators.min=function(a){return!r(a)||q(s)||d(a)>=s};g.$observe("min",function(a){s=n(a);h.$validate()})}if(y(g.max)||g.ngMax){var p;h.$validators.max=function(a){return!r(a)||q(p)||d(a)<=p};g.$observe("max",function(a){p=n(a);h.$validate()})}}}function Hd(a,b,d,c){(c.$$hasNativeValidators=H(b[0].validity))&&c.$parsers.push(function(a){var c=b.prop("validity")||{};
+return c.badInput&&!c.typeMismatch?u:a})}function Id(a,b,d,c,e){if(y(c)){a=a(c);if(!a.constant)throw lb("constexpr",d,c);return a(b)}return e}function lc(a,b){a="ngClass"+a;return["$animate",function(d){function c(a,b){var c=[],d=0;a:for(;d<a.length;d++){for(var e=a[d],m=0;m<b.length;m++)if(e==b[m])continue a;c.push(e)}return c}function e(a){var b=[];return I(a)?(n(a,function(a){b=b.concat(e(a))}),b):E(a)?a.split(" "):H(a)?(n(a,function(a,c){a&&(b=b.concat(c.split(" ")))}),b):a}return{restrict:"AC",
+link:function(f,g,h){function k(a,b){var c=g.data("$classCounts")||$(),d=[];n(a,function(a){if(0<b||c[a])c[a]=(c[a]||0)+b,c[a]===+(0<b)&&d.push(a)});g.data("$classCounts",c);return d.join(" ")}function l(a){if(!0===b||f.$index%2===b){var l=e(a||[]);if(!m){var n=k(l,1);h.$addClass(n)}else if(!ma(a,m)){var q=e(m),n=c(l,q),l=c(q,l),n=k(n,1),l=k(l,-1);n&&n.length&&d.addClass(g,n);l&&l.length&&d.removeClass(g,l)}}m=ia(a)}var m;f.$watch(h[a],l,!0);h.$observe("class",function(b){l(f.$eval(h[a]))});"ngClass"!==
+a&&f.$watch("$index",function(c,d){var g=c&1;if(g!==(d&1)){var l=e(f.$eval(h[a]));g===b?(g=k(l,1),h.$addClass(g)):(g=k(l,-1),h.$removeClass(g))}})}}}]}function Gd(a){function b(a,b){b&&!f[a]?(k.addClass(e,a),f[a]=!0):!b&&f[a]&&(k.removeClass(e,a),f[a]=!1)}function d(a,c){a=a?"-"+zc(a,"-"):"";b(mb+a,!0===c);b(Jd+a,!1===c)}var c=a.ctrl,e=a.$element,f={},g=a.set,h=a.unset,k=a.$animate;f[Jd]=!(f[mb]=e.hasClass(mb));c.$setValidity=function(a,e,f){q(e)?(c.$pending||(c.$pending={}),g(c.$pending,a,f)):(c.$pending&&
+h(c.$pending,a,f),Kd(c.$pending)&&(c.$pending=u));$a(e)?e?(h(c.$error,a,f),g(c.$$success,a,f)):(g(c.$error,a,f),h(c.$$success,a,f)):(h(c.$error,a,f),h(c.$$success,a,f));c.$pending?(b(Ld,!0),c.$valid=c.$invalid=u,d("",null)):(b(Ld,!1),c.$valid=Kd(c.$error),c.$invalid=!c.$valid,d("",c.$valid));e=c.$pending&&c.$pending[a]?u:c.$error[a]?!1:c.$$success[a]?!0:null;d(a,e);c.$$parentForm.$setValidity(a,e,c)}}function Kd(a){if(a)for(var b in a)if(a.hasOwnProperty(b))return!1;return!0}var lg=/^\/(.+)\/([a-z]*)$/,
+F=function(a){return E(a)?a.toLowerCase():a},qa=Object.prototype.hasOwnProperty,sb=function(a){return E(a)?a.toUpperCase():a},Ha,B,oa,ra=[].slice,Pf=[].splice,mg=[].push,sa=Object.prototype.toString,rc=Object.getPrototypeOf,Aa=G("ng"),fa=S.angular||(S.angular={}),Sb,nb=0;Ha=X.documentMode;x.$inject=[];Ya.$inject=[];var I=Array.isArray,Vd=/^\[object (?:Uint8|Uint8Clamped|Uint16|Uint32|Int8|Int16|Int32|Float32|Float64)Array\]$/,U=function(a){return E(a)?a.trim():a},ud=function(a){return a.replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g,
+"\\$1").replace(/\x08/g,"\\x08")},Ba=function(){if(!y(Ba.rules)){var a=X.querySelector("[ng-csp]")||X.querySelector("[data-ng-csp]");if(a){var b=a.getAttribute("ng-csp")||a.getAttribute("data-ng-csp");Ba.rules={noUnsafeEval:!b||-1!==b.indexOf("no-unsafe-eval"),noInlineStyle:!b||-1!==b.indexOf("no-inline-style")}}else{a=Ba;try{new Function(""),b=!1}catch(d){b=!0}a.rules={noUnsafeEval:b,noInlineStyle:!1}}}return Ba.rules},pb=function(){if(y(pb.name_))return pb.name_;var a,b,d=Oa.length,c,e;for(b=0;b<
+d;++b)if(c=Oa[b],a=X.querySelector("["+c.replace(":","\\:")+"jq]")){e=a.getAttribute(c+"jq");break}return pb.name_=e},Oa=["ng-","data-ng-","ng:","x-ng-"],be=/[A-Z]/g,Ac=!1,Rb,Na=3,fe={full:"1.4.8",major:1,minor:4,dot:8,codeName:"ice-manipulation"};N.expando="ng339";var gb=N.cache={},Ff=1;N._data=function(a){return this.cache[a[this.expando]]||{}};var Af=/([\:\-\_]+(.))/g,Bf=/^moz([A-Z])/,xb={mouseleave:"mouseout",mouseenter:"mouseover"},Ub=G("jqLite"),Ef=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,Tb=/<|&#?\w+;/,
+Cf=/<([\w:-]+)/,Df=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,ka={option:[1,'<select multiple="multiple">',"</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ka.optgroup=ka.option;ka.tbody=ka.tfoot=ka.colgroup=ka.caption=ka.thead;ka.th=ka.td;var Kf=Node.prototype.contains||function(a){return!!(this.compareDocumentPosition(a)&
+16)},Pa=N.prototype={ready:function(a){function b(){d||(d=!0,a())}var d=!1;"complete"===X.readyState?setTimeout(b):(this.on("DOMContentLoaded",b),N(S).on("load",b))},toString:function(){var a=[];n(this,function(b){a.push(""+b)});return"["+a.join(", ")+"]"},eq:function(a){return 0<=a?B(this[a]):B(this[this.length+a])},length:0,push:mg,sort:[].sort,splice:[].splice},Cb={};n("multiple selected checked disabled readOnly required open".split(" "),function(a){Cb[F(a)]=a});var Rc={};n("input select option textarea button form details".split(" "),
+function(a){Rc[a]=!0});var Zc={ngMinlength:"minlength",ngMaxlength:"maxlength",ngMin:"min",ngMax:"max",ngPattern:"pattern"};n({data:Wb,removeData:vb,hasData:function(a){for(var b in gb[a.ng339])return!0;return!1}},function(a,b){N[b]=a});n({data:Wb,inheritedData:Bb,scope:function(a){return B.data(a,"$scope")||Bb(a.parentNode||a,["$isolateScope","$scope"])},isolateScope:function(a){return B.data(a,"$isolateScope")||B.data(a,"$isolateScopeNoTemplate")},controller:Oc,injector:function(a){return Bb(a,
+"$injector")},removeAttr:function(a,b){a.removeAttribute(b)},hasClass:yb,css:function(a,b,d){b=fb(b);if(y(d))a.style[b]=d;else return a.style[b]},attr:function(a,b,d){var c=a.nodeType;if(c!==Na&&2!==c&&8!==c)if(c=F(b),Cb[c])if(y(d))d?(a[b]=!0,a.setAttribute(b,c)):(a[b]=!1,a.removeAttribute(c));else return a[b]||(a.attributes.getNamedItem(b)||x).specified?c:u;else if(y(d))a.setAttribute(b,d);else if(a.getAttribute)return a=a.getAttribute(b,2),null===a?u:a},prop:function(a,b,d){if(y(d))a[b]=d;else return a[b]},
+text:function(){function a(a,d){if(q(d)){var c=a.nodeType;return 1===c||c===Na?a.textContent:""}a.textContent=d}a.$dv="";return a}(),val:function(a,b){if(q(b)){if(a.multiple&&"select"===ta(a)){var d=[];n(a.options,function(a){a.selected&&d.push(a.value||a.text)});return 0===d.length?null:d}return a.value}a.value=b},html:function(a,b){if(q(b))return a.innerHTML;ub(a,!0);a.innerHTML=b},empty:Pc},function(a,b){N.prototype[b]=function(b,c){var e,f,g=this.length;if(a!==Pc&&q(2==a.length&&a!==yb&&a!==Oc?
+b:c)){if(H(b)){for(e=0;e<g;e++)if(a===Wb)a(this[e],b);else for(f in b)a(this[e],f,b[f]);return this}e=a.$dv;g=q(e)?Math.min(g,1):g;for(f=0;f<g;f++){var h=a(this[f],b,c);e=e?e+h:h}return e}for(e=0;e<g;e++)a(this[e],b,c);return this}});n({removeData:vb,on:function(a,b,d,c){if(y(c))throw Ub("onargs");if(Kc(a)){c=wb(a,!0);var e=c.events,f=c.handle;f||(f=c.handle=Hf(a,e));c=0<=b.indexOf(" ")?b.split(" "):[b];for(var g=c.length,h=function(b,c,g){var h=e[b];h||(h=e[b]=[],h.specialHandlerWrapper=c,"$destroy"===
+b||g||a.addEventListener(b,f,!1));h.push(d)};g--;)b=c[g],xb[b]?(h(xb[b],Jf),h(b,u,!0)):h(b)}},off:Nc,one:function(a,b,d){a=B(a);a.on(b,function e(){a.off(b,d);a.off(b,e)});a.on(b,d)},replaceWith:function(a,b){var d,c=a.parentNode;ub(a);n(new N(b),function(b){d?c.insertBefore(b,d.nextSibling):c.replaceChild(b,a);d=b})},children:function(a){var b=[];n(a.childNodes,function(a){1===a.nodeType&&b.push(a)});return b},contents:function(a){return a.contentDocument||a.childNodes||[]},append:function(a,b){var d=
+a.nodeType;if(1===d||11===d){b=new N(b);for(var d=0,c=b.length;d<c;d++)a.appendChild(b[d])}},prepend:function(a,b){if(1===a.nodeType){var d=a.firstChild;n(new N(b),function(b){a.insertBefore(b,d)})}},wrap:function(a,b){b=B(b).eq(0).clone()[0];var d=a.parentNode;d&&d.replaceChild(b,a);b.appendChild(a)},remove:Xb,detach:function(a){Xb(a,!0)},after:function(a,b){var d=a,c=a.parentNode;b=new N(b);for(var e=0,f=b.length;e<f;e++){var g=b[e];c.insertBefore(g,d.nextSibling);d=g}},addClass:Ab,removeClass:zb,
+toggleClass:function(a,b,d){b&&n(b.split(" "),function(b){var e=d;q(e)&&(e=!yb(a,b));(e?Ab:zb)(a,b)})},parent:function(a){return(a=a.parentNode)&&11!==a.nodeType?a:null},next:function(a){return a.nextElementSibling},find:function(a,b){return a.getElementsByTagName?a.getElementsByTagName(b):[]},clone:Vb,triggerHandler:function(a,b,d){var c,e,f=b.type||b,g=wb(a);if(g=(g=g&&g.events)&&g[f])c={preventDefault:function(){this.defaultPrevented=!0},isDefaultPrevented:function(){return!0===this.defaultPrevented},
+stopImmediatePropagation:function(){this.immediatePropagationStopped=!0},isImmediatePropagationStopped:function(){return!0===this.immediatePropagationStopped},stopPropagation:x,type:f,target:a},b.type&&(c=M(c,b)),b=ia(g),e=d?[c].concat(d):[c],n(b,function(b){c.isImmediatePropagationStopped()||b.apply(a,e)})}},function(a,b){N.prototype[b]=function(b,c,e){for(var f,g=0,h=this.length;g<h;g++)q(f)?(f=a(this[g],b,c,e),y(f)&&(f=B(f))):Mc(f,a(this[g],b,c,e));return y(f)?f:this};N.prototype.bind=N.prototype.on;
+N.prototype.unbind=N.prototype.off});Sa.prototype={put:function(a,b){this[Ca(a,this.nextUid)]=b},get:function(a){return this[Ca(a,this.nextUid)]},remove:function(a){var b=this[a=Ca(a,this.nextUid)];delete this[a];return b}};var yf=[function(){this.$get=[function(){return Sa}]}],Tc=/^[^\(]*\(\s*([^\)]*)\)/m,ng=/,/,og=/^\s*(_?)(\S+?)\1\s*$/,Sc=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg,Da=G("$injector");eb.$$annotate=function(a,b,d){var c;if("function"===typeof a){if(!(c=a.$inject)){c=[];if(a.length){if(b)throw E(d)&&
+d||(d=a.name||Lf(a)),Da("strictdi",d);b=a.toString().replace(Sc,"");b=b.match(Tc);n(b[1].split(ng),function(a){a.replace(og,function(a,b,d){c.push(d)})})}a.$inject=c}}else I(a)?(b=a.length-1,Qa(a[b],"fn"),c=a.slice(0,b)):Qa(a,"fn",!0);return c};var Md=G("$animate"),Ue=function(){this.$get=["$q","$$rAF",function(a,b){function d(){}d.all=x;d.chain=x;d.prototype={end:x,cancel:x,resume:x,pause:x,complete:x,then:function(c,d){return a(function(a){b(function(){a()})}).then(c,d)}};return d}]},Te=function(){var a=
+new Sa,b=[];this.$get=["$$AnimateRunner","$rootScope",function(d,c){function e(a,b,c){var d=!1;b&&(b=E(b)?b.split(" "):I(b)?b:[],n(b,function(b){b&&(d=!0,a[b]=c)}));return d}function f(){n(b,function(b){var c=a.get(b);if(c){var d=Mf(b.attr("class")),e="",f="";n(c,function(a,b){a!==!!d[b]&&(a?e+=(e.length?" ":"")+b:f+=(f.length?" ":"")+b)});n(b,function(a){e&&Ab(a,e);f&&zb(a,f)});a.remove(b)}});b.length=0}return{enabled:x,on:x,off:x,pin:x,push:function(g,h,k,l){l&&l();k=k||{};k.from&&g.css(k.from);
+k.to&&g.css(k.to);if(k.addClass||k.removeClass)if(h=k.addClass,l=k.removeClass,k=a.get(g)||{},h=e(k,h,!0),l=e(k,l,!1),h||l)a.put(g,k),b.push(g),1===b.length&&c.$$postDigest(f);return new d}}}]},Re=["$provide",function(a){var b=this;this.$$registeredAnimations=Object.create(null);this.register=function(d,c){if(d&&"."!==d.charAt(0))throw Md("notcsel",d);var e=d+"-animation";b.$$registeredAnimations[d.substr(1)]=e;a.factory(e,c)};this.classNameFilter=function(a){if(1===arguments.length&&(this.$$classNameFilter=
+a instanceof RegExp?a:null)&&/(\s+|\/)ng-animate(\s+|\/)/.test(this.$$classNameFilter.toString()))throw Md("nongcls","ng-animate");return this.$$classNameFilter};this.$get=["$$animateQueue",function(a){function b(a,c,d){if(d){var h;a:{for(h=0;h<d.length;h++){var k=d[h];if(1===k.nodeType){h=k;break a}}h=void 0}!h||h.parentNode||h.previousElementSibling||(d=null)}d?d.after(a):c.prepend(a)}return{on:a.on,off:a.off,pin:a.pin,enabled:a.enabled,cancel:function(a){a.end&&a.end()},enter:function(e,f,g,h){f=
+f&&B(f);g=g&&B(g);f=f||g.parent();b(e,f,g);return a.push(e,"enter",Ea(h))},move:function(e,f,g,h){f=f&&B(f);g=g&&B(g);f=f||g.parent();b(e,f,g);return a.push(e,"move",Ea(h))},leave:function(b,c){return a.push(b,"leave",Ea(c),function(){b.remove()})},addClass:function(b,c,g){g=Ea(g);g.addClass=hb(g.addclass,c);return a.push(b,"addClass",g)},removeClass:function(b,c,g){g=Ea(g);g.removeClass=hb(g.removeClass,c);return a.push(b,"removeClass",g)},setClass:function(b,c,g,h){h=Ea(h);h.addClass=hb(h.addClass,
+c);h.removeClass=hb(h.removeClass,g);return a.push(b,"setClass",h)},animate:function(b,c,g,h,k){k=Ea(k);k.from=k.from?M(k.from,c):c;k.to=k.to?M(k.to,g):g;k.tempClasses=hb(k.tempClasses,h||"ng-inline-animate");return a.push(b,"animate",k)}}}]}],Se=function(){this.$get=["$$rAF","$q",function(a,b){var d=function(){};d.prototype={done:function(a){this.defer&&this.defer[!0===a?"reject":"resolve"]()},end:function(){this.done()},cancel:function(){this.done(!0)},getPromise:function(){this.defer||(this.defer=
+b.defer());return this.defer.promise},then:function(a,b){return this.getPromise().then(a,b)},"catch":function(a){return this.getPromise()["catch"](a)},"finally":function(a){return this.getPromise()["finally"](a)}};return function(b,e){function f(){a(function(){e.addClass&&(b.addClass(e.addClass),e.addClass=null);e.removeClass&&(b.removeClass(e.removeClass),e.removeClass=null);e.to&&(b.css(e.to),e.to=null);g||h.done();g=!0});return h}e.cleanupStyles&&(e.from=e.to=null);e.from&&(b.css(e.from),e.from=
+null);var g,h=new d;return{start:f,end:f}}}]},ha=G("$compile");Cc.$inject=["$provide","$$sanitizeUriProvider"];var Vc=/^((?:x|data)[\:\-_])/i,Qf=G("$controller"),Uc=/^(\S+)(\s+as\s+(\w+))?$/,$e=function(){this.$get=["$document",function(a){return function(b){b?!b.nodeType&&b instanceof B&&(b=b[0]):b=a[0].body;return b.offsetWidth+1}}]},$c="application/json",ac={"Content-Type":$c+";charset=utf-8"},Sf=/^\[|^\{(?!\{)/,Tf={"[":/]$/,"{":/}$/},Rf=/^\)\]\}',?\n/,pg=G("$http"),dd=function(a){return function(){throw pg("legacy",
+a);}},Ja=fa.$interpolateMinErr=G("$interpolate");Ja.throwNoconcat=function(a){throw Ja("noconcat",a);};Ja.interr=function(a,b){return Ja("interr",a,b.toString())};var qg=/^([^\?#]*)(\?([^#]*))?(#(.*))?$/,Vf={http:80,https:443,ftp:21},Db=G("$location"),rg={$$html5:!1,$$replace:!1,absUrl:Eb("$$absUrl"),url:function(a){if(q(a))return this.$$url;var b=qg.exec(a);(b[1]||""===a)&&this.path(decodeURIComponent(b[1]));(b[2]||b[1]||""===a)&&this.search(b[3]||"");this.hash(b[5]||"");return this},protocol:Eb("$$protocol"),
+host:Eb("$$host"),port:Eb("$$port"),path:id("$$path",function(a){a=null!==a?a.toString():"";return"/"==a.charAt(0)?a:"/"+a}),search:function(a,b){switch(arguments.length){case 0:return this.$$search;case 1:if(E(a)||Q(a))a=a.toString(),this.$$search=xc(a);else if(H(a))a=bb(a,{}),n(a,function(b,c){null==b&&delete a[c]}),this.$$search=a;else throw Db("isrcharg");break;default:q(b)||null===b?delete this.$$search[a]:this.$$search[a]=b}this.$$compose();return this},hash:id("$$hash",function(a){return null!==
+a?a.toString():""}),replace:function(){this.$$replace=!0;return this}};n([hd,dc,cc],function(a){a.prototype=Object.create(rg);a.prototype.state=function(b){if(!arguments.length)return this.$$state;if(a!==cc||!this.$$html5)throw Db("nostate");this.$$state=q(b)?null:b;return this}});var ba=G("$parse"),Wf=Function.prototype.call,Xf=Function.prototype.apply,Yf=Function.prototype.bind,Lb=$();n("+ - * / % === !== == != < > <= >= && || ! = |".split(" "),function(a){Lb[a]=!0});var sg={n:"\n",f:"\f",r:"\r",
+t:"\t",v:"\v","'":"'",'"':'"'},fc=function(a){this.options=a};fc.prototype={constructor:fc,lex:function(a){this.text=a;this.index=0;for(this.tokens=[];this.index<this.text.length;)if(a=this.text.charAt(this.index),'"'===a||"'"===a)this.readString(a);else if(this.isNumber(a)||"."===a&&this.isNumber(this.peek()))this.readNumber();else if(this.isIdent(a))this.readIdent();else if(this.is(a,"(){}[].,;:?"))this.tokens.push({index:this.index,text:a}),this.index++;else if(this.isWhitespace(a))this.index++;
+else{var b=a+this.peek(),d=b+this.peek(2),c=Lb[b],e=Lb[d];Lb[a]||c||e?(a=e?d:c?b:a,this.tokens.push({index:this.index,text:a,operator:!0}),this.index+=a.length):this.throwError("Unexpected next character ",this.index,this.index+1)}return this.tokens},is:function(a,b){return-1!==b.indexOf(a)},peek:function(a){a=a||1;return this.index+a<this.text.length?this.text.charAt(this.index+a):!1},isNumber:function(a){return"0"<=a&&"9">=a&&"string"===typeof a},isWhitespace:function(a){return" "===a||"\r"===a||
+"\t"===a||"\n"===a||"\v"===a||"\u00a0"===a},isIdent:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,b,d){d=d||this.index;b=y(b)?"s "+b+"-"+this.index+" ["+this.text.substring(b,d)+"]":" "+d;throw ba("lexerr",a,b,this.text);},readNumber:function(){for(var a="",b=this.index;this.index<this.text.length;){var d=F(this.text.charAt(this.index));if("."==d||this.isNumber(d))a+=d;else{var c=this.peek();
+if("e"==d&&this.isExpOperator(c))a+=d;else if(this.isExpOperator(d)&&c&&this.isNumber(c)&&"e"==a.charAt(a.length-1))a+=d;else if(!this.isExpOperator(d)||c&&this.isNumber(c)||"e"!=a.charAt(a.length-1))break;else this.throwError("Invalid exponent")}this.index++}this.tokens.push({index:b,text:a,constant:!0,value:Number(a)})},readIdent:function(){for(var a=this.index;this.index<this.text.length;){var b=this.text.charAt(this.index);if(!this.isIdent(b)&&!this.isNumber(b))break;this.index++}this.tokens.push({index:a,
+text:this.text.slice(a,this.index),identifier:!0})},readString:function(a){var b=this.index;this.index++;for(var d="",c=a,e=!1;this.index<this.text.length;){var f=this.text.charAt(this.index),c=c+f;if(e)"u"===f?(e=this.text.substring(this.index+1,this.index+5),e.match(/[\da-f]{4}/i)||this.throwError("Invalid unicode escape [\\u"+e+"]"),this.index+=4,d+=String.fromCharCode(parseInt(e,16))):d+=sg[f]||f,e=!1;else if("\\"===f)e=!0;else{if(f===a){this.index++;this.tokens.push({index:b,text:c,constant:!0,
+value:d});return}d+=f}this.index++}this.throwError("Unterminated quote",b)}};var s=function(a,b){this.lexer=a;this.options=b};s.Program="Program";s.ExpressionStatement="ExpressionStatement";s.AssignmentExpression="AssignmentExpression";s.ConditionalExpression="ConditionalExpression";s.LogicalExpression="LogicalExpression";s.BinaryExpression="BinaryExpression";s.UnaryExpression="UnaryExpression";s.CallExpression="CallExpression";s.MemberExpression="MemberExpression";s.Identifier="Identifier";s.Literal=
+"Literal";s.ArrayExpression="ArrayExpression";s.Property="Property";s.ObjectExpression="ObjectExpression";s.ThisExpression="ThisExpression";s.NGValueParameter="NGValueParameter";s.prototype={ast:function(a){this.text=a;this.tokens=this.lexer.lex(a);a=this.program();0!==this.tokens.length&&this.throwError("is an unexpected token",this.tokens[0]);return a},program:function(){for(var a=[];;)if(0<this.tokens.length&&!this.peek("}",")",";","]")&&a.push(this.expressionStatement()),!this.expect(";"))return{type:s.Program,
+body:a}},expressionStatement:function(){return{type:s.ExpressionStatement,expression:this.filterChain()}},filterChain:function(){for(var a=this.expression();this.expect("|");)a=this.filter(a);return a},expression:function(){return this.assignment()},assignment:function(){var a=this.ternary();this.expect("=")&&(a={type:s.AssignmentExpression,left:a,right:this.assignment(),operator:"="});return a},ternary:function(){var a=this.logicalOR(),b,d;return this.expect("?")&&(b=this.expression(),this.consume(":"))?
+(d=this.expression(),{type:s.ConditionalExpression,test:a,alternate:b,consequent:d}):a},logicalOR:function(){for(var a=this.logicalAND();this.expect("||");)a={type:s.LogicalExpression,operator:"||",left:a,right:this.logicalAND()};return a},logicalAND:function(){for(var a=this.equality();this.expect("&&");)a={type:s.LogicalExpression,operator:"&&",left:a,right:this.equality()};return a},equality:function(){for(var a=this.relational(),b;b=this.expect("==","!=","===","!==");)a={type:s.BinaryExpression,
+operator:b.text,left:a,right:this.relational()};return a},relational:function(){for(var a=this.additive(),b;b=this.expect("<",">","<=",">=");)a={type:s.BinaryExpression,operator:b.text,left:a,right:this.additive()};return a},additive:function(){for(var a=this.multiplicative(),b;b=this.expect("+","-");)a={type:s.BinaryExpression,operator:b.text,left:a,right:this.multiplicative()};return a},multiplicative:function(){for(var a=this.unary(),b;b=this.expect("*","/","%");)a={type:s.BinaryExpression,operator:b.text,
+left:a,right:this.unary()};return a},unary:function(){var a;return(a=this.expect("+","-","!"))?{type:s.UnaryExpression,operator:a.text,prefix:!0,argument:this.unary()}:this.primary()},primary:function(){var a;this.expect("(")?(a=this.filterChain(),this.consume(")")):this.expect("[")?a=this.arrayDeclaration():this.expect("{")?a=this.object():this.constants.hasOwnProperty(this.peek().text)?a=bb(this.constants[this.consume().text]):this.peek().identifier?a=this.identifier():this.peek().constant?a=this.constant():
+this.throwError("not a primary expression",this.peek());for(var b;b=this.expect("(","[",".");)"("===b.text?(a={type:s.CallExpression,callee:a,arguments:this.parseArguments()},this.consume(")")):"["===b.text?(a={type:s.MemberExpression,object:a,property:this.expression(),computed:!0},this.consume("]")):"."===b.text?a={type:s.MemberExpression,object:a,property:this.identifier(),computed:!1}:this.throwError("IMPOSSIBLE");return a},filter:function(a){a=[a];for(var b={type:s.CallExpression,callee:this.identifier(),
+arguments:a,filter:!0};this.expect(":");)a.push(this.expression());return b},parseArguments:function(){var a=[];if(")"!==this.peekToken().text){do a.push(this.expression());while(this.expect(","))}return a},identifier:function(){var a=this.consume();a.identifier||this.throwError("is not a valid identifier",a);return{type:s.Identifier,name:a.text}},constant:function(){return{type:s.Literal,value:this.consume().value}},arrayDeclaration:function(){var a=[];if("]"!==this.peekToken().text){do{if(this.peek("]"))break;
+a.push(this.expression())}while(this.expect(","))}this.consume("]");return{type:s.ArrayExpression,elements:a}},object:function(){var a=[],b;if("}"!==this.peekToken().text){do{if(this.peek("}"))break;b={type:s.Property,kind:"init"};this.peek().constant?b.key=this.constant():this.peek().identifier?b.key=this.identifier():this.throwError("invalid key",this.peek());this.consume(":");b.value=this.expression();a.push(b)}while(this.expect(","))}this.consume("}");return{type:s.ObjectExpression,properties:a}},
+throwError:function(a,b){throw ba("syntax",b.text,a,b.index+1,this.text,this.text.substring(b.index));},consume:function(a){if(0===this.tokens.length)throw ba("ueoe",this.text);var b=this.expect(a);b||this.throwError("is unexpected, expecting ["+a+"]",this.peek());return b},peekToken:function(){if(0===this.tokens.length)throw ba("ueoe",this.text);return this.tokens[0]},peek:function(a,b,d,c){return this.peekAhead(0,a,b,d,c)},peekAhead:function(a,b,d,c,e){if(this.tokens.length>a){a=this.tokens[a];
+var f=a.text;if(f===b||f===d||f===c||f===e||!(b||d||c||e))return a}return!1},expect:function(a,b,d,c){return(a=this.peek(a,b,d,c))?(this.tokens.shift(),a):!1},constants:{"true":{type:s.Literal,value:!0},"false":{type:s.Literal,value:!1},"null":{type:s.Literal,value:null},undefined:{type:s.Literal,value:u},"this":{type:s.ThisExpression}}};rd.prototype={compile:function(a,b){var d=this,c=this.astBuilder.ast(a);this.state={nextId:0,filters:{},expensiveChecks:b,fn:{vars:[],body:[],own:{}},assign:{vars:[],
+body:[],own:{}},inputs:[]};W(c,d.$filter);var e="",f;this.stage="assign";if(f=pd(c))this.state.computing="assign",e=this.nextId(),this.recurse(f,e),this.return_(e),e="fn.assign="+this.generateFunction("assign","s,v,l");f=nd(c.body);d.stage="inputs";n(f,function(a,b){var c="fn"+b;d.state[c]={vars:[],body:[],own:{}};d.state.computing=c;var e=d.nextId();d.recurse(a,e);d.return_(e);d.state.inputs.push(c);a.watchId=b});this.state.computing="fn";this.stage="main";this.recurse(c);e='"'+this.USE+" "+this.STRICT+
+'";\n'+this.filterPrefix()+"var fn="+this.generateFunction("fn","s,l,a,i")+e+this.watchFns()+"return fn;";e=(new Function("$filter","ensureSafeMemberName","ensureSafeObject","ensureSafeFunction","getStringValue","ensureSafeAssignContext","ifDefined","plus","text",e))(this.$filter,Va,xa,kd,jd,ld,Zf,md,a);this.state=this.stage=u;e.literal=qd(c);e.constant=c.constant;return e},USE:"use",STRICT:"strict",watchFns:function(){var a=[],b=this.state.inputs,d=this;n(b,function(b){a.push("var "+b+"="+d.generateFunction(b,
+"s"))});b.length&&a.push("fn.inputs=["+b.join(",")+"];");return a.join("")},generateFunction:function(a,b){return"function("+b+"){"+this.varsPrefix(a)+this.body(a)+"};"},filterPrefix:function(){var a=[],b=this;n(this.state.filters,function(d,c){a.push(d+"=$filter("+b.escape(c)+")")});return a.length?"var "+a.join(",")+";":""},varsPrefix:function(a){return this.state[a].vars.length?"var "+this.state[a].vars.join(",")+";":""},body:function(a){return this.state[a].body.join("")},recurse:function(a,b,
+d,c,e,f){var g,h,k=this,l,m;c=c||x;if(!f&&y(a.watchId))b=b||this.nextId(),this.if_("i",this.lazyAssign(b,this.computedMember("i",a.watchId)),this.lazyRecurse(a,b,d,c,e,!0));else switch(a.type){case s.Program:n(a.body,function(b,c){k.recurse(b.expression,u,u,function(a){h=a});c!==a.body.length-1?k.current().body.push(h,";"):k.return_(h)});break;case s.Literal:m=this.escape(a.value);this.assign(b,m);c(m);break;case s.UnaryExpression:this.recurse(a.argument,u,u,function(a){h=a});m=a.operator+"("+this.ifDefined(h,
+0)+")";this.assign(b,m);c(m);break;case s.BinaryExpression:this.recurse(a.left,u,u,function(a){g=a});this.recurse(a.right,u,u,function(a){h=a});m="+"===a.operator?this.plus(g,h):"-"===a.operator?this.ifDefined(g,0)+a.operator+this.ifDefined(h,0):"("+g+")"+a.operator+"("+h+")";this.assign(b,m);c(m);break;case s.LogicalExpression:b=b||this.nextId();k.recurse(a.left,b);k.if_("&&"===a.operator?b:k.not(b),k.lazyRecurse(a.right,b));c(b);break;case s.ConditionalExpression:b=b||this.nextId();k.recurse(a.test,
+b);k.if_(b,k.lazyRecurse(a.alternate,b),k.lazyRecurse(a.consequent,b));c(b);break;case s.Identifier:b=b||this.nextId();d&&(d.context="inputs"===k.stage?"s":this.assign(this.nextId(),this.getHasOwnProperty("l",a.name)+"?l:s"),d.computed=!1,d.name=a.name);Va(a.name);k.if_("inputs"===k.stage||k.not(k.getHasOwnProperty("l",a.name)),function(){k.if_("inputs"===k.stage||"s",function(){e&&1!==e&&k.if_(k.not(k.nonComputedMember("s",a.name)),k.lazyAssign(k.nonComputedMember("s",a.name),"{}"));k.assign(b,k.nonComputedMember("s",
+a.name))})},b&&k.lazyAssign(b,k.nonComputedMember("l",a.name)));(k.state.expensiveChecks||Fb(a.name))&&k.addEnsureSafeObject(b);c(b);break;case s.MemberExpression:g=d&&(d.context=this.nextId())||this.nextId();b=b||this.nextId();k.recurse(a.object,g,u,function(){k.if_(k.notNull(g),function(){if(a.computed)h=k.nextId(),k.recurse(a.property,h),k.getStringValue(h),k.addEnsureSafeMemberName(h),e&&1!==e&&k.if_(k.not(k.computedMember(g,h)),k.lazyAssign(k.computedMember(g,h),"{}")),m=k.ensureSafeObject(k.computedMember(g,
+h)),k.assign(b,m),d&&(d.computed=!0,d.name=h);else{Va(a.property.name);e&&1!==e&&k.if_(k.not(k.nonComputedMember(g,a.property.name)),k.lazyAssign(k.nonComputedMember(g,a.property.name),"{}"));m=k.nonComputedMember(g,a.property.name);if(k.state.expensiveChecks||Fb(a.property.name))m=k.ensureSafeObject(m);k.assign(b,m);d&&(d.computed=!1,d.name=a.property.name)}},function(){k.assign(b,"undefined")});c(b)},!!e);break;case s.CallExpression:b=b||this.nextId();a.filter?(h=k.filter(a.callee.name),l=[],n(a.arguments,
+function(a){var b=k.nextId();k.recurse(a,b);l.push(b)}),m=h+"("+l.join(",")+")",k.assign(b,m),c(b)):(h=k.nextId(),g={},l=[],k.recurse(a.callee,h,g,function(){k.if_(k.notNull(h),function(){k.addEnsureSafeFunction(h);n(a.arguments,function(a){k.recurse(a,k.nextId(),u,function(a){l.push(k.ensureSafeObject(a))})});g.name?(k.state.expensiveChecks||k.addEnsureSafeObject(g.context),m=k.member(g.context,g.name,g.computed)+"("+l.join(",")+")"):m=h+"("+l.join(",")+")";m=k.ensureSafeObject(m);k.assign(b,m)},
+function(){k.assign(b,"undefined")});c(b)}));break;case s.AssignmentExpression:h=this.nextId();g={};if(!od(a.left))throw ba("lval");this.recurse(a.left,u,g,function(){k.if_(k.notNull(g.context),function(){k.recurse(a.right,h);k.addEnsureSafeObject(k.member(g.context,g.name,g.computed));k.addEnsureSafeAssignContext(g.context);m=k.member(g.context,g.name,g.computed)+a.operator+h;k.assign(b,m);c(b||m)})},1);break;case s.ArrayExpression:l=[];n(a.elements,function(a){k.recurse(a,k.nextId(),u,function(a){l.push(a)})});
+m="["+l.join(",")+"]";this.assign(b,m);c(m);break;case s.ObjectExpression:l=[];n(a.properties,function(a){k.recurse(a.value,k.nextId(),u,function(b){l.push(k.escape(a.key.type===s.Identifier?a.key.name:""+a.key.value)+":"+b)})});m="{"+l.join(",")+"}";this.assign(b,m);c(m);break;case s.ThisExpression:this.assign(b,"s");c("s");break;case s.NGValueParameter:this.assign(b,"v"),c("v")}},getHasOwnProperty:function(a,b){var d=a+"."+b,c=this.current().own;c.hasOwnProperty(d)||(c[d]=this.nextId(!1,a+"&&("+
+this.escape(b)+" in "+a+")"));return c[d]},assign:function(a,b){if(a)return this.current().body.push(a,"=",b,";"),a},filter:function(a){this.state.filters.hasOwnProperty(a)||(this.state.filters[a]=this.nextId(!0));return this.state.filters[a]},ifDefined:function(a,b){return"ifDefined("+a+","+this.escape(b)+")"},plus:function(a,b){return"plus("+a+","+b+")"},return_:function(a){this.current().body.push("return ",a,";")},if_:function(a,b,d){if(!0===a)b();else{var c=this.current().body;c.push("if(",a,
+"){");b();c.push("}");d&&(c.push("else{"),d(),c.push("}"))}},not:function(a){return"!("+a+")"},notNull:function(a){return a+"!=null"},nonComputedMember:function(a,b){return a+"."+b},computedMember:function(a,b){return a+"["+b+"]"},member:function(a,b,d){return d?this.computedMember(a,b):this.nonComputedMember(a,b)},addEnsureSafeObject:function(a){this.current().body.push(this.ensureSafeObject(a),";")},addEnsureSafeMemberName:function(a){this.current().body.push(this.ensureSafeMemberName(a),";")},
+addEnsureSafeFunction:function(a){this.current().body.push(this.ensureSafeFunction(a),";")},addEnsureSafeAssignContext:function(a){this.current().body.push(this.ensureSafeAssignContext(a),";")},ensureSafeObject:function(a){return"ensureSafeObject("+a+",text)"},ensureSafeMemberName:function(a){return"ensureSafeMemberName("+a+",text)"},ensureSafeFunction:function(a){return"ensureSafeFunction("+a+",text)"},getStringValue:function(a){this.assign(a,"getStringValue("+a+",text)")},ensureSafeAssignContext:function(a){return"ensureSafeAssignContext("+
+a+",text)"},lazyRecurse:function(a,b,d,c,e,f){var g=this;return function(){g.recurse(a,b,d,c,e,f)}},lazyAssign:function(a,b){var d=this;return function(){d.assign(a,b)}},stringEscapeRegex:/[^ a-zA-Z0-9]/g,stringEscapeFn:function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)},escape:function(a){if(E(a))return"'"+a.replace(this.stringEscapeRegex,this.stringEscapeFn)+"'";if(Q(a))return a.toString();if(!0===a)return"true";if(!1===a)return"false";if(null===a)return"null";if("undefined"===
+typeof a)return"undefined";throw ba("esc");},nextId:function(a,b){var d="v"+this.state.nextId++;a||this.current().vars.push(d+(b?"="+b:""));return d},current:function(){return this.state[this.state.computing]}};sd.prototype={compile:function(a,b){var d=this,c=this.astBuilder.ast(a);this.expression=a;this.expensiveChecks=b;W(c,d.$filter);var e,f;if(e=pd(c))f=this.recurse(e);e=nd(c.body);var g;e&&(g=[],n(e,function(a,b){var c=d.recurse(a);a.input=c;g.push(c);a.watchId=b}));var h=[];n(c.body,function(a){h.push(d.recurse(a.expression))});
+e=0===c.body.length?function(){}:1===c.body.length?h[0]:function(a,b){var c;n(h,function(d){c=d(a,b)});return c};f&&(e.assign=function(a,b,c){return f(a,c,b)});g&&(e.inputs=g);e.literal=qd(c);e.constant=c.constant;return e},recurse:function(a,b,d){var c,e,f=this,g;if(a.input)return this.inputs(a.input,a.watchId);switch(a.type){case s.Literal:return this.value(a.value,b);case s.UnaryExpression:return e=this.recurse(a.argument),this["unary"+a.operator](e,b);case s.BinaryExpression:return c=this.recurse(a.left),
+e=this.recurse(a.right),this["binary"+a.operator](c,e,b);case s.LogicalExpression:return c=this.recurse(a.left),e=this.recurse(a.right),this["binary"+a.operator](c,e,b);case s.ConditionalExpression:return this["ternary?:"](this.recurse(a.test),this.recurse(a.alternate),this.recurse(a.consequent),b);case s.Identifier:return Va(a.name,f.expression),f.identifier(a.name,f.expensiveChecks||Fb(a.name),b,d,f.expression);case s.MemberExpression:return c=this.recurse(a.object,!1,!!d),a.computed||(Va(a.property.name,
+f.expression),e=a.property.name),a.computed&&(e=this.recurse(a.property)),a.computed?this.computedMember(c,e,b,d,f.expression):this.nonComputedMember(c,e,f.expensiveChecks,b,d,f.expression);case s.CallExpression:return g=[],n(a.arguments,function(a){g.push(f.recurse(a))}),a.filter&&(e=this.$filter(a.callee.name)),a.filter||(e=this.recurse(a.callee,!0)),a.filter?function(a,c,d,f){for(var r=[],n=0;n<g.length;++n)r.push(g[n](a,c,d,f));a=e.apply(u,r,f);return b?{context:u,name:u,value:a}:a}:function(a,
+c,d,m){var r=e(a,c,d,m),n;if(null!=r.value){xa(r.context,f.expression);kd(r.value,f.expression);n=[];for(var q=0;q<g.length;++q)n.push(xa(g[q](a,c,d,m),f.expression));n=xa(r.value.apply(r.context,n),f.expression)}return b?{value:n}:n};case s.AssignmentExpression:return c=this.recurse(a.left,!0,1),e=this.recurse(a.right),function(a,d,g,m){var n=c(a,d,g,m);a=e(a,d,g,m);xa(n.value,f.expression);ld(n.context);n.context[n.name]=a;return b?{value:a}:a};case s.ArrayExpression:return g=[],n(a.elements,function(a){g.push(f.recurse(a))}),
+function(a,c,d,e){for(var f=[],n=0;n<g.length;++n)f.push(g[n](a,c,d,e));return b?{value:f}:f};case s.ObjectExpression:return g=[],n(a.properties,function(a){g.push({key:a.key.type===s.Identifier?a.key.name:""+a.key.value,value:f.recurse(a.value)})}),function(a,c,d,e){for(var f={},n=0;n<g.length;++n)f[g[n].key]=g[n].value(a,c,d,e);return b?{value:f}:f};case s.ThisExpression:return function(a){return b?{value:a}:a};case s.NGValueParameter:return function(a,c,d,e){return b?{value:d}:d}}},"unary+":function(a,
+b){return function(d,c,e,f){d=a(d,c,e,f);d=y(d)?+d:0;return b?{value:d}:d}},"unary-":function(a,b){return function(d,c,e,f){d=a(d,c,e,f);d=y(d)?-d:0;return b?{value:d}:d}},"unary!":function(a,b){return function(d,c,e,f){d=!a(d,c,e,f);return b?{value:d}:d}},"binary+":function(a,b,d){return function(c,e,f,g){var h=a(c,e,f,g);c=b(c,e,f,g);h=md(h,c);return d?{value:h}:h}},"binary-":function(a,b,d){return function(c,e,f,g){var h=a(c,e,f,g);c=b(c,e,f,g);h=(y(h)?h:0)-(y(c)?c:0);return d?{value:h}:h}},"binary*":function(a,
+b,d){return function(c,e,f,g){c=a(c,e,f,g)*b(c,e,f,g);return d?{value:c}:c}},"binary/":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)/b(c,e,f,g);return d?{value:c}:c}},"binary%":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)%b(c,e,f,g);return d?{value:c}:c}},"binary===":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)===b(c,e,f,g);return d?{value:c}:c}},"binary!==":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)!==b(c,e,f,g);return d?{value:c}:c}},"binary==":function(a,b,
+d){return function(c,e,f,g){c=a(c,e,f,g)==b(c,e,f,g);return d?{value:c}:c}},"binary!=":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)!=b(c,e,f,g);return d?{value:c}:c}},"binary<":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)<b(c,e,f,g);return d?{value:c}:c}},"binary>":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)>b(c,e,f,g);return d?{value:c}:c}},"binary<=":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)<=b(c,e,f,g);return d?{value:c}:c}},"binary>=":function(a,b,d){return function(c,
+e,f,g){c=a(c,e,f,g)>=b(c,e,f,g);return d?{value:c}:c}},"binary&&":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)&&b(c,e,f,g);return d?{value:c}:c}},"binary||":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)||b(c,e,f,g);return d?{value:c}:c}},"ternary?:":function(a,b,d,c){return function(e,f,g,h){e=a(e,f,g,h)?b(e,f,g,h):d(e,f,g,h);return c?{value:e}:e}},value:function(a,b){return function(){return b?{context:u,name:u,value:a}:a}},identifier:function(a,b,d,c,e){return function(f,g,h,k){f=
+g&&a in g?g:f;c&&1!==c&&f&&!f[a]&&(f[a]={});g=f?f[a]:u;b&&xa(g,e);return d?{context:f,name:a,value:g}:g}},computedMember:function(a,b,d,c,e){return function(f,g,h,k){var l=a(f,g,h,k),m,n;null!=l&&(m=b(f,g,h,k),m=jd(m),Va(m,e),c&&1!==c&&l&&!l[m]&&(l[m]={}),n=l[m],xa(n,e));return d?{context:l,name:m,value:n}:n}},nonComputedMember:function(a,b,d,c,e,f){return function(g,h,k,l){g=a(g,h,k,l);e&&1!==e&&g&&!g[b]&&(g[b]={});h=null!=g?g[b]:u;(d||Fb(b))&&xa(h,f);return c?{context:g,name:b,value:h}:h}},inputs:function(a,
+b){return function(d,c,e,f){return f?f[b]:a(d,c,e)}}};var gc=function(a,b,d){this.lexer=a;this.$filter=b;this.options=d;this.ast=new s(this.lexer);this.astCompiler=d.csp?new sd(this.ast,b):new rd(this.ast,b)};gc.prototype={constructor:gc,parse:function(a){return this.astCompiler.compile(a,this.options.expensiveChecks)}};$();$();var $f=Object.prototype.valueOf,ya=G("$sce"),la={HTML:"html",CSS:"css",URL:"url",RESOURCE_URL:"resourceUrl",JS:"js"},ha=G("$compile"),Y=X.createElement("a"),wd=wa(S.location.href);
+xd.$inject=["$document"];Jc.$inject=["$provide"];yd.$inject=["$locale"];Ad.$inject=["$locale"];var ic=".",jg={yyyy:ca("FullYear",4),yy:ca("FullYear",2,0,!0),y:ca("FullYear",1),MMMM:Hb("Month"),MMM:Hb("Month",!0),MM:ca("Month",2,1),M:ca("Month",1,1),dd:ca("Date",2),d:ca("Date",1),HH:ca("Hours",2),H:ca("Hours",1),hh:ca("Hours",2,-12),h:ca("Hours",1,-12),mm:ca("Minutes",2),m:ca("Minutes",1),ss:ca("Seconds",2),s:ca("Seconds",1),sss:ca("Milliseconds",3),EEEE:Hb("Day"),EEE:Hb("Day",!0),a:function(a,b){return 12>
+a.getHours()?b.AMPMS[0]:b.AMPMS[1]},Z:function(a,b,d){a=-1*d;return a=(0<=a?"+":"")+(Gb(Math[0<a?"floor":"ceil"](a/60),2)+Gb(Math.abs(a%60),2))},ww:Ed(2),w:Ed(1),G:jc,GG:jc,GGG:jc,GGGG:function(a,b){return 0>=a.getFullYear()?b.ERANAMES[0]:b.ERANAMES[1]}},ig=/((?:[^yMdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z|G+|w+))(.*)/,hg=/^\-?\d+$/;zd.$inject=["$locale"];var eg=na(F),fg=na(sb);Bd.$inject=["$parse"];var he=na({restrict:"E",compile:function(a,b){if(!b.href&&!b.xlinkHref)return function(a,
+b){if("a"===b[0].nodeName.toLowerCase()){var e="[object SVGAnimatedString]"===sa.call(b.prop("href"))?"xlink:href":"href";b.on("click",function(a){b.attr(e)||a.preventDefault()})}}}}),tb={};n(Cb,function(a,b){function d(a,d,e){a.$watch(e[c],function(a){e.$set(b,!!a)})}if("multiple"!=a){var c=va("ng-"+b),e=d;"checked"===a&&(e=function(a,b,e){e.ngModel!==e[c]&&d(a,b,e)});tb[c]=function(){return{restrict:"A",priority:100,link:e}}}});n(Zc,function(a,b){tb[b]=function(){return{priority:100,link:function(a,
+c,e){if("ngPattern"===b&&"/"==e.ngPattern.charAt(0)&&(c=e.ngPattern.match(lg))){e.$set("ngPattern",new RegExp(c[1],c[2]));return}a.$watch(e[b],function(a){e.$set(b,a)})}}}});n(["src","srcset","href"],function(a){var b=va("ng-"+a);tb[b]=function(){return{priority:99,link:function(d,c,e){var f=a,g=a;"href"===a&&"[object SVGAnimatedString]"===sa.call(c.prop("href"))&&(g="xlinkHref",e.$attr[g]="xlink:href",f=null);e.$observe(b,function(b){b?(e.$set(g,b),Ha&&f&&c.prop(f,e[g])):"href"===a&&e.$set(g,null)})}}}});
+var Ib={$addControl:x,$$renameControl:function(a,b){a.$name=b},$removeControl:x,$setValidity:x,$setDirty:x,$setPristine:x,$setSubmitted:x};Fd.$inject=["$element","$attrs","$scope","$animate","$interpolate"];var Nd=function(a){return["$timeout","$parse",function(b,d){function c(a){return""===a?d('this[""]').assign:d(a).assign||x}return{name:"form",restrict:a?"EAC":"E",require:["form","^^?form"],controller:Fd,compile:function(d,f){d.addClass(Wa).addClass(mb);var g=f.name?"name":a&&f.ngForm?"ngForm":
+!1;return{pre:function(a,d,e,f){var n=f[0];if(!("action"in e)){var q=function(b){a.$apply(function(){n.$commitViewValue();n.$setSubmitted()});b.preventDefault()};d[0].addEventListener("submit",q,!1);d.on("$destroy",function(){b(function(){d[0].removeEventListener("submit",q,!1)},0,!1)})}(f[1]||n.$$parentForm).$addControl(n);var s=g?c(n.$name):x;g&&(s(a,n),e.$observe(g,function(b){n.$name!==b&&(s(a,u),n.$$parentForm.$$renameControl(n,b),s=c(n.$name),s(a,n))}));d.on("$destroy",function(){n.$$parentForm.$removeControl(n);
+s(a,u);M(n,Ib)})}}}}}]},ie=Nd(),ve=Nd(!0),kg=/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/,tg=/^[A-Za-z][A-Za-z\d.+-]*:\/*(?:\w+(?::\w+)?@)?[^\s/]+(?::\d+)?(?:\/[\w#!:.?+=&%@\-/]*)?$/,ug=/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i,vg=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/,Od=/^(\d{4})-(\d{2})-(\d{2})$/,Pd=/^(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,mc=/^(\d{4})-W(\d\d)$/,Qd=/^(\d{4})-(\d\d)$/,
+Rd=/^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,Sd={text:function(a,b,d,c,e,f){jb(a,b,d,c,e,f);kc(c)},date:kb("date",Od,Kb(Od,["yyyy","MM","dd"]),"yyyy-MM-dd"),"datetime-local":kb("datetimelocal",Pd,Kb(Pd,"yyyy MM dd HH mm ss sss".split(" ")),"yyyy-MM-ddTHH:mm:ss.sss"),time:kb("time",Rd,Kb(Rd,["HH","mm","ss","sss"]),"HH:mm:ss.sss"),week:kb("week",mc,function(a,b){if(da(a))return a;if(E(a)){mc.lastIndex=0;var d=mc.exec(a);if(d){var c=+d[1],e=+d[2],f=d=0,g=0,h=0,k=Dd(c),e=7*(e-1);b&&(d=b.getHours(),f=
+b.getMinutes(),g=b.getSeconds(),h=b.getMilliseconds());return new Date(c,0,k.getDate()+e,d,f,g,h)}}return NaN},"yyyy-Www"),month:kb("month",Qd,Kb(Qd,["yyyy","MM"]),"yyyy-MM"),number:function(a,b,d,c,e,f){Hd(a,b,d,c);jb(a,b,d,c,e,f);c.$$parserName="number";c.$parsers.push(function(a){return c.$isEmpty(a)?null:vg.test(a)?parseFloat(a):u});c.$formatters.push(function(a){if(!c.$isEmpty(a)){if(!Q(a))throw lb("numfmt",a);a=a.toString()}return a});if(y(d.min)||d.ngMin){var g;c.$validators.min=function(a){return c.$isEmpty(a)||
+q(g)||a>=g};d.$observe("min",function(a){y(a)&&!Q(a)&&(a=parseFloat(a,10));g=Q(a)&&!isNaN(a)?a:u;c.$validate()})}if(y(d.max)||d.ngMax){var h;c.$validators.max=function(a){return c.$isEmpty(a)||q(h)||a<=h};d.$observe("max",function(a){y(a)&&!Q(a)&&(a=parseFloat(a,10));h=Q(a)&&!isNaN(a)?a:u;c.$validate()})}},url:function(a,b,d,c,e,f){jb(a,b,d,c,e,f);kc(c);c.$$parserName="url";c.$validators.url=function(a,b){var d=a||b;return c.$isEmpty(d)||tg.test(d)}},email:function(a,b,d,c,e,f){jb(a,b,d,c,e,f);kc(c);
+c.$$parserName="email";c.$validators.email=function(a,b){var d=a||b;return c.$isEmpty(d)||ug.test(d)}},radio:function(a,b,d,c){q(d.name)&&b.attr("name",++nb);b.on("click",function(a){b[0].checked&&c.$setViewValue(d.value,a&&a.type)});c.$render=function(){b[0].checked=d.value==c.$viewValue};d.$observe("value",c.$render)},checkbox:function(a,b,d,c,e,f,g,h){var k=Id(h,a,"ngTrueValue",d.ngTrueValue,!0),l=Id(h,a,"ngFalseValue",d.ngFalseValue,!1);b.on("click",function(a){c.$setViewValue(b[0].checked,a&&
+a.type)});c.$render=function(){b[0].checked=c.$viewValue};c.$isEmpty=function(a){return!1===a};c.$formatters.push(function(a){return ma(a,k)});c.$parsers.push(function(a){return a?k:l})},hidden:x,button:x,submit:x,reset:x,file:x},Dc=["$browser","$sniffer","$filter","$parse",function(a,b,d,c){return{restrict:"E",require:["?ngModel"],link:{pre:function(e,f,g,h){h[0]&&(Sd[F(g.type)]||Sd.text)(e,f,g,h[0],b,a,d,c)}}}}],wg=/^(true|false|\d+)$/,Ne=function(){return{restrict:"A",priority:100,compile:function(a,
+b){return wg.test(b.ngValue)?function(a,b,e){e.$set("value",a.$eval(e.ngValue))}:function(a,b,e){a.$watch(e.ngValue,function(a){e.$set("value",a)})}}}},ne=["$compile",function(a){return{restrict:"AC",compile:function(b){a.$$addBindingClass(b);return function(b,c,e){a.$$addBindingInfo(c,e.ngBind);c=c[0];b.$watch(e.ngBind,function(a){c.textContent=q(a)?"":a})}}}}],pe=["$interpolate","$compile",function(a,b){return{compile:function(d){b.$$addBindingClass(d);return function(c,d,f){c=a(d.attr(f.$attr.ngBindTemplate));
+b.$$addBindingInfo(d,c.expressions);d=d[0];f.$observe("ngBindTemplate",function(a){d.textContent=q(a)?"":a})}}}}],oe=["$sce","$parse","$compile",function(a,b,d){return{restrict:"A",compile:function(c,e){var f=b(e.ngBindHtml),g=b(e.ngBindHtml,function(a){return(a||"").toString()});d.$$addBindingClass(c);return function(b,c,e){d.$$addBindingInfo(c,e.ngBindHtml);b.$watch(g,function(){c.html(a.getTrustedHtml(f(b))||"")})}}}}],Me=na({restrict:"A",require:"ngModel",link:function(a,b,d,c){c.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),
+qe=lc("",!0),se=lc("Odd",0),re=lc("Even",1),te=La({compile:function(a,b){b.$set("ngCloak",u);a.removeClass("ng-cloak")}}),ue=[function(){return{restrict:"A",scope:!0,controller:"@",priority:500}}],Ic={},xg={blur:!0,focus:!0};n("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var b=va("ng-"+a);Ic[b]=["$parse","$rootScope",function(d,c){return{restrict:"A",compile:function(e,f){var g=
+d(f[b],null,!0);return function(b,d){d.on(a,function(d){var e=function(){g(b,{$event:d})};xg[a]&&c.$$phase?b.$evalAsync(e):b.$apply(e)})}}}}]});var xe=["$animate",function(a){return{multiElement:!0,transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(b,d,c,e,f){var g,h,k;b.$watch(c.ngIf,function(b){b?h||f(function(b,e){h=e;b[b.length++]=X.createComment(" end ngIf: "+c.ngIf+" ");g={clone:b};a.enter(b,d.parent(),d)}):(k&&(k.remove(),k=null),h&&(h.$destroy(),h=null),g&&(k=
+rb(g.clone),a.leave(k).then(function(){k=null}),g=null))})}}}],ye=["$templateRequest","$anchorScroll","$animate",function(a,b,d){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:fa.noop,compile:function(c,e){var f=e.ngInclude||e.src,g=e.onload||"",h=e.autoscroll;return function(c,e,m,n,q){var s=0,v,u,p,C=function(){u&&(u.remove(),u=null);v&&(v.$destroy(),v=null);p&&(d.leave(p).then(function(){u=null}),u=p,p=null)};c.$watch(f,function(f){var m=function(){!y(h)||h&&!c.$eval(h)||
+b()},u=++s;f?(a(f,!0).then(function(a){if(u===s){var b=c.$new();n.template=a;a=q(b,function(a){C();d.enter(a,null,e).then(m)});v=b;p=a;v.$emit("$includeContentLoaded",f);c.$eval(g)}},function(){u===s&&(C(),c.$emit("$includeContentError",f))}),c.$emit("$includeContentRequested",f)):(C(),n.template=null)})}}}}],Pe=["$compile",function(a){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(b,d,c,e){/SVG/.test(d[0].toString())?(d.empty(),a(Lc(e.template,X).childNodes)(b,function(a){d.append(a)},
+{futureParentElement:d})):(d.html(e.template),a(d.contents())(b))}}}],ze=La({priority:450,compile:function(){return{pre:function(a,b,d){a.$eval(d.ngInit)}}}}),Le=function(){return{restrict:"A",priority:100,require:"ngModel",link:function(a,b,d,c){var e=b.attr(d.$attr.ngList)||", ",f="false"!==d.ngTrim,g=f?U(e):e;c.$parsers.push(function(a){if(!q(a)){var b=[];a&&n(a.split(g),function(a){a&&b.push(f?U(a):a)});return b}});c.$formatters.push(function(a){return I(a)?a.join(e):u});c.$isEmpty=function(a){return!a||
+!a.length}}}},mb="ng-valid",Jd="ng-invalid",Wa="ng-pristine",Jb="ng-dirty",Ld="ng-pending",lb=G("ngModel"),yg=["$scope","$exceptionHandler","$attrs","$element","$parse","$animate","$timeout","$rootScope","$q","$interpolate",function(a,b,d,c,e,f,g,h,k,l){this.$modelValue=this.$viewValue=Number.NaN;this.$$rawModelValue=u;this.$validators={};this.$asyncValidators={};this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$untouched=!0;this.$touched=!1;this.$pristine=!0;this.$dirty=!1;
+this.$valid=!0;this.$invalid=!1;this.$error={};this.$$success={};this.$pending=u;this.$name=l(d.name||"",!1)(a);this.$$parentForm=Ib;var m=e(d.ngModel),r=m.assign,t=m,s=r,v=null,B,p=this;this.$$setOptions=function(a){if((p.$options=a)&&a.getterSetter){var b=e(d.ngModel+"()"),f=e(d.ngModel+"($$$p)");t=function(a){var c=m(a);z(c)&&(c=b(a));return c};s=function(a,b){z(m(a))?f(a,{$$$p:p.$modelValue}):r(a,p.$modelValue)}}else if(!m.assign)throw lb("nonassign",d.ngModel,ua(c));};this.$render=x;this.$isEmpty=
+function(a){return q(a)||""===a||null===a||a!==a};var C=0;Gd({ctrl:this,$element:c,set:function(a,b){a[b]=!0},unset:function(a,b){delete a[b]},$animate:f});this.$setPristine=function(){p.$dirty=!1;p.$pristine=!0;f.removeClass(c,Jb);f.addClass(c,Wa)};this.$setDirty=function(){p.$dirty=!0;p.$pristine=!1;f.removeClass(c,Wa);f.addClass(c,Jb);p.$$parentForm.$setDirty()};this.$setUntouched=function(){p.$touched=!1;p.$untouched=!0;f.setClass(c,"ng-untouched","ng-touched")};this.$setTouched=function(){p.$touched=
+!0;p.$untouched=!1;f.setClass(c,"ng-touched","ng-untouched")};this.$rollbackViewValue=function(){g.cancel(v);p.$viewValue=p.$$lastCommittedViewValue;p.$render()};this.$validate=function(){if(!Q(p.$modelValue)||!isNaN(p.$modelValue)){var a=p.$$rawModelValue,b=p.$valid,c=p.$modelValue,d=p.$options&&p.$options.allowInvalid;p.$$runValidators(a,p.$$lastCommittedViewValue,function(e){d||b===e||(p.$modelValue=e?a:u,p.$modelValue!==c&&p.$$writeModelToScope())})}};this.$$runValidators=function(a,b,c){function d(){var c=
+!0;n(p.$validators,function(d,e){var g=d(a,b);c=c&&g;f(e,g)});return c?!0:(n(p.$asyncValidators,function(a,b){f(b,null)}),!1)}function e(){var c=[],d=!0;n(p.$asyncValidators,function(e,g){var h=e(a,b);if(!h||!z(h.then))throw lb("$asyncValidators",h);f(g,u);c.push(h.then(function(){f(g,!0)},function(a){d=!1;f(g,!1)}))});c.length?k.all(c).then(function(){g(d)},x):g(!0)}function f(a,b){h===C&&p.$setValidity(a,b)}function g(a){h===C&&c(a)}C++;var h=C;(function(){var a=p.$$parserName||"parse";if(q(B))f(a,
+null);else return B||(n(p.$validators,function(a,b){f(b,null)}),n(p.$asyncValidators,function(a,b){f(b,null)})),f(a,B),B;return!0})()?d()?e():g(!1):g(!1)};this.$commitViewValue=function(){var a=p.$viewValue;g.cancel(v);if(p.$$lastCommittedViewValue!==a||""===a&&p.$$hasNativeValidators)p.$$lastCommittedViewValue=a,p.$pristine&&this.$setDirty(),this.$$parseAndValidate()};this.$$parseAndValidate=function(){var b=p.$$lastCommittedViewValue;if(B=q(b)?u:!0)for(var c=0;c<p.$parsers.length;c++)if(b=p.$parsers[c](b),
+q(b)){B=!1;break}Q(p.$modelValue)&&isNaN(p.$modelValue)&&(p.$modelValue=t(a));var d=p.$modelValue,e=p.$options&&p.$options.allowInvalid;p.$$rawModelValue=b;e&&(p.$modelValue=b,p.$modelValue!==d&&p.$$writeModelToScope());p.$$runValidators(b,p.$$lastCommittedViewValue,function(a){e||(p.$modelValue=a?b:u,p.$modelValue!==d&&p.$$writeModelToScope())})};this.$$writeModelToScope=function(){s(a,p.$modelValue);n(p.$viewChangeListeners,function(a){try{a()}catch(c){b(c)}})};this.$setViewValue=function(a,b){p.$viewValue=
+a;p.$options&&!p.$options.updateOnDefault||p.$$debounceViewValueCommit(b)};this.$$debounceViewValueCommit=function(b){var c=0,d=p.$options;d&&y(d.debounce)&&(d=d.debounce,Q(d)?c=d:Q(d[b])?c=d[b]:Q(d["default"])&&(c=d["default"]));g.cancel(v);c?v=g(function(){p.$commitViewValue()},c):h.$$phase?p.$commitViewValue():a.$apply(function(){p.$commitViewValue()})};a.$watch(function(){var b=t(a);if(b!==p.$modelValue&&(p.$modelValue===p.$modelValue||b===b)){p.$modelValue=p.$$rawModelValue=b;B=u;for(var c=p.$formatters,
+d=c.length,e=b;d--;)e=c[d](e);p.$viewValue!==e&&(p.$viewValue=p.$$lastCommittedViewValue=e,p.$render(),p.$$runValidators(b,e,x))}return b})}],Ke=["$rootScope",function(a){return{restrict:"A",require:["ngModel","^?form","^?ngModelOptions"],controller:yg,priority:1,compile:function(b){b.addClass(Wa).addClass("ng-untouched").addClass(mb);return{pre:function(a,b,e,f){var g=f[0];b=f[1]||g.$$parentForm;g.$$setOptions(f[2]&&f[2].$options);b.$addControl(g);e.$observe("name",function(a){g.$name!==a&&g.$$parentForm.$$renameControl(g,
+a)});a.$on("$destroy",function(){g.$$parentForm.$removeControl(g)})},post:function(b,c,e,f){var g=f[0];if(g.$options&&g.$options.updateOn)c.on(g.$options.updateOn,function(a){g.$$debounceViewValueCommit(a&&a.type)});c.on("blur",function(c){g.$touched||(a.$$phase?b.$evalAsync(g.$setTouched):b.$apply(g.$setTouched))})}}}}}],zg=/(\s+|^)default(\s+|$)/,Oe=function(){return{restrict:"A",controller:["$scope","$attrs",function(a,b){var d=this;this.$options=bb(a.$eval(b.ngModelOptions));y(this.$options.updateOn)?
+(this.$options.updateOnDefault=!1,this.$options.updateOn=U(this.$options.updateOn.replace(zg,function(){d.$options.updateOnDefault=!0;return" "}))):this.$options.updateOnDefault=!0}]}},Ae=La({terminal:!0,priority:1E3}),Ag=G("ngOptions"),Bg=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?(?:\s+disable\s+when\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/,Ie=["$compile","$parse",function(a,
+b){function d(a,c,d){function e(a,b,c,d,f){this.selectValue=a;this.viewValue=b;this.label=c;this.group=d;this.disabled=f}function l(a){var b;if(!q&&za(a))b=a;else{b=[];for(var c in a)a.hasOwnProperty(c)&&"$"!==c.charAt(0)&&b.push(c)}return b}var m=a.match(Bg);if(!m)throw Ag("iexp",a,ua(c));var n=m[5]||m[7],q=m[6];a=/ as /.test(m[0])&&m[1];var s=m[9];c=b(m[2]?m[1]:n);var v=a&&b(a)||c,u=s&&b(s),p=s?function(a,b){return u(d,b)}:function(a){return Ca(a)},C=function(a,b){return p(a,z(a,b))},w=b(m[2]||
+m[1]),y=b(m[3]||""),B=b(m[4]||""),x=b(m[8]),D={},z=q?function(a,b){D[q]=b;D[n]=a;return D}:function(a){D[n]=a;return D};return{trackBy:s,getTrackByValue:C,getWatchables:b(x,function(a){var b=[];a=a||[];for(var c=l(a),e=c.length,f=0;f<e;f++){var g=a===c?f:c[f],k=z(a[g],g),g=p(a[g],k);b.push(g);if(m[2]||m[1])g=w(d,k),b.push(g);m[4]&&(k=B(d,k),b.push(k))}return b}),getOptions:function(){for(var a=[],b={},c=x(d)||[],f=l(c),g=f.length,m=0;m<g;m++){var n=c===f?m:f[m],r=z(c[n],n),q=v(d,r),n=p(q,r),t=w(d,
+r),u=y(d,r),r=B(d,r),q=new e(n,q,t,u,r);a.push(q);b[n]=q}return{items:a,selectValueMap:b,getOptionFromViewValue:function(a){return b[C(a)]},getViewValueFromOption:function(a){return s?fa.copy(a.viewValue):a.viewValue}}}}}var c=X.createElement("option"),e=X.createElement("optgroup");return{restrict:"A",terminal:!0,require:["select","?ngModel"],link:{pre:function(a,b,c,d){d[0].registerOption=x},post:function(b,g,h,k){function l(a,b){a.element=b;b.disabled=a.disabled;a.label!==b.label&&(b.label=a.label,
+b.textContent=a.label);a.value!==b.value&&(b.value=a.selectValue)}function m(a,b,c,d){b&&F(b.nodeName)===c?c=b:(c=d.cloneNode(!1),b?a.insertBefore(c,b):a.appendChild(c));return c}function r(a){for(var b;a;)b=a.nextSibling,Xb(a),a=b}function q(a){var b=p&&p[0],c=z&&z[0];if(b||c)for(;a&&(a===b||a===c||8===a.nodeType||""===a.value);)a=a.nextSibling;return a}function s(){var a=D&&u.readValue();D=E.getOptions();var b={},d=g[0].firstChild;x&&g.prepend(p);d=q(d);D.items.forEach(function(a){var f,h;a.group?
+(f=b[a.group],f||(f=m(g[0],d,"optgroup",e),d=f.nextSibling,f.label=a.group,f=b[a.group]={groupElement:f,currentOptionElement:f.firstChild}),h=m(f.groupElement,f.currentOptionElement,"option",c),l(a,h),f.currentOptionElement=h.nextSibling):(h=m(g[0],d,"option",c),l(a,h),d=h.nextSibling)});Object.keys(b).forEach(function(a){r(b[a].currentOptionElement)});r(d);v.$render();if(!v.$isEmpty(a)){var f=u.readValue();(E.trackBy?ma(a,f):a===f)||(v.$setViewValue(f),v.$render())}}var v=k[1];if(v){var u=k[0];k=
+h.multiple;for(var p,C=0,w=g.children(),y=w.length;C<y;C++)if(""===w[C].value){p=w.eq(C);break}var x=!!p,z=B(c.cloneNode(!1));z.val("?");var D,E=d(h.ngOptions,g,b);k?(v.$isEmpty=function(a){return!a||0===a.length},u.writeValue=function(a){D.items.forEach(function(a){a.element.selected=!1});a&&a.forEach(function(a){(a=D.getOptionFromViewValue(a))&&!a.disabled&&(a.element.selected=!0)})},u.readValue=function(){var a=g.val()||[],b=[];n(a,function(a){(a=D.selectValueMap[a])&&!a.disabled&&b.push(D.getViewValueFromOption(a))});
+return b},E.trackBy&&b.$watchCollection(function(){if(I(v.$viewValue))return v.$viewValue.map(function(a){return E.getTrackByValue(a)})},function(){v.$render()})):(u.writeValue=function(a){var b=D.getOptionFromViewValue(a);b&&!b.disabled?g[0].value!==b.selectValue&&(z.remove(),x||p.remove(),g[0].value=b.selectValue,b.element.selected=!0,b.element.setAttribute("selected","selected")):null===a||x?(z.remove(),x||g.prepend(p),g.val(""),p.prop("selected",!0),p.attr("selected",!0)):(x||p.remove(),g.prepend(z),
+g.val("?"),z.prop("selected",!0),z.attr("selected",!0))},u.readValue=function(){var a=D.selectValueMap[g.val()];return a&&!a.disabled?(x||p.remove(),z.remove(),D.getViewValueFromOption(a)):null},E.trackBy&&b.$watch(function(){return E.getTrackByValue(v.$viewValue)},function(){v.$render()}));x?(p.remove(),a(p)(b),p.removeClass("ng-scope")):p=B(c.cloneNode(!1));s();b.$watchCollection(E.getWatchables,s)}}}}}],Be=["$locale","$interpolate","$log",function(a,b,d){var c=/{}/g,e=/^when(Minus)?(.+)$/;return{link:function(f,
+g,h){function k(a){g.text(a||"")}var l=h.count,m=h.$attr.when&&g.attr(h.$attr.when),r=h.offset||0,s=f.$eval(m)||{},u={},v=b.startSymbol(),y=b.endSymbol(),p=v+l+"-"+r+y,C=fa.noop,w;n(h,function(a,b){var c=e.exec(b);c&&(c=(c[1]?"-":"")+F(c[2]),s[c]=g.attr(h.$attr[b]))});n(s,function(a,d){u[d]=b(a.replace(c,p))});f.$watch(l,function(b){var c=parseFloat(b),e=isNaN(c);e||c in s||(c=a.pluralCat(c-r));c===w||e&&Q(w)&&isNaN(w)||(C(),e=u[c],q(e)?(null!=b&&d.debug("ngPluralize: no rule defined for '"+c+"' in "+
+m),C=x,k()):C=f.$watch(e,k),w=c)})}}}],Ce=["$parse","$animate",function(a,b){var d=G("ngRepeat"),c=function(a,b,c,d,k,l,m){a[c]=d;k&&(a[k]=l);a.$index=b;a.$first=0===b;a.$last=b===m-1;a.$middle=!(a.$first||a.$last);a.$odd=!(a.$even=0===(b&1))};return{restrict:"A",multiElement:!0,transclude:"element",priority:1E3,terminal:!0,$$tlb:!0,compile:function(e,f){var g=f.ngRepeat,h=X.createComment(" end ngRepeat: "+g+" "),k=g.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/);
+if(!k)throw d("iexp",g);var l=k[1],m=k[2],r=k[3],q=k[4],k=l.match(/^(?:(\s*[\$\w]+)|\(\s*([\$\w]+)\s*,\s*([\$\w]+)\s*\))$/);if(!k)throw d("iidexp",l);var s=k[3]||k[1],v=k[2];if(r&&(!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(r)||/^(null|undefined|this|\$index|\$first|\$middle|\$last|\$even|\$odd|\$parent|\$root|\$id)$/.test(r)))throw d("badident",r);var x,p,y,w,z={$id:Ca};q?x=a(q):(y=function(a,b){return Ca(b)},w=function(a){return a});return function(a,e,f,k,l){x&&(p=function(b,c,d){v&&(z[v]=b);z[s]=c;z.$index=
+d;return x(a,z)});var q=$();a.$watchCollection(m,function(f){var k,m,t=e[0],x,z=$(),D,E,H,F,I,G,J;r&&(a[r]=f);if(za(f))I=f,m=p||y;else for(J in m=p||w,I=[],f)qa.call(f,J)&&"$"!==J.charAt(0)&&I.push(J);D=I.length;J=Array(D);for(k=0;k<D;k++)if(E=f===I?k:I[k],H=f[E],F=m(E,H,k),q[F])G=q[F],delete q[F],z[F]=G,J[k]=G;else{if(z[F])throw n(J,function(a){a&&a.scope&&(q[a.id]=a)}),d("dupes",g,F,H);J[k]={id:F,scope:u,clone:u};z[F]=!0}for(x in q){G=q[x];F=rb(G.clone);b.leave(F);if(F[0].parentNode)for(k=0,m=F.length;k<
+m;k++)F[k].$$NG_REMOVED=!0;G.scope.$destroy()}for(k=0;k<D;k++)if(E=f===I?k:I[k],H=f[E],G=J[k],G.scope){x=t;do x=x.nextSibling;while(x&&x.$$NG_REMOVED);G.clone[0]!=x&&b.move(rb(G.clone),null,B(t));t=G.clone[G.clone.length-1];c(G.scope,k,s,H,v,E,D)}else l(function(a,d){G.scope=d;var e=h.cloneNode(!1);a[a.length++]=e;b.enter(a,null,B(t));t=e;G.clone=a;z[G.id]=G;c(G.scope,k,s,H,v,E,D)});q=z})}}}}],De=["$animate",function(a){return{restrict:"A",multiElement:!0,link:function(b,d,c){b.$watch(c.ngShow,function(b){a[b?
+"removeClass":"addClass"](d,"ng-hide",{tempClasses:"ng-hide-animate"})})}}}],we=["$animate",function(a){return{restrict:"A",multiElement:!0,link:function(b,d,c){b.$watch(c.ngHide,function(b){a[b?"addClass":"removeClass"](d,"ng-hide",{tempClasses:"ng-hide-animate"})})}}}],Ee=La(function(a,b,d){a.$watch(d.ngStyle,function(a,d){d&&a!==d&&n(d,function(a,c){b.css(c,"")});a&&b.css(a)},!0)}),Fe=["$animate",function(a){return{require:"ngSwitch",controller:["$scope",function(){this.cases={}}],link:function(b,
+d,c,e){var f=[],g=[],h=[],k=[],l=function(a,b){return function(){a.splice(b,1)}};b.$watch(c.ngSwitch||c.on,function(b){var c,d;c=0;for(d=h.length;c<d;++c)a.cancel(h[c]);c=h.length=0;for(d=k.length;c<d;++c){var q=rb(g[c].clone);k[c].$destroy();(h[c]=a.leave(q)).then(l(h,c))}g.length=0;k.length=0;(f=e.cases["!"+b]||e.cases["?"])&&n(f,function(b){b.transclude(function(c,d){k.push(d);var e=b.element;c[c.length++]=X.createComment(" end ngSwitchWhen: ");g.push({clone:c});a.enter(c,e.parent(),e)})})})}}}],
+Ge=La({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(a,b,d,c,e){c.cases["!"+d.ngSwitchWhen]=c.cases["!"+d.ngSwitchWhen]||[];c.cases["!"+d.ngSwitchWhen].push({transclude:e,element:b})}}),He=La({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(a,b,d,c,e){c.cases["?"]=c.cases["?"]||[];c.cases["?"].push({transclude:e,element:b})}}),Je=La({restrict:"EAC",link:function(a,b,d,c,e){if(!e)throw G("ngTransclude")("orphan",ua(b));e(function(a){b.empty();
+b.append(a)})}}),je=["$templateCache",function(a){return{restrict:"E",terminal:!0,compile:function(b,d){"text/ng-template"==d.type&&a.put(d.id,b[0].text)}}}],Cg={$setViewValue:x,$render:x},Dg=["$element","$scope","$attrs",function(a,b,d){var c=this,e=new Sa;c.ngModelCtrl=Cg;c.unknownOption=B(X.createElement("option"));c.renderUnknownOption=function(b){b="? "+Ca(b)+" ?";c.unknownOption.val(b);a.prepend(c.unknownOption);a.val(b)};b.$on("$destroy",function(){c.renderUnknownOption=x});c.removeUnknownOption=
+function(){c.unknownOption.parent()&&c.unknownOption.remove()};c.readValue=function(){c.removeUnknownOption();return a.val()};c.writeValue=function(b){c.hasOption(b)?(c.removeUnknownOption(),a.val(b),""===b&&c.emptyOption.prop("selected",!0)):null==b&&c.emptyOption?(c.removeUnknownOption(),a.val("")):c.renderUnknownOption(b)};c.addOption=function(a,b){Ra(a,'"option value"');""===a&&(c.emptyOption=b);var d=e.get(a)||0;e.put(a,d+1);c.ngModelCtrl.$render();b[0].hasAttribute("selected")&&(b[0].selected=
+!0)};c.removeOption=function(a){var b=e.get(a);b&&(1===b?(e.remove(a),""===a&&(c.emptyOption=u)):e.put(a,b-1))};c.hasOption=function(a){return!!e.get(a)};c.registerOption=function(a,b,d,e,l){if(e){var m;d.$observe("value",function(a){y(m)&&c.removeOption(m);m=a;c.addOption(a,b)})}else l?a.$watch(l,function(a,e){d.$set("value",a);e!==a&&c.removeOption(e);c.addOption(a,b)}):c.addOption(d.value,b);b.on("$destroy",function(){c.removeOption(d.value);c.ngModelCtrl.$render()})}}],ke=function(){return{restrict:"E",
+require:["select","?ngModel"],controller:Dg,priority:1,link:{pre:function(a,b,d,c){var e=c[1];if(e){var f=c[0];f.ngModelCtrl=e;e.$render=function(){f.writeValue(e.$viewValue)};b.on("change",function(){a.$apply(function(){e.$setViewValue(f.readValue())})});if(d.multiple){f.readValue=function(){var a=[];n(b.find("option"),function(b){b.selected&&a.push(b.value)});return a};f.writeValue=function(a){var c=new Sa(a);n(b.find("option"),function(a){a.selected=y(c.get(a.value))})};var g,h=NaN;a.$watch(function(){h!==
+e.$viewValue||ma(g,e.$viewValue)||(g=ia(e.$viewValue),e.$render());h=e.$viewValue});e.$isEmpty=function(a){return!a||0===a.length}}}}}}},me=["$interpolate",function(a){return{restrict:"E",priority:100,compile:function(b,d){if(y(d.value))var c=a(d.value,!0);else{var e=a(b.text(),!0);e||d.$set("value",b.text())}return function(a,b,d){var k=b.parent();(k=k.data("$selectController")||k.parent().data("$selectController"))&&k.registerOption(a,b,d,c,e)}}}}],le=na({restrict:"E",terminal:!1}),Fc=function(){return{restrict:"A",
+require:"?ngModel",link:function(a,b,d,c){c&&(d.required=!0,c.$validators.required=function(a,b){return!d.required||!c.$isEmpty(b)},d.$observe("required",function(){c.$validate()}))}}},Ec=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,d,c){if(c){var e,f=d.ngPattern||d.pattern;d.$observe("pattern",function(a){E(a)&&0<a.length&&(a=new RegExp("^"+a+"$"));if(a&&!a.test)throw G("ngPattern")("noregexp",f,a,ua(b));e=a||u;c.$validate()});c.$validators.pattern=function(a,b){return c.$isEmpty(b)||
+q(e)||e.test(b)}}}}},Hc=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,d,c){if(c){var e=-1;d.$observe("maxlength",function(a){a=ea(a);e=isNaN(a)?-1:a;c.$validate()});c.$validators.maxlength=function(a,b){return 0>e||c.$isEmpty(b)||b.length<=e}}}}},Gc=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,d,c){if(c){var e=0;d.$observe("minlength",function(a){e=ea(a)||0;c.$validate()});c.$validators.minlength=function(a,b){return c.$isEmpty(b)||b.length>=e}}}}};S.angular.bootstrap?
+console.log("WARNING: Tried to load angular more than once."):(ce(),ee(fa),fa.module("ngLocale",[],["$provide",function(a){function b(a){a+="";var b=a.indexOf(".");return-1==b?0:a.length-b-1}a.value("$locale",{DATETIME_FORMATS:{AMPMS:["AM","PM"],DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),ERANAMES:["Before Christ","Anno Domini"],ERAS:["BC","AD"],FIRSTDAYOFWEEK:6,MONTH:"January February March April May June July August September October November December".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),
+SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),WEEKENDRANGE:[5,6],fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",medium:"MMM d, y h:mm:ss a",mediumDate:"MMM d, y",mediumTime:"h:mm:ss a","short":"M/d/yy h:mm a",shortDate:"M/d/yy",shortTime:"h:mm a"},NUMBER_FORMATS:{CURRENCY_SYM:"$",DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{gSize:3,lgSize:3,maxFrac:3,minFrac:0,minInt:1,negPre:"-",negSuf:"",posPre:"",posSuf:""},{gSize:3,lgSize:3,maxFrac:2,minFrac:2,minInt:1,negPre:"-\u00a4",
+negSuf:"",posPre:"\u00a4",posSuf:""}]},id:"en-us",pluralCat:function(a,c){var e=a|0,f=c;u===f&&(f=Math.min(b(a),3));Math.pow(10,f);return 1==e&&0==f?"one":"other"}})}]),B(X).ready(function(){Zd(X,yc)}))})(window,document);!window.angular.$$csp().noInlineStyle&&window.angular.element(document.head).prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\:form{display:block;}.ng-animate-shim{visibility:hidden;}.ng-anchor{position:absolute;}</style>');
+//# sourceMappingURL=angular.min.js.map
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/js/bootstrap.min.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/js/bootstrap.min.js
new file mode 100644
index 0000000..1a6258e
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/js/bootstrap.min.js
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.0.3 (http://getbootstrap.com)
+ * Copyright 2013 Twitter, Inc.
+ * Licensed under http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+if("undefined"==typeof jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.is("input")?"val":"html",e=c.data();a+="Text",e.resetText||c.data("resetText",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons"]'),b=!0;if(a.length){var c=this.$element.find("input");"radio"===c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?b=!1:a.find(".active").removeClass("active")),b&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}b&&this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(!e.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid.bs.carousel",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid.bs.carousel")},0)}).emulateTransitionEnd(600)}else{if(this.$element.trigger(j),j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid.bs.carousel")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?(this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350),void 0):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(jQuery),+function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b),f.trigger(d=a.Event("show.bs.dropdown")),d.isDefaultPrevented())return;f.toggleClass("open").trigger("shown.bs.dropdown"),e.focus()}return!1}},f.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var f=c(d),g=f.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&f.find(e).focus(),d.click();var h=a("[role=menu] li:not(.divider):visible a",f);if(h.length){var i=h.index(h.filter(":focus"));38==b.keyCode&&i>0&&i--,40==b.keyCode&&i<h.length-1&&i++,~i||(i=0),h.eq(i).focus()}}}};var g=a.fn.dropdown;a.fn.dropdown=function(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new f(this)),"string"==typeof b&&d[b].call(c)})},a.fn.dropdown.Constructor=f,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=g,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",e,f.prototype.toggle).on("keydown.bs.dropdown.data-api",e+", [role=menu]",f.prototype.keydown)}(jQuery),+function(a){"use strict";var b=function(b,c){this.options=c,this.$element=a(b),this.$backdrop=this.isShown=null,this.options.remote&&this.$element.load(this.options.remote)};b.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},b.prototype.toggle=function(a){return this[this.isShown?"hide":"show"](a)},b.prototype.show=function(b){var c=this,d=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.$element.on("click.dismiss.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(document.body),c.$element.show(),d&&c.$element[0].offsetWidth,c.$element.addClass("in").attr("aria-hidden",!1),c.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:b});d?c.$element.find(".modal-dialog").one(a.support.transition.end,function(){c.$element.focus().trigger(e)}).emulateTransitionEnd(300):c.$element.focus().trigger(e)}))},b.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one(a.support.transition.end,a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},b.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.focus()},this))},b.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},b.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.removeBackdrop(),a.$element.trigger("hidden.bs.modal")})},b.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},b.prototype.backdrop=function(b){var c=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var d=a.support.transition&&c;if(this.$backdrop=a('<div class="modal-backdrop '+c+'" />').appendTo(document.body),this.$element.on("click.dismiss.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),d&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;d?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()):b&&b()};var c=a.fn.modal;a.fn.modal=function(c,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},b.DEFAULTS,e.data(),"object"==typeof c&&c);f||e.data("bs.modal",f=new b(this,g)),"string"==typeof c?f[c](d):g.show&&f.show(d)})},a.fn.modal.Constructor=b,a.fn.modal.noConflict=function(){return a.fn.modal=c,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(b){var c=a(this),d=c.attr("href"),e=a(c.attr("data-target")||d&&d.replace(/.*(?=#[^\s]+$)/,"")),f=e.data("modal")?"toggle":a.extend({remote:!/#/.test(d)&&d},e.data(),c.data());b.preventDefault(),e.modal(f,this).one("hide",function(){c.is(":visible")&&c.focus()})}),a(document).on("show.bs.modal",".modal",function(){a(document.body).addClass("modal-open")}).on("hidden.bs.modal",".modal",function(){a(document.body).removeClass("modal-open")})}(jQuery),+function(a){"use strict";var b=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};b.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},b.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focus",i="hover"==g?"mouseleave":"blur";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},b.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},b.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show),void 0):c.show()},b.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide),void 0):c.hide()},b.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){if(this.$element.trigger(b),b.isDefaultPrevented())return;var c=this.tip();this.setContent(),this.options.animation&&c.addClass("fade");var d="function"==typeof this.options.placement?this.options.placement.call(this,c[0],this.$element[0]):this.options.placement,e=/\s?auto?\s?/i,f=e.test(d);f&&(d=d.replace(e,"")||"top"),c.detach().css({top:0,left:0,display:"block"}).addClass(d),this.options.container?c.appendTo(this.options.container):c.insertAfter(this.$element);var g=this.getPosition(),h=c[0].offsetWidth,i=c[0].offsetHeight;if(f){var j=this.$element.parent(),k=d,l=document.documentElement.scrollTop||document.body.scrollTop,m="body"==this.options.container?window.innerWidth:j.outerWidth(),n="body"==this.options.container?window.innerHeight:j.outerHeight(),o="body"==this.options.container?0:j.offset().left;d="bottom"==d&&g.top+g.height+i-l>n?"top":"top"==d&&g.top-l-i<0?"bottom":"right"==d&&g.right+h>m?"left":"left"==d&&g.left-h<o?"right":d,c.removeClass(k).addClass(d)}var p=this.getCalculatedOffset(d,g,h,i);this.applyPlacement(p,d),this.$element.trigger("shown.bs."+this.type)}},b.prototype.applyPlacement=function(a,b){var c,d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),a.top=a.top+g,a.left=a.left+h,d.offset(a).addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;if("top"==b&&j!=f&&(c=!0,a.top=a.top+f-j),/bottom|top/.test(b)){var k=0;a.left<0&&(k=-2*a.left,a.left=0,d.offset(a),i=d[0].offsetWidth,j=d[0].offsetHeight),this.replaceArrow(k-e+i,i,"left")}else this.replaceArrow(j-f,j,"top");c&&d.offset(a)},b.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},b.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach()}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,b).emulateTransitionEnd(150):b(),this.$element.trigger("hidden.bs."+this.type),this)},b.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},b.prototype.hasContent=function(){return this.getTitle()},b.prototype.getPosition=function(){var b=this.$element[0];return a.extend({},"function"==typeof b.getBoundingClientRect?b.getBoundingClientRect():{width:b.offsetWidth,height:b.offsetHeight},this.$element.offset())},b.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},b.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},b.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},b.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},b.prototype.enable=function(){this.enabled=!0},b.prototype.disable=function(){this.enabled=!1},b.prototype.toggleEnabled=function(){this.enabled=!this.enabled},b.prototype.toggle=function(b){var c=b?a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type):this;c.tip().hasClass("in")?c.leave(c):c.enter(c)},b.prototype.destroy=function(){this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var c=a.fn.tooltip;a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof c&&c;e||d.data("bs.tooltip",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=c,this}}(jQuery),+function(a){"use strict";var b=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");b.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(c).is("body")?a(window):a(c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#\w/.test(e)&&a(e);return f&&f.length&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parents(".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top()),"function"==typeof h&&(h=f.bottom());var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;this.affixed!==i&&(this.unpin&&this.$element.css("top",""),this.affixed=i,this.unpin="bottom"==i?e.top-d:null,this.$element.removeClass(b.RESET).addClass("affix"+(i?"-"+i:"")),"bottom"==i&&this.$element.offset({top:document.body.offsetHeight-h-this.$element.height()}))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(jQuery);
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/js/g2.min.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/js/g2.min.js
new file mode 100644
index 0000000..74ec954
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/js/g2.min.js
@@ -0,0 +1 @@
+!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.G2_3=e():t.G2_3=e()}("undefined"!=typeof self?self:this,function(){return function(t){function e(i){if(n[i])return n[i].exports;var r=n[i]={i:i,l:!1,exports:{}};return t[i].call(r.exports,r,r.exports,e),r.l=!0,r.exports}var n={};return e.m=t,e.c=n,e.d=function(t,n,i){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:i})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=389)}([function(t,e,n){var i=n(127),r=n(16),a=i.mix({},i,{assign:i.mix,merge:i.deepMix,cloneDeep:i.clone,isFinite:isFinite,isNaN:isNaN,snapEqual:i.isNumberEqual,remove:i.pull,inArray:i.contains,toAllPadding:function(t){var e=0,n=0,i=0,r=0;return a.isNumber(t)||a.isString(t)?e=n=i=r=t:a.isArray(t)?(e=t[0],i=a.isNil(t[1])?t[0]:t[1],r=a.isNil(t[2])?t[0]:t[2],n=a.isNil(t[3])?i:t[3]):a.isObject(t)&&(e=t.top||0,i=t.right||0,r=t.bottom||0,n=t.left||0),[e,i,r,n]},getClipByRange:function(t){var e=t.tl,n=t.br;return new r.Rect({attrs:{x:e.x,y:e.y,width:n.x-e.x,height:n.y-e.y}})}});a.Array={groupToMap:i.groupToMap,group:i.group,merge:i.merge,values:i.valuesOfKey,getRange:i.getRange,firstValue:i.firstValue,remove:i.pull},t.exports=a},function(t,e,n){var i=n(81),r={};i.merge(r,i,{mixin:function(t,e){var n=t.CFG?"CFG":"ATTRS";if(t&&e){t._mixins=e,t[n]=t[n]||{};var i={};r.each(e,function(e){r.augment(t,e);var a=e[n];a&&r.merge(i,a)}),t[n]=r.merge(i,t[n])}}}),t.exports=r},function(t,e,n){var i=n(24),r=n(4);t.exports=function(t,e){if(t)if(r(t))for(var n=0,a=t.length;n<a&&!1!==e(t[n],n);n++);else if(i(t))for(var o in t)if(t.hasOwnProperty(o)&&!1===e(t[o],o))break}},function(t,e,n){var i=n(25),r=n(127),a=r.mix({assign:r.mix,isFinite:isFinite,isNaN:isNaN,Group:i.Group,Event:i.Event},r);t.exports=a},function(t,e,n){var i=n(12),r=Array.isArray?Array.isArray:function(t){return i(t,"Array")};t.exports=r},function(t,e){t.exports=function(t){return null===t||void 0===t}},function(t,e,n){var i=n(1),r=n(189),a=n(102),o=n(54),s=function t(e){t.superclass.constructor.call(this,e)};s.ATTRS={},i.extend(s,a);var l={matrix:"matrix",path:"path",points:"points",lineDash:"lineDash"};i.augment(s,r,{isShape:!0,drawInner:function(t){var e=this._attrs;this.createPath(t);var n=t.globalAlpha;if(this.hasFill()){var r=e.fillOpacity;i.isNil(r)||1===r?t.fill():(t.globalAlpha=r,t.fill(),t.globalAlpha=n)}if(this.hasStroke()){if(this._attrs.lineWidth>0){var a=e.strokeOpacity;i.isNil(a)||1===a||(t.globalAlpha=a),t.stroke()}}this.afterPath(t)},afterPath:function(){},isHitBox:function(){return!0},isHit:function(t,e){var n=[t,e,1];if(this.invert(n),this.isHitBox()){var i=this.getBBox();if(i&&!o.box(i.minX,i.maxX,i.minY,i.maxY,n[0],n[1]))return!1}var r=this._attrs.clip;return r?(r.invert(n,this.get("canvas")),!!r.isPointInPath(n[0],n[1])&&this.isPointInPath(n[0],n[1])):this.isPointInPath(n[0],n[1])},calculateBox:function(){return null},getHitLineWidth:function(){var t=this._attrs,e=t.lineAppendWidth||0;return(t.lineWidth||0)+e},clearTotalMatrix:function(){this._cfg.totalMatrix=null,this._cfg.region=null},clearBBox:function(){this._cfg.box=null,this._cfg.region=null},getBBox:function(){var t=this._cfg.box;return t||((t=this.calculateBox())&&(t.x=t.minX,t.y=t.minY,t.width=t.maxX-t.minX,t.height=t.maxY-t.minY),this._cfg.box=t),t},clone:function(){var t=null,e=this._attrs,n={};return i.each(e,function(t,r){l[r]&&i.isArray(e[r])?n[r]=function(t){for(var e=[],n=0;n<t.length;n++)i.isArray(t[n])?e.push([].concat(t[n])):e.push(t[n]);return e}(e[r]):n[r]=e[r]}),t=new this.constructor({attrs:n}),t._cfg.zIndex=this._cfg.zIndex,t}}),t.exports=s},function(t,e,n){var i=n(0),r=n(151),a={version:"3.4.10",renderer:"canvas",trackingInfo:{},animate:!0,widthRatio:{column:.5,rose:.9999999,multiplePie:1/1.3},showSinglePoint:!1,connectNulls:!1,scales:{},registerTheme:function(t,e){r[t]=e},setTheme:function(t){var e={};e=i.isObject(t)?t:-1!==i.indexOf(Object.keys(r),t)?r[t]:r.default,i.deepMix(a,e)}};a.setTheme("default"),t.exports=a},function(t,e){function n(t,e){for(var n in e)e.hasOwnProperty(n)&&"constructor"!==n&&void 0!==e[n]&&(t[n]=e[n])}t.exports=function(t,e,i,r){return e&&n(t,e),i&&n(t,i),r&&n(t,r),t}},function(t,e,n){var i=n(12);t.exports=function(t){return i(t,"Number")}},function(t,e,n){var i=n(12);t.exports=function(t){return i(t,"String")}},function(t,e,n){var i=n(12);t.exports=function(t){return i(t,"Function")}},function(t,e){var n={}.toString;t.exports=function(t,e){return n.call(t)==="[object "+e+"]"}},function(t,e){t.exports=function(t){return null!==t&&"function"!=typeof t&&isFinite(t.length)}},function(t,e){t.exports={FONT_FAMILY:'"-apple-system", BlinkMacSystemFont, "Segoe UI", Roboto,"Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei",SimSun, "sans-serif"'}},function(t,e,n){var i=n(3),r=n(156),a=["min","max","median","start","end"],o=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{xScales:null,yScales:null,el:null})},n.render=function(){},n.clear=function(){var t=this.get("el");t&&t.remove()},n.changeVisible=function(t){this.set("visible",t);var e=this.get("el");e&&(e.set?e.set("visible",t):e.style.display=t?"":"none")},n.parsePoint=function(t,e){var n=this.get("xScales"),a=this.get("yScales");i.isFunction(e)&&(e=e(n,a));var o,s;if(i.isArray(e)&&i.isString(e[0])&&-1!==e[0].indexOf("%"))return this._parsePercentPoint(t,e);if(i.isArray(e))o=this._getNormalizedValue(e[0],r.getFirstScale(n)),s=this._getNormalizedValue(e[1],r.getFirstScale(a));else for(var l in e){var u=e[l];n[l]&&(o=this._getNormalizedValue(u,n[l])),a[l]&&(s=this._getNormalizedValue(u,a[l],"y"))}return i.isNil(o)||i.isNil(s)?void 0:t.convert({x:o,y:s})},n._getNormalizedValue=function(t,e){var n;if(-1!==i.indexOf(a,t)){var r;"start"===t?n=0:"end"===t?n=1:"median"===t?(r=e.isCategory?(e.values.length-1)/2:(e.min+e.max)/2,n=e.scale(r)):(r=e.isCategory?"min"===t?0:e.values.length-1:e[t],n=e.scale(r))}else n=e.scale(t);return n},n._parsePercentPoint=function(t,e){var n=parseFloat(e[0])/100,i=parseFloat(e[1])/100,r=t.start,a=t.end,o={x:Math.min(r.x,a.x),y:Math.min(r.y,a.y)};return{x:t.width*n+o.x,y:t.height*i+o.y}},e}(n(32));t.exports=o},function(t,e,n){var i=n(25);t.exports=i},function(t,e,n){var i=n(8),r=n(2),a=n(24),o=n(5),s=function(){function t(t){this._initDefaultCfg(),i(this,t),this.init()}var e=t.prototype;return e._initDefaultCfg=function(){this.type="base",this.formatter=null,this.range=[0,1],this.ticks=null,this.values=[]},e.init=function(){},e.getTicks=function(){var t=this,e=t.ticks,n=[];return r(e,function(e){var i;i=a(e)?e:{text:t.getText(e),tickValue:e,value:t.scale(e)},n.push(i)}),n},e.getText=function(t,e){var n=this.formatter;return t=n?n(t,e):t,!o(t)&&t.toString||(t=""),t.toString()},e.rangeMin=function(){return this.range[0]},e.rangeMax=function(){var t=this.range;return t[t.length-1]},e.invert=function(t){return t},e.translate=function(t){return t},e.scale=function(t){return t},e.clone=function(){var t=this,e=t.constructor,n={};return r(t,function(e,i){n[i]=t[i]}),new e(n)},e.change=function(t){return this.ticks=null,i(this,t),this.init(),this},t}();t.exports=s},function(t,e,n){var i=n(0),r=n(22),a=i.PathUtil,o={},s={_coord:null,draw:function(t,e){return this.drawShape?this.drawShape(t,e):null},setCoord:function(t){this._coord=t},parsePath:function(t,e){var n=this._coord;return t=a.parsePathString(t),t=n.isPolar&&!1!==e?r.convertPolarPath(n,t):r.convertNormalPath(n,t)},parsePoint:function(t){return this._coord.convertPoint(t)},parsePoints:function(t){var e=this._coord,n=[];return i.each(t,function(t){n.push(e.convertPoint(t))}),n}},l={defaultShapeType:null,setCoord:function(t){this._coord=t},getShape:function(t){i.isArray(t)&&(t=t[0]);var e=this[t]||this[this.defaultShapeType];return e._coord=this._coord,e},getShapePoints:function(t,e){var n=this.getShape(t);return(n.getPoints||n.getShapePoints||this.getDefaultPoints)(e)},getDefaultPoints:function(){return[]},getMarkerCfg:function(t,e){var n=this.getShape(t);if(!n.getMarkerCfg){var i=this.defaultShapeType;n=this.getShape(i)}return n.getMarkerCfg(e)},getSelectedCfg:function(){return{}},drawShape:function(t,e,n){var i=this.getShape(t).draw(e,n);return i&&(i.setSilent("origin",e.origin),i._id=e.yIndex?e._id+e.yIndex:e._id,i.name=this.name),i}};o.registerFactory=function(t,e){var n=i.upperFirst(t),r=i.assign({},l,e);return o[n]=r,r.name=t,r},o.registerShape=function(t,e,n){var r=i.upperFirst(t),a=o[r],l=i.assign({},s,n);return a[e]=l,l},o.getShapeFactory=function(t){t=t||"point";return this[i.upperFirst(t)]},t.exports=o},function(t,e,n){"use strict";var i=n(60);n.d(e,"a",function(){return i.e}),n.d(e,"f",function(){return i.g}),n.d(e,"d",function(){return i.f});var r=n(203);n.d(e,"e",function(){return r.a}),n.d(e,"c",function(){return r.b});var a=n(204);n.d(e,"b",function(){return a.a})},function(t,e,n){function i(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}function r(t){return(l.isString(t)||l.isPlainObject(t))&&(t=[t]),l.each(t,function(e,n){l.isObject(e)||(t[n]={type:e})}),t}var a=n(73),o=n(297),s=n(148),l=n(0),u=n(7),c=n(305),h=n(18),f=n(337),p=n(338),g=n(339),d=n(340),v=["color","shape","size"],y=function(t){function e(e){var n;return n=t.call(this,e)||this,n.viewTheme=n.get("viewTheme"),l.assign(i(i(n)),f,p,g),n.get("container")&&n._initContainer(),n._initOptions(),n}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){return{_id:null,type:"base",coord:null,attrs:{},view:null,data:[],scales:{},container:null,labelContainer:null,shapeContainer:null,attrOptions:{},styleOptions:null,selectedOptions:null,activedOptions:null,hasDefaultAdjust:!1,adjusts:null,shapeType:null,generatePoints:!1,sortable:!1,labelCfg:null,shareTooltip:!0,tooltipCfg:null,animate:!0,animateCfg:null,visible:!0}},n._initOptions=function(){var t=this.get("adjusts");t&&(t=r(t),this.set("adjusts",t))},n._createScale=function(t,e){var n=this.get("scales"),i=n[t];return i||(i=this.get("view").createScale(t,e),n[t]=i),i},n._setAttrOptions=function(t,e){this.get("attrOptions")[t]=e},n._createAttrOption=function(t,e,n,i){var r={};r.field=e,n?l.isFunction(n)?r.callback=n:r.values=n:"color"!==t&&(r.values=i),this._setAttrOptions(t,r)},n.position=function(t){return this._setAttrOptions("position",{field:t}),this},n.color=function(t,e){var n=this.viewTheme||u;return this._createAttrOption("color",t,e,n.colors),this},n.size=function(t,e){var n=this.viewTheme||u;return this._createAttrOption("size",t,e,n.sizes),this},n.shape=function(t,e){var n=this.viewTheme||u,i=this.get("type"),r=n.shapes[i]||[];return this._createAttrOption("shape",t,e,r),this},n.opacity=function(t,e){var n=this.viewTheme||u;return this._createAttrOption("opacity",t,e,n.opacities),this},n.style=function(t,e){var n=this.get("styleOptions");n||(n={},this.set("styleOptions",n)),l.isObject(t)&&(e=t,t=null);var i;return t&&(i=d(t)),n.fields=i,n.style=e,this},n.label=function(t,e,n){var i=this.get("labelCfg");i||(i={},this.set("labelCfg",i));var r;return t&&(r=d(t)),i.fields=r,l.isFunction(e)?(n||(n={}),i.callback=e):l.isObject(e)&&(n=e),i.globalCfg=n,this},n.tooltip=function(t,e){var n=this.get("tooltipCfg");if(n||(n={}),!1===t)this.set("tooltipCfg",!1);else{var i;t&&(i=d(t)),n.fields=i,n.cfg=e}return this.set("tooltipCfg",n),this},n.animate=function(t){return this.set("animateCfg",t),this},n.active=function(t,e){return!1===t?this.set("allowActive",!1):l.isObject(t)?(this.set("allowActive",!0),this.set("activedOptions",t)):(this.set("allowActive",!0),this.set("activedOptions",e)),this},n.adjust=function(t){return this.get("hasDefaultAdjust")||(t&&(t=r(t)),this.set("adjusts",t)),this},n.select=function(t,e){return!1===t?this.set("allowSelect",!1):l.isObject(t)?(this.set("allowSelect",!0),this.set("selectedOptions",t)):(this.set("allowSelect",!0),this.set("selectedOptions",e)),this},n.hasAdjust=function(t){var e=this.get("adjusts");if(!t)return!1;var n=!1;return l.each(e,function(e){if(e.type===t)return n=!0,!1}),n},n.hasStack=function(){var t=this.get("isStacked");return l.isNil(t)&&(t=this.hasAdjust("stack"),this.set("isStacked",t)),t},n.isInCircle=function(){var t=this.get("coord");return t&&t.isPolar},n._initContainer=function(){var t=this.get("shapeContainer");if(!t){var e=this.get("container"),n=this.get("view"),i=n&&n.get("_id");t=e.addGroup({viewId:i,visible:this.get("visible")}),this.set("shapeContainer",t)}},n.init=function(){var t=this;if(t._initContainer(),t._initAttrs(),t.get("tooltipCfg")&&t.get("tooltipCfg").fields){var e=t.get("tooltipCfg").fields;l.each(e,function(e){t._createScale(e)})}var n=t._processData();t.get("adjusts")&&t._adjust(n),t.set("dataArray",n)},n._initAttrs=function(){var t=this.get("attrs"),e=this.get("attrOptions"),n=this.get("coord"),i=this.viewTheme||u,r=!1;for(var o in e)if(e.hasOwnProperty(o)){var s=e[o],c=l.upperFirst(o),h=d(s.field);"position"===o&&(s.coord=n,1===h.length&&"theta"===n.type&&(h.unshift("1"),r=!0));for(var f=[],p=0;p<h.length;p++){var g=h[p],v=this._createScale(g);"color"===o&&l.isNil(s.values)&&(v.values.length<=8?s.values=r?i.colors_pie:i.colors:v.values.length<=16?s.values=r?i.colors_pie_16:i.colors_16:s.values=i.colors_24,l.isNil(s.values)&&(s.values=i.colors)),f.push(v)}if("theta"===n.type&&"position"===o&&f.length>1){var y=f[1];y.change({nice:!1,min:0,max:Math.max.apply(null,y.values)})}s.scales=f;var x=new a[c](s);t[o]=x}},n._processData=function(){for(var t=this.get("data"),e=[],n=this._groupData(t),i=0;i<n.length;i++){var r=n[i],a=this._saveOrigin(r);this._numberic(a),e.push(a)}return e},n._groupData=function(t){var e=this._getGroupScales().map(function(t){return t.field});return l.Array.group(t,e)},n._saveOrigin=function(t){for(var e=[],n=0;n<t.length;n++){var i=t[n],r={};for(var a in i)r[a]=i[a];r._origin=i,e.push(r)}return e},n._numberic=function(t){for(var e=this.getAttr("position").scales,n=0;n<t.length;n++)for(var i=t[n],r=0;r<Math.min(2,e.length);r++){var a=e[r];if(a.isCategory){var o=a.field;i[o]=a.translate(i[o])}}},n._getGroupScales=function(){var t=this.get("groupScales");if(!t){t=[];var e=this.get("attrs");l.each(e,function(e){if(-1!==v.indexOf(e.type)){var n=e.scales;l.each(n,function(e){e.isCategory&&-1===l.indexOf(t,e)&&t.push(e)})}}),this.set("groupScales",t)}return t},n._updateStackRange=function(t,e,n){for(var i=l.Array.merge(n),r=e.min,a=e.max,o=0;o<i.length;o++){var s=i[o],u=Math.min.apply(null,s[t]),c=Math.max.apply(null,s[t]);u<r&&(r=u),c>a&&(a=c)}(r<e.min||a>e.max)&&e.change({min:r,max:a})},n._adjust=function(t){var e=this,n=e.get("adjusts"),i=this.viewTheme||u,r=e.getYScale(),a=e.getXScale(),s=a.field,c=r?r.field:null;l.each(n,function(n){var u=l.mix({xField:s,yField:c},n),h=l.upperFirst(n.type);if("Dodge"===h){var f=[];if(a.isCategory||a.isIdentity)f.push("x");else{if(r)throw new Error("dodge is not support linear attribute, please use category attribute!");f.push("y")}u.adjustNames=f,u.dodgeRatio=i.widthRatio.column}else if("Stack"===h){var p=e.get("coord");if(!r){u.height=p.getHeight();var g=e.getDefaultValue("size")||3;u.size=g}!p.isTransposed&&l.isNil(u.reverseOrder)&&(u.reverseOrder=!0)}new o[h](u).processAdjust(t),"Stack"===h&&r&&e._updateStackRange(c,r,t)})},n.setCoord=function(t){this.set("coord",t);var e=this.getAttr("position");this.get("shapeContainer").setMatrix(t.matrix),e&&(e.coord=t)},n.paint=function(){var t=this.get("dataArray"),e=[],n=this.getShapeFactory();n.setCoord(this.get("coord")),this.set("shapeFactory",n);var i=this.get("shapeContainer");this._beforeMapping(t);for(var r=0;r<t.length;r++){var a=t[r],o=r;a=this._mapping(a),e.push(a),this.draw(a,i,n,o)}this.get("labelCfg")&&this._addLabels(l.union.apply(null,e),i.get("children")),this.get("sortable")?this.set("dataArray",e):this._sort(e)},n._sort=function(t){var e=this.getXScale(),n=e.field;l.each(t,function(t){t.sort(function(t,i){return e.translate(t._origin[n])-e.translate(i._origin[n])})}),this.set("dataArray",t)},n._beforeMapping=function(t){var e=this;if(e.get("sortable")){var n=e.getXScale(),i=n.field;l.each(t,function(t){t.sort(function(t,e){return n.translate(t[i])-n.translate(e[i])})})}e.get("generatePoints")&&(l.each(t,function(t){e._generatePoints(t)}),l.each(t,function(e,n){var i=t[n+1];i&&(e[0].nextPoints=i[0].points)}))},n._addLabels=function(t,e){var n=this,i=n.get("type"),r=n.get("viewTheme")||u,a=n.get("coord"),o=c.getLabelsClass(a.type,i),s=n.get("container"),h=l.map(n.get("labelCfg").fields,function(t){return n._createScale(t)}),f=s.addGroup(o,{_id:this.get("_id"),labelCfg:l.mix({scales:h},n.get("labelCfg")),coord:a,geom:n,geomType:i,viewTheme:r,visible:n.get("visible")});f.showLabels(t,e),n.set("labelContainer",f)},n.getShapeFactory=function(){var t=this.get("shapeFactory");if(!t){var e=this.get("shapeType");t=h.getShapeFactory(e),this.set("shapeFactory",t)}return t},n._generatePoints=function(t){for(var e=this.getShapeFactory(),n=this.getAttr("shape"),i=0;i<t.length;i++){var r=t[i],a=this.createShapePointsCfg(r),o=n?this._getAttrValues(n,r):null,s=e.getShapePoints(o,a);r.points=s}},n.createShapePointsCfg=function(t){var e,n=this.getXScale(),i=this.getYScale(),r=this._normalizeValues(t[n.field],n);return e=i?this._normalizeValues(t[i.field],i):t.y?t.y:.1,{x:r,y:e,y0:i?i.scale(this.getYMinValue()):void 0}},n.getYMinValue=function(){var t=this.getYScale(),e=t.min,n=t.max;return e>=0?e:n<=0?n:0},n._normalizeValues=function(t,e){var n=[];if(l.isArray(t))for(var i=0;i<t.length;i++){var r=t[i];n.push(e.scale(r))}else n=e.scale(t);return n},n._mapping=function(t){for(var e=this.get("attrs"),n=[],i=0;i<t.length;i++){var r=t[i],a={};a._origin=r._origin,a.points=r.points,a.nextPoints=r.nextPoints;for(var o in e)if(e.hasOwnProperty(o)){var s=e[o],u=s.names,c=this._getAttrValues(s,r);if(u.length>1)for(var h=0;h<c.length;h++){var f=c[h];a[u[h]]=l.isArray(f)&&1===f.length?f[0]:f}else a[u[0]]=1===c.length?c[0]:c}n.push(a)}return n},n._getAttrValues=function(t,e){for(var n=t.scales,i=[],r=0;r<n.length;r++){var a=n[r],o=a.field;"identity"===a.type?i.push(a.value):i.push(e[o])}return t.mapping.apply(t,i)},n.getAttrValue=function(t,e){var n=this.getAttr(t),i=null;if(n){i=this._getAttrValues(n,e)[0]}return i},n.getDefaultValue=function(t){var e=this.get(t),n=this.getAttr(t);if(n){var i=n.getScale(t);"identity"===i.type&&(e=i.value)}return e},n.draw=function(t,e,n,i){for(var r=0;r<t.length;r++){var a=t[r];this.drawPoint(a,e,n,i+r)}},n.getCallbackCfg=function(t,e,n){if(!t)return e;var i={},r=t.map(function(t){return n[t]});return l.each(e,function(t,e){l.isFunction(t)?i[e]=t.apply(null,r):i[e]=t}),i},n._getShapeId=function(t){var e=this.get("_id"),n=this.get("keyFields");if(n&&n.length>0)l.each(n,function(n){e+="-"+t[n]});else{var i,r=this.get("type"),a=this.getXScale(),o=this.getYScale(),s=a.field||"x",u=o.field||"y",c=t[u];i=a.isIdentity?a.value:t[s],e+="interval"===r||"schema"===r?"-"+i:"line"===r||"area"===r||"path"===r?"-"+r:"-"+i+"-"+c;var h=this._getGroupScales();l.isEmpty(h)||l.each(h,function(n){var i=n.field;"identity"!==n.type&&(e+="-"+t[i])})}return e},n.getDrawCfg=function(t){var e={origin:t,x:t.x,y:t.y,color:t.color,size:t.size,shape:t.shape,isInCircle:this.isInCircle(),opacity:t.opacity},n=this.get("styleOptions");return n&&n.style&&(e.style=this.getCallbackCfg(n.fields,n.style,t._origin)),this.get("generatePoints")&&(e.points=t.points,e.nextPoints=t.nextPoints),this.get("animate")&&(e._id=this._getShapeId(t._origin)),e},n.appendShapeInfo=function(t,e){t&&(t.setSilent("index",e),t.setSilent("coord",this.get("coord")),this.get("animate")&&this.get("animateCfg")&&t.setSilent("animateCfg",this.get("animateCfg")))},n._applyViewThemeShapeStyle=function(t,e,n){var i=this.viewTheme||u,r=n.name;e?e&&(e.indexOf("hollow")>-1||e.indexOf("liquid")>-1)&&(r="hollow"+l.upperFirst(r)):n.defaultShapeType.indexOf("hollow")>-1&&(r="hollow"+l.upperFirst(r));var a=i.shape[r]||{};t.style=l.mix({},a,t.style)},n.drawPoint=function(t,e,n,i){var r=t.shape,a=this.getDrawCfg(t);this._applyViewThemeShapeStyle(a,r,n);var o=n.drawShape(r,a,e);this.appendShapeInfo(o,i)},n.getAttr=function(t){return this.get("attrs")[t]},n.getXScale=function(){return this.getAttr("position").scales[0]},n.getYScale=function(){return this.getAttr("position").scales[1]},n.getShapes=function(){var t=[],e=this.get("shapeContainer").get("children");return l.each(e,function(e){e.get("origin")&&t.push(e)}),t},n.getAttrsForLegend=function(){var t=this.get("attrs"),e=[];return l.each(t,function(t){-1!==v.indexOf(t.type)&&e.push(t)}),e},n.getFieldsForLegend=function(){var t=[],e=this.get("attrOptions");return l.each(v,function(n){var i=e[n];i&&i.field&&l.isString(i.field)&&(t=t.concat(i.field.split("*")))}),l.uniq(t)},n.changeVisible=function(t,e){this.set("visible",t);var n=this.get("shapeContainer");n&&n.set("visible",t);var i=this.get("labelContainer");if(i&&i.set("visible",t),!e&&n){n.get("canvas").draw()}},n.reset=function(){this.set("attrOptions",{}),this.clearInner()},n.clearInner=function(){this.clearActivedShapes(),this.clearSelected();var t=this.get("shapeContainer");t&&t.clear();var e=this.get("labelContainer");e&&e.remove(),this.set("attrs",{}),this.set("groupScales",null),this.set("labelContainer",null),this.set("xDistance",null),this.set("isStacked",null)},n.clear=function(){this.clearInner(),this.set("scales",{})},n.destroy=function(){this.clear();var e=this.get("shapeContainer");e&&e.remove(),this.offEvents(),t.prototype.destroy.call(this)},n.bindEvents=function(){this.get("view")&&(this._bindActiveAction(),this._bindSelectedAction())},n.offEvents=function(){this.get("view")&&(this._offActiveAction(),this._offSelectedAction())},e}(s);t.exports=y},function(t,e,n){t.exports={Axis:n(306),Component:n(66),Guide:n(314),Label:n(323),Legend:n(324),Tooltip:n(330)}},function(t,e,n){function i(t,e){var n=t.getCenter();return Math.sqrt(Math.pow(e.x-n.x,2)+Math.pow(e.y-n.y,2))}function r(t,e){for(var n=t.length,i=[t[0]],r=1;r<n;r+=2){var a=e.convertPoint({x:t[r],y:t[r+1]});i.push(a.x,a.y)}return i}var a=n(0),o=n(334),s={getLinePath:function(t,e){return function(t,e){if(!t.length)return[];for(var n=[],i=0,r=t.length;i<r;i++){var a=t[i];0===i?n.push(["M",a.x,a.y]):n.push(["L",a.x,a.y])}return e&&n.push(["Z"]),n}(t,e)},getSplinePath:function(t,e,n){var i=[],r=t[0],l=null;if(t.length<=2)return s.getLinePath(t,e);a.each(t,function(t){l&&l.x===t.x&&l.y===t.y||(i.push(t.x),i.push(t.y),l=t)}),n=n||[[0,0],[1,1]];var u=o.catmullRom2bezier(i,e,n);return u.unshift(["M",r.x,r.y]),u},getPointRadius:function(t,e){return i(t,e)},getPointAngle:function(t,e){var n=t.getCenter();return Math.atan2(e.y-n.y,e.x-n.x)},convertNormalPath:function(t,e){var n=[];return a.each(e,function(e){switch(e[0].toLowerCase()){case"m":case"l":case"c":n.push(r(e,t));break;case"z":default:n.push(e)}}),n},convertPolarPath:function(t,e){var n,o,s,l,u=[];return a.each(e,function(a,c){switch(a[0].toLowerCase()){case"m":case"c":case"q":u.push(r(a,t));break;case"l":n=e[c-1],o=a,s=t.isTransposed,(l=s?n[n.length-2]===o[1]:n[n.length-1]===o[2])?u=u.concat(function(t,e,n){var r=n.isTransposed,a=n.startAngle,o=n.endAngle,s={x:t[1],y:t[2]},l={x:e[1],y:e[2]},u=[],c=r?"y":"x",h=Math.abs(l[c]-s[c])*(o-a),f=l[c]>=s[c]?1:0,p=h>Math.PI?1:0,g=n.convertPoint(l),d=i(n,g);if(d>=.5)if(h===2*Math.PI){var v={x:(l.x+s.x)/2,y:(l.y+s.y)/2},y=n.convertPoint(v);u.push(["A",d,d,0,p,f,y.x,y.y]),u.push(["A",d,d,0,p,f,g.x,g.y])}else u.push(["A",d,d,0,p,f,g.x,g.y]);return u}(n,o,t)):u.push(r(a,t));break;case"z":default:u.push(a)}}),function(t){a.each(t,function(e,n){if("a"===e[0].toLowerCase()){var i=t[n-1],r=t[n+1];r&&"a"===r[0].toLowerCase()?i&&"l"===i[0].toLowerCase()&&(i[0]="M"):i&&"a"===i[0].toLowerCase()&&r&&"l"===r[0].toLowerCase()&&(r[0]="M")}})}(u),u}};t.exports=s},function(t,e,n){var i=n(5);t.exports=function(t){return i(t)?"":t.toString()}},function(t,e){var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};t.exports=function(t){var e=void 0===t?"undefined":n(t);return null!==t&&"object"===e||"function"===e}},function(t,e,n){t.exports={Canvas:n(181),Group:n(101),Shape:n(6),Arc:n(105),Circle:n(106),Dom:n(107),Ellipse:n(108),Fan:n(109),Image:n(110),Line:n(111),Marker:n(56),Path:n(112),Polygon:n(113),Polyline:n(114),Rect:n(115),Text:n(116),PathSegment:n(39),PathUtil:n(57),Event:n(100),version:"3.3.5"}},function(t,e,n){var i=n(48),r=n(12);t.exports=function(t){if(!i(t)||!r(t,"Object"))return!1;if(null===Object.getPrototypeOf(t))return!0;for(var e=t;null!==Object.getPrototypeOf(e);)e=Object.getPrototypeOf(e);return Object.getPrototypeOf(t)===e}},function(t,e,n){var i=n(1),r=/[MLHVQTCSAZ]([^MLHVQTCSAZ]*)/gi,a=/[^\s\,]+/gi;t.exports={parseRadius:function(t){var e=0,n=0,r=0,a=0;return i.isArray(t)?1===t.length?e=n=r=a=t[0]:2===t.length?(e=r=t[0],n=a=t[1]):3===t.length?(e=t[0],n=a=t[1],r=t[2]):(e=t[0],n=t[1],r=t[2],a=t[3]):e=n=r=a=t,{r1:e,r2:n,r3:r,r4:a}},parsePath:function(t){return t=t||[],i.isArray(t)?t:i.isString(t)?(t=t.match(r),i.each(t,function(e,n){if((e=e.match(a))[0].length>1){var r=e[0].charAt(0);e.splice(1,0,e[0].substr(1)),e[0]=r}i.each(e,function(t,n){isNaN(t)||(e[n]=+t)}),t[n]=e}),t):void 0}}},function(t,e,n){"use strict";function i(t,e){return function(n){return t+n*e}}function r(t,e){var n=e-t;return n?i(t,n):Object(a.a)(isNaN(t)?e:t)}e.c=function(t,e){var n=e-t;return n?i(t,n>180||n<-180?n-360*Math.round(n/360):n):Object(a.a)(isNaN(t)?e:t)},e.b=function(t){return 1==(t=+t)?r:function(e,n){return n-e?function(t,e,n){return t=Math.pow(t,n),e=Math.pow(e,n)-t,n=1/n,function(i){return Math.pow(t+i*e,n)}}(e,n,t):Object(a.a)(isNaN(e)?n:e)}},e.a=r;var a=n(121)},function(t,e,n){function i(t,e){return r(e)?e:t.invert(t.scale(e))}var r=n(10),a=n(4),o=n(5),s=n(8),l=n(2),u=function(){function t(t){var e=this;this.type="base",this.name=null,this.method=null,this.values=[],this.scales=[],this.linear=null;var n=null,i=this.callback;if(t.callback){var r=t.callback;n=function(){for(var t=arguments.length,n=new Array(t),a=0;a<t;a++)n[a]=arguments[a];var s=r.apply(void 0,n);return o(s)&&(s=i.apply(e,n)),s}}s(this,t),n&&s(this,{callback:n})}var e=t.prototype;return e._getAttrValue=function(t,e){var n=this.values;if(t.isCategory&&!this.linear){return n[t.translate(e)%n.length]}var i=t.scale(e);return this.getLinearValue(i)},e.getLinearValue=function(t){var e=this.values,n=e.length-1,i=Math.floor(n*t),r=n*t-i,a=e[i];return a+((i===n?a:e[i+1])-a)*r},e.callback=function(t){var e=this.scales[0];return"identity"===e.type?e.value:this._getAttrValue(e,t)},e.getNames=function(){for(var t=this.scales,e=this.names,n=Math.min(t.length,e.length),i=[],r=0;r<n;r++)i.push(e[r]);return i},e.getFields=function(){var t=this.scales,e=[];return l(t,function(t){e.push(t.field)}),e},e.getScale=function(t){return this.scales[this.names.indexOf(t)]},e.mapping=function(){for(var t=this.scales,e=this.callback,n=arguments.length,i=new Array(n),r=0;r<n;r++)i[r]=arguments[r];var a=i;if(e){for(var o=0,s=i.length;o<s;o++)i[o]=this._toOriginParam(i[o],t[o]);a=e.apply(this,i)}return a=[].concat(a)},e._toOriginParam=function(t,e){var n=t;if(!e.isLinear)if(a(t)){n=[];for(var r=0,o=t.length;r<o;r++)n.push(i(e,t[r]))}else n=i(e,t);return n},t}();t.exports=u},function(t,e,n){var i=n(8),r=function(){function t(t){this._initDefaultCfg(),i(this,t)}var e=t.prototype;return e._initDefaultCfg=function(){this.adjustNames=["x","y"]},e.processAdjust=function(){},t}();t.exports=r},function(t,e,n){var i=n(32),r=n(3),a=n(153),o=n(154),s=n(14).FONT_FAMILY,l=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return r.mix({},e,{_id:null,zIndex:4,ticks:null,line:null,tickLine:null,subTickCount:0,subTickLine:null,grid:null,label:{offset:0,offsetX:0,offsetY:0,textStyle:{},autoRotate:!0,autoHide:!1,formatter:null},labelItems:[],title:{autoRotate:!0,textStyle:{}},autoPaint:!0})},n.beforeRender=function(){var t=this.get("title"),e=this.get("label"),n=this.get("grid");t&&this.set("title",r.deepMix({autoRotate:!0,textStyle:{fontSize:12,fill:"#ccc",textBaseline:"middle",fontFamily:s,textAlign:"center"},offset:48},t)),e&&this.set("label",r.deepMix({autoRotate:!0,autoHide:!0,textStyle:{fontSize:12,fill:"#ccc",textBaseline:"middle",fontFamily:s},offset:10},e)),n&&this.set("grid",r.deepMix({lineStyle:{lineWidth:1,stroke:"#C0D0E0"}},n))},n.render=function(){this.beforeRender();this.get("label")&&this.renderLabels(),this.get("autoPaint")&&this.paint(),r.isNil(this.get("title"))||this.renderTitle(),this.get("group").sort()},n.renderLabels=function(){var t=this.get("group"),e=this.get("label"),n=new o;this.set("labelRenderer",n),n.set("labelCfg",e);r.each(["formatter","htmlTemplate","labelLine","textStyle","useHtml"],function(t){e[t]&&n.set(t,e[t])}),n.set("coord",this.get("coord")),n.set("group",t.addGroup()),n.set("canvas",this.get("canvas"))},n._parseTicks=function(t){for(var e=(t=t||[]).length,n=0;n<e;n++){var i=t[n];r.isObject(i)||(t[n]=this.parseTick(i,n,e))}return this.set("ticks",t),t},n._addTickItem=function(t,e,n,i){void 0===i&&(i="");var r=this.get("tickItems"),a=this.get("subTickItems"),o=this.getTickEnd(e,n,t),s={x1:e.x,y1:e.y,x2:o.x,y2:o.y};r||(r=[]),a||(a=[]),"sub"===i?a.push(s):r.push(s),this.set("tickItems",r),this.set("subTickItems",a)},n._renderLine=function(){var t,e=this.get("line");if(e){t=this.getLinePath(),e=r.mix({path:t},e);var n=this.get("group").addShape("path",{attrs:e});n.name="axis-line",this.get("appendInfo")&&n.setSilent("appendInfo",this.get("appendInfo")),this.set("lineShape",n)}},n._processCatTicks=function(){var t=this.get("label"),e=this.get("tickLine"),n=this.get("ticks");n=this._parseTicks(n);for(var i=this._getNormalizedTicks(n),r=0;r<i.length;r+=3){var a=this.getTickPoint(i[r]),o=this.getTickPoint(i[r+1]),s=this.getTickPoint(i[r+2]),l=Math.floor(r/3),u=n[l];e&&(0===l&&this._addTickItem(l,o,e.length),this._addTickItem(l,s,e.length)),t&&this.addLabel(u,a,l)}},n._getNormalizedTicks=function(t){var e=0;t.length>1&&(e=(t[1].value-t[0].value)/2);for(var n=[],i=0;i<t.length;i++){var a=t[i],o=a.value,s=a.value-e,l=a.value+e;n.push(o,s,l)}var u=r.arrayUtil.getRange(n);return n.map(function(t){return(t-u.min)/(u.max-u.min)})},n.addLabel=function(t,e,n){var i=this.get("labelItems"),a=this.get("labelRenderer"),o=r.deepMix({},this.get("label"));if(a){var s=this.get("_labelOffset");r.isNil(this.get("label").offset)||(s=this.get("label").offset);var l=this.getSideVector(s,e,n);e={x:e.x+l[0]+o.offsetX,y:e.y+l[1]+o.offsetY},o.text=t.text,o.x=e.x,o.y=e.y,o.point=e,o.textAlign=this.getTextAnchor(l),e.rotate&&(o.rotate=e.rotate),i.push(o)}},n._processTicks=function(){var t=this,e=t.get("label"),n=t.get("subTickCount"),i=t.get("tickLine"),a=t.get("ticks");if(a=t._parseTicks(a),r.each(a,function(n,r){var a=t.getTickPoint(n.value,r);i&&t._addTickItem(r,a,i.length),e&&t.addLabel(n,a,r)}),n){var o=t.get("subTickLine");r.each(a,function(e,r){if(r>0){var s=e.value-a[r-1].value;s/=t.get("subTickCount")+1;for(var l=1;l<=n;l++){var u={text:"",value:r?a[r-1].value+l*s:l*s},c=t.getTickPoint(u.value),h=void 0;h=o&&o.length?o.length:parseInt(.6*i.length,10),t._addTickItem(l-1,c,h,"sub")}}})}},n._addTickLine=function(t,e){var n=r.mix({},e),i=[];r.each(t,function(t){i.push(["M",t.x1,t.y1]),i.push(["L",t.x2,t.y2])}),delete n.length,n.path=i;var a=this.get("group").addShape("path",{attrs:n});a.name="axis-ticks",a._id=this.get("_id")+"-ticks",a.set("coord",this.get("coord")),this.get("appendInfo")&&a.setSilent("appendInfo",this.get("appendInfo"))},n._renderTicks=function(){var t=this.get("tickItems"),e=this.get("subTickItems");if(!r.isEmpty(t)){var n=this.get("tickLine");this._addTickLine(t,n)}if(!r.isEmpty(e)){var i=this.get("subTickLine")||this.get("tickLine");this._addTickLine(e,i)}},n._renderGrid=function(){var t=this.get("grid");if(t){t.coord=this.get("coord"),t.appendInfo=this.get("appendInfo");var e=this.get("group");this.set("gridGroup",e.addGroup(a,t))}},n._renderLabels=function(){var t=this.get("labelRenderer"),e=this.get("labelItems");t&&(t.set("items",e),t._dryDraw())},n.paint=function(){var t=this.get("tickLine"),e=!0;t&&t.hasOwnProperty("alignWithLabel")&&(e=t.alignWithLabel),this._renderLine();var n=this.get("type");("cat"===n||"timeCat"===n)&&!1===e?this._processCatTicks():this._processTicks(),this._renderTicks(),this._renderGrid(),this._renderLabels();var i=this.get("label");i&&i.autoRotate&&this.autoRotateLabels(),i&&i.autoHide&&this.autoHideLabels()},n.parseTick=function(t,e,n){return{text:t,value:e/(n-1)}},n.getTextAnchor=function(t){return Math.abs(t[1]/t[0])>=1?"center":t[0]>0?"start":"end"},n.getMaxLabelWidth=function(t){var e=t.getLabels(),n=0;return r.each(e,function(t){var e=t.getBBox().width;n<e&&(n=e)}),n},n.getMaxLabelHeight=function(t){var e=t.getLabels(),n=0;return r.each(e,function(t){var e=t.getBBox().height;n<e&&(n=e)}),n},n.destroy=function(){if(!this.destroyed){t.prototype.destroy.call(this);var e=this.get("gridGroup");e&&e.remove();var n=this.get("labelRenderer");n&&n.destroy();this.get("group").destroy(),this.destroyed=!0}},n.clear=function(){var t=this.get("group");if(!t.get("destroyed")&&t.get("children").length){var e=this.get("gridGroup");e&&e.clear();var n=this.get("labelRenderer");n&&n.clear();this.get("group").clear()}},n.autoRotateLabels=function(){},n.autoHideLabels=function(){},n.renderTitle=function(){},n.getLinePath=function(){},n.getTickPoint=function(){},n.getTickEnd=function(){},n.getSideVector=function(){},e}(i);t.exports=l},function(t,e,n){var i=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){return{_id:null,canvas:null,container:null,group:null,capture:!1,coord:null,offset:[0,0],plotRange:null,position:[0,0],visible:!0,zIndex:1}},n._init=function(){},n.clear=function(){},n.destroy=function(){},n.beforeRender=function(){},n.render=function(){},n.afterRender=function(){},n.beforeDraw=function(){},n.draw=function(){},n.afterDraw=function(){},n.show=function(){},n.hide=function(){},n.setOffset=function(){},n.setPosition=function(){},n.setVisible=function(){},n.setZIndex=function(){},e}(n(66));t.exports=i},function(t,e,n){var i=n(5),r=n(2),a=n(17),o=n(174),s=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n._initDefaultCfg=function(){t.prototype._initDefaultCfg.call(this);this.type="linear",this.isLinear=!0,this.nice=!1,this.min=null,this.minLimit=null,this.max=null,this.maxLimit=null,this.tickCount=null,this.tickInterval=null,this.minTickInterval=null,this.snapArray=null},n.init=function(){if(this.ticks){var t=this.ticks,e=this.translate(t[0]),n=this.translate(t[t.length-1]);(i(this.min)||this.min>e)&&(this.min=e),(i(this.max)||this.max<n)&&(this.max=n)}else this.min=this.translate(this.min),this.max=this.translate(this.max),this.initTicks()},n.calculateTicks=function(){var t=this.min,e=this.max,n=this.minLimit,i=this.maxLimit,r=this.tickCount,a=this.tickInterval,s=this.minTickInterval,l=this.snapArray;if(1===r)throw new Error("linear scale'tickCount should not be 1");if(e<t)throw new Error("max: "+e+" should not be less than min: "+t);return o({min:t,max:e,minLimit:n,maxLimit:i,minCount:r,maxCount:r,interval:a,minTickInterval:s,snapArray:l}).ticks},n.initTicks=function(){var t=this,e=t.calculateTicks();if(t.nice)t.ticks=e,t.min=e[0],t.max=e[e.length-1];else{var n=[];r(e,function(e){e>=t.min&&e<=t.max&&n.push(e)}),n.length||(n.push(t.min),n.push(t.max)),t.ticks=n}},n.scale=function(t){if(i(t))return NaN;var e=this.max,n=this.min;if(e===n)return 0;var r=(t-n)/(e-n),a=this.rangeMin();return a+r*(this.rangeMax()-a)},n.invert=function(t){var e=(t-this.rangeMin())/(this.rangeMax()-this.rangeMin());return this.min+e*(this.max-this.min)},e}(a);a.Linear=s,t.exports=s},function(t,e,n){var i=n(13);t.exports=function(t){return i(t)?Array.prototype.slice.call(t):[]}},function(t,e){t.exports=function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1e-5;return Math.abs(t-e)<n}},function(t,e,n){var i=n(1).vec2;t.exports={at:function(t,e,n){return(e-t)*n+t},pointDistance:function(t,e,n,r,a,o){var s=[n-t,r-e];if(i.exactEquals(s,[0,0]))return NaN;var l=[-s[1],s[0]];i.normalize(l,l);var u=[a-t,o-e];return Math.abs(i.dot(u,l))},box:function(t,e,n,i,r){var a=r/2,o=Math.min(t,n),s=Math.max(t,n);return{minX:o-a,minY:Math.min(e,i)-a,maxX:s+a,maxY:Math.max(e,i)+a}},len:function(t,e,n,i){return Math.sqrt((n-t)*(n-t)+(i-e)*(i-e))}}},function(t,e,n){function i(t,e,n,i){return{x:Math.cos(i)*n+t,y:Math.sin(i)*n+e}}function r(t,e,n,i){var r,a;return i?t<e?(r=e-t,a=2*Math.PI-n+t):t>n&&(r=2*Math.PI-t+e,a=t-n):(r=t-e,a=n-t),r>a?n:e}function a(t,e,n,i){var a=0;return n-e>=2*Math.PI&&(a=2*Math.PI),e=s.mod(e,2*Math.PI),n=s.mod(n,2*Math.PI)+a,t=s.mod(t,2*Math.PI),i?e>=n?t>n&&t<e?t:r(t,n,e,!0):t<e||t>n?t:r(t,e,n):e<=n?e<t&&t<n?t:r(t,e,n,!0):t>e||t<n?t:r(t,n,e)}function o(t,e,n,i,r,o,l,u,c){var h=[l,u],f=[t,e],p=s.vec2.subtract([],h,f),g=s.vec2.angleTo([1,0],p);g=a(g,i,r,o);var d=[n*Math.cos(g)+t,n*Math.sin(g)+e];c&&(c.x=d[0],c.y=d[1]);return s.vec2.distance(d,h)}var s=n(1);t.exports={nearAngle:a,projectPoint:function(t,e,n,i,r,a,s,l){var u={};return o(t,e,n,i,r,a,s,l,u),u},pointDistance:o,box:function(t,e,n,r,o,l){var u=Math.PI/2,c=Math.PI,h=3*Math.PI/2,f=[],p=a(0,r,o,l);0===p&&f.push(i(t,e,n,0)),(p=a(u,r,o,l))===u&&f.push(i(t,e,n,u)),(p=a(c,r,o,l))===c&&f.push(i(t,e,n,c)),(p=a(h,r,o,l))===h&&f.push(i(t,e,n,h)),f.push(i(t,e,n,r)),f.push(i(t,e,n,o));var g=1/0,d=-1/0,v=1/0,y=-1/0;return s.each(f,function(t){g>t.x&&(g=t.x),d<t.x&&(d=t.x),v>t.y&&(v=t.y),y<t.y&&(y=t.y)}),{minX:g,minY:v,maxX:d,maxY:y}}}},function(t,e,n){function i(t,e,n,i,r,a,o){var p,g,d,v,y,x,m;if(!e.fill){var _=e.arrowLength||h,b=e.arrowAngle?e.arrowAngle*s/180:f;m=c(i-a,n-r),y=Math.abs(e.lineWidth*u(m))/2,x=Math.abs(e.lineWidth*l(m))/2,o&&(y=-y,x=-x),p=r+_*u(m+b/2),g=a+_*l(m+b/2),d=r+_*u(m-b/2),v=a+_*l(m-b/2),t.beginPath(),t.moveTo(p-y,g-x),t.lineTo(r-y,a-x),t.lineTo(d-y,v-x),t.moveTo(r-y,a-x),t.lineTo(r+y,a+x),t.moveTo(r,a),t.stroke()}}function r(t,e,n,i,r,s,l){var u=l?e.startArrow:e.endArrow,c=u.d,h=0,f=r-n,p=s-i,g=Math.atan(f/p);0===p&&f<0?h=Math.PI:f>0&&p>0?h=Math.PI/2-g:f<0&&p<0?h=-Math.PI/2-g:f>=0&&p<0?h=-g-Math.PI/2:f<=0&&p>0&&(h=Math.PI/2-g);var d=function(t){var e,n=[],i=a.parsePath(t.path);if(!Array.isArray(i)||0===i.length||"M"!==i[0][0]&&"m"!==i[0][0])return!1;for(var r=i.length,s=0;s<i.length;s++){var l=i[s];e=new o(l,e,s===r-1),n.push(e)}return n}(u);if(d){c&&(l?(r+=Math.sin(Math.abs(g))*c,s=s+Math.cos(Math.abs(g))*c-.5*t.lineWidth):(r-=Math.sin(Math.abs(g))*c,s=s-Math.cos(Math.abs(g))*c+.5*t.lineWidth)),t.save(),t.beginPath(),t.translate(r,s),t.rotate(h);for(var v=0;v<d.length;v++)d[v].draw(t);t.setTransform(1,0,0,1,0,0),t.fillStyle=t.strokeStyle,t.fill(),t.restore()}}var a=n(27),o=n(39),s=Math.PI,l=Math.sin,u=Math.cos,c=Math.atan2,h=10,f=s/3;t.exports={addStartArrow:function(t,e,n,a,o,s){"object"==typeof e.startArrow?r(t,e,n,a,o,s,!0):e.startArrow&&i(t,e,n,a,o,s,!0)},addEndArrow:function(t,e,n,a,o,s){"object"==typeof e.endArrow?r(t,e,n,a,o,s,!1):e.endArrow&&i(t,e,n,a,o,s,!1)}}},function(t,e,n){function i(t,e,n){return{x:n.x+t,y:n.y+e}}function r(t,e){return{x:e.x+(e.x-t.x),y:e.y+(e.y-t.y)}}function a(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])}function o(t,e){return(t[0]*e[0]+t[1]*e[1])/(a(t)*a(e))}function s(t,e){return(t[0]*e[1]<t[1]*e[0]?-1:1)*Math.acos(o(t,e))}var l=n(1),u=n(54),c=n(55),h=n(103),f=n(104),p=l.vec3,g=l.mat3,d=["m","l","c","a","q","h","v","t","s","z"],v=function(t,e,n){this.preSegment=e,this.isLast=n,this.init(t,e)};l.augment(v,{init:function(t,e){var n=t[0];e=e||{endPoint:{x:0,y:0}};var a,u,c,h,f=d.indexOf(n)>=0,p=f?n.toUpperCase():n,g=t,v=e.endPoint,y=g[1],x=g[2];switch(p){default:break;case"M":h=f?i(y,x,v):{x:y,y:x},this.command="M",this.params=[v,h],this.subStart=h,this.endPoint=h;break;case"L":h=f?i(y,x,v):{x:y,y:x},this.command="L",this.params=[v,h],this.subStart=e.subStart,this.endPoint=h,this.endTangent=function(){return[h.x-v.x,h.y-v.y]},this.startTangent=function(){return[v.x-h.x,v.y-h.y]};break;case"H":h=f?i(y,0,v):{x:y,y:v.y},this.command="L",this.params=[v,h],this.subStart=e.subStart,this.endPoint=h,this.endTangent=function(){return[h.x-v.x,h.y-v.y]},this.startTangent=function(){return[v.x-h.x,v.y-h.y]};break;case"V":h=f?i(0,y,v):{x:v.x,y:y},this.command="L",this.params=[v,h],this.subStart=e.subStart,this.endPoint=h,this.endTangent=function(){return[h.x-v.x,h.y-v.y]},this.startTangent=function(){return[v.x-h.x,v.y-h.y]};break;case"Q":f?(a=i(y,x,v),u=i(g[3],g[4],v)):(a={x:y,y:x},u={x:g[3],y:g[4]}),this.command="Q",this.params=[v,a,u],this.subStart=e.subStart,this.endPoint=u,this.endTangent=function(){return[u.x-a.x,u.y-a.y]},this.startTangent=function(){return[v.x-a.x,v.y-a.y]};break;case"T":u=f?i(y,x,v):{x:y,y:x},"Q"===e.command?(a=r(e.params[1],v),this.command="Q",this.params=[v,a,u],this.subStart=e.subStart,this.endPoint=u,this.endTangent=function(){return[u.x-a.x,u.y-a.y]},this.startTangent=function(){return[v.x-a.x,v.y-a.y]}):(this.command="TL",this.params=[v,u],this.subStart=e.subStart,this.endPoint=u,this.endTangent=function(){return[u.x-v.x,u.y-v.y]},this.startTangent=function(){return[v.x-u.x,v.y-u.y]});break;case"C":f?(a=i(y,x,v),u=i(g[3],g[4],v),c=i(g[5],g[6],v)):(a={x:y,y:x},u={x:g[3],y:g[4]},c={x:g[5],y:g[6]}),this.command="C",this.params=[v,a,u,c],this.subStart=e.subStart,this.endPoint=c,this.endTangent=function(){return[c.x-u.x,c.y-u.y]},this.startTangent=function(){return[v.x-a.x,v.y-a.y]};break;case"S":f?(u=i(y,x,v),c=i(g[3],g[4],v)):(u={x:y,y:x},c={x:g[3],y:g[4]}),"C"===e.command?(a=r(e.params[2],v),this.command="C",this.params=[v,a,u,c],this.subStart=e.subStart,this.endPoint=c,this.endTangent=function(){return[c.x-u.x,c.y-u.y]},this.startTangent=function(){return[v.x-a.x,v.y-a.y]}):(this.command="SQ",this.params=[v,u,c],this.subStart=e.subStart,this.endPoint=c,this.endTangent=function(){return[c.x-u.x,c.y-u.y]},this.startTangent=function(){return[v.x-u.x,v.y-u.y]});break;case"A":var m=y,_=x,b=g[3],w=g[4],S=g[5];h=f?i(g[6],g[7],v):{x:g[6],y:g[7]},this.command="A";var M=function(t,e,n,i,r,a,u){var c=l.mod(l.toRadian(u),2*Math.PI),h=t.x,f=t.y,p=e.x,g=e.y,d=Math.cos(c)*(h-p)/2+Math.sin(c)*(f-g)/2,v=-1*Math.sin(c)*(h-p)/2+Math.cos(c)*(f-g)/2,y=d*d/(r*r)+v*v/(a*a);y>1&&(r*=Math.sqrt(y),a*=Math.sqrt(y));var x=r*r*(v*v)+a*a*(d*d),m=Math.sqrt((r*r*(a*a)-x)/x);n===i&&(m*=-1),isNaN(m)&&(m=0);var _=m*r*v/a,b=m*-a*d/r,w=(h+p)/2+Math.cos(c)*_-Math.sin(c)*b,S=(f+g)/2+Math.sin(c)*_+Math.cos(c)*b,M=s([1,0],[(d-_)/r,(v-b)/a]),C=[(d-_)/r,(v-b)/a],A=[(-1*d-_)/r,(-1*v-b)/a],k=s(C,A);return o(C,A)<=-1&&(k=Math.PI),o(C,A)>=1&&(k=0),0===i&&k>0&&(k-=2*Math.PI),1===i&&k<0&&(k+=2*Math.PI),[t,w,S,r,a,M,k,c,i]}(v,h,w,S,m,_,b);this.params=M;var C=e.subStart;this.subStart=C,this.endPoint=h;var A=M[5]%(2*Math.PI);l.isNumberEqual(A,2*Math.PI)&&(A=0);var k=M[6]%(2*Math.PI);l.isNumberEqual(k,2*Math.PI)&&(k=0);var P=.001;this.startTangent=function(){0===S&&(P*=-1);var t=M[3]*Math.cos(A-P)+M[1],e=M[4]*Math.sin(A-P)+M[2];return[t-C.x,e-C.y]},this.endTangent=function(){var t=M[6];t-2*Math.PI<1e-4&&(t=0);var e=M[3]*Math.cos(A+t+P)+M[1],n=M[4]*Math.sin(A+t-P)+M[2];return[v.x-e,v.y-n]};break;case"Z":this.command="Z",this.params=[v,e.subStart],this.subStart=e.subStart,this.endPoint=e.subStart}},isInside:function(t,e,n){var i=this.command,r=this.params,a=this.box;if(a&&!u.box(a.minX,a.maxX,a.minY,a.maxY,t,e))return!1;switch(i){default:break;case"M":return!1;case"TL":case"L":case"Z":return u.line(r[0].x,r[0].y,r[1].x,r[1].y,n,t,e);case"SQ":case"Q":return u.quadraticline(r[0].x,r[0].y,r[1].x,r[1].y,r[2].x,r[2].y,n,t,e);case"C":return u.cubicline(r[0].x,r[0].y,r[1].x,r[1].y,r[2].x,r[2].y,r[3].x,r[3].y,n,t,e);case"A":var o=r,s=o[1],l=o[2],c=o[3],h=o[4],f=o[5],d=o[6],v=o[7],y=o[8],x=c>h?c:h,m=c>h?1:c/h,_=c>h?h/c:1;o=[t,e,1];var b=[1,0,0,0,1,0,0,0,1];return g.translate(b,b,[-s,-l]),g.rotate(b,b,-v),g.scale(b,b,[1/m,1/_]),p.transformMat3(o,o,b),u.arcline(0,0,x,f,f+d,1-y,n,o[0],o[1])}return!1},draw:function(t){var e,n,i,r=this.command,a=this.params;switch(r){default:break;case"M":t.moveTo(a[1].x,a[1].y);break;case"TL":case"L":t.lineTo(a[1].x,a[1].y);break;case"SQ":case"Q":e=a[1],n=a[2],t.quadraticCurveTo(e.x,e.y,n.x,n.y);break;case"C":e=a[1],n=a[2],i=a[3],t.bezierCurveTo(e.x,e.y,n.x,n.y,i.x,i.y);break;case"A":var o=a,s=o[1],l=o[2],u=o[3],c=o[4],h=o[5],f=o[6],p=o[7],g=o[8],d=u>c?u:c,v=u>c?1:u/c,y=u>c?c/u:1;t.translate(s,l),t.rotate(p),t.scale(v,y),t.arc(0,0,d,h,h+f,1-g),t.scale(1/v,1/y),t.rotate(-p),t.translate(-s,-l);break;case"Z":t.closePath()}},getBBox:function(t){var e,n,i,r,a=t/2,o=this.params;switch(this.command){default:case"M":case"Z":break;case"TL":case"L":this.box={minX:Math.min(o[0].x,o[1].x)-a,maxX:Math.max(o[0].x,o[1].x)+a,minY:Math.min(o[0].y,o[1].y)-a,maxY:Math.max(o[0].y,o[1].y)+a};break;case"SQ":case"Q":for(i=0,r=(n=h.extrema(o[0].x,o[1].x,o[2].x)).length;i<r;i++)n[i]=h.at(o[0].x,o[1].x,o[2].x,n[i]);for(n.push(o[0].x,o[2].x),i=0,r=(e=h.extrema(o[0].y,o[1].y,o[2].y)).length;i<r;i++)e[i]=h.at(o[0].y,o[1].y,o[2].y,e);e.push(o[0].y,o[2].y),this.box={minX:Math.min.apply(Math,n)-a,maxX:Math.max.apply(Math,n)+a,minY:Math.min.apply(Math,e)-a,maxY:Math.max.apply(Math,e)+a};break;case"C":for(i=0,r=(n=c.extrema(o[0].x,o[1].x,o[2].x,o[3].x)).length;i<r;i++)n[i]=c.at(o[0].x,o[1].x,o[2].x,o[3].x,n[i]);for(i=0,r=(e=c.extrema(o[0].y,o[1].y,o[2].y,o[3].y)).length;i<r;i++)e[i]=c.at(o[0].y,o[1].y,o[2].y,o[3].y,e[i]);n.push(o[0].x,o[3].x),e.push(o[0].y,o[3].y),this.box={minX:Math.min.apply(Math,n)-a,maxX:Math.max.apply(Math,n)+a,minY:Math.min.apply(Math,e)-a,maxY:Math.max.apply(Math,e)+a};break;case"A":var s=o,l=s[1],u=s[2],p=s[3],g=s[4],d=s[5],v=s[6],y=s[7],x=s[8],m=d,_=d+v,b=f.xExtrema(y,p,g),w=1/0,S=-1/0,M=[m,_];for(i=2*-Math.PI;i<=2*Math.PI;i+=Math.PI){var C=b+i;1===x?m<C&&C<_&&M.push(C):_<C&&C<m&&M.push(C)}for(i=0,r=M.length;i<r;i++){var A=f.xAt(y,p,g,l,M[i]);A<w&&(w=A),A>S&&(S=A)}var k=f.yExtrema(y,p,g),P=1/0,T=-1/0,I=[m,_];for(i=2*-Math.PI;i<=2*Math.PI;i+=Math.PI){var O=k+i;1===x?m<O&&O<_&&I.push(O):_<O&&O<m&&I.push(O)}for(i=0,r=I.length;i<r;i++){var L=f.yAt(y,p,g,u,I[i]);L<P&&(P=L),L>T&&(T=L)}this.box={minX:w-a,maxX:S+a,minY:P-a,maxY:T+a}}}}),t.exports=v},function(t,e,n){"use strict";e.a=function(t,e){return t=+t,e-=t,function(n){return t+e*n}}},function(t,e,n){var i=n(13),r=Array.prototype.indexOf;t.exports=function(t,e){return!!i(t)&&r.call(t,e)>-1}},function(t,e){t.exports=function(t){for(var e=[],n=0;n<t.length;n++)e=e.concat(t[n]);return e}},function(t,e,n){t.exports={mat3:n(51),vec2:n(97),vec3:n(98),transform:n(99)}},function(t,e,n){"use strict";function i(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function r(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),t}var a=n(43),o=n(8),s=a.mat3,l=a.vec3,u=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t);var n=this.getDefaultCfg();o(this,n,e),this.init()}return r(t,[{key:"getDefaultCfg",value:function(){return{isTransposed:!1,matrix:[1,0,0,0,1,0,0,0,1]}}}]),r(t,[{key:"init",value:function(){var t=this.start,e=this.end,n={x:(t.x+e.x)/2,y:(t.y+e.y)/2};this.center=n,this.width=Math.abs(e.x-t.x),this.height=Math.abs(e.y-t.y)}},{key:"_swapDim",value:function(t){var e=this[t];if(e){var n=e.start;e.start=e.end,e.end=n}}},{key:"getCenter",value:function(){return this.center}},{key:"getWidth",value:function(){return this.width}},{key:"getHeight",value:function(){return this.height}},{key:"convertDim",value:function(t,e){var n=this[e],i=n.start;return i+t*(n.end-i)}},{key:"invertDim",value:function(t,e){var n=this[e],i=n.start;return(t-i)/(n.end-i)}},{key:"convertPoint",value:function(t){return t}},{key:"invertPoint",value:function(t){return t}},{key:"applyMatrix",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,i=this.matrix,r=[t,e,n];return l.transformMat3(r,r,i),r}},{key:"invertMatrix",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,i=this.matrix,r=s.invert([],i),a=[t,e,n];return l.transformMat3(a,a,r),a}},{key:"convert",value:function(t){var e=this.convertPoint(t),n=e.x,i=e.y,r=this.applyMatrix(n,i,1);return{x:r[0],y:r[1]}}},{key:"invert",value:function(t){var e=this.invertMatrix(t.x,t.y,1);return this.invertPoint({x:e[0],y:e[1]})}},{key:"rotate",value:function(t){var e=this.matrix,n=this.center;return s.translate(e,e,[-n.x,-n.y]),s.rotate(e,e,t),s.translate(e,e,[n.x,n.y]),this}},{key:"reflect",value:function(t){switch(t){case"x":this._swapDim("x");break;case"y":this._swapDim("y");break;default:this._swapDim("y")}return this}},{key:"scale",value:function(t,e){var n=this.matrix,i=this.center;return s.translate(n,n,[-i.x,-i.y]),s.scale(n,n,[t,e]),s.translate(n,n,[i.x,i.y]),this}},{key:"translate",value:function(t,e){var n=this.matrix;return s.translate(n,n,[t,e]),this}},{key:"transpose",value:function(){return this.isTransposed=!this.isTransposed,this}}]),t}();t.exports=u},function(t,e,n){var i=n(0),r={splitPoints:function(t){var e=[],n=t.x,r=t.y;return r=i.isArray(r)?r:[r],i.each(r,function(t,r){var a={x:i.isArray(n)?n[r]:n,y:t};e.push(a)}),e},addFillAttrs:function(t,e){e.color&&(t.fill=e.color),i.isNumber(e.opacity)&&(t.opacity=t.fillOpacity=e.opacity)},addStrokeAttrs:function(t,e){e.color&&(t.stroke=e.color),i.isNumber(e.opacity)&&(t.opacity=t.strokeOpacity=e.opacity)}};t.exports=r},function(t,e,n){var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r=n(4);t.exports=function t(e){if("object"!==(void 0===e?"undefined":i(e))||null===e)return e;var n=void 0;if(r(e)){n=[];for(var a=0,o=e.length;a<o;a++)"object"===i(e[a])&&null!=e[a]?n[a]=t(e[a]):n[a]=e[a]}else{n={};for(var s in e)"object"===i(e[s])&&null!=e[s]?n[s]=t(e[s]):n[s]=e[s]}return n}},function(t,e,n){function i(t,e,n,s){n=n||0,s=s||o;for(var l in e)if(e.hasOwnProperty(l)){var u=e[l];null!==u&&r(u)?(r(t[l])||(t[l]={}),n<s?i(t[l],u,n+1,s):t[l]=e[l]):a(u)?(t[l]=[],t[l]=t[l].concat(u)):void 0!==u&&(t[l]=u)}}var r=n(26),a=n(4),o=5;t.exports=function(){for(var t=new Array(arguments.length),e=t.length,n=0;n<e;n++)t[n]=arguments[n];for(var r=t[0],a=1;a<e;a++)i(r,t[a]);return r}},function(t,e){var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};t.exports=function(t){return"object"===(void 0===t?"undefined":n(t))&&null!==t}},function(t,e,n){var i=n(48),r=n(13),a=n(10);t.exports=function t(e,n){if(e===n)return!0;if(!e||!n)return!1;if(a(e)||a(n))return!1;if(r(e)||r(n)){if(e.length!==n.length)return!1;for(var o=!0,s=0;s<e.length&&(o=t(e[s],n[s]));s++);return o}if(i(e)||i(n)){var l=Object.keys(e),u=Object.keys(n);if(l.length!==u.length)return!1;for(var c=!0,h=0;h<l.length&&(c=t(e[l[h]],n[l[h]]));h++);return c}return!1}},function(t,e){t.exports=function(t,e,n){return t<e?e:t>n?n:t}},function(t,e,n){var i=n(182);i.translate=function(t,e,n){var r=new Array(9);return i.fromTranslation(r,n),i.multiply(t,r,e)},i.rotate=function(t,e,n){var r=new Array(9);return i.fromRotation(r,n),i.multiply(t,r,e)},i.scale=function(t,e,n){var r=new Array(9);return i.fromScaling(r,n),i.multiply(t,r,e)},t.exports=i},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.setMatrixArrayType=function(t){e.ARRAY_TYPE=r=t},e.toRadian=function(t){return t*a},e.equals=function(t,e){return Math.abs(t-e)<=i*Math.max(1,Math.abs(t),Math.abs(e))};var i=e.EPSILON=1e-6,r=e.ARRAY_TYPE="undefined"!=typeof Float32Array?Float32Array:Array,a=(e.RANDOM=Math.random,Math.PI/180)},function(t,e,n){var i;!function(e){"use strict";function r(){}function a(t,e){for(var n=t.length;n--;)if(t[n].listener===e)return n;return-1}function o(t){return function(){return this[t].apply(this,arguments)}}function s(t){return"function"==typeof t||t instanceof RegExp||!(!t||"object"!=typeof t)&&s(t.listener)}var l=r.prototype,u=e.EventEmitter;l.getListeners=function(t){var e,n,i=this._getEvents();if(t instanceof RegExp){e={};for(n in i)i.hasOwnProperty(n)&&t.test(n)&&(e[n]=i[n])}else e=i[t]||(i[t]=[]);return e},l.flattenListeners=function(t){var e,n=[];for(e=0;e<t.length;e+=1)n.push(t[e].listener);return n},l.getListenersAsObject=function(t){var e,n=this.getListeners(t);return n instanceof Array&&((e={})[t]=n),e||n},l.addListener=function(t,e){if(!s(e))throw new TypeError("listener must be a function");var n,i=this.getListenersAsObject(t),r="object"==typeof e;for(n in i)i.hasOwnProperty(n)&&-1===a(i[n],e)&&i[n].push(r?e:{listener:e,once:!1});return this},l.on=o("addListener"),l.addOnceListener=function(t,e){return this.addListener(t,{listener:e,once:!0})},l.once=o("addOnceListener"),l.defineEvent=function(t){return this.getListeners(t),this},l.defineEvents=function(t){for(var e=0;e<t.length;e+=1)this.defineEvent(t[e]);return this},l.removeListener=function(t,e){var n,i,r=this.getListenersAsObject(t);for(i in r)r.hasOwnProperty(i)&&-1!==(n=a(r[i],e))&&r[i].splice(n,1);return this},l.off=o("removeListener"),l.addListeners=function(t,e){return this.manipulateListeners(!1,t,e)},l.removeListeners=function(t,e){return this.manipulateListeners(!0,t,e)},l.manipulateListeners=function(t,e,n){var i,r,a=t?this.removeListener:this.addListener,o=t?this.removeListeners:this.addListeners;if("object"!=typeof e||e instanceof RegExp)for(i=n.length;i--;)a.call(this,e,n[i]);else for(i in e)e.hasOwnProperty(i)&&(r=e[i])&&("function"==typeof r?a.call(this,i,r):o.call(this,i,r));return this},l.removeEvent=function(t){var e,n=typeof t,i=this._getEvents();if("string"===n)delete i[t];else if(t instanceof RegExp)for(e in i)i.hasOwnProperty(e)&&t.test(e)&&delete i[e];else delete this._events;return this},l.removeAllListeners=o("removeEvent"),l.emitEvent=function(t,e){var n,i,r,a,o=this.getListenersAsObject(t);for(a in o)if(o.hasOwnProperty(a))for(n=o[a].slice(0),r=0;r<n.length;r++)!0===(i=n[r]).once&&this.removeListener(t,i.listener),i.listener.apply(this,e||[])===this._getOnceReturnValue()&&this.removeListener(t,i.listener);return this},l.trigger=o("emitEvent"),l.emit=function(t){var e=Array.prototype.slice.call(arguments,1);return this.emitEvent(t,e)},l.setOnceReturnValue=function(t){return this._onceReturnValue=t,this},l._getOnceReturnValue=function(){return!this.hasOwnProperty("_onceReturnValue")||this._onceReturnValue},l._getEvents=function(){return this._events||(this._events={})},r.noConflict=function(){return e.EventEmitter=u,r},void 0!==(i=function(){return r}.call(e,n,e,t))&&(t.exports=i)}(this||{})},function(t,e,n){var i=n(36),r=n(103),a=n(55),o=n(37);t.exports={line:function(t,e,n,r,a,o,s){var l=i.box(t,e,n,r,a);if(!this.box(l.minX,l.maxX,l.minY,l.maxY,o,s))return!1;var u=i.pointDistance(t,e,n,r,o,s);return!isNaN(u)&&u<=a/2},polyline:function(t,e,n,i){var r=t.length-1;if(r<1)return!1;for(var a=0;a<r;a++){var o=t[a][0],s=t[a][1],l=t[a+1][0],u=t[a+1][1];if(this.line(o,s,l,u,e,n,i))return!0}return!1},cubicline:function(t,e,n,i,r,o,s,l,u,c,h){return a.pointDistance(t,e,n,i,r,o,s,l,c,h)<=u/2},quadraticline:function(t,e,n,i,a,o,s,l,u){return r.pointDistance(t,e,n,i,a,o,l,u)<=s/2},arcline:function(t,e,n,i,r,a,s,l,u){return o.pointDistance(t,e,n,i,r,a,l,u)<=s/2},rect:function(t,e,n,i,r,a){return t<=r&&r<=t+n&&e<=a&&a<=e+i},circle:function(t,e,n,i,r){return Math.pow(i-t,2)+Math.pow(r-e,2)<=Math.pow(n,2)},box:function(t,e,n,i,r,a){return t<=r&&r<=e&&n<=a&&a<=i}}},function(t,e,n){function i(t,e,n,i,r){var a=1-r;return a*a*(a*i+3*r*n)+r*r*(r*t+3*a*e)}function r(t,e,n,r,a,o,l,u,c,h,f){var p,g,d,v,y,x,m,_,b=.005,w=1/0,S=[c,h];for(g=0;g<1;g+=.05)d=[i(t,n,a,l,g),i(e,r,o,u,g)],(v=s.squaredDistance(S,d))<w&&(p=g,w=v);w=1/0;for(var M=0;M<32&&!(b<1e-4);M++)_=p+b,d=[i(t,n,a,l,m=p-b),i(e,r,o,u,m)],v=s.squaredDistance(S,d),m>=0&&v<w?(p=m,w=v):(x=[i(t,n,a,l,_),i(e,r,o,u,_)],y=s.squaredDistance(S,x),_<=1&&y<w?(p=_,w=y):b*=.5);return f&&(f.x=i(t,n,a,l,p),f.y=i(e,r,o,u,p)),Math.sqrt(w)}function a(t,e,n,i,r){return t*(t*(-3*e+9*n-9*i+3*r)+6*e-12*n+6*i)-3*e+3*n}var o=n(1),s=o.vec2;t.exports={at:i,derivativeAt:function(t,e,n,i,r){var a=1-r;return 3*(((e-t)*a+2*(n-e)*r)*a+(i-n)*r*r)},projectPoint:function(t,e,n,i,a,o,s,l,u,c){var h={};return r(t,e,n,i,a,o,s,l,u,c,h),h},pointDistance:r,extrema:function(t,e,n,i){var r,a,s,l=3*t-9*e+9*n-3*i,u=6*e-12*n+6*i,c=3*n-3*i,h=[];if(o.isNumberEqual(l,0))o.isNumberEqual(u,0)||(r=-c/u)>=0&&r<=1&&h.push(r);else{var f=u*u-4*l*c;o.isNumberEqual(f,0)?h.push(-u/(2*l)):f>0&&(a=(-u-(s=Math.sqrt(f)))/(2*l),(r=(-u+s)/(2*l))>=0&&r<=1&&h.push(r),a>=0&&a<=1&&h.push(a))}return h},len:function(t,e,n,i,r,s,l,u,c){o.isNil(c)&&(c=1);for(var h=(c=c>1?1:c<0?0:c)/2,f=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],p=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],g=0,d=0;d<12;d++){var v=h*f[d]+h,y=a(v,t,n,r,l),x=a(v,e,i,s,u),m=y*y+x*x;g+=p[d]*Math.sqrt(m)}return h*g}}},function(t,e,n){var i=n(1),r=n(6),a=n(27),o=n(39),s=function t(e){t.superclass.constructor.call(this,e)};s.Symbols={circle:function(t,e,n){return[["M",t,e],["m",-n,0],["a",n,n,0,1,0,2*n,0],["a",n,n,0,1,0,2*-n,0]]},square:function(t,e,n){return[["M",t-n,e-n],["L",t+n,e-n],["L",t+n,e+n],["L",t-n,e+n],["Z"]]},diamond:function(t,e,n){return[["M",t-n,e],["L",t,e-n],["L",t+n,e],["L",t,e+n],["Z"]]},triangle:function(t,e,n){var i=n*Math.sin(1/3*Math.PI);return[["M",t-n,e+i],["L",t,e-i],["L",t+n,e+i],["z"]]},"triangle-down":function(t,e,n){var i=n*Math.sin(1/3*Math.PI);return[["M",t-n,e-i],["L",t+n,e-i],["L",t,e+i],["Z"]]}},s.ATTRS={path:null,lineWidth:1},i.extend(s,r),i.augment(s,{type:"marker",canFill:!0,canStroke:!0,getDefaultAttrs:function(){return{x:0,y:0,lineWidth:1}},calculateBox:function(){var t=this._attrs,e=t.x,n=t.y,i=t.radius,r=this.getHitLineWidth()/2+i;return{minX:e-r,minY:n-r,maxX:e+r,maxY:n+r}},_getPath:function(){var t=this._attrs,e=t.x,n=t.y,r=t.radius||t.r,a=t.symbol||"circle";return(i.isFunction(a)?a:s.Symbols[a])(e,n,r)},createPath:function(t){var e=this._cfg.segments;if(!e||this._cfg.hasUpdate){var n=a.parsePath(this._getPath());t.beginPath();var i;e=[];for(var r=0;r<n.length;r++){var s=n[r];i=new o(s,i,r===n.length-1),e.push(i),i.draw(t)}this._cfg.segments=e,this._cfg.hasUpdate=!1}else{t.beginPath();for(var l=0;l<e.length;l++)e[l].draw(t)}}}),t.exports=s},function(t,e,n){function i(t,e){function n(t,e){if(1===t.length)i.push(t[0]),r.push(t[0]);else{for(var a=[],o=0;o<t.length-1;o++)0===o&&i.push(t[0]),o===t.length-2&&r.push(t[o+1]),a[o]=[(1-e)*t[o][0]+e*t[o+1][0],(1-e)*t[o][1]+e*t[o+1][1]];n(a,e)}}var i=[],r=[];return t.length&&n(t,e),{left:i,right:r.reverse()}}function r(t,e,n){var i=null,r=n;return e<r&&(r=e,i="add"),t<r&&(r=t,i="del"),{type:i,min:r}}function a(t,e,n){for(var i,r=[].concat(t),a=1/(n+1),s=o(e)[0],l=1;l<=n;l++)a*=l,0===(i=Math.floor(t.length*a))?r.unshift([s[0]*a+t[i][0]*(1-a),s[1]*a+t[i][1]*(1-a)]):r.splice(i,0,[s[0]*a+t[i][0]*(1-a),s[1]*a+t[i][1]*(1-a)]);return r}function o(t){var e=[];switch(t[0]){case"M":case"L":e.push([t[1],t[2]]);break;case"A":e.push([t[6],t[7]]);break;case"Q":e.push([t[3],t[4]]),e.push([t[1],t[2]]);break;case"T":e.push([t[1],t[2]]);break;case"C":e.push([t[5],t[6]]),e.push([t[1],t[2]]),e.push([t[3],t[4]]);break;case"S":e.push([t[3],t[4]]),e.push([t[1],t[2]]);break;case"H":case"V":e.push([t[1],t[1]])}return e}var s=n(81),l="\t\n\v\f\r 聽釟�釥庘��鈥佲�傗�冣�勨�呪�嗏�団�堚�夆�娾�仧銆�\u2028\u2029",u=new RegExp("([a-z])["+l+",]*((-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?["+l+"]*,?["+l+"]*)+)","ig"),c=new RegExp("(-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?)["+l+"]*,?["+l+"]*","ig"),h=function(t){if(!t)return null;if(typeof t==typeof[])return t;var e={a:7,c:6,o:2,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,u:3,z:0},n=[];return String(t).replace(u,function(t,i,r){var a=[],o=i.toLowerCase();if(r.replace(c,function(t,e){e&&a.push(+e)}),"m"===o&&a.length>2&&(n.push([i].concat(a.splice(0,2))),o="l",i="m"===i?"l":"L"),"o"===o&&1===a.length&&n.push([i,a[0]]),"r"===o)n.push([i].concat(a));else for(;a.length>=e[o]&&(n.push([i].concat(a.splice(0,e[o]))),e[o]););}),n},f=function(t,e){for(var n=[],i=0,r=t.length;r-2*!e>i;i+=2){var a=[{x:+t[i-2],y:+t[i-1]},{x:+t[i],y:+t[i+1]},{x:+t[i+2],y:+t[i+3]},{x:+t[i+4],y:+t[i+5]}];e?i?r-4===i?a[3]={x:+t[0],y:+t[1]}:r-2===i&&(a[2]={x:+t[0],y:+t[1]},a[3]={x:+t[2],y:+t[3]}):a[0]={x:+t[r-2],y:+t[r-1]}:r-4===i?a[3]=a[2]:i||(a[0]={x:+t[i],y:+t[i+1]}),n.push(["C",(-a[0].x+6*a[1].x+a[2].x)/6,(-a[0].y+6*a[1].y+a[2].y)/6,(a[1].x+6*a[2].x-a[3].x)/6,(a[1].y+6*a[2].y-a[3].y)/6,a[2].x,a[2].y])}return n},p=function(t,e,n,i,r){var a=[];if(null===r&&null===i&&(i=n),t=+t,e=+e,n=+n,i=+i,null!==r){var o=Math.PI/180,s=t+n*Math.cos(-i*o),l=t+n*Math.cos(-r*o);a=[["M",s,e+n*Math.sin(-i*o)],["A",n,n,0,+(r-i>180),0,l,e+n*Math.sin(-r*o)]]}else a=[["M",t,e],["m",0,-i],["a",n,i,0,1,1,0,2*i],["a",n,i,0,1,1,0,-2*i],["z"]];return a},g=function(t){if(!(t=h(t))||!t.length)return[["M",0,0]];var e,n,i=[],r=0,a=0,o=0,s=0,l=0;"M"===t[0][0]&&(o=r=+t[0][1],s=a=+t[0][2],l++,i[0]=["M",r,a]);for(var u,c,g=3===t.length&&"M"===t[0][0]&&"R"===t[1][0].toUpperCase()&&"Z"===t[2][0].toUpperCase(),d=l,v=t.length;d<v;d++){if(i.push(u=[]),c=t[d],(e=c[0])!==e.toUpperCase())switch(u[0]=e.toUpperCase(),u[0]){case"A":u[1]=c[1],u[2]=c[2],u[3]=c[3],u[4]=c[4],u[5]=c[5],u[6]=+c[6]+r,u[7]=+c[7]+a;break;case"V":u[1]=+c[1]+a;break;case"H":u[1]=+c[1]+r;break;case"R":for(var y=2,x=(n=[r,a].concat(c.slice(1))).length;y<x;y++)n[y]=+n[y]+r,n[++y]=+n[y]+a;i.pop(),i=i.concat(f(n,g));break;case"O":i.pop(),(n=p(r,a,c[1],c[2])).push(n[0]),i=i.concat(n);break;case"U":i.pop(),i=i.concat(p(r,a,c[1],c[2],c[3])),u=["U"].concat(i[i.length-1].slice(-2));break;case"M":o=+c[1]+r,s=+c[2]+a;break;default:for(var m=1,_=c.length;m<_;m++)u[m]=+c[m]+(m%2?r:a)}else if("R"===e)n=[r,a].concat(c.slice(1)),i.pop(),i=i.concat(f(n,g)),u=["R"].concat(c.slice(-2));else if("O"===e)i.pop(),(n=p(r,a,c[1],c[2])).push(n[0]),i=i.concat(n);else if("U"===e)i.pop(),i=i.concat(p(r,a,c[1],c[2],c[3])),u=["U"].concat(i[i.length-1].slice(-2));else for(var b=0,w=c.length;b<w;b++)u[b]=c[b];if("O"!==(e=e.toUpperCase()))switch(u[0]){case"Z":r=+o,a=+s;break;case"H":r=u[1];break;case"V":a=u[1];break;case"M":o=u[u.length-2],s=u[u.length-1];break;default:r=u[u.length-2],a=u[u.length-1]}}return i},d=function(t,e,n,i){return[t,e,n,i,n,i]},v=function(t,e,n,i,r,a){return[1/3*t+2/3*n,1/3*e+2/3*i,1/3*r+2/3*n,1/3*a+2/3*i,r,a]},y=function(t,e){var n,i=g(t),r=e&&g(e),a={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},o={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},s=[],l=[],u="",c="",h=function(t,e,n){var i,r;if(!t)return["C",e.x,e.y,e.x,e.y,e.x,e.y];switch(!(t[0]in{T:1,Q:1})&&(e.qx=e.qy=null),t[0]){case"M":e.X=t[1],e.Y=t[2];break;case"A":t=["C"].concat(function t(e,n,i,r,a,o,s,l,u,c){i===r&&(i+=1);var h,f,p,g,d,v=120*Math.PI/180,y=Math.PI/180*(+a||0),x=[],m=function(t,e,n){return{x:t*Math.cos(n)-e*Math.sin(n),y:t*Math.sin(n)+e*Math.cos(n)}};if(c)f=c[0],p=c[1],g=c[2],d=c[3];else{e=(h=m(e,n,-y)).x,n=h.y,l=(h=m(l,u,-y)).x,u=h.y,e===l&&n===u&&(l+=1,u+=1);var _=(e-l)/2,b=(n-u)/2,w=_*_/(i*i)+b*b/(r*r);w>1&&(i*=w=Math.sqrt(w),r*=w);var S=i*i,M=r*r,C=(o===s?-1:1)*Math.sqrt(Math.abs((S*M-S*b*b-M*_*_)/(S*b*b+M*_*_)));g=C*i*b/r+(e+l)/2,d=C*-r*_/i+(n+u)/2,f=Math.asin(((n-d)/r).toFixed(9)),p=Math.asin(((u-d)/r).toFixed(9)),f=e<g?Math.PI-f:f,p=l<g?Math.PI-p:p,f<0&&(f=2*Math.PI+f),p<0&&(p=2*Math.PI+p),s&&f>p&&(f-=2*Math.PI),!s&&p>f&&(p-=2*Math.PI)}var A=p-f;if(Math.abs(A)>v){var k=p,P=l,T=u;p=f+v*(s&&p>f?1:-1),x=t(l=g+i*Math.cos(p),u=d+r*Math.sin(p),i,r,a,0,s,P,T,[p,k,g,d])}A=p-f;var I=Math.cos(f),O=Math.sin(f),L=Math.cos(p),E=Math.sin(p),D=Math.tan(A/4),F=4/3*i*D,B=4/3*r*D,R=[e,n],j=[e+F*O,n-B*I],N=[l+F*E,u-B*L],z=[l,u];if(j[0]=2*R[0]-j[0],j[1]=2*R[1]-j[1],c)return[j,N,z].concat(x);for(var Y=[],V=0,X=(x=[j,N,z].concat(x).join().split(",")).length;V<X;V++)Y[V]=V%2?m(x[V-1],x[V],y).y:m(x[V],x[V+1],y).x;return Y}.apply(0,[e.x,e.y].concat(t.slice(1))));break;case"S":"C"===n||"S"===n?(i=2*e.x-e.bx,r=2*e.y-e.by):(i=e.x,r=e.y),t=["C",i,r].concat(t.slice(1));break;case"T":"Q"===n||"T"===n?(e.qx=2*e.x-e.qx,e.qy=2*e.y-e.qy):(e.qx=e.x,e.qy=e.y),t=["C"].concat(v(e.x,e.y,e.qx,e.qy,t[1],t[2]));break;case"Q":e.qx=t[1],e.qy=t[2],t=["C"].concat(v(e.x,e.y,t[1],t[2],t[3],t[4]));break;case"L":t=["C"].concat(d(e.x,e.y,t[1],t[2]));break;case"H":t=["C"].concat(d(e.x,e.y,t[1],e.y));break;case"V":t=["C"].concat(d(e.x,e.y,e.x,t[1]));break;case"Z":t=["C"].concat(d(e.x,e.y,e.X,e.Y))}return t},f=function(t,e){if(t[e].length>7){t[e].shift();for(var a=t[e];a.length;)s[e]="A",r&&(l[e]="A"),t.splice(e++,0,["C"].concat(a.splice(0,6)));t.splice(e,1),n=Math.max(i.length,r&&r.length||0)}},p=function(t,e,a,o,s){t&&e&&"M"===t[s][0]&&"M"!==e[s][0]&&(e.splice(s,0,["M",o.x,o.y]),a.bx=0,a.by=0,a.x=t[s][1],a.y=t[s][2],n=Math.max(i.length,r&&r.length||0))};n=Math.max(i.length,r&&r.length||0);for(var y=0;y<n;y++){i[y]&&(u=i[y][0]),"C"!==u&&(s[y]=u,y&&(c=s[y-1])),i[y]=h(i[y],a,c),"A"!==s[y]&&"C"===u&&(s[y]="C"),f(i,y),r&&(r[y]&&(u=r[y][0]),"C"!==u&&(l[y]=u,y&&(c=l[y-1])),r[y]=h(r[y],o,c),"A"!==l[y]&&"C"===u&&(l[y]="C"),f(r,y)),p(i,r,a,o,y),p(r,i,o,a,y);var x=i[y],m=r&&r[y],_=x.length,b=r&&m.length;a.x=x[_-2],a.y=x[_-1],a.bx=parseFloat(x[_-4])||a.x,a.by=parseFloat(x[_-3])||a.y,o.bx=r&&(parseFloat(m[b-4])||o.x),o.by=r&&(parseFloat(m[b-3])||o.y),o.x=r&&m[b-2],o.y=r&&m[b-1]}return r?[i,r]:i},x=/,?([a-z]),?/gi,m=function(t){return t.join(",").replace(x,"$1")},_=function(t,e,n,i,r){return t*(t*(-3*e+9*n-9*i+3*r)+6*e-12*n+6*i)-3*e+3*n},b=function(t,e,n,i,r,a,o,s,l){null===l&&(l=1);for(var u=(l=l>1?1:l<0?0:l)/2,c=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],h=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],f=0,p=0;p<12;p++){var g=u*c[p]+u,d=_(g,t,n,r,o),v=_(g,e,i,a,s),y=d*d+v*v;f+=h[p]*Math.sqrt(y)}return u*f},w=function(t,e,n,i,r,a,o,s){if(!(Math.max(t,n)<Math.min(r,o)||Math.min(t,n)>Math.max(r,o)||Math.max(e,i)<Math.min(a,s)||Math.min(e,i)>Math.max(a,s))){var l=(t-n)*(a-s)-(e-i)*(r-o);if(l){var u=((t*i-e*n)*(r-o)-(t-n)*(r*s-a*o))/l,c=((t*i-e*n)*(a-s)-(e-i)*(r*s-a*o))/l,h=+u.toFixed(2),f=+c.toFixed(2);if(!(h<+Math.min(t,n).toFixed(2)||h>+Math.max(t,n).toFixed(2)||h<+Math.min(r,o).toFixed(2)||h>+Math.max(r,o).toFixed(2)||f<+Math.min(e,i).toFixed(2)||f>+Math.max(e,i).toFixed(2)||f<+Math.min(a,s).toFixed(2)||f>+Math.max(a,s).toFixed(2)))return{x:u,y:c}}}},S=function(t,e,n){return e>=t.x&&e<=t.x+t.width&&n>=t.y&&n<=t.y+t.height},M=function(t,e,n,i,r){if(r)return[["M",+t+ +r,e],["l",n-2*r,0],["a",r,r,0,0,1,r,r],["l",0,i-2*r],["a",r,r,0,0,1,-r,r],["l",2*r-n,0],["a",r,r,0,0,1,-r,-r],["l",0,2*r-i],["a",r,r,0,0,1,r,-r],["z"]];var a=[["M",t,e],["l",n,0],["l",0,i],["l",-n,0],["z"]];return a.parsePathArray=m,a},C=function(t,e,n,i){return null===t&&(t=e=n=i=0),null===e&&(e=t.y,n=t.width,i=t.height,t=t.x),{x:t,y:e,width:n,w:n,height:i,h:i,x2:t+n,y2:e+i,cx:t+n/2,cy:e+i/2,r1:Math.min(n,i)/2,r2:Math.max(n,i)/2,r0:Math.sqrt(n*n+i*i)/2,path:M(t,e,n,i),vb:[t,e,n,i].join(" ")}},A=function(t,e,n,i,r,a,o,l){s.isArray(t)||(t=[t,e,n,i,r,a,o,l]);var u=function(t,e,n,i,r,a,o,s){for(var l,u,c,h,f=[],p=[[],[]],g=0;g<2;++g)if(0===g?(u=6*t-12*n+6*r,l=-3*t+9*n-9*r+3*o,c=3*n-3*t):(u=6*e-12*i+6*a,l=-3*e+9*i-9*a+3*s,c=3*i-3*e),Math.abs(l)<1e-12){if(Math.abs(u)<1e-12)continue;(h=-c/u)>0&&h<1&&f.push(h)}else{var d=u*u-4*c*l,v=Math.sqrt(d);if(!(d<0)){var y=(-u+v)/(2*l);y>0&&y<1&&f.push(y);var x=(-u-v)/(2*l);x>0&&x<1&&f.push(x)}}for(var m,_=f.length,b=_;_--;)m=1-(h=f[_]),p[0][_]=m*m*m*t+3*m*m*h*n+3*m*h*h*r+h*h*h*o,p[1][_]=m*m*m*e+3*m*m*h*i+3*m*h*h*a+h*h*h*s;return p[0][b]=t,p[1][b]=e,p[0][b+1]=o,p[1][b+1]=s,p[0].length=p[1].length=b+2,{min:{x:Math.min.apply(0,p[0]),y:Math.min.apply(0,p[1])},max:{x:Math.max.apply(0,p[0]),y:Math.max.apply(0,p[1])}}}.apply(null,t);return C(u.min.x,u.min.y,u.max.x-u.min.x,u.max.y-u.min.y)},k=function(t,e,n,i,r,a,o,s,l){var u=1-l,c=Math.pow(u,3),h=Math.pow(u,2),f=l*l,p=f*l,g=t+2*l*(n-t)+f*(r-2*n+t),d=e+2*l*(i-e)+f*(a-2*i+e),v=n+2*l*(r-n)+f*(o-2*r+n),y=i+2*l*(a-i)+f*(s-2*a+i);return{x:c*t+3*h*l*n+3*u*l*l*r+p*o,y:c*e+3*h*l*i+3*u*l*l*a+p*s,m:{x:g,y:d},n:{x:v,y:y},start:{x:u*t+l*n,y:u*e+l*i},end:{x:u*r+l*o,y:u*a+l*s},alpha:90-180*Math.atan2(g-v,d-y)/Math.PI}},P=function(t,e,n){if(!function(t,e){return t=C(t),e=C(e),S(e,t.x,t.y)||S(e,t.x2,t.y)||S(e,t.x,t.y2)||S(e,t.x2,t.y2)||S(t,e.x,e.y)||S(t,e.x2,e.y)||S(t,e.x,e.y2)||S(t,e.x2,e.y2)||(t.x<e.x2&&t.x>e.x||e.x<t.x2&&e.x>t.x)&&(t.y<e.y2&&t.y>e.y||e.y<t.y2&&e.y>t.y)}(A(t),A(e)))return n?0:[];for(var i=~~(b.apply(0,t)/8),r=~~(b.apply(0,e)/8),a=[],o=[],s={},l=n?0:[],u=0;u<i+1;u++){var c=k.apply(0,t.concat(u/i));a.push({x:c.x,y:c.y,t:u/i})}for(var h=0;h<r+1;h++){var f=k.apply(0,e.concat(h/r));o.push({x:f.x,y:f.y,t:h/r})}for(var p=0;p<i;p++)for(var g=0;g<r;g++){var d=a[p],v=a[p+1],y=o[g],x=o[g+1],m=Math.abs(v.x-d.x)<.001?"y":"x",_=Math.abs(x.x-y.x)<.001?"y":"x",M=w(d.x,d.y,v.x,v.y,y.x,y.y,x.x,x.y);if(M){if(s[M.x.toFixed(4)]===M.y.toFixed(4))continue;s[M.x.toFixed(4)]=M.y.toFixed(4);var P=d.t+Math.abs((M[m]-d[m])/(v[m]-d[m]))*(v.t-d.t),T=y.t+Math.abs((M[_]-y[_])/(x[_]-y[_]))*(x.t-y.t);P>=0&&P<=1&&T>=0&&T<=1&&(n?l++:l.push({x:M.x,y:M.y,t1:P,t2:T}))}}return l},T=function(t,e,n){if(1===n)return[[].concat(t)];var r=[];if("L"===e[0]||"C"===e[0]||"Q"===e[0])r=r.concat(function(t,e,n){var r=[[t[1],t[2]]];n=n||2;var a=[];"A"===e[0]?(r.push(e[6]),r.push(e[7])):"C"===e[0]?(r.push([e[1],e[2]]),r.push([e[3],e[4]]),r.push([e[5],e[6]])):"S"===e[0]||"Q"===e[0]?(r.push([e[1],e[2]]),r.push([e[3],e[4]])):r.push([e[1],e[2]]);for(var o=r,s=1/n,l=0;l<n-1;l++){var u=i(o,s/(1-s*l));a.push(u.left),o=u.right}return a.push(o),a.map(function(t){var e=[];return 4===t.length&&(e.push("C"),e=e.concat(t[2])),t.length>=3&&(3===t.length&&e.push("Q"),e=e.concat(t[1])),2===t.length&&e.push("L"),e=e.concat(t[t.length-1])})}(t,e,n));else{var a=[].concat(t);"M"===a[0]&&(a[0]="L");for(var o=0;o<=n-1;o++)r.push(a)}return r},I=function(t,e){if(t.length!==e.length)return!1;var n=!0;return s.each(t,function(t,i){if(t!==e[i])return n=!1,!1}),n};t.exports={parsePathString:h,parsePathArray:m,pathTocurve:y,pathToAbsolute:g,catmullRomToBezier:f,rectPath:M,fillPath:function(t,e){if(1===t.length)return t;var n=t.length-1,i=e.length-1,r=n/i,a=[];if(1===t.length&&"M"===t[0][0]){for(var o=0;o<i-n;o++)t.push(t[0]);return t}for(var s=0;s<i;s++){var l=Math.floor(r*s);a[l]=(a[l]||0)+1}var u=a.reduce(function(e,i,r){return r===n?e.concat(t[n]):e.concat(T(t[r],t[r+1],i))},[]);return u.unshift(t[0]),"Z"!==e[i]&&"z"!==e[i]||u.push("Z"),u},fillPathByDiff:function(t,e){var n=function(t,e){var n,i,a=t.length,o=e.length,s=0;if(0===a||0===o)return null;for(var l=[],u=0;u<=a;u++)l[u]=[],l[u][0]={min:u};for(var c=0;c<=o;c++)l[0][c]={min:c};for(var h=1;h<=a;h++){n=t[h-1];for(var f=1;f<=o;f++){i=e[f-1],s=I(n,i)?0:1;var p=l[h-1][f].min+1,g=l[h][f-1].min+1,d=l[h-1][f-1].min+s;l[h][f]=r(p,g,d)}}return l}(t,e),i=t.length,a=e.length,o=[],s=1,l=1;if(n[i][a]!==i){for(var u=1;u<=i;u++){var c=n[u][u].min;l=u;for(var h=s;h<=a;h++)n[u][h].min<c&&(c=n[u][h].min,l=h);s=l,n[u][s].type&&o.push({index:u-1,type:n[u][s].type})}for(var f=o.length-1;f>=0;f--)s=o[f].index,"add"===o[f].type?t.splice(s,0,[].concat(t[s])):t.splice(s,1)}var p=a-(i=t.length);if(i<a)for(var g=0;g<p;g++)"z"===t[i-1][0]||"Z"===t[i-1][0]?t.splice(i-2,0,t[i-2]):t.push(t[i-1]),i+=1;return t},formatPath:function(t,e){if(t.length<=1)return t;for(var n,i=0;i<e.length;i++)if(t[i][0]!==e[i][0])switch(n=o(t[i]),e[i][0]){case"M":t[i]=["M"].concat(n[0]);break;case"L":t[i]=["L"].concat(n[0]);break;case"A":t[i]=[].concat(e[i]),t[i][6]=n[0][0],t[i][7]=n[0][1];break;case"Q":if(n.length<2){if(!(i>0)){t[i]=e[i];break}n=a(n,t[i-1],1)}t[i]=["Q"].concat(n.reduce(function(t,e){return t.concat(e)},[]));break;case"T":t[i]=["T"].concat(n[0]);break;case"C":if(n.length<3){if(!(i>0)){t[i]=e[i];break}n=a(n,t[i-1],2)}t[i]=["C"].concat(n.reduce(function(t,e){return t.concat(e)},[]));break;case"S":if(n.length<2){if(!(i>0)){t[i]=e[i];break}n=a(n,t[i-1],1)}t[i]=["S"].concat(n.reduce(function(t,e){return t.concat(e)},[]));break;default:t[i]=e[i]}return t},intersection:function(t,e){return function(t,e,n){t=y(t),e=y(e);for(var i,r,a,o,s,l,u,c,h,f,p=n?0:[],g=0,d=t.length;g<d;g++){var v=t[g];if("M"===v[0])i=s=v[1],r=l=v[2];else{"C"===v[0]?(i=(h=[i,r].concat(v.slice(1)))[6],r=h[7]):(h=[i,r,i,r,s,l,s,l],i=s,r=l);for(var x=0,m=e.length;x<m;x++){var _=e[x];if("M"===_[0])a=u=_[1],o=c=_[2];else{"C"===_[0]?(a=(f=[a,o].concat(_.slice(1)))[6],o=f[7]):(f=[a,o,a,o,u,c,u,c],a=u,o=c);var b=P(h,f,n);if(n)p+=b;else{for(var w=0,S=b.length;w<S;w++)b[w].segment1=g,b[w].segment2=x,b[w].bez1=h,b[w].bez2=f;p=p.concat(b)}}}}}return p}(t,e)}}},function(t,e,n){"use strict";function i(){return x||(b(r),x=_.now()+m)}function r(){x=0}function a(){this._call=this._time=this._next=null}function o(t,e,n){var i=new a;return i.restart(t,e,n),i}function s(){i(),++p;for(var t,e=h;e;)(t=x-e._time)>=0&&e._call.call(null,t),e=e._next;--p}function l(){x=(y=_.now())+m,p=g=0;try{s()}finally{p=0,function(){var t,e,n=h,i=1/0;for(;n;)n._call?(i>n._time&&(i=n._time),t=n,n=n._next):(e=n._next,n._next=null,n=t?t._next=e:h=e);f=t,c(i)}(),x=0}}function u(){var t=_.now(),e=t-y;e>v&&(m-=e,y=t)}function c(t){if(!p){g&&(g=clearTimeout(g));t-x>24?(t<1/0&&(g=setTimeout(l,t-_.now()-m)),d&&(d=clearInterval(d))):(d||(y=_.now(),d=setInterval(u,v)),p=1,b(l))}}e.b=i,e.a=a,e.c=o,e.d=s;var h,f,p=0,g=0,d=0,v=1e3,y=0,x=0,m=0,_="object"==typeof performance&&performance.now?performance:Date,b="object"==typeof window&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(t){setTimeout(t,17)};a.prototype=o.prototype={constructor:a,restart:function(t,e,n){if("function"!=typeof t)throw new TypeError("callback is not a function");n=(null==n?i():+n)+(null==e?0:+e),this._next||f===this||(f?f._next=this:h=this,f=this),this._call=t,this._time=n,c()},stop:function(){this._call&&(this._call=null,this._time=1/0,c())}}},function(t,e,n){"use strict";var i=n(19),r=n(119),a=n(122),o=n(123),s=n(40),l=n(124),u=n(125),c=n(121);e.a=function(t,e){var n,h=typeof e;return null==e||"boolean"===h?Object(c.a)(e):("number"===h?s.a:"string"===h?(n=Object(i.a)(e))?(e=n,r.a):u.a:e instanceof i.a?r.a:e instanceof Date?o.a:Array.isArray(e)?a.a:"function"!=typeof e.valueOf&&"function"!=typeof e.toString||isNaN(e)?l.a:s.a)(t,e)}},function(t,e,n){"use strict";function i(){}function r(t){var e;return t=(t+"").trim().toLowerCase(),(e=_.exec(t))?(e=parseInt(e[1],16),new u(e>>8&15|e>>4&240,e>>4&15|240&e,(15&e)<<4|15&e,1)):(e=b.exec(t))?a(parseInt(e[1],16)):(e=w.exec(t))?new u(e[1],e[2],e[3],1):(e=S.exec(t))?new u(255*e[1]/100,255*e[2]/100,255*e[3]/100,1):(e=M.exec(t))?o(e[1],e[2],e[3],e[4]):(e=C.exec(t))?o(255*e[1]/100,255*e[2]/100,255*e[3]/100,e[4]):(e=A.exec(t))?c(e[1],e[2]/100,e[3]/100,1):(e=k.exec(t))?c(e[1],e[2]/100,e[3]/100,e[4]):P.hasOwnProperty(t)?a(P[t]):"transparent"===t?new u(NaN,NaN,NaN,0):null}function a(t){return new u(t>>16&255,t>>8&255,255&t,1)}function o(t,e,n,i){return i<=0&&(t=e=n=NaN),new u(t,e,n,i)}function s(t){return t instanceof i||(t=r(t)),t?(t=t.rgb(),new u(t.r,t.g,t.b,t.opacity)):new u}function l(t,e,n,i){return 1===arguments.length?s(t):new u(t,e,n,null==i?1:i)}function u(t,e,n,i){this.r=+t,this.g=+e,this.b=+n,this.opacity=+i}function c(t,e,n,i){return i<=0?t=e=n=NaN:n<=0||n>=1?t=e=NaN:e<=0&&(t=NaN),new f(t,e,n,i)}function h(t,e,n,a){return 1===arguments.length?function(t){if(t instanceof f)return new f(t.h,t.s,t.l,t.opacity);if(t instanceof i||(t=r(t)),!t)return new f;if(t instanceof f)return t;var e=(t=t.rgb()).r/255,n=t.g/255,a=t.b/255,o=Math.min(e,n,a),s=Math.max(e,n,a),l=NaN,u=s-o,c=(s+o)/2;return u?(l=e===s?(n-a)/u+6*(n<a):n===s?(a-e)/u+2:(e-n)/u+4,u/=c<.5?s+o:2-s-o,l*=60):u=c>0&&c<1?0:l,new f(l,u,c,t.opacity)}(t):new f(t,e,n,null==a?1:a)}function f(t,e,n,i){this.h=+t,this.s=+e,this.l=+n,this.opacity=+i}function p(t,e,n){return 255*(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)}e.a=i,n.d(e,"d",function(){return d}),n.d(e,"c",function(){return v}),e.e=r,e.h=s,e.g=l,e.b=u,e.f=h;var g=n(61),d=.7,v=1/d,y="\\s*([+-]?\\d+)\\s*",x="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",m="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",_=/^#([0-9a-f]{3})$/,b=/^#([0-9a-f]{6})$/,w=new RegExp("^rgb\\("+[y,y,y]+"\\)$"),S=new RegExp("^rgb\\("+[m,m,m]+"\\)$"),M=new RegExp("^rgba\\("+[y,y,y,x]+"\\)$"),C=new RegExp("^rgba\\("+[m,m,m,x]+"\\)$"),A=new RegExp("^hsl\\("+[x,m,m]+"\\)$"),k=new RegExp("^hsla\\("+[x,m,m,x]+"\\)$"),P={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};Object(g.a)(i,r,{displayable:function(){return this.rgb().displayable()},toString:function(){return this.rgb()+""}}),Object(g.a)(u,l,Object(g.b)(i,{brighter:function(t){return t=null==t?v:Math.pow(v,t),new u(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function(t){return t=null==t?d:Math.pow(d,t),new u(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function(){return this},displayable:function(){return 0<=this.r&&this.r<=255&&0<=this.g&&this.g<=255&&0<=this.b&&this.b<=255&&0<=this.opacity&&this.opacity<=1},toString:function(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(1===t?")":", "+t+")")}})),Object(g.a)(f,h,Object(g.b)(i,{brighter:function(t){return t=null==t?v:Math.pow(v,t),new f(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?d:Math.pow(d,t),new f(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=this.h%360+360*(this.h<0),e=isNaN(t)||isNaN(this.s)?0:this.s,n=this.l,i=n+(n<.5?n:1-n)*e,r=2*n-i;return new u(p(t>=240?t-240:t+120,r,i),p(t,r,i),p(t<120?t+240:t-120,r,i),this.opacity)},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1}}))},function(t,e,n){"use strict";e.b=function(t,e){var n=Object.create(t.prototype);for(var i in e)n[i]=e[i];return n},e.a=function(t,e,n){t.prototype=e.prototype=n,n.constructor=t}},function(t,e,n){"use strict";function i(t,e,n,i,r){var a=t*t,o=a*t;return((1-3*t+3*a-o)*e+(4-6*a+3*o)*n+(1+3*t+3*a-3*o)*i+o*r)/6}e.a=i,e.b=function(t){var e=t.length-1;return function(n){var r=n<=0?n=0:n>=1?(n=1,e-1):Math.floor(n*e),a=t[r],o=t[r+1],s=r>0?t[r-1]:2*a-o,l=r<e-1?t[r+2]:2*o-a;return i((n-r/e)*e,s,a,o,l)}}},function(t,e,n){var i=n(2),r=n(13);t.exports=function(t,e){if(!r(t))return t;var n=[];return i(t,function(t,i){e(t,i)&&n.push(t)}),n}},function(t,e,n){var i=n(5),r=n(4),a=n(2);t.exports=function(t,e){for(var n=[],o={},s=0;s<t.length;s++){var l=t[s][e];i(l)||(r(l)||(l=[l]),a(l,function(t){o[t]||(n.push(t),o[t]=!0)}))}return n}},function(t,e,n){var i=n(16).Group,r=n(21).Label,a=n(7),o=n(0),s=["line","point","path"],l=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){return{label:a.label,labelCfg:null,coord:null,geomType:null,zIndex:6}},n._renderUI=function(){t.prototype._renderUI.call(this),this.initLabelsCfg();var e=this.addGroup(),n=this.addGroup({elCls:"x-line-group"}),i=this.get("labelRenderer");this.set("labelsGroup",e),this.set("lineGroup",n),this.get("labelRenderer").set("group",e),i.set("group",e),i.set("lineGroup",n)},n.initLabelsCfg=function(){var t=new r,e=this.getDefaultLabelCfg(),n=this.get("labelCfg");o.deepMix(e,n.globalCfg||n.cfg),t.set("config",!1),e.labelLine&&t.set("labelLine",e.labelLine),t.set("coord",this.get("coord")),this.set("labelRenderer",t),this.set("label",e)},n.getDefaultLabelCfg=function(){var t=this.get("labelCfg").cfg||this.get("labelCfg").globalCfg,e=this.get("geomType"),n=this.get("viewTheme")||a;return"polygon"===e||t&&t.offset<0&&-1===o.indexOf(s,e)?o.deepMix({},this.get("label"),n.innerLabels,t):o.deepMix({},this.get("label"),n.label,t)},n.getLabelsItems=function(t,e){var n=this,i=[],r=n.get("geom"),a=n.get("coord");n._getLabelCfgs(t,e);var s=n.get("labelItemCfgs");return o.each(t,function(t,e){var l=t._origin,u=s[e];if(u){o.isArray(u.text)||(u.text=[u.text]);var c=u.length;o.each(u.text,function(e,s){if(o.isNil(e)||""===e)i.push(null);else{var h=n.getLabelPoint(u,t,s);(h=o.mix({},u,h)).textAlign||(h.textAlign=n.getLabelAlign(h,s,c)),r&&(h._id=r._getShapeId(l)+"-glabel-"+s+"-"+h.text),h.coord=a,i.push(h)}})}else i.push(null)}),i},n.adjustItems=function(t){return o.each(t,function(t){t&&(t.offsetX&&(t.x+=t.offsetX),t.offsetY&&(t.y+=t.offsetY))}),t},n.drawLines=function(t){var e=this;o.each(t,function(t){t&&t.offset>0&&e.lineToLabel(t)})},n.lineToLabel=function(){},n.getLabelPoint=function(t,e,n){function i(e,n){return o.isArray(e)&&(e=1===t.text.length?e.length<=2?e[e.length-1]:function(t){var e=0;return o.each(t,function(t){e+=t}),e/t.length}(e):e[n]),e}var r=this.get("coord"),a=t.text.length,s={text:t.text[n]};if(e&&"polygon"===this.get("geomType")){var l=function(t,e){for(var n,i,r=-1,a=0,o=0,s=t.length-1,l=0;++r<t.length;)n=s,s=r,l+=i=t[n]*e[s]-t[s]*e[n],a+=(t[n]+t[s])*i,o+=(e[n]+e[s])*i;return l*=3,[a/l,o/l]}(e.x,e.y);s.x=l[0],s.y=l[1]}else s.x=i(e.x,n),s.y=i(e.y,n);if(e&&e.nextPoints&&("funnel"===e.shape||"pyramid"===e.shape)){var u=-1/0;e.nextPoints.forEach(function(t){(t=r.convert(t)).x>u&&(u=t.x)}),s.x=(s.x+u)/2}"pyramid"===e.shape&&!e.nextPoints&&e.points&&e.points.forEach(function(t){t=r.convert(t),(o.isArray(t.x)&&-1===e.x.indexOf(t.x)||o.isNumber(t.x)&&e.x!==t.x)&&(s.x=(s.x+t.x)/2)}),t.position&&this.setLabelPosition(s,e,n,t.position);var c=this.getLabelOffset(t,n,a);return t.offsetX&&(c.x+=t.offsetX),t.offsetY&&(c.y+=t.offsetY),this.transLabelPoint(s),s.start={x:s.x,y:s.y},s.x+=c.x,s.y+=c.y,s.color=e.color,s},n.setLabelPosition=function(){},n.transLabelPoint=function(t){var e=this.get("coord").applyMatrix(t.x,t.y,1);t.x=e[0],t.y=e[1]},n.getOffsetVector=function(t){var e=t.offset||0,n=this.get("coord");return n.isTransposed?n.applyMatrix(e,0):n.applyMatrix(0,e)},n.getDefaultOffset=function(t){var e=this.get("coord"),n=this.getOffsetVector(t);return e.isTransposed?n[0]:n[1]},n.getLabelOffset=function(t,e,n){var i=this.getDefaultOffset(t),r=this.get("coord").isTransposed,a=r?"x":"y",o=r?1:-1,s={x:0,y:0};return s[a]=e>0||1===n?i*o:i*o*-1,s},n.getLabelAlign=function(t,e,n){var i="center";if(this.get("coord").isTransposed){var r=this.getDefaultOffset(t);i=r<0?"right":0===r?"center":"left",n>1&&0===e&&("right"===i?i="left":"left"===i&&(i="right"))}return i},n._getLabelValue=function(t,e){o.isArray(e)||(e=[e]);var n=[];return o.each(e,function(e){var i=t[e.field];if(o.isArray(i)){var r=[];o.each(i,function(t){r.push(e.getText(t))}),i=r}else i=e.getText(i);(o.isNil(i)||""===i)&&n.push(null),n.push(i)}),n},n._getLabelCfgs=function(t){var e=this,n=this.get("labelCfg"),i=n.scales,r=this.get("label"),a=[];n.globalCfg&&n.globalCfg.type&&e.set("type",n.globalCfg.type),o.each(t,function(t,s){var l={},u=t._origin,c=e._getLabelValue(u,i);if(n.callback){var h=i.map(function(t){return u[t.field]});l=n.callback.apply(null,h)}if(l||0===l){if(o.isString(l)||o.isNumber(l)?l={text:l}:(l.text=l.content||c[0],delete l.content),l=o.mix({},r,n.globalCfg||{},l),t.point=u,l.htmlTemplate&&(l.useHtml=!0,l.text=l.htmlTemplate.call(null,l.text,t,s),delete l.htmlTemplate),l.formatter&&(l.text=l.formatter.call(null,l.text,t,s),delete l.formatter),l.label){var f=l.label;delete l.label,l=o.mix(l,f)}if(l.textStyle){delete l.textStyle.offset;var p=l.textStyle;o.isFunction(p)&&(l.textStyle=p.call(null,l.text,t,s))}l.labelLine&&(l.labelLine=o.mix({},r.labelLine,l.labelLine)),l.textStyle=o.mix({},r.textStyle,l.textStyle),delete l.items,a.push(l)}else a.push(null)}),this.set("labelItemCfgs",a)},n.showLabels=function(t,e){var n=this.get("labelRenderer"),i=this.getLabelsItems(t,e);e=[].concat(e);var r=this.get("type");i=this.adjustItems(i,e),this.drawLines(i),n.set("items",i.filter(function(t,n){return!!t||(e.splice(n,1),!1)})),r&&(n.set("shapes",e),n.set("type",r),n.set("points",t)),n.set("canvas",this.get("canvas")),n.draw()},n.destroy=function(){this.get("labelRenderer").destroy(),t.prototype.destroy.call(this)},e}(i);t.exports=l},function(t,e,n){function i(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}var r=n(53),a=n(3),o=function(t){function e(e){var n,r=i(i(n=t.call(this)||this)),o={visible:!0},s=r.getDefaultCfg();return r._attrs=o,a.deepMix(o,s,e),n}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){return{}},n.get=function(t){return this._attrs[t]},n.set=function(t,e){this._attrs[t]=e},n.changeVisible=function(){},n.destroy=function(){this._attrs={},this.removeAllListeners(),this.destroyed=!0},e}(r);t.exports=o},function(t,e,n){var i=n(3),r=n(158),a=n(327),o=n(14).FONT_FAMILY,s=i.Event,l=i.Group,u=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{type:"continuous-legend",items:null,layout:"vertical",width:20,height:156,textStyle:{fill:"#333",textAlign:"center",textBaseline:"middle",stroke:"#fff",lineWidth:5,fontFamily:o},hoverTextStyle:{fill:"rgba(0,0,0,0.25)"},slidable:!0,triggerAttr:{fill:"#fff",shadowBlur:10,shadowColor:"rgba(0,0,0,0.65)",radius:2},_range:[0,100],middleBackgroundStyle:{fill:"#D9D9D9"},textOffset:4,lineStyle:{lineWidth:1,stroke:"#fff"},pointerStyle:{fill:"rgb(230, 230, 230)"}})},n._calStartPoint=function(){var t={x:10,y:this.get("titleGap")-8},e=this.get("titleShape");if(e){var n=e.getBBox();t.y+=n.height}return t},n.beforeRender=function(){var e=this.get("items");i.isArray(e)&&!i.isEmpty(e)&&(t.prototype.beforeRender.call(this),this.set("firstItem",e[0]),this.set("lastItem",e[e.length-1]))},n._formatItemValue=function(t){var e=this.get("formatter")||this.get("itemFormatter");return e&&(t=e.call(this,t)),t},n.render=function(){t.prototype.render.call(this),this.get("slidable")?this._renderSlider():this._renderUnslidable()},n._renderSlider=function(){var t=new l,e=new l,n=new l,i=this._calStartPoint(),r=this.get("group").addGroup(a,{minHandleElement:t,maxHandleElement:e,backgroundElement:n,layout:this.get("layout"),range:this.get("_range"),width:this.get("width"),height:this.get("height")});r.translate(i.x,i.y),this.set("slider",r);this._renderSliderShape().attr("clip",r.get("middleHandleElement")),this._renderTrigger()},n._addMiddleBar=function(t,e,n){return t.addShape(e,{attrs:i.mix({},n,this.get("middleBackgroundStyle"))}),t.addShape(e,{attrs:n})},n._renderTrigger=function(){var t=this.get("firstItem"),e=this.get("lastItem"),n=this.get("layout"),r=this.get("textStyle"),a=this.get("triggerAttr"),o=i.mix({},a),s=i.mix({},a),l=i.mix({text:this._formatItemValue(t.value)+""},r),u=i.mix({text:this._formatItemValue(e.value)+""},r);"vertical"===n?(this._addVerticalTrigger("min",o,l),this._addVerticalTrigger("max",s,u)):(this._addHorizontalTrigger("min",o,l),this._addHorizontalTrigger("max",s,u))},n._addVerticalTrigger=function(t,e,n){var r=this.get("slider").get(t+"HandleElement"),a=this.get("width"),o=r.addShape("rect",{attrs:i.mix({x:a/2-8-2,y:"min"===t?0:-8,width:18,height:8},e)}),s=r.addShape("text",{attrs:i.mix(n,{x:a+this.get("textOffset"),y:"max"===t?-4:4,textAlign:"start",lineHeight:1,textBaseline:"middle"})}),l="vertical"===this.get("layout")?"ns-resize":"ew-resize";o.attr("cursor",l),s.attr("cursor",l),this.set(t+"ButtonElement",o),this.set(t+"TextElement",s)},n._addHorizontalTrigger=function(t,e,n){var r=this.get("slider").get(t+"HandleElement"),a=r.addShape("rect",{attrs:i.mix({x:"min"===t?-8:0,y:-8-this.get("height")/2,width:8,height:16},e)}),o=r.addShape("text",{attrs:i.mix(n,{x:"min"===t?-12:12,y:4+this.get("textOffset")+10,textAlign:"min"===t?"end":"start",textBaseline:"middle"})}),s="vertical"===this.get("layout")?"ns-resize":"ew-resize";a.attr("cursor",s),o.attr("cursor",s),this.set(t+"ButtonElement",a),this.set(t+"TextElement",o)},n._bindEvents=function(){var t=this;if(this.get("slidable")){this.get("slider").on("sliderchange",function(e){var n=e.range,i=t.get("firstItem").value,r=t.get("lastItem").value,a=i+n[0]/100*(r-i),o=i+n[1]/100*(r-i);t._updateElement(a,o);var l=new s("itemfilter",e,!0,!0);l.range=[a,o],t.emit("itemfilter",l)})}this.get("hoverable")&&(this.get("group").on("mousemove",i.wrapBehavior(this,"_onMouseMove")),this.get("group").on("mouseleave",i.wrapBehavior(this,"_onMouseLeave")))},n._updateElement=function(t,e){var n=this.get("minTextElement"),i=this.get("maxTextElement");e>1&&(t=parseInt(t,10),e=parseInt(e,10)),n.attr("text",this._formatItemValue(t)+""),i.attr("text",this._formatItemValue(e)+"")},n._onMouseLeave=function(){var t=this.get("group").findById("hoverPointer");t&&t.destroy();var e=this.get("group").findById("hoverText");e&&e.destroy(),this.get("canvas").draw()},n._onMouseMove=function(t){var e,n=this.get("height"),i=this.get("width"),r=this.get("items"),a=this.get("canvas").get("el").getBoundingClientRect(),o=this.get("group").getBBox();if("vertical"===this.get("layout")){var s=5;"color-legend"===this.get("type")&&(s=30);var l=this.get("titleGap"),u=this.get("titleShape");u&&(l+=u.getBBox().maxY-u.getBBox().minY);var c=t.clientY||t.event.clientY;c=c-a.y-this.get("group").attr("matrix")[7]+o.y-s+l,e=r[0].value+(1-c/n)*(r[r.length-1].value-r[0].value)}else{var h=t.clientX||t.event.clientX;h=h-a.x-this.get("group").attr("matrix")[6],e=r[0].value+h/i*(r[r.length-1].value-r[0].value)}e=e.toFixed(2),this.activate(e),this.emit("mousehover",{value:e})},n.activate=function(t){if(t){var e=this.get("group").findById("hoverPointer"),n=this.get("group").findById("hoverText"),r=this.get("items");if(!(t<r[0].value||t>r[r.length-1].value)){var a,o=this.get("height"),s=this.get("width"),l=this.get("titleShape"),u=this.get("titleGap"),c=[],h=(t-r[0].value)/(r[r.length-1].value-r[0].value);if("vertical"===this.get("layout")){var f=0,p=0;"color-legend"===this.get("type")&&(f=u,l&&(f+=l.getBBox().height)),this.get("slidable")&&("color-legend"===this.get("type")?f-=13:(f=u-15,l&&(f+=l.getBBox().height)),p+=10),c=[[p,(h=(1-h)*o)+f],[p-10,h+f-5],[p-10,h+f+5]],a=i.mix({},{x:s+this.get("textOffset")/2+p,y:h+f,text:this._formatItemValue(t)+""},this.get("textStyle"),{textAlign:"start"})}else{var g=0,d=0;"color-legend"===this.get("type")&&(g=u,l&&(g+=l.getBBox().height)),this.get("slidable")&&("color-legend"===this.get("type")?g-=7:(g=u,l||(g-=7)),d+=10),c=[[(h*=s)+d,g],[h+d-5,g-10],[h+d+5,g-10]],a=i.mix({},{x:h-5,y:o+this.get("textOffset")+g,text:this._formatItemValue(t)+""},this.get("textStyle"))}var v=i.mix(a,this.get("hoverTextStyle"));n?n.attr(v):(n=this.get("group").addShape("text",{attrs:v})).set("id","hoverText"),e?e.attr(i.mix({points:c},this.get("pointerStyle"))):(e=this.get("group").addShape("Polygon",{attrs:i.mix({points:c},this.get("pointerStyle"))})).set("id","hoverPointer"),this.get("canvas").draw()}}},n.deactivate=function(){var t=this.get("group").findById("hoverPointer");t&&t.destroy();var e=this.get("group").findById("hoverText");e&&e.destroy(),this.get("canvas").draw()},e}(r);t.exports=u},function(t,e,n){var i=n(66),r=n(3),a=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return r.mix({},e,{x:0,y:0,items:null,titleContent:null,showTitle:!0,plotRange:null,offset:10,timeStamp:0,inPlot:!0,crosshairs:null})},n.isContentChange=function(t,e){var n=this.get("titleContent"),i=this.get("items"),a=!(t===n&&i.length===e.length);return a||r.each(e,function(t,e){var n=i[e];for(var o in t)if(t.hasOwnProperty(o)&&!r.isObject(t[o])&&t[o]!==n[o]){a=!0;break}if(a)return!1}),a},n.setContent=function(t,e){var n=(new Date).valueOf();return this.set("items",e),this.set("titleContent",t),this.set("timeStamp",n),this.render(),this},n.setPosition=function(t,e){this.set("x",t),this.set("y",e)},n.render=function(){},n.clear=function(){},n.show=function(){this.set("visible",!0)},n.hide=function(){this.set("visible",!1)},n.destroy=function(){},e}(i);t.exports=a},function(t,e,n){"use strict";function i(t,e){this._groups=t,this._parents=e}function r(){return new i([[document.documentElement]],F)}n.d(e,"c",function(){return F}),e.a=i;var a=n(402),o=n(403),s=n(404),l=n(405),u=n(382),c=n(407),h=n(408),f=n(409),p=n(410),g=n(411),d=n(412),v=n(413),y=n(414),x=n(415),m=n(416),_=n(417),b=n(384),w=n(418),S=n(419),M=n(420),C=n(421),A=n(422),k=n(423),P=n(424),T=n(425),I=n(426),O=n(427),L=n(428),E=n(374),D=n(429),F=[null];i.prototype=r.prototype={constructor:i,select:a.a,selectAll:o.a,filter:s.a,data:l.a,enter:u.b,exit:c.a,merge:h.a,order:f.a,sort:p.a,call:g.a,nodes:d.a,node:v.a,size:y.a,empty:x.a,each:m.a,attr:_.a,style:b.a,property:w.a,classed:S.a,text:M.a,html:C.a,raise:A.a,lower:k.a,append:P.a,insert:T.a,remove:I.a,clone:O.a,datum:L.a,on:E.b,dispatch:D.a},e.b=r},function(t,e,n){"use strict";function i(t,e){var n=t.__transition;if(!n||!(n=n[e]))throw new Error("transition not found");return n}n.d(e,"c",function(){return u}),n.d(e,"d",function(){return c}),n.d(e,"b",function(){return p}),n.d(e,"a",function(){return g}),e.g=function(t,e){var n=i(t,e);if(n.state>l)throw new Error("too late; already scheduled");return n},e.h=function(t,e){var n=i(t,e);if(n.state>c)throw new Error("too late; already started");return n},e.f=i;var r=n(438),a=n(170),o=Object(r.a)("start","end","interrupt"),s=[],l=0,u=1,c=2,h=3,f=4,p=5,g=6;e.e=function(t,e,n,i,r,d){var v=t.__transition;if(v){if(n in v)return}else t.__transition={};!function(t,e,n){function i(p){var d,v,y,x;if(n.state!==u)return o();for(d in l)if((x=l[d]).name===n.name){if(x.state===h)return Object(a.timeout)(i);x.state===f?(x.state=g,x.timer.stop(),x.on.call("interrupt",t,t.__data__,x.index,x.group),delete l[d]):+d<e&&(x.state=g,x.timer.stop(),delete l[d])}if(Object(a.timeout)(function(){n.state===h&&(n.state=f,n.timer.restart(r,n.delay,n.time),r(p))}),n.state=c,n.on.call("start",t,t.__data__,n.index,n.group),n.state===c){for(n.state=h,s=new Array(y=n.tween.length),d=0,v=-1;d<y;++d)(x=n.tween[d].value.call(t,t.__data__,n.index,n.group))&&(s[++v]=x);s.length=v+1}}function r(e){for(var i=e<n.duration?n.ease.call(null,e/n.duration):(n.timer.restart(o),n.state=p,1),r=-1,a=s.length;++r<a;)s[r].call(null,i);n.state===p&&(n.on.call("end",t,t.__data__,n.index,n.group),o())}function o(){n.state=g,n.timer.stop(),delete l[e];for(var i in l)return;delete t.__transition}var s,l=t.__transition;l[e]=n,n.timer=Object(a.timer)(function(t){n.state=u,n.timer.restart(i,n.delay,n.time),n.delay<=t&&i(t-n.delay)},0,n.time)}(t,n,{name:e,index:i,group:r,on:o,tween:s,time:d.time,delay:d.delay,duration:d.duration,ease:d.ease,timer:null,state:l})}},function(t,e,n){var i=n(10),r=n(80);t.exports={toTimeStamp:function(t){return i(t)&&(t=t.indexOf("T")>0?new Date(t).getTime():new Date(t.replace(/-/gi,"/")).getTime()),r(t)&&(t=t.getTime()),t}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var i=n(401);n.d(e,"create",function(){return i.a});var r=n(360);n.d(e,"creator",function(){return r.a});var a=n(430);n.d(e,"local",function(){return a.a});var o=n(381);n.d(e,"matcher",function(){return o.a});var s=n(431);n.d(e,"mouse",function(){return s.a});var l=n(370);n.d(e,"namespace",function(){return l.a});var u=n(371);n.d(e,"namespaces",function(){return u.a});var c=n(361);n.d(e,"clientPoint",function(){return c.a});var h=n(379);n.d(e,"select",function(){return h.a});var f=n(432);n.d(e,"selectAll",function(){return f.a});var p=n(69);n.d(e,"selection",function(){return p.b});var g=n(372);n.d(e,"selector",function(){return g.a});var d=n(380);n.d(e,"selectorAll",function(){return d.a});var v=n(384);n.d(e,"style",function(){return v.b});var y=n(433);n.d(e,"touch",function(){return y.a});var x=n(434);n.d(e,"touches",function(){return x.a});var m=n(373);n.d(e,"window",function(){return m.a});var _=n(374);n.d(e,"event",function(){return _.c}),n.d(e,"customEvent",function(){return _.a})},function(t,e,n){t.exports={Position:n(292),Color:n(293),Shape:n(294),Size:n(295),Opacity:n(296),ColorUtil:n(149)}},function(t,e,n){var i=n(75),r=n(17);r.Linear=n(33),r.Identity=n(175),r.Cat=n(77),r.Time=n(176),r.TimeCat=n(178),r.Log=n(179),r.Pow=n(180);var a=function(t){if(r.hasOwnProperty(t)){var e=i(t);r[e]=function(e){return new r[t](e)}}};for(var o in r)a(o);var s=["cat","timeCat"];r.isCategory=function(t){return s.indexOf(t)>=0},t.exports=r},function(t,e,n){var i=n(23);t.exports=function(t){var e=i(t);return e.charAt(0).toLowerCase()+e.substring(1)}},function(t,e){function n(t,e){var n=t.length;if(0===n)return NaN;var i=t[0];if(e<t[0])return NaN;if(e>=t[n-1])return t[n-1];for(var r=1;r<t.length&&!(e<t[r]);r++)i=t[r];return i}function i(t,e){var n=t.length;if(0===n)return NaN;var i;if(e>t[n-1])return NaN;if(e<t[0])return t[0];for(var r=1;r<t.length;r++)if(e<=t[r]){i=t[r];break}return i}var r=12,a={snapFactorTo:function(t,e,n){if(isNaN(t))return NaN;var i=1;if(0!==t){t<0&&(i=-1);var o=function(t){var e=1;if(t===1/0||t===-1/0)throw new Error("Not support Infinity!");if(t<1){for(var n=0;t<1;)e/=10,t*=10,n++;e.toString().length>r&&(e=parseFloat(e.toFixed(n)))}else for(;t>10;)e*=10,t/=10;return e}(t*=i);i*=o,t/=o}var s=(t="floor"===n?a.snapFloor(e,t):"ceil"===n?a.snapCeiling(e,t):a.snapTo(e,t))*i;if(Math.abs(i)<1&&s.toString().length>r){s=t/parseInt(1/i)*(i>0?1:-1)}return s},snapMultiple:function(t,e,n){return("ceil"===n?Math.ceil(t/e):"floor"===n?Math.floor(t/e):Math.round(t/e))*e},snapTo:function(t,e){var r=n(t,e),a=i(t,e);if(isNaN(r)||isNaN(a)){if(t[0]>=e)return t[0];var o=t[t.length-1];if(o<=e)return o}return Math.abs(e-r)<Math.abs(a-e)?r:a},snapFloor:function(t,e){return n(t,e)},snapCeiling:function(t,e){return i(t,e)},fixedBase:function(t,e){var n=e.toString(),i=n.indexOf(".");if(-1===i)return Math.round(t);var r=n.substr(i+1).length;return r>20&&(r=20),parseFloat(t.toFixed(r))}};t.exports=a},function(t,e,n){var i=n(17),r=n(78),a=n(2),o=n(9),s=n(10),l=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n._initDefaultCfg=function(){t.prototype._initDefaultCfg.call(this),this.type="cat",this.isCategory=!0,this.isRounding=!0},n.init=function(){var t=this.values,e=this.tickCount;if(a(t,function(e,n){t[n]=e.toString()}),!this.ticks){var n=t;if(e){n=r({maxCount:e,data:t,isRounding:this.isRounding}).ticks}this.ticks=n}},n.getText=function(e){return-1===this.values.indexOf(e)&&o(e)&&(e=this.values[Math.round(e)]),t.prototype.getText.call(this,e)},n.translate=function(t){var e=this.values.indexOf(t);return-1===e&&o(t)?e=t:-1===e&&(e=NaN),e},n.scale=function(t){var e,n=this.rangeMin(),i=this.rangeMax();return(s(t)||-1!==this.values.indexOf(t))&&(t=this.translate(t)),e=this.values.length>1?t/(this.values.length-1):t,n+e*(i-n)},n.invert=function(t){if(s(t))return t;var e=this.rangeMin(),n=this.rangeMax();t<e&&(t=e),t>n&&(t=n);var i=(t-e)/(n-e),r=Math.round(i*(this.values.length-1))%this.values.length;return r=r||0,this.values[r]},e}(i);i.Cat=l,t.exports=l},function(t,e,n){var i=n(2);t.exports=function(t){var e,n={},r=[],a=t.isRounding,o=function(t){var e=[];return i(t,function(t){e=e.concat(t)}),e}(t.data),s=o.length,l=t.maxCount||8;if(a?2===(e=function(t,e){var n;for(n=e;n>0&&t%n!=0;n--);if(1===n)for(n=e;n>0&&(t-1)%n!=0;n--);return n}(s-1,l-1)+1)?e=l:e<l-4&&(e=l-4):e=l,!a&&s<=e+e/2)r=[].concat(o);else{for(var u=parseInt(s/(e-1),10),c=o.map(function(t,e){return e%u==0?o.slice(e,e+u):null}).filter(function(t){return t}),h=1,f=c.length;h<f&&(a?h*u<s-u:h<e-1);h++)r.push(c[h][0]);if(o.length){r.unshift(o[0]);var p=o[s-1];-1===r.indexOf(p)&&r.push(p)}}return n.categories=o,n.ticks=r,n}},function(t,e,n){var i;!function(r){"use strict";function a(t,e){for(var n=[],i=0,r=t.length;i<r;i++)n.push(t[i].substr(0,e));return n}function o(t){return function(e,n,i){var r=i[t].indexOf(n.charAt(0).toUpperCase()+n.substr(1).toLowerCase());~r&&(e.month=r)}}function s(t,e){for(t=String(t),e=e||2;t.length<e;)t="0"+t;return t}var l={},u=/d{1,4}|M{1,4}|YY(?:YY)?|S{1,3}|Do|ZZ|([HhMsDm])\1?|[aA]|"[^"]*"|'[^']*'/g,c=/\d\d?/,h=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,f=/\[([^]*?)\]/gm,p=function(){},g=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],d=["January","February","March","April","May","June","July","August","September","October","November","December"],v=a(d,3),y=a(g,3);l.i18n={dayNamesShort:y,dayNames:g,monthNamesShort:v,monthNames:d,amPm:["am","pm"],DoFn:function(t){return t+["th","st","nd","rd"][t%10>3?0:(t-t%10!=10)*t%10]}};var x={D:function(t){return t.getDate()},DD:function(t){return s(t.getDate())},Do:function(t,e){return e.DoFn(t.getDate())},d:function(t){return t.getDay()},dd:function(t){return s(t.getDay())},ddd:function(t,e){return e.dayNamesShort[t.getDay()]},dddd:function(t,e){return e.dayNames[t.getDay()]},M:function(t){return t.getMonth()+1},MM:function(t){return s(t.getMonth()+1)},MMM:function(t,e){return e.monthNamesShort[t.getMonth()]},MMMM:function(t,e){return e.monthNames[t.getMonth()]},YY:function(t){return String(t.getFullYear()).substr(2)},YYYY:function(t){return s(t.getFullYear(),4)},h:function(t){return t.getHours()%12||12},hh:function(t){return s(t.getHours()%12||12)},H:function(t){return t.getHours()},HH:function(t){return s(t.getHours())},m:function(t){return t.getMinutes()},mm:function(t){return s(t.getMinutes())},s:function(t){return t.getSeconds()},ss:function(t){return s(t.getSeconds())},S:function(t){return Math.round(t.getMilliseconds()/100)},SS:function(t){return s(Math.round(t.getMilliseconds()/10),2)},SSS:function(t){return s(t.getMilliseconds(),3)},a:function(t,e){return t.getHours()<12?e.amPm[0]:e.amPm[1]},A:function(t,e){return t.getHours()<12?e.amPm[0].toUpperCase():e.amPm[1].toUpperCase()},ZZ:function(t){var e=t.getTimezoneOffset();return(e>0?"-":"+")+s(100*Math.floor(Math.abs(e)/60)+Math.abs(e)%60,4)}},m={D:[c,function(t,e){t.day=e}],Do:[new RegExp(c.source+h.source),function(t,e){t.day=parseInt(e,10)}],M:[c,function(t,e){t.month=e-1}],YY:[c,function(t,e){var n=+(""+(new Date).getFullYear()).substr(0,2);t.year=""+(e>68?n-1:n)+e}],h:[c,function(t,e){t.hour=e}],m:[c,function(t,e){t.minute=e}],s:[c,function(t,e){t.second=e}],YYYY:[/\d{4}/,function(t,e){t.year=e}],S:[/\d/,function(t,e){t.millisecond=100*e}],SS:[/\d{2}/,function(t,e){t.millisecond=10*e}],SSS:[/\d{3}/,function(t,e){t.millisecond=e}],d:[c,p],ddd:[h,p],MMM:[h,o("monthNamesShort")],MMMM:[h,o("monthNames")],a:[h,function(t,e,n){var i=e.toLowerCase();i===n.amPm[0]?t.isPm=!1:i===n.amPm[1]&&(t.isPm=!0)}],ZZ:[/([\+\-]\d\d:?\d\d|Z)/,function(t,e){"Z"===e&&(e="+00:00");var n,i=(e+"").match(/([\+\-]|\d\d)/gi);i&&(n=60*i[1]+parseInt(i[2],10),t.timezoneOffset="+"===i[0]?n:-n)}]};m.dd=m.d,m.dddd=m.ddd,m.DD=m.D,m.mm=m.m,m.hh=m.H=m.HH=m.h,m.MM=m.M,m.ss=m.s,m.A=m.a,l.masks={default:"ddd MMM DD YYYY HH:mm:ss",shortDate:"M/D/YY",mediumDate:"MMM D, YYYY",longDate:"MMMM D, YYYY",fullDate:"dddd, MMMM D, YYYY",shortTime:"HH:mm",mediumTime:"HH:mm:ss",longTime:"HH:mm:ss.SSS"},l.format=function(t,e,n){var i=n||l.i18n;if("number"==typeof t&&(t=new Date(t)),"[object Date]"!==Object.prototype.toString.call(t)||isNaN(t.getTime()))throw new Error("Invalid Date in fecha.format");var r=[];return e=(e=l.masks[e]||e||l.masks.default).replace(f,function(t,e){return r.push(e),"??"}),(e=e.replace(u,function(e){return e in x?x[e](t,i):e.slice(1,e.length-1)})).replace(/\?\?/g,function(){return r.shift()})},l.parse=function(t,e,n){var i=n||l.i18n;if("string"!=typeof e)throw new Error("Invalid format in fecha.parse");if(e=l.masks[e]||e,t.length>1e3)return!1;var r=!0,a={};if(e.replace(u,function(e){if(m[e]){var n=m[e],o=t.search(n[0]);~o?t.replace(n[0],function(e){return n[1](a,e,i),t=t.substr(o+e.length),e}):r=!1}return m[e]?"":e.slice(1,e.length-1)}),!r)return!1;var o=new Date;!0===a.isPm&&null!=a.hour&&12!=+a.hour?a.hour=+a.hour+12:!1===a.isPm&&12==+a.hour&&(a.hour=0);var s;return null!=a.timezoneOffset?(a.minute=+(a.minute||0)-+a.timezoneOffset,s=new Date(Date.UTC(a.year||o.getFullYear(),a.month||0,a.day||1,a.hour||0,a.minute||0,a.second||0,a.millisecond||0))):s=new Date(a.year||o.getFullYear(),a.month||0,a.day||1,a.hour||0,a.minute||0,a.second||0,a.millisecond||0),s},void 0!==t&&t.exports?t.exports=l:void 0!==(i=function(){return l}.call(e,n,e,t))&&(t.exports=i)}()},function(t,e,n){var i=n(12);t.exports=function(t){return i(t,"Date")}},function(t,e,n){t.exports={isFunction:n(11),isObject:n(24),isBoolean:n(82),isNil:n(5),isString:n(10),isArray:n(4),isNumber:n(9),isEmpty:n(83),uniqueId:n(86),clone:n(46),deepMix:n(47),assign:n(8),merge:n(47),upperFirst:n(87),each:n(2),isEqual:n(49),toArray:n(34),extend:n(88),augment:n(89),remove:n(90),isNumberEqual:n(35),toRadian:n(91),toDegree:n(92),mod:n(93),clamp:n(50),createDom:n(94),modifyCSS:n(95),requestAnimationFrame:n(96),getRatio:function(){return window.devicePixelRatio?window.devicePixelRatio:2},mat3:n(51),vec2:n(97),vec3:n(98),transform:n(99)}},function(t,e,n){var i=n(12);t.exports=function(t){return i(t,"Boolean")}},function(t,e,n){var i=n(5),r=n(13),a=n(84),o=n(85),s=Object.prototype.hasOwnProperty;t.exports=function(t){if(i(t))return!0;if(r(t))return!t.length;var e=a(t);if("Map"===e||"Set"===e)return!t.size;if(o(t))return!Object.keys(t).length;for(var n in t)if(s.call(t,n))return!1;return!0}},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).replace(/^\[object /,"").replace(/\]$/,"")}},function(t,e){var n=Object.prototype;t.exports=function(t){var e=t&&t.constructor;return t===("function"==typeof e&&e.prototype||n)}},function(t,e){var n=function(){var t={};return function(e){return e=e||"g",t[e]?t[e]+=1:t[e]=1,e+t[e]}}();t.exports=n},function(t,e,n){var i=n(23);t.exports=function(t){var e=i(t);return e.charAt(0).toUpperCase()+e.substring(1)}},function(t,e,n){var i=n(11),r=n(8);t.exports=function(t,e,n,a){i(e)||(n=e,e=t,t=function(){});var o=Object.create?function(t,e){return Object.create(t,{constructor:{value:e}})}:function(t,e){function n(){}n.prototype=t;var i=new n;return i.constructor=e,i},s=o(e.prototype,t);return t.prototype=r(s,t.prototype),t.superclass=o(e.prototype,e),r(s,n),r(t,a),t}},function(t,e,n){var i=n(11),r=n(34),a=n(8);t.exports=function(t){for(var e=r(arguments),n=1;n<e.length;n++){var o=e[n];i(o)&&(o=o.prototype),a(t.prototype,o)}}},function(t,e){var n=Array.prototype,i=n.splice,r=n.indexOf,a=n.slice;t.exports=function(t){for(var e=a.call(arguments,1),n=0;n<e.length;n++)for(var o=e[n],s=-1;(s=r.call(t,o))>-1;)i.call(t,s,1);return t}},function(t,e){var n=Math.PI/180;t.exports=function(t){return n*t}},function(t,e){var n=180/Math.PI;t.exports=function(t){return n*t}},function(t,e){t.exports=function(t,e){return(t%e+e)%e}},function(t,e){var n=document.createElement("table"),i=document.createElement("tr"),r=/^\s*<(\w+|!)[^>]*>/,a={tr:document.createElement("tbody"),tbody:n,thead:n,tfoot:n,td:i,th:i,"*":document.createElement("div")};t.exports=function(t){var e=r.test(t)&&RegExp.$1;e in a||(e="*");var n=a[e];t=t.replace(/(^\s*)|(\s*$)/g,""),n.innerHTML=""+t;var i=n.childNodes[0];return n.removeChild(i),i}},function(t,e){t.exports=function(t,e){if(t)for(var n in e)e.hasOwnProperty(n)&&(t.style[n]=e[n]);return t}},function(t,e){t.exports=function(t){return(window.requestAnimationFrame||window.webkitRequestAnimationFrame||function(t){return setTimeout(t,16)})(t)}},function(t,e,n){var i=n(183),r=n(50);i.angle=function(t,e){var n=i.dot(t,e)/(i.length(t)*i.length(e));return Math.acos(r(n,-1,1))},i.direction=function(t,e){return t[0]*e[1]-e[0]*t[1]},i.angleTo=function(t,e,n){var r=i.angle(t,e),a=i.direction(t,e)>=0;return n?a?2*Math.PI-r:r:a?r:2*Math.PI-r},i.vertical=function(t,e,n){return n?(t[0]=e[1],t[1]=-1*e[0]):(t[0]=-1*e[1],t[1]=e[0]),t},t.exports=i},function(t,e,n){var i=n(184);t.exports=i},function(t,e,n){var i=n(46),r=n(2),a=n(51);t.exports=function(t,e){return t=i(t),r(e,function(e){switch(e[0]){case"t":a.translate(t,t,[e[1],e[2]]);break;case"s":a.scale(t,t,[e[1],e[2]]);break;case"r":a.rotate(t,t,e[1]);break;case"m":a.multiply(t,t,e[1]);break;default:return!1}}),t}},function(t,e,n){var i=n(1),r=function(t,e,n,i){this.type=t,this.target=null,this.currentTarget=null,this.bubbles=n,this.cancelable=i,this.timeStamp=(new Date).getTime(),this.defaultPrevented=!1,this.propagationStopped=!1,this.removed=!1,this.event=e};i.augment(r,{preventDefault:function(){this.defaultPrevented=this.cancelable&&!0},stopPropagation:function(){this.propagationStopped=!0},remove:function(){this.remove=!0},clone:function(){return i.clone(this)},toString:function(){return"[Event (type="+this.type+")]"}}),t.exports=r},function(t,e,n){function i(t,e,n){for(var i,r=t.length-1;r>=0;r--){var a=t[r];if(a._cfg.visible&&a._cfg.capture&&(a.isGroup?i=a.getShape(e,n):a.isHit(e,n)&&(i=a)),i)break}return i}function r(t){if(!t._cfg&&t!==c){var e=t.superclass.constructor;e&&!e._cfg&&r(e),t._cfg={},a.merge(t._cfg,e._cfg),a.merge(t._cfg,t.CFG)}}var a=n(1),o=n(102),s=n(188),l={},u="_INDEX",c=function t(e){t.superclass.constructor.call(this,e),this.set("children",[]),this.set("tobeRemoved",[]),this._beforeRenderUI(),this._renderUI(),this._bindUI()};a.extend(c,o),a.augment(c,{isGroup:!0,type:"group",canFill:!0,canStroke:!0,getDefaultCfg:function(){return r(this.constructor),a.merge({},this.constructor._cfg)},_beforeRenderUI:function(){},_renderUI:function(){},_bindUI:function(){},addShape:function(t,e){var n=this.get("canvas");e=e||{};var i=l[t];if(i||(i=a.upperFirst(t),l[t]=i),e.attrs&&n){var r=e.attrs;if("text"===t){var o=n.get("fontFamily");o&&(r.fontFamily=r.fontFamily?r.fontFamily:o)}}e.canvas=n,e.type=t;var u=new s[i](e);return this.add(u),u},addGroup:function(t,e){var n,i=this.get("canvas");if(e=a.merge({},e),a.isFunction(t))e?(e.canvas=i,e.parent=this,n=new t(e)):n=new t({canvas:i,parent:this}),this.add(n);else if(a.isObject(t))t.canvas=i,n=new c(t),this.add(n);else{if(void 0!==t)return!1;n=new c,this.add(n)}return n},renderBack:function(t,e){var n=this.get("backShape"),i=this.getBBox();return a.merge(e,{x:i.minX-t[3],y:i.minY-t[0],width:i.width+t[1]+t[3],height:i.height+t[0]+t[2]}),n?n.attr(e):n=this.addShape("rect",{zIndex:-1,attrs:e}),this.set("backShape",n),this.sort(),n},removeChild:function(t,e){if(arguments.length>=2)this.contain(t)&&t.remove(e);else{if(1===arguments.length){if(!a.isBoolean(t))return this.contain(t)&&t.remove(!0),this;e=t}0===arguments.length&&(e=!0),c.superclass.remove.call(this,e)}return this},add:function(t){var e=this,n=e.get("children");if(a.isArray(t))a.each(t,function(t){var n=t.get("parent");n&&n.removeChild(t,!1),e._setCfgProperty(t)}),e._cfg.children=n.concat(t);else{var i=t,r=i.get("parent");r&&r.removeChild(i,!1),e._setCfgProperty(i),n.push(i)}return e},_setCfgProperty:function(t){var e=this._cfg;t.set("parent",this),t.set("canvas",e.canvas),e.timeline&&t.set("timeline",e.timeline)},contain:function(t){return this.get("children").indexOf(t)>-1},getChildByIndex:function(t){return this.get("children")[t]},getFirst:function(){return this.getChildByIndex(0)},getLast:function(){var t=this.get("children").length-1;return this.getChildByIndex(t)},getBBox:function(){var t=1/0,e=-1/0,n=1/0,i=-1/0,r=this.get("children");r.length>0?a.each(r,function(r){if(r.get("visible")){if(r.isGroup&&0===r.get("children").length)return;var a=r.getBBox();if(!a)return!0;var o=[a.minX,a.minY,1],s=[a.minX,a.maxY,1],l=[a.maxX,a.minY,1],u=[a.maxX,a.maxY,1];r.apply(o),r.apply(s),r.apply(l),r.apply(u);var c=Math.min(o[0],s[0],l[0],u[0]),h=Math.max(o[0],s[0],l[0],u[0]),f=Math.min(o[1],s[1],l[1],u[1]),p=Math.max(o[1],s[1],l[1],u[1]);c<t&&(t=c),h>e&&(e=h),f<n&&(n=f),p>i&&(i=p)}}):(t=0,e=0,n=0,i=0);var o={minX:t,minY:n,maxX:e,maxY:i};return o.x=o.minX,o.y=o.minY,o.width=o.maxX-o.minX,o.height=o.maxY-o.minY,o},getCount:function(){return this.get("children").length},sort:function(){var t=this.get("children");return a.each(t,function(t,e){return t[u]=e,t}),t.sort(function(t){return function(e,n){var i=t(e,n);return 0===i?e[u]-n[u]:i}}(function(t,e){return t.get("zIndex")-e.get("zIndex")})),this},findById:function(t){return this.find(function(e){return e.get("id")===t})},find:function(t){if(a.isString(t))return this.findById(t);var e=this.get("children"),n=null;return a.each(e,function(e){if(t(e)?n=e:e.find&&(n=e.find(t)),n)return!1}),n},findAll:function(t){var e=this.get("children"),n=[],i=[];return a.each(e,function(e){t(e)&&n.push(e),e.findAllBy&&(i=e.findAllBy(t),n=n.concat(i))}),n},findBy:function(t){var e=this.get("children"),n=null;return a.each(e,function(e){if(t(e)?n=e:e.findBy&&(n=e.findBy(t)),n)return!1}),n},findAllBy:function(t){var e=this.get("children"),n=[],i=[];return a.each(e,function(e){t(e)&&n.push(e),e.findAllBy&&(i=e.findAllBy(t),n=n.concat(i))}),n},getShape:function(t,e){var n,r=this._attrs.clip,a=this._cfg.children;if(r){var o=[t,e,1];r.invert(o,this.get("canvas")),r.isPointInPath(o[0],o[1])&&(n=i(a,t,e))}else n=i(a,t,e);return n},clearTotalMatrix:function(){if(this.get("totalMatrix")){this.setSilent("totalMatrix",null);for(var t=this._cfg.children,e=0;e<t.length;e++){t[e].clearTotalMatrix()}}},clear:function(t){for(var e=this._cfg.children,n=e.length-1;n>=0;n--)e[n].remove(!0,t);return this._cfg.children=[],this},destroy:function(){this.get("destroyed")||(this.clear(),c.superclass.destroy.call(this))},clone:function(){var t=this._cfg.children,e=new c;return a.each(t,function(t){e.add(t.clone())}),e}}),t.exports=c},function(t,e,n){var i=n(1),r=n(185),a=n(186),o=n(187),s=n(53),l=function(t){this._cfg={zIndex:0,capture:!0,visible:!0,destroyed:!1},i.assign(this._cfg,this.getDefaultCfg(),t),this.initAttrs(this._cfg.attrs),this._cfg.attrs={},this.initTransform(),this.init()};l.CFG={id:null,zIndex:0,canvas:null,parent:null,capture:!0,context:null,visible:!0,destroyed:!1},i.augment(l,r,a,s,o,{init:function(){this.setSilent("animable",!0),this.setSilent("animating",!1)},getParent:function(){return this._cfg.parent},getDefaultCfg:function(){return{}},set:function(t,e){return"zIndex"===t&&this._beforeSetZIndex&&this._beforeSetZIndex(e),"loading"===t&&this._beforeSetLoading&&this._beforeSetLoading(e),this._cfg[t]=e,this},setSilent:function(t,e){this._cfg[t]=e},get:function(t){return this._cfg[t]},show:function(){return this._cfg.visible=!0,this},hide:function(){return this._cfg.visible=!1,this},remove:function(t,e){var n=this._cfg,r=n.parent,a=n.el;return r&&i.remove(r.get("children"),this),a&&(e?r&&r._cfg.tobeRemoved.push(a):a.parentNode.removeChild(a)),(t||void 0===t)&&this.destroy(),this},destroy:function(){this.get("destroyed")||(this._attrs=null,this.removeEvent(),this._cfg={destroyed:!0})},toFront:function(){var t=this._cfg,e=t.parent;if(e){var n=e._cfg.children,i=t.el,r=n.indexOf(this);n.splice(r,1),n.push(this),i&&(i.parentNode.removeChild(i),t.el=null)}},toBack:function(){var t=this._cfg,e=t.parent;if(e){var n=e._cfg.children,i=t.el,r=n.indexOf(this);if(n.splice(r,1),n.unshift(this),i){var a=i.parentNode;a.removeChild(i),a.insertBefore(i,a.firstChild)}}},_beforeSetZIndex:function(t){var e=this._cfg.parent;this._cfg.zIndex=t,i.isNil(e)||e.sort();var n=this._cfg.el;if(n){var r=e._cfg.children,a=r.indexOf(this),o=n.parentNode;o.removeChild(n),a===r.length-1?o.appendChild(n):o.insertBefore(n,o.childNodes[a])}return t},_setAttrs:function(t){return this.attr(t),t},setZIndex:function(t){return this._cfg.zIndex=t,this._beforeSetZIndex(t)},clone:function(){return i.clone(this)},getBBox:function(){}}),t.exports=l},function(t,e,n){function i(t,e,n,i){var r=1-i;return r*(r*t+2*i*e)+i*i*n}function r(t,e,n,r,a,s,l,u,c){var h,f,p,g,d,v,y,x=.005,m=1/0,_=[l,u];for(d=0;d<1;d+=.05)p=[i(t,n,a,d),i(e,r,s,d)],(f=o.squaredDistance(_,p))<m&&(h=d,m=f);for(m=1/0,y=0;y<32&&!(x<1e-4);y++){var b=h-x,w=h+x;p=[i(t,n,a,b),i(e,r,s,b)],f=o.squaredDistance(_,p),b>=0&&f<m?(h=b,m=f):(g=[i(t,n,a,w),i(e,r,s,w)],v=o.squaredDistance(_,g),w<=1&&v<m?(h=w,m=v):x*=.5)}return c&&(c.x=i(t,n,a,h),c.y=i(e,r,s,h)),Math.sqrt(m)}var a=n(1),o=a.vec2;t.exports={at:i,projectPoint:function(t,e,n,i,a,o,s,l){var u={};return r(t,e,n,i,a,o,s,l,u),u},pointDistance:r,extrema:function(t,e,n){var i=t+n-2*e;if(a.isNumberEqual(i,0))return[.5];var r=(t-e)/i;return r<=1&&r>=0?[r]:[]}}},function(t,e){t.exports={xAt:function(t,e,n,i,r){return e*Math.cos(t)*Math.cos(r)-n*Math.sin(t)*Math.sin(r)+i},yAt:function(t,e,n,i,r){return e*Math.sin(t)*Math.cos(r)+n*Math.cos(t)*Math.sin(r)+i},xExtrema:function(t,e,n){return Math.atan(-n/e*Math.tan(t))},yExtrema:function(t,e,n){return Math.atan(n/(e*Math.tan(t)))}}},function(t,e,n){function i(t,e,n){return t+e*Math.cos(n)}function r(t,e,n){return t+e*Math.sin(n)}var a=n(1),o=n(6),s=n(37),l=n(38),u=function t(e){t.superclass.constructor.call(this,e)};u.ATTRS={x:0,y:0,r:0,startAngle:0,endAngle:0,clockwise:!1,lineWidth:1,startArrow:!1,endArrow:!1},a.extend(u,o),a.augment(u,{canStroke:!0,type:"arc",getDefaultAttrs:function(){return{x:0,y:0,r:0,startAngle:0,endAngle:0,clockwise:!1,lineWidth:1,startArrow:!1,endArrow:!1}},calculateBox:function(){var t=this._attrs,e=t.x,n=t.y,i=t.r,r=t.startAngle,a=t.endAngle,o=t.clockwise,l=this.getHitLineWidth()/2,u=s.box(e,n,i,r,a,o);return u.minX-=l,u.minY-=l,u.maxX+=l,u.maxY+=l,u},getStartTangent:function(){var t=this._attrs,e=t.x,n=t.y,a=t.startAngle,o=t.r,s=t.clockwise,l=Math.PI/180;s&&(l*=-1);var u=[],c=i(e,o,a+l),h=r(n,o,a+l),f=i(e,o,a),p=r(n,o,a);return u.push([c,h]),u.push([f,p]),u},getEndTangent:function(){var t=this._attrs,e=t.x,n=t.y,a=t.endAngle,o=t.r,s=t.clockwise,l=Math.PI/180,u=[];s&&(l*=-1);var c=i(e,o,a+l),h=r(n,o,a+l),f=i(e,o,a),p=r(n,o,a);return u.push([f,p]),u.push([c,h]),u},createPath:function(t){var e=this._attrs,n=e.x,i=e.y,r=e.r,a=e.startAngle,o=e.endAngle,s=e.clockwise;(t=t||self.get("context")).beginPath(),t.arc(n,i,r,a,o,s)},afterPath:function(t){var e=this._attrs;if(t=t||this.get("context"),e.startArrow){var n=this.getStartTangent();l.addStartArrow(t,e,n[0][0],n[0][1],n[1][0],n[1][1])}if(e.endArrow){var i=this.getEndTangent();l.addEndArrow(t,e,i[0][0],i[0][1],i[1][0],i[1][1])}}}),t.exports=u},function(t,e,n){var i=n(1),r=n(6),a=function t(e){t.superclass.constructor.call(this,e)};a.ATTRS={x:0,y:0,r:0,lineWidth:1},i.extend(a,r),i.augment(a,{canFill:!0,canStroke:!0,type:"circle",getDefaultAttrs:function(){return{lineWidth:1}},calculateBox:function(){var t=this._attrs,e=t.x,n=t.y,i=t.r,r=this.getHitLineWidth()/2+i;return{minX:e-r,minY:n-r,maxX:e+r,maxY:n+r}},createPath:function(t){var e=this._attrs,n=e.x,i=e.y,r=e.r;t.beginPath(),t.arc(n,i,r,0,2*Math.PI,!1),t.closePath()}}),t.exports=a},function(t,e,n){var i=n(1),r=n(6),a=function t(e){t.superclass.constructor.call(this,e)};i.extend(a,r),i.augment(a,{canFill:!0,canStroke:!0,type:"dom",calculateBox:function(){var t=this._attrs,e=t.x,n=t.y,i=t.width,r=t.height,a=this.getHitLineWidth()/2;return{minX:e-a,minY:n-a,maxX:e+i+a,maxY:n+r+a}}}),t.exports=a},function(t,e,n){var i=n(1),r=n(6),a=function t(e){t.superclass.constructor.call(this,e)};a.ATTRS={x:0,y:0,rx:1,ry:1,lineWidth:1},i.extend(a,r),i.augment(a,{canFill:!0,canStroke:!0,type:"ellipse",getDefaultAttrs:function(){return{lineWidth:1}},calculateBox:function(){var t=this._attrs,e=t.x,n=t.y,i=t.rx,r=t.ry,a=this.getHitLineWidth(),o=i+a/2,s=r+a/2;return{minX:e-o,minY:n-s,maxX:e+o,maxY:n+s}},createPath:function(t){var e=this._attrs,n=e.x,r=e.y,a=e.rx,o=e.ry;t=t||self.get("context");var s=a>o?a:o,l=a>o?1:a/o,u=a>o?o/a:1,c=[1,0,0,0,1,0,0,0,1];i.mat3.scale(c,c,[l,u]),i.mat3.translate(c,c,[n,r]),t.beginPath(),t.save(),t.transform(c[0],c[1],c[3],c[4],c[6],c[7]),t.arc(0,0,s,0,2*Math.PI),t.restore(),t.closePath()}}),t.exports=a},function(t,e,n){var i=n(1),r=n(6),a=n(37),o=function t(e){t.superclass.constructor.call(this,e)};o.ATTRS={x:0,y:0,rs:0,re:0,startAngle:0,endAngle:0,clockwise:!1,lineWidth:1},i.extend(o,r),i.augment(o,{canFill:!0,canStroke:!0,type:"fan",getDefaultAttrs:function(){return{clockwise:!1,lineWidth:1,rs:0,re:0}},calculateBox:function(){var t=this._attrs,e=t.x,n=t.y,i=t.rs,r=t.re,o=t.startAngle,s=t.endAngle,l=t.clockwise,u=this.getHitLineWidth(),c=a.box(e,n,i,o,s,l),h=a.box(e,n,r,o,s,l),f=u/2;return{minX:Math.min(c.minX,h.minX)-f,minY:Math.min(c.minY,h.minY)-f,maxX:Math.max(c.maxX,h.maxX)+f,maxY:Math.max(c.maxY,h.maxY)+f}},createPath:function(t){var e=this._attrs,n=e.x,i=e.y,r=e.rs,a=e.re,o=e.startAngle,s=e.endAngle,l=e.clockwise,u={x:Math.cos(o)*r+n,y:Math.sin(o)*r+i},c={x:Math.cos(o)*a+n,y:Math.sin(o)*a+i},h={x:Math.cos(s)*r+n,y:Math.sin(s)*r+i};(t=t||self.get("context")).beginPath(),t.moveTo(u.x,u.y),t.lineTo(c.x,c.y),t.arc(n,i,a,o,s,l),t.lineTo(h.x,h.y),t.arc(n,i,r,s,o,!l),t.closePath()}}),t.exports=o},function(t,e,n){var i=n(1),r=n(6),a=function t(e){t.superclass.constructor.call(this,e)};a.ATTRS={x:0,y:0,img:void 0,width:0,height:0,sx:null,sy:null,swidth:null,sheight:null},i.extend(a,r),i.augment(a,{type:"image",isHitBox:function(){return!1},calculateBox:function(){var t=this._attrs;this._cfg.attrs&&this._cfg.attrs.img===t.img||this._setAttrImg();var e=t.x,n=t.y;return{minX:e,minY:n,maxX:e+t.width,maxY:n+t.height}},_beforeSetLoading:function(t){var e=this.get("canvas");return!1===t&&!0===this.get("toDraw")&&(this._cfg.loading=!1,e.draw()),t},_setAttrImg:function(){var t=this,e=t._attrs,n=e.img;if(!i.isString(n))return n instanceof Image?(e.width||t.attr("width",n.width),e.height||t.attr("height",n.height),n):n instanceof HTMLElement&&i.isString(n.nodeName)&&"CANVAS"===n.nodeName.toUpperCase()?(e.width||t.attr("width",Number(n.getAttribute("width"))),e.height||t.attr("height",Number(n.getAttribute("height"))),n):n instanceof ImageData?(e.width||t.attr("width",n.width),e.height||t.attr("height",n.height),n):null;var r=new Image;r.onload=function(){if(t.get("destroyed"))return!1;t.attr("imgSrc",n),t.attr("img",r);var e=t.get("callback");e&&e.call(t),t.set("loading",!1)},r.src=n,r.crossOrigin="Anonymous",t.set("loading",!0)},drawInner:function(t){this._cfg.hasUpdate&&this._setAttrImg(),this.get("loading")?this.set("toDraw",!0):(this._drawImage(t),this._cfg.hasUpdate=!1)},_drawImage:function(t){var e=this._attrs,n=e.x,r=e.y,a=e.img,o=e.width,s=e.height,l=e.sx,u=e.sy,c=e.swidth,h=e.sheight;this.set("toDraw",!1);var f=a;if(f instanceof ImageData&&((f=new Image).src=a),f instanceof Image||f instanceof HTMLElement&&i.isString(f.nodeName)&&"CANVAS"===f.nodeName.toUpperCase()){if(i.isNil(l)||i.isNil(u)||i.isNil(c)||i.isNil(h))return void t.drawImage(f,n,r,o,s);if(!(i.isNil(l)||i.isNil(u)||i.isNil(c)||i.isNil(h)))return void t.drawImage(f,l,u,c,h,n,r,o,s)}}}),t.exports=a},function(t,e,n){var i=n(1),r=n(6),a=n(38),o=n(36),s=function t(e){t.superclass.constructor.call(this,e)};s.ATTRS={x1:0,y1:0,x2:0,y2:0,lineWidth:1,startArrow:!1,endArrow:!1},i.extend(s,r),i.augment(s,{canStroke:!0,type:"line",getDefaultAttrs:function(){return{lineWidth:1,startArrow:!1,endArrow:!1}},calculateBox:function(){var t=this._attrs,e=t.x1,n=t.y1,i=t.x2,r=t.y2,a=this.getHitLineWidth();return o.box(e,n,i,r,a)},createPath:function(t){var e=this._attrs,n=e.x1,i=e.y1,r=e.x2,a=e.y2;(t=t||self.get("context")).beginPath(),t.moveTo(n,i),t.lineTo(r,a)},afterPath:function(t){var e=this._attrs,n=e.x1,i=e.y1,r=e.x2,o=e.y2;t=t||this.get("context"),e.startArrow&&a.addStartArrow(t,e,r,o,n,i),e.endArrow&&a.addEndArrow(t,e,n,i,r,o)},getPoint:function(t){var e=this._attrs;return{x:o.at(e.x1,e.x2,t),y:o.at(e.y1,e.y2,t)}}}),t.exports=s},function(t,e,n){var i=n(1),r=n(6),a=n(39),o=n(27),s=n(38),l=n(57),u=n(55),c=function t(e){t.superclass.constructor.call(this,e)};c.ATTRS={path:null,lineWidth:1,startArrow:!1,endArrow:!1},i.extend(c,r),i.augment(c,{canFill:!0,canStroke:!0,type:"path",getDefaultAttrs:function(){return{lineWidth:1,startArrow:!1,endArrow:!1}},_afterSetAttrPath:function(t){if(i.isNil(t))return this.setSilent("segments",null),void this.setSilent("box",void 0);var e,n=o.parsePath(t),r=[];if(i.isArray(n)&&0!==n.length&&("M"===n[0][0]||"m"===n[0][0])){for(var s=n.length,l=0;l<n.length;l++){var u=n[l];e=new a(u,e,l===s-1),r.push(e)}this.setSilent("segments",r),this.setSilent("tCache",null),this.setSilent("box",null)}},calculateBox:function(){var t=this.get("segments");if(!t)return null;var e=this.getHitLineWidth(),n=1/0,r=-1/0,a=1/0,o=-1/0;return i.each(t,function(t){t.getBBox(e);var i=t.box;i&&(i.minX<n&&(n=i.minX),i.maxX>r&&(r=i.maxX),i.minY<a&&(a=i.minY),i.maxY>o&&(o=i.maxY))}),n===1/0||a===1/0?{minX:0,minY:0,maxX:0,maxY:0}:{minX:n,minY:a,maxX:r,maxY:o}},_setTcache:function(){var t,e,n,r,a=0,o=0,s=[],l=this._cfg.curve;l&&(i.each(l,function(t,e){n=l[e+1],r=t.length,n&&(a+=u.len(t[r-2],t[r-1],n[1],n[2],n[3],n[4],n[5],n[6]))}),i.each(l,function(i,c){n=l[c+1],r=i.length,n&&((t=[])[0]=o/a,e=u.len(i[r-2],i[r-1],n[1],n[2],n[3],n[4],n[5],n[6]),o+=e,t[1]=o/a,s.push(t))}),this._cfg.tCache=s)},_calculateCurve:function(){var t=this._attrs.path;this._cfg.curve=l.pathTocurve(t)},getStartTangent:function(){var t,e,n,r,a=this.get("segments");if(a.length>1)if(t=a[0].endPoint,e=a[1].endPoint,n=a[1].startTangent,r=[],i.isFunction(n)){var o=n();r.push([t.x-o[0],t.y-o[1]]),r.push([t.x,t.y])}else r.push([e.x,e.y]),r.push([t.x,t.y]);return r},getEndTangent:function(){var t,e,n,r,a=this.get("segments"),o=a.length;if(o>1)if(t=a[o-2].endPoint,e=a[o-1].endPoint,n=a[o-1].endTangent,r=[],i.isFunction(n)){var s=n();r.push([e.x-s[0],e.y-s[1]]),r.push([e.x,e.y])}else r.push([t.x,t.y]),r.push([e.x,e.y]);return r},getPoint:function(t){var e,n,r=this._cfg.tCache;r||(this._calculateCurve(),this._setTcache(),r=this._cfg.tCache);var a=this._cfg.curve;if(!r)return a?{x:a[0][1],y:a[0][2]}:null;i.each(r,function(i,r){t>=i[0]&&t<=i[1]&&(e=(t-i[0])/(i[1]-i[0]),n=r)});var o=a[n];if(i.isNil(o)||i.isNil(n))return null;var s=o.length,l=a[n+1];return{x:u.at(o[s-2],l[1],l[3],l[5],1-e),y:u.at(o[s-1],l[2],l[4],l[6],1-e)}},createPath:function(t){var e=this.get("segments");if(i.isArray(e)){(t=t||this.get("context")).beginPath();for(var n=e.length,r=0;r<n;r++)e[r].draw(t)}},afterPath:function(t){var e=this._attrs,n=this.get("segments"),r=e.path;if(t=t||this.get("context"),i.isArray(n)&&1!==n.length&&(e.startArrow||e.endArrow)&&"z"!==r[r.length-1]&&"Z"!==r[r.length-1]&&!e.fill){var a=this.getStartTangent();s.addStartArrow(t,e,a[0][0],a[0][1],a[1][0],a[1][1]);var o=this.getEndTangent();s.addEndArrow(t,e,o[0][0],o[0][1],o[1][0],o[1][1])}}}),t.exports=c},function(t,e,n){var i=n(1),r=n(6),a=function t(e){t.superclass.constructor.call(this,e)};a.ATTRS={points:null,lineWidth:1},i.extend(a,r),i.augment(a,{canFill:!0,canStroke:!0,type:"polygon",getDefaultAttrs:function(){return{lineWidth:1}},calculateBox:function(){var t=this._attrs.points,e=this.getHitLineWidth();if(!t||0===t.length)return null;var n=1/0,r=1/0,a=-1/0,o=-1/0;i.each(t,function(t){var e=t[0],i=t[1];e<n&&(n=e),e>a&&(a=e),i<r&&(r=i),i>o&&(o=i)});var s=e/2;return{minX:n-s,minY:r-s,maxX:a+s,maxY:o+s}},createPath:function(t){var e=this._attrs.points;e.length<2||((t=t||this.get("context")).beginPath(),i.each(e,function(e,n){0===n?t.moveTo(e[0],e[1]):t.lineTo(e[0],e[1])}),t.closePath())}}),t.exports=a},function(t,e,n){var i=n(1),r=n(6),a=n(38),o=n(36),s=function t(e){t.superclass.constructor.call(this,e)};s.ATTRS={points:null,lineWidth:1,startArrow:!1,endArrow:!1,tCache:null},i.extend(s,r),i.augment(s,{canStroke:!0,type:"polyline",tCache:null,getDefaultAttrs:function(){return{lineWidth:1,startArrow:!1,endArrow:!1}},calculateBox:function(){var t=this._attrs,e=this.getHitLineWidth(),n=t.points;if(!n||0===n.length)return null;var r=1/0,a=1/0,o=-1/0,s=-1/0;i.each(n,function(t){var e=t[0],n=t[1];e<r&&(r=e),e>o&&(o=e),n<a&&(a=n),n>s&&(s=n)});var l=e/2;return{minX:r-l,minY:a-l,maxX:o+l,maxY:s+l}},_setTcache:function(){var t,e,n=this._attrs.points,r=0,a=0,s=[];n&&0!==n.length&&(i.each(n,function(t,e){n[e+1]&&(r+=o.len(t[0],t[1],n[e+1][0],n[e+1][1]))}),r<=0||(i.each(n,function(i,l){n[l+1]&&((t=[])[0]=a/r,e=o.len(i[0],i[1],n[l+1][0],n[l+1][1]),a+=e,t[1]=a/r,s.push(t))}),this.tCache=s))},createPath:function(t){var e,n,i=this._attrs.points;if(!(i.length<2)){for((t=t||this.get("context")).beginPath(),t.moveTo(i[0][0],i[0][1]),n=1,e=i.length-1;n<e;n++)t.lineTo(i[n][0],i[n][1]);t.lineTo(i[e][0],i[e][1])}},getStartTangent:function(){var t=this.__attrs.points,e=[];return e.push([t[1][0],t[1][1]]),e.push([t[0][0],t[0][1]]),e},getEndTangent:function(){var t=this.__attrs.points,e=t.length-1,n=[];return n.push([t[e-1][0],t[e-1][1]]),n.push([t[e][0],t[e][1]]),n},afterPath:function(t){var e=this._attrs,n=e.points,i=n.length-1;t=t||this.get("context"),e.startArrow&&a.addStartArrow(t,e,n[1][0],n[1][1],n[0][0],n[0][1]),e.endArrow&&a.addEndArrow(t,e,n[i-1][0],n[i-1][1],n[i][0],n[i][1])},getPoint:function(t){var e,n,r=this._attrs.points,a=this.tCache;return a||(this._setTcache(),a=this.tCache),i.each(a,function(i,r){t>=i[0]&&t<=i[1]&&(e=(t-i[0])/(i[1]-i[0]),n=r)}),{x:o.at(r[n][0],r[n+1][0],e),y:o.at(r[n][1],r[n+1][1],e)}}}),t.exports=s},function(t,e,n){var i=n(1),r=n(27).parseRadius,a=n(6),o=function t(e){t.superclass.constructor.call(this,e)};o.ATTRS={x:0,y:0,width:0,height:0,radius:0,lineWidth:1},i.extend(o,a),i.augment(o,{canFill:!0,canStroke:!0,type:"rect",getDefaultAttrs:function(){return{lineWidth:1,radius:0}},calculateBox:function(){var t=this._attrs,e=t.x,n=t.y,i=t.width,r=t.height,a=this.getHitLineWidth()/2;return{minX:e-a,minY:n-a,maxX:e+i+a,maxY:n+r+a}},createPath:function(t){var e=this._attrs,n=e.x,i=e.y,a=e.width,o=e.height,s=e.radius;if((t=t||this.get("context")).beginPath(),0===s)t.rect(n,i,a,o);else{var l=r(s);t.moveTo(n+l.r1,i),t.lineTo(n+a-l.r2,i),0!==l.r2&&t.arc(n+a-l.r2,i+l.r2,l.r2,-Math.PI/2,0),t.lineTo(n+a,i+o-l.r3),0!==l.r3&&t.arc(n+a-l.r3,i+o-l.r3,l.r3,0,Math.PI/2),t.lineTo(n+l.r4,i+o),0!==l.r4&&t.arc(n+l.r4,i+o-l.r4,l.r4,Math.PI/2,Math.PI),t.lineTo(n,i+l.r1),0!==l.r1&&t.arc(n+l.r1,i+l.r1,l.r1,Math.PI,1.5*Math.PI),t.closePath()}}}),t.exports=o},function(t,e,n){var i=n(1),r=n(6),a=function t(e){t.superclass.constructor.call(this,e)};a.ATTRS={x:0,y:0,text:null,fontSize:12,fontFamily:"sans-serif",fontStyle:"normal",fontWeight:"normal",fontVariant:"normal",textAlign:"start",textBaseline:"bottom",lineHeight:null,textArr:null},i.extend(a,r),i.augment(a,{canFill:!0,canStroke:!0,type:"text",getDefaultAttrs:function(){return{lineWidth:1,lineCount:1,fontSize:12,fontFamily:"sans-serif",fontStyle:"normal",fontWeight:"normal",fontVariant:"normal",textAlign:"start",textBaseline:"bottom"}},initTransform:function(){var t=this._attrs.fontSize;t&&+t<12&&this.transform([["t",-1*this._attrs.x,-1*this._attrs.y],["s",+t/12,+t/12],["t",this._attrs.x,this._attrs.y]])},_assembleFont:function(){var t=this._attrs,e=t.fontSize,n=t.fontFamily,i=t.fontWeight,r=t.fontStyle,a=t.fontVariant;t.font=[r,a,i,e+"px",n].join(" ")},_setAttrText:function(){var t=this._attrs,e=t.text,n=null;if(i.isString(e)&&-1!==e.indexOf("\n")){var r=(n=e.split("\n")).length;t.lineCount=r}t.textArr=n},_getTextHeight:function(){var t=this._attrs,e=t.lineCount,n=1*t.fontSize;if(e>1){return n*e+this._getSpaceingY()*(e-1)}return n},isHitBox:function(){return!1},calculateBox:function(){var t=this._attrs,e=this._cfg;e.attrs&&!e.hasUpdate||(this._assembleFont(),this._setAttrText()),t.textArr||this._setAttrText();var n=t.x,i=t.y,r=this.measureText();if(!r)return{minX:n,minY:i,maxX:n,maxY:i};var a=this._getTextHeight(),o=t.textAlign,s=t.textBaseline,l=this.getHitLineWidth(),u={x:n,y:i-a};o&&("end"===o||"right"===o?u.x-=r:"center"===o&&(u.x-=r/2)),s&&("top"===s?u.y+=a:"middle"===s&&(u.y+=a/2)),this.set("startPoint",u);var c=l/2;return{minX:u.x-c,minY:u.y-c,maxX:u.x+r+c,maxY:u.y+a+c}},_getSpaceingY:function(){var t=this._attrs,e=t.lineHeight,n=1*t.fontSize;return e?e-n:.14*n},drawInner:function(t){var e=this._attrs,n=this._cfg;n.attrs&&!n.hasUpdate||(this._assembleFont(),this._setAttrText()),t.font=e.font;var r=e.text;if(r){var a=e.textArr,o=e.x,s=e.y;if(t.beginPath(),this.hasStroke()){var l=e.strokeOpacity;i.isNil(l)||1===l||(t.globalAlpha=l),a?this._drawTextArr(t,!1):t.strokeText(r,o,s),t.globalAlpha=1}if(this.hasFill()){var u=e.fillOpacity;i.isNil(u)||1===u||(t.globalAlpha=u),a?this._drawTextArr(t,!0):t.fillText(r,o,s)}n.hasUpdate=!1}},_drawTextArr:function(t,e){var n,r=this._attrs.textArr,a=this._attrs.textBaseline,o=1*this._attrs.fontSize,s=this._getSpaceingY(),l=this._attrs.x,u=this._attrs.y,c=this.getBBox(),h=c.maxY-c.minY;i.each(r,function(i,r){n=u+r*(s+o)-h+o,"middle"===a&&(n+=h-o-(h-o)/2),"top"===a&&(n+=h-o),e?t.fillText(i,l,n):t.strokeText(i,l,n)})},measureText:function(){var t,e=this._attrs,n=e.text,r=e.font,a=e.textArr,o=0;if(!i.isNil(n)){var s=document.createElement("canvas").getContext("2d");return s.save(),s.font=r,a?i.each(a,function(e){t=s.measureText(e).width,o<t&&(o=t),s.restore()}):(o=s.measureText(n).width,s.restore()),o}}}),t.exports=a},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var i=n(59);n.d(e,"interpolate",function(){return i.a});var r=n(122);n.d(e,"interpolateArray",function(){return r.a});var a=n(62);n.d(e,"interpolateBasis",function(){return a.b});var o=n(120);n.d(e,"interpolateBasisClosed",function(){return o.a});var s=n(123);n.d(e,"interpolateDate",function(){return s.a});var l=n(40);n.d(e,"interpolateNumber",function(){return l.a});var u=n(124);n.d(e,"interpolateObject",function(){return u.a});var c=n(205);n.d(e,"interpolateRound",function(){return c.a});var h=n(125);n.d(e,"interpolateString",function(){return h.a});var f=n(206);n.d(e,"interpolateTransformCss",function(){return f.a}),n.d(e,"interpolateTransformSvg",function(){return f.b});var p=n(209);n.d(e,"interpolateZoom",function(){return p.a});var g=n(119);n.d(e,"interpolateRgb",function(){return g.a}),n.d(e,"interpolateRgbBasis",function(){return g.b}),n.d(e,"interpolateRgbBasisClosed",function(){return g.c});var d=n(210);n.d(e,"interpolateHsl",function(){return d.a}),n.d(e,"interpolateHslLong",function(){return d.b});var v=n(211);n.d(e,"interpolateLab",function(){return v.a});var y=n(212);n.d(e,"interpolateHcl",function(){return y.a}),n.d(e,"interpolateHclLong",function(){return y.b});var x=n(213);n.d(e,"interpolateCubehelix",function(){return x.b}),n.d(e,"interpolateCubehelixLong",function(){return x.a});var m=n(214);n.d(e,"quantize",function(){return m.a})},function(t,e,n){"use strict";n.d(e,"a",function(){return i}),n.d(e,"b",function(){return r});var i=Math.PI/180,r=180/Math.PI},function(t,e,n){"use strict";function i(t){return function(e){var n,i,a=e.length,o=new Array(a),s=new Array(a),l=new Array(a);for(n=0;n<a;++n)i=Object(r.f)(e[n]),o[n]=i.r||0,s[n]=i.g||0,l[n]=i.b||0;return o=t(o),s=t(s),l=t(l),i.opacity=1,function(t){return i.r=o(t),i.g=s(t),i.b=l(t),i+""}}}n.d(e,"b",function(){return l}),n.d(e,"c",function(){return u});var r=n(19),a=n(62),o=n(120),s=n(28);e.a=function t(e){function n(t,e){var n=i((t=Object(r.f)(t)).r,(e=Object(r.f)(e)).r),a=i(t.g,e.g),o=i(t.b,e.b),l=Object(s.a)(t.opacity,e.opacity);return function(e){return t.r=n(e),t.g=a(e),t.b=o(e),t.opacity=l(e),t+""}}var i=Object(s.b)(e);return n.gamma=t,n}(1);var l=i(a.b),u=i(o.a)},function(t,e,n){"use strict";var i=n(62);e.a=function(t){var e=t.length;return function(n){var r=Math.floor(((n%=1)<0?++n:n)*e),a=t[(r+e-1)%e],o=t[r%e],s=t[(r+1)%e],l=t[(r+2)%e];return Object(i.a)((n-r/e)*e,a,o,s,l)}}},function(t,e,n){"use strict";e.a=function(t){return function(){return t}}},function(t,e,n){"use strict";var i=n(59);e.a=function(t,e){var n,r=e?e.length:0,a=t?Math.min(r,t.length):0,o=new Array(a),s=new Array(r);for(n=0;n<a;++n)o[n]=Object(i.a)(t[n],e[n]);for(;n<r;++n)s[n]=e[n];return function(t){for(n=0;n<a;++n)s[n]=o[n](t);return s}}},function(t,e,n){"use strict";e.a=function(t,e){var n=new Date;return t=+t,e-=t,function(i){return n.setTime(t+e*i),n}}},function(t,e,n){"use strict";var i=n(59);e.a=function(t,e){var n,r={},a={};null!==t&&"object"==typeof t||(t={}),null!==e&&"object"==typeof e||(e={});for(n in e)n in t?r[n]=Object(i.a)(t[n],e[n]):a[n]=e[n];return function(t){for(n in r)a[n]=r[n](t);return a}}},function(t,e,n){"use strict";var i=n(40),r=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,a=new RegExp(r.source,"g");e.a=function(t,e){var n,o,s,l=r.lastIndex=a.lastIndex=0,u=-1,c=[],h=[];for(t+="",e+="";(n=r.exec(t))&&(o=a.exec(e));)(s=o.index)>l&&(s=e.slice(l,s),c[u]?c[u]+=s:c[++u]=s),(n=n[0])===(o=o[0])?c[u]?c[u]+=o:c[++u]=o:(c[++u]=null,h.push({i:u,x:Object(i.a)(n,o)})),l=a.lastIndex;return l<e.length&&(s=e.slice(l),c[u]?c[u]+=s:c[++u]=s),c.length<2?h[0]?function(t){return function(e){return t(e)+""}}(h[0].x):function(t){return function(){return t}}(e):(e=h.length,function(t){for(var n,i=0;i<e;++i)c[(n=h[i]).i]=n.x(t);return c.join("")})}},function(t,e,n){var i=n(0),r=n(290),a={appear:{duration:450,easing:"easeQuadOut"},update:{duration:450,easing:"easeQuadInOut"},enter:{duration:400,easing:"easeQuadInOut",delay:100},leave:{duration:350,easing:"easeQuadIn"}},o={line:{appear:function(){return r.appear.clipIn},enter:function(){return r.enter.clipIn},leave:function(){return r.leave.lineWidthOut}},path:{appear:function(){return r.appear.clipIn},enter:function(){return r.enter.clipIn},leave:function(){return r.leave.lineWidthOut}},area:{appear:function(){return r.appear.clipIn},enter:function(){return r.enter.fadeIn},leave:function(){return r.leave.fadeOut},cfg:{appear:{duration:500,easing:"easeQuadOut"},update:{duration:450,easing:"easeQuadInOut"},enter:{duration:600,delay:150,easing:"easeQuadInOut"},leave:{easing:"easeQuadOut",duration:350}}},polygon:{appear:function(){return r.appear.zoomIn},enter:function(){return r.enter.zoomIn},leave:function(){return r.leave.zoomOut}},edge:{appear:function(){return r.appear.pathIn},enter:function(){return r.enter.pathIn},leave:function(){return r.leave.pathOut}},interval:{appear:function(t){var e;return t.isPolar?(e=r.appear.zoomIn,(t.isTransposed||"theta"===t.type)&&(e=r.appear.fanIn)):e=t.isRect?t.isTransposed?r.appear.scaleInX:r.appear.scaleInY:r.appear.zoomIn,e},enter:function(t){return t.isRect||t.isTransposed||"theta"===t.type?r.enter.fadeIn:r.enter.zoomIn},leave:function(){return r.leave.fadeOut},update:function(t){if("theta"===t.type)return r.update.fanIn}},point:{appear:function(){return r.appear.zoomIn},enter:function(){return r.enter.zoomIn},leave:function(){return r.leave.zoomOut}},schema:{appear:function(){return r.appear.clipIn},enter:function(){return r.enter.clipIn},leave:function(){return r.leave.lineWidthOut}},contour:null,heatmap:null,label:{appear:function(){return r.appear.fadeIn},enter:function(){return r.enter.fadeIn},leave:function(){return r.leave.fadeOut},cfg:{appear:{duration:900}}},"axis-label":{enter:function(){return r.appear.fadeIn},leave:function(){return r.leave.fadeOut},update:function(t){if(t.isPolar)return r.appear.fadeIn}},"axis-ticks":{enter:function(){return r.appear.fadeIn},leave:function(){return r.leave.fadeOut},update:function(t){if(t.isPolar)return r.appear.fadeIn}},"axis-grid":{enter:function(){return r.appear.fadeIn},leave:function(){return r.leave.fadeOut},update:function(t){if(t.isPolar)return r.appear.fadeIn}},"axis-grid-rect":{enter:function(){return r.appear.fadeIn},leave:function(){return r.leave.fadeOut},update:function(){return r.leave.fadeIn}},labelLine:{appear:function(){return r.appear.pathIn},enter:function(){return r.enter.pathIn},leave:function(){return r.leave.pathOut}}};o.Action=r,o.defaultCfg=a,o.getAnimation=function(t,e,n){var r=this[t];if(r){var a=r[n];if(i.isFunction(a))return a(e)}return!1},o.getAnimateCfg=function(t,e){var n=a[e];return this[t]&&this[t].cfg&&this[t].cfg[e]?i.deepMix({},n,this[t].cfg[e]):n},o.registerAnimation=function(t,e,n){this.Action[t]||(this.Action[t]={}),this.Action[t][e]=n},t.exports=o},function(t,e,n){var i=n(2),r=n(8),a=n(228),o=n(237),s=n(248),l=n(251),u=n(255),c=n(43),h=n(264),f=n(268),p=n(274),g=n(278),d={DOMUtil:a,DomUtil:a,MatrixUtil:c,PathUtil:f,arrayUtil:o,domUtil:a,eventUtil:s,formatUtil:l,mathUtil:u,matrixUtil:c,objectUtil:h,stringUtil:p,pathUtil:f,typeUtil:g,augment:n(89),clone:n(46),debounce:n(284),deepMix:n(47),each:i,extend:n(88),filter:n(63),group:n(144),groupBy:n(146),groupToMap:n(145),indexOf:n(285),isEmpty:n(83),isEqual:n(49),isEqualWith:n(286),map:n(287),mix:r,pick:n(288),throttle:n(289),toArray:n(34),toString:n(23),uniqueId:n(86)};i([a,o,s,l,u,c,h,f,p,g],function(t){r(d,t)}),t.exports=d},function(t,e,n){var i=n(129),r=n(5);t.exports=function(t,e){var n=i(e),a=n.length;if(r(t))return!a;for(var o=0;o<a;o+=1){var s=n[o];if(e[s]!==t[s]||!(s in t))return!1}return!0}},function(t,e,n){var i=n(2),r=n(11),a=Object.keys?function(t){return Object.keys(t)}:function(t){var e=[];return i(t,function(n,i){r(t)&&"prototype"===i||e.push(i)}),e};t.exports=a},function(t,e,n){var i=n(13),r=Array.prototype.splice;t.exports=function(t,e){if(!i(t))return[];for(var n=t?e.length:0,a=n-1;n--;){var o=void 0,s=e[n];n!==a&&s===o||(o=s,r.call(t,s,1))}return t}},function(t,e,n){var i=n(2),r=n(41);t.exports=function(t){var e=[];return i(t,function(t){r(e,t)||e.push(t)}),e}},function(t,e,n){var i=n(4),r=n(11),a=n(2);t.exports=function(t,e){if(i(t)){var n=t[0],o=void 0;o=r(e)?e(t[0]):t[0][e];var s=void 0;return a(t,function(t){(s=r(e)?e(t):t[e])>o&&(n=t,o=s)}),n}}},function(t,e){t.exports=parseInt},function(t,e){t.exports=function(t,e){return t.hasOwnProperty(e)}},function(t,e,n){var i=n(2),r=n(11),a=Object.values?function(t){return Object.values(t)}:function(t){var e=[];return i(t,function(n,i){r(t)&&"prototype"===i||e.push(n)}),e};t.exports=a},function(t,e,n){var i=n(137);t.exports=function(t,e,n,r,a){if(a)return[["M",+t+ +a,e],["l",n-2*a,0],["a",a,a,0,0,1,a,a],["l",0,r-2*a],["a",a,a,0,0,1,-a,a],["l",2*a-n,0],["a",a,a,0,0,1,-a,-a],["l",0,2*a-r],["a",a,a,0,0,1,a,-a],["z"]];var o=[["M",t,e],["l",n,0],["l",0,r],["l",-n,0],["z"]];return o.parsePathArray=i,o}},function(t,e){var n=/,?([a-z]),?/gi;t.exports=function(t){return t.join(",").replace(n,"$1")}},function(t,e,n){var i=n(139),r=function(t,e,n,i){return[t,e,n,i,n,i]},a=function(t,e,n,i,r,a){return[1/3*t+2/3*n,1/3*e+2/3*i,1/3*r+2/3*n,1/3*a+2/3*i,r,a]};t.exports=function(t,e){var n=i(t),o=e&&i(e),s={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},l={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},u=[],c=[],h="",f="",p=void 0,g=function(t,e,n){var i=void 0,o=void 0;if(!t)return["C",e.x,e.y,e.x,e.y,e.x,e.y];switch(!(t[0]in{T:1,Q:1})&&(e.qx=e.qy=null),t[0]){case"M":e.X=t[1],e.Y=t[2];break;case"A":t=["C"].concat(function t(e,n,i,r,a,o,s,l,u,c){i===r&&(i+=1);var h=120*Math.PI/180,f=Math.PI/180*(+a||0),p=[],g=void 0,d=void 0,v=void 0,y=void 0,x=void 0,m=function(t,e,n){return{x:t*Math.cos(n)-e*Math.sin(n),y:t*Math.sin(n)+e*Math.cos(n)}};if(c)d=c[0],v=c[1],y=c[2],x=c[3];else{e=(g=m(e,n,-f)).x,n=g.y,l=(g=m(l,u,-f)).x,u=g.y,e===l&&n===u&&(l+=1,u+=1);var _=(e-l)/2,b=(n-u)/2,w=_*_/(i*i)+b*b/(r*r);w>1&&(i*=w=Math.sqrt(w),r*=w);var S=i*i,M=r*r,C=(o===s?-1:1)*Math.sqrt(Math.abs((S*M-S*b*b-M*_*_)/(S*b*b+M*_*_)));y=C*i*b/r+(e+l)/2,x=C*-r*_/i+(n+u)/2,d=Math.asin(((n-x)/r).toFixed(9)),v=Math.asin(((u-x)/r).toFixed(9)),d=e<y?Math.PI-d:d,v=l<y?Math.PI-v:v,d<0&&(d=2*Math.PI+d),v<0&&(v=2*Math.PI+v),s&&d>v&&(d-=2*Math.PI),!s&&v>d&&(v-=2*Math.PI)}var A=v-d;if(Math.abs(A)>h){var k=v,P=l,T=u;v=d+h*(s&&v>d?1:-1),p=t(l=y+i*Math.cos(v),u=x+r*Math.sin(v),i,r,a,0,s,P,T,[v,k,y,x])}A=v-d;var I=Math.cos(d),O=Math.sin(d),L=Math.cos(v),E=Math.sin(v),D=Math.tan(A/4),F=4/3*i*D,B=4/3*r*D,R=[e,n],j=[e+F*O,n-B*I],N=[l+F*E,u-B*L],z=[l,u];if(j[0]=2*R[0]-j[0],j[1]=2*R[1]-j[1],c)return[j,N,z].concat(p);for(var Y=[],V=0,X=(p=[j,N,z].concat(p).join().split(",")).length;V<X;V++)Y[V]=V%2?m(p[V-1],p[V],f).y:m(p[V],p[V+1],f).x;return Y}.apply(0,[e.x,e.y].concat(t.slice(1))));break;case"S":"C"===n||"S"===n?(i=2*e.x-e.bx,o=2*e.y-e.by):(i=e.x,o=e.y),t=["C",i,o].concat(t.slice(1));break;case"T":"Q"===n||"T"===n?(e.qx=2*e.x-e.qx,e.qy=2*e.y-e.qy):(e.qx=e.x,e.qy=e.y),t=["C"].concat(a(e.x,e.y,e.qx,e.qy,t[1],t[2]));break;case"Q":e.qx=t[1],e.qy=t[2],t=["C"].concat(a(e.x,e.y,t[1],t[2],t[3],t[4]));break;case"L":t=["C"].concat(r(e.x,e.y,t[1],t[2]));break;case"H":t=["C"].concat(r(e.x,e.y,t[1],e.y));break;case"V":t=["C"].concat(r(e.x,e.y,e.x,t[1]));break;case"Z":t=["C"].concat(r(e.x,e.y,e.X,e.Y))}return t},d=function(t,e){if(t[e].length>7){t[e].shift();for(var i=t[e];i.length;)u[e]="A",o&&(c[e]="A"),t.splice(e++,0,["C"].concat(i.splice(0,6)));t.splice(e,1),p=Math.max(n.length,o&&o.length||0)}},v=function(t,e,i,r,a){t&&e&&"M"===t[a][0]&&"M"!==e[a][0]&&(e.splice(a,0,["M",r.x,r.y]),i.bx=0,i.by=0,i.x=t[a][1],i.y=t[a][2],p=Math.max(n.length,o&&o.length||0))};p=Math.max(n.length,o&&o.length||0);for(var y=0;y<p;y++){n[y]&&(h=n[y][0]),"C"!==h&&(u[y]=h,y&&(f=u[y-1])),n[y]=g(n[y],s,f),"A"!==u[y]&&"C"===h&&(u[y]="C"),d(n,y),o&&(o[y]&&(h=o[y][0]),"C"!==h&&(c[y]=h,y&&(f=c[y-1])),o[y]=g(o[y],l,f),"A"!==c[y]&&"C"===h&&(c[y]="C"),d(o,y)),v(n,o,s,l,y),v(o,n,l,s,y);var x=n[y],m=o&&o[y],_=x.length,b=o&&m.length;s.x=x[_-2],s.y=x[_-1],s.bx=parseFloat(x[_-4])||s.x,s.by=parseFloat(x[_-3])||s.y,l.bx=o&&(parseFloat(m[b-4])||l.x),l.by=o&&(parseFloat(m[b-3])||l.y),l.x=o&&m[b-2],l.y=o&&m[b-1]}return o?[n,o]:n}},function(t,e,n){function i(t,e,n,i,r){var a=[];if(null===r&&null===i&&(i=n),t=+t,e=+e,n=+n,i=+i,null!==r){var o=Math.PI/180,s=t+n*Math.cos(-i*o),l=t+n*Math.cos(-r*o);a=[["M",s,e+n*Math.sin(-i*o)],["A",n,n,0,+(r-i>180),0,l,e+n*Math.sin(-r*o)]]}else a=[["M",t,e],["m",0,-i],["a",n,i,0,1,1,0,2*i],["a",n,i,0,1,1,0,-2*i],["z"]];return a}var r=n(140),a=n(141);t.exports=function(t){if(!(t=r(t))||!t.length)return[["M",0,0]];var e=[],n=0,o=0,s=0,l=0,u=0,c=void 0,h=void 0;"M"===t[0][0]&&(s=n=+t[0][1],l=o=+t[0][2],u++,e[0]=["M",n,o]);for(var f,p,g=3===t.length&&"M"===t[0][0]&&"R"===t[1][0].toUpperCase()&&"Z"===t[2][0].toUpperCase(),d=u,v=t.length;d<v;d++){if(e.push(f=[]),p=t[d],(c=p[0])!==c.toUpperCase())switch(f[0]=c.toUpperCase(),f[0]){case"A":f[1]=p[1],f[2]=p[2],f[3]=p[3],f[4]=p[4],f[5]=p[5],f[6]=+p[6]+n,f[7]=+p[7]+o;break;case"V":f[1]=+p[1]+o;break;case"H":f[1]=+p[1]+n;break;case"R":for(var y=2,x=(h=[n,o].concat(p.slice(1))).length;y<x;y++)h[y]=+h[y]+n,h[++y]=+h[y]+o;e.pop(),e=e.concat(a(h,g));break;case"O":e.pop(),(h=i(n,o,p[1],p[2])).push(h[0]),e=e.concat(h);break;case"U":e.pop(),e=e.concat(i(n,o,p[1],p[2],p[3])),f=["U"].concat(e[e.length-1].slice(-2));break;case"M":s=+p[1]+n,l=+p[2]+o;break;default:for(var m=1,_=p.length;m<_;m++)f[m]=+p[m]+(m%2?n:o)}else if("R"===c)h=[n,o].concat(p.slice(1)),e.pop(),e=e.concat(a(h,g)),f=["R"].concat(p.slice(-2));else if("O"===c)e.pop(),(h=i(n,o,p[1],p[2])).push(h[0]),e=e.concat(h);else if("U"===c)e.pop(),e=e.concat(i(n,o,p[1],p[2],p[3])),f=["U"].concat(e[e.length-1].slice(-2));else for(var b=0,w=p.length;b<w;b++)f[b]=p[b];if("O"!==(c=c.toUpperCase()))switch(f[0]){case"Z":n=+s,o=+l;break;case"H":n=f[1];break;case"V":o=f[1];break;case"M":s=f[f.length-2],l=f[f.length-1];break;default:n=f[f.length-2],o=f[f.length-1]}}return e}},function(t,e){var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i="\t\n\v\f\r 聽釟�釥庘��鈥佲�傗�冣�勨�呪�嗏�団�堚�夆�娾�仧銆�\u2028\u2029",r=new RegExp("([a-z])["+i+",]*((-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?["+i+"]*,?["+i+"]*)+)","ig"),a=new RegExp("(-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?)["+i+"]*,?["+i+"]*","ig");t.exports=function(t){if(!t)return null;if((void 0===t?"undefined":n(t))===n([]))return t;var e={a:7,c:6,o:2,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,u:3,z:0},i=[];return String(t).replace(r,function(t,n,r){var o=[],s=n.toLowerCase();if(r.replace(a,function(t,e){e&&o.push(+e)}),"m"===s&&o.length>2&&(i.push([n].concat(o.splice(0,2))),s="l",n="m"===n?"l":"L"),"o"===s&&1===o.length&&i.push([n,o[0]]),"r"===s)i.push([n].concat(o));else for(;o.length>=e[s]&&(i.push([n].concat(o.splice(0,e[s]))),e[s]););}),i}},function(t,e){t.exports=function(t,e){for(var n=[],i=0,r=t.length;r-2*!e>i;i+=2){var a=[{x:+t[i-2],y:+t[i-1]},{x:+t[i],y:+t[i+1]},{x:+t[i+2],y:+t[i+3]},{x:+t[i+4],y:+t[i+5]}];e?i?r-4===i?a[3]={x:+t[0],y:+t[1]}:r-2===i&&(a[2]={x:+t[0],y:+t[1]},a[3]={x:+t[2],y:+t[3]}):a[0]={x:+t[r-2],y:+t[r-1]}:r-4===i?a[3]=a[2]:i||(a[0]={x:+t[i],y:+t[i+1]}),n.push(["C",(-a[0].x+6*a[1].x+a[2].x)/6,(-a[0].y+6*a[1].y+a[2].y)/6,(a[1].x+6*a[2].x-a[3].x)/6,(a[1].y+6*a[2].y-a[3].y)/6,a[2].x,a[2].y])}return n}},function(t,e,n){var i=n(23);t.exports=function(t){return i(t).toLowerCase()}},function(t,e,n){var i=n(23);t.exports=function(t){return i(t).toUpperCase()}},function(t,e,n){var i=n(145);t.exports=function(t,e){if(!e)return[t];var n=i(t,e),r=[];for(var a in n)r.push(n[a]);return r}},function(t,e,n){var i=n(11),r=n(4),a=n(146);t.exports=function(t,e){if(!e)return{0:t};if(!i(e)){var n=r(e)?e:e.replace(/\s+/g,"").split("*");e=function(t){for(var e="_",i=0,r=n.length;i<r;i++)e+=t[n[i]]&&t[n[i]].toString();return e}}return a(t,e)}},function(t,e,n){var i=n(2),r=n(4),a=Object.prototype.hasOwnProperty;t.exports=function(t,e){if(!e||!r(t))return t;var n={},o=null;return i(t,function(t){o=e(t),a.call(n,o)?n[o].push(t):n[o]=[t]}),n}},function(t,e,n){function i(t,e){return r.isEqualWith(t,e,function(t,e){return t===e})}var r=n(0),a=n(291),o=n(16).Canvas,s=r.DomUtil,l=n(7),u=n(356),c=n(165),h=n(167),f=n(166),p=n(168),g=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return r.mix(e,{id:null,forceFit:!1,container:null,wrapperEl:null,canvas:null,width:500,height:500,pixelRatio:null,backPlot:null,frontPlot:null,plotBackground:null,padding:l.plotCfg.padding,background:null,autoPaddingAppend:5,limitInPlot:!1,renderer:l.renderer,views:[]})},n.init=function(){var e=this.get("viewTheme");this._initCanvas(),this._initPlot(),this._initEvents(),t.prototype.init.call(this);var n=new c.Tooltip({chart:this,viewTheme:e,options:{}});this.set("tooltipController",n);var i=new c.Legend({chart:this,viewTheme:e});this.set("legendController",i),this.set("_id","chart"),this.emit("afterinit")},n._isAutoPadding=function(){var t=this.get("padding");return r.isArray(t)?-1!==t.indexOf("auto"):"auto"===t},n._getAutoPadding=function(){for(var t=this.get("padding"),e=this.get("frontPlot").getBBox(),n=this.get("backPlot"),i=f(n,p(this.get("plotRange"))),a=h(e,i),o=[0-a.minY,a.maxX-this.get("width"),a.maxY-this.get("height"),0-a.minX],s=r.toAllPadding(t),l=0;l<s.length;l++)if("auto"===s[l]){var u=Math.max(0,o[l]);s[l]=u+this.get("autoPaddingAppend")}return s},n._initCanvas=function(){var t=this.get("container"),e=this.get("id");!t&&e&&(t=e,this.set("container",e));var n=this.get("width"),i=this.get("height");if(r.isString(t)){if(!(t=document.getElementById(t)))throw new Error("Please specify the container for the chart!");this.set("container",t)}var a=s.createDom('<div style="position:relative;"></div>');t.appendChild(a),this.set("wrapperEl",a),this.get("forceFit")&&(n=s.getWidth(t,n),this.set("width",n));var l=this.get("renderer"),u=new o({containerDOM:a,width:n,height:i,pixelRatio:"svg"===l?1:this.get("pixelRatio"),renderer:l});this.set("canvas",u)},n._initPlot=function(){this._initPlotBack();var t=this.get("canvas"),e=t.addGroup({zIndex:1}),n=t.addGroup({zIndex:0}),i=t.addGroup({zIndex:3});this.set("backPlot",e),this.set("middlePlot",n),this.set("frontPlot",i)},n._initPlotBack=function(){var t=this.get("canvas"),e=this.get("viewTheme"),n=t.addGroup(u,{padding:this.get("padding"),plotBackground:r.mix({},e.plotBackground,this.get("plotBackground")),background:r.mix({},e.background,this.get("background"))});this.set("plot",n),this.set("plotRange",n.get("plotRange"))},n._initEvents=function(){this.get("forceFit")&&window.addEventListener("resize",r.wrapBehavior(this,"_initForceFitEvent"))},n._initForceFitEvent=function(){var t=setTimeout(r.wrapBehavior(this,"forceFit"),200);clearTimeout(this.get("resizeTimer")),this.set("resizeTimer",t)},n._renderLegends=function(){var t=this.get("options").legends;if(r.isNil(t)||!1!==t){var e=this.get("legendController");if(e.options=t||{},e.plotRange=this.get("plotRange"),t&&t.custom)e.addCustomLegend();else{var n=this.getAllGeoms(),i=[];r.each(n,function(t){var n=t.get("view"),a=t.getAttrsForLegend();r.each(a,function(a){var o=a.type,s=a.getScale(o);if(s.field&&"identity"!==s.type&&!function(t,e){var n=!1;return r.each(t,function(t){var i=[].concat(t.values),r=[].concat(e.values);t.type!==e.type||t.field!==e.field||i.sort().toString()!==r.sort().toString()||(n=!0)}),n}(i,s)){i.push(s);var l=n.getFilteredOutValues(s.field);e.addLegend(s,a,t,l)}})});var a=this.getYScales();0===i.length&&a.length>1&&e.addMixedLegend(a,n)}e.alignLegends()}},n._renderTooltips=function(){var t=this.get("options");if(r.isNil(t.tooltip)||!1!==t.tooltip){var e=this.get("tooltipController");e.options=t.tooltip||{},e.renderTooltip()}},n.getAllGeoms=function(){var t=[];t=t.concat(this.get("geoms"));var e=this.get("views");return r.each(e,function(e){t=t.concat(e.get("geoms"))}),t},n.forceFit=function(){if(this&&!this.destroyed){var t=this.get("container"),e=this.get("width"),n=s.getWidth(t,e);if(0!==n&&n!==e){var i=this.get("height");this.changeSize(n,i)}return this}},n.resetPlot=function(){var t=this.get("plot"),e=this.get("padding");i(e,t.get("padding"))||(t.set("padding",e),t.repaint())},n.changeSize=function(t,e){this.get("canvas").changeSize(t,e);var n=this.get("plot");return this.set("width",t),this.set("height",e),n.repaint(),this.set("keepPadding",!0),this.repaint(),this.set("keepPadding",!1),this.emit("afterchangesize"),this},n.changeWidth=function(t){return this.changeSize(t,this.get("height"))},n.changeHeight=function(t){return this.changeSize(this.get("width"),t)},n.view=function(t){(t=t||{}).theme=this.get("theme"),t.parent=this,t.backPlot=this.get("backPlot"),t.middlePlot=this.get("middlePlot"),t.frontPlot=this.get("frontPlot"),t.canvas=this.get("canvas"),r.isNil(t.animate)&&(t.animate=this.get("animate")),t.options=r.mix({},this._getSharedOptions(),t.options);var e=new a(t);return e.set("_id","view"+this.get("views").length),this.get("views").push(e),this.emit("addview",{view:e}),e},n.removeView=function(t){var e=this.get("views");r.Array.remove(e,t),t.destroy()},n._getSharedOptions=function(){var t=this.get("options"),e={};return r.each(["scales","coord","axes"],function(n){e[n]=r.cloneDeep(t[n])}),e},n.getViewRegion=function(){var t=this.get("plotRange");return{start:t.bl,end:t.tr}},n.legend=function(t,e){var n=this.get("options");n.legends||(n.legends={});var i={};return!1===t?n.legends=!1:r.isObject(t)?i=t:r.isString(t)?i[t]=e:i=e,r.mix(n.legends,i),this},n.tooltip=function(t,e){var n=this.get("options");return n.tooltip||(n.tooltip={}),!1===t?n.tooltip=!1:r.isObject(t)?r.mix(n.tooltip,t):r.mix(n.tooltip,e),this},n.clear=function(){this.emit("beforeclear");for(var e=this.get("views");e.length>0;){e.shift().destroy()}t.prototype.clear.call(this);var n=this.get("canvas");return this.resetPlot(),n.draw(),this.emit("afterclear"),this},n.clearInner=function(){var e=this.get("views");r.each(e,function(t){t.clearInner()});var n=this.get("tooltipController");if(n&&n.clear(),!this.get("keepLegend")){var i=this.get("legendController");i&&i.clear()}t.prototype.clearInner.call(this)},n.drawComponents=function(){t.prototype.drawComponents.call(this),this.get("keepLegend")||this._renderLegends()},n.render=function(){if(!this.get("keepPadding")&&this._isAutoPadding()){this.beforeRender(),this.drawComponents();var e=this._getAutoPadding(),n=this.get("plot");i(n.get("padding"),e)||(n.set("padding",e),n.repaint())}var a=this.get("middlePlot");if(this.get("limitInPlot")&&!a.attr("clip")){var o=r.getClipByRange(this.get("plotRange"));a.attr("clip",o)}t.prototype.render.call(this),this._renderTooltips()},n.repaint=function(){this.get("keepPadding")||this.resetPlot(),t.prototype.repaint.call(this)},n.changeVisible=function(t){var e=this.get("wrapperEl"),n=t?"":"none";e.style.display=n},n.toDataURL=function(){var t=this.get("canvas"),e=this.get("renderer"),n=t.get("el"),i="";if("svg"===e){var r=n.cloneNode(!0),a=document.implementation.createDocumentType("svg","-//W3C//DTD SVG 1.1//EN","http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"),o=document.implementation.createDocument("http://www.w3.org/2000/svg","svg",a);o.replaceChild(r,o.documentElement);var s=(new XMLSerializer).serializeToString(o);i="data:image/svg+xml;charset=utf8,"+encodeURIComponent(s)}else"canvas"===e&&(i=n.toDataURL("image/png"));return i},n.downloadImage=function(t){var e=this,n=document.createElement("a"),i=e.get("renderer"),r=(t||"chart")+("svg"===i?".svg":".png");e.get("canvas").get("timeline").stopAllAnimations(),setTimeout(function(){var t=e.toDataURL();if(window.Blob&&window.URL&&"svg"!==i){for(var a=t.split(","),o=a[0].match(/:(.*?);/)[1],s=atob(a[1]),l=s.length,u=new Uint8Array(l);l--;)u[l]=s.charCodeAt(l);var c=new Blob([u],{type:o});window.navigator.msSaveBlob?window.navigator.msSaveBlob(c,r):n.addEventListener("click",function(){n.download=r,n.href=window.URL.createObjectURL(c)})}else n.addEventListener("click",function(){n.download=r,n.href=t});var h=document.createEvent("MouseEvents");h.initEvent("click",!1,!1),n.dispatchEvent(h)},16)},n.showTooltip=function(t){var e=this.getViewsByPoint(t);if(e.length){this.get("tooltipController").showTooltip(t,e)}return this},n.hideTooltip=function(){return this.get("tooltipController").hideTooltip(),this},n.getTooltipItems=function(t){var e=this.getViewsByPoint(t),n=[];return r.each(e,function(e){var i=e.get("geoms");r.each(i,function(e){var i=e.get("dataArray"),a=[];r.each(i,function(n){var i=e.findPoint(t,n);if(i){var r=e.getTipItems(i);a=a.concat(r)}}),n=n.concat(a)})}),n},n.destroy=function(){this.emit("beforedestroy"),clearTimeout(this.get("resizeTimer"));var e=this.get("canvas"),n=this.get("wrapperEl");n.parentNode.removeChild(n),t.prototype.destroy.call(this),e.destroy(),window.removeEventListener("resize",r.getWrapBehavior(this,"_initForceFitEvent")),this.emit("afterdestroy")},e}(a);t.exports=g},function(t,e,n){var i=n(53),r=n(0),a=function(t){function e(e){var n,i={visible:!0},a=(n=t.call(this)||this).getDefaultCfg();return n._attrs=i,r.assign(i,a,e),n}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){return{}},n.get=function(t){return this._attrs[t]},n.set=function(t,e){this._attrs[t]=e},n.show=function(){this.get("visible")||(this.set("visible",!0),this.changeVisible(!0))},n.hide=function(){this.get("visible")&&(this.set("visible",!1),this.changeVisible(!1))},n.changeVisible=function(){},n.destroy=function(){this._attrs={},this.removeAllListeners(),this.destroyed=!0},e}(i);t.exports=a},function(t,e,n){function i(t,e,n,i){return t[i]+(e[i]-t[i])*n}function r(t){return"#"+a(t[0])+a(t[1])+a(t[2])}function a(t){return t=Math.round(t),1===(t=t.toString(16)).length&&(t="0"+t),t}function o(t){var e=[];return e.push(parseInt(t.substr(1,2),16)),e.push(parseInt(t.substr(3,2),16)),e.push(parseInt(t.substr(5,2),16)),e}var s=n(9),l=n(10),u=n(2),c=/rgba?\(([\s.,0-9]+)\)/,h={},f=null,p={toRGB:function(t){if("#"===t[0]&&7===t.length)return t;f||(f=function(){var t=document.createElement("i");return t.title="Web Colour Picker",t.style.display="none",document.body.appendChild(t),t}());var e;if(h[t])e=h[t];else{f.style.color=t,e=document.defaultView.getComputedStyle(f,"").getPropertyValue("color");e=r(c.exec(e)[1].split(/\s*,\s*/)),h[t]=e}return e},rgb2arr:o,gradient:function(t){var e=[];return l(t)&&(t=t.split("-")),u(t,function(t){-1===t.indexOf("#")&&(t=p.toRGB(t)),e.push(o(t))}),function(t){return function(t,e){(isNaN(e)||!s(e)||e<0)&&(e=0),e>1&&(e=1);var n=t.length-1,a=Math.floor(n*e),o=n*e-a,l=t[a],u=a===n?l:t[a+1];return r([i(l,u,o,0),i(l,u,o,1),i(l,u,o,2)])}(e,t)}}};t.exports=p},function(t,e,n){var i=n(2),r={values:n(64)};t.exports={isAdjust:function(t){return this.adjustNames.indexOf(t)>=0},_getDimValues:function(t){var e={},n=[];if(this.xField&&this.isAdjust("x")&&n.push(this.xField),this.yField&&this.isAdjust("y")&&n.push(this.yField),i(n,function(n){var i=r.values(t,n);i.sort(function(t,e){return t-e}),e[n]=i}),!this.yField&&this.isAdjust("y")){var a=[0,1];e.y=a}return e},adjustData:function(t,e){var n=this,r=n._getDimValues(e);i(t,function(e,a){i(r,function(i,r){n.adjustDim(r,i,e,t.length,a)})})},getAdjustRange:function(t,e,n){var i,r,a=n.indexOf(e),o=n.length;return!this.yField&&this.isAdjust("y")?(i=0,r=1):o>1?(i=0===a?n[0]:n[a-1],r=a===o-1?n[o-1]:n[a+1],0!==a?i+=(e-i)/2:i-=(r-e)/2,a!==o-1?r-=(r-e)/2:r+=(e-n[o-2])/2):(i=0===e?0:e-.5,r=0===e?1:e+.5),{pre:i,next:r}},groupData:function(t,e){var n={};return i(t,function(t){var i=t[e];void 0===i&&(i=t[e]=0),n[i]||(n[i]=[]),n[i].push(t)}),n}}},function(t,e,n){var i={default:n(152),dark:n(304)};t.exports=i},function(t,e){var n,i,r='"-apple-system", BlinkMacSystemFont, "Segoe UI", Roboto,"Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei",SimSun, "sans-serif"',a={defaultColor:"#1890FF",plotCfg:{padding:[20,20,95,80]},fontFamily:r,defaultLegendPosition:"bottom",colors:["#1890FF","#2FC25B","#FACC14","#223273","#8543E0","#13C2C2","#3436C7","#F04864"],colors_16:["#1890FF","#41D9C7","#2FC25B","#FACC14","#E6965C","#223273","#7564CC","#8543E0","#5C8EE6","#13C2C2","#5CA3E6","#3436C7","#B381E6","#F04864","#D598D9"],colors_24:["#1890FF","#66B5FF","#41D9C7","#2FC25B","#6EDB8F","#9AE65C","#FACC14","#E6965C","#57AD71","#223273","#738AE6","#7564CC","#8543E0","#A877ED","#5C8EE6","#13C2C2","#70E0E0","#5CA3E6","#3436C7","#8082FF","#DD81E6","#F04864","#FA7D92","#D598D9"],colors_pie:["#1890FF","#13C2C2","#2FC25B","#FACC14","#F04864","#8543E0","#3436C7","#223273"],colors_pie_16:["#1890FF","#73C9E6","#13C2C2","#6CD9B3","#2FC25B","#9DD96C","#FACC14","#E6965C","#F04864","#D66BCA","#8543E0","#8E77ED","#3436C7","#737EE6","#223273","#7EA2E6"],shapes:{point:["hollowCircle","hollowSquare","hollowDiamond","hollowBowtie","hollowTriangle","hollowHexagon","cross","tick","plus","hyphen","line"],line:["line","dash","dot"],area:["area"]},sizes:[1,10],opacities:[.1,.9],axis:{top:{position:"top",title:null,label:{offset:16,textStyle:{fill:"#545454",fontSize:12,lineHeight:16,textBaseline:"middle",fontFamily:r},autoRotate:!0},line:{lineWidth:1,stroke:"#BFBFBF"},tickLine:{lineWidth:1,stroke:"#BFBFBF",length:4,alignWithLabel:!0}},bottom:{position:"bottom",title:null,label:{offset:16,autoRotate:!0,textStyle:{fill:"#545454",fontSize:12,lineHeight:16,textBaseline:"middle",fontFamily:r}},line:{lineWidth:1,stroke:"#BFBFBF"},tickLine:{lineWidth:1,stroke:"#BFBFBF",length:4,alignWithLabel:!0}},left:{position:"left",title:null,label:{offset:8,autoRotate:!0,textStyle:{fill:"#545454",fontSize:12,lineHeight:16,textBaseline:"middle",fontFamily:r}},line:null,tickLine:null,grid:{zIndex:-1,lineStyle:{stroke:"#E9E9E9",lineWidth:1,lineDash:[3,3]},hideFirstLine:!0}},right:{position:"right",title:null,label:{offset:8,autoRotate:!0,textStyle:{fill:"#545454",fontSize:12,lineHeight:16,textBaseline:"middle",fontFamily:r}},line:null,tickLine:null,grid:{lineStyle:{stroke:"#E9E9E9",lineWidth:1,lineDash:[3,3]},hideFirstLine:!0}},circle:{zIndex:1,title:null,label:{offset:8,textStyle:{fill:"#545454",fontSize:12,lineHeight:16,fontFamily:r}},line:{lineWidth:1,stroke:"#BFBFBF"},tickLine:{lineWidth:1,stroke:"#BFBFBF",length:4,alignWithLabel:!0},grid:{lineStyle:{stroke:"#E9E9E9",lineWidth:1,lineDash:[3,3]},hideFirstLine:!0}},radius:{zIndex:0,label:{offset:12,textStyle:{fill:"#545454",fontSize:12,textBaseline:"middle",lineHeight:16,fontFamily:r}},line:{lineWidth:1,stroke:"#BFBFBF"},tickLine:{lineWidth:1,stroke:"#BFBFBF",length:4,alignWithLabel:!0},grid:{lineStyle:{stroke:"#E9E9E9",lineWidth:1,lineDash:[3,3]},type:"circle"}},helix:{grid:null,label:null,title:null,line:{lineWidth:1,stroke:"#BFBFBF"},tickLine:{lineWidth:1,length:4,stroke:"#BFBFBF",alignWithLabel:!0}}},label:{offset:20,textStyle:{fill:"#545454",fontSize:12,textBaseline:"middle",fontFamily:r}},treemapLabels:{offset:10,textStyle:{fill:"#fff",fontSize:12,textBaseline:"top",fontStyle:"bold",fontFamily:r}},innerLabels:{textStyle:{fill:"#fff",fontSize:12,textBaseline:"middle",fontFamily:r}},thetaLabels:{labelHeight:14,offset:30},legend:{right:{position:"right",layout:"vertical",itemMarginBottom:8,width:16,height:156,title:null,legendStyle:{LIST_CLASS:{textAlign:"left"}},textStyle:{fill:"#8C8C8C",fontSize:12,textAlign:"start",textBaseline:"middle",lineHeight:0,fontFamily:r},unCheckColor:"#bfbfbf"},left:{position:"left",layout:"vertical",itemMarginBottom:8,width:16,height:156,title:null,textStyle:{fill:"#8C8C8C",fontSize:12,textAlign:"start",textBaseline:"middle",lineHeight:20,fontFamily:r},unCheckColor:"#bfbfbf"},top:{position:"top",offset:[0,6],layout:"horizontal",title:null,itemGap:10,width:156,height:16,textStyle:{fill:"#8C8C8C",fontSize:12,textAlign:"start",textBaseline:"middle",lineHeight:20,fontFamily:r},unCheckColor:"#bfbfbf"},bottom:{position:"bottom",offset:[0,6],layout:"horizontal",title:null,itemGap:10,width:156,height:16,textStyle:{fill:"#8C8C8C",fontSize:12,textAlign:"start",textBaseline:"middle",lineHeight:20,fontFamily:r},unCheckColor:"#bfbfbf"},html:(n={},n["g2-legend"]={height:"auto",width:"auto",position:"absolute",overflow:"auto",fontSize:"12px",fontFamily:r,lineHeight:"20px",color:"#8C8C8C"},n["g2-legend-title"]={marginBottom:"4px"},n["g2-legend-list"]={listStyleType:"none",margin:0,padding:0},n["g2-legend-list-item"]={cursor:"pointer",marginBottom:"5px",marginRight:"24px"},n["g2-legend-marker"]={width:"9px",height:"9px",borderRadius:"50%",display:"inline-block",marginRight:"8px",verticalAlign:"middle"},n),gradient:{textStyle:{fill:"#8C8C8C",fontSize:12,textAlign:"center",textBaseline:"middle",lineHeight:20,fontFamily:r},lineStyle:{lineWidth:1,stroke:"#fff"},unCheckColor:"#bfbfbf"},margin:[0,5,24,5],legendMargin:24},tooltip:(i={useHtml:!0,crosshairs:!1,offset:15},i["g2-tooltip"]={position:"absolute",visibility:"hidden",zIndex:8,transition:"visibility 0.2s cubic-bezier(0.23, 1, 0.32, 1), left 0.4s cubic-bezier(0.23, 1, 0.32, 1), top 0.4s cubic-bezier(0.23, 1, 0.32, 1)",backgroundColor:"rgba(255, 255, 255, 0.9)",boxShadow:"0px 0px 10px #aeaeae",borderRadius:"3px",color:"rgb(87, 87, 87)",fontSize:"12px",fontFamily:r,lineHeight:"20px",padding:"10px 10px 6px 10px"},i["g2-tooltip-title"]={marginBottom:"4px"},i["g2-tooltip-list"]={margin:0,listStyleType:"none",padding:0},i["g2-tooltip-list-item"]={marginBottom:"4px"},i["g2-tooltip-marker"]={width:"5px",height:"5px",borderRadius:"50%",display:"inline-block",marginRight:"8px"},i["g2-tooltip-value"]={display:"inline-block",float:"right",marginLeft:"30px"},i),tooltipMarker:{symbol:function(t,e,n){return[["M",t,e],["m",-n,0],["a",n,n,0,1,0,2*n,0],["a",n,n,0,1,0,2*-n,0]]},stroke:"#fff",shadowBlur:10,shadowOffsetX:0,shadowOffSetY:0,shadowColor:"rgba(0,0,0,0.09)",lineWidth:2,radius:4},tooltipCrosshairsRect:{type:"rect",rectStyle:{fill:"#CCD6EC",opacity:.3}},tooltipCrosshairsLine:{lineStyle:{stroke:"rgba(0, 0, 0, 0.25)",lineWidth:1}},shape:{point:{lineWidth:1,fill:"#1890FF",radius:4},hollowPoint:{fill:"#fff",lineWidth:1,stroke:"#1890FF",radius:3},interval:{lineWidth:0,fill:"#1890FF",fillOpacity:.85},hollowInterval:{fill:"#fff",stroke:"#1890FF",fillOpacity:0,lineWidth:2},area:{lineWidth:0,fill:"#1890FF",fillOpacity:.6},polygon:{lineWidth:0,fill:"#1890FF",fillOpacity:1},hollowPolygon:{fill:"#fff",stroke:"#1890FF",fillOpacity:0,lineWidth:2},hollowArea:{fill:"#fff",stroke:"#1890FF",fillOpacity:0,lineWidth:2},line:{stroke:"#1890FF",lineWidth:2,fill:null},edge:{stroke:"#1890FF",lineWidth:1,fill:null},schema:{stroke:"#1890FF",lineWidth:1,fill:null}},guide:{line:{lineStyle:{stroke:"rgba(0, 0, 0, .65)",lineDash:[2,2],lineWidth:1},text:{position:"start",autoRotate:!0,style:{fill:"rgba(0, 0, 0, .45)",fontSize:12,textAlign:"start",fontFamily:r,textBaseline:"bottom"}}},text:{style:{fill:"rgba(0,0,0,.5)",fontSize:12,textBaseline:"middle",textAlign:"start",fontFamily:r}},region:{style:{lineWidth:0,fill:"#000",fillOpacity:.04}},html:{alignX:"middle",alignY:"middle"},dataRegion:{style:{region:{lineWidth:0,fill:"#000000",opacity:.04},text:{textAlign:"center",textBaseline:"bottom",fontSize:12,fill:"rgba(0, 0, 0, .65)"}}},dataMarker:{top:!0,style:{point:{r:3,fill:"#FFFFFF",stroke:"#1890FF",lineWidth:2},line:{stroke:"#A3B1BF",lineWidth:1},text:{fill:"rgba(0, 0, 0, .65)",opacity:1,fontSize:12,textAlign:"start"}},display:{point:!0,line:!0,text:!0},lineLength:20,direction:"upward",autoAdjust:!0}},pixelRatio:null};t.exports=a},function(t,e,n){var i=n(25).Group,r=n(3),a=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){return{zIndex:1,type:"line",lineStyle:null,items:null,alternateColor:null,matrix:null,hideFirstLine:!1,hideLastLine:!1,hightLightZero:!1,zeroLineStyle:{stroke:"#595959",lineDash:[0,0]}}},n._renderUI=function(){t.prototype._renderUI.call(this),this._drawLines()},n._drawLines=function(){var t=this.get("lineStyle"),e=this.get("items");e&&e.length&&(this._precessItems(e),this._drawGridLines(e,t))},n._precessItems=function(t){var e,n=this;r.each(t,function(t,i){e&&n.get("alternateColor")&&n._drawAlternativeBg(t,e,i),e=t})},n._drawGridLines=function(t,e){var n,i,a,o,s=this,l=this.get("type"),u=t.length;"line"===l||"polygon"===l?r.each(t,function(t,c){s.get("hideFirstLine")&&0===c||s.get("hideLastLine")&&c===u-1||(o=t.points,i=[],"line"===l?(i.push(["M",o[0].x,o[0].y]),i.push(["L",o[o.length-1].x,o[o.length-1].y])):r.each(o,function(t,e){0===e?i.push(["M",t.x,t.y]):i.push(["L",t.x,t.y])}),a=s._drawZeroLine(l,c)?r.mix({},s.get("zeroLineStyle"),{path:i}):r.mix({},e,{path:i}),(n=s.addShape("path",{attrs:a})).name="axis-grid",n._id=t._id,n.set("coord",s.get("coord")),s.get("appendInfo")&&n.setSilent("appendInfo",s.get("appendInfo")))}):r.each(t,function(t,l){s.get("hideFirstLine")&&0===l||s.get("hideLastLine")&&l===u-1||(o=t.points,i=[],r.each(o,function(t,e){var n=t.radius;0===e?i.push(["M",t.x,t.y]):i.push(["A",n,n,0,0,t.flag,t.x,t.y])}),a=r.mix({},e,{path:i}),(n=s.addShape("path",{attrs:a})).name="axis-grid",n._id=t._id,n.set("coord",s.get("coord")),s.get("appendInfo")&&n.setSilent("appendInfo",s.get("appendInfo")))})},n._drawZeroLine=function(t,e){var n=this.get("tickValues");return!("line"!==t||!n||0!==n[e]||!this.get("hightLightZero"))},n._drawAlternativeBg=function(t,e,n){var i,a,o,s=this.get("alternateColor");r.isString(s)?a=s:r.isArray(s)&&(a=s[0],o=s[1]),n%2==0?o&&(i=this._getBackItem(e.points,t.points,o)):a&&(i=this._getBackItem(e.points,t.points,a));var l=this.addShape("Path",{attrs:i});l.name="axis-grid-rect",l._id=t._id&&t._id.replace("grid","grid-rect"),l.set("coord",this.get("coord")),this.get("appendInfo")&&l.setSilent("appendInfo",this.get("appendInfo"))},n._getBackItem=function(t,e,n){var i=[],a=this.get("type");if("line"===a)i.push(["M",t[0].x,t[0].y]),i.push(["L",t[t.length-1].x,t[t.length-1].y]),i.push(["L",e[e.length-1].x,e[e.length-1].y]),i.push(["L",e[0].x,e[0].y]),i.push(["Z"]);else if("polygon"===a){r.each(t,function(t,e){0===e?i.push(["M",t.x,t.y]):i.push(["L",t.x,t.y])});for(var o=e.length-1;o>=0;o--)i.push(["L",e[o].x,e[o].y]);i.push(["Z"])}else{var s=t[0].flag;r.each(t,function(t,e){var n=t.radius;0===e?i.push(["M",t.x,t.y]):i.push(["A",n,n,0,0,t.flag,t.x,t.y])});for(var l=e.length-1;l>=0;l--){var u=e[l],c=u.radius;l===e.length-1?i.push(["M",u.x,u.y]):i.push(["A",c,c,0,0,1===s?0:1,u.x,u.y])}}return{fill:n,path:i}},e}(i);t.exports=a},function(t,e,n){var i=n(3),r=i.DomUtil,a=n(32),o={scatter:n(307),map:n(308),treemap:n(309)},s=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{name:"label",type:"default",textStyle:null,formatter:null,items:null,useHtml:!1,containerTpl:'<div class="g-labels" style="position:absolute;top:0;left:0;"></div>',itemTpl:'<div class="g-label" style="position:absolute;">{text}</div>',labelLine:!1,lineGroup:null,shapes:null,config:!0,capture:!0})},n.clear=function(){var e=this.get("group"),n=this.get("container");e&&!e.get("destroyed")&&e.clear(),n&&(n.innerHTML=""),t.prototype.clear.call(this)},n.destroy=function(){var t=this.get("group"),e=this.get("container");t.destroy||t.destroy(),e&&(e.innerHTML="")},n.render=function(){this.clear(),this._init(),this.beforeDraw(),this.draw(),this.afterDraw()},n._dryDraw=function(){var t=this,e=t.get("items"),n=t.getLabels(),r=n.length;i.each(e,function(e,i){if(i<r){var a=n[i];t.changeLabel(a,e)}else{var o=t._addLabel(e,i);o&&(o._id=e._id,o.set("coord",e.coord))}});for(var a=r-1;a>=e.length;a--)n[a].remove();t._adjustLabels(),!t.get("labelLine")&&t.get("config")||t.drawLines()},n.draw=function(){this._dryDraw(),this.get("canvas").draw()},n.changeLabel=function(t,e){if(t)if(t.tagName){var n=this._createDom(e);t.innerHTML=n.innerHTML,this._setCustomPosition(e,t)}else t._id=e._id,t.attr("text",e.text),t.attr("x")===e.x&&t.attr("y")===e.y||(t.resetMatrix(),e.textStyle.rotate&&(t.rotateAtStart(e.textStyle.rotate),delete e.textStyle.rotate),t.attr(e))},n.show=function(){var t=this.get("group"),e=this.get("container");t&&t.show(),e&&(e.style.opacity=1)},n.hide=function(){var t=this.get("group"),e=this.get("container");t&&t.hide(),e&&(e.style.opacity=0)},n.drawLines=function(){var t=this;"boolean"==typeof t.get("labelLine")&&t.set("labelLine",{});var e=t.get("lineGroup");!e||e.get("destroyed")?(e=t.get("group").addGroup({elCls:"x-line-group"}),t.set("lineGroup",e)):e.clear(),i.each(t.get("items"),function(n){t.lineToLabel(n,e)})},n.lineToLabel=function(t,e){if(this.get("config")||t.labelLine){var n=t.labelLine||this.get("labelLine"),r=void 0===t.capture?this.get("capture"):t.capture,a=n.path;if(a&&i.isFunction(n.path)&&(a=n.path(t)),!a){var o=t.start||{x:t.x-t._offset.x,y:t.y-t._offset.y};a=[["M",o.x,o.y],["L",t.x,t.y]]}var s=t.color;s||(s=t.textStyle&&t.textStyle.fill?t.textStyle.fill:"#000");var l=e.addShape("path",{attrs:i.mix({path:a,fill:null,stroke:s},n),capture:r});l.name=this.get("name"),l._id=t._id&&t._id.replace("glabel","glabelline"),l.set("coord",this.get("coord"))}},n._adjustLabels=function(){var t=this.get("type"),e=this.getLabels(),n=this.get("shapes"),i=o[t];"default"!==t&&i&&i(e,n)},n.getLabels=function(){var t=this.get("container");return t?i.toArray(t.childNodes):this.get("group").get("children")},n._addLabel=function(t,e){var n=t;return this.get("config")&&(n=this._getLabelCfg(t,e)),this._createText(n)},n._getLabelCfg=function(t,e){var n=this.get("textStyle")||{},r=this.get("formatter"),a=this.get("htmlTemplate");if(!i.isObject(t)){var o=t;(t={}).text=o}i.isFunction(n)&&(n=n(t.text,t,e)),r&&(t.text=r(t.text,t,e)),a&&(t.useHtml=!0,i.isFunction(a)&&(t.text=a(t.text,t,e))),i.isNil(t.text)&&(t.text=""),t.text=t.text+"";return i.mix({},t,{textStyle:n},{x:t.x||0,y:t.y||0})},n._init=function(){if(!this.get("group")){var t=this.get("canvas").addGroup({id:"label-group"});this.set("group",t)}},n.initHtmlContainer=function(){var t=this.get("container");if(t)i.isString(t)&&(t=document.getElementById(t))&&this.set("container",t);else{var e=this.get("containerTpl"),n=this.get("canvas").get("el").parentNode;t=r.createDom(e),n.style.position="relative",n.appendChild(t),this.set("container",t)}return t},n._createText=function(t){var e,n=this.get("container"),r=void 0===t.capture?this.get("capture"):t.capture;if(!t.useHtml&&!t.htmlTemplate){var a=this.get("name"),o=t.point,s=this.get("group");delete t.point;var l=t.rotate;return t.textStyle&&(t.textStyle.rotate&&(l=t.textStyle.rotate,delete t.textStyle.rotate),t=i.mix({x:t.x,y:t.y,textAlign:t.textAlign,text:t.text},t.textStyle)),e=s.addShape("text",{attrs:t,capture:r}),l&&(Math.abs(l)>2*Math.PI&&(l=l/180*Math.PI),e.transform([["t",-t.x,-t.y],["r",l],["t",t.x,t.y]])),e.setSilent("origin",o||t),e.name=a,this.get("appendInfo")&&e.setSilent("appendInfo",this.get("appendInfo")),e}n||(n=this.initHtmlContainer());var u=this._createDom(t);n.appendChild(u),this._setCustomPosition(t,u)},n._createDom=function(t){var e=this.get("itemTpl"),n=i.substitute(e,{text:t.text});return r.createDom(n)},n._setCustomPosition=function(t,e){var n=t.textAlign||"left",i=t.y,a=t.x,o=r.getOuterWidth(e);i-=r.getOuterHeight(e)/2,"center"===n?a-=o/2:"right"===n&&(a-=o),e.style.top=parseInt(i,10)+"px",e.style.left=parseInt(a,10)+"px"},e}(a);t.exports=s},function(t,e){var n=function(){function t(){this.bitmap=[]}var e=t.prototype;return e.hasGap=function(t){for(var e=!0,n=this.bitmap,i=Math.floor(t.minX),r=Math.ceil(t.maxX),a=Math.floor(t.minY),o=Math.ceil(t.maxY)-1,s=i;s<r;s++)if(n[s]){if(s===i||s===r-1){for(var l=a;l<=o;l++)if(n[s][l]){e=!1;break}}else if(n[s][a]||n[s][o]){e=!1;break}}else n[s]=[];return e},e.fillGap=function(t){for(var e=this.bitmap,n=Math.floor(t.minX),i=Math.ceil(t.maxX)-1,r=Math.floor(t.minY),a=Math.ceil(t.maxY)-1,o=n;o<=i;o++){for(var s=r;s<a;s+=8)e[o]||(e[o]=[]),e[o][s]=!0;e[o][a]=!0}for(var l=r;l<=a;l++)e[n][l]=!0,e[i][l]=!0},t}();t.exports=n},function(t,e,n){var i=n(3);t.exports={getFirstScale:function(t){var e;return i.each(t,function(t){if(t)return e=t,!1}),e}}},function(t,e,n){function i(t,e){var n=null,i=e instanceof u||"legendGroup"===e.name?e.get("value"):e;return a.each(t,function(t){if(t.value===i)return n=t,!1}),n}function r(t,e){return t.findBy(function(t){return t.name===e})}var a=n(3),o=n(158),s=n(14).FONT_FAMILY,l=a.Event,u=a.Group,c=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return a.mix({},e,{type:"category-legend",items:null,itemGap:5,itemMarginBottom:8,itemsGroup:null,layout:"horizontal",allowAllCanceled:!1,backPadding:[0,0,0,0],unCheckColor:"#ccc",background:{fill:"#fff",fillOpacity:0},itemWidth:null,textStyle:{fill:"#333",fontSize:12,textAlign:"start",textBaseline:"middle",fontFamily:s},_wordSpaceing:8,clickable:!0,selectedMode:"multiple",reversed:!1,autoWrap:!0,highlight:!1,activeOpacity:.7,inactiveOpacity:1})},n.render=function(){t.prototype.render.call(this),this._renderItems(),this.get("autoWrap")&&this._adjustItems()},n._bindEvents=function(){this.get("hoverable")&&(this.get("group").on("mousemove",a.wrapBehavior(this,"_onMousemove")),this.get("group").on("mouseleave",a.wrapBehavior(this,"_onMouseleave"))),this.get("clickable")&&this.get("group").on("click",a.wrapBehavior(this,"_onClick"))},n._getLegendItem=function(t){var e=t.get("parent");return e&&"legendGroup"===e.name?e:null},n.activate=function(t){var e=this,n=this,i=void 0;n.get("itemsGroup").get("children").forEach(function(a){if(i=r(a,"legend-marker")){var o=a.get("checked");e.get("highlight")?a.get("value")===t&&o?i.attr("stroke","#333"):i.attr("stroke",null):a.get("value")===t&&i.attr("fillOpacity",n.get("activeOpacity"))}}),this.get("canvas").draw()},n.deactivate=function(){var t=this,e=this,n=e.get("itemsGroup").get("children"),i=void 0,a=this.get("unCheckColor");n.forEach(function(n){if(i=r(n,"legend-marker"))if(t.get("highlight")){var o=i.get("oriStroke"),s=n.get("checked");o=o&&!s?a:"",i.attr("stroke",o)}else i.attr("fillOpacity",e.get("inactiveOpacity"))}),this.get("canvas").draw()},n._onMousemove=function(t){var e=this._getLegendItem(t.currentTarget);if(e&&e.get("checked")){var n=this.get("items"),r=new l("itemhover",t,!0,!0);r.item=i(n,e),r.checked=e.get("checked"),r.currentTarget=t.currentTarget,this.deactivate(),this.activate(e.get("value")),this.emit("itemhover",r)}else this.deactivate(),this.emit("itemunhover",t);this.get("canvas").draw()},n._onMouseleave=function(t){this.deactivate(),this.get("canvas").draw(),this.emit("itemunhover",t)},n._onClick=function(t){var e=this._getLegendItem(t.currentTarget),n=this.get("items");if(e&&!e.get("destroyed")){var o=e.get("checked"),s=this.get("selectedMode"),u=i(n,e),c=new l("itemclick",t,!0,!0);if(c.item=u,c.currentTarget=e,c.appendInfo=t.currentTarget.get("appendInfo"),c.checked="single"===s||!o,!this.get("allowAllCanceled")&&o&&1===this.getCheckedCount())return void this.emit("clicklastitem",c);var h=this.get("unCheckColor"),f=this.get("textStyle").fill,p=void 0,g=void 0,d=void 0;if("single"===s){var v=this.get("itemsGroup").get("children");a.each(v,function(t){p=r(t,"legend-marker"),g=r(t,"legend-text"),d=r(t,"legend-item"),t!==e?(p.attr("fill")&&p.attr("fill",h),p.attr("stroke")&&p.attr("stroke",h),g.attr("fill",h),p.setSilent("checked",!1),g.setSilent("checked",!1),d.setSilent("checked",!1),t.setSilent("checked",!1)):(p.attr("fill")&&u&&u.marker&&p.attr("fill",u.marker.fill),p.attr("stroke")&&u&&u.marker&&p.attr("stroke",u.marker.stroke),g.attr("fill",f),p.setSilent("checked",!0),g.setSilent("checked",!0),d.setSilent("checked",!0),t.setSilent("checked",!0))})}else p=r(e,"legend-marker"),g=r(e,"legend-text"),d=r(e,"legend-item"),p.attr("fill")&&u&&u.marker&&p.attr("fill",o?h:u.marker.fill),p.attr("stroke")&&u&&u.marker&&p.attr("stroke",o?h:u.marker.stroke),g.attr("fill",o?h:f),e.setSilent("checked",!o),p.setSilent("checked",!o),g.setSilent("checked",!o),d.setSilent("checked",!o);this.emit("itemclick",c)}this.get("canvas").draw()},n._renderItems=function(){var t=this,e=this.get("items");if(this.get("reversed")&&e.reverse(),a.each(e,function(e,n){t._addItem(e,n)}),this.get("highlight")){var n=void 0;this.get("itemsGroup").get("children").forEach(function(t){(n=r(t,"legend-marker")).get("oriStroke")||(n.attr("stroke")?n.set("oriStroke",n.attr("stroke")):n.set("oriStroke",""))})}},n._formatItemValue=function(t){var e=this.get("formatter")||this.get("itemFormatter");return e&&(t=e.call(this,t)),t},n._getNextX=function(){var t=this.get("layout"),e=this.get("itemGap"),n=this.get("itemsGroup"),i=this.get("itemWidth"),r=n.get("children"),o=0;return"horizontal"===t&&a.each(r,function(t){o+=(i||t.getBBox().width)+e}),o},n._getNextY=function(){var t=this.get("itemMarginBottom"),e=this.get("titleShape")?this.get("titleGap"):0,n=this.get("layout"),i=this.get("itemsGroup"),r=this.get("titleShape"),o=i.get("children"),s=e;return r&&(s+=r.getBBox().height),"vertical"===n&&a.each(o,function(e){s+=e.getBBox().height+t}),s},n._addItem=function(t){var e=this.get("itemsGroup"),n=this._getNextX(),i=this._getNextY(),r=this.get("unCheckColor"),o=e.addGroup({x:n,y:i,value:t.value,checked:t.checked});o.set("viewId",this.get("viewId"));var l=this.get("textStyle"),u=this.get("_wordSpaceing"),c=0;if(t.marker){var h=a.mix({},t.marker,{x:t.marker.radius+n,y:i});t.checked||(h.fill&&(h.fill=r),h.stroke&&(h.stroke=r));var f=o.addShape("marker",{type:"marker",attrs:h});f.attr("cursor","pointer"),f.name="legend-marker",c+=f.getBBox().width+u}var p=a.mix({},{fill:"#333",fontSize:12,textAlign:"start",textBaseline:"middle",fontFamily:s},l,{x:c+n,y:i,text:this._formatItemValue(t.value)});t.checked||a.mix(p,{fill:r});var g=o.addShape("text",{attrs:p});g.attr("cursor","pointer"),g.name="legend-text",this.get("appendInfo")&&g.setSilent("appendInfo",this.get("appendInfo"));var d=o.getBBox(),v=this.get("itemWidth"),y=o.addShape("rect",{attrs:{x:n,y:i-d.height/2,fill:"#fff",fillOpacity:0,width:v||d.width,height:d.height}});return y.attr("cursor","pointer"),y.setSilent("origin",t),y.name="legend-item",this.get("appendInfo")&&y.setSilent("appendInfo",this.get("appendInfo")),o.name="legendGroup",o},n._adjustHorizontal=function(){var t=this.get("itemsGroup"),e=t.get("children"),n=this.get("maxLength"),i=this.get("itemGap"),r=this.get("itemMarginBottom"),o=this.get("titleShape")?this.get("titleGap"):0,s=0,l=0,u=void 0,c=void 0,h=void 0,f=this.get("itemWidth");t.getBBox().width>n&&a.each(e,function(t){h=t.getBBox(),u=f||h.width,c=h.height+r,n-l<u&&(s++,l=0),t.move(l,s*c+o),l+=u+i})},n._adjustVertical=function(){var t=this.get("itemsGroup"),e=this.get("titleShape"),n=t.get("children"),i=this.get("maxLength"),r=this.get("itemGap"),o=this.get("itemMarginBottom"),s=this.get("titleGap"),l=e?e.getBBox().height+s:0,u=this.get("itemWidth"),c=l,h=void 0,f=void 0,p=void 0,g=0,d=0;t.getBBox().height>i&&a.each(n,function(t){p=t.getBBox(),h=p.width,f=p.height,u?g=u+r:h>g&&(g=h+r),i-c<f?(c=l,d+=g,t.move(d,l)):t.move(d,c),c+=f+o})},n._adjustItems=function(){"horizontal"===this.get("layout")?this._adjustHorizontal():this._adjustVertical()},n.getWidth=function(){return t.prototype.getWidth.call(this)},n.getHeight=function(){return t.prototype.getHeight.call(this)},n.move=function(e,n){t.prototype.move.call(this,e,n)},e}(o);t.exports=c},function(t,e,n){var i=n(3),r=n(32),a=n(14).FONT_FAMILY,o=function(t){function e(e){var n;return(n=t.call(this,e)||this)._init(),n.beforeRender(),n.render(),n._adjustPositionOffset(),n._bindEvents(),n}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){return{container:null,title:null,formatter:null,hoverable:!0,titleGap:15,position:[0,0],offset:[0,0],offsetX:null,offsetY:null}},n._init=function(){var t=this.get("group"),e=this.get("container");this.set("canvas",e.get("canvas"));var n=this.get("position");t||(t=e.addGroup({x:0-n[0],y:0-n[1]})),this.set("group",t)},n._adjustPositionOffset=function(){var t=this.get("position"),e=this.get("offset"),n=this.get("offsetX"),r=this.get("offsetY");if(!i.isArray(e)){e="vertical"===this.get("layout")?[e,0]:[0,e]}n&&(e[0]=n),r&&(e[1]=r);var a=this.get("group").getBBox();this.move(-a.minX+t[0]+e[0],-a.minY+t[1]+e[1])},n.beforeRender=function(){var t=this.get("group").addGroup();this.set("itemsGroup",t)},n.render=function(){this._renderTitle()},n._renderTitle=function(){var t=this.get("title"),e=this.get("titleGap");if(e=e||0,t&&t.text){var n=this.get("group").addShape("text",{attrs:i.mix({x:0,y:0-e,fill:"#333",textBaseline:"middle",fontFamily:a},t)});n.name="legend-title",this.get("appendInfo")&&n.setSilent("appendInfo",this.get("appendInfo")),this.set("titleShape",n)}},n.getCheckedCount=function(){var t=this.get("itemsGroup").get("children");return i.filter(t,function(t){return t.get("checked")}).length},n.setItems=function(t){this.set("items",t),this.clear(),this.render()},n.addItem=function(t){this.get("items").push(t),this.clear(),this.render()},n.clear=function(){this.get("itemsGroup").clear();this.get("group").clear(),this.beforeRender()},n.destroy=function(){this.get("group").destroy(),this._attrs={},this.removeAllListeners(),this.destroyed=!0},n.getWidth=function(){return this.get("group").getBBox().width},n.getHeight=function(){return this.get("group").getBBox().height},n.move=function(t,e){this.get("group").move(t,e)},n.draw=function(){this.get("canvas").draw()},e}(r);t.exports=o},function(t,e,n){function i(t,e){return t.getElementsByClassName(e)[0]}function r(t,e){var n=t.className;return o.isNil(n)?t:(n=n.split(" ")).indexOf(e)>-1?t:t.parentNode?t.parentNode.className===h?t.parentNode:r(t.parentNode,e):null}function a(t,e){var n=null,i=e instanceof c?e.get("value"):e;return o.each(t,function(t){if(t.value===i)return n=t,!1}),n}var o=n(3),s=n(157),l=n(14).FONT_FAMILY,u=o.DomUtil,c=o.Group,h="g2-legend",f="g2-legend-list",p="g2-legend-list-item",g="g2-legend-marker",d=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return o.mix({},e,{type:"category-legend",container:null,containerTpl:'<div class="'+h+'"><h4 class="g2-legend-title"></h4><ul class="'+f+'"></ul></div>',itemTpl:'<li class="'+p+' item-{index} {checked}" data-color="{originColor}" data-value="{originValue}"><i class="'+g+'" style="background-color:{color};"></i><span class="g2-legend-text">{value}</span></li>',legendStyle:{},textStyle:{fill:"#333",fontSize:12,textAlign:"middle",textBaseline:"top",fontFamily:l},abridgeText:!1,tipTpl:'<div class="textTip"></div>',tipStyle:{display:"none",fontSize:"12px",backgroundColor:"#fff",position:"absolute",width:"auto",height:"auto",padding:"3px",boxShadow:"2px 2px 5px #888"},autoPosition:!0})},n._init=function(){},n.beforeRender=function(){},n.render=function(){this._renderHTML()},n._bindEvents=function(){var t=this,e=i(this.get("legendWrapper"),f);this.get("hoverable")&&(e.onmousemove=function(e){return t._onMousemove(e)},e.onmouseout=function(e){return t._onMouseleave(e)}),this.get("clickable")&&(e.onclick=function(e){return t._onClick(e)})},n._onMousemove=function(t){var e=this.get("items"),n=t.target,i=n.className;if(!((i=i.split(" ")).indexOf(h)>-1||i.indexOf(f)>-1)){var o=r(n,p),s=a(e,o.getAttribute("data-value"));s?(this.deactivate(),this.activate(o.getAttribute("data-value")),this.emit("itemhover",{item:s,currentTarget:o,checked:s.checked})):s||(this.deactivate(),this.emit("itemunhover",t))}},n._onMouseleave=function(t){this.deactivate(),this.emit("itemunhover",t)},n._onClick=function(t){var e=this,n=i(this.get("legendWrapper"),f),s=this.get("unCheckColor"),l=this.get("items"),u=this.get("selectedMode"),c=n.childNodes,d=t.target,v=d.className;if(!((v=v.split(" ")).indexOf(h)>-1||v.indexOf(f)>-1)){var y=r(d,p),x=i(y,"g2-legend-text"),m=i(y,g),_=a(l,y.getAttribute("data-value"));if(_){var b=y.className,w=y.getAttribute("data-color");if("single"===u)_.checked=!0,o.each(c,function(t){if(t!==y){i(t,g).style.backgroundColor=s,t.className=t.className.replace("checked","unChecked"),t.style.color=s;a(l,t.getAttribute("data-value")).checked=!1}else x&&(x.style.color=e.get("textStyle").fill),m&&(m.style.backgroundColor=w),y.className=b.replace("unChecked","checked")});else{var S=-1!==b.indexOf("checked"),M=0;if(o.each(c,function(t){-1!==t.className.indexOf("checked")&&M++}),!this.get("allowAllCanceled")&&S&&1===M)return void this.emit("clicklastitem",{item:_,currentTarget:y,checked:"single"===u||_.checked});_.checked=!_.checked,S?(m&&(m.style.backgroundColor=s),y.className=b.replace("checked","unChecked"),y.style.color=s):(m&&(m.style.backgroundColor=w),y.className=b.replace("unChecked","checked"),y.style.color=this.get("textStyle").fill)}this.emit("itemclick",{item:_,currentTarget:y,checked:"single"===u||_.checked})}}},n.activate=function(t){var e=this,n=this,r=n.get("items"),o=a(r,t);i(n.get("legendWrapper"),f).childNodes.forEach(function(t){var s=i(t,g),l=a(r,t.getAttribute("data-value"));if(e.get("highlight")){if(l===o&&l.checked)return void(s.style.border="1px solid #333")}else l===o?s.style.opacity=n.get("activeOpacity"):l.checked&&(s.style.opacity=n.get("inactiveOpacity"))})},n.deactivate=function(){var t=this,e=this;i(e.get("legendWrapper"),f).childNodes.forEach(function(n){var r=i(n,g);t.get("highlight")?r.style.border="1px solid #fff":r.style.opacity=e.get("inactiveOpacity")})},n._renderHTML=function(){var t=this,e=this.get("container"),n=this.get("title"),r=this.get("containerTpl"),a=u.createDom(r),s=i(a,"g2-legend-title"),c=i(a,f),d=this.get("unCheckColor"),v=o.deepMix({},{CONTAINER_CLASS:{height:"auto",width:"auto",position:"absolute",overflowY:"auto",fontSize:"12px",fontFamily:l,lineHeight:"20px",color:"#8C8C8C"},TITLE_CLASS:{marginBottom:this.get("titleGap")+"px",fontSize:"12px",color:"#333",textBaseline:"middle",fontFamily:l},LIST_CLASS:{listStyleType:"none",margin:0,padding:0,textAlign:"center"},LIST_ITEM_CLASS:{cursor:"pointer",marginBottom:"5px",marginRight:"24px"},MARKER_CLASS:{width:"9px",height:"9px",borderRadius:"50%",display:"inline-block",marginRight:"4px",verticalAlign:"middle"}},this.get("legendStyle"));if(/^\#/.test(e)||"string"==typeof e&&e.constructor===String){var y=e.replace("#","");(e=document.getElementById(y)).appendChild(a)}else{var x=this.get("position"),m={};m="left"===x||"right"===x?{maxHeight:(this.get("maxLength")||e.offsetHeight)+"px"}:{maxWidth:(this.get("maxLength")||e.offsetWidth)+"px"},u.modifyCSS(a,o.mix({},v.CONTAINER_CLASS,m,this.get(h))),e.appendChild(a)}u.modifyCSS(c,o.mix({},v.LIST_CLASS,this.get(f))),s&&(n&&n.text?(s.innerHTML=n.text,u.modifyCSS(s,o.mix({},v.TITLE_CLASS,this.get("g2-legend-title"),n))):a.removeChild(s));var _=this.get("items"),b=this.get("itemTpl"),w=this.get("position"),S=this.get("layout"),M="right"===w||"left"===w||"vertical"===S?"block":"inline-block",C=o.mix({},v.LIST_ITEM_CLASS,{display:M},this.get(p)),A=o.mix({},v.MARKER_CLASS,this.get(g));if(o.each(_,function(e,n){var r,s=e.checked,l=t._formatItemValue(e.value),h=e.marker.fill||e.marker.stroke,f=s?h:d;r=o.isFunction(b)?b(l,f,s,n):b;var p=o.substitute(r,o.mix({},e,{index:n,checked:s?"checked":"unChecked",value:l,color:f,originColor:h,originValue:e.value.replace(/\"/g,"&quot;")})),v=u.createDom(p);v.style.color=t.get("textStyle").fill;var y=i(v,g),x=i(v,"g2-legend-text");if(u.modifyCSS(v,C),y&&u.modifyCSS(y,A),s||(v.style.color=d,y&&(y.style.backgroundColor=d)),c.appendChild(v),t.get("abridgeText")){var m=l,_=v.offsetWidth,w=t.get("textStyle").fontSize;isNaN(w)&&(-1!==w.indexOf("pt")?w=1*parseFloat(w.substr(0,w.length-2))/72*96:-1!==w.indexOf("px")&&(w=parseFloat(w.substr(0,w.length-2))));var S=w*m.length,M=Math.floor(_/w);_<2*w?m="":_<S&&M>1&&(m=m.substr(0,M-1)+"..."),x.innerText=m,v.addEventListener("mouseover",function(){var t=i(a.parentNode,"textTip");t.style.display="block",t.style.left=v.offsetLeft+v.offsetWidth+"px",t.style.top=v.offsetTop+15+"px",t.innerText=l}),v.addEventListener("mouseout",function(){i(a.parentNode,"textTip").style.display="none"})}}),this.get("abridgeText")){var k=this.get("tipTpl"),P=u.createDom(k),T=this.get("tipStyle");u.modifyCSS(P,T),a.parentNode.appendChild(P),P.addEventListener("mouseover",function(){P.style.display="none"})}this.set("legendWrapper",a)},n._adjustPositionOffset=function(){var t=this.get("position"),e=this.get("offset"),n=this.get("offsetX"),i=this.get("offsetY");n&&(e[0]=n),i&&(e[1]=i);var r=this.get("legendWrapper");r.style.left=t[0]+"px",r.style.top=t[1]+"px",r.style.marginLeft=e[0]+"px",r.style.marginTop=e[1]+"px"},n.getWidth=function(){return u.getOuterWidth(this.get("legendWrapper"))},n.getHeight=function(){return u.getOuterHeight(this.get("legendWrapper"))},n.move=function(e,n){/^\#/.test(this.get("container"))?t.prototype.move.call(this,e,n):(u.modifyCSS(this.get("legendWrapper"),{left:e+"px",top:n+"px"}),this.set("x",e),this.set("y",n))},n.destroy=function(){var t=this.get("legendWrapper");t&&t.parentNode&&t.parentNode.removeChild(t)},e}(s);t.exports=d},function(t,e,n){var i=n(32),r=n(3),a=function(t){function e(e){var n;return(n=t.call(this,e)||this)._init_(),n.render(),n}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return r.mix({},e,{type:null,plot:null,plotRange:null,rectStyle:{fill:"#CCD6EC",opacity:.3},lineStyle:{stroke:"rgba(0, 0, 0, 0.25)",lineWidth:1},isTransposed:!1})},n._init_=function(){var t,e=this.get("plot");t="rect"===this.type?e.addGroup({zIndex:0}):e.addGroup(),this.set("container",t)},n._addLineShape=function(t,e){var n=this.get("container").addShape("line",{capture:!1,attrs:t});return this.set("crossLineShape"+e,n),n},n._renderHorizontalLine=function(t,e){var n=r.mix(this.get("lineStyle"),this.get("style")),i=r.mix({x1:e?e.bl.x:t.get("width"),y1:0,x2:e?e.br.x:0,y2:0},n);this._addLineShape(i,"X")},n._renderVerticalLine=function(t,e){var n=r.mix(this.get("lineStyle"),this.get("style")),i=r.mix({x1:0,y1:e?e.bl.y:t.get("height"),x2:0,y2:e?e.tl.y:0},n);this._addLineShape(i,"Y")},n._renderBackground=function(t,e){var n=r.mix(this.get("rectStyle"),this.get("style")),i=this.get("container"),a=r.mix({x:e?e.tl.x:0,y:e?e.tl.y:t.get("height"),width:e?e.br.x-e.bl.x:t.get("width"),height:e?Math.abs(e.tl.y-e.bl.y):t.get("height")},n),o=i.addShape("rect",{attrs:a,capture:!1});return this.set("crosshairsRectShape",o),o},n._updateRectShape=function(t){var e,n=this.get("crosshairsRectShape"),i=this.get("isTransposed"),a=t[0],o=t[t.length-1],s=i?"y":"x",l=i?"height":"width",u=a[s];if(t.length>1&&a[s]>o[s]&&(u=o[s]),this.get("width"))n.attr(s,u-this.get("crosshairs").width/2),n.attr(l,this.get("width"));else if(r.isArray(a.point[s])&&!a.size){var c=a.point[s][1]-a.point[s][0];n.attr(s,a.point[s][0]),n.attr(l,c)}else e=3*a.size/4,n.attr(s,u-e),1===t.length?n.attr(l,3*a.size/2):n.attr(l,Math.abs(o[s]-a[s])+2*e)},n.render=function(){var t=this.get("canvas"),e=this.get("plotRange"),n=this.get("isTransposed");switch(this.clear(),this.get("type")){case"x":this._renderHorizontalLine(t,e);break;case"y":this._renderVerticalLine(t,e);break;case"cross":this._renderHorizontalLine(t,e),this._renderVerticalLine(t,e);break;case"rect":this._renderBackground(t,e);break;default:n?this._renderHorizontalLine(t,e):this._renderVerticalLine(t,e)}},n.show=function(){var e=this.get("container");t.prototype.show.call(this),e.show()},n.hide=function(){var e=this.get("container");t.prototype.hide.call(this),e.hide()},n.clear=function(){var e=this.get("container");this.set("crossLineShapeX",null),this.set("crossLineShapeY",null),this.set("crosshairsRectShape",null),t.prototype.clear.call(this),e.clear()},n.destroy=function(){var e=this.get("container");t.prototype.destroy.call(this),e.remove()},n.setPosition=function(t,e,n){var i=this.get("crossLineShapeX"),r=this.get("crossLineShapeY"),a=this.get("crosshairsRectShape");r&&!r.get("destroyed")&&r.move(t,0),i&&!i.get("destroyed")&&i.move(0,e),a&&!a.get("destroyed")&&this._updateRectShape(n)},e}(i);t.exports=a},function(t,e){var n={_calcTooltipPosition:function(t,e,n,i,r,a){var o=0,s=0,l=20;if(a){var u=a.getBBox();o=u.width,s=u.height,t=u.x,e=u.y,l=5}switch(n){case"inside":t=t+o/2-i/2,e=e+s/2-r/2;break;case"top":t=t+o/2-i/2,e=e-r-l;break;case"left":t=t-i-l,e=e+s/2-r/2;break;case"right":t=t+o+l,e=e+s/2-r/2;break;case"bottom":default:t=t+o/2-i/2,e=e+s+l}return[t,e]},_constraintPositionInBoundary:function(t,e,n,i,r,a){return t+n+20>r?t=(t-=n+20)<0?0:t:t+20<0?t=20:t+=20,e+i+20>a?e=(e-=i+20)<0?0:e:e+20<0?e=20:e+=20,[t,e]},_constraintPositionInPlot:function(t,e,n,i,r,a){return t+n>r.tr.x&&(t-=n+40),t<r.tl.x&&(t=r.tl.x),a||(e+i>r.bl.y&&(e-=i+40),e<r.tl.y&&(e=r.tl.y)),[t,e]}};t.exports=n},function(t,e,n){var i=n(3),r={setMarkers:function(t,e){var n=this.get("markerGroup"),r=this.get("frontPlot");n?n.clear():(n=r.addGroup({zIndex:1,capture:!1}),this.set("markerGroup",n)),i.each(t,function(t){n.addShape("marker",{color:t.color,attrs:i.mix({fill:t.color,symbol:"circle",shadowColor:t.color},e,{x:t.x,y:t.y})})}),this.set("markerItems",t)},clearMarkers:function(){var t=this.get("markerGroup");t&&t.clear()}};t.exports=r},function(t,e,n){function i(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}var r=n(25),a=n(160),o=n(162),s=n(161),l=n(68),u=n(3),c=n(14).FONT_FAMILY,h=u.DomUtil,f=u.MatrixUtil,p=function(t){function e(e){var n;n=t.call(this,e)||this,u.assign(i(i(n)),s),u.assign(i(i(n)),o);var r=n.get("crosshairs");if(r){var l="rect"===r.type?n.get("backPlot"):n.get("frontPlot"),c=new a(u.mix({plot:l,plotRange:n.get("plotRange"),canvas:n.get("canvas")},n.get("crosshairs")));c.hide(),n.set("crosshairGroup",c)}return n._init_(),n.get("items")&&n.render(),n}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return u.mix({},e,{boardStyle:{x:0,y:0,width:100,height:100,fill:"rgba(255, 255, 255, 0.9)",radius:4,stroke:"#e2e2e2",lineWidth:1},titleStyle:{fontFamily:c,text:"",textBaseline:"top",fontSize:12,fill:"rgb(87, 87, 87)",lineHeight:20,padding:20},markerStyle:{radius:4},nameStyle:{fontFamily:c,fontSize:12,fill:"rgb(87, 87, 87)",textBaseline:"middle",textAlign:"start",padding:8},valueStyle:{fontFamily:c,fontSize:12,fill:"rgb(87, 87, 87)",textBaseline:"middle",textAlign:"start",padding:30},padding:{top:20,right:20,bottom:20,left:20},itemGap:10,animationDuration:200})},n._init_=function(){var t=this.get("padding"),e=this.get("frontPlot"),n=e.addGroup({capture:!1});this.set("markerGroup",n);var i=e.addGroup();i.hide(),this.set("container",i);var r=i.addShape("rect",{attrs:u.mix({},this.get("boardStyle"))});this.set("board",r);var a=this.get("titleStyle");if(this.get("showTitle")){var o=i.addShape("text",{attrs:u.mix({x:t.left,y:t.top},a)});this.set("titleShape",o),o.name="tooltip-title"}var s=i.addGroup();s.move(t.left,t.top+a.lineHeight+a.padding),this.set("itemsGroup",s)},n.render=function(){var t=this;t.clear();var e=t.get("container"),n=t.get("board"),i=t.get("showTitle"),r=t.get("titleContent"),a=this.get("titleShape"),o=this.get("itemsGroup"),s=t.get("items"),l=t.get("padding");if(a&&i&&a.attr("text",r),o){var c=t.get("itemGap"),h=0;u.each(s,function(e){var n=t._addItem(e);n.move(0,h),o.add(n);var i=n.getBBox().height;h+=i+c})}var f=e.getBBox(),p=f.width+l.right,g=f.height+l.bottom;n.attr("width",p),n.attr("height",g),t._alignToRight(p)},n.clear=function(){var t=this.get("titleShape"),e=this.get("itemsGroup"),n=this.get("board");t.text="",e.clear(),n.attr("width",0),n.attr("height",0)},n.show=function(){this.get("container").show();var e=this.get("crosshairGroup");e&&e.show();var n=this.get("markerGroup");n&&n.show(),t.prototype.show.call(this),this.get("canvas").draw()},n.hide=function(){this.get("container").hide();var e=this.get("crosshairGroup");e&&e.hide();var n=this.get("markerGroup");n&&n.hide(),t.prototype.hide.call(this),this.get("canvas").draw()},n.destroy=function(){var e=this.get("container"),n=this.get("crosshairGroup");n&&n.destroy();var i=this.get("markerGroup");i&&i.remove(),t.prototype.destroy.call(this),e.remove()},n.setPosition=function(e,n,i){var r,a=this.get("container"),o=this.get("canvas").get("el"),s=h.getWidth(o),l=h.getHeight(o),c=a.getBBox(),p=c.width,g=c.height,d=e,v=n;if(this.get("position")){var y=c.width,x=c.height;e=(r=this._calcTooltipPosition(e,n,this.get("position"),y,x,i))[0],n=r[1]}else e=(r=this._constraintPositionInBoundary(e,n,p,g,s,l))[0],n=r[1];if(this.get("inPlot")){var m=this.get("plotRange");e=(r=this._constraintPositionInPlot(e,n,p,g,m,this.get("enterable")))[0],n=r[1]}var _=this.get("markerItems");u.isEmpty(_)||(d=_[0].x,v=_[0].y);var b=f.transform([1,0,0,0,1,0,0,0,1],[["t",e,n]]);a.stopAnimate(),a.animate({matrix:b},this.get("animationDuration"));var w=this.get("crosshairGroup");if(w){var S=this.get("items");w.setPosition(d,v,S)}t.prototype.setPosition.call(this,e,n)},n._addItem=function(t){var e=new r.Group,n=this.get("markerStyle").radius;if(t.marker){var i=u.mix({},t.marker,{x:t.marker.radius/2,y:0});e.addShape("marker",{attrs:i}),n=t.marker.radius}var a=this.get("nameStyle");e.addShape("text",{attrs:u.mix({x:n+a.padding,y:0,text:t.name},a)});var o=this.get("valueStyle");return e.addShape("text",{attrs:u.mix({x:e.getBBox().width+o.padding,y:0,text:t.value},o)}),e},n._alignToRight=function(t){var e=this,n=this.get("itemsGroup").get("children");u.each(n,function(n){var i=n.get("children")[2],r=i.getBBox().width,a=t-r-2*e.get("padding").right;i.attr("x",a)})},e}(l);t.exports=p},function(t,e,n){var i=n(65),r=n(22),a=n(0),o=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getPointRauis=function(t,e){return r.getPointRadius(t,e)},n.getCirclePoint=function(t,e,n){var i=this.get("coord"),r=i.getCenter(),a=this._isEmitLabels(),o=this.getPointRauis(i,n);if(0===o)return null;if(i.isTransposed&&o>e&&!a){t+=2*Math.asin(e/(2*o))}else o+=e;return{x:r.x+o*Math.cos(t),y:r.y+o*Math.sin(t),angle:t,r:o}},n.getArcPoint=function(t,e){var n;return e=e||0,n=a.isArray(t.x)||a.isArray(t.y)?{x:a.isArray(t.x)?t.x[e]:t.x,y:a.isArray(t.y)?t.y[e]:t.y}:t,this.transLabelPoint(n),n},n.getPointAngle=function(t){var e=this.get("coord");return r.getPointAngle(e,t)},n.getMiddlePoint=function(t){var e=this.get("coord"),n=t.length,i={x:0,y:0};return a.each(t,function(t){i.x+=t.x,i.y+=t.y}),i.x/=n,i.y/=n,i=e.convert(i)},n._isToMiddle=function(t){return t.x.length>2},n.getLabelPoint=function(t,e,n){var i,r=t.text[n],a=1;this._isToMiddle(e)?i=this.getMiddlePoint(e.points):(1===t.text.length&&0===n?n=1:0===n&&(a=-1),i=this.getArcPoint(e,n));var o=this.getDefaultOffset(t);o*=a;var s=this.getPointAngle(i),l=this.getCirclePoint(s,o,i);if(l?(l.text=r,l.angle=s,l.color=e.color):l={text:""},t.autoRotate||void 0===t.autoRotate){var u=l.textStyle?l.textStyle.rotate:null;u||(u=l.rotate||this.getLabelRotate(s,o,e)),l.rotate=u}return l.start={x:i.x,y:i.y},l},n._isEmitLabels=function(){return this.get("label").labelEmit},n.getLabelRotate=function(t){var e;return e=180*t/Math.PI,e+=90,this._isEmitLabels()&&(e-=90),e&&(e>90?e-=180:e<-90&&(e+=180)),e/180*Math.PI},n.getLabelAlign=function(t){var e,n=this.get("coord");if(this._isEmitLabels())e=t.angle<=Math.PI/2&&t.angle>-Math.PI/2?"left":"right";else if(n.isTransposed){var i=n.getCenter(),r=this.getDefaultOffset(t);e=Math.abs(t.x-i.x)<1?"center":t.angle>Math.PI||t.angle<=0?r>0?"left":"right":r>0?"right":"left"}else e="center";return e},e}(i);t.exports=o},function(t,e,n){t.exports={Scale:n(341),Coord:n(342),Axis:n(347),Guide:n(348),Legend:n(351),Tooltip:n(353),Event:n(354)}},function(t,e,n){function i(t,e,n){void 0===n&&(n=1);var i=[t.x,t.y,n];return a.vec3.transformMat3(i,i,e),{x:i[0],y:i[1]}}var r=n(16),a=n(0),o=n(167);t.exports=function(t,e){var n=e;return a.each(t.get("children"),function(t){if(t instanceof r.Group||t instanceof r.Path)n=o(n,t.getBBox());else if(t instanceof r.Text){var e=function(t){var e=t.getBBox(),n={x:e.minX,y:e.minY},r={x:e.maxX,y:e.maxY},a=t.attr("matrix");return n=i(n,a),r=i(r,a),{minX:n.x,minY:n.y,maxX:r.x,maxY:r.y}}(t),s=Math.abs(e.maxX-e.minX),l=Math.abs(e.maxY-e.minY);n=s<l?o(n,a.mix(n,{minX:n.minX-s,maxX:n.maxX+s})):o(n,a.mix(n,{minY:n.minY-l,maxY:n.maxY+l}))}}),n}},function(t,e){t.exports=function(t,e){return{minX:Math.min(t.minX,e.minX),minY:Math.min(t.minY,e.minY),maxX:Math.max(t.maxX,e.maxX),maxY:Math.max(t.maxY,e.maxY)}}},function(t,e){t.exports=function(t){return{minX:t.tl.x,minY:t.tl.y,maxX:t.br.x,maxY:t.br.y}}},function(t,e,n){"use strict";function i(t,e,n,i){this._groups=t,this._parents=e,this._name=n,this._id=i}function r(t){return Object(a.selection)().transition(t)}e.a=i,e.b=r,e.c=function(){return++S};var a=n(72),o=n(441),s=n(442),l=n(443),u=n(444),c=n(445),h=n(446),f=n(447),p=n(448),g=n(449),d=n(450),v=n(451),y=n(452),x=n(453),m=n(454),_=n(455),b=n(456),w=n(362),S=0,M=a.selection.prototype;i.prototype=r.prototype={constructor:i,select:d.a,selectAll:v.a,filter:h.a,merge:f.a,selection:y.a,transition:b.a,call:M.call,nodes:M.nodes,node:M.node,size:M.size,empty:M.empty,each:M.each,on:p.a,attr:o.a,attrTween:s.a,style:x.a,styleTween:m.a,text:_.a,remove:g.a,tween:w.a,delay:l.a,duration:u.a,ease:c.a}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var i=n(58);n.d(e,"now",function(){return i.b}),n.d(e,"timer",function(){return i.c}),n.d(e,"timerFlush",function(){return i.d});var r=n(191);n.d(e,"timeout",function(){return r.a});var a=n(192);n.d(e,"interval",function(){return a.a})},function(t,e,n){var i=n(0),r=i.DomUtil,a=["start","process","end","reset"],o=function(){function t(t,e){var n=this,r=n.getDefaultCfg();i.assign(n,r,t),n.view=n.chart=e,n.canvas=e.get("canvas"),n._bindEvents()}var e=t.prototype;return e.getDefaultCfg=function(){return{startEvent:"mousedown",processEvent:"mousemove",endEvent:"mouseup",resetEvent:"dblclick"}},e._start=function(t){var e=this;e.preStart&&e.preStart(t),e.start(t),e.onStart&&e.onStart(t)},e._process=function(t){var e=this;e.preProcess&&e.preProcess(t),e.process(t),e.onProcess&&e.onProcess(t)},e._end=function(t){var e=this;e.preEnd&&e.preEnd(t),e.end(t),e.onEnd&&e.onEnd(t)},e._reset=function(t){var e=this;e.preReset&&e.preReset(t),e.reset(t),e.onReset&&e.onReset(t)},e.start=function(){},e.process=function(){},e.end=function(){},e.reset=function(){},e._bindEvents=function(){var t=this,e=t.canvas.get("canvasDOM");t._clearEvents(),i.each(a,function(n){var a=i.upperFirst(n);t["_on"+a+"Listener"]=r.addEventListener(e,t[n+"Event"],i.wrapBehavior(t,"_"+n))})},e._clearEvents=function(){var t=this;i.each(a,function(e){var n="_on"+i.upperFirst(e)+"Listener";t[n]&&t[n].remove()})},e.destroy=function(){this._clearEvents()},t}();t.exports=o},function(t,e,n){var i=n(74),r=n(16),a=n(126),o=n(147),s=n(7),l=n(18),u=n(0),c={version:s.version,Animate:a,Chart:o,Global:s,Scale:i,Shape:l,Util:u,G:r,DomUtil:u.DomUtil,MatrixUtil:u.MatrixUtil,PathUtil:u.PathUtil};c.track=function(){console.warn("G2 tracks nothing ;-)")},"undefined"!=typeof window&&(window.G2?console.warn("There are multiple versions of G2. Version "+c.version+"'s reference is 'window.G2_3'"):window.G2=c),t.exports=c},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var i=n(193);n.d(e,"easeLinear",function(){return i.a});var r=n(194);n.d(e,"easeQuad",function(){return r.b}),n.d(e,"easeQuadIn",function(){return r.a}),n.d(e,"easeQuadOut",function(){return r.c}),n.d(e,"easeQuadInOut",function(){return r.b});var a=n(195);n.d(e,"easeCubic",function(){return a.b}),n.d(e,"easeCubicIn",function(){return a.a}),n.d(e,"easeCubicOut",function(){return a.c}),n.d(e,"easeCubicInOut",function(){return a.b});var o=n(196);n.d(e,"easePoly",function(){return o.b}),n.d(e,"easePolyIn",function(){return o.a}),n.d(e,"easePolyOut",function(){return o.c}),n.d(e,"easePolyInOut",function(){return o.b});var s=n(197);n.d(e,"easeSin",function(){return s.b}),n.d(e,"easeSinIn",function(){return s.a}),n.d(e,"easeSinOut",function(){return s.c}),n.d(e,"easeSinInOut",function(){return s.b});var l=n(198);n.d(e,"easeExp",function(){return l.b}),n.d(e,"easeExpIn",function(){return l.a}),n.d(e,"easeExpOut",function(){return l.c}),n.d(e,"easeExpInOut",function(){return l.b});var u=n(199);n.d(e,"easeCircle",function(){return u.b}),n.d(e,"easeCircleIn",function(){return u.a}),n.d(e,"easeCircleOut",function(){return u.c}),n.d(e,"easeCircleInOut",function(){return u.b});var c=n(200);n.d(e,"easeBounce",function(){return c.c}),n.d(e,"easeBounceIn",function(){return c.a}),n.d(e,"easeBounceOut",function(){return c.c}),n.d(e,"easeBounceInOut",function(){return c.b});var h=n(201);n.d(e,"easeBack",function(){return h.b}),n.d(e,"easeBackIn",function(){return h.a}),n.d(e,"easeBackOut",function(){return h.c}),n.d(e,"easeBackInOut",function(){return h.b});var f=n(202);n.d(e,"easeElastic",function(){return f.c}),n.d(e,"easeElasticIn",function(){return f.a}),n.d(e,"easeElasticOut",function(){return f.c}),n.d(e,"easeElasticInOut",function(){return f.b})},function(t,e,n){var i=n(5),r=n(9),a=n(76),o=[0,1,1.2,1.5,1.6,2,2.2,2.4,2.5,3,4,5,6,7.5,8,10],s=[0,1,2,4,5,10];t.exports=function(t){var e=t.min,n=t.max,l=t.interval,u=t.minTickInterval,c=[],h=t.minCount||5,f=t.maxCount||7,p=h===f,g=i(t.minLimit)?-1/0:t.minLimit,d=i(t.maxLimit)?1/0:t.maxLimit,v=(h+f)/2,y=v,x=t.snapArray?t.snapArray:p?o:s;if(e===g&&n===d&&p&&(l=(n-e)/(y-1)),i(e)&&(e=0),i(n)&&(n=0),n===e&&(0===e?n=1:e>0?e=0:n=0,n-e<5&&!l&&n-e>=1&&(l=1)),i(l)){var m=(n-e)/(v-1);l=a.snapFactorTo(m,x,"ceil"),f!==h&&((y=parseInt((n-e)/l,10))>f&&(y=f),y<h&&(y=h),l=a.snapFactorTo((n-e)/(y-1),x,"floor"))}if(r(u)&&l<u&&(l=u),t.interval||f!==h)n=Math.min(a.snapMultiple(n,l,"ceil"),d),e=Math.max(a.snapMultiple(e,l,"floor"),g),y=Math.round((n-e)/l),e=a.fixedBase(e,l),n=a.fixedBase(n,l);else{v=parseInt(v,10);var _,b=(n+e)/2,w=a.snapMultiple(b,l,"ceil"),S=Math.floor((v-2)/2),M=w+S*l;_=v%2==0?w-S*l:w-(S+1)*l,M<n&&(M+=l),_>e&&(_-=l),n=a.fixedBase(M,l),e=a.fixedBase(_,l)}n=Math.min(n,d),e=Math.max(e,g),c.push(e);for(var C=1;C<y;C++){var A=a.fixedBase(l*C+e,l);A<n&&c.push(A)}return c[c.length-1]<n&&c.push(n),{min:e,max:n,interval:l,count:y,ticks:c}}},function(t,e,n){var i=n(17),r=n(9),a=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n._initDefaultCfg=function(){t.prototype._initDefaultCfg.call(this),this.isIdentity=!0,this.type="identity",this.value=null},n.getText=function(){return this.value.toString()},n.scale=function(t){return this.value!==t&&r(t)?t:this.range[0]},n.invert=function(){return this.value},e}(i);i.Identity=a,t.exports=a},function(t,e,n){var i=n(79),r=n(2),a=n(5),o=n(10),s=n(17),l=n(33),u=n(177),c=n(71),h=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n._initDefaultCfg=function(){t.prototype._initDefaultCfg.call(this),this.type="time",this.mask="YYYY-MM-DD"},n.init=function(){var e=this,n=e.values;if(n&&n.length){var i=[],o=1/0,s=o,l=0;r(n,function(t){var n=e._toTimeStamp(t);if(isNaN(n))throw new TypeError("Invalid Time: "+t);o>n?(s=o,o=n):s>n&&(s=n),l<n&&(l=n),i.push(n)}),n.length>1&&(e.minTickInterval=s-o),(a(e.min)||e._toTimeStamp(e.min)>o)&&(e.min=o),(a(e.max)||e._toTimeStamp(e.max)<l)&&(e.max=l)}t.prototype.init.call(this)},n.calculateTicks=function(){var t=this.min,e=this.max,n=this.tickCount,i=this.tickInterval;return u({min:t,max:e,minCount:n,maxCount:n,interval:i,minInterval:this.minTickInterval}).ticks},n.getText=function(t){var e=this.formatter;return t=this.translate(t),t=e?e(t):i.format(t,this.mask)},n.scale=function(e){return o(e)&&(e=this.translate(e)),t.prototype.scale.call(this,e)},n.translate=function(t){return this._toTimeStamp(t)},n._toTimeStamp=function(t){return c.toTimeStamp(t)},e}(l);s.Time=h,t.exports=h},function(t,e,n){function i(t){return new Date(t).getFullYear()}function r(t){return new Date(t,0,1).getTime()}function a(t){return new Date(t).getMonth()}function o(t,e){return new Date(t,e,1).getTime()}var s=n(76),l=n(5),u=[1,2,4,6,8,12],c=36e5,h=864e5;t.exports=function(t){var e,n=t.minInterval,f=[],p=t.min,g=t.max,d=t.interval;if(g===p&&(g=p+h),l(d)){var v=g-p,y=h,x=365*y;d=parseInt(v/(t.maxCount||6),10),n&&n>d&&(d=n);var m=d/x,_=i(p);if(m>.51){for(var b=Math.ceil(m),w=i(g),S=_;S<=w+b;S+=b)f.push(r(S));d=null}else if(m>.0834){for(var M=Math.ceil(m/.0834),C=a(p),A=function(t,e){var n=i(t),r=i(e),o=a(t);return 12*(r-n)+(a(e)-o)%12}(p,g),k=0;k<=A+M;k+=M)f.push(o(_,k+C));d=null}else if(d>.5*y){var P=new Date(p),T=P.getFullYear(),I=P.getMonth(p),O=P.getDate(),L=Math.ceil(d/y),E=function(t,e){return Math.ceil((e-t)/h)}(p,g);d=L*y;for(var D=0;D<E+L;D+=L)f.push(new Date(T,I,O+D).getTime())}else if(d>c){var F=new Date(p),B=F.getFullYear(),R=F.getMonth(p),j=F.getDate(),N=F.getHours(),z=s.snapTo(u,Math.ceil(d/c)),Y=function(t,e){return Math.ceil((e-t)/c)}(p,g);d=z*c;for(var V=0;V<=Y+z;V+=z)f.push(new Date(B,R,j,N+V).getTime())}else if(d>6e4){var X=function(t,e){return Math.ceil((e-t)/6e4)}(p,g),H=Math.ceil(d/6e4);d=6e4*H;for(var W=0;W<=X+H;W+=H)f.push(p+6e4*W)}else{d<1e3&&(d=1e3),p=1e3*Math.floor(p/1e3);var G=Math.ceil((g-p)/1e3),q=Math.ceil(d/1e3);d=1e3*q;for(var U=0;U<G+q;U+=q)f.push(p+1e3*U)}}if(!f.length){p=1e3*Math.floor(p/1e3),e=((g=1e3*Math.ceil(g/1e3))-p)/d;for(var Z=0;Z<=e;Z++)f.push(s.fixedBase(d*Z+p,d))}return{max:g,min:p,interval:d,ticks:f,count:f.length}}},function(t,e,n){var i=n(17),r=n(77),a=n(79),o=n(78),s=n(71),l=n(2),u=n(9),c=n(24),h=n(10),f=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n._initDefaultCfg=function(){t.prototype._initDefaultCfg.call(this),this.type="timeCat",this.sortable=!0,this.tickCount=5,this.mask="YYYY-MM-DD"},n.init=function(){var t=this,e=this.values;l(e,function(n,i){e[i]=t._toTimeStamp(n)}),this.sortable&&e.sort(function(t,e){return t-e}),t.ticks||(t.ticks=this.calculateTicks())},n.calculateTicks=function(){var t,e=this.tickCount;if(e){t=o({maxCount:e,data:this.values,isRounding:this.isRounding}).ticks}else t=this.values;return t},n.translate=function(t){t=this._toTimeStamp(t);var e=this.values.indexOf(t);return-1===e&&(e=u(t)&&t<this.values.length?t:NaN),e},n.scale=function(t){var e,n=this.rangeMin(),i=this.rangeMax(),r=this.translate(t);return e=1===this.values.length||isNaN(r)?r:r>-1?r/(this.values.length-1):0,n+e*(i-n)},n.getText=function(t){var e="",n=this.translate(t);e=n>-1?this.values[n]:t;var i=this.formatter;return e=parseInt(e,10),e=i?i(e):a.format(e,this.mask)},n.getTicks=function(){var t=this,e=this.ticks,n=[];return l(e,function(e){var i;i=c(e)?e:{text:h(e)?e:t.getText(e),value:t.scale(e),tickValue:e},n.push(i)}),n},n._toTimeStamp=function(t){return s.toTimeStamp(t)},e}(r);i.TimeCat=f,t.exports=f},function(t,e,n){function i(t,e){return 1===t?1:Math.log(e)/Math.log(t)}var r=n(2),a=n(17),o=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n._initDefaultCfg=function(){t.prototype._initDefaultCfg.call(this),this.type="log",this.tickCount=10,this.base=2,this._minTick=null},n.calculateTicks=function(){var t,e=this.base;if(this.min<0)throw new Error("The minimum value must be greater than zero!");var n=i(e,this.max);if(this.min>0)t=Math.floor(i(e,this.min));else{var a=this.values,o=this.max;r(a,function(t){t>0&&t<o&&(o=t)}),o===this.max&&(o=this.max/e),o>1&&(o=1),t=Math.floor(i(e,o)),this._minTick=t,this.positiveMin=o}for(var s=n-t,l=this.tickCount,u=Math.ceil(s/l),c=[],h=t;h<n+u;h+=u)c.push(Math.pow(e,h));return 0===this.min&&c.unshift(0),c},n._getScalePercent=function(t){var e=this.max,n=this.min;if(e===n)return 0;if(t<=0)return 0;var r=this.base,a=this.positiveMin;a&&(n=1*a/r);return t<a?t/a/(i(r,e)-i(r,n)):(i(r,t)-i(r,n))/(i(r,e)-i(r,n))},n.scale=function(t){var e=this._getScalePercent(t),n=this.rangeMin();return n+e*(this.rangeMax()-n)},n.invert=function(t){var e,n=this.base,r=i(n,this.max),a=this.rangeMin(),o=this.rangeMax()-a,s=this.positiveMin;if(s){if(0===t)return 0;var l=1/(r-(e=i(n,s/n)))*o;if(t<l)return t/l*s}else e=i(n,this.min);var u=(t-a)/o*(r-e)+e;return Math.pow(n,u)},e}(n(33));a.Log=o,t.exports=o},function(t,e,n){function i(t,e){var n=Math.E;return Math.pow(n,Math.log(e)/t)}var r=n(17),a=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n._initDefaultCfg=function(){t.prototype._initDefaultCfg.call(this),this.type="pow",this.tickCount=10,this.exponent=2},n.calculateTicks=function(){var t,e=this.exponent,n=Math.ceil(i(e,this.max));if((t=this.min>=0?Math.floor(i(e,this.min)):0)>n){var r=n;n=t,t=r}for(var a=n-t,o=this.tickCount,s=Math.ceil(a/o),l=[],u=t;u<n+s;u+=s)l.push(Math.pow(u,e));return l},n._getScalePercent=function(t){var e=this.max,n=this.min;if(e===n)return 0;var r=this.exponent;return(i(r,t)-i(r,n))/(i(r,e)-i(r,n))},n.scale=function(t){var e=this._getScalePercent(t),n=this.rangeMin();return n+e*(this.rangeMax()-n)},n.invert=function(t){var e=(t-this.rangeMin())/(this.rangeMax()-this.rangeMin()),n=this.exponent,r=i(n,this.max),a=i(n,this.min),o=e*(r-a)+a;return Math.pow(o,n)},e}(n(33));r.Pow=a,t.exports=a},function(t,e,n){var i=n(1),r=n(100),a=n(101),o=n(190),s=n(215),l=function t(e){t.superclass.constructor.call(this,e)};l.CFG={eventEnable:!0,width:null,height:null,widthCanvas:null,heightCanvas:null,widthStyle:null,heightStyle:null,containerDOM:null,canvasDOM:null,pixelRatio:null,renderer:"canvas"},i.extend(l,a),i.augment(l,{init:function(){l.superclass.init.call(this),this._setGlobalParam(),this._setContainer(),this._initPainter(),this._scale(),this.get("eventEnable")&&this._registEvents()},getEmitter:function(t,e){if(t){if(!i.isEmpty(t._getEvents()))return t;var n=t.get("parent");if(n&&!e.propagationStopped)return this.getEmitter(n,e)}},_getEventObj:function(t,e,n,i){var a=new r(t,e,!0,!0);return a.x=n.x,a.y=n.y,a.clientX=e.clientX,a.clientY=e.clientY,a.currentTarget=i,a.target=i,a},_triggerEvent:function(t,e){var n,i=this.getPointByClient(e.clientX,e.clientY),r=this.getShape(i.x,i.y,e),a=this.get("el");if("mousemove"===t){var o=this.get("preShape");if(o&&o!==r){var s=this._getEventObj("mouseleave",e,i,o);(n=this.getEmitter(o,e))&&n.emit("mouseleave",s),a.style.cursor="default"}if(r){var l=this._getEventObj("mousemove",e,i,r);if((n=this.getEmitter(r,e))&&n.emit("mousemove",l),o!==r){var u=this._getEventObj("mouseenter",e,i,r);n&&n.emit("mouseenter",u,e)}}else{var c=this._getEventObj("mousemove",e,i,this);this.emit("mousemove",c)}this.set("preShape",r)}else{var h=this._getEventObj(t,e,i,r||this);(n=this.getEmitter(r,e))&&n!==this&&n.emit(t,h),this.emit(t,h)}r&&!r.get("destroyed")&&(a.style.cursor=r.attr("cursor")||"default")},_registEvents:function(){var t=this,e=t.get("el");i.each(["mouseout","mouseover","mousemove","mousedown","mouseleave","mouseup","click","dblclick"],function(n){e.addEventListener(n,function(e){t._triggerEvent(n,e)},!1)}),e.addEventListener("touchstart",function(e){i.isEmpty(e.touches)||t._triggerEvent("touchstart",e.touches[0])},!1),e.addEventListener("touchmove",function(e){i.isEmpty(e.touches)||t._triggerEvent("touchmove",e.touches[0])},!1),e.addEventListener("touchend",function(e){i.isEmpty(e.changedTouches)||t._triggerEvent("touchend",e.changedTouches[0])},!1)},_scale:function(){if("svg"!==this._cfg.renderType){var t=this.get("pixelRatio");this.scale(t,t)}},_setGlobalParam:function(){var t=this.get("renderer")||"canvas";"svg"===t?this.set("pixelRatio",1):this.get("pixelRatio")||this.set("pixelRatio",i.getRatio()),this._cfg.renderType=t;var e=s[t];this._cfg.renderer=e,this._cfg.canvas=this;var n=new o(this);this._cfg.timeline=n},_setContainer:function(){var t=this.get("containerId"),e=this.get("containerDOM");e||(e=document.getElementById(t),this.set("containerDOM",e)),i.modifyCSS(e,{position:"relative"})},_initPainter:function(){var t=this.get("containerDOM"),e=new this._cfg.renderer.painter(t);this._cfg.painter=e,this._cfg.canvasDOM=this._cfg.el=e.canvas,this.changeSize(this.get("width"),this.get("height"))},_resize:function(){var t=this.get("canvasDOM"),e=this.get("widthCanvas"),n=this.get("heightCanvas"),i=this.get("widthStyle"),r=this.get("heightStyle");t.style.width=i,t.style.height=r,t.setAttribute("width",e),t.setAttribute("height",n)},getWidth:function(){var t=this.get("pixelRatio");return this.get("width")*t},getHeight:function(){var t=this.get("pixelRatio");return this.get("height")*t},changeSize:function(t,e){var n=this.get("pixelRatio"),i=t*n,r=e*n;this.set("widthCanvas",i),this.set("heightCanvas",r),this.set("widthStyle",t+"px"),this.set("heightStyle",e+"px"),this.set("width",t),this.set("height",e),this._resize()},getPointByClient:function(t,e){var n=this.get("el"),i=this.get("pixelRatio")||1,r=n.getBoundingClientRect();return{x:(t-r.left)*i,y:(e-r.top)*i}},getClientByPoint:function(t,e){var n=this.get("el").getBoundingClientRect(),i=this.get("pixelRatio")||1;return{clientX:t/i+n.left,clientY:e/i+n.top}},draw:function(){this._cfg.painter.draw(this)},getShape:function(t,e,n){return 3===arguments.length&&this._cfg.renderer.getShape?this._cfg.renderer.getShape.call(this,t,e,n):l.superclass.getShape.call(this,t,e)},getRenderer:function(){return this._cfg.renderType},_drawSync:function(){this._cfg.painter.drawSync(this)},destroy:function(){var t=this._cfg,e=t.containerDOM,n=t.canvasDOM;n&&e&&e.removeChild(n),t.timeline.stop(),l.superclass.destroy.call(this)}}),t.exports=l},function(t,e,n){"use strict";function i(t,e,n){var i=e[0],r=e[1],a=e[2],o=e[3],s=e[4],l=e[5],u=e[6],c=e[7],h=e[8],f=n[0],p=n[1],g=n[2],d=n[3],v=n[4],y=n[5],x=n[6],m=n[7],_=n[8];return t[0]=f*i+p*o+g*u,t[1]=f*r+p*s+g*c,t[2]=f*a+p*l+g*h,t[3]=d*i+v*o+y*u,t[4]=d*r+v*s+y*c,t[5]=d*a+v*l+y*h,t[6]=x*i+m*o+_*u,t[7]=x*r+m*s+_*c,t[8]=x*a+m*l+_*h,t}function r(t,e,n){return t[0]=e[0]-n[0],t[1]=e[1]-n[1],t[2]=e[2]-n[2],t[3]=e[3]-n[3],t[4]=e[4]-n[4],t[5]=e[5]-n[5],t[6]=e[6]-n[6],t[7]=e[7]-n[7],t[8]=e[8]-n[8],t}Object.defineProperty(e,"__esModule",{value:!0}),e.sub=e.mul=void 0,e.create=function(){var t=new a.ARRAY_TYPE(9);return a.ARRAY_TYPE!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[5]=0,t[6]=0,t[7]=0),t[0]=1,t[4]=1,t[8]=1,t},e.fromMat4=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[4],t[4]=e[5],t[5]=e[6],t[6]=e[8],t[7]=e[9],t[8]=e[10],t},e.clone=function(t){var e=new a.ARRAY_TYPE(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},e.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[8]=e[8],t},e.fromValues=function(t,e,n,i,r,o,s,l,u){var c=new a.ARRAY_TYPE(9);return c[0]=t,c[1]=e,c[2]=n,c[3]=i,c[4]=r,c[5]=o,c[6]=s,c[7]=l,c[8]=u,c},e.set=function(t,e,n,i,r,a,o,s,l,u){return t[0]=e,t[1]=n,t[2]=i,t[3]=r,t[4]=a,t[5]=o,t[6]=s,t[7]=l,t[8]=u,t},e.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},e.transpose=function(t,e){if(t===e){var n=e[1],i=e[2],r=e[5];t[1]=e[3],t[2]=e[6],t[3]=n,t[5]=e[7],t[6]=i,t[7]=r}else t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8];return t},e.invert=function(t,e){var n=e[0],i=e[1],r=e[2],a=e[3],o=e[4],s=e[5],l=e[6],u=e[7],c=e[8],h=c*o-s*u,f=-c*a+s*l,p=u*a-o*l,g=n*h+i*f+r*p;return g?(g=1/g,t[0]=h*g,t[1]=(-c*i+r*u)*g,t[2]=(s*i-r*o)*g,t[3]=f*g,t[4]=(c*n-r*l)*g,t[5]=(-s*n+r*a)*g,t[6]=p*g,t[7]=(-u*n+i*l)*g,t[8]=(o*n-i*a)*g,t):null},e.adjoint=function(t,e){var n=e[0],i=e[1],r=e[2],a=e[3],o=e[4],s=e[5],l=e[6],u=e[7],c=e[8];return t[0]=o*c-s*u,t[1]=r*u-i*c,t[2]=i*s-r*o,t[3]=s*l-a*c,t[4]=n*c-r*l,t[5]=r*a-n*s,t[6]=a*u-o*l,t[7]=i*l-n*u,t[8]=n*o-i*a,t},e.determinant=function(t){var e=t[0],n=t[1],i=t[2],r=t[3],a=t[4],o=t[5],s=t[6],l=t[7],u=t[8];return e*(u*a-o*l)+n*(-u*r+o*s)+i*(l*r-a*s)},e.multiply=i,e.translate=function(t,e,n){var i=e[0],r=e[1],a=e[2],o=e[3],s=e[4],l=e[5],u=e[6],c=e[7],h=e[8],f=n[0],p=n[1];return t[0]=i,t[1]=r,t[2]=a,t[3]=o,t[4]=s,t[5]=l,t[6]=f*i+p*o+u,t[7]=f*r+p*s+c,t[8]=f*a+p*l+h,t},e.rotate=function(t,e,n){var i=e[0],r=e[1],a=e[2],o=e[3],s=e[4],l=e[5],u=e[6],c=e[7],h=e[8],f=Math.sin(n),p=Math.cos(n);return t[0]=p*i+f*o,t[1]=p*r+f*s,t[2]=p*a+f*l,t[3]=p*o-f*i,t[4]=p*s-f*r,t[5]=p*l-f*a,t[6]=u,t[7]=c,t[8]=h,t},e.scale=function(t,e,n){var i=n[0],r=n[1];return t[0]=i*e[0],t[1]=i*e[1],t[2]=i*e[2],t[3]=r*e[3],t[4]=r*e[4],t[5]=r*e[5],t[6]=e[6],t[7]=e[7],t[8]=e[8],t},e.fromTranslation=function(t,e){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=e[0],t[7]=e[1],t[8]=1,t},e.fromRotation=function(t,e){var n=Math.sin(e),i=Math.cos(e);return t[0]=i,t[1]=n,t[2]=0,t[3]=-n,t[4]=i,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},e.fromScaling=function(t,e){return t[0]=e[0],t[1]=0,t[2]=0,t[3]=0,t[4]=e[1],t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},e.fromMat2d=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=0,t[3]=e[2],t[4]=e[3],t[5]=0,t[6]=e[4],t[7]=e[5],t[8]=1,t},e.fromQuat=function(t,e){var n=e[0],i=e[1],r=e[2],a=e[3],o=n+n,s=i+i,l=r+r,u=n*o,c=i*o,h=i*s,f=r*o,p=r*s,g=r*l,d=a*o,v=a*s,y=a*l;return t[0]=1-h-g,t[3]=c-y,t[6]=f+v,t[1]=c+y,t[4]=1-u-g,t[7]=p-d,t[2]=f-v,t[5]=p+d,t[8]=1-u-h,t},e.normalFromMat4=function(t,e){var n=e[0],i=e[1],r=e[2],a=e[3],o=e[4],s=e[5],l=e[6],u=e[7],c=e[8],h=e[9],f=e[10],p=e[11],g=e[12],d=e[13],v=e[14],y=e[15],x=n*s-i*o,m=n*l-r*o,_=n*u-a*o,b=i*l-r*s,w=i*u-a*s,S=r*u-a*l,M=c*d-h*g,C=c*v-f*g,A=c*y-p*g,k=h*v-f*d,P=h*y-p*d,T=f*y-p*v,I=x*T-m*P+_*k+b*A-w*C+S*M;return I?(I=1/I,t[0]=(s*T-l*P+u*k)*I,t[1]=(l*A-o*T-u*C)*I,t[2]=(o*P-s*A+u*M)*I,t[3]=(r*P-i*T-a*k)*I,t[4]=(n*T-r*A+a*C)*I,t[5]=(i*A-n*P-a*M)*I,t[6]=(d*S-v*w+y*b)*I,t[7]=(v*_-g*S-y*m)*I,t[8]=(g*w-d*_+y*x)*I,t):null},e.projection=function(t,e,n){return t[0]=2/e,t[1]=0,t[2]=0,t[3]=0,t[4]=-2/n,t[5]=0,t[6]=-1,t[7]=1,t[8]=1,t},e.str=function(t){return"mat3("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+", "+t[6]+", "+t[7]+", "+t[8]+")"},e.frob=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)+Math.pow(t[3],2)+Math.pow(t[4],2)+Math.pow(t[5],2)+Math.pow(t[6],2)+Math.pow(t[7],2)+Math.pow(t[8],2))},e.add=function(t,e,n){return t[0]=e[0]+n[0],t[1]=e[1]+n[1],t[2]=e[2]+n[2],t[3]=e[3]+n[3],t[4]=e[4]+n[4],t[5]=e[5]+n[5],t[6]=e[6]+n[6],t[7]=e[7]+n[7],t[8]=e[8]+n[8],t},e.subtract=r,e.multiplyScalar=function(t,e,n){return t[0]=e[0]*n,t[1]=e[1]*n,t[2]=e[2]*n,t[3]=e[3]*n,t[4]=e[4]*n,t[5]=e[5]*n,t[6]=e[6]*n,t[7]=e[7]*n,t[8]=e[8]*n,t},e.multiplyScalarAndAdd=function(t,e,n,i){return t[0]=e[0]+n[0]*i,t[1]=e[1]+n[1]*i,t[2]=e[2]+n[2]*i,t[3]=e[3]+n[3]*i,t[4]=e[4]+n[4]*i,t[5]=e[5]+n[5]*i,t[6]=e[6]+n[6]*i,t[7]=e[7]+n[7]*i,t[8]=e[8]+n[8]*i,t},e.exactEquals=function(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]&&t[3]===e[3]&&t[4]===e[4]&&t[5]===e[5]&&t[6]===e[6]&&t[7]===e[7]&&t[8]===e[8]},e.equals=function(t,e){var n=t[0],i=t[1],r=t[2],o=t[3],s=t[4],l=t[5],u=t[6],c=t[7],h=t[8],f=e[0],p=e[1],g=e[2],d=e[3],v=e[4],y=e[5],x=e[6],m=e[7],_=e[8];return Math.abs(n-f)<=a.EPSILON*Math.max(1,Math.abs(n),Math.abs(f))&&Math.abs(i-p)<=a.EPSILON*Math.max(1,Math.abs(i),Math.abs(p))&&Math.abs(r-g)<=a.EPSILON*Math.max(1,Math.abs(r),Math.abs(g))&&Math.abs(o-d)<=a.EPSILON*Math.max(1,Math.abs(o),Math.abs(d))&&Math.abs(s-v)<=a.EPSILON*Math.max(1,Math.abs(s),Math.abs(v))&&Math.abs(l-y)<=a.EPSILON*Math.max(1,Math.abs(l),Math.abs(y))&&Math.abs(u-x)<=a.EPSILON*Math.max(1,Math.abs(u),Math.abs(x))&&Math.abs(c-m)<=a.EPSILON*Math.max(1,Math.abs(c),Math.abs(m))&&Math.abs(h-_)<=a.EPSILON*Math.max(1,Math.abs(h),Math.abs(_))};var a=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e.default=t,e}(n(52));e.mul=i,e.sub=r},function(t,e,n){"use strict";function i(){var t=new h.ARRAY_TYPE(2);return h.ARRAY_TYPE!=Float32Array&&(t[0]=0,t[1]=0),t}function r(t,e,n){return t[0]=e[0]-n[0],t[1]=e[1]-n[1],t}function a(t,e,n){return t[0]=e[0]*n[0],t[1]=e[1]*n[1],t}function o(t,e,n){return t[0]=e[0]/n[0],t[1]=e[1]/n[1],t}function s(t,e){var n=e[0]-t[0],i=e[1]-t[1];return Math.sqrt(n*n+i*i)}function l(t,e){var n=e[0]-t[0],i=e[1]-t[1];return n*n+i*i}function u(t){var e=t[0],n=t[1];return Math.sqrt(e*e+n*n)}function c(t){var e=t[0],n=t[1];return e*e+n*n}Object.defineProperty(e,"__esModule",{value:!0}),e.forEach=e.sqrLen=e.sqrDist=e.dist=e.div=e.mul=e.sub=e.len=void 0,e.create=i,e.clone=function(t){var e=new h.ARRAY_TYPE(2);return e[0]=t[0],e[1]=t[1],e},e.fromValues=function(t,e){var n=new h.ARRAY_TYPE(2);return n[0]=t,n[1]=e,n},e.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t},e.set=function(t,e,n){return t[0]=e,t[1]=n,t},e.add=function(t,e,n){return t[0]=e[0]+n[0],t[1]=e[1]+n[1],t},e.subtract=r,e.multiply=a,e.divide=o,e.ceil=function(t,e){return t[0]=Math.ceil(e[0]),t[1]=Math.ceil(e[1]),t},e.floor=function(t,e){return t[0]=Math.floor(e[0]),t[1]=Math.floor(e[1]),t},e.min=function(t,e,n){return t[0]=Math.min(e[0],n[0]),t[1]=Math.min(e[1],n[1]),t},e.max=function(t,e,n){return t[0]=Math.max(e[0],n[0]),t[1]=Math.max(e[1],n[1]),t},e.round=function(t,e){return t[0]=Math.round(e[0]),t[1]=Math.round(e[1]),t},e.scale=function(t,e,n){return t[0]=e[0]*n,t[1]=e[1]*n,t},e.scaleAndAdd=function(t,e,n,i){return t[0]=e[0]+n[0]*i,t[1]=e[1]+n[1]*i,t},e.distance=s,e.squaredDistance=l,e.length=u,e.squaredLength=c,e.negate=function(t,e){return t[0]=-e[0],t[1]=-e[1],t},e.inverse=function(t,e){return t[0]=1/e[0],t[1]=1/e[1],t},e.normalize=function(t,e){var n=e[0],i=e[1],r=n*n+i*i;return r>0&&(r=1/Math.sqrt(r),t[0]=e[0]*r,t[1]=e[1]*r),t},e.dot=function(t,e){return t[0]*e[0]+t[1]*e[1]},e.cross=function(t,e,n){var i=e[0]*n[1]-e[1]*n[0];return t[0]=t[1]=0,t[2]=i,t},e.lerp=function(t,e,n,i){var r=e[0],a=e[1];return t[0]=r+i*(n[0]-r),t[1]=a+i*(n[1]-a),t},e.random=function(t,e){e=e||1;var n=2*h.RANDOM()*Math.PI;return t[0]=Math.cos(n)*e,t[1]=Math.sin(n)*e,t},e.transformMat2=function(t,e,n){var i=e[0],r=e[1];return t[0]=n[0]*i+n[2]*r,t[1]=n[1]*i+n[3]*r,t},e.transformMat2d=function(t,e,n){var i=e[0],r=e[1];return t[0]=n[0]*i+n[2]*r+n[4],t[1]=n[1]*i+n[3]*r+n[5],t},e.transformMat3=function(t,e,n){var i=e[0],r=e[1];return t[0]=n[0]*i+n[3]*r+n[6],t[1]=n[1]*i+n[4]*r+n[7],t},e.transformMat4=function(t,e,n){var i=e[0],r=e[1];return t[0]=n[0]*i+n[4]*r+n[12],t[1]=n[1]*i+n[5]*r+n[13],t},e.rotate=function(t,e,n,i){var r=e[0]-n[0],a=e[1]-n[1],o=Math.sin(i),s=Math.cos(i);return t[0]=r*s-a*o+n[0],t[1]=r*o+a*s+n[1],t},e.angle=function(t,e){var n=t[0],i=t[1],r=e[0],a=e[1],o=n*n+i*i;o>0&&(o=1/Math.sqrt(o));var s=r*r+a*a;s>0&&(s=1/Math.sqrt(s));var l=(n*r+i*a)*o*s;return l>1?0:l<-1?Math.PI:Math.acos(l)},e.str=function(t){return"vec2("+t[0]+", "+t[1]+")"},e.exactEquals=function(t,e){return t[0]===e[0]&&t[1]===e[1]},e.equals=function(t,e){var n=t[0],i=t[1],r=e[0],a=e[1];return Math.abs(n-r)<=h.EPSILON*Math.max(1,Math.abs(n),Math.abs(r))&&Math.abs(i-a)<=h.EPSILON*Math.max(1,Math.abs(i),Math.abs(a))};var h=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e.default=t,e}(n(52));e.len=u,e.sub=r,e.mul=a,e.div=o,e.dist=s,e.sqrDist=l,e.sqrLen=c,e.forEach=function(){var t=i();return function(e,n,i,r,a,o){var s=void 0,l=void 0;for(n||(n=2),i||(i=0),l=r?Math.min(r*n+i,e.length):e.length,s=i;s<l;s+=n)t[0]=e[s],t[1]=e[s+1],a(t,t,o),e[s]=t[0],e[s+1]=t[1];return e}}()},function(t,e,n){"use strict";function i(){var t=new g.ARRAY_TYPE(3);return g.ARRAY_TYPE!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0),t}function r(t){var e=t[0],n=t[1],i=t[2];return Math.sqrt(e*e+n*n+i*i)}function a(t,e,n){var i=new g.ARRAY_TYPE(3);return i[0]=t,i[1]=e,i[2]=n,i}function o(t,e,n){return t[0]=e[0]-n[0],t[1]=e[1]-n[1],t[2]=e[2]-n[2],t}function s(t,e,n){return t[0]=e[0]*n[0],t[1]=e[1]*n[1],t[2]=e[2]*n[2],t}function l(t,e,n){return t[0]=e[0]/n[0],t[1]=e[1]/n[1],t[2]=e[2]/n[2],t}function u(t,e){var n=e[0]-t[0],i=e[1]-t[1],r=e[2]-t[2];return Math.sqrt(n*n+i*i+r*r)}function c(t,e){var n=e[0]-t[0],i=e[1]-t[1],r=e[2]-t[2];return n*n+i*i+r*r}function h(t){var e=t[0],n=t[1],i=t[2];return e*e+n*n+i*i}function f(t,e){var n=e[0],i=e[1],r=e[2],a=n*n+i*i+r*r;return a>0&&(a=1/Math.sqrt(a),t[0]=e[0]*a,t[1]=e[1]*a,t[2]=e[2]*a),t}function p(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}Object.defineProperty(e,"__esModule",{value:!0}),e.forEach=e.sqrLen=e.len=e.sqrDist=e.dist=e.div=e.mul=e.sub=void 0,e.create=i,e.clone=function(t){var e=new g.ARRAY_TYPE(3);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e},e.length=r,e.fromValues=a,e.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t},e.set=function(t,e,n,i){return t[0]=e,t[1]=n,t[2]=i,t},e.add=function(t,e,n){return t[0]=e[0]+n[0],t[1]=e[1]+n[1],t[2]=e[2]+n[2],t},e.subtract=o,e.multiply=s,e.divide=l,e.ceil=function(t,e){return t[0]=Math.ceil(e[0]),t[1]=Math.ceil(e[1]),t[2]=Math.ceil(e[2]),t},e.floor=function(t,e){return t[0]=Math.floor(e[0]),t[1]=Math.floor(e[1]),t[2]=Math.floor(e[2]),t},e.min=function(t,e,n){return t[0]=Math.min(e[0],n[0]),t[1]=Math.min(e[1],n[1]),t[2]=Math.min(e[2],n[2]),t},e.max=function(t,e,n){return t[0]=Math.max(e[0],n[0]),t[1]=Math.max(e[1],n[1]),t[2]=Math.max(e[2],n[2]),t},e.round=function(t,e){return t[0]=Math.round(e[0]),t[1]=Math.round(e[1]),t[2]=Math.round(e[2]),t},e.scale=function(t,e,n){return t[0]=e[0]*n,t[1]=e[1]*n,t[2]=e[2]*n,t},e.scaleAndAdd=function(t,e,n,i){return t[0]=e[0]+n[0]*i,t[1]=e[1]+n[1]*i,t[2]=e[2]+n[2]*i,t},e.distance=u,e.squaredDistance=c,e.squaredLength=h,e.negate=function(t,e){return t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t},e.inverse=function(t,e){return t[0]=1/e[0],t[1]=1/e[1],t[2]=1/e[2],t},e.normalize=f,e.dot=p,e.cross=function(t,e,n){var i=e[0],r=e[1],a=e[2],o=n[0],s=n[1],l=n[2];return t[0]=r*l-a*s,t[1]=a*o-i*l,t[2]=i*s-r*o,t},e.lerp=function(t,e,n,i){var r=e[0],a=e[1],o=e[2];return t[0]=r+i*(n[0]-r),t[1]=a+i*(n[1]-a),t[2]=o+i*(n[2]-o),t},e.hermite=function(t,e,n,i,r,a){var o=a*a,s=o*(2*a-3)+1,l=o*(a-2)+a,u=o*(a-1),c=o*(3-2*a);return t[0]=e[0]*s+n[0]*l+i[0]*u+r[0]*c,t[1]=e[1]*s+n[1]*l+i[1]*u+r[1]*c,t[2]=e[2]*s+n[2]*l+i[2]*u+r[2]*c,t},e.bezier=function(t,e,n,i,r,a){var o=1-a,s=o*o,l=a*a,u=s*o,c=3*a*s,h=3*l*o,f=l*a;return t[0]=e[0]*u+n[0]*c+i[0]*h+r[0]*f,t[1]=e[1]*u+n[1]*c+i[1]*h+r[1]*f,t[2]=e[2]*u+n[2]*c+i[2]*h+r[2]*f,t},e.random=function(t,e){e=e||1;var n=2*g.RANDOM()*Math.PI,i=2*g.RANDOM()-1,r=Math.sqrt(1-i*i)*e;return t[0]=Math.cos(n)*r,t[1]=Math.sin(n)*r,t[2]=i*e,t},e.transformMat4=function(t,e,n){var i=e[0],r=e[1],a=e[2],o=n[3]*i+n[7]*r+n[11]*a+n[15];return o=o||1,t[0]=(n[0]*i+n[4]*r+n[8]*a+n[12])/o,t[1]=(n[1]*i+n[5]*r+n[9]*a+n[13])/o,t[2]=(n[2]*i+n[6]*r+n[10]*a+n[14])/o,t},e.transformMat3=function(t,e,n){var i=e[0],r=e[1],a=e[2];return t[0]=i*n[0]+r*n[3]+a*n[6],t[1]=i*n[1]+r*n[4]+a*n[7],t[2]=i*n[2]+r*n[5]+a*n[8],t},e.transformQuat=function(t,e,n){var i=n[0],r=n[1],a=n[2],o=n[3],s=e[0],l=e[1],u=e[2],c=r*u-a*l,h=a*s-i*u,f=i*l-r*s,p=r*f-a*h,g=a*c-i*f,d=i*h-r*c,v=2*o;return c*=v,h*=v,f*=v,p*=2,g*=2,d*=2,t[0]=s+c+p,t[1]=l+h+g,t[2]=u+f+d,t},e.rotateX=function(t,e,n,i){var r=[],a=[];return r[0]=e[0]-n[0],r[1]=e[1]-n[1],r[2]=e[2]-n[2],a[0]=r[0],a[1]=r[1]*Math.cos(i)-r[2]*Math.sin(i),a[2]=r[1]*Math.sin(i)+r[2]*Math.cos(i),t[0]=a[0]+n[0],t[1]=a[1]+n[1],t[2]=a[2]+n[2],t},e.rotateY=function(t,e,n,i){var r=[],a=[];return r[0]=e[0]-n[0],r[1]=e[1]-n[1],r[2]=e[2]-n[2],a[0]=r[2]*Math.sin(i)+r[0]*Math.cos(i),a[1]=r[1],a[2]=r[2]*Math.cos(i)-r[0]*Math.sin(i),t[0]=a[0]+n[0],t[1]=a[1]+n[1],t[2]=a[2]+n[2],t},e.rotateZ=function(t,e,n,i){var r=[],a=[];return r[0]=e[0]-n[0],r[1]=e[1]-n[1],r[2]=e[2]-n[2],a[0]=r[0]*Math.cos(i)-r[1]*Math.sin(i),a[1]=r[0]*Math.sin(i)+r[1]*Math.cos(i),a[2]=r[2],t[0]=a[0]+n[0],t[1]=a[1]+n[1],t[2]=a[2]+n[2],t},e.angle=function(t,e){var n=a(t[0],t[1],t[2]),i=a(e[0],e[1],e[2]);f(n,n),f(i,i);var r=p(n,i);return r>1?0:r<-1?Math.PI:Math.acos(r)},e.str=function(t){return"vec3("+t[0]+", "+t[1]+", "+t[2]+")"},e.exactEquals=function(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]},e.equals=function(t,e){var n=t[0],i=t[1],r=t[2],a=e[0],o=e[1],s=e[2];return Math.abs(n-a)<=g.EPSILON*Math.max(1,Math.abs(n),Math.abs(a))&&Math.abs(i-o)<=g.EPSILON*Math.max(1,Math.abs(i),Math.abs(o))&&Math.abs(r-s)<=g.EPSILON*Math.max(1,Math.abs(r),Math.abs(s))};var g=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e.default=t,e}(n(52));e.sub=o,e.mul=s,e.div=l,e.dist=u,e.sqrDist=c,e.len=r,e.sqrLen=h,e.forEach=function(){var t=i();return function(e,n,i,r,a,o){var s=void 0,l=void 0;for(n||(n=3),i||(i=0),l=r?Math.min(r*n+i,e.length):e.length,s=i;s<l;s+=n)t[0]=e[s],t[1]=e[s+1],t[2]=e[s+2],a(t,t,o),e[s]=t[0],e[s+1]=t[1],e[s+2]=t[2];return e}}()},function(t,e,n){var i=n(1);t.exports={canFill:!1,canStroke:!1,initAttrs:function(t){return this._attrs={opacity:1,fillOpacity:1,strokeOpacity:1,matrix:[1,0,0,0,1,0,0,0,1]},this.attr(i.assign(this.getDefaultAttrs(),t)),this},getDefaultAttrs:function(){return{}},attr:function(t,e){if(0===arguments.length)return this._attrs;if(i.isObject(t)){for(var n in t)this._setAttr(n,t[n]);return this.clearBBox(),this._cfg.hasUpdate=!0,this}return 2===arguments.length?(this._setAttr(t,e),this.clearBBox(),this._cfg.hasUpdate=!0,this):this._attrs[t]},_setAttr:function(t,e){var n=this._attrs;n[t]=e,"fill"!==t&&"stroke"!==t?"opacity"!==t?"clip"===t&&e?this._setClip(e):"path"===t&&this._afterSetAttrPath?this._afterSetAttrPath(e):"transform"!==t?"rotate"===t&&this.rotateAtStart(e):this.transform(e):n.globalAlpha=e:n[t+"Style"]=e},clearBBox:function(){this.setSilent("box",null)},hasFill:function(){return this.canFill&&this._attrs.fillStyle},hasStroke:function(){return this.canStroke&&this._attrs.strokeStyle},_setClip:function(t){t._cfg.renderer=this._cfg.renderer,t._cfg.canvas=this._cfg.canvas,t._cfg.parent=this._cfg.parent,t.hasFill=function(){return!0}}}},function(t,e,n){function i(t){return 1===t[0]&&0===t[1]&&0===t[3]&&1===t[4]&&0===t[6]&&0===t[7]}function r(t){return 0===t[1]&&0===t[3]&&0===t[6]&&0===t[7]}function a(t,e){i(e)||(r(e)?(t[0]*=e[0],t[4]*=e[4]):o.mat3.multiply(t,t,e))}var o=n(1);t.exports={initTransform:function(){},resetMatrix:function(){this.attr("matrix",[1,0,0,0,1,0,0,0,1])},translate:function(t,e){var n=this._attrs.matrix;return o.mat3.translate(n,n,[t,e]),this.clearTotalMatrix(),this.attr("matrix",n),this},rotate:function(t){var e=this._attrs.matrix;return o.mat3.rotate(e,e,t),this.clearTotalMatrix(),this.attr("matrix",e),this},scale:function(t,e){var n=this._attrs.matrix;return o.mat3.scale(n,n,[t,e]),this.clearTotalMatrix(),this.attr("matrix",n),this},rotateAtStart:function(t){var e=this._attrs.x||this._cfg.attrs.x,n=this._attrs.y||this._cfg.attrs.y;return Math.abs(t)>2*Math.PI&&(t=t/180*Math.PI),this.transform([["t",-e,-n],["r",t],["t",e,n]])},move:function(t,e){var n=this.get("x")||0,i=this.get("y")||0;return this.translate(t-n,e-i),this.set("x",t),this.set("y",e),this},transform:function(t){var e=this,n=this._attrs.matrix;return o.each(t,function(t){switch(t[0]){case"t":e.translate(t[1],t[2]);break;case"s":e.scale(t[1],t[2]);break;case"r":e.rotate(t[1]);break;case"m":e.attr("matrix",o.mat3.multiply([],n,t[1])),e.clearTotalMatrix()}}),e},setTransform:function(t){return this.attr("matrix",[1,0,0,0,1,0,0,0,1]),this.transform(t)},getMatrix:function(){return this.attr("matrix")},setMatrix:function(t){return this.attr("matrix",t),this.clearTotalMatrix(),this},apply:function(t,e){var n;return n=e?this._getMatrixByRoot(e):this.attr("matrix"),o.vec3.transformMat3(t,t,n),this},_getMatrixByRoot:function(t){t=t||this;for(var e=this,n=[];e!==t;)n.unshift(e),e=e.get("parent");n.unshift(e);var i=[1,0,0,0,1,0,0,0,1];return o.each(n,function(t){o.mat3.multiply(i,t.attr("matrix"),i)}),i},getTotalMatrix:function(){var t=this._cfg.totalMatrix;if(!t){t=[1,0,0,0,1,0,0,0,1];var e=this._cfg.parent;if(e){a(t,e.getTotalMatrix())}a(t,this.attr("matrix")),this._cfg.totalMatrix=t}return t},clearTotalMatrix:function(){},invert:function(t){var e=this.getTotalMatrix();if(r(e))t[0]/=e[0],t[1]/=e[4];else{var n=o.mat3.invert([],e);n&&o.vec3.transformMat3(t,t,n)}return this},resetTransform:function(t){var e=this.attr("matrix");i(e)||t.transform(e[0],e[1],e[3],e[4],e[6],e[7])}}},function(t,e,n){var i=n(1),r={delay:"delay",rotate:"rotate"},a={fill:"fill",stroke:"stroke",fillStyle:"fillStyle",strokeStyle:"strokeStyle"};t.exports={animate:function(t,e,n,o,s){void 0===s&&(s=0);this.set("animating",!0);var l=this.get("timeline");l||(l=this.get("canvas").get("timeline"),this.setSilent("timeline",l));var u=this.get("animators")||[];l._timer||l.initTimer(),i.isNumber(o)&&(s=o,o=null),i.isFunction(n)?(o=n,n="easeLinear"):n=n||"easeLinear";var c=function(t,e){var n={matrix:null,attrs:{}},o=e._attrs;for(var s in t)if("transform"===s)n.matrix=i.transform(e.getMatrix(),t[s]);else if("rotate"===s)n.matrix=i.transform(e.getMatrix(),[["r",t[s]]]);else if("matrix"===s)n.matrix=t[s];else{if(a[s]&&/^[r,R,L,l]{1}[\s]*\(/.test(t[s]))continue;r[s]||o[s]===t[s]||(n.attrs[s]=t[s])}return n}(t,this),h={fromAttrs:function(t,e){var n={},i=e._attrs;for(var r in t.attrs)n[r]=i[r];return n}(c,this),toAttrs:c.attrs,fromMatrix:i.clone(this.getMatrix()),toMatrix:c.matrix,duration:e,easing:n,callback:o,delay:s,startTime:l.getTime(),id:i.uniqueId()};u.length>0?u=function(t,e){var n=e.delay,r=Object.prototype.hasOwnProperty;return i.each(e.toAttrs,function(e,a){i.each(t,function(t){n<t.startTime+t.duration&&r.call(t.toAttrs,a)&&(delete t.toAttrs[a],delete t.fromAttrs[a])})}),e.toMatrix&&i.each(t,function(t){n<t.startTime+t.duration&&t.toMatrix&&delete t.toMatrix}),t}(u,h):l.addAnimator(this),u.push(h),this.setSilent("animators",u),this.setSilent("pause",{isPaused:!1})},stopAnimate:function(){var t=this,e=this.get("animators");i.each(e,function(e){t.attr(e.toAttrs),e.toMatrix&&t.attr("matrix",e.toMatrix),e.callback&&e.callback()}),this.setSilent("animating",!1),this.setSilent("animators",[])},pauseAnimate:function(){var t=this.get("timeline");return this.setSilent("pause",{isPaused:!0,pauseTime:t.getTime()}),this},resumeAnimate:function(){var t=this.get("timeline").getTime(),e=this.get("animators"),n=this.get("pause").pauseTime;return i.each(e,function(e){e.startTime=e.startTime+(t-n),e._paused=!1,e._pauseTime=null}),this.setSilent("pause",{isPaused:!1}),this.setSilent("animators",e),this}}},function(t,e,n){var i=n(6);i.Arc=n(105),i.Circle=n(106),i.Dom=n(107),i.Ellipse=n(108),i.Fan=n(109),i.Image=n(110),i.Line=n(111),i.Marker=n(56),i.Path=n(112),i.Polygon=n(113),i.Polyline=n(114),i.Rect=n(115),i.Text=n(116),t.exports=i},function(t,e,n){function i(t,e,n){return n.createPath(s),s.isPointInPath(t,e)}var r=n(1),a=n(54),o={arc:n(37),ellipse:n(104),line:n(36)},s=r.createDom('<canvas width="500" height="500"></canvas>').getContext("2d"),l={arc:function(t,e){var n=this._attrs,i=n.x,r=n.y,o=n.r,s=n.startAngle,l=n.endAngle,u=n.clockwise,c=this.getHitLineWidth();return!!this.hasStroke()&&a.arcline(i,r,o,s,l,u,c,t,e)},circle:function(t,e){var n=this._attrs,i=n.x,r=n.y,o=n.r,s=this.getHitLineWidth(),l=this.hasFill(),u=this.hasStroke();return l&&u?a.circle(i,r,o,t,e)||a.arcline(i,r,o,0,2*Math.PI,!1,s,t,e):l?a.circle(i,r,o,t,e):!!u&&a.arcline(i,r,o,0,2*Math.PI,!1,s,t,e)},dom:function(t,e){if(!this._cfg.el)return!1;var n=this._cfg.el.getBBox();return a.box(n.x,n.x+n.width,n.y,n.y+n.height,t,e)},ellipse:function(t,e){var n=this._attrs,i=this.hasFill(),o=this.hasStroke(),s=n.x,l=n.y,u=n.rx,c=n.ry,h=this.getHitLineWidth(),f=u>c?u:c,p=u>c?1:u/c,g=u>c?c/u:1,d=[t,e,1],v=[1,0,0,0,1,0,0,0,1];r.mat3.scale(v,v,[p,g]),r.mat3.translate(v,v,[s,l]);var y=r.mat3.invert([],v);return r.vec3.transformMat3(d,d,y),i&&o?a.circle(0,0,f,d[0],d[1])||a.arcline(0,0,f,0,2*Math.PI,!1,h,d[0],d[1]):i?a.circle(0,0,f,d[0],d[1]):!!o&&a.arcline(0,0,f,0,2*Math.PI,!1,h,d[0],d[1])},fan:function(t,e){function n(){var t=o.arc.nearAngle(m,d,v,y);if(r.isNumberEqual(m,t)){var e=r.vec2.squaredLength(x);if(p*p<=e&&e<=g*g)return!0}return!1}function i(){var n=s.getHitLineWidth(),i={x:Math.cos(d)*p+h,y:Math.sin(d)*p+f},r={x:Math.cos(d)*g+h,y:Math.sin(d)*g+f},o={x:Math.cos(v)*p+h,y:Math.sin(v)*p+f},l={x:Math.cos(v)*g+h,y:Math.sin(v)*g+f};return!!(a.line(i.x,i.y,r.x,r.y,n,t,e)||a.line(o.x,o.y,l.x,l.y,n,t,e)||a.arcline(h,f,p,d,v,y,n,t,e)||a.arcline(h,f,g,d,v,y,n,t,e))}var s=this,l=s.hasFill(),u=s.hasStroke(),c=s._attrs,h=c.x,f=c.y,p=c.rs,g=c.re,d=c.startAngle,v=c.endAngle,y=c.clockwise,x=[t-h,e-f],m=r.vec2.angleTo([1,0],x);return l&&u?n()||i():l?n():!!u&&i()},image:function(t,e){var n=this._attrs;if(this.get("toDraw")||!n.img)return!1;this._cfg.attrs&&this._cfg.attrs.img===n.img||this._setAttrImg();var i=n.x,r=n.y,o=n.width,s=n.height;return a.rect(i,r,o,s,t,e)},line:function(t,e){var n=this._attrs,i=n.x1,r=n.y1,o=n.x2,s=n.y2,l=this.getHitLineWidth();return!!this.hasStroke()&&a.line(i,r,o,s,l,t,e)},path:function(t,e){function n(){if(!r.isEmpty(o)){for(var n=a.getHitLineWidth(),i=0,s=o.length;i<s;i++)if(o[i].isInside(t,e,n))return!0;return!1}}var a=this,o=a.get("segments"),s=a.hasFill(),l=a.hasStroke();return s&&l?i(t,e,a)||n():s?i(t,e,a):!!l&&n()},marker:function(t,e){var n=this._attrs,i=n.x,r=n.y,o=n.radius||n.r,s=this.getHitLineWidth();return a.circle(i,r,o+s/2,t,e)},polygon:function(t,e){function n(){var n=r._attrs.points;if(n.length<2)return!1;var i=r.getHitLineWidth(),o=n.slice(0);return n.length>=3&&o.push(n[0]),a.polyline(o,i,t,e)}var r=this,o=r.hasFill(),s=r.hasStroke();return o&&s?i(t,e,r)||n():o?i(t,e,r):!!s&&n()},polyline:function(t,e){var n=this._attrs;if(this.hasStroke()){var i=n.points;if(i.length<2)return!1;var r=n.lineWidth;return a.polyline(i,r,t,e)}return!1},rect:function(t,e){function n(){var n=r._attrs,i=n.x,o=n.y,s=n.width,l=n.height,u=n.radius,c=r.getHitLineWidth();if(0===u){var h=c/2;return a.line(i-h,o,i+s+h,o,c,t,e)||a.line(i+s,o-h,i+s,o+l+h,c,t,e)||a.line(i+s+h,o+l,i-h,o+l,c,t,e)||a.line(i,o+l+h,i,o-h,c,t,e)}return a.line(i+u,o,i+s-u,o,c,t,e)||a.line(i+s,o+u,i+s,o+l-u,c,t,e)||a.line(i+s-u,o+l,i+u,o+l,c,t,e)||a.line(i,o+l-u,i,o+u,c,t,e)||a.arcline(i+s-u,o+u,u,1.5*Math.PI,2*Math.PI,!1,c,t,e)||a.arcline(i+s-u,o+l-u,u,0,.5*Math.PI,!1,c,t,e)||a.arcline(i+u,o+l-u,u,.5*Math.PI,Math.PI,!1,c,t,e)||a.arcline(i+u,o+u,u,Math.PI,1.5*Math.PI,!1,c,t,e)}var r=this,o=r.hasFill(),s=r.hasStroke();return o&&s?i(t,e,r)||n():o?i(t,e,r):!!s&&n()},text:function(t,e){var n=this.getBBox();if(this.hasFill()||this.hasStroke())return a.box(n.minX,n.maxX,n.minY,n.maxY,t,e)}};t.exports={isPointInPath:function(t,e){var n=l[this.type];return!!n&&n.call(this,t,e)}}},function(t,e,n){function i(t,e,n){var i=e.startTime;if(n<i+e.delay||e.isPaused)return!1;var o,l=e.duration,h=e.easing;if(n=n-i-e.delay,e.toAttrs.repeat)o=n%l/l,o=s[h](o);else{if(!((o=n/l)<1))return t.attr(e.toAttrs),e.toMatrix&&t.setMatrix(e.toMatrix),!0;o=s[h](o)}return function(t,e,n){var i={},o=e.toAttrs,s=e.fromAttrs,l=e.toMatrix;if(!t.get("destroyed")){var h;for(var f in o)if(!r.isEqual(s[f],o[f]))if("path"===f){var p=o[f],g=s[f];p.length>g.length?(p=a.parsePathString(o[f]),g=a.parsePathString(s[f]),g=a.fillPathByDiff(g,p),g=a.formatPath(g,p),e.fromAttrs.path=g,e.toAttrs.path=p):e.pathFormatted||(p=a.parsePathString(o[f]),g=a.parsePathString(s[f]),g=a.formatPath(g,p),e.fromAttrs.path=g,e.toAttrs.path=p,e.pathFormatted=!0),i[f]=[];for(var d=0;d<p.length;d++){for(var v=p[d],y=g[d],x=[],m=0;m<v.length;m++)r.isNumber(v[m])&&y&&r.isNumber(y[m])?(h=u(y[m],v[m]),x.push(h(n))):x.push(v[m]);i[f].push(x)}}else h=u(s[f],o[f]),i[f]=h(n);if(l){var _=c(e.fromMatrix,l)(n);t.setMatrix(_)}t.attr(i)}}(t,e,o),!1}var r=n(1),a=n(57),o=n(170),s=n(173),l=n(117),u=l.interpolate,c=l.interpolateArray,h=function(t){this._animators=[],this._current=0,this._timer=null,this.canvas=t};r.augment(h,{initTimer:function(){var t,e,n,r=this,a=this,s=!1;a._timer=o.timer(function(o){if(a._current=o,r._animators.length>0){for(var l=r._animators.length-1;l>=0;l--)if((t=r._animators[l]).get("destroyed"))a.removeAnimator(l);else{if(!t.get("pause").isPaused)for(var u=(e=t.get("animators")).length-1;u>=0;u--)n=e[u],(s=i(t,n,o))&&(e.splice(u,1),s=!1,n.callback&&n.callback());0===e.length&&a.removeAnimator(l)}r.canvas.draw()}})},addAnimator:function(t){this._animators.push(t)},removeAnimator:function(t){this._animators.splice(t,1)},isAnimating:function(){return!!this._animators.length},stop:function(){this._timer&&this._timer.stop()},stopAllAnimations:function(){this._animators.forEach(function(t){t.stopAnimate()}),this._animators=[],this.canvas.draw()},getTime:function(){return this._current}}),t.exports=h},function(t,e,n){"use strict";var i=n(58);e.a=function(t,e,n){var r=new i.a;return e=null==e?0:+e,r.restart(function(n){r.stop(),t(n+e)},e,n),r}},function(t,e,n){"use strict";var i=n(58);e.a=function(t,e,n){var r=new i.a,a=e;return null==e?(r.restart(t,e,n),r):(e=+e,n=null==n?Object(i.b)():+n,r.restart(function i(o){o+=a,r.restart(i,a+=e,n),t(o)},e,n),r)}},function(t,e,n){"use strict";e.a=function(t){return+t}},function(t,e,n){"use strict";e.a=function(t){return t*t},e.c=function(t){return t*(2-t)},e.b=function(t){return((t*=2)<=1?t*t:--t*(2-t)+1)/2}},function(t,e,n){"use strict";e.a=function(t){return t*t*t},e.c=function(t){return--t*t*t+1},e.b=function(t){return((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2}},function(t,e,n){"use strict";n.d(e,"a",function(){return i}),n.d(e,"c",function(){return r}),n.d(e,"b",function(){return a});var i=function t(e){function n(t){return Math.pow(t,e)}return e=+e,n.exponent=t,n}(3),r=function t(e){function n(t){return 1-Math.pow(1-t,e)}return e=+e,n.exponent=t,n}(3),a=function t(e){function n(t){return((t*=2)<=1?Math.pow(t,e):2-Math.pow(2-t,e))/2}return e=+e,n.exponent=t,n}(3)},function(t,e,n){"use strict";e.a=function(t){return 1-Math.cos(t*r)},e.c=function(t){return Math.sin(t*r)},e.b=function(t){return(1-Math.cos(i*t))/2};var i=Math.PI,r=i/2},function(t,e,n){"use strict";e.a=function(t){return Math.pow(2,10*t-10)},e.c=function(t){return 1-Math.pow(2,-10*t)},e.b=function(t){return((t*=2)<=1?Math.pow(2,10*t-10):2-Math.pow(2,10-10*t))/2}},function(t,e,n){"use strict";e.a=function(t){return 1-Math.sqrt(1-t*t)},e.c=function(t){return Math.sqrt(1- --t*t)},e.b=function(t){return((t*=2)<=1?1-Math.sqrt(1-t*t):Math.sqrt(1-(t-=2)*t)+1)/2}},function(t,e,n){"use strict";function i(t){return(t=+t)<r?p*t*t:t<o?p*(t-=a)*t+s:t<u?p*(t-=l)*t+c:p*(t-=h)*t+f}e.a=function(t){return 1-i(1-t)},e.c=i,e.b=function(t){return((t*=2)<=1?1-i(1-t):i(t-1)+1)/2};var r=4/11,a=6/11,o=8/11,s=.75,l=9/11,u=10/11,c=.9375,h=21/22,f=63/64,p=1/r/r},function(t,e,n){"use strict";n.d(e,"a",function(){return i}),n.d(e,"c",function(){return r}),n.d(e,"b",function(){return a});var i=function t(e){function n(t){return t*t*((e+1)*t-e)}return e=+e,n.overshoot=t,n}(1.70158),r=function t(e){function n(t){return--t*t*((e+1)*t+e)+1}return e=+e,n.overshoot=t,n}(1.70158),a=function t(e){function n(t){return((t*=2)<1?t*t*((e+1)*t-e):(t-=2)*t*((e+1)*t+e)+2)/2}return e=+e,n.overshoot=t,n}(1.70158)},function(t,e,n){"use strict";n.d(e,"a",function(){return r}),n.d(e,"c",function(){return a}),n.d(e,"b",function(){return o});var i=2*Math.PI,r=function t(e,n){function r(t){return e*Math.pow(2,10*--t)*Math.sin((a-t)/n)}var a=Math.asin(1/(e=Math.max(1,e)))*(n/=i);return r.amplitude=function(e){return t(e,n*i)},r.period=function(n){return t(e,n)},r}(1,.3),a=function t(e,n){function r(t){return 1-e*Math.pow(2,-10*(t=+t))*Math.sin((t+a)/n)}var a=Math.asin(1/(e=Math.max(1,e)))*(n/=i);return r.amplitude=function(e){return t(e,n*i)},r.period=function(n){return t(e,n)},r}(1,.3),o=function t(e,n){function r(t){return((t=2*t-1)<0?e*Math.pow(2,10*t)*Math.sin((a-t)/n):2-e*Math.pow(2,-10*t)*Math.sin((a+t)/n))/2}var a=Math.asin(1/(e=Math.max(1,e)))*(n/=i);return r.amplitude=function(e){return t(e,n*i)},r.period=function(n){return t(e,n)},r}(1,.3)},function(t,e,n){"use strict";function i(t){if(t instanceof a)return new a(t.l,t.a,t.b,t.opacity);if(t instanceof h){var e=t.h*g.a;return new a(t.l,Math.cos(e)*t.c,Math.sin(e)*t.c,t.opacity)}t instanceof p.b||(t=Object(p.h)(t));var n=u(t.r),i=u(t.g),r=u(t.b),s=o((.4124564*n+.3575761*i+.1804375*r)/d),l=o((.2126729*n+.7151522*i+.072175*r)/v);return new a(116*l-16,500*(s-l),200*(l-o((.0193339*n+.119192*i+.9503041*r)/y)),t.opacity)}function r(t,e,n,r){return 1===arguments.length?i(t):new a(t,e,n,null==r?1:r)}function a(t,e,n,i){this.l=+t,this.a=+e,this.b=+n,this.opacity=+i}function o(t){return t>b?Math.pow(t,1/3):t/_+x}function s(t){return t>m?t*t*t:_*(t-x)}function l(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function u(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function c(t,e,n,r){return 1===arguments.length?function(t){if(t instanceof h)return new h(t.h,t.c,t.l,t.opacity);t instanceof a||(t=i(t));var e=Math.atan2(t.b,t.a)*g.b;return new h(e<0?e+360:e,Math.sqrt(t.a*t.a+t.b*t.b),t.l,t.opacity)}(t):new h(t,e,n,null==r?1:r)}function h(t,e,n,i){this.h=+t,this.c=+e,this.l=+n,this.opacity=+i}e.a=r,e.b=c;var f=n(61),p=n(60),g=n(118),d=.95047,v=1,y=1.08883,x=4/29,m=6/29,_=3*m*m,b=m*m*m;Object(f.a)(a,r,Object(f.b)(p.a,{brighter:function(t){return new a(this.l+18*(null==t?1:t),this.a,this.b,this.opacity)},darker:function(t){return new a(this.l-18*(null==t?1:t),this.a,this.b,this.opacity)},rgb:function(){var t=(this.l+16)/116,e=isNaN(this.a)?t:t+this.a/500,n=isNaN(this.b)?t:t-this.b/200;return t=v*s(t),e=d*s(e),n=y*s(n),new p.b(l(3.2404542*e-1.5371385*t-.4985314*n),l(-.969266*e+1.8760108*t+.041556*n),l(.0556434*e-.2040259*t+1.0572252*n),this.opacity)}})),Object(f.a)(h,c,Object(f.b)(p.a,{brighter:function(t){return new h(this.h,this.c,this.l+18*(null==t?1:t),this.opacity)},darker:function(t){return new h(this.h,this.c,this.l-18*(null==t?1:t),this.opacity)},rgb:function(){return i(this).rgb()}}))},function(t,e,n){"use strict";function i(t,e,n,i){return 1===arguments.length?function(t){if(t instanceof r)return new r(t.h,t.s,t.l,t.opacity);t instanceof o.b||(t=Object(o.h)(t));var e=t.r/255,n=t.g/255,i=t.b/255,a=(d*i+p*e-g*n)/(d+p-g),l=i-a,u=(f*(n-a)-c*l)/h,v=Math.sqrt(u*u+l*l)/(f*a*(1-a)),y=v?Math.atan2(u,l)*s.b-120:NaN;return new r(y<0?y+360:y,v,a,t.opacity)}(t):new r(t,e,n,null==i?1:i)}function r(t,e,n,i){this.h=+t,this.s=+e,this.l=+n,this.opacity=+i}e.a=i;var a=n(61),o=n(60),s=n(118),l=-.14861,u=1.78277,c=-.29227,h=-.90649,f=1.97294,p=f*h,g=f*u,d=u*c-h*l;Object(a.a)(r,i,Object(a.b)(o.a,{brighter:function(t){return t=null==t?o.c:Math.pow(o.c,t),new r(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?o.d:Math.pow(o.d,t),new r(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=isNaN(this.h)?0:(this.h+120)*s.a,e=+this.l,n=isNaN(this.s)?0:this.s*e*(1-e),i=Math.cos(t),r=Math.sin(t);return new o.b(255*(e+n*(l*i+u*r)),255*(e+n*(c*i+h*r)),255*(e+n*(f*i)),this.opacity)}}))},function(t,e,n){"use strict";e.a=function(t,e){return t=+t,e-=t,function(n){return Math.round(t+e*n)}}},function(t,e,n){"use strict";function i(t,e,n,i){function a(t){return t.length?t.pop()+" ":""}return function(o,s){var l=[],u=[];return o=t(o),s=t(s),function(t,i,a,o,s,l){if(t!==a||i!==o){var u=s.push("translate(",null,e,null,n);l.push({i:u-4,x:Object(r.a)(t,a)},{i:u-2,x:Object(r.a)(i,o)})}else(a||o)&&s.push("translate("+a+e+o+n)}(o.translateX,o.translateY,s.translateX,s.translateY,l,u),function(t,e,n,o){t!==e?(t-e>180?e+=360:e-t>180&&(t+=360),o.push({i:n.push(a(n)+"rotate(",null,i)-2,x:Object(r.a)(t,e)})):e&&n.push(a(n)+"rotate("+e+i)}(o.rotate,s.rotate,l,u),function(t,e,n,o){t!==e?o.push({i:n.push(a(n)+"skewX(",null,i)-2,x:Object(r.a)(t,e)}):e&&n.push(a(n)+"skewX("+e+i)}(o.skewX,s.skewX,l,u),function(t,e,n,i,o,s){if(t!==n||e!==i){var l=o.push(a(o)+"scale(",null,",",null,")");s.push({i:l-4,x:Object(r.a)(t,n)},{i:l-2,x:Object(r.a)(e,i)})}else 1===n&&1===i||o.push(a(o)+"scale("+n+","+i+")")}(o.scaleX,o.scaleY,s.scaleX,s.scaleY,l,u),o=s=null,function(t){for(var e,n=-1,i=u.length;++n<i;)l[(e=u[n]).i]=e.x(t);return l.join("")}}}n.d(e,"a",function(){return o}),n.d(e,"b",function(){return s});var r=n(40),a=n(207),o=i(a.a,"px, ","px)","deg)"),s=i(a.b,", ",")",")")},function(t,e,n){"use strict";e.a=function(t){return"none"===t?s.b:(i||(i=document.createElement("DIV"),r=document.documentElement,a=document.defaultView),i.style.transform=t,t=a.getComputedStyle(r.appendChild(i),null).getPropertyValue("transform"),r.removeChild(i),t=t.slice(7,-1).split(","),Object(s.a)(+t[0],+t[1],+t[2],+t[3],+t[4],+t[5]))},e.b=function(t){return null==t?s.b:(o||(o=document.createElementNS("http://www.w3.org/2000/svg","g")),o.setAttribute("transform",t),(t=o.transform.baseVal.consolidate())?(t=t.matrix,Object(s.a)(t.a,t.b,t.c,t.d,t.e,t.f)):s.b)};var i,r,a,o,s=n(208)},function(t,e,n){"use strict";n.d(e,"b",function(){return r});var i=180/Math.PI,r={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1};e.a=function(t,e,n,r,a,o){var s,l,u;return(s=Math.sqrt(t*t+e*e))&&(t/=s,e/=s),(u=t*n+e*r)&&(n-=t*u,r-=e*u),(l=Math.sqrt(n*n+r*r))&&(n/=l,r/=l,u/=l),t*r<e*n&&(t=-t,e=-e,u=-u,s=-s),{translateX:a,translateY:o,rotate:Math.atan2(e,t)*i,skewX:Math.atan(u)*i,scaleX:s,scaleY:l}}},function(t,e,n){"use strict";function i(t){return((t=Math.exp(t))+1/t)/2}var r=Math.SQRT2;e.a=function(t,e){var n,a,o=t[0],s=t[1],l=t[2],u=e[0],c=e[1],h=e[2],f=u-o,p=c-s,g=f*f+p*p;if(g<1e-12)a=Math.log(h/l)/r,n=function(t){return[o+t*f,s+t*p,l*Math.exp(r*t*a)]};else{var d=Math.sqrt(g),v=(h*h-l*l+4*g)/(2*l*2*d),y=(h*h-l*l-4*g)/(2*h*2*d),x=Math.log(Math.sqrt(v*v+1)-v),m=Math.log(Math.sqrt(y*y+1)-y);a=(m-x)/r,n=function(t){var e=t*a,n=i(x),u=l/(2*d)*(n*function(t){return((t=Math.exp(2*t))-1)/(t+1)}(r*e+x)-function(t){return((t=Math.exp(t))-1/t)/2}(x));return[o+u*f,s+u*p,l*n/i(r*e+x)]}}return n.duration=1e3*a,n}},function(t,e,n){"use strict";function i(t){return function(e,n){var i=t((e=Object(r.d)(e)).h,(n=Object(r.d)(n)).h),o=Object(a.a)(e.s,n.s),s=Object(a.a)(e.l,n.l),l=Object(a.a)(e.opacity,n.opacity);return function(t){return e.h=i(t),e.s=o(t),e.l=s(t),e.opacity=l(t),e+""}}}n.d(e,"b",function(){return o});var r=n(19),a=n(28);e.a=i(a.c);var o=i(a.a)},function(t,e,n){"use strict";e.a=function(t,e){var n=Object(r.a)((t=Object(i.e)(t)).l,(e=Object(i.e)(e)).l),a=Object(r.a)(t.a,e.a),o=Object(r.a)(t.b,e.b),s=Object(r.a)(t.opacity,e.opacity);return function(e){return t.l=n(e),t.a=a(e),t.b=o(e),t.opacity=s(e),t+""}};var i=n(19),r=n(28)},function(t,e,n){"use strict";function i(t){return function(e,n){var i=t((e=Object(r.c)(e)).h,(n=Object(r.c)(n)).h),o=Object(a.a)(e.c,n.c),s=Object(a.a)(e.l,n.l),l=Object(a.a)(e.opacity,n.opacity);return function(t){return e.h=i(t),e.c=o(t),e.l=s(t),e.opacity=l(t),e+""}}}n.d(e,"b",function(){return o});var r=n(19),a=n(28);e.a=i(a.c);var o=i(a.a)},function(t,e,n){"use strict";function i(t){return function e(n){function i(e,i){var o=t((e=Object(r.b)(e)).h,(i=Object(r.b)(i)).h),s=Object(a.a)(e.s,i.s),l=Object(a.a)(e.l,i.l),u=Object(a.a)(e.opacity,i.opacity);return function(t){return e.h=o(t),e.s=s(t),e.l=l(Math.pow(t,n)),e.opacity=u(t),e+""}}return n=+n,i.gamma=e,i}(1)}n.d(e,"a",function(){return o});var r=n(19),a=n(28);e.b=i(a.c);var o=i(a.a)},function(t,e,n){"use strict";e.a=function(t,e){for(var n=new Array(e),i=0;i<e;++i)n[i]=t(i/(e-1));return n}},function(t,e,n){t.exports={canvas:n(216),svg:n(219)}},function(t,e,n){t.exports={painter:n(217)}},function(t,e,n){var i=n(1),r=n(218),a=["fillStyle","font","globalAlpha","lineCap","lineWidth","lineJoin","miterLimit","shadowBlur","shadowColor","shadowOffsetX","shadowOffsetY","strokeStyle","textAlign","textBaseline","lineDash","lineDashOffset"],o=function(){function t(t){if(!t)return null;var e=i.uniqueId("canvas_"),n=i.createDom('<canvas id="'+e+'"></canvas>');return t.appendChild(n),this.type="canvas",this.canvas=n,this.context=n.getContext("2d"),this.toDraw=!1,this}var e=t.prototype;return e.beforeDraw=function(){var t=this.canvas;this.context&&this.context.clearRect(0,0,t.width,t.height)},e.draw=function(t){function e(){n.animateHandler=i.requestAnimationFrame(function(){n.animateHandler=void 0,n.toDraw&&e()}),n.beforeDraw();try{n._drawGroup(t)}catch(t){console.warn("error in draw canvas, detail as:"),console.warn(t),n.toDraw=!1}n.toDraw=!1}var n=this;n.animateHandler?n.toDraw=!0:e()},e.drawSync=function(t){this.beforeDraw(),this._drawGroup(t)},e._drawGroup=function(t){if(!t._cfg.removed&&!t._cfg.destroyed&&t._cfg.visible){var e=t._cfg.children,n=null;this.setContext(t);for(var i=0;i<e.length;i++)n=e[i],e[i].isGroup?this._drawGroup(n):this._drawShape(n);this.restoreContext(t)}},e._drawShape=function(t){t._cfg.removed||t._cfg.destroyed||!t._cfg.visible||(this.setContext(t),t.drawInner(this.context),this.restoreContext(t),t._cfg.attrs=t._attrs,t._cfg.hasUpdate=!1)},e.setContext=function(t){var e=this.context,n=t._attrs.clip;e.save(),n&&(n.resetTransform(e),n.createPath(e),e.clip()),this.resetContext(t),t.resetTransform(e)},e.restoreContext=function(){this.context.restore()},e.resetContext=function(t){var e=this.context,n=t._attrs;if(!t.isGroup)for(var o in n)if(a.indexOf(o)>-1){var s=n[o];"fillStyle"===o&&(s=r.parseStyle(s,t,e)),"strokeStyle"===o&&(s=r.parseStyle(s,t,e)),"lineDash"===o&&e.setLineDash?i.isArray(s)?e.setLineDash(s):i.isString(s)&&e.setLineDash(s.split(" ")):e[o]=s}},t}();t.exports=o},function(t,e,n){function i(t,e){var n=t.match(c);r.each(n,function(t){t=t.split(":"),e.addColorStop(t[0],t[1])})}var r=n(1),a=/[MLHVQTCSAZ]([^MLHVQTCSAZ]*)/gi,o=/[^\s\,]+/gi,s=/^l\s*\(\s*([\d.]+)\s*\)\s*(.*)/i,l=/^r\s*\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*\)\s*(.*)/i,u=/^p\s*\(\s*([axyn])\s*\)\s*(.*)/i,c=/[\d.]+:(#[^\s]+|[^\)]+\))/gi;t.exports={parsePath:function(t){return t=t||[],r.isArray(t)?t:r.isString(t)?(t=t.match(a),r.each(t,function(e,n){if((e=e.match(o))[0].length>1){var i=e[0].charAt(0);e.splice(1,0,e[0].substr(1)),e[0]=i}r.each(e,function(t,n){isNaN(t)||(e[n]=+t)}),t[n]=e}),t):void 0},parseStyle:function(t,e,n){if(r.isString(t)){if("("===t[1]||"("===t[2]){if("l"===t[0])return function(t,e,n){var a,o,l=s.exec(t),u=r.mod(r.toRadian(parseFloat(l[1])),2*Math.PI),c=l[2],h=e.getBBox();u>=0&&u<.5*Math.PI?(a={x:h.minX,y:h.minY},o={x:h.maxX,y:h.maxY}):.5*Math.PI<=u&&u<Math.PI?(a={x:h.maxX,y:h.minY},o={x:h.minX,y:h.maxY}):Math.PI<=u&&u<1.5*Math.PI?(a={x:h.maxX,y:h.maxY},o={x:h.minX,y:h.minY}):(a={x:h.minX,y:h.maxY},o={x:h.maxX,y:h.minY});var f=Math.tan(u),p=f*f,g=(o.x-a.x+f*(o.y-a.y))/(p+1)+a.x,d=f*(o.x-a.x+f*(o.y-a.y))/(p+1)+a.y,v=n.createLinearGradient(a.x,a.y,g,d);return i(c,v),v}(t,e,n);if("r"===t[0])return function(t,e,n){var r=l.exec(t),a=parseFloat(r[1]),o=parseFloat(r[2]),s=parseFloat(r[3]),u=r[4];if(0===s){var h=u.match(c);return h[h.length-1].split(":")[1]}var f=e.getBBox(),p=f.maxX-f.minX,g=f.maxY-f.minY,d=Math.sqrt(p*p+g*g)/2,v=n.createRadialGradient(f.minX+p*a,f.minY+g*o,s*d,f.minX+p/2,f.minY+g/2,d);return i(u,v),v}(t,e,n);if("p"===t[0])return function(t,e,n){function i(){r=n.createPattern(a,s),e.setSilent("pattern",r),e.setSilent("patternSource",t)}if(e.get("patternSource")&&e.get("patternSource")===t)return e.get("pattern");var r,a,o=u.exec(t),s=o[1],l=o[2];switch(s){case"a":s="repeat";break;case"x":s="repeat-x";break;case"y":s="repeat-y";break;case"n":s="no-repeat";break;default:s="no-repeat"}return a=new Image,l.match(/^data:/i)||(a.crossOrigin="Anonymous"),a.src=l,a.complete?i():(a.onload=i,a.src=a.src),r}(t,e,n)}return t}}}},function(t,e,n){t.exports={painter:n(220),getShape:n(227)}},function(t,e,n){var i=n(1),r=n(27).parseRadius,a=n(56),o=n(221),s={rect:"path",circle:"circle",line:"line",path:"path",marker:"path",text:"text",polygon:"polygon",image:"image",ellipse:"ellipse",dom:"foreignObject",fan:"path",group:"g"},l={opacity:"opacity",fillStyle:"fill",strokeOpacity:"stroke-opacity",fillOpacity:"fill-opacity",strokeStyle:"stroke",x:"x",y:"y",r:"r",width:"width",height:"height",x1:"x1",x2:"x2",y1:"y1",y2:"y2",lineCap:"stroke-linecap",lineJoin:"stroke-linejoin",lineWidth:"stroke-width",lineDash:"stroke-dasharray",lineDashOffset:"stroke-dashoffset",miterLimit:"stroke-miterlimit",font:"font",fontSize:"font-size",fontStyle:"font-style",fontVariant:"font-variant",fontWeight:"font-weight",fontFamily:"font-family",startArrow:"marker-start",endArrow:"marker-end",path:"d",class:"class",id:"id",style:"style",preserveAspectRatio:"preserveAspectRatio"},u={top:"before-edge",middle:"central",bottom:"after-edge",alphabetic:"baseline",hanging:"hanging"},c={left:"left",start:"left",center:"middle",right:"end",end:"end"},h=function(){function t(t){if(!t)return null;var e=i.uniqueId("canvas_"),n=i.createDom('<svg id="'+e+'"></svg>');return t.appendChild(n),this.type="svg",this.canvas=n,this.context=new o(n),this.toDraw=!1,this}var e=t.prototype;return e.draw=function(t){function e(){n.animateHandler=i.requestAnimationFrame(function(){n.animateHandler=void 0,n.toDraw&&e()});try{n._drawChildren(t)}catch(t){console.warn("error in draw canvas, detail as:"),console.warn(t),n.toDraw=!1}n.toDraw=!1}var n=this;n.animateHandler?n.toDraw=!0:e()},e.drawSync=function(t){this._drawChildren(t)},e._drawGroup=function(t,e){var n=t._cfg;n.removed||n.destroyed||(n.tobeRemoved&&(i.each(n.tobeRemoved,function(t){t.parentNode&&t.parentNode.removeChild(t)}),n.tobeRemoved=[]),this._drawShape(t,e),n.children&&n.children.length>0&&this._drawChildren(t))},e._drawChildren=function(t){var e,n=t._cfg.children;if(n)for(var i=0;i<n.length;i++)(e=n[i]).isGroup?this._drawGroup(e,i):this._drawShape(e,i)},e._drawShape=function(t,e){var n=t._attrs,i=t._cfg,r=i.el;i.removed||i.destroyed?r&&r.parentNode.removeChild(i.el):(!r&&i.parent&&(this._createDom(t,e),this._updateShape(t)),r=i.el,!1!==i.visible?(i.visible&&r.hasAttribute("visibility")&&r.removeAttribute("visibility"),i.hasUpdate&&this._updateShape(t),n.clip&&n.clip._cfg.hasUpdate&&this._updateShape(n.clip)):r.setAttribute("visibility","hidden"))},e._updateShape=function(t){var e=t._attrs,n=t._cfg.attrs;if(n)if(t._cfg.el||this._createDom(t),"clip"in e&&this._setClip(t,e.clip),("shadowOffsetX"in e||"shadowOffsetY"in e||"shadowBlur"in e||"shadowColor"in e)&&this._setShadow(t),"text"!==t.type){"fan"===t.type&&this._updateFan(t),"marker"===t.type&&t._cfg.el.setAttribute("d",this._assembleMarker(e)),"rect"===t.type&&t._cfg.el.setAttribute("d",this._assembleRect(e));for(var r in e)e[r]!==n[r]&&this._setAttribute(t,r,e[r]);t._cfg.attrs=i.deepMix({},t._attrs),t._cfg.hasUpdate=!1}else this._updateText(t)},e._setAttribute=function(t,e,n){var r=t.type,a=t._attrs,o=t._cfg.el,s=this.context;if("marker"!==r&&"rect"!==r||!~["x","y","radius","r"].indexOf(e))if(~["circle","ellipse"].indexOf(r)&&~["x","y"].indexOf(e))o.setAttribute("c"+e,parseInt(n,10));else{if("polygon"===r&&"points"===e)return n&&0!==n.length||(n=""),i.isArray(n)&&(n=(n=n.map(function(t){return t[0]+","+t[1]})).join(" ")),void o.setAttribute("points",n);if("path"===e&&i.isArray(n))o.setAttribute("d",this._formatPath(n));else if("img"!==e){if("transform"===e)return n?void this._setTransform(t):void o.removeAttribute("transform");if("rotate"===e)return n?void this._setTransform(t):void o.removeAttribute("transform");if("matrix"!==e)if("fillStyle"!==e&&"strokeStyle"!==e){if("clip"!==e)if(~e.indexOf("Arrow"))if(e=l[e],n){var u=null;u="boolean"==typeof n?s.getDefaultArrow(a,e):s.addArrow(a,e),o.setAttribute(e,"url(#"+u+")"),t._cfg[e]=u}else t._cfg[e]=null,o.removeAttribute(e);else"html"===e&&("string"==typeof n?o.innerHTML=n:(o.innerHTML="",o.appendChild(n))),l[e]&&o.setAttribute(l[e],n)}else this._setColor(t,e,n);else this._setTransform(t)}else this._setImage(t,n)}},e._createDom=function(t,e){var n=s[t.type],i=t._attrs,r=t._cfg.parent,a=r._cfg.el;if(!n)throw new Error("the type"+t.type+"is not supported by svg");var o=document.createElementNS("http://www.w3.org/2000/svg",n);if(t._cfg.el=o,r)if(void 0===e)a.appendChild(o);else{var l=r._cfg.el.childNodes;"svg"===a.tagName&&(e+=1),l.length<=e?a.appendChild(o):a.insertBefore(o,l[e])}return t._cfg.attrs={},"text"===t.type?(o.setAttribute("paint-order","stroke"),o.setAttribute("style","stroke-linecap:butt; stroke-linejoin:miter;")):(i.stroke||i.strokeStyle||o.setAttribute("stroke","none"),i.fill||i.fillStyle||o.setAttribute("fill","none")),o},e._assembleMarker=function(t){var e=t.r;if(void 0===t.r&&(e=t.radius),isNaN(Number(t.x))||isNaN(Number(t.y))||isNaN(Number(e)))return"";var n="";return n="function"==typeof t.symbol?t.symbol(t.x,t.y,e):a.Symbols[t.symbol||"circle"](t.x,t.y,e),i.isArray(n)&&(n=n.map(function(t){return t.join(" ")}).join("")),n},e._assembleRect=function(t){var e=t.x,n=t.y,a=t.width,o=t.height,s=t.radius;if(!s)return"M "+e+","+n+" l "+a+",0 l 0,"+o+" l"+-a+" 0 z";var l=r(s);i.isArray(s)?1===s.length?l.r1=l.r2=l.r3=l.r4=s[0]:2===s.length?(l.r1=l.r3=s[0],l.r2=l.r4=s[1]):3===s.length?(l.r1=s[0],l.r2=l.r4=s[1],l.r3=s[2]):(l.r1=s[0],l.r2=s[1],l.r3=s[2],l.r4=s[3]):l.r1=l.r2=l.r3=l.r4=s;return[["M "+(e+l.r1)+","+n],["l "+(a-l.r1-l.r2)+",0"],["a "+l.r2+","+l.r2+",0,0,1,"+l.r2+","+l.r2],["l 0,"+(o-l.r2-l.r3)],["a "+l.r3+","+l.r3+",0,0,1,"+-l.r3+","+l.r3],["l "+(l.r3+l.r4-a)+",0"],["a "+l.r4+","+l.r4+",0,0,1,"+-l.r4+","+-l.r4],["l 0,"+(l.r4+l.r1-o)],["a "+l.r1+","+l.r1+",0,0,1,"+l.r1+","+-l.r1],["z"]].join(" ")},e._formatPath=function(t){return~(t=t.map(function(t){return t.join(" ")}).join("")).indexOf("NaN")?"":t},e._setTransform=function(t){for(var e=t._attrs.matrix,n=t._cfg.el,i=[],r=0;r<9;r+=3)i.push(e[r]+","+e[r+1]);-1===(i=i.join(",")).indexOf("NaN")?n.setAttribute("transform","matrix("+i+")"):console.warn("invalid matrix:",e)},e._setImage=function(t,e){var n=t._attrs,r=t._cfg.el;if(i.isString(e))r.setAttribute("href",e);else if(e instanceof Image)n.width||(r.setAttribute("width",e.width),t._attrs.width=e.width),n.height||(r.setAttribute("height",e.height),t._attrs.height=e.height),r.setAttribute("href",e.src);else if(e instanceof HTMLElement&&i.isString(e.nodeName)&&"CANVAS"===e.nodeName.toUpperCase())r.setAttribute("href",e.toDataURL());else if(e instanceof ImageData){var a=document.createElement("canvas");a.setAttribute("width",e.width),a.setAttribute("height",e.height),a.getContext("2d").putImageData(e,0,0),n.width||(r.setAttribute("width",e.width),t._attrs.width=e.width),n.height||(r.setAttribute("height",e.height),t._attrs.height=e.height),r.setAttribute("href",a.toDataURL())}},e._updateFan=function(t){function e(t,e,n){return{x:e*Math.cos(t)+n.x,y:e*Math.sin(t)+n.y}}var n=t._attrs,r=t._cfg,a={x:n.x,y:n.y},o=[],s=n.startAngle,l=n.endAngle;i.isNumberEqual(l-s,2*Math.PI)&&(l-=1e-5);var u=e(s,n.re,a),c=e(l,n.re,a),h=l>s?1:0,f=Math.abs(l-s)>Math.PI?1:0,p=n.rs,g=n.re,d=e(s,n.rs,a),v=e(l,n.rs,a);n.rs>0?(o.push("M "+c.x+","+c.y),o.push("L "+v.x+","+v.y),o.push("A "+p+","+p+",0,"+f+","+(1===h?0:1)+","+d.x+","+d.y),o.push("L "+u.x+" "+u.y)):(o.push("M "+a.x+","+a.y),o.push("L "+u.x+","+u.y)),o.push("A "+g+","+g+",0,"+f+","+h+","+c.x+","+c.y),n.rs>0?o.push("L "+v.x+","+v.y):o.push("Z"),r.el.setAttribute("d",o.join(" "))},e._updateText=function(t){var e=t._attrs,n=t._cfg.attrs,i=t._cfg.el;this._setFont(t);for(var r in e)if(e[r]!==n[r]){if("text"===r){this._setText(t,""+e[r]);continue}if("fillStyle"===r||"strokeStyle"===r){this._setColor(t,r,e[r]);continue}if("matrix"===r){this._setTransform(t);continue}l[r]&&i.setAttribute(l[r],e[r])}t._cfg.attrs=Object.assign({},t._attrs),t._cfg.hasUpdate=!1},e._setFont=function(t){var e=t.get("el"),n=t._attrs,i=n.fontSize;e.setAttribute("alignment-baseline",u[n.textBaseline]||"baseline"),e.setAttribute("text-anchor",c[n.textAlign]||"left"),i&&+i<12&&(n.matrix=[1,0,0,0,1,0,0,0,1],t.transform([["t",-n.x,-n.y],["s",+i/12,+i/12],["t",n.x,n.y]]))},e._setText=function(t,e){var n=t._cfg.el,r=t._attrs.textBaseline||"bottom";if(e)if(~e.indexOf("\n")){var a=t._attrs.x,o=e.split("\n"),s=o.length-1,l="";i.each(o,function(t,e){0===e?"alphabetic"===r?l+='<tspan x="'+a+'" dy="'+-s+'em">'+t+"</tspan>":"top"===r?l+='<tspan x="'+a+'" dy="0.9em">'+t+"</tspan>":"middle"===r?l+='<tspan x="'+a+'" dy="'+-(s-1)/2+'em">'+t+"</tspan>":"bottom"===r?l+='<tspan x="'+a+'" dy="-'+(s+.3)+'em">'+t+"</tspan>":"hanging"===r&&(l+='<tspan x="'+a+'" dy="'+(-(s-1)-.3)+'em">'+t+"</tspan>"):l+='<tspan x="'+a+'" dy="1em">'+t+"</tspan>"}),n.innerHTML=l}else n.innerHTML=e;else n.innerHTML=""},e._setClip=function(t,e){var n=t._cfg.el;if(e)if(n.hasAttribute("clip-path"))e._cfg.hasUpdate&&this._updateShape(e);else{this._createDom(e),this._updateShape(e);var i=this.context.addClip(e);n.setAttribute("clip-path","url(#"+i+")")}else n.removeAttribute("clip-path")},e._setColor=function(t,e,n){var i=t._cfg.el,r=this.context;if(n)if(n=n.trim(),/^[r,R,L,l]{1}[\s]*\(/.test(n)){var a=r.find("gradient",n);a||(a=r.addGradient(n)),i.setAttribute(l[e],"url(#"+a+")")}else if(/^[p,P]{1}[\s]*\(/.test(n)){var o=r.find("pattern",n);o||(o=r.addPattern(n)),i.setAttribute(l[e],"url(#"+o+")")}else i.setAttribute(l[e],n);else i.setAttribute(l[e],"none")},e._setShadow=function(t){var e=t._cfg.el,n=t._attrs,i={dx:n.shadowOffsetX,dy:n.shadowOffsetY,blur:n.shadowBlur,color:n.shadowColor};if(i.dx||i.dy||i.blur||i.color){var r=this.context.find("filter",i);r||(r=this.context.addShadow(i,this)),e.setAttribute("filter","url(#"+r+")")}else e.removeAttribute("filter")},t}();t.exports=h},function(t,e,n){var i=n(1),r=n(222),a=n(223),o=n(224),s=n(225),l=n(226),u=function(){function t(t){var e=document.createElementNS("http://www.w3.org/2000/svg","defs"),n=i.uniqueId("defs_");e.id=n,t.appendChild(e),this.children=[],this.defaultArrow={},this.el=e,this.canvas=t}var e=t.prototype;return e.find=function(t,e){for(var n=this.children,i=null,r=0;r<n.length;r++)if(n[r].match(t,e)){i=n[r].id;break}return i},e.findById=function(t){for(var e=this.children,n=null,i=0;i<e.length;i++)if(e[i].id===t){n=e[i];break}return n},e.add=function(t){this.children.push(t),t.canvas=this.canvas,t.parent=this},e.getDefaultArrow=function(t,e){var n=t.stroke||t.strokeStyle;if(this.defaultArrow[n])return this.defaultArrow[n].id;var i=new o(t,e);return this.defaultArrow[n]=i,this.el.appendChild(i.el),i.id},e.addGradient=function(t){var e=new r(t);return this.el.appendChild(e.el),this.add(e),e.id},e.addArrow=function(t,e){var n=new o(t,e);return this.el.appendChild(n.el),n.id},e.addShadow=function(t){var e=new a(t);return this.el.appendChild(e.el),this.add(e),e.id},e.addPattern=function(t){var e=new l(t);return this.el.appendChild(e.el),this.add(e),e.id},e.addClip=function(t){var e=new s(t);return this.el.appendChild(e.el),this.add(e),e.id},t}();t.exports=u},function(t,e,n){function i(t){var e=t.match(s);if(!e)return"";var n="";return e.sort(function(t,e){return t=t.split(":"),e=e.split(":"),Number(t[0])-Number(e[0])}),r.each(e,function(t){t=t.split(":"),n+='<stop offset="'+t[0]+'" stop-color="'+t[1]+'"></stop>'}),n}var r=n(1),a=/^l\s*\(\s*([\d.]+)\s*\)\s*(.*)/i,o=/^r\s*\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*\)\s*(.*)/i,s=/[\d.]+:(#[^\s]+|[^\)]+\))/gi,l=function(){function t(t){var e=null,n=r.uniqueId("gradient_");return"l"===t.toLowerCase()[0]?function(t,e){var n,o,s=a.exec(t),l=r.mod(r.toRadian(parseFloat(s[1])),2*Math.PI),u=s[2];l>=0&&l<.5*Math.PI?(n={x:0,y:0},o={x:1,y:1}):.5*Math.PI<=l&&l<Math.PI?(n={x:1,y:0},o={x:0,y:1}):Math.PI<=l&&l<1.5*Math.PI?(n={x:1,y:1},o={x:0,y:0}):(n={x:0,y:1},o={x:1,y:0});var c=Math.tan(l),h=c*c,f=(o.x-n.x+c*(o.y-n.y))/(h+1)+n.x,p=c*(o.x-n.x+c*(o.y-n.y))/(h+1)+n.y;e.setAttribute("x1",n.x),e.setAttribute("y1",n.y),e.setAttribute("x2",f),e.setAttribute("y2",p),e.innerHTML=i(u)}(t,e=document.createElementNS("http://www.w3.org/2000/svg","linearGradient")):function(t,e){var n=o.exec(t),r=parseFloat(n[1]),a=parseFloat(n[2]),s=parseFloat(n[3]),l=n[4];e.setAttribute("cx",r),e.setAttribute("cy",a),e.setAttribute("r",s),e.innerHTML=i(l)}(t,e=document.createElementNS("http://www.w3.org/2000/svg","radialGradient")),e.setAttribute("id",n),this.el=e,this.id=n,this.cfg=t,this}return t.prototype.match=function(t,e){return this.cfg===e},t}();t.exports=l},function(t,e,n){var i=n(1),r={shadowColor:"color",shadowOpacity:"opacity",shadowBlur:"blur",shadowOffsetX:"dx",shadowOffsetY:"dy"},a={x:"-40%",y:"-40%",width:"200%",height:"200%"},o=function(){function t(t){this.type="filter";var e=document.createElementNS("http://www.w3.org/2000/svg","filter");return i.each(a,function(t,n){e.setAttribute(n,t)}),this.el=e,this.id=i.uniqueId("filter_"),this.el.id=this.id,this.cfg=t,this._parseShadow(t,e),this}var e=t.prototype;return e.match=function(t,e){if(this.type!==t)return!1;var n=!0,r=this.cfg;return i.each(Object.keys(r),function(t){if(r[t]!==e[t])return n=!1,!1}),n},e.update=function(t,e){var n=this.cfg;return n[r[t]]=e,this._parseShadow(n,this.el),this},e._parseShadow=function(t,e){var n='<feDropShadow \n      dx="'+(t.dx||0)+'" \n      dy="'+(t.dy||0)+'" \n      stdDeviation="'+(t.blur?t.blur/10:0)+'"\n      flood-color="'+(t.color?t.color:"#000")+'"\n      flood-opacity="'+(t.opacity?t.opacity:1)+'"\n      />';e.innerHTML=n},t}();t.exports=o},function(t,e,n){var i=n(1),r=function(){function t(t,e){var n=document.createElementNS("http://www.w3.org/2000/svg","marker"),r=i.uniqueId("marker_");n.setAttribute("id",r);var a=document.createElementNS("http://www.w3.org/2000/svg","path");return a.setAttribute("stroke","none"),a.setAttribute("fill",t.stroke||"#000"),n.appendChild(a),n.setAttribute("overflow","visible"),n.setAttribute("orient","auto-start-reverse"),this.el=n,this.child=a,this.id=r,this.cfg=t["marker-start"===e?"startArrow":"endArrow"],this.stroke=t.stroke||"#000",!0===this.cfg?this._setDefaultPath(e,a):this._setMarker(t.lineWidth,a),this}var e=t.prototype;return e.match=function(){return!1},e._setDefaultPath=function(t,e){var n=this.el;e.setAttribute("d","M0,0 L6,3 L0,6 L3,3Z"),n.setAttribute("refX",3),n.setAttribute("refY",3)},e._setMarker=function(t,e){var n=this.el,r=this.cfg.path,a=this.cfg.d;i.isArray(r)&&(r=r.map(function(t){return t.join(" ")}).join("")),e.setAttribute("d",r),n.appendChild(e),a&&n.setAttribute("refX",a/t)},e.update=function(t){var e=this.child;e.attr?e.attr("fill",t):e.setAttribute("fill",t)},t}();t.exports=r},function(t,e,n){var i=n(1),r=function(){function t(t){this.type="clip";var e=document.createElementNS("http://www.w3.org/2000/svg","clipPath");this.el=e,this.id=i.uniqueId("clip_"),e.id=this.id;var n=t._cfg.el;return e.appendChild(n.cloneNode(!0)),this.cfg=t,this}var e=t.prototype;return e.match=function(){return!1},e.remove=function(){var t=this.el;t.parentNode.removeChild(t)},t}();t.exports=r},function(t,e,n){var i=n(1),r=/^p\s*\(\s*([axyn])\s*\)\s*(.*)/i,a=function(){function t(t){function e(){console.log(l.width,l.height),n.setAttribute("width",l.width),n.setAttribute("height",l.height)}var n=document.createElementNS("http://www.w3.org/2000/svg","pattern");n.setAttribute("patternUnits","userSpaceOnUse");var a=document.createElementNS("http://www.w3.org/2000/svg","image");n.appendChild(a);var o=i.uniqueId("pattern_");n.id=o,this.el=n,this.id=o,this.cfg=t;var s=r.exec(t)[2];a.setAttribute("href",s);var l=new Image;return s.match(/^data:/i)||(l.crossOrigin="Anonymous"),l.src=s,l.complete?e():(l.onload=e,l.src=l.src),this}return t.prototype.match=function(t,e){return this.cfg===e},t}();t.exports=a},function(t,e){var n={svg:"svg",circle:"circle",rect:"rect",text:"text",path:"path",foreignObject:"foreignObject",polygon:"polygon",ellipse:"ellipse",image:"image"};t.exports=function(t,e,i){var r=i.target||i.srcElement;if(!n[r.tagName]){for(var a=r.parentNode;a&&!n[a.tagName];)a=a.parentNode;r=a}return this._cfg.el===r?this:this.find(function(t){return t._cfg&&t._cfg.el===r})}},function(t,e,n){t.exports={addEventListener:n(229),createDom:n(94),getBoundingClientRect:n(230),getHeight:n(231),getOuterHeight:n(232),getOuterWidth:n(233),getRatio:n(234),getStyle:n(235),getWidth:n(236),modifyCSS:n(95),requestAnimationFrame:n(96)}},function(t,e){t.exports=function(t,e,n){if(t){if(t.addEventListener)return t.addEventListener(e,n,!1),{remove:function(){t.removeEventListener(e,n,!1)}};if(t.attachEvent)return t.attachEvent("on"+e,n),{remove:function(){t.detachEvent("on"+e,n)}}}}},function(t,e){t.exports=function(t,e){if(t&&t.getBoundingClientRect){var n=t.getBoundingClientRect(),i=document.documentElement.clientTop,r=document.documentElement.clientLeft;return{top:n.top-i,bottom:n.bottom-i,left:n.left-r,right:n.right-r}}return e||null}},function(t,e){t.exports=function(t,e){var n=this.getStyle(t,"height",e);return"auto"===n&&(n=t.offsetHeight),parseFloat(n)}},function(t,e){t.exports=function(t,e){var n=this.getHeight(t,e),i=parseFloat(this.getStyle(t,"borderTopWidth"))||0,r=parseFloat(this.getStyle(t,"paddingTop"))||0,a=parseFloat(this.getStyle(t,"paddingBottom"))||0;return n+i+(parseFloat(this.getStyle(t,"borderBottomWidth"))||0)+r+a}},function(t,e){t.exports=function(t,e){var n=this.getWidth(t,e),i=parseFloat(this.getStyle(t,"borderLeftWidth"))||0,r=parseFloat(this.getStyle(t,"paddingLeft"))||0,a=parseFloat(this.getStyle(t,"paddingRight"))||0;return n+i+(parseFloat(this.getStyle(t,"borderRightWidth"))||0)+r+a}},function(t,e){t.exports=function(){return window.devicePixelRatio?window.devicePixelRatio:2}},function(t,e,n){var i=n(5);t.exports=function(t,e,n){try{return window.getComputedStyle?window.getComputedStyle(t,null)[e]:t.currentStyle[e]}catch(t){return i(n)?null:n}}},function(t,e){t.exports=function(t,e){var n=this.getStyle(t,"width",e);return"auto"===n&&(n=t.offsetWidth),parseFloat(n)}},function(t,e,n){t.exports={contains:n(41),difference:n(238),find:n(239),firstValue:n(240),flatten:n(241),flattenDeep:n(242),getRange:n(243),merge:n(42),pull:n(90),pullAt:n(130),reduce:n(244),remove:n(245),sortBy:n(246),union:n(247),uniq:n(131),valuesOfKey:n(64)}},function(t,e,n){var i=n(63),r=n(41);t.exports=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return i(t,function(t){return!r(e,t)})}},function(t,e,n){var i=n(11),r=n(26),a=n(128);t.exports=function(t,e){var n=void 0;if(i(e)&&(n=e),r(e)&&(n=function(t){return a(t,e)}),n)for(var o=0;o<t.length;o+=1)if(n(t[o]))return t[o];return null}},function(t,e,n){var i=n(5),r=n(4);t.exports=function(t,e){for(var n=null,a=0;a<t.length;a++){var o=t[a][e];if(!i(o)){n=r(o)?o[0]:o;break}}return n}},function(t,e,n){var i=n(4),r=n(2);t.exports=function(t){if(!i(t))return t;var e=[];return r(t,function(t){i(t)?r(t,function(t){e.push(t)}):e.push(t)}),e}},function(t,e,n){var i=n(4);t.exports=function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];if(i(e))for(var r=0;r<e.length;r+=1)t(e[r],n);else n.push(e);return n}},function(t,e,n){var i=n(63),r=n(4);t.exports=function(t){if(!(t=i(t,function(t){return!isNaN(t)})).length)return{min:0,max:0};if(r(t[0])){for(var e=[],n=0;n<t.length;n++)e=e.concat(t[n]);t=e}var a=Math.max.apply(null,t);return{min:Math.min.apply(null,t),max:a}}},function(t,e,n){var i=n(4),r=n(26),a=n(2);t.exports=function(t,e,n){if(!i(t)&&!r(t))return t;var o=n;return a(t,function(t,n){o=e(o,t,n)}),o}},function(t,e,n){var i=n(13),r=n(130);t.exports=function(t,e){var n=[];if(!i(t))return n;for(var a=-1,o=[],s=t.length;++a<s;){var l=t[a];e(l,a,t)&&(n.push(l),o.push(a))}return r(t,o),n}},function(t,e,n){var i=n(10),r=n(11),a=n(4);t.exports=function(t,e){var n=void 0;if(r(e))n=function(t,n){return e(t)-e(n)};else{var o=[];i(e)?o.push(e):a(e)&&(o=e),n=function(t,e){for(var n=0;n<o.length;n+=1){var i=o[n];if(t[i]>e[i])return 1;if(t[i]<e[i])return-1}return 0}}return t.sort(n),t}},function(t,e,n){var i=n(2),r=n(34),a=n(131);t.exports=function(){var t=[],e=r(arguments);return i(e,function(e){t=t.concat(e)}),a(t)}},function(t,e,n){t.exports={getWrapBehavior:n(249),wrapBehavior:n(250)}},function(t,e){t.exports=function(t,e){return t["_wrap_"+e]}},function(t,e){t.exports=function(t,e){if(t["_wrap_"+e])return t["_wrap_"+e];var n=function(n){t[e](n)};return t["_wrap_"+e]=n,n}},function(t,e,n){var i=n(252);t.exports={number2color:i,numberToColor:i,parsePath:n(253),parseRadius:n(254)}},function(t,e){var n={};t.exports=function(t){var e=n[t];if(!e){for(var i=t.toString(16),r=i.length;r<6;r++)i="0"+i;e="#"+i,n[t]=e}return e}},function(t,e,n){var i=n(4),r=n(10),a=n(2),o=/[MLHVQTCSAZ]([^MLHVQTCSAZ]*)/gi,s=/[^\s\,]+/gi;t.exports=function(t){return t=t||[],i(t)?t:r(t)?(t=t.match(o),a(t,function(e,n){if((e=e.match(s))[0].length>1){var i=e[0].charAt(0);e.splice(1,0,e[0].substr(1)),e[0]=i}a(e,function(t,n){isNaN(t)||(e[n]=+t)}),t[n]=e}),t):void 0}},function(t,e,n){var i=n(4);t.exports=function(t){var e=0,n=0,r=0,a=0;return i(t)?1===t.length?e=n=r=a=t[0]:2===t.length?(e=r=t[0],n=a=t[1]):3===t.length?(e=t[0],n=a=t[1],r=t[2]):(e=t[0],n=t[1],r=t[2],a=t[3]):e=n=r=a=t,{r1:e,r2:n,r3:r,r4:a}}},function(t,e,n){var i=n(35);t.exports={clamp:n(50),fixedBase:n(256),isDecimal:n(257),isEven:n(258),isInteger:n(259),isNegative:n(260),isNumberEqual:i,isOdd:n(261),isPositive:n(262),maxBy:n(132),minBy:n(263),mod:n(93),snapEqual:i,toDegree:n(92),toInt:n(133),toInteger:n(133),toRadian:n(91)}},function(t,e){t.exports=function(t,e){var n=e.toString(),i=n.indexOf(".");if(-1===i)return Math.round(t);var r=n.substr(i+1).length;return r>20&&(r=20),parseFloat(t.toFixed(r))}},function(t,e,n){var i=n(9);t.exports=function(t){return i(t)&&t%1!=0}},function(t,e,n){var i=n(9);t.exports=function(t){return i(t)&&t%2==0}},function(t,e,n){var i=n(9),r=Number.isInteger?Number.isInteger:function(t){return i(t)&&t%1==0};t.exports=r},function(t,e,n){var i=n(9);t.exports=function(t){return i(t)&&t<0}},function(t,e,n){var i=n(9);t.exports=function(t){return i(t)&&t%2!=0}},function(t,e,n){var i=n(9);t.exports=function(t){return i(t)&&t>0}},function(t,e,n){var i=n(4),r=n(11),a=n(2);t.exports=function(t,e){if(i(t)){var n=t[0],o=void 0;o=r(e)?e(t[0]):t[0][e];var s=void 0;return a(t,function(t){(s=r(e)?e(t):t[e])<o&&(n=t,o=s)}),n}}},function(t,e,n){t.exports={forIn:n(265),has:n(134),hasKey:n(266),hasValue:n(267),keys:n(129),isMatch:n(128),values:n(135)}},function(t,e,n){t.exports=n(2)},function(t,e,n){t.exports=n(134)},function(t,e,n){var i=n(41),r=n(135);t.exports=function(t,e){return i(r(t),e)}},function(t,e,n){var i=n(269),r=n(139),a=n(138),o=n(141);t.exports={catmullRom2Bezier:o,catmullRomToBezier:o,fillPath:n(270),fillPathByDiff:n(271),formatPath:n(273),intersection:i,pathIntersection:i,parsePathArray:n(137),parsePathString:n(140),pathToAbsolute:r,path2absolute:r,pathTocurve:a,path2curve:a,rectPath:n(136)}},function(t,e,n){var i=n(4),r=n(136),a=n(138),o=function(t,e,n,i,r){return t*(t*(-3*e+9*n-9*i+3*r)+6*e-12*n+6*i)-3*e+3*n},s=function(t,e,n,i,r,a,s,l,u){null===u&&(u=1);for(var c=(u=u>1?1:u<0?0:u)/2,h=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],f=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],p=0,g=0;g<12;g++){var d=c*h[g]+c,v=o(d,t,n,r,s),y=o(d,e,i,a,l),x=v*v+y*y;p+=f[g]*Math.sqrt(x)}return c*p},l=function(t,e,n,i,r,a,o,s){if(!(Math.max(t,n)<Math.min(r,o)||Math.min(t,n)>Math.max(r,o)||Math.max(e,i)<Math.min(a,s)||Math.min(e,i)>Math.max(a,s))){var l=(t-n)*(a-s)-(e-i)*(r-o);if(l){var u=((t*i-e*n)*(r-o)-(t-n)*(r*s-a*o))/l,c=((t*i-e*n)*(a-s)-(e-i)*(r*s-a*o))/l,h=+u.toFixed(2),f=+c.toFixed(2);if(!(h<+Math.min(t,n).toFixed(2)||h>+Math.max(t,n).toFixed(2)||h<+Math.min(r,o).toFixed(2)||h>+Math.max(r,o).toFixed(2)||f<+Math.min(e,i).toFixed(2)||f>+Math.max(e,i).toFixed(2)||f<+Math.min(a,s).toFixed(2)||f>+Math.max(a,s).toFixed(2)))return{x:u,y:c}}}},u=function(t,e,n){return e>=t.x&&e<=t.x+t.width&&n>=t.y&&n<=t.y+t.height},c=function(t,e,n,i){return null===t&&(t=e=n=i=0),null===e&&(e=t.y,n=t.width,i=t.height,t=t.x),{x:t,y:e,width:n,w:n,height:i,h:i,x2:t+n,y2:e+i,cx:t+n/2,cy:e+i/2,r1:Math.min(n,i)/2,r2:Math.max(n,i)/2,r0:Math.sqrt(n*n+i*i)/2,path:r(t,e,n,i),vb:[t,e,n,i].join(" ")}},h=function(t,e,n,r,a,o,s,l){i(t)||(t=[t,e,n,r,a,o,s,l]);var u=function(t,e,n,i,r,a,o,s){for(var l=[],u=[[],[]],c=void 0,h=void 0,f=void 0,p=void 0,g=0;g<2;++g)if(0===g?(h=6*t-12*n+6*r,c=-3*t+9*n-9*r+3*o,f=3*n-3*t):(h=6*e-12*i+6*a,c=-3*e+9*i-9*a+3*s,f=3*i-3*e),Math.abs(c)<1e-12){if(Math.abs(h)<1e-12)continue;(p=-f/h)>0&&p<1&&l.push(p)}else{var d=h*h-4*f*c,v=Math.sqrt(d);if(!(d<0)){var y=(-h+v)/(2*c);y>0&&y<1&&l.push(y);var x=(-h-v)/(2*c);x>0&&x<1&&l.push(x)}}for(var m=l.length,_=m,b=void 0;m--;)b=1-(p=l[m]),u[0][m]=b*b*b*t+3*b*b*p*n+3*b*p*p*r+p*p*p*o,u[1][m]=b*b*b*e+3*b*b*p*i+3*b*p*p*a+p*p*p*s;return u[0][_]=t,u[1][_]=e,u[0][_+1]=o,u[1][_+1]=s,u[0].length=u[1].length=_+2,{min:{x:Math.min.apply(0,u[0]),y:Math.min.apply(0,u[1])},max:{x:Math.max.apply(0,u[0]),y:Math.max.apply(0,u[1])}}}.apply(null,t);return c(u.min.x,u.min.y,u.max.x-u.min.x,u.max.y-u.min.y)},f=function(t,e,n,i,r,a,o,s,l){var u=1-l,c=Math.pow(u,3),h=Math.pow(u,2),f=l*l,p=f*l,g=t+2*l*(n-t)+f*(r-2*n+t),d=e+2*l*(i-e)+f*(a-2*i+e),v=n+2*l*(r-n)+f*(o-2*r+n),y=i+2*l*(a-i)+f*(s-2*a+i);return{x:c*t+3*h*l*n+3*u*l*l*r+p*o,y:c*e+3*h*l*i+3*u*l*l*a+p*s,m:{x:g,y:d},n:{x:v,y:y},start:{x:u*t+l*n,y:u*e+l*i},end:{x:u*r+l*o,y:u*a+l*s},alpha:90-180*Math.atan2(g-v,d-y)/Math.PI}},p=function(t,e,n){if(!function(t,e){return t=c(t),e=c(e),u(e,t.x,t.y)||u(e,t.x2,t.y)||u(e,t.x,t.y2)||u(e,t.x2,t.y2)||u(t,e.x,e.y)||u(t,e.x2,e.y)||u(t,e.x,e.y2)||u(t,e.x2,e.y2)||(t.x<e.x2&&t.x>e.x||e.x<t.x2&&e.x>t.x)&&(t.y<e.y2&&t.y>e.y||e.y<t.y2&&e.y>t.y)}(h(t),h(e)))return n?0:[];for(var i=~~(s.apply(0,t)/8),r=~~(s.apply(0,e)/8),a=[],o=[],p={},g=n?0:[],d=0;d<i+1;d++){var v=f.apply(0,t.concat(d/i));a.push({x:v.x,y:v.y,t:d/i})}for(var y=0;y<r+1;y++){var x=f.apply(0,e.concat(y/r));o.push({x:x.x,y:x.y,t:y/r})}for(var m=0;m<i;m++)for(var _=0;_<r;_++){var b=a[m],w=a[m+1],S=o[_],M=o[_+1],C=Math.abs(w.x-b.x)<.001?"y":"x",A=Math.abs(M.x-S.x)<.001?"y":"x",k=l(b.x,b.y,w.x,w.y,S.x,S.y,M.x,M.y);if(k){if(p[k.x.toFixed(4)]===k.y.toFixed(4))continue;p[k.x.toFixed(4)]=k.y.toFixed(4);var P=b.t+Math.abs((k[C]-b[C])/(w[C]-b[C]))*(w.t-b.t),T=S.t+Math.abs((k[A]-S[A])/(M[A]-S[A]))*(M.t-S.t);P>=0&&P<=1&&T>=0&&T<=1&&(n?g++:g.push({x:k.x,y:k.y,t1:P,t2:T}))}}return g};t.exports=function(t,e){return function(t,e,n){t=a(t),e=a(e);for(var i=void 0,r=void 0,o=void 0,s=void 0,l=void 0,u=void 0,c=void 0,h=void 0,f=void 0,g=void 0,d=n?0:[],v=0,y=t.length;v<y;v++){var x=t[v];if("M"===x[0])i=l=x[1],r=u=x[2];else{"C"===x[0]?(i=(f=[i,r].concat(x.slice(1)))[6],r=f[7]):(f=[i,r,i,r,l,u,l,u],i=l,r=u);for(var m=0,_=e.length;m<_;m++){var b=e[m];if("M"===b[0])o=c=b[1],s=h=b[2];else{"C"===b[0]?(o=(g=[o,s].concat(b.slice(1)))[6],s=g[7]):(g=[o,s,o,s,c,h,c,h],o=c,s=h);var w=p(f,g,n);if(n)d+=w;else{for(var S=0,M=w.length;S<M;S++)w[S].segment1=v,w[S].segment2=m,w[S].bez1=f,w[S].bez2=g;d=d.concat(w)}}}}}return d}(t,e)}},function(t,e){function n(t,e){function n(t,e){if(1===t.length)i.push(t[0]),r.push(t[0]);else{for(var a=[],o=0;o<t.length-1;o++)0===o&&i.push(t[0]),o===t.length-2&&r.push(t[o+1]),a[o]=[(1-e)*t[o][0]+e*t[o+1][0],(1-e)*t[o][1]+e*t[o+1][1]];n(a,e)}}var i=[],r=[];return t.length&&n(t,e),{left:i,right:r.reverse()}}function i(t,e,i){if(1===i)return[[].concat(t)];var r=[];if("L"===e[0]||"C"===e[0]||"Q"===e[0])r=r.concat(function(t,e,i){var r=[[t[1],t[2]]];i=i||2;var a=[];"A"===e[0]?(r.push(e[6]),r.push(e[7])):"C"===e[0]?(r.push([e[1],e[2]]),r.push([e[3],e[4]]),r.push([e[5],e[6]])):"S"===e[0]||"Q"===e[0]?(r.push([e[1],e[2]]),r.push([e[3],e[4]])):r.push([e[1],e[2]]);for(var o=r,s=1/i,l=0;l<i-1;l++){var u=n(o,s/(1-s*l));a.push(u.left),o=u.right}return a.push(o),a.map(function(t){var e=[];return 4===t.length&&(e.push("C"),e=e.concat(t[2])),t.length>=3&&(3===t.length&&e.push("Q"),e=e.concat(t[1])),2===t.length&&e.push("L"),e=e.concat(t[t.length-1])})}(t,e,i));else{var a=[].concat(t);"M"===a[0]&&(a[0]="L");for(var o=0;o<=i-1;o++)r.push(a)}return r}t.exports=function(t,e){if(1===t.length)return t;var n=t.length-1,r=e.length-1,a=n/r,o=[];if(1===t.length&&"M"===t[0][0]){for(var s=0;s<r-n;s++)t.push(t[0]);return t}for(var l=0;l<r;l++){var u=Math.floor(a*l);o[u]=(o[u]||0)+1}var c=o.reduce(function(e,r,a){return a===n?e.concat(t[n]):e.concat(i(t[a],t[a+1],r))},[]);return c.unshift(t[0]),"Z"!==e[r]&&"z"!==e[r]||c.push("Z"),c}},function(t,e,n){function i(t,e,n){var i=null,r=n;return e<r&&(r=e,i="add"),t<r&&(r=t,i="del"),{type:i,min:r}}var r=n(272);t.exports=function(t,e){var n=function(t,e){var n=t.length,a=e.length,o=void 0,s=void 0,l=0;if(0===n||0===a)return null;for(var u=[],c=0;c<=n;c++)u[c]=[],u[c][0]={min:c};for(var h=0;h<=a;h++)u[0][h]={min:h};for(var f=1;f<=n;f++){o=t[f-1];for(var p=1;p<=a;p++){s=e[p-1],l=r(o,s)?0:1;var g=u[f-1][p].min+1,d=u[f][p-1].min+1,v=u[f-1][p-1].min+l;u[f][p]=i(g,d,v)}}return u}(t,e),a=t.length,o=e.length,s=[],l=1,u=1;if(n[a][o]!==a){for(var c=1;c<=a;c++){var h=n[c][c].min;u=c;for(var f=l;f<=o;f++)n[c][f].min<h&&(h=n[c][f].min,u=f);l=u,n[c][l].type&&s.push({index:c-1,type:n[c][l].type})}for(var p=s.length-1;p>=0;p--)l=s[p].index,"add"===s[p].type?t.splice(l,0,[].concat(t[l])):t.splice(l,1)}if((a=t.length)<o)for(var g=0;g<o-a;g++)"z"===t[a-1][0]||"Z"===t[a-1][0]?t.splice(a-2,0,t[a-2]):t.push(t[a-1]);return t}},function(t,e,n){var i=n(2);t.exports=function(t,e){if(t.length!==e.length)return!1;var n=!0;return i(t,function(t,i){if(t!==e[i])return n=!1,!1}),n}},function(t,e){function n(t){var e=[];switch(t[0]){case"M":case"L":e.push([t[1],t[2]]);break;case"A":e.push([t[6],t[7]]);break;case"Q":e.push([t[3],t[4]]),e.push([t[1],t[2]]);break;case"T":e.push([t[1],t[2]]);break;case"C":e.push([t[5],t[6]]),e.push([t[1],t[2]]),e.push([t[3],t[4]]);break;case"S":e.push([t[3],t[4]]),e.push([t[1],t[2]]);break;case"H":case"V":e.push([t[1],t[1]])}return e}function i(t,e,i){for(var r=[].concat(t),a=void 0,o=1/(i+1),s=n(e)[0],l=1;l<=i;l++)o*=l,0===(a=Math.floor(t.length*o))?r.unshift([s[0]*o+t[a][0]*(1-o),s[1]*o+t[a][1]*(1-o)]):r.splice(a,0,[s[0]*o+t[a][0]*(1-o),s[1]*o+t[a][1]*(1-o)]);return r}t.exports=function(t,e){if(t.length<=1)return t;for(var r=void 0,a=0;a<e.length;a++)if(t[a][0]!==e[a][0])switch(r=n(t[a]),e[a][0]){case"M":t[a]=["M"].concat(r[0]);break;case"L":t[a]=["L"].concat(r[0]);break;case"A":t[a]=[].concat(e[a]),t[a][6]=r[0][0],t[a][7]=r[0][1];break;case"Q":if(r.length<2){if(!(a>0)){t[a]=e[a];break}r=i(r,t[a-1],1)}t[a]=["Q"].concat(r.reduce(function(t,e){return t.concat(e)},[]));break;case"T":t[a]=["T"].concat(r[0]);break;case"C":if(r.length<3){if(!(a>0)){t[a]=e[a];break}r=i(r,t[a-1],2)}t[a]=["C"].concat(r.reduce(function(t,e){return t.concat(e)},[]));break;case"S":if(r.length<2){if(!(a>0)){t[a]=e[a];break}r=i(r,t[a-1],1)}t[a]=["S"].concat(r.reduce(function(t,e){return t.concat(e)},[]));break;default:t[a]=e[a]}return t}},function(t,e,n){var i={lc:n(275),lowerCase:n(142),lowerFirst:n(75),substitute:n(276),uc:n(277),upperCase:n(143),upperFirst:n(87)};t.exports=i},function(t,e,n){t.exports=n(142)},function(t,e){t.exports=function(t,e){return t&&e?t.replace(/\\?\{([^{}]+)\}/g,function(t,n){return"\\"===t.charAt(0)?t.slice(1):void 0===e[n]?"":e[n]}):t}},function(t,e,n){t.exports=n(143)},function(t,e,n){var i=n(12),r={getType:n(84),isArray:n(4),isArrayLike:n(13),isBoolean:n(82),isFunction:n(11),isNil:n(5),isNull:n(279),isNumber:n(9),isObject:n(24),isObjectLike:n(48),isPlainObject:n(26),isPrototype:n(85),isType:i,isUndefined:n(280),isString:n(10),isRegExp:n(281),isDate:n(80),isArguments:n(282),isError:n(283)};t.exports=r},function(t,e){t.exports=function(t){return null===t}},function(t,e){t.exports=function(t){return void 0===t}},function(t,e,n){var i=n(12);t.exports=function(t){return i(t,"RegExp")}},function(t,e,n){var i=n(12);t.exports=function(t){return i(t,"Arguments")}},function(t,e,n){var i=n(12);t.exports=function(t){return i(t,"Error")}},function(t,e){t.exports=function(t,e,n){var i=void 0;return function(){var r=this,a=arguments,o=n&&!i;clearTimeout(i),i=setTimeout(function(){i=null,n||t.apply(r,a)},e),o&&t.apply(r,a)}}},function(t,e,n){var i=n(13);t.exports=function(t,e){if(!i(t))return-1;var n=Array.prototype.indexOf;if(n)return n.call(t,e);for(var r=-1,a=0;a<t.length;a++)if(t[a]===e){r=a;break}return r}},function(t,e,n){var i=n(11),r=n(49);t.exports=function(t,e,n){return i(n)?!!n(t,e):r(t,e)}},function(t,e,n){var i=n(2),r=n(13);t.exports=function(t,e){if(!r(t))return t;var n=[];return i(t,function(t,i){n.push(e(t,i))}),n}},function(t,e,n){var i=n(2),r=n(26),a=Object.prototype.hasOwnProperty;t.exports=function(t,e){if(null===t||!r(t))return{};var n={};return i(e,function(e){a.call(t,e)&&(n[e]=t[e])}),n}},function(t,e){t.exports=function(t,e,n){var i=void 0,r=void 0,a=void 0,o=void 0,s=0;n||(n={});var l=function(){s=!1===n.leading?0:Date.now(),i=null,o=t.apply(r,a),i||(r=a=null)},u=function(){var u=Date.now();s||!1!==n.leading||(s=u);var c=e-(u-s);return r=this,a=arguments,c<=0||c>e?(i&&(clearTimeout(i),i=null),s=u,o=t.apply(r,a),i||(r=a=null)):i||!1===n.trailing||(i=setTimeout(l,c)),o};return u.cancel=function(){clearTimeout(i),s=0,i=r=a=null},u}},function(t,e,n){function i(t,e){var n,i,r=function(t){if(f.isEmpty(t))return null;var e=t[0].x,n=t[0].x,i=t[0].y,r=t[0].y;return f.each(t,function(t){e=e>t.x?t.x:e,n=n<t.x?t.x:n,i=i>t.y?t.y:i,r=r<t.y?t.y:r}),{minX:e,maxX:n,minY:i,maxY:r,centerX:(e+n)/2,centerY:(i+r)/2}}(t.points||t.get("origin").points),a=e.startAngle,o=e.endAngle-a;return e.isTransposed?(n=r.maxY*o,i=r.minY*o):(n=r.maxX*o,i=r.minX*o),n+=a,i+=a,{startAngle:i,endAngle:n}}function r(t,e,n){var i={};return t.delay&&(i.delay=f.isFunction(t.delay)?t.delay(e,n):t.delay),i.easing=f.isFunction(t.easing)?t.easing(e,n):t.easing,i.duration=f.isFunction(t.duration)?t.duration(e,n):t.duration,i.callback=t.callback,i}function a(t,e){var n,i=t._id,a=t.get("index"),o=t.getBBox(),s=t.get("origin").points,l=(o.minX+o.maxX)/2,u=[l,n=s[0].y-s[1].y<=0?o.maxY:o.minY,1];t.apply(u),t.attr("transform",[["t",-l,-n],["s",1,.01],["t",l,n]]);var c={transform:[["t",-l,-n],["s",1,100],["t",l,n]]},h=r(e,a,i);t.animate(c,h.duration,h.easing,h.callback,h.delay)}function o(t,e){var n,i=t._id,a=t.get("index"),o=t.getBBox(),s=t.get("origin").points,l=(o.minY+o.maxY)/2,u=[n=s[0].y-s[1].y>0?o.maxX:o.minX,l,1];t.apply(u),t.attr({transform:[["t",-n,-l],["s",.01,1],["t",n,l]]});var c={transform:[["t",-n,-l],["s",100,1],["t",n,l]]},h=r(e,a,i);t.animate(c,h.duration,h.easing,h.callback,h.delay)}function s(t,e,n){var i,a,o=t._id,s=t.get("index");if(n.isPolar&&"point"!==t.name)i=n.getCenter().x,a=n.getCenter().y;else{var l=t.getBBox();i=(l.minX+l.maxX)/2,a=(l.minY+l.maxY)/2}var u=[i,a,1];t.apply(u),t.attr({transform:[["t",-i,-a],["s",.01,.01],["t",i,a]]});var c={transform:[["t",-i,-a],["s",100,100],["t",i,a]]},h=r(e,s,o);t.animate(c,h.duration,h.easing,h.callback,h.delay)}function l(t,e){if("path"===t.get("type")){var n=t._id,i=t.get("index"),a=g.pathToAbsolute(t.attr("path"));t.attr("path",[a[0]]);var o={path:a},s=r(e,i,n);t.animate(o,s.duration,s.easing,s.callback,s.delay)}}function u(t,e,n,i,a){var o,s=function(t){var e,n,i,r,a,o=t.start,s=t.end,l=t.getWidth(),u=t.getHeight();return t.isPolar?(r=t.getRadius(),i=t.getCenter(),e=t.startAngle,n=t.endAngle,(a=new p.Fan({attrs:{x:i.x,y:i.y,rs:0,re:r+200,startAngle:e,endAngle:e}})).endState={endAngle:n}):(a=new p.Rect({attrs:{x:o.x-200,y:s.y-200,width:t.isTransposed?l+400:0,height:t.isTransposed?0:u+400}}),t.isTransposed?a.endState={height:u+400}:a.endState={width:l+400}),a.isClip=!0,a}(n),l=t.get("canvas"),u=t._id,c=t.get("index");i?(s.attr("startAngle",i),s.attr("endAngle",i),o={endAngle:a}):o=s.endState,s.set("canvas",l),t.attr("clip",s),t.setSilent("animating",!0);var h=r(e,c,u);s.animate(o,h.duration,h.easing,function(){t&&!t.get("destroyed")&&(t.attr("clip",null),t.setSilent("cacheShape",null),t.setSilent("animating",!1),s.remove())},h.delay)}function c(t,e){var n=t._id,i=t.get("index"),a=f.isNil(t.attr("fillOpacity"))?1:t.attr("fillOpacity"),o=f.isNil(t.attr("strokeOpacity"))?1:t.attr("strokeOpacity");t.attr("fillOpacity",0),t.attr("strokeOpacity",0);var s={fillOpacity:a,strokeOpacity:o},l=r(e,i,n);t.animate(s,l.duration,l.easing,l.callback,l.delay)}function h(t,e,n){var r=i(t,n),a=r.endAngle;u(t,e,n,r.startAngle,a)}var f=n(0),p=n(16),g=f.PathUtil;t.exports={enter:{clipIn:u,zoomIn:s,pathIn:l,scaleInY:a,scaleInX:o,fanIn:h,fadeIn:c},leave:{lineWidthOut:function(t,e){var n={lineWidth:0,opacity:0},i=t._id,a=r(e,t.get("index"),i);t.animate(n,a.duration,a.easing,function(){t.remove()},a.delay)},zoomOut:function(t,e,n){var i,a,o=t._id,s=t.get("index");if(n.isPolar&&"point"!==t.name)i=n.getCenter().x,a=n.getCenter().y;else{var l=t.getBBox();i=(l.minX+l.maxX)/2,a=(l.minY+l.maxY)/2}var u=[i,a,1];t.apply(u);var c={transform:[["t",-i,-a],["s",.01,.01],["t",i,a]]},h=r(e,s,o);t.animate(c,h.duration,h.easing,function(){t.remove()},h.delay)},pathOut:function(t,e){if("path"===t.get("type")){var n=t._id,i=t.get("index"),a={path:[g.pathToAbsolute(t.attr("path"))[0]]},o=r(e,i,n);t.animate(a,o.duration,o.easing,function(){t.remove()},o.delay)}},fadeOut:function(t,e){var n=t._id,i={fillOpacity:0,strokeOpacity:0},a=r(e,t.get("index"),n);t.animate(i,a.duration,a.easing,function(){t.remove()},a.delay)}},appear:{clipIn:u,zoomIn:s,pathIn:l,scaleInY:a,scaleInX:o,fanIn:h,fadeIn:c},update:{fadeIn:c,fanIn:h}}},function(t,e,n){function i(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}function r(t,e,n){var i=(t-e)/(n-e);return i>=0&&i<=1}function a(t,e){var n=!1;if(t){if("theta"===t.type){var i=t.start,a=t.end;n=r(e.x,i.x,a.x)&&r(e.y,i.y,a.y)}else{var o=t.invert(e);n=o.x>=0&&o.y>=0&&o.x<=1&&o.y<=1}}return n}var o=n(148),s=n(20),l=n(0),u=n(165),c=n(7),h=n(151),f=n(355),p={};l.each(s,function(t,e){var n=l.lowerFirst(e);p[n]=function(e){var n=new t(e);return this.addGeom(n),n}});var g=function(t){function e(e){var n,r=i(i(n=t.call(this,e)||this));return r._setTheme(),l.each(s,function(t,e){var n=l.lowerFirst(e);r[n]=function(e){void 0===e&&(e={}),e.viewTheme=r.get("viewTheme");var n=new t(e);return r.addGeom(n),n}}),r.init(),n}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){return{viewContainer:null,coord:null,start:{x:0,y:0},end:{x:1,y:1},geoms:[],scales:{},options:{},scaleController:null,padding:0,theme:null,parent:null,tooltipEnable:!0,animate:c.animate,visible:!0}},n._setTheme=function(){var t=this.get("theme"),e={},n={};l.isObject(t)?n=t:-1!==l.indexOf(Object.keys(h),t)&&(n=h[t]),l.deepMix(e,c,n),this.set("viewTheme",e)},n.init=function(){this._initViewPlot(),this.get("data")&&this._initData(this.get("data")),this._initOptions(),this._initControllers(),this._bindEvents()},n._initOptions=function(){var t=this,e=l.mix({},t.get("options"));e.scales||(e.scales={}),e.coord||(e.coord={}),!1===e.animate&&this.set("animate",!1),(!1===e.tooltip||l.isNull(e.tooltip))&&this.set("tooltipEnable",!1),e.geoms&&e.geoms.length&&l.each(e.geoms,function(e){t._createGeom(e)});var n=t.get("scaleController");n&&(n.defs=e.scales);var i=t.get("coordController");i&&i.reset(e.coord),this.set("options",e)},n._createGeom=function(t){var e,n=t.type;this[n]&&(e=this[n](),l.each(t,function(t,n){if(e[n])if(l.isObject(t)&&t.field)if("label"===t)e[n](t.field,t.callback,t.cfg);else{var i;l.each(t,function(t,e){"field"!==e&&(i=t)}),e[n](t.field,i)}else e[n](t)}))},n._initControllers=function(){var t=this.get("options"),e=this.get("viewTheme"),n=this.get("canvas"),i=new u.Scale({viewTheme:e,defs:t.scales}),r=new u.Coord(t.coord);this.set("scaleController",i),this.set("coordController",r);var a=new u.Axis({canvas:n,viewTheme:e});this.set("axisController",a);var o=new u.Guide({viewTheme:e,options:t.guides||[]});this.set("guideController",o)},n._initViewPlot=function(){this.get("viewContainer")||this.set("viewContainer",this.get("middlePlot"))},n._initGeoms=function(){for(var t=this.get("geoms"),e=this.get("filteredData"),n=this.get("coord"),i=this.get("_id"),r=0;r<t.length;r++){var a=t[r];a.set("data",e),a.set("coord",n),a.set("_id",i+"-geom"+r),a.set("keyFields",this.get("keyFields")),a.init()}},n._clearGeoms=function(){for(var t=this.get("geoms"),e=0;e<t.length;e++){t[e].clear()}},n._removeGeoms=function(){for(var t=this.get("geoms");t.length>0;){t.shift().destroy()}},n._drawGeoms=function(){this.emit("beforedrawgeoms");for(var t=this.get("geoms"),e=this.get("coord"),n=0;n<t.length;n++){var i=t[n];i.setCoord(e),i.paint()}this.emit("afterdrawgeoms")},n.isShapeInView=function(t){var e=this.get("_id"),n=t._id;return n?n.split("-")[0]===e:t.get("parent").get("viewId")===e},n.getViewRegion=function(){var t,e,n=this.get("parent");if(n){var i=n.getViewRegion(),r=this._getViewRegion(i.start,i.end);t=r.start,e=r.end}else t=this.get("start"),e=this.get("end");return{start:t,end:e}},n._getViewRegion=function(t,e){var n=this.get("start"),i=this.get("end"),r=n.x,a=1-i.y,o=i.x,s=1-n.y,u=this.get("padding"),c=l.toAllPadding(u),h=c[0],f=c[1],p=c[2],g=c[3];return{start:{x:r*(e.x-t.x)+t.x+g,y:a*(e.y-t.y)+t.y-p},end:{x:o*(e.x-t.x)+t.x-f,y:s*(e.y-t.y)+t.y+h}}},n._createCoord=function(){var t=this.get("coordController"),e=this.getViewRegion(),n=t.createCoord(e.start,e.end);this.set("coord",n)},n._renderAxes=function(){var t=this.get("options").axes;if(!1!==t){var e=this.get("axisController");e.container=this.get("backPlot"),e.coord=this.get("coord"),e.options=t||{};var n=this.getXScale(),i=this.getYScales(),r=this.get("_id");e.createAxis(n,i,r)}},n._renderGuides=function(){var t=this.get("guideController");if(!l.isEmpty(t.options)){var e=this.get("coord");t.view=this,t.backContainer=this.get("backPlot"),t.frontContainer=this.get("frontPlot"),t.xScales=this._getScales("x"),t.yScales=this._getScales("y"),t.render(e)}},n._bindEvents=function(){var t=new u.Event({view:this,canvas:this.get("canvas")});t.bindEvents(),this.set("eventController",t)},n._clearEvents=function(){var t=this.get("eventController");t&&t.clearEvents()},n._getScales=function(t){for(var e=this.get("geoms"),n={},i=0;i<e.length;i++){var r=e[i],a="x"===t?r.getXScale():r.getYScale();a&&!n[a.field]&&(n[a.field]=a)}return n},n._adjustScale=function(){this._setCatScalesRange();for(var t=this.get("geoms"),e=this.get("scaleController").defs,n=0;n<t.length;n++){var i=t[n];if("interval"===i.get("type")){var r=i.getYScale(),a=r.field,o=r.min,s=r.max,l=r.type;e[a]&&e[a].min||"time"===l||(o>0?r.change({min:0}):s<=0&&r.change({max:0}))}}},n._setCatScalesRange=function(){var t=this.get("coord"),e=this.get("viewTheme"),n=this.getXScale(),i=this.getYScales(),r=[];n&&r.push(n),r=r.concat(i);var a=t.isPolar&&function(t){var e=t.startAngle,n=t.endAngle;return!(!l.isNil(e)&&!l.isNil(n)&&n-e<2*Math.PI)}(t),o=this.get("scaleController").defs;l.each(r,function(n){if((n.isCategory||n.isIdentity)&&n.values&&(!o[n.field]||!o[n.field].range)){var i,r=n.values.length;if(1===r)i=[.5,1];else{var s=0;i=a?t.isTransposed?[(s=1/r*e.widthRatio.multiplePie)/2,1-s/2]:[0,1-1/r]:[s=1/r*1/2,1-s]}n.range=i}})},n.getXScale=function(){var t=this.get("geoms"),e=null;return l.isEmpty(t)||(e=t[0].getXScale()),e},n.getYScales=function(){for(var t=this.get("geoms"),e=[],n=0;n<t.length;n++){var i=t[n].getYScale();i&&-1===l.indexOf(e,i)&&e.push(i)}return e},n.getXY=function(t){var e,n,i=this.get("coord"),r=this._getScales("x"),a=this._getScales("y");for(var o in t)r[o]&&(e=r[o].scale(t[o])),a[o]&&(n=a[o].scale(t[o]));return l.isNil(e)||l.isNil(n)?null:i.convert({x:e,y:n})},n.getSnapRecords=function(t){var e=this.get("geoms"),n=[];return l.each(e,function(e){var i,r=e.get("dataArray");l.each(r,function(r){(i=e.findPoint(t,r))&&n.push(i)})}),n},n.addGeom=function(t){this.get("geoms").push(t),t.set("view",this);var e=this.get("viewContainer");t.set("container",e),t.set("animate",this.get("animate")),t.bindEvents()},n.removeGeom=function(t){var e=this.get("geoms");l.Array.remove(e,t),t.destroy()},n.createScale=function(t,e){var n=this.get("scales"),i=this.get("parent"),r=n[t];if(!e){var a=this.get("filteredData"),o=this._getFieldsForLegend();e=a.length&&-1===o.indexOf(t)?a:this.get("data")}var s=this.get("scaleController");if(r){if(r.sync){var l=s.createScale(t,e);this._syncScale(r,l)}}else{if((r=s.createScale(t,e)).sync&&i){var u=i.createScale(t,e);r=this._getSyncScale(u,r)}n[t]=r}return r},n._getFieldsForLegend=function(){var t=[],e=this.get("geoms");return l.each(e,function(e){var n=e.getFieldsForLegend();t=t.concat(n)}),l.uniq(t)},n._getSyncScale=function(t,e){return t.type!==e.type?e:(this._syncScale(t,e),t)},n._syncScale=function(t,e){var n=l.union(t.values,e.values);if(e.isLinear){var i=Math.max(t.max,e.max),r=Math.min(t.min,e.min);t.max===i&&t.min===r||t.change({min:r,max:i,values:n})}n.length!==t.values.length&&t.change({values:n})},n.getFilteredValues=function(t){var e=this.get("scales")[t].values,n=this._getFilters();return n&&n[t]?e.filter(n[t]):e.slice(0)},n.getFilteredOutValues=function(t){var e=this.get("scales")[t].values,n=this._getFilters();return n&&n[t]?e.filter(function(e){return!n[t](e)}):[]},n.filter=function(t,e){var n=this.get("options");n.filters||(n.filters={}),n.filters[t]=e,this.get("scaleController").filters=n.filters},n._getFilters=function(){return this.get("options").filters},n.execFilter=function(t){var e=this._getFilters();return e&&(t=t.filter(function(t){var n=!0;return l.each(e,function(e,i){if(e&&!(n=e(t[i],t)))return!1}),n})),t},n.axis=function(t,e){var n=this.get("options");if(!1===t)n.axes=!1;else{n.axes||(n.axes={});n.axes[t]=e}return this},n.guide=function(){return this.get("guideController")},n._getKeyFields=function(t){var e=[];l.each(t,function(t,n){t.key&&e.push(n)}),this.set("keyFields",e)},n.scale=function(t,e){var n=this.get("options").scales;return l.isObject(t)?l.mix(n,t):n[t]=e,this._getKeyFields(n),this},n.tooltip=function(t){return this.set("tooltipEnable",t),this},n.animate=function(t){return this.get("options").animate=t,this.set("animate",t),this},n.changeOptions=function(t){return this.set("options",t),this._initOptions(t),this},n.getViewsByPoint=function(t){var e=[],n=this.get("views");return a(this.get("coord"),t)&&e.push(this),l.each(n,function(n){n.get("visible")&&a(n.get("coord"),t)&&e.push(n)}),e},n.eachShape=function(t){var e=this,n=e.get("views"),i=e.get("canvas");l.each(n,function(e){e.eachShape(t)});var r=this.get("geoms");return l.each(r,function(n){var i=n.getShapes();l.each(i,function(i){var r=i.get("origin");if(l.isArray(r)){var a=r.map(function(t){return t._origin});t(a,i,n,e)}else{var o=r._origin;t(o,i,n,e)}})}),i.draw(),this},n.filterShape=function(t){return this.eachShape(function(e,n,i,r){t(e,n,i,r)?n.show():n.hide()}),this},n.clearInner=function(){this.set("scales",{}),this.emit("beforeclearinner");this.get("options").geoms=null,this._clearGeoms(),this.get("guideController")&&this.get("guideController").reset(),this.get("axisController")&&this.get("axisController").clear(),this.emit("afterclearinner")},n.clear=function(){return this.get("options").filters=null,this._removeGeoms(),this.clearInner(),this.get("guideController")&&this.get("guideController").clear(),this.set("isUpdate",!1),this.set("keyFields",[]),this},n.coord=function(t,e){var n=this.get("coordController");return n.reset({type:t,cfg:e}),n},n.resetCoord=function(){this._createCoord()},n.source=function(t,e){return this._initData(t),e&&this.scale(e),this.emit("setdata"),this},n.changeData=function(t){return this.emit("beforechangedata"),this._initData(t),this.emit("afterchangedata"),this.repaint(),this},n._initData=function(t){var e=this.get("dataView");e&&(e.off("change",l.getWrapBehavior(this,"_onViewChange")),this.set("dataView",null)),t&&t.isDataView&&(t.on("change",l.wrapBehavior(this,"_onViewChange")),this.set("dataView",t),t=t.rows),this.set("data",t)},n._onViewChange=function(){this.emit("beforechangedata");var t=this.get("dataView").rows;this.set("data",t),this.emit("afterchangedata"),this.repaint()},n.beforeRender=function(){var t=this.get("views");l.each(t,function(t){t.beforeRender()}),this.initView()},n.drawComponents=function(){var t=this.get("views");l.each(t,function(t){t.drawComponents()}),this._renderAxes(),this._renderGuides()},n.drawCanvas=function(t){if(!t){var e=this.get("views");this.get("backPlot").sort();var n=this.get("canvas");if(this.get("animate")){var i=this.get("isUpdate");l.each(e,function(t){f.execAnimation(t,i)}),f.execAnimation(this,i)}else n.draw()}},n.render=function(t){return this.clearInner(),this.emit("beforerender"),this.beforeRender(),this.emit("beforepaint"),this.drawComponents(),this.paint(),this.emit("afterpaint"),this.drawCanvas(t),this.emit("afterrender"),this.set("rendered",!0),this},n.initView=function(){var t=this.get("data")||[],e=this.execFilter(t);this.set("filteredData",e),this._createCoord(),this.emit("beforeinitgeoms"),this._initGeoms(),this._adjustScale()},n.paint=function(){var t=this.get("views");l.each(t,function(t){t.paint()});var e=this.get("data");l.isEmpty(e)||this._drawGeoms(),this.get("visible")||this.changeVisible(!1,!0)},n.changeVisible=function(t,e){var n=this.get("geoms");if(l.each(n,function(e){e.changeVisible(t,!0)}),this.get("axisController")&&this.get("axisController").changeVisible(t),this.get("guideController")&&this.get("guideController").changeVisible(t),!e){this.get("canvas").draw()}},n.repaint=function(){this.set("isUpdate",!0),this.clearInner(),this.render()},n.destroy=function(){this._clearEvents();var e=this.get("dataView");e&&e.off("change",l.getWrapBehavior(this,"_onViewChange")),this.clear(),t.prototype.destroy.call(this)},e}(o);t.exports=g},function(t,e,n){var i=n(5),r=n(4),a=n(2),o=function(t){function e(e){var n;return n=t.call(this,e)||this,n.names=["x","y"],n.type="position",n}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);return e.prototype.mapping=function(t,e){var n,o,s,l=this.scales,u=this.coord,c=l[0],h=l[1];if(i(t)||i(e))return[];if(r(e)&&r(t)){n=[],o=[];for(var f=0,p=0,g=t.length,d=e.length;f<g&&p<d;f++,p++)s=u.convertPoint({x:c.scale(t[f]),y:h.scale(e[p])}),n.push(s.x),o.push(s.y)}else if(r(e))t=c.scale(t),o=[],a(e,function(e){e=h.scale(e),s=u.convertPoint({x:t,y:e}),n&&n!==s.x?(r(n)||(n=[n]),n.push(s.x)):n=s.x,o.push(s.y)});else if(r(t))e=h.scale(e),n=[],a(t,function(t){t=c.scale(t),s=u.convertPoint({x:t,y:e}),o&&o!==s.y?(r(o)||(o=[o]),o.push(s.y)):o=s.y,n.push(s.x)});else{t=c.scale(t),e=h.scale(e);var v=u.convertPoint({x:t,y:e});n=v.x,o=v.y}return[n,o]},e}(n(29));t.exports=o},function(t,e,n){var i=n(10),r=n(149),a=function(t){function e(e){var n;return n=t.call(this,e)||this,n.names=["color"],n.type="color",n.gradient=null,i(n.values)&&(n.linear=!0),n}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);return e.prototype.getLinearValue=function(t){var e=this.gradient;if(!e){var n=this.values;e=r.gradient(n),this.gradient=e}return e(t)},e}(n(29));t.exports=a},function(t,e,n){var i=function(t){function e(e){var n;return n=t.call(this,e)||this,n.names=["shape"],n.type="shape",n.gradient=null,n}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);return e.prototype.getLinearValue=function(t){var e=this.values;return e[Math.round((e.length-1)*t)]},e}(n(29));t.exports=i},function(t,e,n){var i=function(t){function e(e){var n;return n=t.call(this,e)||this,n.names=["size"],n.type="size",n.gradient=null,n}return function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t),e}(n(29));t.exports=i},function(t,e,n){var i=function(t){function e(e){var n;return n=t.call(this,e)||this,n.names=["opacity"],n.type="opacity",n.gradient=null,n}return function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t),e}(n(29));t.exports=i},function(t,e,n){var i=n(8),r=n(30),a=n(298),o=n(299),s=n(150),l=n(300),u=n(301);i(r.prototype,s),i(a.prototype,s,l),i(o.prototype,u),r.Jitter=n(302),r.Symmetric=n(303),r.Dodge=a,r.Stack=o,t.exports=r},function(t,e,n){var i=n(30),r=n(2),a=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n._initDefaultCfg=function(){this.marginRatio=.5,this.dodgeRatio=.5,this.adjustNames=["x","y"]},n.getDodgeOffset=function(t,e,n){var i=t.pre,r=t.next,a=r-i,o=a*this.dodgeRatio/n,s=this.marginRatio*o;return(i+r)/2+(.5*(a-n*o-(n-1)*s)+((e+1)*o+e*s)-.5*o-.5*a)},n.processAdjust=function(t){var e=this,n=t.length,i=e.xField;r(t,function(t,r){for(var a=0,o=t.length;a<o;a++){var s=t[a],l=s[i],u={pre:l-.5,next:l+.5},c=e.getDodgeOffset(u,r,n);s[i]=c}})},e}(i);i.Dodge=a,t.exports=a},function(t,e,n){var i=n(4),r=n(5),a=n(30),o=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n._initDefaultCfg=function(){this.xField=null,this.yField=null},n.processAdjust=function(t){this.processStack(t)},n.processStack=function(t){var e=this.xField,n=this.yField,a=t.length,o={positive:{},negative:{}};this.reverseOrder&&(t=t.slice(0).reverse());for(var s=0;s<a;s++)for(var l=t[s],u=0,c=l.length;u<c;u++){var h=l[u],f=h[e]||0,p=h[n],g=f.toString();if(p=i(p)?p[1]:p,!r(p)){var d=p>=0?"positive":"negative";o[d][g]||(o[d][g]=0),h[n]=[o[d][g],p+o[d][g]],o[d][g]+=p}}},e}(a);a.Stack=o,t.exports=o},function(t,e,n){var i={merge:n(42),values:n(64)},r=n(144),a=n(2);t.exports={processAdjust:function(t){var e=i.merge(t),n=this.dodgeBy,a=t;n&&(a=r(e,n)),this.cacheMap={},this.adjDataArray=a,this.mergeData=e,this.adjustData(a,e),this.adjDataArray=null,this.mergeData=null},getDistribution:function(t){var e=this.adjDataArray,n=this.cacheMap,r=n[t];return r||(r={},a(e,function(e,n){var o=i.values(e,t);o.length||o.push(0),a(o,function(t){r[t]||(r[t]=[]),r[t].push(n)})}),n[t]=r),r},adjustDim:function(t,e,n,i,r){var o=this,s=o.getDistribution(t),l=o.groupData(n,t);a(l,function(n,i){i=parseFloat(i);var l;l=1===e.length?{pre:e[0]-1,next:e[0]+1}:o.getAdjustRange(t,i,e),a(n,function(e){var n=e[t],i=s[n],a=i.indexOf(r);e[t]=o.getDodgeOffset(l,a,i.length)})})}}},function(t,e){t.exports={_initDefaultCfg:function(){this.xField=null,this.yField=null,this.height=null,this.size=10,this.reverseOrder=!1,this.adjustNames=["y"]},processOneDimStack:function(t){var e=this.xField,n=this.yField||"y",i=this.height,r={};this.reverseOrder&&(t=t.slice(0).reverse());for(var a=0,o=t.length;a<o;a++)for(var s=t[a],l=0,u=s.length;l<u;l++){var c=s[l],h=2*(c.size||this.size)/i,f=c[e];r[f]||(r[f]=h/2),c[n]=r[f],r[f]+=h}},processAdjust:function(t){this.yField?this.processStack(t):this.processOneDimStack(t)}}},function(t,e,n){var i=n(2),r=n(8),a={merge:n(42)},o=n(30),s=n(150),l=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n._initDefaultCfg=function(){this.xField=null,this.yField=null,this.adjustNames=["x","y"],this.groupFields=null},n.processAdjust=function(t){var e=a.merge(t);this.adjDataArray=t,this.mergeData=e,this.adjustData(t,e),this.adjFrames=null,this.mergeData=null},n.getAdjustOffset=function(t,e){var n=e-t;return t+.05*n+.9*n*Math.random()},n._adjustGroup=function(t,e,n,r){var a=this,o=a.getAdjustRange(e,n,r);i(t,function(t){t[e]=a.getAdjustOffset(o.pre,o.next)})},n.adjustDim=function(t,e,n){var r=this,a=r.groupData(n,t);i(a,function(n,i){i=parseFloat(i),r._adjustGroup(n,t,i,e)})},e}(o);r(l.prototype,s),o.Jitter=l,t.exports=l},function(t,e,n){var i=n(2),r=n(132),a=n(4),o={merge:n(42)},s=n(30),l=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n._initDefaultCfg=function(){this.xField=null,this.yField=null,this.cacheMax=null,this.adjustNames=["y"],this.groupFields=null},n._getMax=function(t){var e=this.mergeData,n=r(e,function(e){var n=e[t];return a(n)?Math.max.apply(null,n):n})[t];return a(n)?Math.max.apply(null,n):n},n._getXValuesMax=function(){var t=this.yField,e=this.xField,n={},r=this.mergeData;return i(r,function(i){var r=i[e],o=i[t],s=a(o)?Math.max.apply(null,o):o;n[r]=n[r]||0,n[r]<s&&(n[r]=s)}),n},n.processAdjust=function(t){var e=o.merge(t);this.mergeData=e,this._processSymmetric(t),this.mergeData=null},n._processSymmetric=function(t){var e,n=this.xField,r=this.yField,o=this._getMax(r),s=t[0][0];s&&a(s[r])&&(e=this._getXValuesMax()),i(t,function(t){i(t,function(t){var s,l=t[r];if(a(l)){var u=t[n],c=e[u];s=(o-c)/2;var h=[];i(l,function(t){h.push(s+t)}),t[r]=h}else s=(o-l)/2,t[r]=[s,l+s]})})},e}(s);s.Symmetric=l,t.exports=l},function(t,e,n){var i,r,a=n(0),o=n(152),s=a.deepMix({},o,{background:{fill:"#1F1F1F",radius:2},plotBackground:{fill:"#1F1F1F"},axis:{top:{label:{textStyle:{fill:"#A6A6A6"}},line:{stroke:"#737373"},tickLine:{stroke:"#737373"}},bottom:{label:{textStyle:{fill:"#A6A6A6"}},line:{stroke:"#737373"},tickLine:{stroke:"#737373"}},left:{label:{textStyle:{fill:"#A6A6A6"}},grid:{lineStyle:{stroke:"#404040"}}},right:{label:{textStyle:{fill:"#A6A6A6"}},grid:{lineStyle:{stroke:"#404040"}}},circle:{label:{textStyle:{fill:"#A6A6A6"}},line:{stroke:"#737373"},tickLine:{stroke:"#737373"},grid:{lineStyle:{stroke:"#404040"}}},radius:{label:{textStyle:{fill:"#A6A6A6"}},line:{stroke:"#737373"},tickLine:{stroke:"#737373"},grid:{lineStyle:{stroke:"#404040"}}},helix:{line:{stroke:"#737373"},tickLine:{stroke:"#737373"}}},label:{textStyle:{fill:"#A6A6A6"}},legend:{right:{textStyle:{fill:"#737373"},unCheckColor:"#bfbfbf"},left:{textStyle:{fill:"#737373"},unCheckColor:"#bfbfbf"},top:{textStyle:{fill:"#737373"},unCheckColor:"#bfbfbf"},bottom:{textStyle:{fill:"#737373"},unCheckColor:"#bfbfbf"},html:(i={},i["g2-legend"]={color:"#D9D9D9"},i),gradient:{textStyle:{fill:"#D9D9D9"},lineStyle:{stroke:"#404040"}}},tooltip:(r={},r["g2-tooltip"]={color:"#D9D9D9",backgroundColor:"rgba(0, 0, 0, 0.5)",boxShadow:"0px 0px 2px #000"},r),tooltipCrosshairsRect:{type:"rect",rectStyle:{fill:"#fff",opacity:.1}},tooltipCrosshairsLine:{lineStyle:{stroke:"rgba(255, 255, 255, 0.45)"}},guide:{line:{text:{style:{fill:"#A6A6A6"}}},text:{style:{fill:"#A6A6A6"}},region:{style:{lineWidth:0,fill:"#000",fillOpacity:.04}}}});t.exports=s},function(t,e,n){var i=n(65),r=n(164),a=n(335),o=n(336),s={getLabelsClass:function(t,e){var n=i;return"polar"===t?n=r:"theta"===t?n=a:"interval"!==e&&"polygon"!==e||(n=o),n}};t.exports=s},function(t,e,n){var i=n(31);i.Base=i,i.Circle=n(310),i.Grid=n(153),i.Helix=n(311),i.Line=n(312),i.Polyline=n(313),t.exports=i},function(t,e,n){function i(t,e,n,i){var r=t.getBBox(),a=r.width,o=r.height,s={x:e,y:n,textAlign:"center"};switch(i){case 0:s.y-=o/2,s.textAlign="left";break;case 1:s.y-=o/2,s.textAlign="right";break;case 2:s.y+=o/2,s.textAlign="right";break;case 3:s.y+=o/2,s.textAlign="left";break;case 5:s.y-=o/2;break;case 6:s.y+=o/2;break;case 7:s.x+=a/2,s.textAlign="left";break;case 8:s.x-=a/2,s.textAlign="right"}return t.attr(s),t.getBBox()}var r=n(155);t.exports=function(t){for(var e,n,a,o,s,l=new r,u=[],c=0;c<t.length;c++){a=(n=t[c]).attr("x"),o=n.attr("y"),s=!1;for(var h=0;h<8;h++)if(e=i(n,a,o,h),l.hasGap(e)){l.fillGap(e),s=!0;break}s||u.push(n)}for(var f=0;f<u.length;f++)u[f].remove();return s}},function(t,e,n){function i(t,e){var n,i=t.attr("x"),r=t.attr("y"),o=t.getBBox(),s=Math.sqrt(o.width*o.width+o.height*o.height),l=1,u=0,c=0,h=function(t){return[(t*=.1)*Math.cos(t),t*Math.sin(t)]};if(e.hasGap(o))return e.fillGap(o),!0;for(var f=!1,p=0;Math.min(Math.abs(u),Math.abs(c))<s&&p<a;)if(n=h(l+=-1),u=~~n[0],c=~~n[1],t.attr({x:i+u,y:r+c}),p++,e.hasGap(t.getBBox())){e.fillGap(o),f=!0;break}return f}var r=n(155),a=20;t.exports=function(t){for(var e,n=new r,a=[],o=0;o<t.length;o++)i(e=t[o],n)||a.push(e);for(var s=0;s<a.length;s++)a[s].remove()}},function(t,e){t.exports=function(t,e){for(var n,i,r=[],a=0;a<t.length;a++)n=t[a].getBBox(),i=e[a].getBBox(),n.width>i.width||n.height>i.height?r.push(t[a]):n.width*n.height>i.width*i.height&&r.push(t[a]);for(var o=0;o<r.length;o++)r[o].remove()}},function(t,e,n){var i=n(3),r=n(31),a=i.MatrixUtil.vec2,o=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{type:"circle",tickInterval:null,startAngle:-Math.PI/2,endAngle:3*Math.PI/2,line:{lineWidth:1,stroke:"#C0D0E0"},tickLine:{lineWidth:1,stroke:"#C0D0E0",length:5},_labelOffset:5})},n.parseTick=function(t,e,n){return{text:t,value:e/n}},n._getCirclePoint=function(t,e){var n=this.get("center");return e=e||this.get("radius"),{x:n.x+Math.cos(t)*e,y:n.y+Math.sin(t)*e}},n.getTickPoint=function(t){var e=this.get("startAngle"),n=e+(this.get("endAngle")-e)*t;return this._getCirclePoint(n)},n.getSideVector=function(t,e){var n=this.get("center"),r=[e.x-n.x,e.y-n.y];if(!i.isNil(t)){var o=a.length(r);a.scale(r,r,t/o)}return r},n.getSidePoint=function(t,e){var n=this.getSideVector(e,t);return{x:t.x+n[0],y:t.y+n[1]}},n.getTickEnd=function(t,e){var n=this.get("tickLine");return e=e||n.length,this.getSidePoint(t,e)},n.getTextAnchor=function(t){var e;return i.snapEqual(t[0],0)?e="center":t[0]>0?e="left":t[0]<0&&(e="right"),e},n.getLinePath=function(){var t=this.get("center"),e=t.x,n=t.y,i=this.get("radius"),r=i,a=this.get("startAngle"),o=this.get("endAngle"),s=this.get("inner"),l=[];if(Math.abs(o-a)===2*Math.PI)l=[["M",e,n],["m",0,-r],["a",i,r,0,1,1,0,2*r],["a",i,r,0,1,1,0,-2*r],["z"]];else{var u=this._getCirclePoint(a),c=this._getCirclePoint(o),h=Math.abs(o-a)>Math.PI?1:0,f=a>o?0:1;if(s){var p=this.getSideVector(s*i,u),g=this.getSideVector(s*i,c),d={x:p[0]+e,y:p[1]+n},v={x:g[0]+e,y:g[1]+n};l=[["M",d.x,d.y],["L",u.x,u.y],["A",i,r,0,h,f,c.x,c.y],["L",v.x,v.y],["A",i*s,r*s,0,h,Math.abs(f-1),d.x,d.y]]}else l=[["M",e,n],["L",u.x,u.y],["A",i,r,0,h,f,c.x,c.y],["L",e,n]]}return l},n.addLabel=function(e,n,i){var r=this.get("label").offset||this.get("_labelOffset")||.001;n=this.getSidePoint(n,r),t.prototype.addLabel.call(this,e,n,i)},n.autoRotateLabels=function(){var t=this.get("ticks"),e=this.get("labelRenderer");if(e&&t.length>12){var n=this.get("radius"),r=this.get("startAngle"),a=this.get("endAngle")-r,o=a/(t.length-1),s=Math.sin(o/2)*n*2,l=this.getMaxLabelWidth(e);i.each(e.get("group").get("children"),function(e,n){var i=t[n].value*a+r,o=i%(2*Math.PI);l<s?(o<=0&&(i+=Math.PI),o>Math.PI&&(i-=Math.PI),i-=Math.PI/2,e.attr("textAlign","center")):o>Math.PI/2?i-=Math.PI:o<Math.PI/2*-1&&(i+=Math.PI),e.rotateAtStart(i)})}},e}(r);t.exports=o},function(t,e,n){var i=n(3),r=n(31),a=i.MatrixUtil,o=i.PathUtil,s=a.vec2,l=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{inner:0,type:"helix",line:{lineWidth:1,stroke:"#C0D0E0"},tickLine:{lineWidth:1,stroke:"#C0D0E0",length:5},startAngle:1.25*Math.PI,endAngle:7.25*Math.PI,a:0,center:null,axisStart:null,crp:[]})},n.getLinePath=function(){var t=this.get("crp"),e=this.get("axisStart"),n=o.catmullRomToBezier(t);return n.unshift(["M",e.x,e.y]),n},n.getTickPoint=function(t){var e=this.get("startAngle"),n=e+(this.get("endAngle")-e)*t;return this._getHelixPoint(n)},n._getHelixPoint=function(t){var e=this.get("center"),n=this.get("a")*t+this.get("inner");return{x:e.x+Math.cos(t)*n,y:e.y+Math.sin(t)*n}},n.getSideVector=function(t,e){var n=this.get("center"),i=[e.x-n.x,e.y-n.y];if(t){var r=s.length(i);s.scale(i,i,t/r)}return i},n.getSidePoint=function(t,e){var n=this.getSideVector(e,t);return{x:t.x+n[0],y:t.y+n[1]}},n.getTickEnd=function(t,e){var n=this.get("tickLine");return e=e||n.length,this.getSidePoint(t,e)},e}(r);t.exports=l},function(t,e,n){var i=n(31),r=n(3),a=r.MatrixUtil.vec2,o=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return r.mix({},e,{x:null,y:null,line:{lineWidth:1,stroke:"#C0D0E0"},tickLine:{lineWidth:1,stroke:"#C0D0E0",length:5},isVertical:!1,start:null,end:null})},n._getAvgLabelLength=function(t){var e=t.get("group").get("children");return e[1].attr("x")-e[0].attr("x")},n._getAvgLabelHeightSpace=function(t){var e=t.get("group").get("children");return e[1].attr("y")-e[0].attr("y")},n.getSideVector=function(t){var e=this.get("isVertical"),n=this.get("factor");if(!r.isNumber(t))return[0,0];var i=this.get("start"),o=this.get("end"),s=this.getAxisVector(),l=a.normalize([],s),u=!1;(e&&i.y<o.y||!e&&i.x>o.x)&&(u=!0);var c=a.vertical([],l,u);return a.scale([],c,t*n)},n.getAxisVector=function(){var t=this.get("start"),e=this.get("end");return[e.x-t.x,e.y-t.y]},n.getLinePath=function(){var t=this.get("start"),e=this.get("end"),n=[];return n.push(["M",t.x,t.y]),n.push(["L",e.x,e.y]),n},n.getTickEnd=function(t,e){var n=this.getSideVector(e);return{x:t.x+n[0],y:t.y+n[1]}},n.getTickPoint=function(t){var e=this.get("start"),n=this.get("end"),i=n.x-e.x,r=n.y-e.y;return{x:e.x+i*t,y:e.y+r*t}},n.renderTitle=function(){var t=this.get("title"),e=this.getTickPoint(.5),n=t.offset;if(r.isNil(n)){n=20;var i=this.get("labelsGroup");if(i){n+=this.getMaxLabelWidth(i)+(this.get("label").offset||this.get("_labelOffset"))}}var o=t.textStyle,s=r.mix({},o);if(t.text){var l=this.getAxisVector();if(t.autoRotate&&r.isNil(o.rotate)){var u=0;if(!r.snapEqual(l[1],0)){var c=[l[0],l[1]];u=a.angleTo(c,[1,0],!0)}s.rotate=u*(180/Math.PI)}else r.isNil(o.rotate)||(s.rotate=o.rotate/180*Math.PI);var h,f=this.getSideVector(n),p=t.position;h="start"===p?{x:this.get("start").x+f[0],y:this.get("start").y+f[1]}:"end"===p?{x:this.get("end").x+f[0],y:this.get("end").y+f[1]}:{x:e.x+f[0],y:e.y+f[1]},s.x=h.x,s.y=h.y,s.text=t.text;var g=this.get("group").addShape("Text",{zIndex:2,attrs:s});g.name="axis-title",this.get("appendInfo")&&g.setSilent("appendInfo",this.get("appendInfo"))}},n.autoRotateLabels=function(){var t=this.get("labelRenderer"),e=this.get("title");if(t){var n=t.get("group").get("children"),i=this.get("label").offset,a=e?e.offset:48;if(a<0)return;var o,s,l=this.getAxisVector();if(r.snapEqual(l[0],0)&&e&&e.text)(s=this.getMaxLabelWidth(t))>a-i-12&&(o=-1*Math.acos((a-i-12)/s));else if(r.snapEqual(l[1],0)&&n.length>1){var u=Math.abs(this._getAvgLabelLength(t));(s=this.getMaxLabelWidth(t))>u&&(o=Math.asin(1.25*(a-i-12)/s))}if(o){var c=this.get("factor");r.each(n,function(t){t.rotateAtStart(o),r.snapEqual(l[1],0)&&(c>0?t.attr("textAlign","left"):t.attr("textAlign","right"))})}}},n.autoHideLabels=function(){var t,e,n=this.get("labelRenderer");if(n){var i=n.get("group").get("children"),a=this.getAxisVector();if(i.length<2)return;if(r.snapEqual(a[0],0)){var o=this.getMaxLabelHeight(n)+8,s=Math.abs(this._getAvgLabelHeightSpace(n));o>s&&(t=o,e=s)}else if(r.snapEqual(a[1],0)&&i.length>1){var l=this.getMaxLabelWidth(n)+8,u=Math.abs(this._getAvgLabelLength(n));l>u&&(t=l,e=u)}if(t&&e){var c=Math.ceil(t/e);r.each(i,function(t,e){e%c!=0&&t.attr("text","")})}}},e}(i);t.exports=o},function(t,e,n){var i=n(3),r=n(31),a=i.MatrixUtil,o=i.PathUtil,s=a.vec2,l=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{type:"polyline"})},n.getLinePath=function(){var t=this.get("tickPoints"),e=this.get("start"),n=this.get("end"),r=[];r.push(e.x),r.push(e.y),i.each(t,function(t){r.push(t.x),r.push(t.y)}),r.push(n.x),r.push(n.y);var a=o.catmullRomToBezier(r);return a.unshift(["M",e.x,e.y]),a},n.getTickPoint=function(t,e){return this.get("tickPoints")[e]},n.getTickEnd=function(t,e,n){var i=this.get("tickLine"),r=e||i.length,a=this.getSideVector(r,t,n);return{x:t.x+a[0],y:t.y+a[1]}},n.getSideVector=function(t,e,n){var i;if(0===n){if((i=this.get("start")).x===e.x&&i.y===e.y)return[0,0]}else{i=this.get("tickPoints")[n-1]}var r=[e.x-i.x,e.y-i.y],a=s.normalize([],r),o=s.vertical([],a,!1);return s.scale([],o,t)},e}(r);t.exports=l},function(t,e,n){t.exports={Guide:n(15),Arc:n(315),DataMarker:n(316),DataRegion:n(317),Html:n(318),Image:n(319),Line:n(320),Region:n(321),Text:n(322)}},function(t,e,n){function i(t,e){var n,i=t.x-e.x,r=t.y-e.y;return 0===r?n=i<0?o/2:270*o/180:i>=0&&r>0?n=2*o-s(i/r):i<=0&&r<0?n=o-s(i/r):i>0&&r<0?n=o+s(-i/r):i<0&&r>0&&(n=s(i/-r)),n}var r=n(3),a=n(15),o=Math.PI,s=Math.atan,l=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return r.mix({},e,{name:"arc",start:null,end:null,style:{stroke:"#999",lineWidth:1}})},n.render=function(t,e){var n,a=this.parsePoint(t,this.get("start")),s=this.parsePoint(t,this.get("end")),l=t.getCenter(),u=Math.sqrt((a.x-l.x)*(a.x-l.x)+(a.y-l.y)*(a.y-l.y)),c=i(a,l),h=i(s,l);if(h<c&&(h+=2*o),r.isNumberEqual(a.x,s.x)&&r.isNumberEqual(a.y,s.y)&&(this.get("start")[0]!==this.get("end")[0]||this.get("start")[1]!==this.get("end")[1]))n=[["M",a.x,a.y],["A",u,u,0,1,1,2*l.x-a.x,2*l.y-a.y],["A",u,u,0,1,1,a.x,a.y]];else{var f=(h-c)%(2*o)>o?1:0;n=[["M",a.x,a.y],["A",u,u,0,f,1,s.x,s.y]]}var p=e.addShape("path",{zIndex:this.get("zIndex"),attrs:r.mix({path:n},this.get("style"))});p.name="guide-arc",this.get("appendInfo")&&p.setSilent("appendInfo",this.get("appendInfo")),this.set("el",p)},e}(a);t.exports=l},function(t,e,n){var i=n(3),r=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{name:"dataMarker",zIndex:1,top:!0,position:null,style:{point:{r:3,fill:"#FFFFFF",stroke:"#1890FF",lineWidth:2},line:{stroke:"#A3B1BF",lineWidth:1},text:{fill:"#000000",opacity:.65,fontSize:12,textAlign:"start"}},display:{point:!0,line:!0,text:!0},lineLength:20,direction:"upward",autoAdjust:!0})},n.render=function(t,e){var n=this.parsePoint(t,this.get("position")),i=e.addGroup();i.name="guide-data-marker";var r,a,o=this._getElementPosition(n),s=this.get("display");if(s.line){var l=o.line;r=this._drawLine(l,i)}if(s.text&&this.get("content")){var u=o.text;a=this._drawText(u,i)}if(s.point){var c=o.point;this._drawPoint(c,i)}if(this.get("autoAdjust")){var h=i.getBBox(),f=h.minX,p=h.minY,g=h.maxX,d=h.maxY,v=t.start,y=t.end;if(a){f<=v.x&&a.attr("textAlign","start"),g>=y.x&&a.attr("textAlign","end");var x=this.get("direction");if("upward"===x&&p<=y.y||"upward"!==x&&d>=v.y){var m,_;"upward"===x&&p<=y.y?(m="top",_=1):(m="bottom",_=-1),a.attr("textBaseline",m);var b=0;if(this.get("display").line){b=this.get("lineLength");var w=[["M",n.x,n.y],["L",n.x,n.y+b*_]];r.attr("path",w)}var S=n.y+(b+2)*_;a.attr("y",S)}}}this.get("appendInfo")&&i.setSilent("appendInfo",this.get("appendInfo")),this.set("el",i)},n._getElementPosition=function(t){var e=t.x,n=t.y,i=this.get("display").line?this.get("lineLength"):0,r=this.get("direction");this.get("style").text.textBaseline="upward"===r?"bottom":"top";var a="upward"===r?-1:1;return{point:{x:e,y:n},line:[{x:e,y:n},{x:e,y:i*a+n}],text:{x:e,y:(i+2)*a+n}}},n._drawLine=function(t,e){var n=this.get("style").line,r=[["M",t[0].x,t[0].y],["L",t[1].x,t[1].y]];return e.addShape("path",{attrs:i.mix({path:r},n)})},n._drawText=function(t,e){var n=this.get("style").text;return e.addShape("text",{attrs:i.mix({text:this.get("content")},n,t)})},n._drawPoint=function(t,e){var n=this.get("style").point;return e.addShape("circle",{attrs:i.mix({},n,t)})},e}(n(15));t.exports=r},function(t,e,n){var i=n(3),r=n(156),a=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{name:"dataRegion",start:null,end:null,content:"",style:{region:{lineWidth:0,fill:"#000000",opacity:.04},text:{textAlign:"center",textBaseline:"bottom",fontSize:12,fill:"rgba(0, 0, 0, .65)"}}})},n.render=function(t,e,n){var r=this.get("lineLength")||0,a=this._getRegionData(t,n);if(a.length){var o=this._getBBox(a),s=[];s.push(["M",a[0].x,o.yMin-r]);for(var l=0,u=a.length;l<u;l++){var c=["L",a[l].x,a[l].y];s.push(c)}s.push(["L",a[a.length-1].x,o.yMin-r]);var h=this.get("style"),f=h.region,p=h.text,g=e.addGroup();g.name="guide-data-region",g.addShape("path",{attrs:i.mix({path:s},f)});var d=this.get("content");d&&g.addShape("Text",{attrs:i.mix({x:(o.xMin+o.xMax)/2,y:o.yMin-r,text:d},p)}),this.get("appendInfo")&&g.setSilent("appendInfo",this.get("appendInfo")),this.set("el",g)}},n._getRegionData=function(t,e){for(var n,a=this.get("start"),o=this.get("end"),s=r.getFirstScale(this.get("xScales")).field,l=r.getFirstScale(this.get("yScales")).field,u=i.isArray(a)?a[0]:a[s],c=i.isArray(o)?o[0]:o[s],h=[],f=0,p=e.length;f<p;f++){var g=e[f];if(g[s]===u&&(n=f),f>=n&&h.push(this.parsePoint(t,[g[s],g[l]])),g[s]===c)break}return h},n._getBBox=function(t){for(var e=[],n=[],r=0;r<t.length;r++)e.push(t[r].x),n.push(t[r].y);var a=i.arrayUtil.getRange(e),o=i.arrayUtil.getRange(n);return{xMin:a.min,xMax:a.max,yMin:o.min,yMax:o.max}},e}(n(15));t.exports=a},function(t,e,n){var i=n(3),r=i.DomUtil,a=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{name:"html",zIndex:7,position:null,alignX:"middle",alignY:"middle",offsetX:null,offsetY:null,html:null})},n.render=function(t,e){var n=this.parsePoint(t,this.get("position")),a=e.get("canvas").get("el").parentNode,o=r.createDom('<div class="g-guide"></div>');a.appendChild(o);var s=this.get("htmlContent")||this.get("html");if(i.isFunction(s)){s=s(this.get("xScales"),this.get("yScales"))}var l=r.createDom(s);o.appendChild(l),r.modifyCSS(o,{position:"absolute"}),this._setDomPosition(o,l,n),this.set("el",o)},n._setDomPosition=function(t,e,n){var i=this.get("alignX"),a=this.get("alignY"),o=r.getOuterWidth(e),s=r.getOuterHeight(e),l={x:n.x,y:n.y};"middle"===i&&"top"===a?l.x-=Math.round(o/2):"middle"===i&&"bottom"===a?(l.x-=Math.round(o/2),l.y-=Math.round(s)):"left"===i&&"bottom"===a?l.y-=Math.round(s):"left"===i&&"middle"===a?l.y-=Math.round(s/2):"left"===i&&"top"===a?(l.x=n.x,l.y=n.y):"right"===i&&"bottom"===a?(l.x-=Math.round(o),l.y-=Math.round(s)):"right"===i&&"middle"===a?(l.x-=Math.round(o),l.y-=Math.round(s/2)):"right"===i&&"top"===a?l.x-=Math.round(o):(l.x-=Math.round(o/2),l.y-=Math.round(s/2));var u=this.get("offsetX");u&&(l.x+=u);var c=this.get("offsetY");c&&(l.y+=c),r.modifyCSS(t,{top:Math.round(l.y)+"px",left:Math.round(l.x)+"px",visibility:"visible",zIndex:this.get("zIndex")})},n.clear=function(){var t=this.get("el");t&&t.parentNode&&t.parentNode.removeChild(t)},e}(n(15));t.exports=a},function(t,e,n){var i=n(3),r=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{type:"image",start:null,end:null,src:null,offsetX:null,offsetY:null})},n.render=function(t,e){var n=this.parsePoint(t,this.get("start")),i={x:n.x,y:n.y};if(i.img=this.get("src"),this.get("end")){var r=this.parsePoint(t,this.get("end"));i.width=r.x-n.x,i.height=r.y-n.y}else i.width=this.get("width")||32,i.height=this.get("height")||32;this.get("offsetX")&&(i.x+=this.get("offsetX")),this.get("offsetY")&&(i.y+=this.get("offsetY"));var a=e.addShape("Image",{zIndex:1,attrs:i});a.name="guide-image",this.get("appendInfo")&&a.setSilent("appendInfo",this.get("appendInfo")),this.set("el",a)},e}(n(15));t.exports=r},function(t,e,n){var i=n(3),r=n(15),a=i.MatrixUtil.vec2,o=n(14).FONT_FAMILY,s=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{name:"line",start:null,end:null,lineStyle:{stroke:"#000",lineWidth:1},text:{position:"end",autoRotate:!0,style:{fill:"#999",fontSize:12,fontWeight:500,fontFamily:o},content:null}})},n.render=function(t,e){var n=this.parsePoint(t,this.get("start")),i=this.parsePoint(t,this.get("end")),r=e.addGroup({viewId:e.get("viewId")});this._drawLines(n,i,r);var a=this.get("text");a&&a.content&&this._drawText(n,i,r),this.set("el",r)},n._drawLines=function(t,e,n){var r=[["M",t.x,t.y],["L",e.x,e.y]],a=n.addShape("Path",{attrs:i.mix({path:r},this.get("lineStyle"))});a.name="guide-line",this.get("appendInfo")&&a.setSilent("appendInfo",this.get("appendInfo"))},n._drawText=function(t,e,n){var r,o=this.get("text"),s=o.position,l=o.style||{};((r="start"===s?0:"center"===s?.5:i.isString(s)&&-1!==s.indexOf("%")?parseInt(s,10)/100:i.isNumber(s)?s:1)>1||r<0)&&(r=1);var u={x:t.x+(e.x-t.x)*r,y:t.y+(e.y-t.y)*r};if(o.offsetX&&(u.x+=o.offsetX),o.offsetY&&(u.y+=o.offsetY),u.text=o.content,u=i.mix({},u,l),o.autoRotate&&i.isNil(l.rotate)){var c=a.angleTo([e.x-t.x,e.y-t.y],[1,0],1);u.rotate=c}else i.isNil(l.rotate)||(u.rotate=l.rotate*Math.PI/180);var h=n.addShape("Text",{attrs:u});h.name="guide-line-text",this.get("appendInfo")&&h.setSilent("appendInfo",this.get("appendInfo"))},e}(r);t.exports=s},function(t,e,n){var i=n(3),r=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{name:"region",zIndex:1,start:null,end:null,style:{lineWidth:0,fill:"#CCD7EB",opacity:.4}})},n.render=function(t,e){var n=this.get("style"),r=this._getPath(t),a=e.addShape("path",{zIndex:this.get("zIndex"),attrs:i.mix({path:r},n)});a.name="guide-region",this.get("appendInfo")&&a.setSilent("appendInfo",this.get("appendInfo")),this.set("el",a)},n._getPath=function(t){var e=this.parsePoint(t,this.get("start")),n=this.parsePoint(t,this.get("end"));return[["M",e.x,e.y],["L",n.x,e.y],["L",n.x,n.y],["L",e.x,n.y],["z"]]},e}(n(15));t.exports=r},function(t,e,n){var i=n(3),r=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{name:"text",position:null,content:null,style:{fill:"#999",fontSize:12,fontWeight:500,textAlign:"center"},offsetX:null,offsetY:null,top:!0})},n.render=function(t,e){var n=this.parsePoint(t,this.get("position")),r=i.mix({},this.get("style")),a=this.get("offsetX"),o=this.get("offsetY");a&&(n.x+=a),o&&(n.y+=o),r.rotate&&(r.rotate=r.rotate*Math.PI/180);var s=e.addShape("Text",{zIndex:this.get("zIndex"),attrs:i.mix({text:this.get("content")},r,n)});s.name="guide-text",this.get("appendInfo")&&s.setSilent("appendInfo",this.get("appendInfo")),this.set("el",s)},e}(n(15));t.exports=r},function(t,e,n){var i=n(154);t.exports=i},function(t,e,n){t.exports={Category:n(157),CatHtml:n(159),CatPageHtml:n(325),Color:n(326),Size:n(328),CircleSize:n(329)}},function(t,e,n){function i(t,e){return t.getElementsByClassName(e)[0]}var r=n(3),a=n(159),o=n(14).FONT_FAMILY,s=r.DomUtil,l=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return r.mix({},e,{type:"category-page-legend",container:null,caretStyle:{fill:"rgba(0,0,0,0.65)"},pageNumStyle:{display:"inline-block",fontSize:"12px",fontFamily:o,cursor:"default"},slipDomStyle:{width:"auto",height:"auto",position:"absolute"},slipTpl:'<div class="g2-slip" ><svg viewBox="64 64 896 896" class="g2-caret-up" data-icon="left" width="1em" height="1em" aria-hidden="true"><path d="M724 218.3V141c0-6.7-7.7-10.4-12.9-6.3L260.3 486.8a31.86 31.86 0 0 0 0 50.3l450.8 352.1c5.3 4.1 12.9.4 12.9-6.3v-77.3c0-4.9-2.3-9.6-6.1-12.6l-360-281 360-281.1c3.8-3 6.1-7.7 6.1-12.6z"></path></svg><p class="cur-pagenum" style = "display:inline-block;">1</p><p class="next-pagenum" style = "display:inline-block;">/2</p><svg viewBox="64 64 896 896" class="g2-caret-down" data-icon="right" width="1em" height="1em" aria-hidden="true"><path d="M765.7 486.8L314.9 134.7A7.97 7.97 0 0 0 302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 0 0 0-50.4z"></path></svg></div>',slipWidth:65,legendOverflow:"unset"})},n.render=function(){t.prototype._renderHTML.call(this),this._renderFlipPage()},n._renderFlipPage=function(){var t=document.getElementsByClassName("g2-legend")[0],e=i(t,"g2-legend-list"),n=this.get("position"),a=this.get("layout"),o="right"===n||"left"===n||"vertical"===a?"block":"inline-block";if(t.scrollHeight>t.offsetHeight){var l=this.get("slipTpl"),u=s.createDom(l),c=i(u,"g2-caret-up"),h=i(u,"g2-caret-down");s.modifyCSS(c,this.get("caretStyle")),s.modifyCSS(c,{fill:"rgba(0,0,0,0.25)"}),s.modifyCSS(h,this.get("caretStyle"));var f=i(u,"cur-pagenum"),p=i(u,"next-pagenum"),g=this.get("pageNumStyle");s.modifyCSS(f,r.mix({},g,{paddingLeft:"10px"})),s.modifyCSS(p,r.mix({},g,{opacity:.3,paddingRight:"10px"})),s.modifyCSS(u,r.mix({},this.get("slipDomStyle"),{top:t.offsetHeight+"px"})),t.style.overflow=this.get("legendOverflow"),t.appendChild(u);for(var d=e.childNodes,v=0,y=1,x=[],m=0;m<d.length;m++)d[m].style.display=o,(v=d[m].offsetTop+d[m].offsetHeight)>=t.offsetHeight&&(y++,x.forEach(function(t){t.style.display="none"}),x=[]),x.push(d[m]);p.innerText="/"+y,d.forEach(function(e){e.style.display=o,(v=e.offsetTop+e.offsetHeight)>t.offsetHeight&&(e.style.display="none")}),c.addEventListener("click",function(){if(d[0].style.display!==o){var e=-1;d.forEach(function(t,n){t.style.display===o&&(e=-1===e?n:e,t.style.display="none")});for(var n=e-1;n>=0&&(d[n].style.display=o,v=d[e-1].offsetTop+d[e-1].offsetHeight,d[n].style.display="none",v<t.offsetHeight);n--)d[n].style.display=o;var i=Number.parseInt(f.innerText,10)-1;c.style.fill=1===i?"rgba(0,0,0,0.25)":"rgba(0,0,0,0.65)",h.style.fill="rgba(0,0,0,0.65)",f.innerText=i}}),h.addEventListener("click",function(){if(d[d.length-1].style.display!==o){var e=-1;d.forEach(function(t,n){t.style.display===o&&(e=n,t.style.display="none")});for(var n=e+1;n<d.length&&(d[n].style.display=o,v=d[n].offsetTop+d[n].offsetHeight,d[n].style.display="none",v<t.offsetHeight);n++)d[n].style.display=o;var i=Number.parseInt(f.innerText,10)+1;h.style.fill=i===o?"rgba(0,0,0,0.25)":"rgba(0,0,0,0.65)",c.style.fill="rgba(0,0,0,0.65)",f.innerText=i}}),this.set("slipDom",u)}},n.destroy=function(){t.prototype.destroy.call(this);var e=this.get("slipDom");e&&e.parentNode&&e.parentNode.removeChild(e)},e}(a);t.exports=l},function(t,e,n){var i=n(73).ColorUtil,r=n(3),a=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return r.mix({},e,{type:"color-legend",layout:"vertical",triggerAttr:{fill:"#fff",shadowOffsetX:-2,shadowOffsetY:2,shadowBlur:10,shadowColor:"#ccc",radius:3},isSegment:!1})},n._setPercentage=function(){var t=this.get("items");if(!t[0].percentage){var e=t[0].value,n=t[t.length-1].value;r.each(t,function(t){t.percentage=(t.value-e)/(n-e)})}},n._renderSliderShape=function(){this._setPercentage();var t,e=this.get("slider").get("backgroundElement"),n=this.get("width"),a=this.get("height"),o=this.get("layout"),s=this.get("items"),l="";return"vertical"===o?(l+="l (90) ",r.each(s,function(e){t=i.toRGB(e.color),l+=1-e.percentage+":"+t+" "})):(l+="l (0) ",r.each(s,function(e){t=i.toRGB(e.color),l+=e.percentage+":"+t+" "})),this._addMiddleBar(e,"Rect",{x:0,y:0,width:n,height:a,fill:l,strokeOpacity:0})},n._renderUnslidable=function(){this._setPercentage();var t=this.get("titleShape"),e=this.get("titleGap");e=t?t.getBBox().height+e:e;var n,a=this.get("width"),o=this.get("height"),s=this.get("layout"),l=this.get("items"),u="",c=[],h=this.get("group").addGroup(),f=l.length;if("vertical"===s){u+="l (90) ";for(var p=0;p<f;p+=1){if(0!==p&&p!==f-1&&(c.push(["M",0,o-l[p].percentage*o]),c.push(["L",a,o-l[p].percentage*o])),n=i.toRGB(l[p].color),u+=1-l[p].percentage+":"+n+" ",this.get("isSegment")&&p>0){var g=i.toRGB(l[p-1].color);u+=1-l[p].percentage+":"+g+" "}h.addShape("text",{attrs:r.mix({},{x:a+this.get("textOffset")/2,y:o-l[p].percentage*o,text:this._formatItemValue(l[p].value)+""},this.get("textStyle"),{textAlign:"start"})})}}else{u+="l (0) ";for(var d=0;d<f;d+=1){if(0!==d&&d!==f-1&&(c.push(["M",l[d].percentage*a,0]),c.push(["L",l[d].percentage*a,o])),n=i.toRGB(l[d].color),this.get("isSegment")&&d>0){var v=i.toRGB(l[d-1].color);u+=l[d].percentage+":"+v+" "}u+=l[d].percentage+":"+n+" ",h.addShape("text",{attrs:r.mix({},{x:l[d].percentage*a,y:o+5+this.get("textOffset"),text:this._formatItemValue(l[d].value)+""},this.get("textStyle"))})}}h.addShape("rect",{attrs:{x:0,y:0,width:a,height:o,fill:u,strokeOpacity:0}}),h.addShape("path",{attrs:r.mix({path:c},this.get("lineStyle"))}),h.move(0,e)},e}(n(67));t.exports=a},function(t,e,n){var i=n(3),r=i.DomUtil,a=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){return{range:null,middleAttr:{fill:"#fff",fillOpacity:0},backgroundElement:null,minHandleElement:null,maxHandleElement:null,middleHandleElement:null,currentTarget:null,layout:"vertical",width:null,height:null,pageX:null,pageY:null}},n._beforeRenderUI=function(){var t=this.get("layout"),e=this.get("backgroundElement"),n=this.get("minHandleElement"),i=this.get("maxHandleElement"),r=this.addShape("rect",{attrs:this.get("middleAttr")}),a="vertical"===t?"ns-resize":"ew-resize";this.add([e,n,i]),this.set("middleHandleElement",r),e.set("zIndex",0),r.set("zIndex",1),n.set("zIndex",2),i.set("zIndex",2),r.attr("cursor","move"),n.attr("cursor",a),i.attr("cursor",a),this.sort()},n._renderUI=function(){"horizontal"===this.get("layout")?this._renderHorizontal():this._renderVertical()},n._transform=function(t){var e=this.get("range"),n=e[0]/100,i=e[1]/100,r=this.get("width"),a=this.get("height"),o=this.get("minHandleElement"),s=this.get("maxHandleElement"),l=this.get("middleHandleElement");o.resetMatrix(),s.resetMatrix(),"horizontal"===t?(l.attr({x:r*n,y:0,width:(i-n)*r,height:a}),o.translate(n*r,a),s.translate(i*r,a)):(l.attr({x:0,y:a*(1-i),width:r,height:(i-n)*a}),o.translate(1,(1-n)*a),s.translate(1,(1-i)*a))},n._renderHorizontal=function(){this._transform("horizontal")},n._renderVertical=function(){this._transform("vertical")},n._bindUI=function(){this.on("mousedown",i.wrapBehavior(this,"_onMouseDown"))},n._isElement=function(t,e){var n=this.get(e);if(t===n)return!0;if(n.isGroup){return n.get("children").indexOf(t)>-1}return!1},n._getRange=function(t,e){var n=t+e;return n=n>100?100:n,n=n<0?0:n},n._updateStatus=function(t,e){var n="x"===t?this.get("width"):this.get("height");t=i.upperFirst(t);var r,a=this.get("range"),o=this.get("page"+t),s=this.get("currentTarget"),l=this.get("rangeStash"),u="vertical"===this.get("layout")?-1:1,c=e["page"+t],h=(c-o)/n*100*u;a[1]<=a[0]?(this._isElement(s,"minHandleElement")||this._isElement(s,"maxHandleElement"))&&(a[0]=this._getRange(h,a[0]),a[1]=this._getRange(h,a[0])):(this._isElement(s,"minHandleElement")&&(a[0]=this._getRange(h,a[0])),this._isElement(s,"maxHandleElement")&&(a[1]=this._getRange(h,a[1]))),this._isElement(s,"middleHandleElement")&&(r=l[1]-l[0],a[0]=this._getRange(h,a[0]),a[1]=a[0]+r,a[1]>100&&(a[1]=100,a[0]=a[1]-r)),this.emit("sliderchange",{range:a}),this.set("page"+t,c),this._renderUI(),this.get("canvas").draw()},n._onMouseDown=function(t){var e=t.currentTarget,n=t.event,i=this.get("range");n.stopPropagation(),n.preventDefault(),this.set("pageX",n.pageX),this.set("pageY",n.pageY),this.set("currentTarget",e),this.set("rangeStash",[i[0],i[1]]),this._bindCanvasEvents()},n._bindCanvasEvents=function(){var t=this.get("canvas").get("containerDOM");this.onMouseMoveListener=r.addEventListener(t,"mousemove",i.wrapBehavior(this,"_onCanvasMouseMove")),this.onMouseUpListener=r.addEventListener(t,"mouseup",i.wrapBehavior(this,"_onCanvasMouseUp")),this.onMouseLeaveListener=r.addEventListener(t,"mouseleave",i.wrapBehavior(this,"_onCanvasMouseUp"))},n._onCanvasMouseMove=function(t){if(!this._mouseOutArea(t)){"horizontal"===this.get("layout")?this._updateStatus("x",t):this._updateStatus("y",t)}},n._onCanvasMouseUp=function(){this._removeDocumentEvents()},n._removeDocumentEvents=function(){this.onMouseMoveListener.remove(),this.onMouseUpListener.remove()},n._mouseOutArea=function(t){var e=this.get("canvas").get("el").getBoundingClientRect(),n=this.get("parent"),i=n.getBBox(),r=n.attr("matrix")[6],a=n.attr("matrix")[7],o=r+i.width,s=a+i.height,l=t.clientX-e.x,u=t.clientY-e.y;return l<r||l>o||u<a||u>s},e}(i.Group);t.exports=a},function(t,e,n){var i=n(3),r=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{type:"size-legend",width:100,height:200,_unslidableElementStyle:{fill:"#4E7CCC",fillOpacity:1},frontMiddleBarStyle:{fill:"rgb(64, 141, 251)"}})},n._renderSliderShape=function(){var t=this.get("slider").get("backgroundElement"),e=this.get("layout"),n=this.get("width"),r=this.get("height"),a=this.get("height")/2,o=this.get("frontMiddleBarStyle"),s="vertical"===e?[[0,0],[n,0],[n,r],[n-4,r]]:[[0,a+r/2],[0,a+r/2-4],[n,a-r/2],[n,a+r/2]];return this._addMiddleBar(t,"Polygon",i.mix({points:s},o))},n._renderUnslidable=function(){var t=this.get("layout"),e=this.get("width"),n=this.get("height"),r=this.get("frontMiddleBarStyle"),a="vertical"===t?[[0,0],[e,0],[e,n],[e-4,n]]:[[0,n],[0,n-4],[e,0],[e,n]];this.get("group").addGroup().addShape("Polygon",{attrs:i.mix({points:a},r)});var o=this._formatItemValue(this.get("firstItem").value),s=this._formatItemValue(this.get("lastItem").value);"vertical"===this.get("layout")?(this._addText(e+10,n-3,o),this._addText(e+10,3,s)):(this._addText(0,n,o),this._addText(e,n,s))},n._addText=function(t,e,n){var r=this.get("group").addGroup(),a=this.get("textStyle"),o=this.get("titleShape"),s=this.get("titleGap");o&&(s+=o.getBBox().height),"vertical"===this.get("layout")?r.addShape("text",{attrs:i.mix({x:t+this.get("textOffset"),y:e,text:0===n?"0":n},a)}):(e+=s+this.get("textOffset")-20,o||(e+=10),r.addShape("text",{attrs:i.mix({x:t,y:e,text:0===n?"0":n},a)}))},e}(n(67));t.exports=r},function(t,e,n){var i=n(3),r=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{type:"size-circle-legend",width:100,height:200,_unslidableCircleStyle:{stroke:"rgb(99, 161, 248)",fill:"rgb(99, 161, 248)",fillOpacity:.3,lineWidth:1.5},triggerAttr:{fill:"white",shadowOffsetX:-2,shadowOffsetY:2,shadowBlur:10,shadowColor:"#ccc"},frontMiddleBarStyle:{fill:"rgb(64, 141, 251)"}})},n._renderSliderShape=function(){var t=this.get("slider").get("backgroundElement"),e=this.get("layout"),n="vertical"===e?2:this.get("width"),r="vertical"===e?this.get("height"):2,a=this.get("height")/2,o=this.get("frontMiddleBarStyle"),s="vertical"===e?[[0,0],[n,0],[n,r],[0,r]]:[[0,a+r],[0,a-r],[5+n-4,a-r],[5+n-4,a+r]];return this._addMiddleBar(t,"Polygon",i.mix({points:s},o))},n._addHorizontalTrigger=function(t,e,n,r){var a=this.get("slider").get(t+"HandleElement"),o=-this.get("height")/2,s=a.addShape("circle",{attrs:i.mix({x:0,y:o,r:r},e)}),l=a.addShape("text",{attrs:i.mix(n,{x:0,y:o+r+10,textAlign:"center",textBaseline:"middle"})}),u="vertical"===this.get("layout")?"ns-resize":"ew-resize";s.attr("cursor",u),l.attr("cursor",u),this.set(t+"ButtonElement",s),this.set(t+"TextElement",l)},n._addVerticalTrigger=function(t,e,n,r){var a=this.get("slider").get(t+"HandleElement"),o=a.addShape("circle",{attrs:i.mix({x:0,y:0,r:r},e)}),s=a.addShape("text",{attrs:i.mix(n,{x:r+10,y:0,textAlign:"start",textBaseline:"middle"})}),l="vertical"===this.get("layout")?"ns-resize":"ew-resize";o.attr("cursor",l),s.attr("cursor",l),this.set(t+"ButtonElement",o),this.set(t+"TextElement",s)},n._renderTrigger=function(){var t=this.get("firstItem"),e=this.get("lastItem"),n=this.get("layout"),r=this.get("textStyle"),a=this.get("triggerAttr"),o=i.mix({},a),s=i.mix({},a),l=i.mix({text:this._formatItemValue(t.value)+""},r),u=i.mix({text:this._formatItemValue(e.value)+""},r);"vertical"===n?(this._addVerticalTrigger("min",o,l,5),this._addVerticalTrigger("max",s,u,16)):(this._addHorizontalTrigger("min",o,l,5),this._addHorizontalTrigger("max",s,u,16))},n._bindEvents=function(){var t=this;if(this.get("slidable")){this.get("slider").on("sliderchange",function(e){var n=e.range,i=t.get("firstItem").value,r=t.get("lastItem").value,a=i+n[0]/100*(r-i),o=i+n[1]/100*(r-i),s=5+n[0]/100*11,l=5+n[1]/100*11;t._updateElement(a,o,s,l);var u=new Event("itemfilter",e,!0,!0);u.range=[a,o],t.emit("itemfilter",u)})}},n._updateElement=function(e,n,i,r){t.prototype._updateElement.call(this,e,n);var a=this.get("minTextElement"),o=this.get("maxTextElement"),s=this.get("minButtonElement"),l=this.get("maxButtonElement");s.attr("r",i),l.attr("r",r);if("vertical"===this.get("layout"))a.attr("x",i+10),o.attr("x",r+10);else{var u=-this.get("height")/2;a.attr("y",u+i+10),o.attr("y",u+r+10)}},n._addCircle=function(t,e,n,r,a){var o=this.get("group").addGroup(),s=this.get("_unslidableCircleStyle"),l=this.get("textStyle"),u=this.get("titleShape"),c=this.get("titleGap");u&&(c+=u.getBBox().height),o.addShape("circle",{attrs:i.mix({x:t,y:e+c,r:0===n?1:n},s)}),"vertical"===this.get("layout")?o.addShape("text",{attrs:i.mix({x:a+20+this.get("textOffset"),y:e+c,text:0===r?"0":r},l)}):o.addShape("text",{attrs:i.mix({x:t,y:e+c+a+13+this.get("textOffset"),text:0===r?"0":r},l)})},n._renderUnslidable=function(){var t=this.get("firstItem").value,e=this.get("lastItem").value;if(t>e){var n=e;e=t,t=n}var i=this._formatItemValue(t),r=this._formatItemValue(e),a=t<5?5:t,o=e>16?16:e;a>o&&(a=5,o=16),"vertical"===this.get("layout")?(this._addCircle(o,o,a,i,2*o),this._addCircle(o,2*o+16+a,o,r,2*o)):(this._addCircle(o,o,a,i,2*o),this._addCircle(2*o+16+a,o,o,r,2*o))},n.activate=function(e){this.get("slidable")&&t.prototype.activate.call(this,e)},e}(n(67));t.exports=r},function(t,e,n){var i=n(68);i.Html=n(331),i.Canvas=n(163),i.Mini=n(333),t.exports=i},function(t,e,n){function i(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}function r(t,e){return t.getElementsByClassName(e)[0]}var a=n(68),o=n(3),s=o.DomUtil,l=n(332),u=n(160),c=n(161),h=n(162),f=function(t){function e(e){var n;n=t.call(this,e)||this,o.assign(i(i(n)),c),o.assign(i(i(n)),h);var r=l;n.style=function(t,e){return Object.keys(t).forEach(function(n){e[n]&&(t[n]=o.mix(t[n],e[n]))}),t}(r,e),n._init_(),n.get("items")&&n.render();var a=n.get("crosshairs");if(a){var s="rect"===a.type?n.get("backPlot"):n.get("frontPlot"),f=new u(o.mix({plot:s,plotRange:n.get("plotRange"),canvas:n.get("canvas")},n.get("crosshairs")));f.hide(),n.set("crosshairGroup",f)}return n}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return o.mix({},e,{containerTpl:' <div class="g2-tooltip"> <div class="g2-tooltip-title"></div><ul class="g2-tooltip-list"></ul></div>',itemTpl:'<li data-index={index}><span style="background-color:{color};" class=g2-tooltip-marker></span>{name}<span class=g2-tooltip-value>{value}</span></li>',htmlContent:null,follow:!0,enterable:!1})},n._init_=function(){var t,e=this.get("containerTpl"),n=this.get("canvas").get("el").parentNode;if(!this.get("htmlContent")){if(/^\#/.test(e)){var i=e.replace("#","");t=document.getElementById(i)}else t=s.createDom(e),s.modifyCSS(t,this.style["g2-tooltip"]),n.appendChild(t),n.style.position="relative";this.set("container",t)}},n.render=function(){if(this.clear(),this.get("htmlContent")){var t=this.get("canvas").get("el").parentNode,e=this._getHtmlContent();t.appendChild(e),this.set("container",e)}else this._renderTpl()},n._renderTpl=function(){var t=this,e=t.get("showTitle"),n=t.get("titleContent"),i=t.get("container"),a=r(i,"g2-tooltip-title"),l=r(i,"g2-tooltip-list"),u=t.get("items");a&&e&&(s.modifyCSS(a,t.style["g2-tooltip-title"]),a.innerHTML=n),l&&(s.modifyCSS(l,t.style["g2-tooltip-list"]),o.each(u,function(e,n){l.appendChild(t._addItem(e,n))}))},n.clear=function(){var t=this.get("container");if(this.get("htmlContent"))t&&t.remove();else{var e=r(t,"g2-tooltip-title"),n=r(t,"g2-tooltip-list");e&&(e.innerHTML=""),n&&(n.innerHTML="")}},n.show=function(){var e=this.get("container");e.style.visibility="visible",e.style.display="block";var n=this.get("crosshairGroup");n&&n.show();var i=this.get("markerGroup");i&&i.show(),t.prototype.show.call(this),this.get("canvas").draw()},n.hide=function(){var e=this.get("container");e.style.visibility="hidden",e.style.display="none";var n=this.get("crosshairGroup");n&&n.hide();var i=this.get("markerGroup");i&&i.hide(),t.prototype.hide.call(this),this.get("canvas").draw()},n.destroy=function(){var e=this.get("container"),n=this.get("containerTpl");e&&!/^\#/.test(n)&&e.parentNode.removeChild(e);var i=this.get("crosshairGroup");i&&i.destroy();var r=this.get("markerGroup");r&&r.remove(),t.prototype.destroy.call(this)},n._addItem=function(t,e){var n=this.get("itemTpl"),i=o.substitute(n,o.mix({index:e},t)),a=s.createDom(i);s.modifyCSS(a,this.style["g2-tooltip-list-item"]);var l=r(a,"g2-tooltip-marker");l&&s.modifyCSS(l,this.style["g2-tooltip-marker"]);var u=r(a,"g2-tooltip-value");return u&&s.modifyCSS(u,this.style["g2-tooltip-value"]),a},n._getHtmlContent=function(){var t=this.get("htmlContent")(this.get("titleContent"),this.get("items"));return s.createDom(t)},n.setPosition=function(e,n,i){var r,a=this.get("container"),l=this.get("canvas").get("el"),u=s.getWidth(l),c=s.getHeight(l),h=a.clientWidth,f=a.clientHeight,p=e,g=n,d=this.get("prePosition")||{x:0,y:0};if(this.get("enterable"))r=[e,n-=a.clientHeight/2],d&&e-d.x>0?e-=a.clientWidth+1:e+=1;else if(this.get("position")){var v=a.clientWidth,y=a.clientHeight;e=(r=this._calcTooltipPosition(e,n,this.get("position"),v,y,i))[0],n=r[1]}else e=(r=this._constraintPositionInBoundary(e,n,h,f,u,c))[0],n=r[1];if(this.get("inPlot")){var x=this.get("plotRange");e=(r=this._constraintPositionInPlot(e,n,h,f,x,this.get("enterable")))[0],n=r[1]}var m=this.get("markerItems");o.isEmpty(m)||(p=m[0].x,g=m[0].y),this.set("prePosition",r);this.get("follow")&&(a.style.left=e+"px",a.style.top=n+"px");var _=this.get("crosshairGroup");if(_){var b=this.get("items");_.setPosition(p,g,b)}t.prototype.setPosition.call(this,e,n)},e}(a);t.exports=f},function(t,e,n){var i,r=n(14).FONT_FAMILY,a=(i={crosshairs:!1,offset:15},i["g2-tooltip"]={position:"absolute",visibility:"hidden",zIndex:8,transition:"visibility 0.2s cubic-bezier(0.23, 1, 0.32, 1), left 0.4s cubic-bezier(0.23, 1, 0.32, 1), top 0.4s cubic-bezier(0.23, 1, 0.32, 1)",backgroundColor:"rgba(255, 255, 255, 0.9)",boxShadow:"0px 0px 10px #aeaeae",borderRadius:"3px",color:"rgb(87, 87, 87)",fontSize:"12px",fontFamily:r,lineHeight:"20px",padding:"10px 10px 6px 10px"},i["g2-tooltip-title"]={marginBottom:"4px"},i["g2-tooltip-list"]={margin:0,listStyleType:"none",padding:0},i["g2-tooltip-list-item"]={marginBottom:"4px"},i["g2-tooltip-marker"]={width:"5px",height:"5px",borderRadius:"50%",display:"inline-block",marginRight:"8px"},i["g2-tooltip-value"]={display:"inline-block",float:"right",marginLeft:"30px"},i);t.exports=a},function(t,e,n){var i=n(3),r=n(163),a=n(14).FONT_FAMILY,o=i.DomUtil,s=i.MatrixUtil,l=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{boardStyle:{x:0,y:0,width:0,height:0,radius:3},valueStyle:{x:0,y:0,text:"",fontFamily:a,fontSize:12,stroke:"#fff",lineWidth:2,fill:"black",textBaseline:"top",textAlign:"start"},padding:{top:5,right:5,bottom:0,left:5},triangleWidth:10,triangleHeight:4})},n._init_=function(){var t=this.get("padding"),e=this.get("frontPlot").addGroup();this.set("container",e);var n=e.addShape("rect",{attrs:i.mix({},this.get("boardStyle"))});this.set("board",n);var r=e.addShape("path",{attrs:{fill:this.get("boardStyle").fill}});this.set("triangleShape",r);var a=e.addGroup();a.move(t.left,t.top);var o=a.addShape("text",{attrs:i.mix({},this.get("valueStyle"))});this.set("valueShape",o)},n.render=function(){this.clear();var t=this.get("board"),e=this.get("valueShape"),n=this.get("padding"),i=this.get("items")[0];e&&e.attr("text",i.value);var r=e?e.getBBox():{width:80,height:30},a=n.left+r.width+n.right,o=n.top+r.height+n.bottom;t.attr("width",a),t.attr("height",o),this._centerTriangleShape()},n.clear=function(){this.get("valueShape").attr("text","")},n.setPosition=function(t,e,n){var i=this.get("container"),r=this.get("plotRange"),a=i.getBBox(),l=a.width,u=a.height;if(t-=l/2,n&&("point"===n.name||"interval"===n.name)){e=n.getBBox().y}if(e-=u,this.get("inPlot"))t<r.tl.x?(t=r.tl.x,this._leftTriangleShape()):t+l/2>r.tr.x?(t=r.tr.x-l,this._rightTriangleShape()):this._centerTriangleShape(),e<r.tl.y?e=r.tl.y:e+u>r.bl.y&&(e=r.bl.y-u);else{var c=this.get("canvas").get("el"),h=o.getWidth(c),f=o.getHeight(c);t<0?(t=0,this._leftTriangleShape()):t+l/2>h?(t=h-l,this._rightTriangleShape()):this._centerTriangleShape(),e<0?e=0:e+u>f&&(e=f-u)}var p=s.transform([1,0,0,0,1,0,0,0,1],[["t",t,e]]);i.stopAnimate(),i.animate({matrix:p},this.get("animationDuration"))},n._centerTriangleShape=function(){var t=this.get("triangleShape"),e=this.get("triangleWidth"),n=this.get("triangleHeight"),i=this.get("board").getBBox(),r=i.width,a=i.height,o=[["M",0,0],["L",e,0],["L",e/2,n],["L",0,0],["Z"]];t.attr("path",o),t.move(r/2-e/2,a-1)},n._leftTriangleShape=function(){var t=this.get("triangleShape"),e=this.get("triangleWidth"),n=this.get("triangleHeight"),i=this.get("board").getBBox().height,r=[["M",0,0],["L",e,0],["L",0,n+3],["L",0,0],["Z"]];t.attr("path",r),t.move(0,i-3)},n._rightTriangleShape=function(){var t=this.get("triangleShape"),e=this.get("triangleWidth"),n=this.get("triangleHeight"),i=this.get("board").getBBox(),r=i.width,a=i.height,o=[["M",0,0],["L",e,0],["L",e,n+4],["L",0,0],["Z"]];t.attr("path",o),t.move(r-e-1,a-4)},e}(r);t.exports=l},function(t,e,n){var i=n(0).MatrixUtil.vec2;t.exports={catmullRom2bezier:function(t,e,n){for(var r=!!e,a=[],o=0,s=t.length;o<s;o+=2)a.push([t[o],t[o+1]]);for(var l,u,c,h=function(t,e,n,r){var a,o,s,l,u=[],c=!!r;if(c){s=[1/0,1/0],l=[-1/0,-1/0];for(var h=0,f=t.length;h<f;h++){var p=t[h];s=i.min([],s,p),l=i.max([],l,p)}s=i.min([],s,r[0]),l=i.max([],l,r[1])}for(var g=0,d=t.length;g<d;g++){var v=t[g];if(n)a=t[g?g-1:d-1],o=t[(g+1)%d];else{if(0===g||g===d-1){u.push(v);continue}a=t[g-1],o=t[g+1]}var y=[];y=i.sub(y,o,a),y=i.scale(y,y,e);var x=i.distance(v,a),m=i.distance(v,o),_=x+m;0!==_&&(x/=_,m/=_);var b=i.scale([],y,-x),w=i.scale([],y,m),S=i.add([],v,b),M=i.add([],v,w);c&&(S=i.max([],S,s),S=i.min([],S,l),M=i.max([],M,s),M=i.min([],M,l)),u.push(S),u.push(M)}return n&&u.push(u.shift()),u}(a,.4,r,n),f=a.length,p=[],g=0;g<f-1;g++)l=h[2*g],u=h[2*g+1],c=a[g+1],p.push(["C",l[0],l[1],u[0],u[1],c[0],c[1]]);return r&&(l=h[f],u=h[f+1],c=a[0],p.push(["C",l[0],l[1],u[0],u[1],c[0],c[1]])),p}}},function(t,e,n){function i(t,e,n){return{x:t.x+n*Math.cos(e),y:t.y+n*Math.sin(e)}}var r=n(0),a=n(164),o=n(22),s=n(7),l=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){return{label:s.thetaLabels}},n.getDefaultOffset=function(t){return t.offset||0},n.adjustItems=function(e){var n=e[0]?e[0].offset:0;return n>0&&(e=this._distribute(e,n)),t.prototype.adjustItems.call(this,e)},n._distribute=function(t,e){var n=this.get("coord"),i=n.getRadius(),r=this.get("label").labelHeight,a=n.getCenter(),o=2*(i+e)+2*r,s={start:n.start,end:n.end},l=this.get("geom");if(l){var u=l.get("view");s=u.getViewRegion()}var c=[[],[]];return t.forEach(function(t){t&&("right"===t.textAlign?c[0].push(t):c[1].push(t))}),c.forEach(function(t,e){var n=parseInt(o/r,10);t.length>n&&(t.sort(function(t,e){return e["..percent"]-t["..percent"]}),t.splice(n,t.length-n)),t.sort(function(t,e){return t.y-e.y}),function(t,e,n,i,r){var a,o=!0,s=n.start,l=n.end,u=Math.min(s.y,l.y),c=Math.abs(s.y-l.y),h=0,f=Number.MIN_VALUE,p=t.map(function(t){return t.y>h&&(h=t.y),t.y<f&&(f=t.y),{size:e,targets:[t.y-u]}});for(f-=u,h-u>c&&(c=h-u);o;)for(p.forEach(function(t){var e=(Math.min.apply(f,t.targets)+Math.max.apply(f,t.targets))/2;t.pos=Math.min(Math.max(f,e-t.size/2),c-t.size)}),o=!1,a=p.length;a--;)if(a>0){var g=p[a-1],d=p[a];g.pos+g.size>d.pos&&(g.size+=d.size,g.targets=g.targets.concat(d.targets),g.pos+g.size>c&&(g.pos=c-g.size),p.splice(a,1),o=!0)}a=0,p.forEach(function(n){var i=u+e/2;n.targets.forEach(function(){t[a].y=n.pos+i,i+=e,a++})}),t.forEach(function(t){var e=t.r*t.r,n=Math.pow(Math.abs(t.y-i.y),2);if(e<n)t.x=i.x;else{var a=Math.sqrt(e-n);t.x=r?i.x+a:i.x-a}})}(t,r,s,a,e)}),c[0].concat(c[1])},n.lineToLabel=function(t){var e=this.get("coord"),n=e.getRadius(),r=t.offset,a=t.orignAngle||t.angle,o=e.getCenter(),s=i(o,a,n+2.5),l=i(o,a,n+r/2);t.labelLine||(t.labelLine=this.get("label").labelLine||{}),t.labelLine.path=["M"+s.x,s.y+" Q"+l.x,l.y+" "+t.x,t.y].join(",")},n.getLabelRotate=function(t,e){var n;return e<0&&((n=180*t/Math.PI)>90&&(n-=180),n<-90&&(n+=180)),n/180*Math.PI},n.getLabelAlign=function(t){var e,n=this.get("coord").getCenter();e=t.angle<=Math.PI/2&&t.x>=n.x?"left":"right";return this.getDefaultOffset(t)<=0&&(e="right"===e?"left":"right"),e},n.getArcPoint=function(t){return t},n.getPointAngle=function(t){var e=this.get("coord"),n={x:r.isArray(t.x)?t.x[0]:t.x,y:t.y[0]};this.transLabelPoint(n);var i={x:r.isArray(t.x)?t.x[1]:t.x,y:t.y[1]};this.transLabelPoint(i);var a,s=o.getPointAngle(e,n);if(t.points&&t.points[0].y===t.points[1].y)a=s;else{var l=o.getPointAngle(e,i);s>=l&&(l+=2*Math.PI),a=s+(l-s)/2}return a},n.getCirclePoint=function(t,e){var n=this.get("coord"),r=n.getCenter(),a=n.getRadius()+e,o=i(r,t,a);return o.angle=t,o.r=a,o},e}(a);t.exports=l},function(t,e,n){var i=n(0),r=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);return e.prototype.setLabelPosition=function(t,e,n,r){i.isFunction(r)&&(r=r(t.text,e._origin,n));var a=this.get("coord"),o=a.isTransposed,s=a.convertPoint(e.points[0]),l=a.convertPoint(e.points[2]),u=(s.x-l.x)/2*(o?-1:1),c=(s.y-l.y)/2*(o?-1:1);switch(r){case"right":o?(t.x-=u,t.y+=c,t.textAlign=t.textAlign||"center"):(t.x-=u,t.y+=c,t.textAlign=t.textAlign||"left");break;case"left":o?(t.x-=u,t.y-=c,t.textAlign=t.textAlign||"center"):(t.x+=u,t.y+=c,t.textAlign=t.textAlign||"right");break;case"bottom":o?(t.x-=2*u,t.textAlign=t.textAlign||"left"):(t.y+=2*c,t.textAlign=t.textAlign||"center");break;case"middle":o?t.x-=u:t.y+=c,t.textAlign=t.textAlign||"center";break;case"top":t.textAlign=o?t.textAlign||"left":t.textAlign||"center"}},e}(n(65));t.exports=r},function(t,e,n){function i(t){return t.alias||t.field}var r=n(0),a=n(7).defaultColor,o={_getIntervalSize:function(t){var e=null,n=this.get("type"),i=this.get("coord");if(i.isRect&&("interval"===n||"schema"===n)){e=this.getSize(t._origin);var a=i.isTransposed?"y":"x";if(r.isArray(t[a])){e=e<Math.abs(t[a][1]-t[a][0])?null:e}}return e},_snapEqual:function(t,e,n){return t=n.translate(t),e=n.translate(e),n.isCategory?t===e:r.snapEqual(t,e)},_getScaleValueByPoint:function(t){var e=0,n=this.get("coord"),i=this.getXScale(),r=n.invert(t).x;return this.isInCircle()&&r>(1+i.rangeMax())/2&&(r=i.rangeMin()),e=i.invert(r),i.isCategory&&(e=i.translate(e)),e},_getOriginByPoint:function(t){var e=this.getXScale(),n=this.getYScale(),i=e.field,r=n.field,a=this.get("coord").invert(t),o=e.invert(a.x),s=n.invert(a.y),l={};return l[i]=o,l[r]=s,l},_getScale:function(t){var e=this.get("scales"),n=null;return r.each(e,function(e){if(e.field===t)return n=e,!1}),n},_getTipValueScale:function(){var t,e=this.getAttrsForLegend();r.each(e,function(e){var n=e.getScale(e.type);if(n.isLinear)return t=n,!1});var n=this.getXScale(),i=this.getYScale();return!t&&i&&"..y"===i.field?n:t||i||n},_getTipTitleScale:function(t){if(t)return this._getScale(t);var e,n=this.getAttr("position").getFields();return r.each(n,function(t){if(-1===t.indexOf(".."))return e=t,!1}),this._getScale(e)},_filterValue:function(t,e){var n=this.get("coord"),i=this.getYScale(),a=i.field,o=n.invert(e).y;o=i.invert(o);var s=t[t.length-1];return r.each(t,function(t){var e=t._origin;if(e[a][0]<=o&&e[a][1]>=o)return s=t,!1}),s},getXDistance:function(){var t=this.get("xDistance");if(!t){var e=this.getXScale();if(e.isCategory)t=1;else{var n=e.values,i=e.translate(n[0]),a=i;r.each(n,function(t){(t=e.translate(t))<i&&(i=t),t>a&&(a=t)});var o=n.length;t=(a-i)/(o-1)}this.set("xDistance",t)}return t},findPoint:function(t,e){var n=this,i=n.get("type"),a=n.getXScale(),o=n.getYScale(),s=a.field,l=o.field,u=null;if(r.indexOf(["heatmap","point"],i)>-1){var c=n.get("coord").invert(t),h=a.invert(c.x),f=o.invert(c.y),p=1/0;return r.each(e,function(t){var e=Math.pow(t._origin[s]-h,2)+Math.pow(t._origin[l]-f,2);e<p&&(p=e,u=t)}),u}var g=e[0],d=e[e.length-1];if(!g)return u;var v=n._getScaleValueByPoint(t),y=g._origin[s],x=g._origin[l],m=d._origin[s],_=o.isLinear&&r.isArray(x);if(r.isArray(y))r.each(e,function(t){var e=t._origin;if(a.translate(e[s][0])<=v&&a.translate(e[s][1])>=v){if(!_)return u=t,!1;r.isArray(u)||(u=[]),u.push(t)}}),r.isArray(u)&&(u=this._filterValue(u,t));else{var b;if(a.isLinear||"timeCat"===a.type){if((v>a.translate(m)||v<a.translate(y))&&(v>a.max||v<a.min))return null;for(var w,S=0,M=e.length-1;S<=M;){w=Math.floor((S+M)/2);var C=e[w]._origin[s];if(n._snapEqual(C,v,a))return e[w];a.translate(C)<=a.translate(v)?(S=w+1,d=e[w],b=e[w+1]):(0===M&&(d=e[0]),M=w-1)}}else r.each(e,function(t,i){var o=t._origin;if(n._snapEqual(o[s],v,a)){if(!_)return u=t,!1;r.isArray(u)||(u=[]),u.push(t)}else a.translate(o[s])<=v&&(d=t,b=e[i+1])}),r.isArray(u)&&(u=this._filterValue(u,t));d&&b&&Math.abs(a.translate(d._origin[s])-v)>Math.abs(a.translate(b._origin[s])-v)&&(d=b)}var A=n.getXDistance();return!u&&Math.abs(a.translate(d._origin[s])-v)<=A/2&&(u=d),u},getTipTitle:function(t,e){var n="",i=this._getTipTitleScale(e);if(i){var r=t[i.field];n=i.getText(r)}else if("heatmap"===this.get("type")){var a=this.getXScale(),o=this.getYScale();n="( "+a.getText(t[a.field])+", "+o.getText(t[o.field])+" )"}return n},getTipValue:function(t,e){var n,i=e.field,a=t.key;if(n=t[i],r.isArray(n)){var o=[];r.each(n,function(t){o.push(e.getText(t))}),n=o.join("-")}else n=e.getText(n,a);return n},getTipName:function(t){var e,n,a=this._getGroupScales();if(a.length&&r.each(a,function(t){return n=t,!1}),n){var o=n.field;e=n.getText(t[o])}else{e=i(this._getTipValueScale())}return e},getTipItems:function(t,e){function n(e,n,i){if(!r.isNil(n)&&""!==n){var o={title:c,point:t,name:e||c,value:n,color:t.color||a,marker:!0};o.size=l._getIntervalSize(t),f.push(r.mix({},o,i))}}var o,s,l=this,u=t._origin,c=l.getTipTitle(u,e),h=l.get("tooltipCfg"),f=[];if(h){var p=h.fields,g=h.cfg,d=[];if(r.each(p,function(t){d.push(u[t])}),g){r.isFunction(g)&&(g=g.apply(null,d));var v=r.mix({},{point:t,title:c,color:t.color||a,marker:!0},g);v.size=l._getIntervalSize(t),f.push(v)}else r.each(p,function(t){if(!r.isNil(u[t])){var e=l._getScale(t);o=i(e),s=e.getText(u[t]),n(o,s)}})}else{var y=l._getTipValueScale();r.isNil(u[y.field])||(s=l.getTipValue(u,y),n(o=l.getTipName(u),s))}return f},isShareTooltip:function(){var t,e=this.get("shareTooltip"),n=this.get("type"),i=this.get("view");if(t=i.get("parent")?i.get("parent").get("options"):i.get("options"),"interval"===n){var a=this.get("coord"),o=a.type;("theta"===o||"polar"===o&&a.isTransposed)&&(e=!1)}else this.getYScale()&&!r.inArray(["contour","point","polygon","edge"],n)||(e=!1);return t.tooltip&&r.isBoolean(t.tooltip.shared)&&(e=t.tooltip.shared),e}};t.exports=o},function(t,e,n){function i(t,e){if(!t)return!0;if(t.length!==e.length)return!0;var n=!1;return a.each(e,function(e,i){if(!function(t,e){if(a.isNil(t)||a.isNil(e))return!1;var n=t.get("origin"),i=e.get("origin");return a.isEqual(n,i)}(e,t[i]))return n=!0,!1}),n}function r(t,e){var n={};return a.each(t,function(t,i){var r=e.attr(i);a.isArray(r)&&(r=a.cloneDeep(r)),n[i]=r}),n}var a=n(0),o={_isAllowActive:function(){var t=this.get("allowActive");if(!a.isNil(t))return t;var e=this.get("view"),n=this.isShareTooltip();return!1===e.get("options").tooltip||!n},_onMouseenter:function(t){var e=t.shape,n=this.get("shapeContainer");e&&n.contain(e)&&this._isAllowActive()&&this.setShapesActived(e)},_onMouseleave:function(){var t=this.get("view").get("canvas");this.get("activeShapes")&&(this.clearActivedShapes(),t.draw())},_bindActiveAction:function(){var t=this.get("view"),e=this.get("type");t.on(e+":mouseenter",a.wrapBehavior(this,"_onMouseenter")),t.on(e+":mouseleave",a.wrapBehavior(this,"_onMouseleave"))},_offActiveAction:function(){var t=this.get("view"),e=this.get("type");t.off(e+":mouseenter",a.getWrapBehavior(this,"_onMouseenter")),t.off(e+":mouseleave",a.getWrapBehavior(this,"_onMouseleave"))},_setActiveShape:function(t){var e=this.get("activedOptions")||{},n=t.get("origin"),i=n.shape||this.getDefaultValue("shape");a.isArray(i)&&(i=i[0]);var o=this.get("shapeFactory"),s=a.mix({},t.attr(),{origin:n}),l=o.getActiveCfg(i,s);e.style&&a.mix(l,e.style);var u=r(l,t);t.setSilent("_originAttrs",u),e.animate?t.animate(l,300):t.attr(l),t.set("zIndex",1)},setShapesActived:function(t){var e=this;a.isArray(t)||(t=[t]);var n=e.get("activeShapes");if(i(n,t)){var r=e.get("view").get("canvas"),o=e.get("shapeContainer"),s=e.get("activedOptions");s&&s.highlight?(a.each(t,function(t){t.get("animating")&&t.stopAnimate()}),e.highlightShapes(t)):(n&&e.clearActivedShapes(),a.each(t,function(t){t.get("animating")&&t.stopAnimate(),t.get("visible")&&!t.get("selected")&&e._setActiveShape(t)})),e.set("activeShapes",t),o.sort(),r.draw()}},clearActivedShapes:function(){var t=this.get("shapeContainer"),e=this.get("activedOptions"),n=e&&e.animate;if(t&&!t.get("destroyed")){var i=this.get("activeShapes");a.each(i,function(t){if(!t.get("selected")){var e=t.get("_originAttrs");n?(t.stopAnimate(),t.animate(e,300)):t.attr(e),t.setZIndex(0),t.set("_originAttrs",null)}});if(this.get("preHighlightShapes")){var r=t.get("children");a.each(r,function(t){if(!t.get("selected")){var e=t.get("_originAttrs");e&&(n?(t.stopAnimate(),t.animate(e,300)):t.attr(e),t.setZIndex(0),t.set("_originAttrs",null))}})}t.get("children").sort(function(t,e){return t._INDEX-e._INDEX}),this.set("activeShapes",null),this.set("preHighlightShapes",null)}},getGroupShapesByPoint:function(t){var e=[];if(this.get("shapeContainer")){var n=this.getXScale().field,i=this.getShapes(),r=this._getOriginByPoint(t);a.each(i,function(t){var i=t.get("origin");if(t.get("visible")&&i){i._origin[n]===r[n]&&e.push(t)}})}return e},getSingleShapeByPoint:function(t){var e,n=this.get("shapeContainer"),i=n.get("canvas").get("pixelRatio");if(n&&(e=n.getShape(t.x*i,t.y*i)),e&&e.get("origin"))return e},highlightShapes:function(t,e){a.isArray(t)||(t=[t]);var n=this.get("activeShapes");if(i(n,t)){n&&this.clearActivedShapes();var o=this.getShapes(),s=this.get("activedOptions"),l=s&&s.animate,u=s&&s.style;a.each(o,function(n){var i={};n.stopAnimate(),-1!==a.indexOf(t,n)?(a.mix(i,u,e),n.setZIndex(1)):(a.mix(i,{fillOpacity:.3,opacity:.3}),n.setZIndex(0));var o=r(i,n);n.setSilent("_originAttrs",o),l?n.animate(i,300):n.attr(i)}),this.set("preHighlightShapes",t),this.set("activeShapes",t)}}};t.exports=o},function(t,e,n){function i(t,e){if(r.isNil(t)||r.isNil(e))return!1;var n=t.get("origin"),i=e.get("origin");return r.isEqual(n,i)}var r=n(0),a={_isAllowSelect:function(){var t=this.get("allowSelect");if(!r.isNil(t))return t;var e=this.get("type"),n=this.get("coord"),i=n&&n.type;return"interval"===e&&"theta"===i},_onClick:function(t){if(this._isAllowSelect()){this.clearActivedShapes();var e=t.shape,n=this.get("shapeContainer");e&&!e.get("animating")&&n.contain(e)&&this.setShapeSelected(e)}},_bindSelectedAction:function(){var t=this.get("view"),e=this.get("type");t.on(e+":click",r.wrapBehavior(this,"_onClick"))},_offSelectedAction:function(){var t=this.get("view"),e=this.get("type");t.off(e+":click",r.getWrapBehavior(this,"_onClick"))},_setShapeStatus:function(t,e){var n=this.get("view"),i=this.get("selectedOptions")||{},a=!1!==i.animate,o=n.get("canvas");t.set("selected",e);var s=t.get("origin");if(e){var l=s.shape||this.getDefaultValue("shape");r.isArray(l)&&(l=l[0]);var u=this.get("shapeFactory"),c=r.mix({geom:this,point:s},i),h=u.getSelectedCfg(l,c);r.mix(h,c.style),t.get("_originAttrs")||(t.get("animating")&&t.stopAnimate(),t.set("_originAttrs",function(t,e){var n={};return r.each(t,function(t,i){"transform"===i&&(i="matrix");var a=e.attr(i);r.isArray(a)&&(a=r.cloneDeep(a)),n[i]=a}),n}(h,t))),a?t.animate(h,300):(t.attr(h),o.draw())}else{var f=t.get("_originAttrs");t.set("_originAttrs",null),a?t.animate(f,300):(t.attr(f),o.draw())}},setShapeSelected:function(t){var e=this._getSelectedShapes(),n=this.get("selectedOptions")||{},a=!1!==n.cancelable;if("multiple"===n.mode)-1===r.indexOf(e,t)?(e.push(t),this._setShapeStatus(t,!0)):a&&(r.Array.remove(e,t),this._setShapeStatus(t,!1));else{var o=e[0];a&&(t=i(o,t)?null:t),i(o,t)||(o&&this._setShapeStatus(o,!1),t&&this._setShapeStatus(t,!0))}},clearSelected:function(){var t=this,e=t.get("shapeContainer");if(e&&!e.get("destroyed")){var n=t._getSelectedShapes();r.each(n,function(e){t._setShapeStatus(e,!1),e.set("_originAttrs",null)})}},setSelected:function(t){var e=this,n=e.getShapes();return r.each(n,function(n){var i=n.get("origin");i&&i._origin===t&&e.setShapeSelected(n)}),this},_getSelectedShapes:function(){var t=this.getShapes(),e=[];return r.each(t,function(t){t.get("selected")&&e.push(t)}),this.set("selectedShapes",e),e}};t.exports=a},function(t,e,n){var i=n(0);t.exports=function(t){return i.isArray(t)?t:i.isString(t)?t.split("*"):[t]}},function(t,e,n){var i=n(74),r=n(0),a=/^(?:(?!0000)[0-9]{4}([-/.]+)(?:(?:0?[1-9]|1[0-2])\1(?:0?[1-9]|1[0-9]|2[0-8])|(?:0?[13-9]|1[0-2])\1(?:29|30)|(?:0?[13578]|1[02])\1(?:31))|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)([-/.]?)0?2\2(?:29))(\s+([01]|([01][0-9]|2[0-3])):([0-9]|[0-5][0-9]):([0-9]|[0-5][0-9]))?$/,o={LINEAR:"linear",CAT:"cat",TIME:"time"},s=function(){function t(t){this.defs={},this.viewTheme={scales:{}},this.filters={},r.assign(this,t)}var e=t.prototype;return e._getDef=function(t){var e=this.defs,n=this.viewTheme,i=null;return(n.scales[t]||e[t])&&(i=r.mix({},n.scales[t]),r.each(e[t],function(t,e){r.isNil(t)?delete i[e]:i[e]=t}),this.filters[t]&&(delete i.min,delete i.max)),i},e._getDefaultType=function(t,e){var n=o.LINEAR,i=r.Array.firstValue(e,t);return r.isArray(i)&&(i=i[0]),a.test(i)?n=o.TIME:r.isString(i)&&(n=o.CAT),n},e._getScaleCfg=function(t,e,n){var a={field:e},o=r.Array.values(n,e);if(a.values=o,!i.isCategory(t)&&"time"!==t){var s=r.Array.getRange(o);a.min=s.min,a.max=s.max,a.nice=!0}return"time"===t&&(a.nice=!1),a},e.createScale=function(t,e){var n,a=this._getDef(t);if(!e||!e.length)return n=a&&a.type?i[a.type](a):i.identity({value:t,field:t.toString(),values:[t]});var o=r.Array.firstValue(e,t);if(r.isNumber(t)||r.isNil(o)&&!a)n=i.identity({value:t,field:t.toString(),values:[t]});else{var s;a&&(s=a.type),s=s||this._getDefaultType(t,e);var l=this._getScaleCfg(s,t,e);a&&r.mix(l,a),n=i[s](l)}return n},t}();t.exports=s},function(t,e,n){var i=n(0),r=n(343),a=function(){function t(t){this.type="rect",this.actions=[],this.cfg={},i.mix(this,t),this.option=t||{}}var e=t.prototype;return e.reset=function(t){return this.actions=t.actions||[],this.type=t.type,this.cfg=t.cfg,this.option.actions=this.actions,this.option.type=this.type,this.option.cfg=this.cfg,this},e._execActions=function(t){var e=this.actions;i.each(e,function(e){var n=e[0];t[n](e[1],e[2])})},e.hasAction=function(t){var e=this.actions,n=!1;return i.each(e,function(e){if(t===e[0])return n=!0,!1}),n},e.createCoord=function(t,e){var n,a,o=this.type,s=this.cfg,l=i.mix({start:t,end:e},s);return"theta"===o?(n=r.Polar,this.hasAction("transpose")||this.transpose(),(a=new n(l)).type=o):a=new(n=r[i.upperFirst(o||"")]||r.Rect)(l),this._execActions(a),a},e.rotate=function(t){return t=t*Math.PI/180,this.actions.push(["rotate",t]),this},e.reflect=function(t){return this.actions.push(["reflect",t]),this},e.scale=function(t,e){return this.actions.push(["scale",t,e]),this},e.transpose=function(){return this.actions.push(["transpose"]),this},t}();t.exports=a},function(t,e,n){"use strict";var i=n(44);i.Cartesian=n(344),i.Rect=i.Cartesian,i.Polar=n(345),i.Helix=n(346),t.exports=i},function(t,e,n){"use strict";function i(t){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function r(t,e){return!e||"object"!==i(e)&&"function"!=typeof e?function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t):e}function a(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function o(t,e,n){return e&&a(t.prototype,e),n&&a(t,n),t}function s(t,e){return(s=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}function l(t,e,n){return(l="undefined"!=typeof Reflect&&Reflect.get?Reflect.get:function(t,e,n){var i=function(t,e){for(;!Object.prototype.hasOwnProperty.call(t,e)&&null!==(t=u(t)););return t}(t,e);if(i){var r=Object.getOwnPropertyDescriptor(i,e);return r.get?r.get.call(n):r.value}})(t,e,n||t)}function u(t){return(u=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)})(t)}var c=n(8),h=n(44),f=function(t){function e(t){var n;return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,e),(n=r(this,u(e).call(this,t)))._init(),n}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&s(t,e)}(e,h),o(e,[{key:"getDefaultCfg",value:function(){var t=l(u(e.prototype),"getDefaultCfg",this).call(this);return c({},t,{start:{x:0,y:0},end:{x:0,y:0},type:"cartesian",isRect:!0})}}]),o(e,[{key:"_init",value:function(){var t=this.start,e=this.end,n={start:t.x,end:e.x},i={start:t.y,end:e.y};this.x=n,this.y=i}},{key:"convertPoint",value:function(t){var e,n;return this.isTransposed?(e=t.y,n=t.x):(e=t.x,n=t.y),{x:this.convertDim(e,"x"),y:this.convertDim(n,"y")}}},{key:"invertPoint",value:function(t){var e=this.invertDim(t.x,"x"),n=this.invertDim(t.y,"y");return this.isTransposed?{x:n,y:e}:{x:e,y:n}}}]),e}();t.exports=f},function(t,e,n){"use strict";function i(t){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function r(t,e){return!e||"object"!==i(e)&&"function"!=typeof e?function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t):e}function a(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function o(t,e,n){return e&&a(t.prototype,e),n&&a(t,n),t}function s(t,e){return(s=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}function l(t,e,n){return(l="undefined"!=typeof Reflect&&Reflect.get?Reflect.get:function(t,e,n){var i=function(t,e){for(;!Object.prototype.hasOwnProperty.call(t,e)&&null!==(t=u(t)););return t}(t,e);if(i){var r=Object.getOwnPropertyDescriptor(i,e);return r.get?r.get.call(n):r.value}})(t,e,n||t)}function u(t){return(u=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)})(t)}var c=n(43),h=n(35),f=n(8),p=n(44),g=c.mat3,d=c.vec2,v=c.vec3,y=function(t){function e(t){var n;return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,e),(n=r(this,u(e).call(this,t)))._init(),n}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&s(t,e)}(e,p),o(e,[{key:"getDefaultCfg",value:function(){var t=l(u(e.prototype),"getDefaultCfg",this).call(this);return f({},t,{startAngle:-Math.PI/2,endAngle:3*Math.PI/2,innerRadius:0,type:"polar",isPolar:!0})}}]),o(e,[{key:"_init",value:function(){for(var t=this.radius,e=this.innerRadius,n=this.center,i=this.startAngle,r=this.endAngle;r<i;)r+=2*Math.PI;this.endAngle=r;var a,o,s=this.getOneBox(),l=s.maxX-s.minX,u=s.maxY-s.minY,c=Math.abs(s.minX)/l,h=Math.abs(s.minY)/u,f=this.width,p=this.height;p/u>f/l?(a=f/l,o={x:n.x-(.5-c)*f,y:n.y-(.5-h)*a*u}):(a=p/u,o={x:n.x-(.5-c)*a*l,y:n.y-(.5-h)*p}),t?t>0&&t<=1?t*=a:(t<=0||t>a)&&(t=a):t=a;var g={start:i,end:r},d={start:e*t,end:t};this.x=g,this.y=d,this.radius=t,this.circleCentre=o,this.center=o}},{key:"getCenter",value:function(){return this.circleCentre}},{key:"getOneBox",value:function(){var t=this.startAngle,e=this.endAngle;if(Math.abs(e-t)>=2*Math.PI)return{minX:-1,maxX:1,minY:-1,maxY:1};for(var n=[0,Math.cos(t),Math.cos(e)],i=[0,Math.sin(t),Math.sin(e)],r=Math.min(t,e);r<Math.max(t,e);r+=Math.PI/18)n.push(Math.cos(r)),i.push(Math.sin(r));return{minX:Math.min.apply(Math,n),maxX:Math.max.apply(Math,n),minY:Math.min.apply(Math,i),maxY:Math.max.apply(Math,i)}}},{key:"getRadius",value:function(){return this.radius}},{key:"convertPoint",value:function(t){var e=this.getCenter(),n=this.isTransposed?t.y:t.x,i=this.isTransposed?t.x:t.y;return n=this.convertDim(n,"x"),i=this.convertDim(i,"y"),{x:e.x+Math.cos(n)*i,y:e.y+Math.sin(n)*i}}},{key:"invertPoint",value:function(t){var e=this.getCenter(),n=[t.x-e.x,t.y-e.y],i=this.x,r=[1,0,0,0,1,0,0,0,1];g.rotate(r,r,i.start);var a=[1,0,0];v.transformMat3(a,a,r),a=[a[0],a[1]];var o=d.angleTo(a,n,i.end<i.start);h(o,2*Math.PI)&&(o=0);var s=d.length(n),l=o/(i.end-i.start);l=i.end-i.start>0?l:-l;var u=this.invertDim(s,"y"),c={};return c.x=this.isTransposed?u:l,c.y=this.isTransposed?l:u,c}}]),e}();t.exports=y},function(t,e,n){"use strict";function i(t){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function r(t,e){return!e||"object"!==i(e)&&"function"!=typeof e?function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t):e}function a(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function o(t,e,n){return e&&a(t.prototype,e),n&&a(t,n),t}function s(t,e){return(s=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}function l(t,e,n){return(l="undefined"!=typeof Reflect&&Reflect.get?Reflect.get:function(t,e,n){var i=function(t,e){for(;!Object.prototype.hasOwnProperty.call(t,e)&&null!==(t=u(t)););return t}(t,e);if(i){var r=Object.getOwnPropertyDescriptor(i,e);return r.get?r.get.call(n):r.value}})(t,e,n||t)}function u(t){return(u=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)})(t)}var c=n(43),h=n(35),f=n(8),p=n(44),g=c.vec2,d=function(t){function e(t){var n;return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,e),(n=r(this,u(e).call(this,t)))._init(),n}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&s(t,e)}(e,p),o(e,[{key:"getDefaultCfg",value:function(){var t=l(u(e.prototype),"getDefaultCfg",this).call(this);return f({},t,{startAngle:1.25*Math.PI,endAngle:7.25*Math.PI,innerRadius:0,type:"helix",isHelix:!0})}}]),o(e,[{key:"_init",value:function(){var t=this.width,e=this.height,n=this.radius,i=this.innerRadius,r=this.startAngle,a=this.endAngle,o=(a-r)/(2*Math.PI)+1,s=Math.min(t,e)/2;n&&n>=0&&n<=1&&(s*=n);var l=Math.floor(s*(1-i)/o),u=l/(2*Math.PI),c={start:r,end:a},h={start:i*s,end:i*s+.99*l};this.a=u,this.d=l,this.x=c,this.y=h}},{key:"getCenter",value:function(){return this.center}},{key:"convertPoint",value:function(t){var e,n,i=this.a,r=this.center;this.isTransposed?(e=t.y,n=t.x):(e=t.x,n=t.y);var a=this.convertDim(e,"x"),o=i*a,s=this.convertDim(n,"y");return{x:r.x+Math.cos(a)*(o+s),y:r.y+Math.sin(a)*(o+s)}}},{key:"invertPoint",value:function(t){var e=this.center,n=this.a,i=this.d+this.y.start,r=g.subtract([],[t.x,t.y],[e.x,e.y]),a=g.angleTo(r,[1,0],!0),o=a*n;g.length(r)<o&&(o=g.length(r));var s=n*(a=2*Math.floor((g.length(r)-o)/i)*Math.PI+a),l=g.length(r)-s;l=h(l,0)?0:l;var u=this.invertDim(a,"x"),c=this.invertDim(l,"y");u=h(u,0)?0:u,c=h(c,0)?0:c;var f={};return f.x=this.isTransposed?c:u,f.y=this.isTransposed?u:c,f}}]),e}();t.exports=d},function(t,e,n){function i(t,e){return void 0===e&&(e=0),"middle"===t&&(e=.5),-1!==t.indexOf("%")&&(e=parseInt(t,10)/100),e}var r=n(0),a=n(21).Axis,o=r.MatrixUtil.vec2,s=function(){function t(t){this.visible=!0,this.canvas=null,this.container=null,this.coord=null,this.options=null,this.axes=[],r.mix(this,t)}var e=t.prototype;return e._isHide=function(t){var e=this.options;return!(!e||!1!==e[t])},e._getMiddleValue=function(t,e,n,i){if(0===t&&!i)return 0;if(1===t)return 1;var r=e[n+1].value;return i||1!==r?(t+r)/2:1},e._getLineRange=function(t,e,n,r){var a,o,s,l=e.field,u=this.options,c="";if(u[l]&&u[l].position&&(c=u[l].position),"x"===n){var h="top"===c?1:0;a={x:0,y:h=i(c,h)},o={x:1,y:h},s=!1}else{if(r){var f="left"===c?0:1;a={x:f=i(c,f),y:0},o={x:f,y:1}}else{var p="right"===c?1:0;a={x:p=i(c,p),y:0},o={x:p,y:1}}s=!0}return a=t.convert(a),o=t.convert(o),{start:a,end:o,isVertical:s}},e._getLineCfg=function(t,e,n,i){var r,a=this._getLineRange(t,e,n,i),o=a.isVertical,s=a.start,l=a.end,u=t.center;return t.isTransposed&&(o=!o),r=o&&s.x>u.x||!o&&s.y>u.y?1:-1,{isVertical:o,factor:r,start:s,end:l}},e._getCircleCfg=function(t){var e,n={},i=t.x,r=t.y,a=r.start>r.end;e=t.isTransposed?{x:a?0:1,y:0}:{x:0,y:a?0:1},e=t.convert(e);var s,l=t.circleCentre,u=[e.x-l.x,e.y-l.y],c=[1,0],h=(s=e.y>l.y?o.angle(u,c):-1*o.angle(u,c))+(i.end-i.start);return n.startAngle=s,n.endAngle=h,n.center=l,n.radius=Math.sqrt(Math.pow(e.x-l.x,2)+Math.pow(e.y-l.y,2)),n.inner=t.innerRadius||0,n},e._getRadiusCfg=function(t){var e,n,i=t.x.start<0?-1:1;return t.isTransposed?(e={x:0,y:0},n={x:1,y:0}):(e={x:0,y:0},n={x:0,y:1}),{factor:i,start:t.convert(e),end:t.convert(n)}},e._getAxisPosition=function(t,e,n,i){var r="",a=this.options;if(a[i]&&a[i].position)r=a[i].position;else{var o=t.type;t.isRect?"x"===e?r="bottom":"y"===e&&(r=n?"right":"left"):r="helix"===o?"helix":"x"===e?t.isTransposed?"radius":"circle":t.isTransposed?"circle":"radius"}return r},e._getAxisDefaultCfg=function(t,e,n,i){var a=this.viewTheme,o={},s=this.options,l=e.field;if(o=r.deepMix({},a.axis[i],o,s[l]),o.viewTheme=a,o.title){var u=r.isPlainObject(o.title)?o.title:{};u.text=u.text||e.alias||l,r.deepMix(o,{title:u})}return o.ticks=e.getTicks(),t.isPolar&&!e.isCategory&&"x"===n&&Math.abs(t.endAngle-t.startAngle)===2*Math.PI&&o.ticks.pop(),o.coord=t,o.label&&r.isNil(o.label.autoRotate)&&(o.label.autoRotate=!0),s.hasOwnProperty("xField")&&s.xField.hasOwnProperty("grid")&&"left"===o.position&&r.deepMix(o,s.xField),o},e._getAxisCfg=function(t,e,n,i,a,o){void 0===a&&(a="");var s=this,l=s._getAxisPosition(t,i,a,e.field),u=s._getAxisDefaultCfg(t,e,i,l);if(!r.isEmpty(u.grid)&&n){var c=[],h=[],f=function(t){var e=[];if(t.length>0){var n=(e=t.slice(0))[0],i=e[e.length-1];0!==n.value&&e.unshift({value:0}),1!==i.value&&e.push({value:1})}return e}(n.getTicks());if(f.length){var p=function(t,e,n){var i=[];return t.length<1?i:(t.length>=2&&e&&n&&i.push({text:"",tickValue:"",value:0}),0!==t[0].value&&i.push({text:"",tickValue:"",value:0}),1!==(i=i.concat(t))[i.length-1].value&&i.push({text:"",tickValue:"",value:1}),i)}(u.ticks,e.isLinear,"center"===u.grid.align);r.each(p,function(n,l){h.push(n.tickValue);var g=[],d=n.value;if("center"===u.grid.align&&(d=s._getMiddleValue(d,p,l,e.isLinear)),!r.isNil(d)){var v=t.x,y=t.y;r.each(f,function(e){var n="x"===i?d:e.value,r="x"===i?e.value:d,a=t.convert({x:n,y:r});if(t.isPolar){var o=t.circleCentre;y.start>y.end&&(r=1-r),a.flag=v.start>v.end?0:1,a.radius=Math.sqrt(Math.pow(a.x-o.x,2)+Math.pow(a.y-o.y,2))}g.push(a)}),c.push({_id:o+"-"+i+a+"-grid-"+n.tickValue,points:g})}})}u.grid.items=c,u.grid.tickValues=h}return u.type=e.type,u},e._getHelixCfg=function(t){for(var e={},n=t.a,i=t.startAngle,r=t.endAngle,a=[],o=0;o<=100;o++){var s=t.convert({x:o/100,y:0});a.push(s.x),a.push(s.y)}var l=t.convert({x:0,y:0});return e.a=n,e.startAngle=i,e.endAngle=r,e.crp=a,e.axisStart=l,e.center=t.center,e.inner=t.y.start,e},e._drawAxis=function(t,e,n,i,o,s,l){var u,c,h=this.container,f=this.canvas;"cartesian"===t.type?(u=a.Line,c=this._getLineCfg(t,e,i,l)):"helix"===t.type&&"x"===i?(u=a.Helix,c=this._getHelixCfg(t)):"x"===i?(u=a.Circle,c=this._getCircleCfg(t)):(u=a.Line,c=this._getRadiusCfg(t));var p=this._getAxisCfg(t,e,n,i,l,o);p=r.mix({},p,c),"y"===i&&s&&"circle"===s.get("type")&&(p.circle=s),p._id=o+"-"+i,r.isNil(l)||(p._id=o+"-"+i+l),r.mix(p,{canvas:f,group:h});var g=new u(p);return g.render(),this.axes.push(g),g},e.createAxis=function(t,e,n){var i=this,a=this.coord,o=a.type;if("theta"!==o&&("polar"!==o||!a.isTransposed)){var s;t&&!i._isHide(t.field)&&(s=i._drawAxis(a,t,e[0],"x",n)),r.isEmpty(e)||"helix"===o||r.each(e,function(e,r){i._isHide(e.field)||i._drawAxis(a,e,t,"y",n,s,r)})}},e.changeVisible=function(t){var e=this.axes;r.each(e,function(e){e.set("visible",t)})},e.clear=function(){var t=this.axes;r.each(t,function(t){t.clear()}),this.axes=[]},t}();t.exports=s},function(t,e,n){var i=n(0),r=n(349),a=function(){function t(t){this.guides=[],this.options=[],this.xScales=null,this.yScales=null,this.view=null,this.viewTheme=null,this.frontGroup=null,this.backGroup=null,i.mix(this,t)}var e=t.prototype;return e._creatGuides=function(){var t=this,e=this.options,n=this.xScales,a=this.yScales,o=this.view,s=this.viewTheme;return this.backContainer&&o&&(this.backGroup=this.backContainer.addGroup({viewId:o.get("_id")})),this.frontContainer&&o&&(this.frontGroup=this.frontContainer.addGroup({viewId:o.get("_id")})),e.forEach(function(e){var o=e.type,l=i.deepMix({xScales:n,yScales:a,viewTheme:s},s?s.guide[o]:{},e);o=i.upperFirst(o);var u=new r[o](l);t.guides.push(u)}),t.guides},e.line=function(t){return void 0===t&&(t={}),this.options.push(i.mix({type:"line"},t)),this},e.arc=function(t){return void 0===t&&(t={}),this.options.push(i.mix({type:"arc"},t)),this},e.text=function(t){return void 0===t&&(t={}),this.options.push(i.mix({type:"text"},t)),this},e.image=function(t){return void 0===t&&(t={}),this.options.push(i.mix({type:"image"},t)),this},e.region=function(t){return void 0===t&&(t={}),this.options.push(i.mix({type:"region"},t)),this},e.regionFilter=function(t){return void 0===t&&(t={}),this.options.push(i.mix({type:"regionFilter"},t)),this},e.dataMarker=function(t){return void 0===t&&(t={}),this.options.push(i.mix({type:"dataMarker"},t)),this},e.dataRegion=function(t){return void 0===t&&(t={}),this.options.push(i.mix({type:"dataRegion"},t)),this},e.html=function(t){return void 0===t&&(t={}),this.options.push(i.mix({type:"html"},t)),this},e.render=function(t){var e=this,n=e.view,r=n&&n.get("data"),a=e._creatGuides();i.each(a,function(i){var a;a=i.get("top")?e.frontGroup||e.frontContainer:e.backGroup||e.backContainer,i.render(t,a,r,n)})},e.clear=function(){this.options=[],this.reset()},e.changeVisible=function(t){var e=this.guides;i.each(e,function(e){e.changeVisible(t)})},e.reset=function(){var t=this.guides;i.each(t,function(t){t.clear()}),this.guides=[],this.backGroup&&this.backGroup.remove(),this.frontGroup&&this.frontGroup.remove()},t}();t.exports=a},function(t,e,n){var i=n(21).Guide,r=n(350);i.RegionFilter=r,t.exports=i},function(t,e,n){var i=n(0),r=n(15),a=n(25).Path,o=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{name:"regionFilter",zIndex:1,top:!0,start:null,end:null,color:null,apply:null,style:{opacity:1}})},n.render=function(t,e,n,i){var r=this,a=e.addGroup();a.name="guide-region-filter",i.once("afterpaint",function(){if(!a.get("destroyed")){r._drawShapes(i,a);var e=r._drawClip(t);a.attr({clip:e}),r.set("clip",e),r.get("appendInfo")&&a.setSilent("appendInfo",r.get("appendInfo")),r.set("el",a)}})},n._drawShapes=function(t,e){var n=this,r=[];return t.getAllGeoms().map(function(t){var a=t.getShapes(),o=t.get("type");return n._geomFilter(o)&&a.map(function(t){var a=t.type,o=i.cloneDeep(t.attr());n._adjustDisplay(o);var s=e.addShape(a,{attrs:o});return r.push(s),t}),t}),r},n._drawClip=function(t){var e=this.parsePoint(t,this.get("start")),n=this.parsePoint(t,this.get("end")),i=[["M",e.x,e.y],["L",n.x,e.y],["L",n.x,n.y],["L",e.x,n.y],["z"]];return new a({attrs:{path:i,opacity:1}})},n._adjustDisplay=function(t){var e=this.get("color");t.fill&&(t.fill=t.fillStyle=e),t.stroke=t.strokeStyle=e},n._geomFilter=function(t){var e=this.get("apply");return!e||i.contains(e,t)},n.clear=function(){t.prototype.clear.call(this);var e=this.get("clip");e&&e.remove()},e}(r);t.exports=o},function(t,e,n){var i=n(0),r=n(21).Legend,a=n(352),o=n(18),s=n(166),l=n(168),u=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame,c=function(){function t(t){this.options={},i.mix(this,t),this.clear();var e=this.chart;this.container=e.get("frontPlot"),this.plotRange=e.get("plotRange")}var e=t.prototype;return e.clear=function(){var t=this.legends;this.backRange=null,i.each(t,function(t){i.each(t,function(t){t.destroy()})}),this.legends={}},e.getBackRange=function(){var t=this.backRange;if(!t){var e=this.chart.get("backPlot");t=s(e,l(this.chart.get("plotRange")));var n=this.plotRange;t.maxX-t.minX<n.br.x-n.tl.x&&t.maxY-t.minY<n.br.y-n.tl.y&&(t={minX:n.tl.x,minY:n.tl.y,maxX:n.br.x,maxY:n.br.y}),this.backRange=t}return t},e._isFieldInView=function(t,e,n){var r=!1,a=n.get("scales")[t];return a&&a.values&&(r=i.inArray(a.values,e)),r},e._bindClickEvent=function(t,e,n){var r=this,a=r.chart,o=a.get("views"),s=e.field,l=r.options;t.on("itemclick",function(e){if(l.onClick&&!0!==l.defaultClickHandlerEnabled)l.onClick(e);else{var u=e.item,c=e.checked,h="single"===t.get("selectedMode"),f=u.dataValue;c?(i.Array.remove(n,f),r._isFieldInView(s,f,a)&&a.filter(s,function(t){return h?t===f:!i.inArray(n,t)}),i.each(o,function(t){r._isFieldInView(s,f,t)&&t.filter(s,function(t){return h?t===f:!i.inArray(n,t)})})):h||(n.push(f),r._isFieldInView(s,f,a)&&a.filter(s,function(t){return!i.inArray(n,t)}),i.each(o,function(t){r._isFieldInView(s,f,t)&&t.filter(s,function(t){return!i.inArray(n,t)})})),l.onClick&&l.onClick(e),a.set("keepLegend",!0),a.set("keepPadding",!0),a.repaint(),a.set("keepPadding",!1),a.set("keepLegend",!1)}})},e._bindClickEventForMix=function(t){var e=this.chart.getAllGeoms();t.on("itemclick",function(t){var n=t.item.value;t.checked?i.each(e,function(t){t.getYScale().field===n&&t.show()}):i.each(e,function(t){t.getYScale().field===n&&t.hide()})})},e._filterLabels=function(t,e,n){if(t.get("gLabel"))t.get("gLabel").set("visible",n);else{var r=e.get("labelCfg");if(r&&r.fields&&r.fields.length>0){var a=e.getXScale(),o=e.getYScale(),s=a.field,l=o.field,u=t.get("origin")._origin,c=e.get("labelContainer").get("labelsGroup").get("children");i.each(c,function(e){var i=e.get("origin")||[];i[s]===u[s]&&i[l]===u[l]&&(e.set("visible",n),t.set("gLabel",e))})}}},e._bindFilterEvent=function(t,e){var n=this,r=this.chart,a=e.field;t.on("itemfilter",function(t){var e=t.range;r.filterShape(function(t,r,o){if(!i.isNil(t[a])){var s=t[a]>=e[0]&&t[a]<=e[1];return n._filterLabels(r,o,s),s}return!0});for(var o=r.getAllGeoms()||[],s=function(t){var n=o[t];"heatmap"===n.get("type")&&u(function(){n.drawWithRange(e)})},l=0;l<o.length;l++)s(l)})},e._getShapeData=function(t){var e=t.get("origin");return i.isArray(e)&&(e=e[0]),e._origin},e._bindHoverEvent=function(t,e){var n=this,r=n.chart,a=r.getAllGeoms(),o=n.options,s=r.get("canvas");t.on("itemhover",function(t){var r=t.item.value,l=n.pre;if(l){if(l===r)return}else i.each(a,function(a){var l=a.get("shapeContainer"),u=a.getShapes(),c=[];if(e){var h=a.get("scales")[e];i.each(u,function(t){var a=n._getShapeData(t);a&&function(t,e,n){return!i.isNil(n)&&(t=n.translate(t),e=n.translate(e),n.isCategory?t===e:Math.abs(t-e)<=1)}(a[e],r,h)&&c.push(t)})}else a.getYScale().field===r&&(c=u);i.isEmpty(c)||(t.shapes=c,t.geom=a,o.onHover?(o.onHover(t),l.sort(),s.draw()):a.setShapesActived(c))}),n.pre=r}),t.on("itemunhover",function(t){n.pre=null,o.onUnhover&&o.onUnhover(t),i.each(a,function(t){t.get("activeShapes")&&(t.clearActivedShapes(),s.draw())})})},e._isFiltered=function(t,e,n){if(!t.isCategory)return!0;var r=!0;return n=t.invert(n),i.each(e,function(e){if(t.getText(e)===t.getText(n))return r=!1,!1}),r},e._alignLegend=function(t,e,n,i){var r=this.viewTheme,a=this.container.get("canvas"),o=a.get("width"),s=a.get("height"),l=this.totalRegion,u=this.plotRange,c=this.getBackRange(),h=t.get("offset")[0]||0,f=t.get("offset")[1]||0,p=t.getHeight(),g=t.getWidth(),d=r.legend.margin,v=r.legend.legendMargin,y=this.legends[i].length,x=i.split("-"),m=0,_=0,b=y>1?l:n;if("left"===x[0]||"right"===x[0])s=u.br.y,m=this._getXAlign(x[0],o,n,c,g,d),_=e?e.get("group").get("y")+e.getHeight()+v:this._getYAlignVertical(x[1],s,b,c,0,d,a.get("height"));else if("top"===x[0]||"bottom"===x[0])if(_=this._getYAlignHorizontal(x[0],s,n,c,p,d),e){var w=e.getWidth();m=e.get("group").get("x")+w+v}else m=this._getXAlign(x[1],o,b,c,0,d),"right"===x[1]&&(m=u.br.x-b.totalWidth);t.move(m+h,_+f)},e._getXAlign=function(t,e,n,i,r,a){var o="left"===t?i.minX-r-a[3]:i.maxX+a[1];return"center"===t&&(o=(e-n.totalWidth)/2),o},e._getYAlignHorizontal=function(t,e,n,i,r,a){return"top"===t?i.minY-r-a[0]:i.maxY+a[2]},e._getYAlignVertical=function(t,e,n,i,r,a,o){var s="top"===t?i.minY-r-a[0]:e-n.totalHeight;return"center"===t&&(s=(o-n.totalHeight)/2),s},e._getSubRegion=function(t){var e=0,n=0,r=0,a=0;return i.each(t,function(t){var i=t.getWidth(),o=t.getHeight();e<i&&(e=i),r+=i,n<o&&(n=o),a+=o}),{maxWidth:e,totalWidth:r,maxHeight:n,totalHeight:a}},e._getRegion=function(){var t=this,e=t.viewTheme,n=t.legends,r=e.legend.legendMargin,a=[],o=0,s=0;return i.each(n,function(e){var n=t._getSubRegion(e);a.push(n),o+=n.totalWidth+r,s+=n.totalHeight+r}),{totalWidth:o,totalHeight:s,subs:a}},e._addCategoryLegend=function(t,e,n,s,l){var u=this,c=t.field,h=u.options,f=h[c];f&&(h=f);var p=u.legends;p[l]=p[l]||[];var g=u.container,d=[],v=t.getTicks(),y=!0,x=n.get("shapeType")||"point",m=n.getDefaultValue("shape")||"circle";h[c]&&h[c].marker?(m=h[c].marker,x="point",y=!1):h.marker&&(m=h.marker,x="point",y=!1);var _=u.chart,b=u.viewTheme,w=_.get("canvas"),S=u.plotRange,M=l.split("-"),C="right"===M[0]||"left"===M[0]?S.bl.y-S.tr.y:w.get("width");i.each(v,function(e){var r=e.text,a=e.value,l=t.invert(a),c={isInCircle:n.isInCircle()},h=!s||u._isFiltered(t,s,a),f=n.getAttr("color"),p=n.getAttr("shape");if(f)if(f.callback&&f.callback.length>1){var g=Array(f.callback.length-1).fill("");c.color=f.mapping.apply(f,[l].concat(g)).join("")||b.defaultColor}else c.color=f.mapping(l).join("")||b.defaultColor;if(y&&p)if(p.callback&&p.callback.length>1){var v=Array(p.callback.length-1).fill("");m=p.mapping.apply(p,[l].concat(v)).join("")}else m=p.mapping(l).join("");var _=o.getShapeFactory(x).getMarkerCfg(m,c);i.isFunction(m)&&(_.symbol=m),d.push({value:r,dataValue:l,checked:h,marker:_})});var A=i.deepMix({},b.legend[M[0]],h[c]||h,{viewId:_.get("_id"),maxLength:C,items:d,container:g,position:[0,0]});A.title&&i.deepMix(A,{title:{text:t.alias||t.field}});var k;if(u._isTailLegend(h,n))A.chart=u.chart,A.geom=n,k=new a(A);else if(h.useHtml){var P=g.get("canvas").get("el");if(g=h.container,i.isString(g)&&/^\#/.test(g)){var T=g.replace("#","");g=document.getElementById(T)}g||(g=P.parentNode),A.container=g,void 0===A.legendStyle&&(A.legendStyle={}),A.legendStyle.CONTAINER_CLASS={position:"absolute",overflow:"auto","z-index":""===P.style.zIndex?1:parseInt(P.style.zIndex,10)+1},h.flipPage?(A.legendStyle.CONTAINER_CLASS.height="right"===M[0]||"left"===M[0]?C+"px":"auto",A.legendStyle.CONTAINER_CLASS.width="right"!==M[0]&&"left"!==M[0]?C+"px":"auto",k=new r.CatPageHtml(A)):k=new r.CatHtml(A)}else k=new r.Category(A);return u._bindClickEvent(k,t,s),p[l].push(k),k},e._bindChartMove=function(t){var e=this.chart,n=this.legends;e.on("plotmove",function(e){var r=!1;if(e.target){var a=e.target.get("origin");if(a){var o=a._origin||a[0]._origin,s=t.field;if(o){var l=o[s];i.each(n,function(t){i.each(t,function(t){r=!0,!t.destroyed&&t.activate(l)})})}}}r||i.each(n,function(t){i.each(t,function(t){!t.destroyed&&t.deactivate()})})})},e._addContinuousLegend=function(t,e,n){var a=this.legends;a[n]=a[n]||[];var o,s,l,u=this.container,c=t.field,h=t.getTicks(),f=[],p=this.viewTheme;i.each(h,function(n){var i=n.value,r=t.invert(i),a=e.mapping(r).join("");f.push({value:n.tickValue,attrValue:a,color:a,scaleValue:i}),0===i&&(s=!0),1===i&&(l=!0)}),s||f.push({value:t.min,attrValue:e.mapping(0).join(""),color:e.mapping(0).join(""),scaleValue:0}),l||f.push({value:t.max,attrValue:e.mapping(1).join(""),color:e.mapping(1).join(""),scaleValue:1});var g=this.options,d=n.split("-"),v=p.legend[d[0]];(g&&!1===g.slidable||g[c]&&!1===g[c].slidable)&&(v=i.mix({},v,p.legend.gradient));var y=i.deepMix({},v,g[c]||g,{items:f,attr:e,formatter:t.formatter,container:u,position:[0,0]});if(y.title&&i.deepMix(y,{title:{text:t.alias||t.field}}),"color"===e.type)o=new r.Color(y);else{if("size"!==e.type)return;o=g&&"circle"===g.sizeType?new r.CircleSize(y):new r.Size(y)}return this._bindFilterEvent(o,t),a[n].push(o),o},e._isTailLegend=function(t,e){if(t.hasOwnProperty("attachLast")&&t.attachLast){var n=e.get("type");if("line"===n||"lineStack"===n||"area"===n||"areaStack"===n)return!0}return!1},e._adjustPosition=function(t,e){var n;if(e)n="right-top";else if(i.isArray(t))n=String(t[0])+"-"+String(t[1]);else{var r=t.split("-");1===r.length?("left"===r[0]&&(n="left-bottom"),"right"===r[0]&&(n="right-bottom"),"top"===r[0]&&(n="top-center"),"bottom"===r[0]&&(n="bottom-center")):n=t}return n},e.addLegend=function(t,e,n,i){var r=this.options,a=t.field,o=r[a],s=this.viewTheme;if(!1===o)return null;if(o&&o.custom)this.addCustomLegend(a);else{var l=r.position||s.defaultLegendPosition;l=this._adjustPosition(l,this._isTailLegend(r,n)),o&&o.position&&(l=this._adjustPosition(o.position,this._isTailLegend(o,n)));var u;(u=t.isLinear?this._addContinuousLegend(t,e,l):this._addCategoryLegend(t,e,n,i,l))&&(this._bindHoverEvent(u,a),r.reactive&&this._bindChartMove(t))}},e.addCustomLegend=function(t){var e=this.chart,n=this.viewTheme,a=this.container,o=this.options;t&&(o=o[t]);var s=o.position||n.defaultLegendPosition;s=this._adjustPosition(s);var l=this.legends;l[s]=l[s]||[];var u=o.items;if(u){var c=e.getAllGeoms();i.each(u,function(t){var e=function(t,e){var n;return i.each(t,function(t){t.get("visible")&&t.getYScale().field===e&&(n=t)}),n}(c,t.value);i.isObject(t.marker)?t.marker.radius=t.marker.radius||4.5:t.marker={symbol:t.marker?t.marker:"circle",fill:t.fill,radius:4.5},t.checked=!!i.isNil(t.checked)||t.checked,t.geom=e});var h,f=e.get("canvas"),p=this.plotRange,g=s.split("-"),d="right"===g[0]||"left"===g[0]?p.bl.y-p.tr.y:f.get("width"),v=i.deepMix({},n.legend[g[0]],o,{maxLength:d,items:u,container:a,position:[0,0]});if(o.useHtml){var y=o.container;if(/^\#/.test(a)){var x=y.replace("#","");y=document.getElementById(x)}else y||(y=a.get("canvas").get("el").parentNode);v.container=y,void 0===v.legendStyle&&(v.legendStyle={}),v.legendStyle.CONTAINER_CLASS||(v.legendStyle.CONTAINER_CLASS={height:"right"===g[0]||"left"===g[0]?d+"px":"auto",width:"right"!==g[0]&&"left"!==g[0]?d+"px":"auto",position:"absolute",overflow:"auto"}),h=o.flipPage?new r.CatPageHtml(v):new r.CatHtml(v)}else h=new r.Category(v);return l[s].push(h),h.on("itemclick",function(t){o.onClick&&o.onClick(t)}),this._bindHoverEvent(h),h}},e.addMixedLegend=function(t,e){var n=[];i.each(t,function(t){var r=t.field;i.each(e,function(e){if(e.getYScale()===t&&t.values&&t.values.length>0){var i=e.get("shapeType")||"point",a=e.getDefaultValue("shape")||"circle",s=o.getShapeFactory(i),l={color:e.getDefaultValue("color")},u=s.getMarkerCfg(a,l),c={value:r,marker:u};n.push(c)}})});var r={custom:!0,items:n};this.options=i.deepMix({},r,this.options);var a=this.addCustomLegend();this._bindClickEventForMix(a)},e.alignLegends=function(){var t=this,e=t.legends,n=t._getRegion(e);t.totalRegion=n;var r=0;return i.each(e,function(e,a){var o=n.subs[r];i.each(e,function(n,i){var r=e[i-1];n.get("useHtml")&&!n.get("autoPosition")||t._alignLegend(n,r,o,a)}),r++}),this},t}();t.exports=c},function(t,e,n){var i=n(0),r=n(21),a=n(7),o=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{type:"tail-legend",layout:"vertical",autoLayout:!0})},n._addItem=function(t){var e=this.get("itemsGroup"),n=this._getNextX(),r=this.get("unCheckColor"),a=e.addGroup({x:0,y:0,value:t.value,scaleValue:t.scaleValue,checked:t.checked});a.translate(n,0),a.set("viewId",e.get("viewId"));var o=this.get("textStyle"),s=this.get("_wordSpaceing"),l=0;if(t.marker){var u=i.mix({},t.marker,{x:t.marker.radius,y:0});t.checked||(u.fill&&(u.fill=r),u.stroke&&(u.stroke=r));var c=a.addShape("marker",{type:"marker",attrs:u});c.attr("cursor","pointer"),c.name="legend-marker",l+=c.getBBox().width+s}var h=i.mix({},o,{x:l,y:0,text:this._formatItemValue(t.value)});t.checked||i.mix(h,{fill:r});var f=a.addShape("text",{attrs:h});f.attr("cursor","pointer"),f.name="legend-text",this.get("appendInfo")&&f.setSilent("appendInfo",this.get("appendInfo"));var p=a.getBBox(),g=this.get("itemWidth"),d=a.addShape("rect",{attrs:{x:n,y:0-p.height/2,fill:"#fff",fillOpacity:0,width:g||p.width,height:p.height}});return d.attr("cursor","pointer"),d.setSilent("origin",t),d.name="legend-item",this.get("appendInfo")&&d.setSilent("appendInfo",this.get("appendInfo")),a.name="legendGroup",a},n._adjust=function(){if(this.get("geom")){this.get("group").attr("matrix")[7]=0;var t=this.get("geom").get("dataArray"),e=this.get("itemsGroup").get("children"),n=0;i.each(e,function(e){var r=t[n],a=r[r.length-1].y;i.isArray(a)&&(a=a[1]);var o=e.getBBox().height,s=e.get("x"),l=a-o/2;e.translate(s,l),n++}),this.get("autoLayout")&&this._antiCollision(e)}},n.render=function(){var e=this;t.prototype.render.call(this);this.get("chart").once("afterpaint",function(){e._adjust()})},n._getPreviousY=function(t){return t.attr("matrix")[7]+t.getBBox().height},n._adjustDenote=function(t,e,n){var i=2*-a.legend.legendMargin;t.addShape("path",{attrs:{path:"M-2,"+e+"L"+i+","+(n+3),lineWidth:1,lineDash:[2,2],stroke:"#999999"}})},n._antiCollision=function(t){var e=this;t.sort(function(t,e){return t.attr("matrix")[7]-e.attr("matrix")[7]});var n=!0,i=e.get("chart").get("plotRange"),r=i.tl.y,a=Math.abs(r-i.bl.y),o=t[0].getBBox().height,s=Number.MIN_VALUE,l=0,u=t.map(function(t){var e=t.attr("matrix")[7];return e>l&&(l=e),e<s&&(s=e),{size:t.getBBox().height,targets:[e-r]}});s-=r;for(var c=0;n;){for(var h=0;h<u.length;h++){var f=u[h],p=(Math.min.apply(s,f.targets)+Math.max.apply(s,f.targets))/2;f.pos=Math.min(Math.max(s,p-f.size/2),a-f.size)}for(n=!1,c=u.length;c--;)if(c>0){var g=u[c-1],d=u[c];g.pos+g.size>d.pos&&(g.size+=d.size,g.targets=g.targets.concat(d.targets),u.splice(c,1),n=!0)}}c=0;var v=this.get("itemsGroup").addGroup();u.forEach(function(n){var i=r+o;n.targets.forEach(function(){var r=t[c].attr("matrix")[7],a=n.pos+i-o/2;Math.abs(r-a)>o/2&&e._adjustDenote(v,a,r-e.get("group").attr("matrix")[7]/2),t[c].translate(0,-r),t[c].translate(0,a),i+=o,c++})})},e}(r.Legend.Category);t.exports=o},function(t,e,n){function i(t,e){if(!t)return!1;return!!t.className&&-1!==(a.isNil(t.className.baseVal)?t.className:t.className.baseVal).indexOf(e)}function r(t){var e=[];return a.each(t,function(t){var n=function(t,e){var n=-1;return a.each(t,function(t,i){var r=!0;for(var o in e)if(e.hasOwnProperty(o)&&-1===h.indexOf(o)&&!a.isObject(e[o])&&e[o]!==t[o]){r=!1;break}if(r)return n=i,!1}),n}(e,t);-1===n?e.push(t):e[n]=t}),e}var a=n(0),o=n(18),s=n(21).Tooltip,l=a.MatrixUtil.vec2,u=["line","area","path","areaStack"],c=["line","area"],h=["marker","showMarker"],f=function(){function t(t){a.assign(this,t),this.timeStamp=0}var e=t.prototype;return e._normalizeEvent=function(t){var e=this.chart,n=this._getCanvas(),i=n.getPointByClient(t.clientX,t.clientY),r=n.get("pixelRatio");i.x=i.x/r,i.y=i.y/r;var a=e.getViewsByPoint(i);return i.views=a,i},e._getCanvas=function(){return this.chart.get("canvas")},e._getTriggerEvent=function(){var t,e=this.options.triggerOn;return e&&"mousemove"!==e?"click"===e?t="plotclick":"none"===e&&(t=null):t="plotmove",t},e._getDefaultTooltipCfg=function(){var t=this.chart,e=this.viewTheme,n=this.options,i=a.mix({},e.tooltip),r=t.getAllGeoms().filter(function(t){return t.get("visible")}),o=[];a.each(r,function(t){var e=t.get("type"),n=t.get("adjusts"),i=!1;n&&a.each(n,function(t){if("symmetric"===t.type||"Symmetric"===t.type)return i=!0,!1}),-1!==a.indexOf(o,e)||i||o.push(e)});var s,l=!(!r.length||!r[0].get("coord"))&&r[0].get("coord").isTransposed;if(r.length&&r[0].get("coord")&&"cartesian"===r[0].get("coord").type)if("interval"===o[0]&&!1!==n.shared){var u=a.mix({},e.tooltipCrosshairsRect);u.isTransposed=l,s={zIndex:0,crosshairs:u}}else if(a.indexOf(c,o[0])>-1){var h=a.mix({},e.tooltipCrosshairsLine);h.isTransposed=l,s={crosshairs:h}}return a.mix(i,s,{})},e._bindEvent=function(){var t=this.chart,e=this._getTriggerEvent();e&&(t.on(e,a.wrapBehavior(this,"onMouseMove")),t.on("plotleave",a.wrapBehavior(this,"onMouseOut")))},e._offEvent=function(){var t=this.chart,e=this._getTriggerEvent();e&&(t.off(e,a.getWrapBehavior(this,"onMouseMove")),t.off("plotleave",a.getWrapBehavior(this,"onMouseOut")))},e._setTooltip=function(t,e,n,i){var o=this.tooltip,s=this.prePoint;if(!s||s.x!==t.x||s.y!==t.y){e=r(e),this.prePoint=t;var l=this.chart,u=this.viewTheme,c=a.isArray(t.x)?t.x[t.x.length-1]:t.x,h=a.isArray(t.y)?t.y[t.y.length-1]:t.y;o.get("visible")||l.emit("tooltip:show",{x:c,y:h,tooltip:o});var f=e[0],p=f.title||f.name;o.isContentChange(p,e)&&(l.emit("tooltip:change",{tooltip:o,x:c,y:h,items:e}),p=e[0].title||e[0].name,o.setContent(p,e),a.isEmpty(n)?(o.clearMarkers(),o.set("markerItems",[])):!0===this.options.hideMarkers?o.set("markerItems",n):o.setMarkers(n,u.tooltipMarker));i===this._getCanvas()&&"mini"===o.get("type")?o.hide():(o.setPosition(c,h,i),o.show())}},e.hideTooltip=function(){var t=this.tooltip,e=this.chart,n=this._getCanvas();this.prePoint=null,t.hide(),e.emit("tooltip:hide",{tooltip:t}),n.draw()},e.onMouseMove=function(t){if(!a.isEmpty(t.views)){var e=this.timeStamp,n=+new Date,i={x:t.x,y:t.y};n-e>16&&!this.chart.get("stopTooltip")&&(this.showTooltip(i,t.views,t.shape),this.timeStamp=n)}},e.onMouseOut=function(t){var e=this.tooltip;e.get("visible")&&e.get("follow")&&(t&&t.toElement&&(i(t.toElement,"g2-tooltip")||function(t,e){for(var n=t.parentNode,r=!1;n&&n!==document.body;){if(i(n,e)){r=!0;break}n=n.parentNode}return r}(t.toElement,"g2-tooltip"))||this.hideTooltip())},e.renderTooltip=function(){var t=this;if(!t.tooltip){var e=t.chart,n=t.viewTheme,i=t._getCanvas(),r=t._getDefaultTooltipCfg(),o=t.options;(o=a.deepMix({plotRange:e.get("plotRange"),capture:!1,canvas:i,frontPlot:e.get("frontPlot"),viewTheme:n.tooltip,backPlot:e.get("backPlot")},r,o)).crosshairs&&"rect"===o.crosshairs.type&&(o.zIndex=0),o.visible=!1;var l;"mini"===o.type?(o.crosshairs=!1,o.position="top",l=new s.Mini(o)):l=o.useHtml?new s.Html(o):new s.Canvas(o),t.tooltip=l;var u=t._getTriggerEvent();if(!l.get("enterable")&&"plotmove"===u){var c=l.get("container");c&&(c.onmousemove=function(n){var i=t._normalizeEvent(n);e.emit(u,i)})}t._bindEvent()}},e.showTooltip=function(t,e,n){var i=this;if(!a.isEmpty(e)&&t){this.tooltip||this.renderTooltip();var r=i.options,o=[],s=[];if(a.each(e,function(e){if(!e.get("tooltipEnable"))return!0;var n=e.get("geoms"),l=e.get("coord");a.each(n,function(e){var n=e.get("type");if(e.get("visible")&&!1!==e.get("tooltipCfg")){var c=e.get("dataArray");if(e.isShareTooltip()||!1===r.shared&&a.inArray(["area","line","path","polygon"],n))a.each(c,function(c){var h=e.findPoint(t,c);if(h){var f=e.getTipItems(h,r.title);a.each(f,function(t){var r=t.point;if(r&&r.x&&r.y){var s=a.isArray(r.x)?r.x[r.x.length-1]:r.x,c=a.isArray(r.y)?r.y[r.y.length-1]:r.y;r=l.applyMatrix(s,c,1),t.x=r[0],t.y=r[1],t.showMarker=!0;var h=i._getItemMarker(e,t.color);t.marker=h,-1!==a.indexOf(u,n)&&o.push(t)}}),s=s.concat(f)}});else{var h=e.get("shapeContainer"),f=h.get("canvas").get("pixelRatio"),p=h.getShape(t.x*f,t.y*f);p&&p.get("visible")&&p.get("origin")&&(s=e.getTipItems(p.get("origin"),r.title))}}}),a.each(s,function(t){var e=t.point,n=a.isArray(e.x)?e.x[e.x.length-1]:e.x,i=a.isArray(e.y)?e.y[e.y.length-1]:e.y;e=l.applyMatrix(n,i,1),t.x=e[0],t.y=e[1]})}),s.length){var c=s[0];if(!s.every(function(t){return t.title===c.title})){var h=c,f=1/0;s.forEach(function(e){var n=l.distance([t.x,t.y],[e.x,e.y]);n<f&&(f=n,h=e)}),s=s.filter(function(t){return t.title===h.title}),o=o.filter(function(t){return t.title===h.title})}if(!1===r.shared&&s.length>1){var p=s[0],g=Math.abs(t.y-p.y);a.each(s,function(e){Math.abs(t.y-e.y)<=g&&(p=e,g=Math.abs(t.y-e.y))}),p&&p.x&&p.y&&(o=[p]),s=[p]}i._setTooltip(t,s,o,n)}else i.hideTooltip()}},e.clear=function(){var t=this.tooltip;t&&t.destroy(),this.tooltip=null,this.prePoint=null,this._offEvent()},e._getItemMarker=function(t,e){var n=t.get("shapeType")||"point",i=t.getDefaultValue("shape")||"circle",r={color:e};return o.getShapeFactory(n).getMarkerCfg(i,r)},t}();t.exports=f},function(t,e,n){function i(t,e){if(a.isNil(t)||a.isNil(e))return!1;var n=t.get("origin"),i=e.get("origin");return a.isNil(n)&&a.isNil(i)?a.isEqual(t,e):a.isEqual(n,i)}function r(t){t.shape&&t.shape.get("origin")&&(t.data=t.shape.get("origin"))}var a=n(0),o=function(){function t(t){this.view=null,this.canvas=null,a.assign(this,t),this._init()}var e=t.prototype;return e._init=function(){this.pixelRatio=this.canvas.get("pixelRatio")},e._getShapeEventObj=function(t){return{x:t.x/this.pixelRatio,y:t.y/this.pixelRatio,target:t.target,toElement:t.event.toElement||t.event.relatedTarget}},e._getShape=function(t,e){return this.view.get("canvas").getShape(t,e)},e._getPointInfo=function(t){var e=this.view,n={x:t.x/this.pixelRatio,y:t.y/this.pixelRatio},i=e.getViewsByPoint(n);return n.views=i,n},e._getEventObj=function(t,e,n){return{x:e.x,y:e.y,target:t.target,toElement:t.event.toElement||t.event.relatedTarget,views:n}},e.bindEvents=function(){var t=this.canvas;t.on("mousedown",a.wrapBehavior(this,"onDown")),t.on("mousemove",a.wrapBehavior(this,"onMove")),t.on("mouseleave",a.wrapBehavior(this,"onOut")),t.on("mouseup",a.wrapBehavior(this,"onUp")),t.on("click",a.wrapBehavior(this,"onClick")),t.on("dblclick",a.wrapBehavior(this,"onClick")),t.on("touchstart",a.wrapBehavior(this,"onTouchstart")),t.on("touchmove",a.wrapBehavior(this,"onTouchmove")),t.on("touchend",a.wrapBehavior(this,"onTouchend"))},e._triggerShapeEvent=function(t,e,n){if(t&&t.name&&!t.get("destroyed")){var i=this.view;if(i.isShapeInView(t)){var r=t.name+":"+e;n.view=i,n.appendInfo=t.get("appendInfo"),i.emit(r,n);var a=i.get("parent");a&&a.emit(r,n)}}},e.onDown=function(t){var e=this.view,n=this._getShapeEventObj(t);n.shape=this.currentShape,r(n),e.emit("mousedown",n),this._triggerShapeEvent(this.currentShape,"mousedown",n)},e.onMove=function(t){var e=this.view,n=this.currentShape;n&&n.get("destroyed")&&(n=null,this.currentShape=null);var a=this._getShape(t.x,t.y)||t.currentTarget,o=this._getShapeEventObj(t);if(o.shape=a,r(o),e.emit("mousemove",o),this._triggerShapeEvent(a,"mousemove",o),n&&!i(n,a)){var s=this._getShapeEventObj(t);s.shape=n,s.toShape=a,r(s),this._triggerShapeEvent(n,"mouseleave",s)}if(a&&!i(n,a)){var l=this._getShapeEventObj(t);l.shape=a,l.fromShape=n,r(l),this._triggerShapeEvent(a,"mouseenter",l)}this.currentShape=a;var u=this._getPointInfo(t),c=this.curViews||[];0===c.length&&u.views.length&&e.emit("plotenter",this._getEventObj(t,u,u.views)),c.length&&0===u.views.length&&e.emit("plotleave",this._getEventObj(t,u,c)),u.views.length&&((o=this._getEventObj(t,u,u.views)).shape=a,r(o),e.emit("plotmove",o)),this.curViews=u.views},e.onOut=function(t){var e=this.view,n=this._getPointInfo(t),i=this.curViews||[],r=this._getEventObj(t,n,i);!this.curViews||0===this.curViews.length||r.toElement&&"CANVAS"===r.toElement.tagName||(e.emit("plotleave",r),this.curViews=[])},e.onUp=function(t){var e=this.view,n=this._getShapeEventObj(t);n.shape=this.currentShape,e.emit("mouseup",n),this._triggerShapeEvent(this.currentShape,"mouseup",n)},e.onClick=function(t){var e=this.view,n=this._getShape(t.x,t.y)||t.currentTarget,i=this._getShapeEventObj(t);i.shape=n,r(i),e.emit("click",i),this._triggerShapeEvent(n,t.type,i),this.currentShape=n;var o=this._getPointInfo(t),s=o.views;if(!a.isEmpty(s)){var l=this._getEventObj(t,o,s);if(this.currentShape){var u=this.currentShape;l.shape=u,r(l)}e.emit("plotclick",l),"dblclick"===t.type&&(e.emit("plotdblclick",l),e.emit("dblclick",i))}},e.onTouchstart=function(t){var e=this.view,n=this._getShape(t.x,t.y)||t.currentTarget,i=this._getShapeEventObj(t);i.shape=n,r(i),e.emit("touchstart",i),this._triggerShapeEvent(n,"touchstart",i),this.currentShape=n},e.onTouchmove=function(t){var e=this.view,n=this._getShape(t.x,t.y)||t.currentTarget,i=this._getShapeEventObj(t);i.shape=n,r(i),e.emit("touchmove",i),this._triggerShapeEvent(n,"touchmove",i),this.currentShape=n},e.onTouchend=function(t){var e=this.view,n=this._getShapeEventObj(t);n.shape=this.currentShape,r(n),e.emit("touchend",n),this._triggerShapeEvent(this.currentShape,"touchend",n)},e.clearEvents=function(){var t=this.canvas;t.off("mousemove",a.getWrapBehavior(this,"onMove")),t.off("mouseleave",a.getWrapBehavior(this,"onOut")),t.off("mousedown",a.getWrapBehavior(this,"onDown")),t.off("mouseup",a.getWrapBehavior(this,"onUp")),t.off("click",a.getWrapBehavior(this,"onClick")),t.off("dblclick",a.getWrapBehavior(this,"onClick")),t.off("touchstart",a.getWrapBehavior(this,"onTouchstart")),t.off("touchmove",a.getWrapBehavior(this,"onTouchmove")),t.off("touchend",a.getWrapBehavior(this,"onTouchend"))},t}();t.exports=o},function(t,e,n){function i(t,e){var n=[];if(!1===t.get("animate"))return[];var r=t.get("children");return s.each(r,function(t){if(t.isGroup)n=n.concat(i(t,e));else if(t.isShape&&t._id){var r=t._id;(r=r.split("-")[0])===e&&n.push(t)}}),n}function r(t,e,n,i){return i?l.Action[n][i]:l.getAnimation(t,e,n)}function a(t,e,n){var i=l.getAnimateCfg(t,e);return n&&n[e]?s.deepMix({},i,n[e]):i}function o(t,e,n,i){var o,l,c=!1;if(i){var h=[],f=[];s.each(e,function(e){var n=t[e._id];n?(e.setSilent("cacheShape",n),h.push(e),delete t[e._id]):f.push(e)}),s.each(t,function(t){var e=t.name,i=t.coord,h=t._id,f=t.attrs,p=t.index,g=t.type;if(l=a(e,"leave",t.animateCfg),o=r(e,i,"leave",l.animation),s.isFunction(o)){var d=n.addShape(g,{attrs:f,index:p});if(d._id=h,d.name=e,i&&"label"!==e){var v=d.getMatrix(),y=u.multiply([],v,i.matrix);d.setMatrix(y)}c=!0,o(d,l,i)}}),s.each(h,function(t){var e=t.name,n=t.get("coord"),i=t.get("cacheShape").attrs;if(!s.isEqual(i,t.attr())){if(l=a(e,"update",t.get("animateCfg")),o=r(e,n,"update",l.animation),s.isFunction(o))o(t,l,n);else{var u=s.cloneDeep(t.attr());t.attr(i),t.animate(u,l.duration,l.easing,function(){t.setSilent("cacheShape",null)})}c=!0}}),s.each(f,function(t){var e=t.name,n=t.get("coord");l=a(e,"enter",t.get("animateCfg")),o=r(e,n,"enter",l.animation),s.isFunction(o)&&(o(t,l,n),c=!0)})}else s.each(e,function(t){var e=t.name,n=t.get("coord");l=a(e,"appear",t.get("animateCfg")),o=r(e,n,"appear",l.animation),s.isFunction(o)&&(o(t,l,n),c=!0)});return c}var s=n(0),l=n(126),u=s.MatrixUtil.mat3;t.exports={execAnimation:function(t,e){var n=t.get("middlePlot"),r=t.get("backPlot"),a=t.get("_id"),l=t.get("canvas"),u=l.get(a+"caches")||[];0===u.length&&(e=!1);var c=i(n,a),h=i(r,a),f=c.concat(h);l.setSilent(a+"caches",function(t){var e={};return s.each(t,function(t){if(t._id&&!t.isClip){var n=t._id;e[n]={_id:n,type:t.get("type"),attrs:s.cloneDeep(t.attr()),name:t.name,index:t.get("index"),animateCfg:t.get("animateCfg"),coord:t.get("coord")}}}),e}(f));(e?o(u,f,l,e):o(u,c,l,e))||l.draw()}}},function(t,e,n){var i=n(0),r=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){return{type:"plotBack",padding:null,background:null,plotRange:null,plotBackground:null}},n._beforeRenderUI=function(){this._calculateRange()},n._renderUI=function(){this._renderBackground(),this._renderPlotBackground()},n._renderBackground=function(){var t=this.get("background");if(t){var e=this.get("canvas"),n={x:0,y:0,width:this.get("width")||e.get("width"),height:this.get("height")||e.get("height")},r=this.get("backgroundShape");r?r.attr(n):(r=this.addShape("rect",{attrs:i.mix(n,t)}),this.set("backgroundShape",r))}},n._renderPlotBackground=function(){var t=this.get("plotBackground");if(t){var e=this.get("plotRange"),n=e.br.x-e.bl.x,r=e.br.y-e.tr.y,a=e.tl,o={x:a.x,y:a.y,width:n,height:r},s=this.get("plotBackShape");s?s.attr(o):(t.image?(o.img=t.image,s=this.addShape("image",{attrs:o})):(i.mix(o,t),s=this.addShape("rect",{attrs:o})),this.set("plotBackShape",s))}},n._convert=function(t,e){if(i.isString(t))if("auto"===t)t=0;else if(-1!==t.indexOf("%")){var n=this.get("canvas"),r=this.get("width")||n.get("width"),a=this.get("height")||n.get("height");t=parseInt(t,10)/100,t=e?t*r:t*a}return t},n._calculateRange=function(){var t=this.get("plotRange");i.isNil(t)&&(t={});var e=this.get("padding"),n=this.get("canvas"),r=this.get("width")||n.get("width"),a=this.get("height")||n.get("height"),o=i.toAllPadding(e),s=this._convert(o[0],!1),l=this._convert(o[1],!0),u=this._convert(o[2],!1),c=this._convert(o[3],!0),h=Math.min(c,r-l),f=Math.max(c,r-l),p=Math.min(a-u,s),g=Math.max(a-u,s);t.tl={x:h,y:p},t.tr={x:f,y:p},t.bl={x:h,y:g},t.br={x:f,y:g},t.cc={x:(f+h)/2,y:(g+p)/2},this.set("plotRange",t)},n.repaint=function(){return this._calculateRange(),this._renderBackground(),this._renderPlotBackground(),this},e}(n(16).Group);t.exports=r},function(t,e,n){var i=n(7),r=n(0),a={getDefaultSize:function(){var t=this.get("defaultSize"),e=this.get("viewTheme")||i;if(!t){var n,a=this.get("coord"),o=this.getXScale(),s=o.values,l=this.get("dataArray");if(o.isLinear&&s.length>1){s.sort();var u=function(t,e){var n=t.length;r.isString(t[0])&&(t=t.map(function(t){return e.translate(t)}));for(var i=t[1]-t[0],a=2;a<n;a++){var o=t[a]-t[a-1];i>o&&(i=o)}return i}(s,o);n=(o.max-o.min)/u,s.length>n&&(n=s.length)}else n=s.length;var c=o.range,h=1/n,f=1;if(this.isInCircle()?f=a.isTransposed&&n>1?e.widthRatio.multiplePie:e.widthRatio.rose:(o.isLinear&&(h*=c[1]-c[0]),f=e.widthRatio.column),h*=f,this.hasAdjust("dodge")){h/=this._getDodgeCount(l)}t=h,this.set("defaultSize",t)}return t},_getDodgeCount:function(t){var e,n=this.get("adjusts"),i=t.length;if(r.each(n,function(t){"dodge"===t.type&&(e=t.dodgeBy)}),e){var a=r.Array.merge(t);i=r.Array.values(a,e).length}return i},getDimWidth:function(t){var e=this.get("coord"),n=e.convertPoint({x:0,y:0}),i=e.convertPoint({x:"x"===t?1:0,y:"x"===t?0:1}),r=0;return n&&i&&(r=Math.sqrt(Math.pow(i.x-n.x,2)+Math.pow(i.y-n.y,2))),r},_getWidth:function(){var t=this.get("coord");return this.isInCircle()&&!t.isTransposed?(t.endAngle-t.startAngle)*t.radius:this.getDimWidth("x")},_toNormalizedSize:function(t){return t/this._getWidth()},_toCoordSize:function(t){return this._getWidth()*t},getNormalizedSize:function(t){var e=this.getAttrValue("size",t);return e=r.isNil(e)?this.getDefaultSize():this._toNormalizedSize(e)},getSize:function(t){var e=this.getAttrValue("size",t);if(r.isNil(e)){var n=this.getDefaultSize();e=this._toCoordSize(n)}return e}};t.exports=a},function(t,e,n){var i=n(0),r=n(7);t.exports={splitData:function(t){var e=this.get("viewTheme")||r;if(!t.length)return[];var n,a=[],o=[],s=this.getYScale().field;return i.each(t,function(t){n=t._origin?t._origin[s]:t[s],e.connectNulls?i.isNil(n)||o.push(t):i.isArray(n)&&i.isNil(n[0])||i.isNil(n)?o.length&&(a.push(o),o=[]):o.push(t)}),o.length&&a.push(o),a}}},function(t,e,n){function i(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}var r=n(20),a=n(358),o=n(0),s=function(t){function e(e){var n;return n=t.call(this,e)||this,o.assign(i(i(n)),a),n}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.type="path",e.shapeType="line",e},n.getDrawCfg=function(e){var n=t.prototype.getDrawCfg.call(this,e);return n.isStack=this.hasStack(),n},n.draw=function(t,e,n,i){var r=this,a=this.splitData(t),s=this.getDrawCfg(t[0]);r._applyViewThemeShapeStyle(s,s.shape,n),s.origin=t,o.each(a,function(t,a){if(!o.isEmpty(t)){s.splitedIndex=a,s.points=t;var l=n.drawShape(s.shape,s,e);r.appendShapeInfo(l,i+a)}})},e}(r);r.Path=s,t.exports=s},function(t,e,n){"use strict";var i=n(370),r=n(371);e.a=function(t){var e=Object(i.a)(t);return(e.local?function(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}:function(t){return function(){var e=this.ownerDocument,n=this.namespaceURI;return n===r.b&&e.documentElement.namespaceURI===r.b?e.createElement(t):e.createElementNS(n,t)}})(e)}},function(t,e,n){"use strict";e.a=function(t,e){var n=t.ownerSVGElement||t;if(n.createSVGPoint){var i=n.createSVGPoint();return i.x=e.clientX,i.y=e.clientY,i=i.matrixTransform(t.getScreenCTM().inverse()),[i.x,i.y]}var r=t.getBoundingClientRect();return[e.clientX-r.left-t.clientLeft,e.clientY-r.top-t.clientTop]}},function(t,e,n){"use strict";e.b=function(t,e,n){var r=t._id;return t.each(function(){var t=Object(i.h)(this,r);(t.value||(t.value={}))[e]=n.apply(this,arguments)}),function(t){return Object(i.f)(t,r).value[e]}};var i=n(70);e.a=function(t,e){var n=this._id;if(t+="",arguments.length<2){for(var r,a=Object(i.f)(this.node(),n).tween,o=0,s=a.length;o<s;++o)if((r=a[o]).name===t)return r.value;return null}return this.each((null==e?function(t,e){var n,r;return function(){var a=Object(i.h)(this,t),o=a.tween;if(o!==n)for(var s=0,l=(r=n=o).length;s<l;++s)if(r[s].name===e){(r=r.slice()).splice(s,1);break}a.tween=r}}:function(t,e,n){var r,a;if("function"!=typeof n)throw new Error;return function(){var o=Object(i.h)(this,t),s=o.tween;if(s!==r){a=(r=s).slice();for(var l={name:e,value:n},u=0,c=a.length;u<c;++u)if(a[u].name===e){a[u]=l;break}u===c&&a.push(l)}o.tween=a}})(n,t,e))}},function(t,e,n){var i=n(7),r=n(0),a=r.assign,o=r.isNil,s=r.isArray,l=r.cloneDeep,u=r.wrapBehavior,c=r.getWrapBehavior,h=function(){function t(t){var e=this.getDefaultCfg();a(this,e,t),this.init()}var e=t.prototype;return e.getDefaultCfg=function(){return{chart:null,group:null,showTitle:!0,autoSetAxis:!0,padding:10,eachView:null,fields:[],colTitle:{offsetY:-15,style:{fontSize:14,textAlign:"center",fill:"#666",fontFamily:i.fontFamily}},rowTitle:{offsetX:15,style:{fontSize:14,textAlign:"center",rotate:90,fill:"#666",fontFamily:i.fontFamily}}}},e.init=function(){if(!this.chart)throw new Error("Facets Error: please specify the chart!");this._bindEvent(),this.initContainer(),this.chart.get("data")&&this.initViews()},e.initContainer=function(){var t=this.chart.get("frontPlot").addGroup();this.group=t},e.initViews=function(){for(var t=this.chart,e=t.get("data"),n=this.eachView,i=this.generateFacets(e),r=0;r<i.length;r++){var a=i[r],o=a.region,s=t.view({start:o.start,end:o.end,padding:this.padding});s.source(a.data),this.beforeProcessView(s,a),n&&n(s,a),this.afterProcessView(s,a),a.view=s}this.facets=i},e.beforeProcessView=function(){},e.afterProcessView=function(t,e){this.autoSetAxis&&this.processAxis(t,e)},e.processAxis=function(t,e){var n=t.get("options"),i=t.get("geoms");if((!n.coord.type||"rect"===n.coord.type)&&i.length){var r=i[0].get("attrOptions").position.field,a=s(r)?r:r.split("*").map(function(t){return t.trim()}),l=a[0],u=a[1];o(n.axes)&&(n.axes={});var c=n.axes;!1!==c&&(l&&!1!==c[l]&&(c[l]=c[l]||{},this.setXAxis(l,c,e)),u&&!1!==c[u]&&(c[u]=c[u]||{},this.setYAxis(u,c,e)))}},e.setXAxis=function(){},e.setYAxis=function(){},e.renderTitle=function(t,e){this.drawColTitle(t,e)},e.getScaleText=function(t,e,n){var i;if(t){var r=n.get("scales")[t];r||(r=n.createScale(t)),i=r.getText(e)}else i=e;return i},e.drawColTitle=function(t,e){var n=this.getScaleText(e.colField,e.colValue,t),i=a({position:["50%","0%"],content:n},this.colTitle);t.guide().text(i)},e.drawRowTitle=function(t,e){var n=this.getScaleText(e.rowField,e.rowValue,t),i=a({position:["100%","50%"],content:n},l(this.rowTitle));t.guide().text(i)},e.getFilter=function(t){return function(e){var n=!0;return t.forEach(function(t){var i=t.field,r=t.value,a=!0;!o(r)&&i&&(a=e[i]===r),n=n&&a}),n}},e.getFieldValues=function(t,e){for(var n=[],i={},r=0;r<e.length;r++){var a=e[r][t];o(a)||i[a]||(n.push(a),i[a]=!0)}return n},e.getRegion=function(t,e,n,i){var r=1/e,a=1/t,o={x:r*n,y:a*i};return{start:o,end:{x:o.x+r,y:o.y+a}}},e.generateFacets=function(){return[]},e._bindEvent=function(){var t=this.chart;t.on("afterchangedata",u(this,"onDataChange")),t.on("beforeclear",u(this,"onClear")),t.on("beforedestroy",u(this,"destroy")),t.on("beforepaint",u(this,"onPaint")),t.on("setdata",u(this,"onDataChange"))},e._clearEvent=function(){var t=this.chart;t&&(t.off("afterchangedata",c(this,"onDataChange")),t.off("beforeclear",c(this,"onClear")),t.off("beforedestroy",c(this,"destroy")),t.off("beforepaint",c(this,"onPaint")),t.off("setdata",c(this,"onDataChange")))},e._clearFacets=function(){var t=this.facets,e=this.chart;if(t)for(var n=0;n<t.length;n++){var i=t[n];e.removeView(i.view)}this.facets=null},e.onClear=function(){this.onRemove()},e.onPaint=function(){if(this.showTitle)for(var t=this.facets,e=0;e<t.length;e++){var n=t[e],i=n.view;this.renderTitle(i,n)}},e.onDataChange=function(){this._clearFacets(),this.initViews()},e.onRemove=function(){this._clearFacets(),this._clearEvent(),this.group&&this.group.remove(),this.chart=null,this.facets=null,this.group=null},e.destroy=function(){this.onRemove(),this.destroyed=!0},t}();t.exports=h},function(t,e,n){function i(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}function r(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}var a=n(20),o=n(0),s=n(357);n(365);var l=function(t){function e(e){var n;return n=t.call(this,e)||this,o.assign(r(r(n)),s),n}i(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.type="interval",e.shapeType="interval",e.generatePoints=!0,e},n.createShapePointsCfg=function(e){var n=t.prototype.createShapePointsCfg.call(this,e);return n.size=this.getNormalizedSize(e),n},n.clearInner=function(){t.prototype.clearInner.call(this),this.set("defaultSize",null)},e}(a),u=function(t){function e(){return t.apply(this,arguments)||this}i(e,t);return e.prototype.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.hasDefaultAdjust=!0,e.adjusts=[{type:"stack"}],e},e}(l),c=function(t){function e(){return t.apply(this,arguments)||this}i(e,t);return e.prototype.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.hasDefaultAdjust=!0,e.adjusts=[{type:"dodge"}],e},e}(l),h=function(t){function e(){return t.apply(this,arguments)||this}i(e,t);return e.prototype.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.hasDefaultAdjust=!0,e.adjusts=[{type:"symmetric"}],e},e}(l);l.Stack=u,l.Dodge=c,l.Symmetric=h,a.Interval=l,a.IntervalStack=u,a.IntervalDodge=c,a.IntervalSymmetric=h,t.exports=l},function(t,e,n){function i(t,e){var n=t.x,i=t.y,r=t.y0,a=t.size,o=r,s=i;f.isArray(i)&&(s=i[1],o=i[0]);var l,u;f.isArray(n)?(l=n[0],u=n[1]):(l=n-a/2,u=n+a/2);var c=[];return c.push({x:l,y:o},{x:l,y:s}),e?c.push({x:u,y:(s+o)/2}):c.push({x:u,y:s},{x:u,y:o}),c}function r(t){for(var e=[],n=0;n<t.length;n++){var i=t[n];if(i){var r=0===n?"M":"L";e.push([r,i.x,i.y])}}var a=t[0];return e.push(["L",a.x,a.y]),e.push(["z"]),e}function a(t){var e=v.shape.interval,n=f.mix({},e,t.style);return d.addFillAttrs(n,t),t.color&&(n.stroke=n.stroke||t.color),n}function o(t){var e=v.shape.hollowInterval,n=f.mix({},e,t.style);return d.addStrokeAttrs(n,t),n}function s(t,e){var n=[],i=t.points,r=t.nextPoints;return f.isNil(r)?e?n.push(["M",i[0].x,i[0].y],["L",i[1].x,i[1].y],["L",i[2].x,i[2].y],["L",i[3].x,i[3].y],["Z"]):n.push(["M",i[0].x,i[0].y],["L",i[1].x,i[1].y],["L",i[2].x,i[2].y],["L",i[2].x,i[2].y],["Z"]):n.push(["M",i[0].x,i[0].y],["L",i[1].x,i[1].y],["L",r[1].x,r[1].y],["L",r[0].x,r[0].y],["Z"]),n}function l(t,e){var n,i=e.geom.get("coord"),r=e.point;if(i&&"theta"===i.type){var a=function(t,e){var n,i,r,a,o=e.getRadius(),s=o*e.innerRadius;return!f.isArray(t.x)&&f.isArray(t.y)&&(t.x=[t.x,t.x]),f.isArray(t.x)?(r={x:t.x[0],y:t.y[0]},a={x:t.x[1],y:t.y[1]},n=g.getPointAngle(e,r),(i=g.getPointAngle(e,a))<=n&&(i+=2*Math.PI)):(a=t,n=e.startAngle,i=g.getPointAngle(e,a)),{r:o,ir:s,startAngle:n,endAngle:i}}(r,i),o=(a.endAngle-a.startAngle)/2+a.startAngle;n={transform:[["t",7.5*Math.cos(o),7.5*Math.sin(o)]]}}return f.mix({},n)}function u(t,e,n,i){return 0===e?[[t+.5*n/Math.PI/2,i/2],[t+.5*n/Math.PI,i],[t+n/4,i]]:1===e?[[t+.5*n/Math.PI/2*(Math.PI-2),i],[t+.5*n/Math.PI/2*(Math.PI-1),i/2],[t+n/4,0]]:2===e?[[t+.5*n/Math.PI/2,-i/2],[t+.5*n/Math.PI,-i],[t+n/4,-i]]:[[t+.5*n/Math.PI/2*(Math.PI-2),-i],[t+.5*n/Math.PI/2*(Math.PI-1),-i/2],[t+n/4,0]]}function c(t,e,n,i,r,a,o){for(var s=2*Math.ceil(2*t/n*4),l=[];i<2*-Math.PI;)i+=2*Math.PI;for(;i>0;)i-=2*Math.PI;var c=a-t+(i=i/Math.PI/2*n)-2*t;l.push(["M",c,e]);for(var h=0,f=0;f<s;++f){var p=u(f*n/4,f%4,n,r);l.push(["C",p[0][0]+c,-p[0][1]+e,p[1][0]+c,-p[1][1]+e,p[2][0]+c,-p[2][1]+e]),f===s-1&&(h=p[2][0])}return l.push(["L",h+c,o+t]),l.push(["L",c,o+t]),l.push(["L",c,e]),l}function h(t,e,n,i,r,a,o,s){for(var l=o.getBBox(),u=l.maxX-l.minX,h=l.maxY-l.minY,f=0;f<i;f++){var p=a.addShape("path",{attrs:{path:c(s,l.minY+h*n,u/4,0,u/64,t,e),fill:r[f],clip:o}});"canvas"===v.renderer&&p.animate({transform:[["t",u/2,0]],repeat:!0},5e3-300*f)}}var f=n(0),p=n(18),g=n(22),d=n(45),v=n(7),y=n(16),x=f.PathUtil,m=p.registerFactory("interval",{defaultShapeType:"rect",getActiveCfg:function(t,e){if(!t||f.inArray(["rect","funnel","pyramid"],t)){return{fillOpacity:(e.fillOpacity||e.opacity||1)-.15}}return{lineWidth:(e.lineWidth||0)+1}},getDefaultPoints:function(t){return i(t)},getSelectedCfg:function(t,e){return l(0,e)}});p.registerShape("interval","rect",{draw:function(t,e){var n=a(t),i=r(t.points);return i=this.parsePath(i),e.addShape("path",{attrs:f.mix(n,{path:i})})},getMarkerCfg:function(t){var e=a(t),n=t.isInCircle;return f.mix({symbol:n?"circle":"square",radius:n?4.5:4},e)}}),p.registerShape("interval","hollowRect",{draw:function(t,e){var n=o(t),i=r(t.points);return i=this.parsePath(i),e.addShape("path",{attrs:f.mix(n,{path:i})})},getMarkerCfg:function(t){var e=o(t),n=t.isInCircle;return f.mix({symbol:n?"circle":"square",radius:n?4.5:4},e)}}),p.registerShape("interval","line",{getPoints:function(t){return function(t){var e=t.x,n=t.y,i=t.y0,r=[];return f.isArray(n)?f.each(n,function(t,n){r.push({x:f.isArray(e)?e[n]:e,y:t})}):r.push({x:e,y:n},{x:e,y:i}),r}(t)},draw:function(t,e){var n=o(t);n.lineWidth=t.size||1;var i=r(t.points);return i=this.parsePath(i),e.addShape("path",{attrs:f.mix(n,{path:i})})},getMarkerCfg:function(t){var e=o(t);return f.mix({symbol:"line",radius:5},e)}}),p.registerShape("interval","tick",{getPoints:function(t){return function(t){var e=t.x,n=f.isArray(t.y)?t.y[1]:t.y,i=f.isArray(t.y)?t.y[0]:t.y0,r=t.size,a=[];return a.push({x:e-r/2,y:n},{x:e+r/2,y:n},{x:e,y:n},{x:e,y:i},{x:e-r/2,y:i},{x:e+r/2,y:i}),a}(t)},draw:function(t,e){var n=o(t);n.lineWidth||(n.lineWidth=2);var i=function(t){var e=[];return e.push(["M",t[0].x,t[0].y],["L",t[1].x,t[1].y],["M",t[2].x,t[2].y],["L",t[3].x,t[3].y],["M",t[4].x,t[4].y],["L",t[5].x,t[5].y]),e}(t.points);return i=this.parsePath(i),e.addShape("path",{attrs:f.mix(n,{path:i})})},getMarkerCfg:function(t){var e=o(t);return f.mix({symbol:"tick",radius:5},e)}}),p.registerShape("interval","funnel",{getPoints:function(t){return t.size=2*t.size,i(t)},draw:function(t,e){var n=a(t),i=s(t,!0);return i=this.parsePath(i),e.addShape("path",{attrs:f.mix(n,{path:i})})},getMarkerCfg:function(t){var e=a(t);return f.mix({symbol:"square",radius:4},e)}}),p.registerShape("interval","pyramid",{getPoints:function(t){return t.size=2*t.size,i(t,!0)},draw:function(t,e){var n=a(t),i=s(t,!1);return i=this.parsePath(i),e.addShape("path",{attrs:f.mix(n,{path:i})})},getMarkerCfg:function(t){var e=a(t);return f.mix({symbol:"square",radius:4},e)}}),p.registerShape("interval","liquid-fill-gauge",{draw:function(t,e){var n=0,i=1/0;f.each(t.points,function(t){t.x<i&&(i=t.x),n+=t.x});var r=n/t.points.length,s=this.parsePoint({x:r,y:.5}),l=this.parsePoint({x:i,y:.5}),u=s.x-l.x,c=Math.min(u,l.y),p=a(t),g=new y.Circle({attrs:{x:s.x,y:s.y,r:c}});return h(s.x,s.y,t.y/(2*s.y),1,[p.fill],e,g,4*c),e.addShape("circle",{attrs:f.mix(o(t),{x:s.x,y:s.y,r:c+c/8})})}});var _={};p.registerShape("interval","liquid-fill-path",{draw:function(t,e){var n=f.mix({},a(t)),i=t.shape[1],r=0,s=1/0;f.each(t.points,function(t){t.x<s&&(s=t.x),r+=t.x});var l,u=r/t.points.length,c=this.parsePoint({x:u,y:.5}),p=this.parsePoint({x:s,y:.5}),g=c.x-p.x,d=Math.min(g,p.y);if(_[i])l=_[i];else{var v=x.parsePathString(i);_[i]=l={segments:v}}var y=[];n.rotate&&(y.push(["r",n.rotate/180*Math.PI]),delete n.rotate);var m=e.addShape("path",{attrs:f.mix(n,{fillOpacity:0,path:l.segments})}),b=f.cloneDeep(m.getBBox()),w=b.maxX-b.minX,S=b.maxY-b.minY,M=2*d/Math.max(w,S);m.transform(y.concat([["s",M,M]]));var C=M*w/2,A=M*S/2;m.transform([["t",c.x-C,c.y-A]]),h(c.x,c.y,t.y/(2*c.y),1,[n.fill],e,m,4*p.y);var k=e.addShape("path",{attrs:f.mix(o(t),{path:l.segments})});return k.transform(y.concat([["s",M,M],["t",c.x-C,c.y-A]])),k}}),p.registerShape("interval","top-line",{draw:function(t,e){var n=a(t),i=t.style||{},o=[["M",t.points[1].x,t.points[1].y],["L",t.points[2].x,t.points[2].y]],s={stroke:i.stroke||"white",lineWidth:i.lineWidth||1,path:this.parsePath(o)},l=r(t.points);l=this.parsePath(l),delete n.stroke;var u=e.addShape("path",{attrs:f.mix(n,{zIndex:0,path:l})});return e.addShape("path",{zIndex:1,attrs:s}),u},getMarkerCfg:function(t){var e=a(t),n=t.isInCircle;return f.mix({symbol:n?"circle":"square",radius:n?4.5:4},e)}}),t.exports=m},function(t,e,n){function i(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}var r=n(20),a=n(359);n(367);var o=function(t){function e(){return t.apply(this,arguments)||this}i(e,t);return e.prototype.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.type="line",e.sortable=!0,e},e}(a),s=function(t){function e(){return t.apply(this,arguments)||this}i(e,t);return e.prototype.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.hasDefaultAdjust=!0,e.adjusts=[{type:"stack"}],e},e}(o);o.Stack=s,r.Line=o,r.LineStack=s,t.exports=o},function(t,e,n){function i(t){var e=g.shape.line,n=c.mix({},e,t.style);return f.addStrokeAttrs(n,t),t.size&&(n.lineWidth=t.size),n}function r(t){var e=g.shape.line,n=c.mix({lineWidth:2,radius:6},e,t.style);return f.addStrokeAttrs(n,t),n}function a(t,e,n,i){var r;if(e){var a=i.constraint;n&&t.length&&t.push({x:t[0].x,y:t[0].y}),r=h.getSplinePath(t,!1,a)}else r=h.getLinePath(t,!1),n&&r.push(["Z"]);return r}function o(t,e){var n=t.points,i=t.isInCircle,r=n[0];return c.isArray(r.y)?function(t,e,n,i){for(var r=[],o=i.isStack,s=[],l=0;l<t.length;l++){var u=t[l],c=f.splitPoints(u);s.push(c[0]),r.push(c[1])}var h=a(r,e,n,i),p=a(s,e,n,i);return o?h:h.concat(p)}(n,e,i,t):a(n,e,i,t)}function s(t,e){return function(t){var e=[];return c.each(t,function(t,n){var i=0===n?["M",t.x,t.y]:["L",t.x,t.y];e.push(i)}),e}(function(t,e){var n=[];return c.each(t,function(i,r){var a=t[r+1];n.push(i),a&&(n=n.concat(e(i,a)))}),n}(t.points,e))}function l(t,e){return c.mix({symbol:e?function(t,e,n){return[["M",t-n,e],["A",n/2,n/2,0,1,1,t,e],["A",n/2,n/2,0,1,0,t+n,e]]}:function(t,e,n){return[["M",t-n,e],["L",t+n,e]]}},r(t))}function u(t,e){return c.mix({symbol:e},r(t))}var c=n(0),h=n(22),f=n(45),p=n(18),g=n(7),d=[1,1],v=[5.5,1],y=p.registerFactory("line",{defaultShapeType:"line",getActiveCfg:function(t,e){return{lineWidth:(e.lineWidth||0)+1}},getDefaultPoints:function(t){return f.splitPoints(t)},drawShape:function(t,e,n){var i,r=this.getShape(t);return(i=1===e.points.length&&g.showSinglePoint?function(t,e,n){var i=e.points[0];return n.addShape("circle",{attrs:c.mix({x:i.x,y:i.y,r:2,fill:e.color},e.style)})}(0,e,n):r.draw(e,n))&&(i.set("origin",e.origin),i._id=e.splitedIndex?e._id+e.splitedIndex:e._id,i.name=this.name),i}});p.registerShape("line","line",{draw:function(t,e){var n=i(t),r=o(t,!1);return e.addShape("path",{attrs:c.mix(n,{path:r})})},getMarkerCfg:function(t){return l(t)}}),p.registerShape("line","dot",{draw:function(t,e){var n=i(t),r=o(t,!1);return e.addShape("path",{attrs:c.mix(n,{path:r,lineDash:d})})},getMarkerCfg:function(t){var e=l(t,!1);return e.lineDash=d,e}}),p.registerShape("line","dash",{draw:function(t,e){var n=i(t),r=o(t,!1);return e.addShape("path",{attrs:c.mix({path:r,lineDash:v},n)})},getMarkerCfg:function(t){var e=l(t,!1);return e.lineDash=e.lineDash||v,e}}),p.registerShape("line","smooth",{draw:function(t,e){var n=i(t),r=this._coord;t.constraint=[[r.start.x,r.end.y],[r.end.x,r.start.y]];var a=o(t,!0);return e.addShape("path",{attrs:c.mix(n,{path:a})})},getMarkerCfg:function(t){return l(t,!0)}}),p.registerShape("line","hv",{draw:function(t,e){var n=i(t),r=s(t,function(t,e){var n=[];return n.push({x:e.x,y:t.y}),n});return e.addShape("path",{attrs:c.mix(n,{path:r})})},getMarkerCfg:function(t){return u(t,function(t,e,n){return[["M",t-n-1,e-2.5],["L",t,e-2.5],["L",t,e+2.5],["L",t+n+1,e+2.5]]})}}),p.registerShape("line","vh",{draw:function(t,e){var n=i(t),r=s(t,function(t,e){var n=[];return n.push({x:t.x,y:e.y}),n});return e.addShape("path",{attrs:c.mix(n,{path:r})})},getMarkerCfg:function(t){return u(t,function(t,e,n){return[["M",t-n-1,e+2.5],["L",t,e+2.5],["L",t,e-2.5],["L",t+n+1,e-2.5]]})}}),p.registerShape("line","hvh",{draw:function(t,e){var n=i(t),r=s(t,function(t,e){var n=[],i=(e.x-t.x)/2+t.x;return n.push({x:i,y:t.y}),n.push({x:i,y:e.y}),n});return e.addShape("path",{attrs:c.mix(n,{path:r})})},getMarkerCfg:function(t){return u(t,function(t,e,n){return[["M",t-(n+1),e+2.5],["L",t-n/2,e+2.5],["L",t-n/2,e-2.5],["L",t+n/2,e-2.5],["L",t+n/2,e+2.5],["L",t+n+1,e+2.5]]})}}),p.registerShape("line","vhv",{draw:function(t,e){var n=i(t),r=s(t,function(t,e){var n=[],i=(e.y-t.y)/2+t.y;return n.push({x:t.x,y:i}),n.push({x:e.x,y:i}),n});return e.addShape("path",{attrs:c.mix(n,{path:r})})},getMarkerCfg:function(t){return u(t,function(t,e){return[["M",t-5,e+2.5],["L",t-5,e],["L",t,e],["L",t,e-3],["L",t,e+3],["L",t+6.5,e+3]]})}}),y.spline=y.smooth,t.exports=y},function(t,e,n){function i(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}var r=n(20),a=n(0);n(369);var o=function(t){function e(){return t.apply(this,arguments)||this}i(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.type="point",e.shapeType="point",e.generatePoints=!0,e},n.drawPoint=function(t,e,n,i){var r=this,o=t.shape,s=r.getDrawCfg(t);r._applyViewThemeShapeStyle(s,o,n);var l;if(a.isArray(t.y)){var u=r.hasStack();a.each(t.y,function(t,a){s.y=t,s.yIndex=a,u&&0===a||(l=n.drawShape(o,s,e),r.appendShapeInfo(l,i+a))})}else a.isNil(t.y)||(l=n.drawShape(o,s,e),r.appendShapeInfo(l,i))},e}(r),s=function(t){function e(){return t.apply(this,arguments)||this}i(e,t);return e.prototype.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.hasDefaultAdjust=!0,e.adjusts=[{type:"jitter"}],e},e}(o),l=function(t){function e(){return t.apply(this,arguments)||this}i(e,t);return e.prototype.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.hasDefaultAdjust=!0,e.adjusts=[{type:"stack"}],e},e}(o);o.Jitter=s,o.Stack=l,r.Point=o,r.PointJitter=s,r.PointStack=l,t.exports=o},function(t,e,n){function i(t){var e=s.shape.point,n=a.mix({},e,t.style);return o.addFillAttrs(n,t),a.isNumber(t.size)&&(n.radius=t.size),n}function r(t){var e=s.shape.hollowPoint,n=a.mix({},e,t.style);return o.addStrokeAttrs(n,t),a.isNumber(t.size)&&(n.radius=t.size),n}var a=n(0),o=n(45),s=n(7),l=n(18),u=n(16).Marker,c=a.PathUtil,h=["cross","tick","plus","hyphen","line","pointerLine","pointerArrow"],f=Math.sqrt(3);a.mix(u.Symbols,{hexagon:function(t,e,n){var i=n/2*f;return[["M",t,e-n],["L",t+i,e-n/2],["L",t+i,e+n/2],["L",t,e+n],["L",t-i,e+n/2],["L",t-i,e-n/2],["Z"]]},bowtie:function(t,e,n){var i=n-1.5;return[["M",t-n,e-i],["L",t+n,e+i],["L",t+n,e-i],["L",t-n,e+i],["Z"]]},cross:function(t,e,n){return[["M",t-n,e-n],["L",t+n,e+n],["M",t+n,e-n],["L",t-n,e+n]]},tick:function(t,e,n){return[["M",t-n/2,e-n],["L",t+n/2,e-n],["M",t,e-n],["L",t,e+n],["M",t-n/2,e+n],["L",t+n/2,e+n]]},plus:function(t,e,n){return[["M",t-n,e],["L",t+n,e],["M",t,e-n],["L",t,e+n]]},hyphen:function(t,e,n){return[["M",t-n,e],["L",t+n,e]]},line:function(t,e,n){return[["M",t,e-n],["L",t,e+n]]}});var p=l.registerFactory("point",{defaultShapeType:"hollowCircle",getActiveCfg:function(t,e){var n,i=e.radius;return n=t&&(0===t.indexOf("hollow")||-1!==a.indexOf(h,t))||!t?e.stroke||e.strokeStyle:e.fill||e.fillStyle,{radius:i+1,shadowBlur:i,shadowColor:n,stroke:n,strokeOpacity:1,lineWidth:1}},getDefaultPoints:function(t){return o.splitPoints(t)}});l.registerShape("point","rect",{draw:function(t,e){var n=i(t),r=function(t){var e=t.points[0].x,n=t.points[0].y,i=t.size[0],r=t.size[1];return[["M",e-.5*i,n-.5*r],["L",e+.5*i,n-.5*r],["L",e+.5*i,n+.5*r],["L",e-.5*i,n+.5*r],["z"]]}(t);r=this.parsePath(r);return e.addShape("path",{attrs:a.mix(n,{path:r})})},getMarkerCfg:function(t){var e=i(t);return e.symbol="rect",e.radius=4.5,e}}),a.each(["circle","square","bowtie","diamond","hexagon","triangle","triangle-down"],function(t){l.registerShape("point",t,{draw:function(e,n){var r=i(e);return n.addShape("Marker",{attrs:a.mix(r,{symbol:t,x:e.x,y:e.y})})},getMarkerCfg:function(e){var n=i(e);return n.symbol=t,n.radius=4.5,n}}),l.registerShape("point","hollow"+a.upperFirst(t),{draw:function(e,n){var i=r(e);return n.addShape("Marker",{attrs:a.mix(i,{symbol:t,x:e.x,y:e.y})})},getMarkerCfg:function(e){var n=r(e);return n.symbol=t,n.radius=4.5,n}})}),a.each(h,function(t){l.registerShape("point",t,{draw:function(e,n){var i=r(e);return n.addShape("Marker",{attrs:a.mix(i,{symbol:t,x:e.x,y:e.y})})},getMarkerCfg:function(e){var n=r(e);return n.symbol=t,n.radius=4.5,n}})}),l.registerShape("point","image",{draw:function(t,e){return t.points=this.parsePoints(t.points),e.addShape("image",{attrs:{x:t.points[0].x-t.size/2,y:t.points[0].y-t.size,width:t.size,height:t.size,img:t.shape[1]}})}});var g={};l.registerShape("point","path",{draw:function(t,e){var n,o=a.mix({},r(t),i(t)),s=t.shape[1],l=t.size||10;if(g[s])n=g[s];else{var u=c.parsePathString(s),h=a.flatten(u).filter(function(t){return a.isNumber(t)});g[s]=n={range:Math.max.apply(null,h)-Math.min.apply(null,h),segments:u}}var f=l/n.range,p=[];o.rotate&&(p.push(["r",o.rotate/180*Math.PI]),delete o.rotate);var d=e.addShape("path",{attrs:a.mix(o,{path:n.segments})});return p.push(["s",f,f],["t",t.x,t.y]),d.transform(p),d}}),t.exports=p},function(t,e,n){"use strict";var i=n(371);e.a=function(t){var e=t+="",n=e.indexOf(":");return n>=0&&"xmlns"!==(e=t.slice(0,n))&&(t=t.slice(n+1)),i.a.hasOwnProperty(e)?{space:i.a[e],local:t}:t}},function(t,e,n){"use strict";n.d(e,"b",function(){return i});var i="http://www.w3.org/1999/xhtml";e.a={svg:"http://www.w3.org/2000/svg",xhtml:i,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"}},function(t,e,n){"use strict";e.a=function(t){return null==t?function(){}:function(){return this.querySelector(t)}}},function(t,e,n){"use strict";e.a=function(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}},function(t,e,n){"use strict";function i(t,e,n){return function(i){var r=o;o=i;try{t.call(this,this.__data__,e,n)}finally{o=r}}}function r(t,e,n){var r=a.hasOwnProperty(t.type)?function(t,e,n){return t=i(t,e,n),function(e){var n=e.relatedTarget;n&&(n===this||8&n.compareDocumentPosition(this))||t.call(this,e)}}:i;return function(i,a,o){var s,l=this.__on,u=r(e,a,o);if(l)for(var c=0,h=l.length;c<h;++c)if((s=l[c]).type===t.type&&s.name===t.name)return this.removeEventListener(s.type,s.listener,s.capture),this.addEventListener(s.type,s.listener=u,s.capture=n),void(s.value=e);this.addEventListener(t.type,u,n),s={type:t.type,name:t.name,value:e,listener:u,capture:n},l?l.push(s):this.__on=[s]}}n.d(e,"c",function(){return o}),e.a=function(t,e,n,i){var r=o;t.sourceEvent=o,o=t;try{return e.apply(n,i)}finally{o=r}};var a={},o=null;if("undefined"!=typeof document){"onmouseenter"in document.documentElement||(a={mouseenter:"mouseover",mouseleave:"mouseout"})}e.b=function(t,e,n){var i,a,o=function(t){return t.trim().split(/^|\s+/).map(function(t){var e="",n=t.indexOf(".");return n>=0&&(e=t.slice(n+1),t=t.slice(0,n)),{type:t,name:e}})}(t+""),s=o.length;{if(!(arguments.length<2)){for(l=e?r:function(t){return function(){var e=this.__on;if(e){for(var n,i=0,r=-1,a=e.length;i<a;++i)n=e[i],t.type&&n.type!==t.type||n.name!==t.name?e[++r]=n:this.removeEventListener(n.type,n.listener,n.capture);++r?e.length=r:delete this.__on}}},null==n&&(n=!1),i=0;i<s;++i)this.each(l(o[i],e,n));return this}var l=this.node().__on;if(l)for(var u,c=0,h=l.length;c<h;++c)for(i=0,u=l[c];i<s;++i)if((a=o[i]).type===u.type&&a.name===u.name)return u.value}}},function(t,e,n){"use strict";var i=n(374);e.a=function(){for(var t,e=i.c;t=e.sourceEvent;)e=t;return e}},function(t,e){t.exports=function(t){return(t.get("scaleController")||{}).defs}},function(t,e,n){var i=n(376);t.exports=function(t,e){var n=i(t);if(n&&n[e])return n[e]}},function(t,e,n){var i=n(0),r=n(71);t.exports=function(t,e){var n,a=e.field,o=e.type,s=i.Array.values(t,a);return"linear"===o?(n=i.Array.getRange(s),e.min<n.min&&(n.min=e.min),e.max>n.max&&(n.max=e.max)):"timeCat"===o?(i.each(s,function(t,e){s[e]=r.toTimeStamp(t)}),s.sort(function(t,e){return t-e}),n=s):n=s,n}},function(t,e,n){"use strict";var i=n(69);e.a=function(t){return"string"==typeof t?new i.a([[document.querySelector(t)]],[document.documentElement]):new i.a([[t]],i.c)}},function(t,e,n){"use strict";e.a=function(t){return null==t?function(){return[]}:function(){return this.querySelectorAll(t)}}},function(t,e,n){"use strict";var i=function(t){return function(){return this.matches(t)}};if("undefined"!=typeof document){var r=document.documentElement;if(!r.matches){var a=r.webkitMatchesSelector||r.msMatchesSelector||r.mozMatchesSelector||r.oMatchesSelector;i=function(t){return function(){return a.call(this,t)}}}}e.a=i},function(t,e,n){"use strict";function i(t,e){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=e}e.a=i;var r=n(383),a=n(69);e.b=function(){return new a.a(this._enter||this._groups.map(r.a),this._parents)},i.prototype={constructor:i,appendChild:function(t){return this._parent.insertBefore(t,this._next)},insertBefore:function(t,e){return this._parent.insertBefore(t,e)},querySelector:function(t){return this._parent.querySelector(t)},querySelectorAll:function(t){return this._parent.querySelectorAll(t)}}},function(t,e,n){"use strict";e.a=function(t){return new Array(t.length)}},function(t,e,n){"use strict";function i(t,e){return t.style.getPropertyValue(e)||Object(r.a)(t).getComputedStyle(t,null).getPropertyValue(e)}e.b=i;var r=n(373);e.a=function(t,e,n){return arguments.length>1?this.each((null==e?function(t){return function(){this.style.removeProperty(t)}}:"function"==typeof e?function(t,e,n){return function(){var i=e.apply(this,arguments);null==i?this.style.removeProperty(t):this.style.setProperty(t,i,n)}}:function(t,e,n){return function(){this.style.setProperty(t,e,n)}})(t,e,null==n?"":n)):i(this.node(),t)}},function(t,e,n){"use strict";var i=n(70);e.a=function(t,e){var n,r,a,o=t.__transition,s=!0;if(o){e=null==e?null:e+"";for(a in o)(n=o[a]).name===e?(r=n.state>i.d&&n.state<i.b,n.state=i.a,n.timer.stop(),r&&n.on.call("interrupt",t,t.__data__,n.index,n.group),delete o[a]):s=!1;s&&delete t.__transition}}},function(t,e,n){"use strict";var i=n(19),r=n(117);e.a=function(t,e){var n;return("number"==typeof e?r.interpolateNumber:e instanceof i.a?r.interpolateRgb:(n=Object(i.a)(e))?(e=n,r.interpolateRgb):r.interpolateString)(t,e)}},function(t,e,n){var i=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.type="rect",e},n.generateFacets=function(t){var e=this,n=e.fields,i=[],r=1,a=1,o=n[0],s=n[1],l=[""],u=[""];return o&&(l=e.getFieldValues(o,t),a=l.length),s&&(u=e.getFieldValues(s,t),r=u.length),l.forEach(function(n,c){u.forEach(function(h,f){var p=[{field:o,value:n,values:l},{field:s,value:h,values:u}],g=e.getFilter(p),d=t.filter(g),v={type:e.type,colValue:n,rowValue:h,colField:o,rowField:s,colIndex:c,rowIndex:f,cols:a,rows:r,data:d,region:e.getRegion(r,a,c,f)};i.push(v)})}),i},n.setXAxis=function(t,e,n){n.rowIndex!==n.rows-1?(e[t].title=null,e[t].label=null):n.colIndex!==parseInt((n.cols-1)/2)&&(e[t].title=null)},n.setYAxis=function(t,e,n){0!==n.colIndex?(e[t].title=null,e[t].label=null):n.rowIndex!==parseInt((n.rows-1)/2)&&(e[t].title=null)},n.renderTitle=function(t,e){0===e.rowIndex&&this.drawColTitle(t,e),e.colIndex===e.cols-1&&this.drawRowTitle(t,e)},e}(n(363));t.exports=i},function(t,e,n){var i=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.type="list",e.cols=null,e},n.generateFacets=function(t){var e=this,n=e.fields[0];if(!n)throw"Please specify for the field for facet!";var i=e.getFieldValues(n,t),r=i.length,a=e.cols||r,o=parseInt((r+a-1)/a),s=[];return i.forEach(function(l,u){var c=parseInt(u/a),h=u%a,f=[{field:n,value:l,values:i}],p=e.getFilter(f),g=t.filter(p),d={type:e.type,count:r,colValue:l,colField:n,rowField:null,rowValue:l,colIndex:h,rowIndex:c,cols:a,rows:o,data:g,region:e.getRegion(o,a,h,c)};s.push(d)}),s},n.setXAxis=function(t,e,n){n.rowIndex!==n.rows-1&&n.cols*n.rowIndex+n.colIndex+1+n.cols<=n.count&&(e[t].label=null,e[t].title=null)},n.setYAxis=function(t,e,n){0!==n.colIndex&&(e[t].title=null,e[t].label=null)},e}(n(363));t.exports=i},function(t,e,n){var i=n(172);n(390),n(392),n(394),n(364),n(366),n(359),n(368),n(395),n(397),n(399),n(459),n(461),n(466),t.exports=i},function(t,e,n){function i(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}function r(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}var a=n(20),o=n(358),s=n(0);n(391);var l=function(t){function e(e){var n;return n=t.call(this,e)||this,s.assign(r(r(n)),o),n}i(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.type="area",e.shapeType="area",e.generatePoints=!0,e.sortable=!0,e},n.draw=function(t,e,n,i){var r=this,a=this.getDrawCfg(t[0]);r._applyViewThemeShapeStyle(a,a.shape,n);var o=this.splitData(t);a.origin=t,s.each(o,function(t,o){a.splitedIndex=o;var s=t.map(function(t){return t.points});a.points=s;var l=n.drawShape(a.shape,a,e);r.appendShapeInfo(l,i+o)})},e}(a),u=function(t){function e(){return t.apply(this,arguments)||this}i(e,t);return e.prototype.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.hasDefaultAdjust=!0,e.adjusts=[{type:"stack"}],e},e}(l);l.Stack=u,a.Area=l,a.AreaStack=u,t.exports=l},function(t,e,n){function i(t){var e=h.shape.hollowArea,n=s.mix({},e,t.style);return c.addStrokeAttrs(n,t),s.isNumber(t.size)&&(n.lineWidth=t.size),n}function r(t){var e=h.shape.area,n=s.mix({},e,t.style);return c.addFillAttrs(n,t),t.color&&(n.stroke=n.stroke||t.color),s.isNumber(t.size)&&(n.lineWidth=t.size),n}function a(t,e,n){var i=[],r=[],a=[],o=[],l=t.isInCircle;return s.each(t.points,function(t){a.push(t[1]),o.push(t[0])}),o=o.reverse(),r.push(a,o),s.each(r,function(r,a){var o=[],s=(r=n.parsePoints(r))[0];l&&r.push({x:s.x,y:s.y}),o=e?u.getSplinePath(r,!1,t.constraint):u.getLinePath(r,!1),a>0&&(o[0][0]="L"),i=i.concat(o)}),i.push(["Z"]),i}function o(t){return{symbol:function(t,e){return[["M",t-5.5,e-4],["L",t+5.5,e-4],["L",t+5.5,e+4],["L",t-5.5,e+4],["Z"]]},radius:5,fill:t.color,fillOpacity:.6}}var s=n(0),l=n(18),u=n(22),c=n(45),h=n(7),f=l.registerFactory("area",{defaultShapeType:"area",getDefaultPoints:function(t){var e=[],n=t.x,i=t.y,r=t.y0;return i=s.isArray(i)?i:[r,i],s.each(i,function(t){e.push({x:n,y:t})}),e},getActiveCfg:function(t,e){return function(t,e){if("line"===t||"smoothLine"===t)return{lineWidth:(e.lineWidth||0)+1};var n=e.fillOpacity||e.opacity||1;return{fillOpacity:n-.15,strokeOpacity:n-.15}}(t,e)},drawShape:function(t,e,n){var i,r=this.getShape(t);return(i=1===e.points.length&&h.showSinglePoint?function(t,e,n){var i=t._coord.convertPoint(e.points[0][1]);return n.addShape("circle",{attrs:s.mix({x:i.x,y:i.y,r:2,fill:e.color},e.style)})}(this,e,n):r.draw(e,n))&&(i.set("origin",e.origin),i._id=e.splitedIndex?e._id+e.splitedIndex:e._id,i.name=this.name),i},getSelectedCfg:function(t,e){return e&&e.style?e.style:this.getActiveCfg(t,e)}});l.registerShape("area","area",{draw:function(t,e){var n=r(t),i=a(t,!1,this);return e.addShape("path",{attrs:s.mix(n,{path:i})})},getMarkerCfg:function(t){return o(t)}}),l.registerShape("area","smooth",{draw:function(t,e){var n=r(t),i=this._coord;t.constraint=[[i.start.x,i.end.y],[i.end.x,i.start.y]];var o=a(t,!0,this);return e.addShape("path",{attrs:s.mix(n,{path:o})})},getMarkerCfg:function(t){return o(t)}}),l.registerShape("area","line",{draw:function(t,e){var n=i(t),r=a(t,!1,this);return e.addShape("path",{attrs:s.mix(n,{path:r})})},getMarkerCfg:function(t){return o(t)}}),l.registerShape("area","smoothLine",{draw:function(t,e){var n=i(t),r=a(t,!0,this);return e.addShape("path",{attrs:s.mix(n,{path:r})})},getMarkerCfg:function(t){return o(t)}}),f.spline=f.smooth,t.exports=f},function(t,e,n){var i=n(20);n(393);var r=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);return e.prototype.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.type="edge",e.shapeType="edge",e.generatePoints=!0,e},e}(i);i.Edge=r,t.exports=r},function(t,e,n){function i(t){var e=u.shape.edge,n=o.mix({},e,t.style);return l.addStrokeAttrs(n,t),n}function r(t,e){var n=[];n.push({x:t.x,y:.5*t.y+1*e.y/2}),n.push({y:.5*t.y+1*e.y/2,x:e.x}),n.push(e);var i=["C"];return o.each(n,function(t){i.push(t.x,t.y)}),i}function a(t,e){var n=[];n.push({x:e.x,y:e.y}),n.push(t);var i=["Q"];return o.each(n,function(t){i.push(t.x,t.y)}),i}var o=n(0),s=n(18),l=n(45),u=n(7),c=n(22),h=1/3,f=s.registerFactory("edge",{defaultShapeType:"line",getDefaultPoints:function(t){return l.splitPoints(t)},getActiveCfg:function(t,e){return{lineWidth:(e.lineWidth||0)+1}}});s.registerShape("edge","line",{draw:function(t,e){var n=this.parsePoints(t.points),r=i(t),a=c.getLinePath(n);return e.addShape("path",{attrs:o.mix(r,{path:a})})},getMarkerCfg:function(t){return o.mix({symbol:"circle",radius:4.5},i(t))}}),s.registerShape("edge","vhv",{draw:function(t,e){var n=t.points,r=i(t),a=function(t,e){var n=[];n.push({y:t.y*(1-h)+e.y*h,x:t.x}),n.push({y:t.y*(1-h)+e.y*h,x:e.x}),n.push(e);var i=[["M",t.x,t.y]];return o.each(n,function(t){i.push(["L",t.x,t.y])}),i}(n[0],n[1]);a=this.parsePath(a);return e.addShape("path",{attrs:o.mix(r,{path:a})})},getMarkerCfg:function(t){return o.mix({symbol:"circle",radius:4.5},i(t))}}),s.registerShape("edge","smooth",{draw:function(t,e){var n=t.points,a=i(t),s=function(t,e){var n=r(t,e),i=[["M",t.x,t.y]];return i.push(n),i}(n[0],n[1]);s=this.parsePath(s);return e.addShape("path",{attrs:o.mix(a,{path:s})})},getMarkerCfg:function(t){return o.mix({symbol:"circle",radius:4.5},i(t))}}),s.registerShape("edge","arc",{draw:function(t,e){var n,s,l=t.points,u=l.length>2?"weight":"normal",c=i(t);if(t.isInCircle){var h={x:0,y:1};"normal"===u?s=function(t,e,n){var i=a(e,n),r=[["M",t.x,t.y]];return r.push(i),r}(l[0],l[1],h):(c.fill=c.stroke,s=function(t,e){var n=a(t[1],e),i=a(t[3],e),r=[["M",t[0].x,t[0].y]];return r.push(i),r.push(["L",t[3].x,t[3].y]),r.push(["L",t[2].x,t[2].y]),r.push(n),r.push(["L",t[1].x,t[1].y]),r.push(["L",t[0].x,t[0].y]),r.push(["Z"]),r}(l,h)),s=this.parsePath(s),n=e.addShape("path",{attrs:o.mix(c,{path:s})})}else if("normal"===u)l=this.parsePoints(l),n=e.addShape("arc",{attrs:o.mix(c,{x:(l[1].x+l[0].x)/2,y:l[0].y,r:Math.abs(l[1].x-l[0].x)/2,startAngle:Math.PI,endAngle:2*Math.PI})});else{s=[["M",l[0].x,l[0].y],["L",l[1].x,l[1].y]];var f=r(l[1],l[3]),p=r(l[2],l[0]);s.push(f),s.push(["L",l[3].x,l[3].y]),s.push(["L",l[2].x,l[2].y]),s.push(p),s.push(["Z"]),s=this.parsePath(s),c.fill=c.stroke,n=e.addShape("path",{attrs:o.mix(c,{path:s})})}return n},getMarkerCfg:function(t){return o.mix({symbol:"circle",radius:4.5},i(t))}}),t.exports=f},function(t,e,n){var i=n(73).ColorUtil,r=n(20),a=n(0),o=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.type="heatmap",e.paletteCache={},e},n._prepareRange=function(){var t=this.get("mappedData"),e=this.getAttr("color").field,n=1/0,i=-1/0;t.forEach(function(t){var r=t._origin[e];r>i&&(i=r),r<n&&(n=r)}),n===i&&(n=i-1);var r=[n,i];this.set("valueRange",r)},n._prepareSize=function(){var t=this.getDefaultValue("size");a.isNumber(t)||(t=this._getDefaultSize());var e=this.get("styleOptions"),n=e&&a.isObject(e.style)?e.style.blur:null;a.isFinite(n)&&null!==n||(n=t/2),this.set("heatmapSize",{blur:n,radius:t})},n._getDefaultSize=function(){var t=this.getAttr("position"),e=this.get("coord");return Math.min(e.width/(4*t.scales[0].ticks.length),e.height/(4*t.scales[1].ticks.length))},n._colorize=function(t){for(var e=this.getAttr("color"),n=t.data,r=this.get("paletteCache"),a=3;a<n.length;a+=4){var o=n[a];if(o){var s=void 0;r[o]?s=r[o]:(s=i.rgb2arr(e.gradient(o/256)),r[o]=s),n[a-3]=s[0],n[a-2]=s[1],n[a-1]=s[2],n[a]=o}}},n._prepareGreyScaleBlurredCircle=function(t,e){var n=this.get("grayScaleBlurredCanvas");n||(n=document.createElement("canvas"),this.set("grayScaleBlurredCanvas",n));var i=t+e,r=n.getContext("2d");n.width=n.height=2*i,r.clearRect(0,0,n.width,n.height),r.shadowOffsetX=r.shadowOffsetY=2*i,r.shadowBlur=e,r.shadowColor="black",r.beginPath(),r.arc(-i,-i,t,0,2*Math.PI,!0),r.closePath(),r.fill()},n._drawGrayScaleBlurredCircle=function(t,e,n,i,r){var a=this.get("grayScaleBlurredCanvas");r.globalAlpha=i,r.drawImage(a,t-n,e-n)},n._getShadowCanvasCtx=function(){var t=this.get("shadowCanvas");t||(t=document.createElement("canvas"),this.set("shadowCanvas",t));var e=this.get("coord"),n=e.width,i=e.height;return t.width=n,t.height=i,t.getContext("2d")},n._clearShadowCanvasCtx=function(){var t=this._getShadowCanvasCtx();t.clearRect(0,0,t.canvas.width,t.canvas.height)},n._getImageShape=function(){var t=this.get("imageShape");if(t)return t;return t=this.get("container").addShape("Image",{}),this.set("imageShape",t),t},n.drawWithRange=function(t){var e=this.get("coord"),n=e.start,i=e.end,r=e.width,a=e.height,o=this.getAttr("color").field,s=this.get("heatmapSize");this._clearShadowCanvasCtx();var l=this._getShadowCanvasCtx(),u=this.get("mappedData");t&&(u=u.filter(function(e){return e._origin[o]<=t[1]&&e._origin[o]>=t[0]}));for(var c=this._getScale(o),h=0;h<u.length;h++){var f=u[h],p=this.getDrawCfg(f),g=c.scale(f._origin[o]);this._drawGrayScaleBlurredCircle(p.x-n.x,p.y-i.y,s.radius+s.blur,g,l)}var d=l.getImageData(0,0,r,a);this._clearShadowCanvasCtx(),this._colorize(d),l.putImageData(d,0,0);var v=this._getImageShape();v.attr("x",n.x),v.attr("y",i.y),v.attr("width",r),v.attr("height",a),v.attr("img",l.canvas)},n.draw=function(t){this.set("mappedData",t),this._prepareRange(),this._prepareSize();var e=this.get("heatmapSize");this._prepareGreyScaleBlurredCircle(e.radius,e.blur);var n=this.get("valueRange");this.drawWithRange(n)},e}(r);r.Heatmap=o,t.exports=o},function(t,e,n){var i=n(20),r=n(0);n(396);var a=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.type="polygon",e.shapeType="polygon",e.generatePoints=!0,e},n.createShapePointsCfg=function(e){var n,i=t.prototype.createShapePointsCfg.call(this,e),a=i.x,o=i.y;if(!r.isArray(a)||!r.isArray(o)){var s=this.getXScale(),l=this.getYScale(),u=.5/(s.values?s.values.length:s.ticks.length),c=.5/(l.values?l.values.length:l.ticks.length);s.isCategory&&l.isCategory?(a=[a-u,a-u,a+u,a+u],o=[o-c,o+c,o+c,o-c]):r.isArray(a)?(a=[(n=a)[0],n[0],n[1],n[1]],o=[o-c/2,o+c/2,o+c/2,o-c/2]):r.isArray(o)&&(o=[(n=o)[0],n[1],n[1],n[0]],a=[a-u/2,a-u/2,a+u/2,a+u/2]),i.x=a,i.y=o}return i},e}(i);i.Polygon=a,t.exports=a},function(t,e,n){function i(t){var e=l.shape.polygon,n=a.mix({},e,t.style);return s.addFillAttrs(n,t),n}function r(t){for(var e=t[0],n=1,i=[["M",e.x,e.y]];n<t.length;){var r=t[n];r.x===t[n-1].x&&r.y===t[n-1].y||(i.push(["L",r.x,r.y]),r.x===e.x&&r.y===e.y&&n<t.length-1&&(e=t[n+1],i.push(["Z"]),i.push(["M",e.x,e.y]),n++)),n++}return a.isEqual(i[i.length-1],e)||i.push(["L",e.x,e.y]),i.push(["Z"]),i}var a=n(0),o=n(18),s=n(45),l=n(7),u=o.registerFactory("polygon",{defaultShapeType:"polygon",getDefaultPoints:function(t){var e=[];return a.each(t.x,function(n,i){var r=t.y[i];e.push({x:n,y:r})}),e},getActiveCfg:function(t,e){var n=e.lineWidth||1;if("hollow"===t)return{lineWidth:n+1};return{fillOpacity:(e.fillOpacity||e.opacity||1)-.08}},getSelectedCfg:function(t,e){return e&&e.style?e.style:this.getActiveCfg(t,e)}});o.registerShape("polygon","polygon",{draw:function(t,e){if(!a.isEmpty(t.points)){var n=i(t),o=r(t.points);return o=this.parsePath(o),e.addShape("path",{attrs:a.mix(n,{path:o})})}},getMarkerCfg:function(t){return a.mix({symbol:"square",radius:4},i(t))}}),o.registerShape("polygon","hollow",{draw:function(t,e){if(!a.isEmpty(t.points)){var n=function(t){var e=l.shape.hollowPolygon,n=a.mix({},e,t.style);return s.addStrokeAttrs(n,t),n}(t),i=r(t.points);return i=this.parsePath(i),e.addShape("path",{attrs:a.mix(n,{path:i})})}},getMarkerCfg:function(t){return a.mix({symbol:"square",radius:4},i(t))}}),t.exports=u},function(t,e,n){function i(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}function r(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}var a=n(20),o=n(0),s=n(357);n(398);var l=function(t){function e(e){var n;return n=t.call(this,e)||this,o.assign(r(r(n)),s),n}i(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.type="schema",e.shapeType="schema",e.generatePoints=!0,e},n.createShapePointsCfg=function(e){var n=t.prototype.createShapePointsCfg.call(this,e);return n.size=this.getNormalizedSize(e),n},e}(a),u=function(t){function e(){return t.apply(this,arguments)||this}i(e,t);return e.prototype.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.hasDefaultAdjust=!0,e.adjusts=[{type:"dodge"}],e},e}(l);l.Dodge=u,a.Schema=l,a.SchemaDodge=u,t.exports=l},function(t,e,n){function i(t){o.isArray(t)||(t=[t]);var e=t[0],n=t[t.length-1],i=t.length>1?t[1]:e;return{min:e,max:n,min1:i,max1:t.length>3?t[3]:n,median:t.length>2?t[2]:i}}function r(t,e,n){var r,a,s=[];return o.isArray(e)?r=[[t-n/2,(a=i(e)).max],[t+n/2,a.max],[t,a.max],[t,a.max1],[t-n/2,a.min1],[t-n/2,a.max1],[t+n/2,a.max1],[t+n/2,a.min1],[t,a.min1],[t,a.min],[t-n/2,a.min],[t+n/2,a.min],[t-n/2,a.median],[t+n/2,a.median]]:(e=e||.5,r=[[(a=i(t)).min,e-n/2],[a.min,e+n/2],[a.min,e],[a.min1,e],[a.min1,e-n/2],[a.min1,e+n/2],[a.max1,e+n/2],[a.max1,e-n/2],[a.max1,e],[a.max,e],[a.max,e-n/2],[a.max,e+n/2],[a.median,e-n/2],[a.median,e+n/2]]),function(t,e){o.each(t,function(t){e.push({x:t[0],y:t[1]})})}(r,s),s}function a(t,e,n){var i=function(t){o.isArray(t)||(t=[t]);var e=t.sort(function(t,e){return t<e?1:-1}),n=e.length;if(n<4)for(var i=e[n-1],r=0;r<4-n;r++)e.push(i);return e}(e);return[{x:t,y:i[0]},{x:t,y:i[1]},{x:t-n/2,y:i[2]},{x:t-n/2,y:i[1]},{x:t+n/2,y:i[1]},{x:t+n/2,y:i[2]},{x:t,y:i[2]},{x:t,y:i[3]}]}var o=n(0),s=n(18),l=n(45),u=n(7),c=s.registerFactory("schema",{defaultShapeType:"",getActiveCfg:function(t,e){if("box"===t){return{lineWidth:(e.lineWidth||1)+1}}var n=e.fillOpacity||e.opacity||1;return{fillOpacity:n-.15,strokeOpacity:n-.15}},getSelectedCfg:function(t,e){return e&&e.style?e.style:this.getActiveCfg(t,e)}});s.registerShape("schema","box",{getPoints:function(t){return r(t.x,t.y,t.size)},draw:function(t,e){var n=function(t){var e=u.shape.schema,n=o.mix({},e,t.style);return l.addStrokeAttrs(n,t),n}(t),i=function(t){return[["M",t[0].x,t[0].y],["L",t[1].x,t[1].y],["M",t[2].x,t[2].y],["L",t[3].x,t[3].y],["M",t[4].x,t[4].y],["L",t[5].x,t[5].y],["L",t[6].x,t[6].y],["L",t[7].x,t[7].y],["L",t[4].x,t[4].y],["Z"],["M",t[8].x,t[8].y],["L",t[9].x,t[9].y],["M",t[10].x,t[10].y],["L",t[11].x,t[11].y],["M",t[12].x,t[12].y],["L",t[13].x,t[13].y]]}(t.points);return i=this.parsePath(i),e.addShape("path",{attrs:o.mix(n,{path:i})})},getMarkerCfg:function(t){return{symbol:function(t,e,n){var i=r(t,[e-6,e-3,e,e+3,e+6],n);return[["M",i[0].x+1,i[0].y],["L",i[1].x-1,i[1].y],["M",i[2].x,i[2].y],["L",i[3].x,i[3].y],["M",i[4].x,i[4].y],["L",i[5].x,i[5].y],["L",i[6].x,i[6].y],["L",i[7].x,i[7].y],["L",i[4].x,i[4].y],["Z"],["M",i[8].x,i[8].y],["L",i[9].x,i[9].y],["M",i[10].x+1,i[10].y],["L",i[11].x-1,i[11].y],["M",i[12].x,i[12].y],["L",i[13].x,i[13].y]]},radius:6,lineWidth:1,stroke:t.color}}}),s.registerShape("schema","candle",{getPoints:function(t){return a(t.x,t.y,t.size)},draw:function(t,e){var n=function(t){var e=u.shape.schema,n=o.mix({},e,t.style);return l.addFillAttrs(n,t),t.color&&(n.stroke=n.stroke||t.color),n}(t),i=function(t){return[["M",t[0].x,t[0].y],["L",t[1].x,t[1].y],["M",t[2].x,t[2].y],["L",t[3].x,t[3].y],["L",t[4].x,t[4].y],["L",t[5].x,t[5].y],["Z"],["M",t[6].x,t[6].y],["L",t[7].x,t[7].y]]}(t.points);return i=this.parsePath(i),e.addShape("path",{attrs:o.mix(n,{path:i})})},getMarkerCfg:function(t){return{symbol:function(t,e,n){var i=a(t,e=[e+7.5,e+3,e-3,e-7.5],n);return[["M",i[0].x,i[0].y],["L",i[1].x,i[1].y],["M",i[2].x,i[2].y],["L",i[3].x,i[3].y],["L",i[4].x,i[4].y],["L",i[5].x,i[5].y],["Z"],["M",i[6].x,i[6].y],["L",i[7].x,i[7].y]]},lineWidth:1,stroke:t.color,fill:t.color,radius:6}}}),t.exports=c},function(t,e,n){var i=n(20),r=n(0),a=n(400),o=a.venn,s=a.scaleSolution,l=a.circlePath,u=a.intersectionAreaPath,c=a.computeTextCentres;n(458);var h=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.type="venn",e.shapeType="venn",e.generatePoints=!0,e},n._initAttrs=function(){var e=this.get("attrOptions"),n=this.get("labelCfg"),i=this.get("data"),a=e.size?e.size.field:"size",h=n?n.fields[0]:"sets";this.set("labelCfg",null),i.forEach(function(t){t.sets=t[h],t.size=t[a]});var f=o(i),p=this.get("coord"),g=[Math.min(p.x.end,p.x.start),Math.max(p.x.end,p.x.start)],d=[Math.min(p.y.end,p.y.start),Math.max(p.y.end,p.y.start)],v=g[1]-g[0],y=d[1]-d[0],x=this.get("styleOptions"),m=x&&r.isObject(x.style)?x.style.padding:0;r.isFinite(m)||(m=0);var _=s(f,v,y,m),b=c(_,i);i.forEach(function(t){var e=t.sets,n=e.join(",");if(t.id=n,1===e.length){var i=_[n];t.path=l(i.x,i.y,i.radius),r.assign(t,i)}else{var a=e.map(function(t){return _[t]}),o=u(a);/[zZ]$/.test(o)||(o+="Z"),t.path=o;var s=b[n]||{x:0,y:0};r.assign(t,s)}}),this.position("x*y"),t.prototype._initAttrs.call(this)},n.paint=function(){t.prototype.paint.call(this);var e=this,n=e.get("dataArray"),i=e.get("shapeContainer");n.forEach(function(t){var n=e.getDrawCfg(t[0]),a=n.origin._origin;i.addShape("text",{attrs:r.mix({},{x:a.x,y:a.y,text:a.label||"",fontSize:18,fill:"hollow"===n.shape?n.color:"#666",textAlign:"center",textBaseline:"middle"},n.style?n.style.textStyle:{})})})},e}(i);i.Venn=h,t.exports=h},function(t,e,n){!function(t,i){i(e,n(72),n(435))}(0,function(t,e,n){"use strict";function i(t,e){var n,i=function(t){for(var e=[],n=0;n<t.length;++n)for(var i=n+1;i<t.length;++i)for(var r=s(t[n],t[i]),a=0;a<r.length;++a){var o=r[a];o.parentIndex=[n,i],e.push(o)}return e}(t),o=i.filter(function(e){return function(t,e){for(var n=0;n<e.length;++n)if(a(t,e[n])>e[n].radius+B)return!1;return!0}(e,t)}),u=0,c=0,h=[];if(o.length>1){var f=l(o);for(n=0;n<o.length;++n){var p=o[n];p.angle=Math.atan2(p.x-f.x,p.y-f.y)}o.sort(function(t,e){return e.angle-t.angle});var g=o[o.length-1];for(n=0;n<o.length;++n){var d=o[n];c+=(g.x+d.x)*(d.y-g.y);for(var v={x:(d.x+g.x)/2,y:(d.y+g.y)/2},y=null,x=0;x<d.parentIndex.length;++x)if(g.parentIndex.indexOf(d.parentIndex[x])>-1){var m=t[d.parentIndex[x]],_=Math.atan2(d.x-m.x,d.y-m.y),b=Math.atan2(g.x-m.x,g.y-m.y),w=b-_;w<0&&(w+=2*Math.PI);var S=b-w/2,M=a(v,{x:m.x+m.radius*Math.sin(S),y:m.y+m.radius*Math.cos(S)});M>2*m.radius&&(M=2*m.radius),(null===y||y.width>M)&&(y={circle:m,width:M,p1:d,p2:g})}null!==y&&(h.push(y),u+=r(y.circle.radius,y.width),g=d)}}else{var C=t[0];for(n=1;n<t.length;++n)t[n].radius<C.radius&&(C=t[n]);var A=!1;for(n=0;n<t.length;++n)if(a(t[n],C)>Math.abs(C.radius-t[n].radius)){A=!0;break}A?u=c=0:(u=C.radius*C.radius*Math.PI,h.push({circle:C,p1:{x:C.x,y:C.y+C.radius},p2:{x:C.x-B,y:C.y+C.radius},width:2*C.radius}))}return c/=2,e&&(e.area=u+c,e.arcArea=u,e.polygonArea=c,e.arcs=h,e.innerPoints=o,e.intersectionPoints=i),u+c}function r(t,e){return t*t*Math.acos(1-e/t)-(t-e)*Math.sqrt(e*(2*t-e))}function a(t,e){return Math.sqrt((t.x-e.x)*(t.x-e.x)+(t.y-e.y)*(t.y-e.y))}function o(t,e,n){if(n>=t+e)return 0;if(n<=Math.abs(t-e))return Math.PI*Math.min(t,e)*Math.min(t,e);var i=e-(n*n-t*t+e*e)/(2*n);return r(t,t-(n*n-e*e+t*t)/(2*n))+r(e,i)}function s(t,e){var n=a(t,e),i=t.radius,r=e.radius;if(n>=i+r||n<=Math.abs(i-r))return[];var o=(i*i-r*r+n*n)/(2*n),s=Math.sqrt(i*i-o*o),l=t.x+o*(e.x-t.x)/n,u=t.y+o*(e.y-t.y)/n,c=-(e.y-t.y)*(s/n),h=-(e.x-t.x)*(s/n);return[{x:l+c,y:u-h},{x:l-c,y:u+h}]}function l(t){for(var e={x:0,y:0},n=0;n<t.length;++n)e.x+=t[n].x,e.y+=t[n].y;return e.x/=t.length,e.y/=t.length,e}function u(t){for(var e=new Array(t),n=0;n<t;++n)e[n]=0;return e}function c(t,e){return u(t).map(function(){return u(e)})}function h(t,e){for(var n=0,i=0;i<t.length;++i)n+=t[i]*e[i];return n}function f(t){return Math.sqrt(h(t,t))}function p(t,e,n){for(var i=0;i<e.length;++i)t[i]=e[i]*n}function g(t,e,n,i,r){for(var a=0;a<t.length;++a)t[a]=e*n[a]+i*r[a]}function d(t,e,n){function i(t){for(var e=0;e<t.length;e++)v[d][e]=t[e];v[d].fx=t.fx}var r,a=(n=n||{}).maxIterations||200*e.length,o=n.nonZeroDelta||1.05,s=n.zeroDelta||.001,l=n.minErrorDelta||1e-6,u=n.minErrorDelta||1e-5,c=void 0!==n.rho?n.rho:1,h=void 0!==n.chi?n.chi:2,f=void 0!==n.psi?n.psi:-.5,p=void 0!==n.sigma?n.sigma:.5,d=e.length,v=new Array(d+1);v[0]=e,v[0].fx=t(e),v[0].id=0;for(var y=0;y<d;++y){var x=e.slice();x[y]=x[y]?x[y]*o:s,v[y+1]=x,v[y+1].fx=t(x),v[y+1].id=y+1}for(var m=function(t,e){return t.fx-e.fx},_=e.slice(),b=e.slice(),w=e.slice(),S=e.slice(),M=0;M<a;++M){if(v.sort(m),n.history){var C=v.map(function(t){var e=t.slice();return e.fx=t.fx,e.id=t.id,e});C.sort(function(t,e){return t.id-e.id}),n.history.push({x:v[0].slice(),fx:v[0].fx,simplex:C})}for(r=0,y=0;y<d;++y)r=Math.max(r,Math.abs(v[0][y]-v[1][y]));if(Math.abs(v[0].fx-v[d].fx)<l&&r<u)break;for(y=0;y<d;++y){_[y]=0;for(var A=0;A<d;++A)_[y]+=v[A][y];_[y]/=d}var k=v[d];if(g(b,1+c,_,-c,k),b.fx=t(b),b.fx<v[0].fx)g(S,1+h,_,-h,k),S.fx=t(S),i(S.fx<b.fx?S:b);else if(b.fx>=v[d-1].fx){var P=!1;if(b.fx>k.fx?(g(w,1+f,_,-f,k),w.fx=t(w),w.fx<k.fx?i(w):P=!0):(g(w,1-f*c,_,f*c,k),w.fx=t(w),w.fx<b.fx?i(w):P=!0),P){if(p>=1)break;for(y=1;y<v.length;++y)g(v[y],1-p,v[0],p,v[y]),v[y].fx=t(v[y])}}else i(b)}return v.sort(m),{fx:v[0].fx,x:v[0]}}function v(t,e,n,i,r,a,o){function s(s,f,d){for(var v=0;v<16;++v)if(r=(s+f)/2,g(i.x,1,n.x,r,e),c=i.fx=t(i.x,i.fxprime),p=h(i.fxprime,e),c>l+a*r*u||c>=d)f=r;else{if(Math.abs(p)<=-o*u)return r;p*(f-s)>=0&&(f=s),s=r,d=c}return 0}var l=n.fx,u=h(n.fxprime,e),c=l,f=l,p=u,d=0;r=r||1,a=a||1e-6,o=o||.1;for(var v=0;v<10;++v){if(g(i.x,1,n.x,r,e),c=i.fx=t(i.x,i.fxprime),p=h(i.fxprime,e),c>l+a*r*u||v&&c>=f)return s(d,r,f);if(Math.abs(p)<=-o*u)return r;if(p>=0)return s(r,d,c);f=c,d=r,r*=2}return r}function y(t,e,n){var i,r,a,o={x:e.slice(),fx:0,fxprime:e.slice()},s={x:e.slice(),fx:0,fxprime:e.slice()},l=e.slice(),u=1;a=(n=n||{}).maxIterations||20*e.length,o.fx=t(o.x,o.fxprime),p(i=o.fxprime.slice(),o.fxprime,-1);for(var c=0;c<a;++c){if(u=v(t,i,o,s,u),n.history&&n.history.push({x:o.x.slice(),fx:o.fx,fxprime:o.fxprime.slice(),alpha:u}),u){g(l,1,s.fxprime,-1,o.fxprime);var d=h(o.fxprime,o.fxprime);g(i,Math.max(0,h(l,s.fxprime)/d),i,-1,s.fxprime),r=o,o=s,s=r}else p(i,o.fxprime,-1);if(f(o.fxprime)<=1e-5)break}return n.history&&n.history.push({x:o.x.slice(),fx:o.fx,fxprime:o.fxprime.slice(),alpha:u}),o}function x(t,e){(e=e||{}).maxIterations=e.maxIterations||500;var n,i=e.initialLayout||_,r=e.lossFunction||w,a=i(t=function(t){t=t.slice();var e,n,i,r,a=[],o={};for(e=0;e<t.length;++e){var s=t[e];1==s.sets.length?a.push(s.sets[0]):2==s.sets.length&&(i=s.sets[0],r=s.sets[1],o[[i,r]]=!0,o[[r,i]]=!0)}for(a.sort(function(t,e){return t>e}),e=0;e<a.length;++e)for(i=a[e],n=e+1;n<a.length;++n)r=a[n],[i,r]in o||t.push({sets:[i,r],size:0});return t}(t),e),o=[],s=[];for(n in a)a.hasOwnProperty(n)&&(o.push(a[n].x),o.push(a[n].y),s.push(n));for(var l=d(function(e){for(var n={},i=0;i<s.length;++i){var o=s[i];n[o]={x:e[2*i],y:e[2*i+1],radius:a[o].radius}}return r(n,t)},o,e).x,u=0;u<s.length;++u)n=s[u],a[n].x=l[2*u],a[n].y=l[2*u+1];return a}function m(t,e,n){return Math.min(t,e)*Math.min(t,e)*Math.PI<=n+R?Math.abs(t-e):function(t,e,n,i){var r=(i=i||{}).maxIterations||100,a=i.tolerance||1e-10,o=t(e),s=t(n),l=n-e;if(o*s>0)throw"Initial bisect points must have opposite signs";if(0===o)return e;if(0===s)return n;for(var u=0;u<r;++u){var c=e+(l/=2),h=t(c);if(h*o>=0&&(e=c),Math.abs(l)<a||0===h)return c}return e+l}(function(i){return o(t,e,i)-n},0,t+e)}function _(t,e){var n=b(t,e),i=e.lossFunction||w;if(t.length>=8){var r=function(t,e){var n,i=(e=e||{}).restarts||10,r=[],a={};for(n=0;n<t.length;++n){var o=t[n];1==o.sets.length&&(a[o.sets[0]]=r.length,r.push(o))}var s=function(t,e,n){var i=c(e.length,e.length),r=c(e.length,e.length);return t.filter(function(t){return 2==t.sets.length}).map(function(t){var a=n[t.sets[0]],o=n[t.sets[1]],s=m(Math.sqrt(e[a].size/Math.PI),Math.sqrt(e[o].size/Math.PI),t.size);i[a][o]=i[o][a]=s;var l=0;t.size+1e-10>=Math.min(e[a].size,e[o].size)?l=1:t.size<=1e-10&&(l=-1),r[a][o]=r[o][a]=l}),{distances:i,constraints:r}}(t,r,a),l=s.distances,h=s.constraints,g=f(l.map(f))/l.length;l=l.map(function(t){return t.map(function(t){return t/g})});var d,v,x=function(t,e){return function(t,e,n,i){var r,a=0;for(r=0;r<e.length;++r)e[r]=0;for(r=0;r<n.length;++r)for(var o=t[2*r],s=t[2*r+1],l=r+1;l<n.length;++l){var u=t[2*l],c=t[2*l+1],h=n[r][l],f=i[r][l],p=(u-o)*(u-o)+(c-s)*(c-s),g=Math.sqrt(p),d=p-h*h;f>0&&g<=h||f<0&&g>=h||(a+=2*d*d,e[2*r]+=4*d*(o-u),e[2*r+1]+=4*d*(s-c),e[2*l]+=4*d*(u-o),e[2*l+1]+=4*d*(c-s))}return a}(t,e,l,h)};for(n=0;n<i;++n){var _=u(2*l.length).map(Math.random);v=y(x,_,e),(!d||v.fx<d.fx)&&(d=v)}var b=d.x,w={};for(n=0;n<r.length;++n){var S=r[n];w[S.sets[0]]={x:b[2*n]*g,y:b[2*n+1]*g,radius:Math.sqrt(S.size/Math.PI)}}if(e.history)for(n=0;n<e.history.length;++n)p(e.history[n].x,g);return w}(t,e);i(r,t)+1e-8<i(n,t)&&(n=r)}return n}function b(t,e){function n(t,e){return e.size-t.size}function i(t){return t.set in x}function r(t,e){l[e].x=t.x,l[e].y=t.y,x[e]=!0}for(var a,o=e&&e.lossFunction?e.lossFunction:w,l={},u={},c=0;c<t.length;++c){var h=t[c];1==h.sets.length&&(a=h.sets[0],l[a]={x:1e10,y:1e10,rowid:l.length,size:h.size,radius:Math.sqrt(h.size/Math.PI)},u[a]=[])}for(t=t.filter(function(t){return 2==t.sets.length}),c=0;c<t.length;++c){var f=t[c],p=f.hasOwnProperty("weight")?f.weight:1,g=f.sets[0],d=f.sets[1];f.size+R>=Math.min(l[g].size,l[d].size)&&(p=0),u[g].push({set:d,size:f.size,weight:p}),u[d].push({set:g,size:f.size,weight:p})}var v=[];for(a in u)if(u.hasOwnProperty(a)){var y=0;for(c=0;c<u[a].length;++c)y+=u[a][c].size*u[a][c].weight;v.push({set:a,size:y})}v.sort(n);var x={};for(r({x:0,y:0},v[0].set),c=1;c<v.length;++c){var _=v[c].set,b=u[_].filter(i);if(a=l[_],b.sort(n),0===b.length)throw"ERROR: missing pairwise overlap information";for(var S=[],M=0;M<b.length;++M){var C=l[b[M].set],A=m(a.radius,C.radius,b[M].size);S.push({x:C.x+A,y:C.y}),S.push({x:C.x-A,y:C.y}),S.push({y:C.y+A,x:C.x}),S.push({y:C.y-A,x:C.x});for(var k=M+1;k<b.length;++k)for(var P=l[b[k].set],T=m(a.radius,P.radius,b[k].size),I=s({x:C.x,y:C.y,radius:A},{x:P.x,y:P.y,radius:T}),O=0;O<I.length;++O)S.push(I[O])}var L=1e50,E=S[0];for(M=0;M<S.length;++M){l[_].x=S[M].x,l[_].y=S[M].y;var D=o(l,t);D<L&&(L=D,E=S[M])}r(E,_)}return l}function w(t,e){function n(e){return e.map(function(e){return t[e]})}for(var r=0,s=0;s<e.length;++s){var l,u=e[s];if(1!=u.sets.length){if(2==u.sets.length){var c=t[u.sets[0]],h=t[u.sets[1]];l=o(c.radius,h.radius,a(c,h))}else l=i(n(u.sets));r+=(u.hasOwnProperty("weight")?u.weight:1)*(l-u.size)*(l-u.size)}}return r}function S(t,e,n){null===n?t.sort(function(t,e){return e.radius-t.radius}):t.sort(n);var i;if(t.length>0){var r=t[0].x,o=t[0].y;for(i=0;i<t.length;++i)t[i].x-=r,t[i].y-=o}if(2==t.length){a(t[0],t[1])<Math.abs(t[1].radius-t[0].radius)&&(t[1].x=t[0].x+t[0].radius-t[1].radius-1e-10,t[1].y=t[0].y)}if(t.length>1){var s,l,u=Math.atan2(t[1].x,t[1].y)-e,c=Math.cos(u),h=Math.sin(u);for(i=0;i<t.length;++i)s=t[i].x,l=t[i].y,t[i].x=c*s-h*l,t[i].y=h*s+c*l}if(t.length>2){for(var f=Math.atan2(t[2].x,t[2].y)-e;f<0;)f+=2*Math.PI;for(;f>2*Math.PI;)f-=2*Math.PI;if(f>Math.PI){var p=t[1].y/(1e-10+t[1].x);for(i=0;i<t.length;++i){var g=(t[i].x+p*t[i].y)/(1+p*p);t[i].x=2*g-t[i].x,t[i].y=2*g*p-t[i].y}}}}function M(t){function e(t){return t.parent!==t&&(t.parent=e(t.parent)),t.parent}function n(t,n){var i=e(t),r=e(n);i.parent=r}t.map(function(t){t.parent=t});for(var i=0;i<t.length;++i)for(var r=i+1;r<t.length;++r){var o=t[i].radius+t[r].radius;a(t[i],t[r])+1e-10<o&&n(t[r],t[i])}var s,l={};for(i=0;i<t.length;++i)(s=e(t[i]).parent.setid)in l||(l[s]=[]),l[s].push(t[i]);t.map(function(t){delete t.parent});var u=[];for(s in l)l.hasOwnProperty(s)&&u.push(l[s]);return u}function C(t){var e=function(e){return{max:Math.max.apply(null,t.map(function(t){return t[e]+t.radius})),min:Math.min.apply(null,t.map(function(t){return t[e]-t.radius}))}};return{xRange:e("x"),yRange:e("y")}}function A(t,e,n){function i(t,e,n){if(t){var i,r,a,s=t.bounds;e?i=c.xRange.max-s.xRange.min+h:(i=c.xRange.max-s.xRange.max,(a=(s.xRange.max-s.xRange.min)/2-(c.xRange.max-c.xRange.min)/2)<0&&(i+=a)),n?r=c.yRange.max-s.yRange.min+h:(r=c.yRange.max-s.yRange.max,(a=(s.yRange.max-s.yRange.min)/2-(c.yRange.max-c.yRange.min)/2)<0&&(r+=a));for(var l=0;l<t.length;++l)t[l].x+=i,t[l].y+=r,o.push(t[l])}}null===e&&(e=Math.PI/2);var r,a,o=[];for(a in t)if(t.hasOwnProperty(a)){var s=t[a];o.push({x:s.x,y:s.y,radius:s.radius,setid:a})}var l=M(o);for(r=0;r<l.length;++r){S(l[r],e,n);var u=C(l[r]);l[r].size=(u.xRange.max-u.xRange.min)*(u.yRange.max-u.yRange.min),l[r].bounds=u}l.sort(function(t,e){return e.size-t.size});for(var c=(o=l[0]).bounds,h=(c.xRange.max-c.xRange.min)/50,f=1;f<l.length;)i(l[f],!0,!1),i(l[f+1],!1,!0),i(l[f+2],!0,!0),f+=3,c=C(o);var p={};for(r=0;r<o.length;++r)p[o[r].setid]=o[r];return p}function k(t,e,n,i){var r=[],a=[];for(var o in t)t.hasOwnProperty(o)&&(a.push(o),r.push(t[o]));e-=2*i,n-=2*i;var s=C(r),l=s.xRange,u=s.yRange;if(l.max==l.min||u.max==u.min)return console.log("not scaling solution: zero size detected"),t;for(var c=e/(l.max-l.min),h=n/(u.max-u.min),f=Math.min(h,c),p=(e-(l.max-l.min)*f)/2,g=(n-(u.max-u.min)*f)/2,d={},v=0;v<r.length;++v){var y=r[v];d[a[v]]={radius:f*y.radius,x:i+p+(y.x-l.min)*f,y:i+g+(y.y-u.min)*f}}return d}function P(t,n){return function(){for(var i,r=e.select(this),a=r.datum(),o=t[a.sets[0]].radius||50,s=n(a)||"",l=s.split(/\s+/).reverse(),u=(s.length+l.length)/3,c=l.pop(),h=[c],f=0,p=r.text(null).append("tspan").text(c);;){if(!(c=l.pop()))break;h.push(c),i=h.join(" "),p.text(i),i.length>u&&p.node().getComputedTextLength()>o&&(h.pop(),p.text(h.join(" ")),h=[c],p=r.append("tspan").text(c),f++)}var g=.35-1.1*f/2,d=r.attr("x"),v=r.attr("y");r.selectAll("tspan").attr("x",d).attr("y",v).attr("dy",function(t,e){return g+1.1*e+"em"})}}function T(t,e,n){var i,r,o=e[0].radius-a(e[0],t);for(i=1;i<e.length;++i)(r=e[i].radius-a(e[i],t))<=o&&(o=r);for(i=0;i<n.length;++i)(r=a(n[i],t)-n[i].radius)<=o&&(o=r);return o}function I(t,e){var n,r=[];for(n=0;n<t.length;++n){var o=t[n];r.push({x:o.x,y:o.y}),r.push({x:o.x+o.radius/2,y:o.y}),r.push({x:o.x-o.radius/2,y:o.y}),r.push({x:o.x,y:o.y+o.radius/2}),r.push({x:o.x,y:o.y-o.radius/2})}var s=r[0],u=T(r[0],t,e);for(n=1;n<r.length;++n){var c=T(r[n],t,e);c>=u&&(s=r[n],u=c)}var h=d(function(n){return-1*T({x:n[0],y:n[1]},t,e)},[s.x,s.y],{maxIterations:500,minErrorDelta:1e-10}).x,f={x:h[0],y:h[1]},p=!0;for(n=0;n<t.length;++n)if(a(f,t[n])>t[n].radius){p=!1;break}for(n=0;n<e.length;++n)if(a(f,e[n])<e[n].radius){p=!1;break}if(!p)if(1==t.length)f={x:t[0].x,y:t[0].y};else{var g={};i(t,g),f=0===g.arcs.length?{x:0,y:-1e3,disjoint:!0}:1==g.arcs.length?{x:g.arcs[0].circle.x,y:g.arcs[0].circle.y}:e.length?I(t,[]):l(g.arcs.map(function(t){return t.p1}))}return f}function O(t){var e={},n=[];for(var i in t)n.push(i),e[i]=[];for(var r=0;r<n.length;r++)for(var o=t[n[r]],s=r+1;s<n.length;++s){var l=t[n[s]],u=a(o,l);u+l.radius<=o.radius+1e-10?e[n[s]].push(n[r]):u+o.radius<=l.radius+1e-10&&e[n[r]].push(n[s])}return e}function L(t,e){for(var n={},i=O(t),r=0;r<e.length;++r){for(var a=e[r].sets,o={},s={},l=0;l<a.length;++l){o[a[l]]=!0;for(var u=i[a[l]],c=0;c<u.length;++c)s[u[c]]=!0}var h=[],f=[];for(var p in t)p in o?h.push(t[p]):p in s||f.push(t[p]);var g=I(h,f);n[a]=g,g.disjoint&&e[r].size>0&&console.log("WARNING: area "+a+" not represented on screen")}return n}function E(t,e,n){var i=[];return i.push("\nM",t,e),i.push("\nm",-n,0),i.push("\na",n,n,0,1,0,2*n,0),i.push("\na",n,n,0,1,0,2*-n,0),i.join(" ")}function D(t){var e=t.split(" ");return{x:parseFloat(e[1]),y:parseFloat(e[2]),radius:-parseFloat(e[4])}}function F(t){var e={};i(t,e);var n=e.arcs;if(0===n.length)return"M 0 0";if(1==n.length){var r=n[0].circle;return E(r.x,r.y,r.radius)}for(var a=["\nM",n[0].p2.x,n[0].p2.y],o=0;o<n.length;++o){var s=n[o],l=s.circle.radius,u=s.width>l;a.push("\nA",l,l,0,u?1:0,1,s.p1.x,s.p1.y)}return a.join(" ")}var B=1e-10,R=1e-10;t.intersectionArea=i,t.circleCircleIntersection=s,t.circleOverlap=o,t.circleArea=r,t.distance=a,t.venn=x,t.greedyLayout=b,t.scaleSolution=k,t.normalizeSolution=A,t.bestInitialLayout=_,t.lossFunction=w,t.disjointCluster=M,t.distanceFromIntersectArea=m,t.VennDiagram=function(){function t(t){function f(t){return t.sets in b?b[t.sets]:1==t.sets.length?""+t.sets[0]:void 0}var p=t.datum(),g={};p.forEach(function(t){0==t.size&&1==t.sets.length&&(g[t.sets[0]]=1)});var x={},m={};if((p=p.filter(function(t){return!t.sets.some(function(t){return t in g})})).length>0){var _=v(p,{lossFunction:y});s&&(_=A(_,o,h)),x=k(_,n,i,r),m=L(x,p)}var b={};p.forEach(function(t){t.label&&(b[t.sets]=t.label)}),t.selectAll("svg").data([x]).enter().append("svg");var w=t.select("svg").attr("width",n).attr("height",i),S={},M=!1;w.selectAll(".venn-area path").each(function(t){var n=e.select(this).attr("d");1==t.sets.length&&n&&(M=!0,S[t.sets[0]]=D(n))});var C=function(t){return function(e){return F(t.sets.map(function(t){var r=S[t],a=x[t];return r||(r={x:n/2,y:i/2,radius:1}),a||(a={x:n/2,y:i/2,radius:1}),{x:r.x*(1-e)+a.x*e,y:r.y*(1-e)+a.y*e,radius:r.radius*(1-e)+a.radius*e}}))}},T=w.selectAll(".venn-area").data(p,function(t){return t.sets}),I=T.enter().append("g").attr("class",function(t){return"venn-area venn-"+(1==t.sets.length?"circle":"intersection")}).attr("data-venn-sets",function(t){return t.sets.join("_")}),O=I.append("path"),E=I.append("text").attr("class","label").text(function(t){return f(t)}).attr("text-anchor","middle").attr("dy",".35em").attr("x",n/2).attr("y",i/2);u&&(O.style("fill-opacity","0").filter(function(t){return 1==t.sets.length}).style("fill",function(t){return d(t.sets)}).style("fill-opacity",".25"),E.style("fill",function(t){return 1==t.sets.length?d(t.sets):"#444"}));var B=t;M?(B=t.transition("venn").duration(a)).selectAll("path").attrTween("d",C):B.selectAll("path").attr("d",function(t){return F(t.sets.map(function(t){return x[t]}))});var R=B.selectAll("text").filter(function(t){return t.sets in m}).text(function(t){return f(t)}).attr("x",function(t){return Math.floor(m[t.sets].x)}).attr("y",function(t){return Math.floor(m[t.sets].y)});l&&(M?"on"in R?R.on("end",P(x,f)):R.each("end",P(x,f)):R.each(P(x,f)));var j=T.exit().transition("venn").duration(a).remove();j.selectAll("path").attrTween("d",C);var N=j.selectAll("text").attr("x",n/2).attr("y",i/2);return null!==c&&(E.style("font-size","0px"),R.style("font-size",c),N.style("font-size","0px")),{circles:x,textCentres:m,nodes:T,enter:I,update:B,exit:j}}var n=600,i=350,r=15,a=1e3,o=Math.PI/2,s=!0,l=!0,u=!0,c=null,h=null,f={},p=["#1f77b4","#ff7f0e","#2ca02c","#d62728","#9467bd","#8c564b","#e377c2","#7f7f7f","#bcbd22","#17becf"],g=0,d=function(t){if(t in f)return f[t];var e=f[t]=p[g];return(g+=1)>=p.length&&(g=0),e},v=x,y=w;return t.wrap=function(e){return arguments.length?(l=e,t):l},t.width=function(e){return arguments.length?(n=e,t):n},t.height=function(e){return arguments.length?(i=e,t):i},t.padding=function(e){return arguments.length?(r=e,t):r},t.colours=function(e){return arguments.length?(d=e,t):d},t.fontSize=function(e){return arguments.length?(c=e,t):c},t.duration=function(e){return arguments.length?(a=e,t):a},t.layoutFunction=function(e){return arguments.length?(v=e,t):v},t.normalize=function(e){return arguments.length?(s=e,t):s},t.styled=function(e){return arguments.length?(u=e,t):u},t.orientation=function(e){return arguments.length?(o=e,t):o},t.orientationOrder=function(e){return arguments.length?(h=e,t):h},t.lossFunction=function(e){return arguments.length?(y=e,t):y},t},t.wrapText=P,t.computeTextCentres=L,t.computeTextCentre=I,t.sortAreas=function(t,e){function n(t){for(var e=0;e<t.length;++e)if(!(t[e]in r))return!1;return!0}for(var i=O(t.selectAll("svg").datum()),r={},a=0;a<e.sets.length;++a){var o=e.sets[a];for(var s in i)for(var l=i[s],u=0;u<l.length;++u)if(l[u]==o){r[s]=!0;break}}t.selectAll("g").sort(function(t,i){return t.sets.length!=i.sets.length?t.sets.length-i.sets.length:t==e?n(i.sets)?-1:1:i==e?n(t.sets)?1:-1:i.size-t.size})},t.circlePath=E,t.circleFromPath=D,t.intersectionAreaPath=F,Object.defineProperty(t,"__esModule",{value:!0})})},function(t,e,n){"use strict";var i=n(360),r=n(379);e.a=function(t){return Object(r.a)(Object(i.a)(t).call(document.documentElement))}},function(t,e,n){"use strict";var i=n(69),r=n(372);e.a=function(t){"function"!=typeof t&&(t=Object(r.a)(t));for(var e=this._groups,n=e.length,a=new Array(n),o=0;o<n;++o)for(var s,l,u=e[o],c=u.length,h=a[o]=new Array(c),f=0;f<c;++f)(s=u[f])&&(l=t.call(s,s.__data__,f,u))&&("__data__"in s&&(l.__data__=s.__data__),h[f]=l);return new i.a(a,this._parents)}},function(t,e,n){"use strict";var i=n(69),r=n(380);e.a=function(t){"function"!=typeof t&&(t=Object(r.a)(t));for(var e=this._groups,n=e.length,a=[],o=[],s=0;s<n;++s)for(var l,u=e[s],c=u.length,h=0;h<c;++h)(l=u[h])&&(a.push(t.call(l,l.__data__,h,u)),o.push(l));return new i.a(a,o)}},function(t,e,n){"use strict";var i=n(69),r=n(381);e.a=function(t){"function"!=typeof t&&(t=Object(r.a)(t));for(var e=this._groups,n=e.length,a=new Array(n),o=0;o<n;++o)for(var s,l=e[o],u=l.length,c=a[o]=[],h=0;h<u;++h)(s=l[h])&&t.call(s,s.__data__,h,l)&&c.push(s);return new i.a(a,this._parents)}},function(t,e,n){"use strict";var i=n(69),r=n(382),a=n(406),o="$";e.a=function(t,e){if(!t)return y=new Array(this.size()),p=-1,this.each(function(t){y[++p]=t}),y;var n=e?function(t,e,n,i,a,s,l){var u,c,h,f={},p=e.length,g=s.length,d=new Array(p);for(u=0;u<p;++u)(c=e[u])&&(d[u]=h=o+l.call(c,c.__data__,u,e),h in f?a[u]=c:f[h]=c);for(u=0;u<g;++u)(c=f[h=o+l.call(t,s[u],u,s)])?(i[u]=c,c.__data__=s[u],f[h]=null):n[u]=new r.a(t,s[u]);for(u=0;u<p;++u)(c=e[u])&&f[d[u]]===c&&(a[u]=c)}:function(t,e,n,i,a,o){for(var s,l=0,u=e.length,c=o.length;l<c;++l)(s=e[l])?(s.__data__=o[l],i[l]=s):n[l]=new r.a(t,o[l]);for(;l<u;++l)(s=e[l])&&(a[l]=s)},s=this._parents,l=this._groups;"function"!=typeof t&&(t=Object(a.a)(t));for(var u=l.length,c=new Array(u),h=new Array(u),f=new Array(u),p=0;p<u;++p){var g=s[p],d=l[p],v=d.length,y=t.call(g,g&&g.__data__,p,s),x=y.length,m=h[p]=new Array(x),_=c[p]=new Array(x);n(g,d,m,_,f[p]=new Array(v),y,e);for(var b,w,S=0,M=0;S<x;++S)if(b=m[S]){for(S>=M&&(M=S+1);!(w=_[M])&&++M<x;);b._next=w||null}}return c=new i.a(c,s),c._enter=h,c._exit=f,c}},function(t,e,n){"use strict";e.a=function(t){return function(){return t}}},function(t,e,n){"use strict";var i=n(383),r=n(69);e.a=function(){return new r.a(this._exit||this._groups.map(i.a),this._parents)}},function(t,e,n){"use strict";var i=n(69);e.a=function(t){for(var e=this._groups,n=t._groups,r=e.length,a=n.length,o=Math.min(r,a),s=new Array(r),l=0;l<o;++l)for(var u,c=e[l],h=n[l],f=c.length,p=s[l]=new Array(f),g=0;g<f;++g)(u=c[g]||h[g])&&(p[g]=u);for(;l<r;++l)s[l]=e[l];return new i.a(s,this._parents)}},function(t,e,n){"use strict";e.a=function(){for(var t=this._groups,e=-1,n=t.length;++e<n;)for(var i,r=t[e],a=r.length-1,o=r[a];--a>=0;)(i=r[a])&&(o&&o!==i.nextSibling&&o.parentNode.insertBefore(i,o),o=i);return this}},function(t,e,n){"use strict";function i(t,e){return t<e?-1:t>e?1:t>=e?0:NaN}var r=n(69);e.a=function(t){function e(e,n){return e&&n?t(e.__data__,n.__data__):!e-!n}t||(t=i);for(var n=this._groups,a=n.length,o=new Array(a),s=0;s<a;++s){for(var l,u=n[s],c=u.length,h=o[s]=new Array(c),f=0;f<c;++f)(l=u[f])&&(h[f]=l);h.sort(e)}return new r.a(o,this._parents).order()}},function(t,e,n){"use strict";e.a=function(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this}},function(t,e,n){"use strict";e.a=function(){var t=new Array(this.size()),e=-1;return this.each(function(){t[++e]=this}),t}},function(t,e,n){"use strict";e.a=function(){for(var t=this._groups,e=0,n=t.length;e<n;++e)for(var i=t[e],r=0,a=i.length;r<a;++r){var o=i[r];if(o)return o}return null}},function(t,e,n){"use strict";e.a=function(){var t=0;return this.each(function(){++t}),t}},function(t,e,n){"use strict";e.a=function(){return!this.node()}},function(t,e,n){"use strict";e.a=function(t){for(var e=this._groups,n=0,i=e.length;n<i;++n)for(var r,a=e[n],o=0,s=a.length;o<s;++o)(r=a[o])&&t.call(r,r.__data__,o,a);return this}},function(t,e,n){"use strict";var i=n(370);e.a=function(t,e){var n=Object(i.a)(t);if(arguments.length<2){var r=this.node();return n.local?r.getAttributeNS(n.space,n.local):r.getAttribute(n)}return this.each((null==e?n.local?function(t){return function(){this.removeAttributeNS(t.space,t.local)}}:function(t){return function(){this.removeAttribute(t)}}:"function"==typeof e?n.local?function(t,e){return function(){var n=e.apply(this,arguments);null==n?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,n)}}:function(t,e){return function(){var n=e.apply(this,arguments);null==n?this.removeAttribute(t):this.setAttribute(t,n)}}:n.local?function(t,e){return function(){this.setAttributeNS(t.space,t.local,e)}}:function(t,e){return function(){this.setAttribute(t,e)}})(n,e))}},function(t,e,n){"use strict";e.a=function(t,e){return arguments.length>1?this.each((null==e?function(t){return function(){delete this[t]}}:"function"==typeof e?function(t,e){return function(){var n=e.apply(this,arguments);null==n?delete this[t]:this[t]=n}}:function(t,e){return function(){this[t]=e}})(t,e)):this.node()[t]}},function(t,e,n){"use strict";function i(t){return t.trim().split(/^|\s+/)}function r(t){return t.classList||new a(t)}function a(t){this._node=t,this._names=i(t.getAttribute("class")||"")}function o(t,e){for(var n=r(t),i=-1,a=e.length;++i<a;)n.add(e[i])}function s(t,e){for(var n=r(t),i=-1,a=e.length;++i<a;)n.remove(e[i])}a.prototype={add:function(t){this._names.indexOf(t)<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},remove:function(t){var e=this._names.indexOf(t);e>=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}},e.a=function(t,e){var n=i(t+"");if(arguments.length<2){for(var a=r(this.node()),l=-1,u=n.length;++l<u;)if(!a.contains(n[l]))return!1;return!0}return this.each(("function"==typeof e?function(t,e){return function(){(e.apply(this,arguments)?o:s)(this,t)}}:e?function(t){return function(){o(this,t)}}:function(t){return function(){s(this,t)}})(n,e))}},function(t,e,n){"use strict";e.a=function(t){return arguments.length?this.each(null==t?function(){this.textContent=""}:("function"==typeof t?function(t){return function(){var e=t.apply(this,arguments);this.textContent=null==e?"":e}}:function(t){return function(){this.textContent=t}})(t)):this.node().textContent}},function(t,e,n){"use strict";e.a=function(t){return arguments.length?this.each(null==t?function(){this.innerHTML=""}:("function"==typeof t?function(t){return function(){var e=t.apply(this,arguments);this.innerHTML=null==e?"":e}}:function(t){return function(){this.innerHTML=t}})(t)):this.node().innerHTML}},function(t,e,n){"use strict";function i(){this.nextSibling&&this.parentNode.appendChild(this)}e.a=function(){return this.each(i)}},function(t,e,n){"use strict";function i(){this.previousSibling&&this.parentNode.insertBefore(this,this.parentNode.firstChild)}e.a=function(){return this.each(i)}},function(t,e,n){"use strict";var i=n(360);e.a=function(t){var e="function"==typeof t?t:Object(i.a)(t);return this.select(function(){return this.appendChild(e.apply(this,arguments))})}},function(t,e,n){"use strict";var i=n(360),r=n(372);e.a=function(t,e){var n="function"==typeof t?t:Object(i.a)(t),a=null==e?function(){return null}:"function"==typeof e?e:Object(r.a)(e);return this.select(function(){return this.insertBefore(n.apply(this,arguments),a.apply(this,arguments)||null)})}},function(t,e,n){"use strict";function i(){var t=this.parentNode;t&&t.removeChild(this)}e.a=function(){return this.each(i)}},function(t,e,n){"use strict";e.a=function(t){return this.select(t?function(){return this.parentNode.insertBefore(this.cloneNode(!0),this.nextSibling)}:function(){return this.parentNode.insertBefore(this.cloneNode(!1),this.nextSibling)})}},function(t,e,n){"use strict";e.a=function(t){return arguments.length?this.property("__data__",t):this.node().__data__}},function(t,e,n){"use strict";function i(t,e,n){var i=Object(r.a)(t),a=i.CustomEvent;"function"==typeof a?a=new a(e,n):(a=i.document.createEvent("Event"),n?(a.initEvent(e,n.bubbles,n.cancelable),a.detail=n.detail):a.initEvent(e,!1,!1)),t.dispatchEvent(a)}var r=n(373);e.a=function(t,e){return this.each(("function"==typeof e?function(t,e){return function(){return i(this,t,e.apply(this,arguments))}}:function(t,e){return function(){return i(this,t,e)}})(t,e))}},function(t,e,n){"use strict";function i(){return new r}function r(){this._="@"+(++a).toString(36)}e.a=i;var a=0;r.prototype=i.prototype={constructor:r,get:function(t){for(var e=this._;!(e in t);)if(!(t=t.parentNode))return;return t[e]},set:function(t,e){return t[this._]=e},remove:function(t){return this._ in t&&delete t[this._]},toString:function(){return this._}}},function(t,e,n){"use strict";var i=n(375),r=n(361);e.a=function(t){var e=Object(i.a)();return e.changedTouches&&(e=e.changedTouches[0]),Object(r.a)(t,e)}},function(t,e,n){"use strict";var i=n(69);e.a=function(t){return"string"==typeof t?new i.a([document.querySelectorAll(t)],[document.documentElement]):new i.a([null==t?[]:t],i.c)}},function(t,e,n){"use strict";var i=n(375),r=n(361);e.a=function(t,e,n){arguments.length<3&&(n=e,e=Object(i.a)().changedTouches);for(var a,o=0,s=e?e.length:0;o<s;++o)if((a=e[o]).identifier===n)return Object(r.a)(t,a);return null}},function(t,e,n){"use strict";var i=n(375),r=n(361);e.a=function(t,e){null==e&&(e=Object(i.a)().touches);for(var n=0,a=e?e.length:0,o=new Array(a);n<a;++n)o[n]=Object(r.a)(t,e[n]);return o}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});n(436);var i=n(169);n.d(e,"transition",function(){return i.b});var r=n(457);n.d(e,"active",function(){return r.a});var a=n(385);n.d(e,"interrupt",function(){return a.a})},function(t,e,n){"use strict";var i=n(72),r=n(437),a=n(440);i.selection.prototype.interrupt=r.a,i.selection.prototype.transition=a.a},function(t,e,n){"use strict";var i=n(385);e.a=function(t){return this.each(function(){Object(i.a)(this,t)})}},function(t,e,n){"use strict";var i=n(439);n.d(e,"a",function(){return i.a})},function(t,e,n){"use strict";function i(){for(var t,e=0,n=arguments.length,i={};e<n;++e){if(!(t=arguments[e]+"")||t in i)throw new Error("illegal type: "+t);i[t]=[]}return new r(i)}function r(t){this._=t}function a(t,e,n){for(var i=0,r=t.length;i<r;++i)if(t[i].name===e){t[i]=o,t=t.slice(0,i).concat(t.slice(i+1));break}return null!=n&&t.push({name:e,value:n}),t}var o={value:function(){}};r.prototype=i.prototype={constructor:r,on:function(t,e){var n,i=this._,r=function(t,e){return t.trim().split(/^|\s+/).map(function(t){var n="",i=t.indexOf(".");if(i>=0&&(n=t.slice(i+1),t=t.slice(0,i)),t&&!e.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:n}})}(t+"",i),o=-1,s=r.length;{if(!(arguments.length<2)){if(null!=e&&"function"!=typeof e)throw new Error("invalid callback: "+e);for(;++o<s;)if(n=(t=r[o]).type)i[n]=a(i[n],t.name,e);else if(null==e)for(n in i)i[n]=a(i[n],t.name,null);return this}for(;++o<s;)if((n=(t=r[o]).type)&&(n=function(t,e){for(var n,i=0,r=t.length;i<r;++i)if((n=t[i]).name===e)return n.value}(i[n],t.name)))return n}},copy:function(){var t={},e=this._;for(var n in e)t[n]=e[n].slice();return new r(t)},call:function(t,e){if((n=arguments.length-2)>0)for(var n,i,r=new Array(n),a=0;a<n;++a)r[a]=arguments[a+2];if(!this._.hasOwnProperty(t))throw new Error("unknown type: "+t);for(a=0,n=(i=this._[t]).length;a<n;++a)i[a].value.apply(e,r)},apply:function(t,e,n){if(!this._.hasOwnProperty(t))throw new Error("unknown type: "+t);for(var i=this._[t],r=0,a=i.length;r<a;++r)i[r].value.apply(e,n)}},e.a=i},function(t,e,n){"use strict";function i(t,e){for(var n;!(n=t.__transition)||!(n=n[e]);)if(!(t=t.parentNode))return l.time=Object(s.now)(),l;return n}var r=n(169),a=n(70),o=n(173),s=n(170),l={time:null,delay:0,duration:250,ease:o.easeCubicInOut};e.a=function(t){var e,n;t instanceof r.a?(e=t._id,t=t._name):(e=Object(r.c)(),(n=l).time=Object(s.now)(),t=null==t?null:t+"");for(var o=this._groups,u=o.length,c=0;c<u;++c)for(var h,f=o[c],p=f.length,g=0;g<p;++g)(h=f[g])&&Object(a.e)(h,t,e,g,f,n||i(h,e));return new r.a(o,this._parents,t,e)}},function(t,e,n){"use strict";var i=n(117),r=n(72),a=n(362),o=n(386);e.a=function(t,e){var n=Object(r.namespace)(t),s="transform"===n?i.interpolateTransformSvg:o.a;return this.attrTween(t,"function"==typeof e?(n.local?function(t,e,n){var i,r,a;return function(){var o,s=n(this);if(null!=s)return(o=this.getAttributeNS(t.space,t.local))===s?null:o===i&&s===r?a:a=e(i=o,r=s);this.removeAttributeNS(t.space,t.local)}}:function(t,e,n){var i,r,a;return function(){var o,s=n(this);if(null!=s)return(o=this.getAttribute(t))===s?null:o===i&&s===r?a:a=e(i=o,r=s);this.removeAttribute(t)}})(n,s,Object(a.b)(this,"attr."+t,e)):null==e?(n.local?function(t){return function(){this.removeAttributeNS(t.space,t.local)}}:function(t){return function(){this.removeAttribute(t)}})(n):(n.local?function(t,e,n){var i,r;return function(){var a=this.getAttributeNS(t.space,t.local);return a===n?null:a===i?r:r=e(i=a,n)}}:function(t,e,n){var i,r;return function(){var a=this.getAttribute(t);return a===n?null:a===i?r:r=e(i=a,n)}})(n,s,e+""))}},function(t,e,n){"use strict";var i=n(72);e.a=function(t,e){var n="attr."+t;if(arguments.length<2)return(n=this.tween(n))&&n._value;if(null==e)return this.tween(n,null);if("function"!=typeof e)throw new Error;var r=Object(i.namespace)(t);return this.tween(n,(r.local?function(t,e){function n(){var n=this,i=e.apply(n,arguments);return i&&function(e){n.setAttributeNS(t.space,t.local,i(e))}}return n._value=e,n}:function(t,e){function n(){var n=this,i=e.apply(n,arguments);return i&&function(e){n.setAttribute(t,i(e))}}return n._value=e,n})(r,e))}},function(t,e,n){"use strict";var i=n(70);e.a=function(t){var e=this._id;return arguments.length?this.each(("function"==typeof t?function(t,e){return function(){Object(i.g)(this,t).delay=+e.apply(this,arguments)}}:function(t,e){return e=+e,function(){Object(i.g)(this,t).delay=e}})(e,t)):Object(i.f)(this.node(),e).delay}},function(t,e,n){"use strict";var i=n(70);e.a=function(t){var e=this._id;return arguments.length?this.each(("function"==typeof t?function(t,e){return function(){Object(i.h)(this,t).duration=+e.apply(this,arguments)}}:function(t,e){return e=+e,function(){Object(i.h)(this,t).duration=e}})(e,t)):Object(i.f)(this.node(),e).duration}},function(t,e,n){"use strict";var i=n(70);e.a=function(t){var e=this._id;return arguments.length?this.each(function(t,e){if("function"!=typeof e)throw new Error;return function(){Object(i.h)(this,t).ease=e}}(e,t)):Object(i.f)(this.node(),e).ease}},function(t,e,n){"use strict";var i=n(72),r=n(169);e.a=function(t){"function"!=typeof t&&(t=Object(i.matcher)(t));for(var e=this._groups,n=e.length,a=new Array(n),o=0;o<n;++o)for(var s,l=e[o],u=l.length,c=a[o]=[],h=0;h<u;++h)(s=l[h])&&t.call(s,s.__data__,h,l)&&c.push(s);return new r.a(a,this._parents,this._name,this._id)}},function(t,e,n){"use strict";var i=n(169);e.a=function(t){if(t._id!==this._id)throw new Error;for(var e=this._groups,n=t._groups,r=e.length,a=n.length,o=Math.min(r,a),s=new Array(r),l=0;l<o;++l)for(var u,c=e[l],h=n[l],f=c.length,p=s[l]=new Array(f),g=0;g<f;++g)(u=c[g]||h[g])&&(p[g]=u);for(;l<r;++l)s[l]=e[l];return new i.a(s,this._parents,this._name,this._id)}},function(t,e,n){"use strict";var i=n(70);e.a=function(t,e){var n=this._id;return arguments.length<2?Object(i.f)(this.node(),n).on.on(t):this.each(function(t,e,n){var r,a,o=function(t){return(t+"").trim().split(/^|\s+/).every(function(t){var e=t.indexOf(".");return e>=0&&(t=t.slice(0,e)),!t||"start"===t})}(e)?i.g:i.h;return function(){var i=o(this,t),s=i.on;s!==r&&(a=(r=s).copy()).on(e,n),i.on=a}}(n,t,e))}},function(t,e,n){"use strict";e.a=function(){return this.on("end.remove",function(t){return function(){var e=this.parentNode;for(var n in this.__transition)if(+n!==t)return;e&&e.removeChild(this)}}(this._id))}},function(t,e,n){"use strict";var i=n(72),r=n(169),a=n(70);e.a=function(t){var e=this._name,n=this._id;"function"!=typeof t&&(t=Object(i.selector)(t));for(var o=this._groups,s=o.length,l=new Array(s),u=0;u<s;++u)for(var c,h,f=o[u],p=f.length,g=l[u]=new Array(p),d=0;d<p;++d)(c=f[d])&&(h=t.call(c,c.__data__,d,f))&&("__data__"in c&&(h.__data__=c.__data__),g[d]=h,Object(a.e)(g[d],e,n,d,g,Object(a.f)(c,n)));return new r.a(l,this._parents,e,n)}},function(t,e,n){"use strict";var i=n(72),r=n(169),a=n(70);e.a=function(t){var e=this._name,n=this._id;"function"!=typeof t&&(t=Object(i.selectorAll)(t));for(var o=this._groups,s=o.length,l=[],u=[],c=0;c<s;++c)for(var h,f=o[c],p=f.length,g=0;g<p;++g)if(h=f[g]){for(var d,v=t.call(h,h.__data__,g,f),y=Object(a.f)(h,n),x=0,m=v.length;x<m;++x)(d=v[x])&&Object(a.e)(d,e,n,x,v,y);l.push(v),u.push(h)}return new r.a(l,u,e,n)}},function(t,e,n){"use strict";var i=n(72).selection.prototype.constructor;e.a=function(){return new i(this._groups,this._parents)}},function(t,e,n){"use strict";var i=n(117),r=n(72),a=n(362),o=n(386);e.a=function(t,e,n){var s="transform"==(t+="")?i.interpolateTransformCss:o.a;return null==e?this.styleTween(t,function(t,e){var n,i,a;return function(){var o=Object(r.style)(this,t),s=(this.style.removeProperty(t),Object(r.style)(this,t));return o===s?null:o===n&&s===i?a:a=e(n=o,i=s)}}(t,s)).on("end.style."+t,function(t){return function(){this.style.removeProperty(t)}}(t)):this.styleTween(t,"function"==typeof e?function(t,e,n){var i,a,o;return function(){var s=Object(r.style)(this,t),l=n(this);return null==l&&(this.style.removeProperty(t),l=Object(r.style)(this,t)),s===l?null:s===i&&l===a?o:o=e(i=s,a=l)}}(t,s,Object(a.b)(this,"style."+t,e)):function(t,e,n){var i,a;return function(){var o=Object(r.style)(this,t);return o===n?null:o===i?a:a=e(i=o,n)}}(t,s,e+""),n)}},function(t,e,n){"use strict";e.a=function(t,e,n){var i="style."+(t+="");if(arguments.length<2)return(i=this.tween(i))&&i._value;if(null==e)return this.tween(i,null);if("function"!=typeof e)throw new Error;return this.tween(i,function(t,e,n){function i(){var i=this,r=e.apply(i,arguments);return r&&function(e){i.style.setProperty(t,r(e),n)}}return i._value=e,i}(t,e,null==n?"":n))}},function(t,e,n){"use strict";var i=n(362);e.a=function(t){return this.tween("text","function"==typeof t?function(t){return function(){var e=t(this);this.textContent=null==e?"":e}}(Object(i.b)(this,"text",t)):function(t){return function(){this.textContent=t}}(null==t?"":t+""))}},function(t,e,n){"use strict";var i=n(169),r=n(70);e.a=function(){for(var t=this._name,e=this._id,n=Object(i.c)(),a=this._groups,o=a.length,s=0;s<o;++s)for(var l,u=a[s],c=u.length,h=0;h<c;++h)if(l=u[h]){var f=Object(r.f)(l,e);Object(r.e)(l,t,n,h,u,{time:f.time+f.delay+f.duration,delay:0,duration:f.duration,ease:f.ease})}return new i.a(a,this._parents,t,n)}},function(t,e,n){"use strict";var i=n(169),r=n(70),a=[null];e.a=function(t,e){var n,o,s=t.__transition;if(s){e=null==e?null:e+"";for(o in s)if((n=s[o]).state>r.c&&n.name===e)return new i.a([[t]],a,e,+o)}return null}},function(t,e,n){function i(t){var e=s.shape.venn,n=r.mix({},e,t.style);return o.addFillAttrs(n,t),n}var r=n(0),a=n(18),o=n(45),s=n(7),l=r.PathUtil,u=a.registerFactory("venn",{defaultShapeType:"venn",getDefaultPoints:function(t){var e=[];return r.each(t.x,function(n,i){var r=t.y[i];e.push({x:n,y:r})}),e},getActiveCfg:function(t,e){var n=e.lineWidth||1;if("hollow"===t)return{lineWidth:n+1};return{fillOpacity:(e.fillOpacity||e.opacity||1)-.08}},getSelectedCfg:function(t,e){return e&&e.style?e.style:this.getActiveCfg(t,e)}});a.registerShape("venn","venn",{draw:function(t,e){var n=t.origin._origin.path,a=i(t),o=l.parsePathString(n);return e.addShape("path",{attrs:r.mix(a,{path:o})})},getMarkerCfg:function(t){return r.mix({symbol:"circle",radius:4},i(t))}}),a.registerShape("venn","hollow",{draw:function(t,e){var n=t.origin._origin.path,i=function(t){var e=s.shape.hollowVenn,n=r.mix({},e,t.style);return o.addStrokeAttrs(n,t),n}(t),a=l.parsePathString(n);return e.addShape("path",{attrs:r.mix(i,{path:a})})},getMarkerCfg:function(t){return r.mix({symbol:"circle",radius:4},i(t))}}),t.exports=u},function(t,e,n){function i(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}function r(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}var a=n(20),o=n(0),s=n(357);n(460);var l=function(t){function e(e){var n;return n=t.call(this,e)||this,o.assign(r(r(n)),s),n}i(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.type="violin",e.shapeType="violin",e.generatePoints=!0,e},n.createShapePointsCfg=function(e){var n=t.prototype.createShapePointsCfg.call(this,e);n.size=this.getNormalizedSize(e);var i=this.get("_sizeField");return n._size=e._origin[i],n},n.clearInner=function(){t.prototype.clearInner.call(this),this.set("defaultSize",null)},n._initAttrs=function(){var e=this.get("attrOptions"),n=e.size?e.size.field:this.get("_sizeField")?this.get("_sizeField"):"size";this.set("_sizeField",n),delete e.size,t.prototype._initAttrs.call(this)},e}(a),u=function(t){function e(){return t.apply(this,arguments)||this}i(e,t);return e.prototype.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.hasDefaultAdjust=!0,e.adjusts=[{type:"dodge"}],e},e}(l);l.Dodge=u,a.Violin=l,a.ViolinDodge=u,t.exports=l},function(t,e,n){function i(t){var e=c.shape.venn,n=s.mix({},e,t.style);return u.addFillAttrs(n,t),t.color&&(n.stroke=n.stroke||t.color),n}function r(t){var e=c.shape.hollowVenn,n=s.mix({},e,t.style);return u.addStrokeAttrs(n,t),n}function a(t){for(var e=[],n=0;n<t.length;n++){var i=t[n];if(i){var r=0===n?"M":"L";e.push([r,i.x,i.y])}}var a=t[0];return a&&(e.push(["L",a.x,a.y]),e.push(["z"])),e}function o(t){for(var e=t.length/2,n=[],i=[],r=0;r<t.length;r++)r<e?n.push(t[r]):i.push(t[r]);var a=h.getSplinePath(n,!1),o=h.getSplinePath(i,!1);a.push(["L",i[0].x,i[0].y]),o.shift();var s=a.concat(o);return s.push(["L",n[0].x,n[0].y]),s.push(["z"]),s}var s=n(0),l=n(18),u=n(45),c=n(7),h=n(22),f=l.registerFactory("violin",{defaultShapeType:"violin",getDefaultPoints:function(t){var e=t.size/2,n=[],i=function(t){var e=Math.max.apply(null,t);return t.map(function(t){return t/e})}(t._size);return s.each(t.y,function(r,a){var o=i[a]*e,s=0===a,l=a===t.y.length-1;n.push({isMin:s,isMax:l,x:t.x-o,y:r}),n.unshift({isMin:s,isMax:l,x:t.x+o,y:r})}),n},getActiveCfg:function(t,e){var n=e.lineWidth||1;if("hollow"===t)return{lineWidth:n+1};return{fillOpacity:(e.fillOpacity||e.opacity||1)-.08}},getSelectedCfg:function(t,e){return e&&e.style?e.style:this.getActiveCfg(t,e)}});l.registerShape("violin","violin",{draw:function(t,e){var n=i(t),r=a(t.points);r=this.parsePath(r);return e.addShape("path",{attrs:s.mix(n,{path:r})})},getMarkerCfg:function(t){return s.mix({symbol:"circle",radius:4},i(t))}}),l.registerShape("violin","smooth",{draw:function(t,e){var n=i(t),r=o(t.points);r=this.parsePath(r);return e.addShape("path",{attrs:s.mix(n,{path:r})})},getMarkerCfg:function(t){return s.mix({symbol:"circle",radius:4},i(t))}}),l.registerShape("violin","hollow",{draw:function(t,e){var n=r(t),i=a(t.points);i=this.parsePath(i);return e.addShape("path",{attrs:s.mix(n,{path:i})})},getMarkerCfg:function(t){return s.mix({symbol:"circle",radius:4},r(t))}}),l.registerShape("violin","smoothHollow",{draw:function(t,e){var n=r(t),i=o(t.points);i=this.parsePath(i);return e.addShape("path",{attrs:s.mix(n,{path:i})})},getMarkerCfg:function(t){return s.mix({symbol:"circle",radius:4},r(t))}}),t.exports=f},function(t,e,n){var i=n(0),r=n(147),a={};a.Rect=n(387),a.List=n(388),a.Circle=n(462),a.Tree=n(463),a.Mirror=n(464),a.Matrix=n(465),r.prototype.facet=function(t,e){var n=a[i.upperFirst(t)];if(!n)throw new Error("Not support such type of facets as: "+t);var r=this.get("facets");r&&r.destroy(),e.chart=this;var o=new n(e);this.set("facets",o)},t.exports=a},function(t,e,n){function i(t,e,n){return{x:t.x+e*Math.cos(n),y:t.y+e*Math.sin(n)}}var r=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.type="circle",e},n.getRegion=function(t,e){var n=2*Math.PI/t,r=-1*Math.PI/2+n*e,a=.5/(1+1/Math.sin(n/2)),o=i({x:.5,y:.5},.5-a,r),s=5*Math.PI/4,l=1*Math.PI/4;return{start:i(o,a,s),end:i(o,a,l)}},n.generateFacets=function(t){var e=this,n=e.fields[0];if(!n)throw"Please specify for the field for facet!";var i=e.getFieldValues(n,t),r=i.length,a=[];return i.forEach(function(o,s){var l=[{field:n,value:o,values:i}],u=e.getFilter(l),c=t.filter(u),h={type:e.type,colValue:o,colField:n,colIndex:s,cols:r,rows:1,rowIndex:0,data:c,region:e.getRegion(r,s)};a.push(h)}),a},e}(n(363));t.exports=r},function(t,e,n){var i=n(363),r=n(0).assign,a=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.type="tree",e.line={lineWidth:1,stroke:"#ddd"},e.lineSmooth=!1,e},n.generateFacets=function(t){if(!this.fields.length)throw"Please specify for the fields for facet!";var e=[],n=this.getRootFacet(t);return e.push(n),n.children=this.getChildFacets(t,1,e),this.setRegion(e),e},n.getRootFacet=function(t){return{type:this.type,rows:this.getRows(),rowIndex:0,colIndex:0,colValue:this.rootTitle,data:t}},n.getRows=function(){return this.fields.length+1},n.getChildFacets=function(t,e,n){var i=this,r=i.fields;if(!(r.length<e)){var a=[],o=r[e-1],s=i.getFieldValues(o,t);return s.forEach(function(r,l){var u=[{field:o,value:r,values:s}],c=i.getFilter(u),h=t.filter(c);if(h.length){var f={type:i.type,colValue:r,colField:o,colIndex:l,rows:i.getRows(),rowIndex:e,data:h,children:i.getChildFacets(h,e+1,n)};a.push(f),n.push(f)}}),a}},n.setRegion=function(t){var e=this;e.forceColIndex(t),t.forEach(function(t){t.region=e.getRegion(t.rows,t.cols,t.colIndex,t.rowIndex)})},n.forceColIndex=function(t){var e=this,n=[],i=0;t.forEach(function(t){e.isLeaf(t)&&(n.push(t),t.colIndex=i,i++)}),n.forEach(function(t){t.cols=n.length});for(var r=e.fields.length-1;r>=0;r--)for(var a=e.getFacetsByLevel(t,r),o=0;o<a.length;o++){var s=a[o];e.isLeaf(s)||(s.originColIndex=s.colIndex,s.colIndex=e.getRegionIndex(s.children),s.cols=n.length)}},n.getFacetsByLevel=function(t,e){var n=[];return t.forEach(function(t){t.rowIndex===e&&n.push(t)}),n},n.getRegion=function(t,e,n,i){var r=1/e,a=1/t,o={x:r*n,y:a*i};return{start:o,end:{x:o.x+r,y:o.y+2*a/3}}},n.getRegionIndex=function(t){var e=t[0];return(t[t.length-1].colIndex-e.colIndex)/2+e.colIndex},n.isLeaf=function(t){return!t.children||!t.children.length},n.setXAxis=function(t,e,n){n.rowIndex!==n.rows-1&&(e[t].label=null,e[t].title=null)},n.setYAxis=function(t,e,n){0!==n.originColIndex&&0!==n.colIndex&&(e[t].title=null,e[t].label=null)},n.onPaint=function(){t.prototype.onPaint.call(this),this.group.clear(),this.facets&&this.line&&this.drawLines(this.facets,this.group)},n.drawLines=function(t,e){var n=this,i=e.addGroup();t.forEach(function(t){if(!n.isLeaf(t)){var e=t.children;n._addFacetLines(t,e,i)}})},n._addFacetLines=function(t,e,n){var i=this,r=t.view.getViewRegion(),a={x:r.start.x+(r.end.x-r.start.x)/2,y:r.start.y};e.forEach(function(t){var e=t.view.getViewRegion(),r={x:e.start.x+(e.end.x-e.start.x)/2,y:e.end.y},o={x:a.x,y:a.y+(r.y-a.y)/2},s={x:r.x,y:o.y};i._drawLine([a,o,s,r],n)})},n._getPath=function(t){var e=[];return this.lineSmooth?(e.push(["M",t[0].x,t[0].y]),e.push(["C",t[1].x,t[1].y,t[2].x,t[2].y,t[3].x,t[3].y])):t.forEach(function(t,n){0===n?e.push(["M",t.x,t.y]):e.push(["L",t.x,t.y])}),e},n._drawLine=function(t,e){var n=this._getPath(t),i=this.line;e.addShape("path",{attrs:r({path:n},i)})},e}(i);t.exports=a},function(t,e,n){var i=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.type="mirror",this.transpose=!1,e},n.init=function(){this.transpose?(this.cols=2,this.rows=1):(this.cols=1,this.rows=2),t.prototype.init.call(this)},n.beforeProcessView=function(t,e){this.transpose?e.colIndex%2==0?t.coord().transpose().scale(-1,1):t.coord().transpose():e.rowIndex%2!=0&&t.coord().scale(1,-1)},n.renderTitle=function(t,e){this.transpose?this.drawColTitle(t,e):this.drawRowTitle(t,e)},n.setXAxis=function(t,e,n){1!==n.colIndex&&1!==n.rowIndex||(e[t].label=null,e[t].title=null)},n.setYAxis=function(){},e}(n(388));t.exports=i},function(t,e,n){var i=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.type="matrix",e.showTitle=!1,e},n.generateFacets=function(t){for(var e=this.fields,n=e.length,i=n,r=[],a=0;a<i;a++)for(var o=e[a],s=0;s<n;s++){var l=e[s],u={type:this.type,colValue:o,rowValue:l,colField:o,rowField:l,colIndex:a,rowIndex:s,cols:i,rows:n,data:t,region:this.getRegion(n,i,a,s)};r.push(u)}return r},n.setXAxis=function(t,e,n){n.rowIndex!==n.rows-1&&(e[t].title=null,e[t].label=null)},n.setYAxis=function(t,e,n){0!==n.colIndex&&(e[t].title=null,e[t].label=null)},e}(n(387));t.exports=i},function(t,e,n){var i=n(172),r=n(147),a=n(0),o={Base:n(171),Brush:n(467),Drag:n(468),ScrollBar:n(470),ShapeSelect:n(472),Slider:n(473),Zoom:n(475)};i._Interactions={},i.registerInteraction=function(t,e){i._Interactions[t]=e},i.getInteraction=function(t){return i._Interactions[t]},r.prototype.getInteractions=function(){return this._interactions||(this._interactions={}),this._interactions},r.prototype._setInteraction=function(t,e){var n=this.getInteractions();n[t]&&n[t]!==e&&n[t].destroy(),n[t]=e},r.prototype.clearInteraction=function(t){var e=this.getInteractions();t?(e[t]&&(e[t]._reset(),e[t].destroy()),delete e[t]):a.each(e,function(t,n){t._reset(),t.destroy(),delete e[n]})},r.prototype.interact=r.prototype.interaction=function(t,e){var n=new(i.getInteraction(t))(e,this);return this._setInteraction(t,n),this},i.registerInteraction("brush",o.Brush),i.registerInteraction("Brush",o.Brush),i.registerInteraction("drag",o.Drag),i.registerInteraction("Drag",o.Drag),i.registerInteraction("zoom",o.Zoom),i.registerInteraction("Zoom",o.Zoom),i.registerInteraction("scroll-bar",o.ScrollBar),i.registerInteraction("ScrollBar",o.ScrollBar),i.registerInteraction("shape-select",o.ShapeSelect),i.registerInteraction("ShapeSelect",o.ShapeSelect),i.registerInteraction("slider",o.Slider),i.registerInteraction("Slider",o.Slider),t.exports=o},function(t,e,n){function i(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}var r=n(0),a=["X","Y","XY","POLYGON"],o="XY",s=function(t){function e(e,n){var r,s=i(i(r=t.call(this,e,n)||this));s.filter=!s.draggable,s.type=s.type.toUpperCase(),s.chart=n,-1===a.indexOf(s.type)&&(s.type=o);var l=s.canvas;if(l){var u;l.get("children").map(function(t){return"plotBack"===t.get("type")?(u=t.get("plotRange"),!1):t}),s.plot={start:u.bl,end:u.tr}}if(n){var c=n.get("coord");s.plot={start:c.start,end:c.end};var h=n._getScales("x"),f=n._getScales("y");s.xScale=s.xField?h[s.xField]:n.getXScale(),s.yScale=s.yField?f[s.yField]:n.getYScales()[0]}return r}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return r.mix({},e,{type:o,startPoint:null,brushing:!1,dragging:!1,brushShape:null,container:null,polygonPath:null,style:{fill:"#C5D4EB",opacity:.3,lineWidth:1,stroke:"#82A6DD"},draggable:!1,dragOffX:0,dragOffY:0,inPlot:!0,xField:null,yField:null})},n.start=function(t){var e=this,n=e.canvas,i=e.type,r=e.brushShape;if(i){var a={x:t.offsetX,y:t.offsetY};if(a.x){var o=e.plot&&e.inPlot,s=n.get("canvasDOM"),l=n.get("pixelRatio");if(e.selection&&(e.selection=null),e.draggable&&r&&!r.get("destroyed")){if(r.isHit(a.x*l,a.y*l)){if(s.style.cursor="move",e.selection=r,e.dragging=!0,"X"===i)e.dragoffX=a.x-r.attr("x"),e.dragoffY=0;else if("Y"===i)e.dragoffX=0,e.dragoffY=a.y-r.attr("y");else if("XY"===i)e.dragoffX=a.x-r.attr("x"),e.dragoffY=a.y-r.attr("y");else if("POLYGON"===i){var u=r.getBBox();e.dragoffX=a.x-u.minX,e.dragoffY=a.y-u.minY}e.onDragstart&&e.onDragstart(t)}e.prePoint=a}if(!e.dragging){e.onBrushstart&&e.onBrushstart(a);var c=e.container;if(o){var h=e.plot,f=h.start,p=h.end;if(a.x<f.x||a.x>p.x||a.y<p.y||a.y>f.y)return}s.style.cursor="crosshair",e.startPoint=a,e.brushShape=null,e.brushing=!0,c?c.clear():(c=n.addGroup({zIndex:5})).initTransform(),e.container=c,"POLYGON"===i&&(e.polygonPath="M "+a.x+" "+a.y)}}}},n.process=function(t){var e=this,n=e.brushing,i=e.dragging,a=e.type,o=e.plot,s=e.startPoint,l=e.xScale,u=e.yScale,c=e.canvas;if(n||i){var h={x:t.offsetX,y:t.offsetY},f=c.get("canvasDOM");if(n){f.style.cursor="crosshair";var p=o.start,g=o.end,d=e.polygonPath,v=e.brushShape,y=e.container;e.plot&&e.inPlot&&(h=e._limitCoordScope(h));var x,m,_,b;"Y"===a?(x=p.x,m=h.y>=s.y?s.y:h.y,_=Math.abs(p.x-g.x),b=Math.abs(s.y-h.y)):"X"===a?(x=h.x>=s.x?s.x:h.x,m=g.y,_=Math.abs(s.x-h.x),b=Math.abs(g.y-p.y)):"XY"===a?(h.x>=s.x?(x=s.x,m=h.y>=s.y?s.y:h.y):(x=h.x,m=h.y>=s.y?s.y:h.y),_=Math.abs(s.x-h.x),b=Math.abs(s.y-h.y)):"POLYGON"===a&&(d+="L "+h.x+" "+h.y,e.polygonPath=d,v?!v.get("destroyed")&&v.attr(r.mix({},v._attrs,{path:d})):v=y.addShape("path",{attrs:r.mix(e.style,{path:d})})),"POLYGON"!==a&&(v?!v.get("destroyed")&&v.attr(r.mix({},v._attrs,{x:x,y:m,width:_,height:b})):v=y.addShape("rect",{attrs:r.mix(e.style,{x:x,y:m,width:_,height:b})})),e.brushShape=v}else if(i){f.style.cursor="move";var w=e.selection;if(w&&!w.get("destroyed"))if("POLYGON"===a){var S=e.prePoint;e.selection.translate(h.x-S.x,h.y-S.y)}else e.dragoffX&&w.attr("x",h.x-e.dragoffX),e.dragoffY&&w.attr("y",h.y-e.dragoffY)}e.prePoint=h,c.draw();var M=e._getSelected(),C=M.data,A=M.shapes,k=M.xValues,P=M.yValues,T={data:C,shapes:A,x:h.x,y:h.y};l&&(T[l.field]=k),u&&(T[u.field]=P),e.onDragmove&&e.onDragmove(T),e.onBrushmove&&e.onBrushmove(T)}},n.end=function(t){var e=this,n=e.data,i=e.shapes,a=e.xValues,o=e.yValues,s=e.canvas,l=e.type,u=e.startPoint,c=e.chart,h=e.container,f=e.xScale,p=e.yScale,g=t.offsetX,d=t.offsetY;if(s.get("canvasDOM").style.cursor="default",Math.abs(u.x-g)<=1&&Math.abs(u.y-d)<=1)return e.brushing=!1,void(e.dragging=!1);var v={data:n,shapes:i,x:g,y:d};if(f&&(v[f.field]=a),p&&(v[p.field]=o),e.dragging)e.dragging=!1,e.onDragend&&e.onDragend(v);else if(e.brushing){e.brushing=!1;var y=e.brushShape,x=e.polygonPath;"POLYGON"===l&&(x+="z",y&&!y.get("destroyed")&&y.attr(r.mix({},y._attrs,{path:x})),e.polygonPath=x,s.draw()),e.onBrushend?e.onBrushend(v):c&&e.filter&&(h.clear(),"X"===l?f&&c.filter(f.field,function(t){return a.indexOf(t)>-1}):"Y"===l?p&&c.filter(p.field,function(t){return o.indexOf(t)>-1}):(f&&c.filter(f.field,function(t){return a.indexOf(t)>-1}),p&&c.filter(p.field,function(t){return o.indexOf(t)>-1})),c.repaint())}},n.reset=function(){var t=this.chart,e=this.filter,n=this.brushShape,i=this.canvas;t&&e&&(t.get("options").filters={},t.repaint()),n&&(n.destroy(),i.draw())},n._limitCoordScope=function(t){var e=this.plot,n=e.start,i=e.end;return t.x<n.x&&(t.x=n.x),t.x>i.x&&(t.x=i.x),t.y<i.y&&(t.y=i.y),t.y>n.y&&(t.y=n.y),t},n._getSelected=function(){var t=this,e=t.chart,n=t.xScale,i=t.yScale,r=t.brushShape,a=t.canvas,o=a.get("pixelRatio"),s=[],l=[],u=[],c=[];if(e){e.get("geoms").map(function(t){return t.getShapes().map(function(t){var e=t.get("origin");return Array.isArray(e)||(e=[e]),e.map(function(e){if(r.isHit(e.x*o,e.y*o)){s.push(t);var a=e._origin;c.push(a),n&&l.push(a[n.field]),i&&u.push(a[i.field])}return e}),t}),t})}return t.shapes=s,t.xValues=l,t.yValues=u,t.data=c,a.draw(),{data:c,xValues:l,yValues:u,shapes:s}},e}(n(171));t.exports=s},function(t,e,n){function i(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}var r=n(0),a=n(171),o=n(469),s=n(377),l=n(378),u=["X","Y","XY"],c="X",h=function(t){function e(e,n){var a,s=i(i(a=t.call(this,e,n)||this));s.type=s.type.toUpperCase(),s.chart=n,s.coord=n.get("coord");var h=s.data=n.get("data");o(n);var f=n.getYScales(),p=n.getXScale();f.push(p);var g=n.get("scaleController");return f.forEach(function(t){var e=t.field;s.limitRange[e]=l(h,t);var n=g.defs[e]||{};s.originScaleDefsByField[e]=r.mix(n,{nice:!!n.nice}),t.isLinear&&(s.stepByField[e]=(t.max-t.min)*s.stepRatio)}),-1===u.indexOf(s.type)&&(s.type=c),s._disableTooltip(),a}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return r.mix({},e,{type:c,stepRatio:.05,limitRange:{},stepByField:{},threshold:20,originScaleDefsByField:{},previousPoint:null,isDragging:!1})},n._disableTooltip=function(){var t=this.chart;t.get("tooltipController")&&(this._showTooltip=!0,t.tooltip(!1))},n._enableTooltip=function(t){var e=this.chart;this._showTooltip&&(e.tooltip(!0),e.showTooltip(t))},n._applyTranslate=function(t,e,n){void 0===e&&(e=0);t.isLinear?this._translateLinearScale(t,e,n):this._translateCatScale(t,e,n)},n._translateCatScale=function(t,e,n){var i=this.chart,a=t.type,o=t.field,l=t.values,u=t.ticks,c=s(i,o),h=this.limitRange[o],f=e/n,p=l.length,g=Math.max(1,Math.abs(parseInt(f*p))),d=h.indexOf(l[0]),v=h.indexOf(l[p-1]);if(e>0&&d>=0){for(var y=0;y<g&&d>0;y++)d-=1,v-=1;var x=h.slice(d,v+1),m=null;if("timeCat"===a){for(var _=u.length>2?u[1]-u[0]:864e5,b=u[0]-_;b>=x[0];b-=_)u.unshift(b);m=u}i.scale(o,r.mix({},c,{values:x,ticks:m}))}else if(e<0&&v<=h.length-1){for(var w=0;w<g&&v<h.length-1;w++)d+=1,v+=1;var S=h.slice(d,v+1),M=null;if("timeCat"===a){for(var C=u.length>2?u[1]-u[0]:864e5,A=u[u.length-1]+C;A<=S[S.length-1];A+=C)u.push(A);M=u}i.scale(o,r.mix({},c,{values:S,ticks:M}))}},n._translateLinearScale=function(t,e,n){var i=this.chart,a=this.limitRange,o=t.min,l=t.max,u=t.field;if(o!==a[u].min||l!==a[u].max){var c=e/n,h=l-o,f=s(i,u);i.scale(u,r.mix({},f,{nice:!1,min:o+c*h,max:l+c*h}))}},n.start=function(t){this.canvas.get("canvasDOM").style.cursor="pointer",this.isDragging=!0,this.previousPoint={x:t.x,y:t.y},this._disableTooltip()},n.process=function(t){var e=this;if(e.isDragging){var n=e.chart,i=e.type,r=e.canvas,a=e.coord,o=e.threshold;r.get("canvasDOM").style.cursor="move";var s=e.previousPoint,l=t,u=l.x-s.x,c=l.y-s.y,h=!1;if(Math.abs(u)>o&&i.indexOf("X")>-1){h=!0;var f=n.getXScale();e._applyTranslate(f,f.isLinear?-u:u,a.width)}if(Math.abs(c)>o&&i.indexOf("Y")>-1){h=!0;n.getYScales().forEach(function(t){e._applyTranslate(t,l.y-s.y,a.height)})}h&&(e.previousPoint=l,n.repaint())}},n.end=function(t){this.isDragging=!1;this.canvas.get("canvasDOM").style.cursor="default",this._enableTooltip(t)},n.reset=function(){var t=this.view,e=this.originScaleDefsByField,n=t.getYScales(),i=t.getXScale();n.push(i),n.forEach(function(n){if(n.isLinear){var i=n.field;t.scale(i,e[i])}}),t.repaint(),this._disableTooltip()},e}(a);t.exports=h},function(t,e,n){var i=n(0),r=n(71),a=n(376);t.exports=function(t){t.on("beforeinitgeoms",function(){t.set("limitInPlot",!0);var e=t.get("data"),n=a(t);if(!n)return e;var o=t.get("geoms"),s=!1;i.each(o,function(t){if(-1!==["area","line","path"].indexOf(t.get("type")))return s=!0,!1});var l=[];if(i.each(n,function(t,e){!s&&t&&(t.values||t.min||t.max)&&l.push(e)}),0===l.length)return e;var u=[];i.each(e,function(t){var e=!0;i.each(l,function(a){var o=t[a];if(o){var s=n[a];if("timeCat"===s.type){var l=s.values;i.isNumber(l[0])&&(o=r.toTimeStamp(o))}(s.values&&-1===s.values.indexOf(o)||s.min&&o<s.min||s.max&&o>s.max)&&(e=!1)}}),e&&u.push(t)}),t.set("filteredData",u)})}},function(t,e,n){var i=n(0),r=n(171),a=n(471),o=n(378),s=function(t){function e(e,n){var r,a=(r=t.call(this,e,n)||this).getDefaultCfg();return n.set("_scrollBarCfg",i.deepMix({},a,e)),n.set("_limitRange",{}),n.get("_horizontalBar")||n.get("_verticalBar")||r._renderScrollBars(),r}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{startEvent:null,processEvent:null,endEvent:null,resetEvent:null,type:"X",xStyle:{backgroundColor:"rgba(202, 215, 239, .2)",fillerColor:"rgba(202, 215, 239, .75)",size:4,lineCap:"round",offsetX:0,offsetY:-10},yStyle:{backgroundColor:"rgba(202, 215, 239, .2)",fillerColor:"rgba(202, 215, 239, .75)",size:4,lineCap:"round",offsetX:8,offsetY:0}})},n._renderScrollBars=function(){var t=this.chart,e=t.get("_scrollBarCfg");if(e){var n=t.get("data"),i=t.get("plotRange");i.width=Math.abs(i.br.x-i.bl.x),i.height=Math.abs(i.tl.y-i.bl.y);var r=t.get("backPlot"),s=t.get("canvas").get("height"),l=t.get("_limitRange"),u=e.type;if(u.indexOf("X")>-1){var c=e.xStyle,h=c.offsetX,f=c.offsetY,p=c.lineCap,g=c.backgroundColor,d=c.fillerColor,v=c.size,y=t.getXScale(),x=l[y.field];x||(x=o(n,y),l[y.field]=x);var m=a(y,x,y.type),_=t.get("_horizontalBar"),b=s-v/2+f;if(_){_.get("children")[1].attr({x1:Math.max(i.bl.x+i.width*m[0]+h,i.bl.x),x2:Math.min(i.bl.x+i.width*m[1]+h,i.br.x)})}else(_=r.addGroup({className:"horizontalBar"})).addShape("line",{attrs:{x1:i.bl.x+h,y1:b,x2:i.br.x+h,y2:b,lineWidth:v,stroke:g,lineCap:p}}),_.addShape("line",{attrs:{x1:Math.max(i.bl.x+i.width*m[0]+h,i.bl.x),y1:b,x2:Math.min(i.bl.x+i.width*m[1]+h,i.br.x),y2:b,lineWidth:v,stroke:d,lineCap:p}}),t.set("_horizontalBar",_)}if(u.indexOf("Y")>-1){var w=e.yStyle,S=w.offsetX,M=w.offsetY,C=w.lineCap,A=w.backgroundColor,k=w.fillerColor,P=w.size,T=t.getYScales()[0],I=l[T.field];I||(I=o(n,T),l[T.field]=I);var O=a(T,I,T.type),L=t.get("_verticalBar"),E=P/2+S;if(L){L.get("children")[1].attr({y1:Math.max(i.tl.y+i.height*O[0]+M,i.tl.y),y2:Math.min(i.tl.y+i.height*O[1]+M,i.bl.y)})}else(L=r.addGroup({className:"verticalBar"})).addShape("line",{attrs:{x1:E,y1:i.tl.y+M,x2:E,y2:i.bl.y+M,lineWidth:P,stroke:A,lineCap:C}}),L.addShape("line",{attrs:{x1:E,y1:Math.max(i.tl.y+i.height*O[0]+M,i.tl.y),x2:E,y2:Math.min(i.tl.y+i.height*O[1]+M,i.bl.y),lineWidth:P,stroke:k,lineCap:C}}),t.set("_verticalBar",L)}}},n._clear=function(){var t=this.chart;if(t){var e=t.get("_horizontalBar"),n=t.get("_verticalBar");e&&e.remove(!0),n&&n.remove(!0),t.set("_horizontalBar",null),t.set("_verticalBar",null)}},n._bindEvents=function(){this._onAfterclearOrBeforechangedata=this._onAfterclearOrBeforechangedata.bind(this),this._onAfterclearinner=this._onAfterclearinner.bind(this),this._onAfterdrawgeoms=this._onAfterdrawgeoms.bind(this);var t=this.chart;t.on("afterclear",this._onAfterclearOrBeforechangedata),t.on("beforechangedata",this._onAfterclearOrBeforechangedata),t.on("afterclearinner",this._onAfterclearinner),t.on("afterdrawgeoms",this._onAfterdrawgeoms)},n._onAfterclearOrBeforechangedata=function(){this.chart&&this.chart.set("_limitRange",{})},n._onAfterclearinner=function(){this._clear()},n._onAfterdrawgeoms=function(){this._renderScrollBars()},n._clearEvents=function(){var t=this.chart;t&&(t.off("afterclear",this._onAfterclearOrBeforechangedata),t.off("beforechangedata",this._onAfterclearOrBeforechangedata),t.off("afterclearinner",this._onAfterclearinner),t.off("afterdrawgeoms",this._onAfterdrawgeoms))},n.destroy=function(){this._clearEvents(),this._clear(),this.canvas.draw()},e}(r);t.exports=s},function(t,e){t.exports=function(t,e,n){if(!t)return[0,1];var i=0,r=0;if("linear"===n){var a=e.min,o=e.max-a;i=(t.min-a)/o,r=(t.max-a)/o}else{var s=e,l=t.values,u=s.indexOf(l[0]),c=s.indexOf(l[l.length-1]);i=u/(s.length-1),r=c/(s.length-1)}return[i,r]}},function(t,e,n){function i(t,e){var n={};for(var i in e)n[i]=t[i];return n}var r=n(0),a=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return r.mix({},e,{startEvent:"mouseup",processEvent:null,selectStyle:{fillOpacity:1},unSelectStyle:{fillOpacity:.1},cancelable:!0})},n.start=function(t){var e,n=[];if(this.view.eachShape(function(i,r){r.isPointInPath(t.x,t.y)?e=r:n.push(r)}),e)if(e.get("_selected")){if(!this.cancelable)return;this.reset()}else{var a=this.selectStyle,o=this.unSelectStyle,s=i(e.attr(),e);e.set("_originAttrs",s),e.attr(a),r.each(n,function(t){var e=t.get("_originAttrs");e&&t.attr(e),t.set("_selected",!1),o&&(e=i(t.attr(),o),t.set("_originAttrs",e),t.attr(o))}),e.set("_selected",!0),this.selectedShape=e,this.canvas.draw()}else this.reset()},n.end=function(t){var e=this.selectedShape;e&&!e.get("destroyed")&&e.get("origin")&&(t.data=e.get("origin")._origin,t.shapeInfo=e.get("origin"),t.shape=e,t.selected=!!e.get("_selected"))},n.reset=function(){if(this.selectedShape){var t=this.view.get("geoms")[0].get("container").get("children")[0].get("children");r.each(t,function(t){var e=t.get("_originAttrs");e&&(t._attrs=e,t.set("_originAttrs",null)),t.set("_selected",!1)}),this.canvas.draw()}},e}(n(171));t.exports=a},function(t,e,n){function i(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}var r=n(474),a=n(147),o=n(0),s=n(16),l=n(7),u=n(171),c=n(377),h=n(376),f=s.Canvas,p=o.DomUtil,g=o.isNumber,d=function(t){function e(e,n){var r,a=i(i(r=t.call(this,e,n)||this));return a._initContainer(),a._initStyle(),a.render(),r}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return o.mix({},e,{startEvent:null,processEvent:null,endEvent:null,resetEvent:null,height:26,width:"auto",padding:l.plotCfg.padding,container:null,xAxis:null,yAxis:null,fillerStyle:{fill:"#BDCCED",fillOpacity:.3},backgroundStyle:{stroke:"#CCD6EC",fill:"#CCD6EC",fillOpacity:.3,lineWidth:1},range:[0,100],layout:"horizontal",textStyle:{fill:"#545454"},handleStyle:{img:"https://gw.alipayobjects.com/zos/rmsportal/QXtfhORGlDuRvLXFzpsQ.png",width:5},backgroundChart:{type:["area"],color:"#CCD6EC"}})},n._initContainer=function(){var t=this.container;if(!t)throw new Error("Please specify the container for the Slider!");o.isString(t)?this.domContainer=document.getElementById(t):this.domContainer=t},n.forceFit=function(){var t=this;if(t&&!t.destroyed){var e=p.getWidth(t.domContainer),n=t.height;if(e!==t.domWidth){var i=t.canvas;i.changeSize(e,n),t.bgChart&&t.bgChart.changeWidth(e),i.clear(),t._initWidth(),t._initSlider(),t._bindEvent(),i.draw()}}},n._initForceFitEvent=function(){var t=setTimeout(o.wrapBehavior(this,"forceFit"),200);clearTimeout(this.resizeTimer),this.resizeTimer=t},n._initStyle=function(){var t=this;t.handleStyle=o.mix({width:t.height,height:t.height},t.handleStyle),"auto"===t.width&&window.addEventListener("resize",o.wrapBehavior(t,"_initForceFitEvent"))},n._initWidth=function(){var t,e=this;t="auto"===e.width?p.getWidth(e.domContainer):e.width,e.domWidth=t;var n=o.toAllPadding(e.padding);"horizontal"===e.layout?(e.plotWidth=t-n[1]-n[3],e.plotPadding=n[3],e.plotHeight=e.height):"vertical"===e.layout&&(e.plotWidth=e.width,e.plotHeight=e.height-n[0]-n[2],e.plotPadding=n[0])},n._initCanvas=function(){var t=this.domWidth,e=this.height,n=new f({width:t,height:e,containerDOM:this.domContainer,capture:!1}),i=n.get("el");i.style.position="absolute",i.style.top=0,i.style.left=0,i.style.zIndex=3,this.canvas=n},n._initBackground=function(){var t,e=this,n=this.chart,i=n.getAllGeoms[0],r=e.data=e.data||n.get("data"),s=n.getXScale(),l=e.xAxis||s.field,u=e.yAxis||n.getYScales()[0].field,c=o.deepMix((t={},t[""+l]={range:[0,1]},t),h(n),e.scales);if(delete c[l].min,delete c[l].max,!r)throw new Error("Please specify the data!");if(!l)throw new Error("Please specify the xAxis!");if(!u)throw new Error("Please specify the yAxis!");var f=e.backgroundChart,p=f.type||i.get("type"),g=f.color||"grey";o.isArray(p)||(p=[p]);var d=o.toAllPadding(e.padding),v=new a({container:e.container,width:e.domWidth,height:e.height,padding:[0,d[1],0,d[3]],animate:!1});v.source(r),v.scale(c),v.axis(!1),v.tooltip(!1),v.legend(!1),o.each(p,function(t){v[t]().position(l+"*"+u).color(g).opacity(1)}),v.render(),e.bgChart=v,e.scale="horizontal"===e.layout?v.getXScale():v.getYScales()[0],"vertical"===e.layout&&v.destroy()},n._initRange=function(){var t=this,e=t.startRadio,n=t.endRadio,i=t._startValue,r=t._endValue,a=t.scale,o=0,s=1;g(e)?o=e:i&&(o=a.scale(a.translate(i))),g(n)?s=n:r&&(s=a.scale(a.translate(r)));var l=t.minSpan,u=t.maxSpan,c=0;if("time"===a.type||"timeCat"===a.type){var h=a.values,f=h[0];c=h[h.length-1]-f}else a.isLinear&&(c=a.max-a.min);c&&l&&(t.minRange=l/c*100),c&&u&&(t.maxRange=u/c*100);var p=[100*o,100*s];return t.range=p,p},n._getHandleValue=function(t){var e=this,n=e.range,i=n[0]/100,r=n[1]/100,a=e.scale;return"min"===t?e._startValue?e._startValue:a.invert(i):e._endValue?e._endValue:a.invert(r)},n._initSlider=function(){var t=this,e=t.canvas,n=t._initRange(),i=t.scale,a=e.addGroup(r,{middleAttr:t.fillerStyle,range:n,minRange:t.minRange,maxRange:t.maxRange,layout:t.layout,width:t.plotWidth,height:t.plotHeight,backgroundStyle:t.backgroundStyle,textStyle:t.textStyle,handleStyle:t.handleStyle,minText:i.getText(t._getHandleValue("min")),maxText:i.getText(t._getHandleValue("max"))});"horizontal"===t.layout?a.translate(t.plotPadding,0):"vertical"===t.layout&&a.translate(0,t.plotPadding),t.rangeElement=a},n._updateElement=function(t,e){var n=this,i=n.chart,r=n.scale,a=n.rangeElement,s=r.field,l=a.get("minTextElement"),u=a.get("maxTextElement"),h=r.invert(t),f=r.invert(e),p=r.getText(h),g=r.getText(f);l.attr("text",p),u.attr("text",g),n._startValue=p,n._endValue=g,n.onChange&&n.onChange({startText:p,endText:g,startValue:h,endValue:f,startRadio:t,endRadio:e}),i.scale(s,o.mix({},c(i,s),{nice:!1,min:h,max:f})),i.repaint()},n._bindEvent=function(){var t=this;t.rangeElement.on("sliderchange",function(e){var n=e.range,i=n[0]/100,r=n[1]/100;t._updateElement(i,r)})},n.clear=function(){var t=this;t.canvas.clear(),t.bgChart&&t.bgChart.destroy(),t.bgChart=null,t.scale=null,t.canvas.draw()},n.repaint=function(){this.clear(),this.render()},n.render=function(){var t=this;t._initWidth(),t._initCanvas(),t._initBackground(),t._initSlider(),t._bindEvent(),t.canvas.draw()},n.destroy=function(){var t=this;clearTimeout(t.resizeTimer);t.rangeElement.off("sliderchange"),t.bgChart&&t.bgChart.destroy(),t.canvas.destroy();for(var e=t.domContainer;e.hasChildNodes();)e.removeChild(e.firstChild);window.removeEventListener("resize",o.getWrapBehavior(t,"_initForceFitEvent")),t.destroyed=!0},e}(u);t.exports=d},function(t,e,n){var i=n(0),r=n(16).Group,a=i.DomUtil,o=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){return{range:null,middleAttr:null,backgroundElement:null,minHandleElement:null,maxHandleElement:null,middleHandleElement:null,currentTarget:null,layout:"vertical",width:null,height:null,pageX:null,pageY:null}},n._initHandle=function(t){var e,n,r,a=this.addGroup(),o=this.get("layout"),s=this.get("handleStyle"),l=s.img,u=s.width,c=s.height;if("horizontal"===o){var h=s.width;r="ew-resize",n=a.addShape("Image",{attrs:{x:-h/2,y:0,width:h,height:c,img:l,cursor:r}}),e=a.addShape("Text",{attrs:i.mix({x:"min"===t?-(h/2+5):h/2+5,y:c/2,textAlign:"min"===t?"end":"start",textBaseline:"middle",text:"min"===t?this.get("minText"):this.get("maxText"),cursor:r},this.get("textStyle"))})}else r="ns-resize",n=a.addShape("Image",{attrs:{x:0,y:-c/2,width:u,height:c,img:l,cursor:r}}),e=a.addShape("Text",{attrs:i.mix({x:u/2,y:"min"===t?c/2+5:-(c/2+5),textAlign:"center",textBaseline:"middle",text:"min"===t?this.get("minText"):this.get("maxText"),cursor:r},this.get("textStyle"))});return this.set(t+"TextElement",e),this.set(t+"IconElement",n),a},n._initSliderBackground=function(){var t=this.addGroup();return t.initTransform(),t.translate(0,0),t.addShape("Rect",{attrs:i.mix({x:0,y:0,width:this.get("width"),height:this.get("height")},this.get("backgroundStyle"))}),t},n._beforeRenderUI=function(){var t=this._initSliderBackground(),e=this._initHandle("min"),n=this._initHandle("max"),i=this.addShape("rect",{attrs:this.get("middleAttr")});this.set("middleHandleElement",i),this.set("minHandleElement",e),this.set("maxHandleElement",n),this.set("backgroundElement",t),t.set("zIndex",0),i.set("zIndex",1),e.set("zIndex",2),n.set("zIndex",2),i.attr("cursor","move"),this.sort()},n._renderUI=function(){"horizontal"===this.get("layout")?this._renderHorizontal():this._renderVertical()},n._transform=function(t){var e=this.get("range"),n=e[0]/100,i=e[1]/100,r=this.get("width"),a=this.get("height"),o=this.get("minHandleElement"),s=this.get("maxHandleElement"),l=this.get("middleHandleElement");o.resetMatrix?(o.resetMatrix(),s.resetMatrix()):(o.initTransform(),s.initTransform()),"horizontal"===t?(l.attr({x:r*n,y:0,width:(i-n)*r,height:a}),o.translate(n*r,0),s.translate(i*r,0)):(l.attr({x:0,y:a*(1-i),width:r,height:(i-n)*a}),o.translate(0,(1-n)*a),s.translate(0,(1-i)*a))},n._renderHorizontal=function(){this._transform("horizontal")},n._renderVertical=function(){this._transform("vertical")},n._bindUI=function(){this.on("mousedown",i.wrapBehavior(this,"_onMouseDown"))},n._isElement=function(t,e){var n=this.get(e);if(t===n)return!0;if(n.isGroup){return n.get("children").indexOf(t)>-1}return!1},n._getRange=function(t,e){var n=t+e;return n=n>100?100:n,n=n<0?0:n},n._limitRange=function(t,e,n){n[0]=this._getRange(t,n[0]),n[1]=n[0]+e,n[1]>100&&(n[1]=100,n[0]=n[1]-e)},n._updateStatus=function(t,e){var n="x"===t?this.get("width"):this.get("height");t=i.upperFirst(t);var r,a=this.get("range"),o=this.get("page"+t),s=this.get("currentTarget"),l=this.get("rangeStash"),u="vertical"===this.get("layout")?-1:1,c=e["page"+t],h=(c-o)/n*100*u,f=this.get("minRange"),p=this.get("maxRange");a[1]<=a[0]?(this._isElement(s,"minHandleElement")||this._isElement(s,"maxHandleElement"))&&(a[0]=this._getRange(h,a[0]),a[1]=this._getRange(h,a[0])):(this._isElement(s,"minHandleElement")&&(a[0]=this._getRange(h,a[0]),f&&a[1]-a[0]<=f&&this._limitRange(h,f,a),p&&a[1]-a[0]>=p&&this._limitRange(h,p,a)),this._isElement(s,"maxHandleElement")&&(a[1]=this._getRange(h,a[1]),f&&a[1]-a[0]<=f&&this._limitRange(h,f,a),p&&a[1]-a[0]>=p&&this._limitRange(h,p,a))),this._isElement(s,"middleHandleElement")&&(r=l[1]-l[0],this._limitRange(h,r,a)),this.emit("sliderchange",{range:a}),this.set("page"+t,c),this._renderUI(),this.get("canvas").draw()},n._onMouseDown=function(t){var e=t.currentTarget,n=t.event,i=this.get("range");n.stopPropagation(),n.preventDefault(),this.set("pageX",n.pageX),this.set("pageY",n.pageY),this.set("currentTarget",e),this.set("rangeStash",[i[0],i[1]]),this._bindCanvasEvents()},n._bindCanvasEvents=function(){var t=this.get("canvas").get("containerDOM");this.onMouseMoveListener=a.addEventListener(t,"mousemove",i.wrapBehavior(this,"_onCanvasMouseMove")),this.onMouseUpListener=a.addEventListener(t,"mouseup",i.wrapBehavior(this,"_onCanvasMouseUp")),this.onMouseLeaveListener=a.addEventListener(t,"mouseleave",i.wrapBehavior(this,"_onCanvasMouseUp"))},n._onCanvasMouseMove=function(t){"horizontal"===this.get("layout")?this._updateStatus("x",t):this._updateStatus("y",t)},n._onCanvasMouseUp=function(){this._removeDocumentEvents()},n._removeDocumentEvents=function(){this.onMouseMoveListener.remove(),this.onMouseUpListener.remove(),this.onMouseLeaveListener.remove()},e}(r);t.exports=o},function(t,e,n){function i(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}var r=n(0),a=n(171),o=n(377),s=n(378),l=["X","Y","XY"],u="X",c=function(t){function e(e,n){var a,o=i(i(a=t.call(this,e,n)||this));o.chart=n,o.type=o.type.toUpperCase();var c=o.data=n.get("data"),h=n.getYScales(),f=n.getXScale();h.push(f);var p=n.get("scaleController");return h.forEach(function(t){var e=t.field,n=p.defs[e]||{};o.limitRange[e]=s(c,t),o.originScaleDefsByField[e]=r.mix(n,{nice:!!n.nice}),t.isLinear?o.stepByField[e]=(t.max-t.min)*o.stepRatio:o.stepByField[e]=o.catStep}),-1===l.indexOf(o.type)&&(o.type=u),a}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return r.mix({},e,{processEvent:"mousewheel",type:u,stepRatio:.05,stepByField:{},minScale:1,maxScale:4,catStep:2,limitRange:{},originScaleDefsByField:{}})},n._applyScale=function(t,e,n,i){void 0===n&&(n=0);var a=this,s=a.chart,l=a.stepByField;if(t.isLinear){var u=t.min,c=t.max,h=t.field,f=1-n,p=l[h]*e,g=u+p*n,d=c-p*f;d>g&&s.scale(h,{nice:!1,min:g,max:d})}else{var v=t.field,y=t.values,x=a.chart,m=x.get("coord"),_=o(x,v),b=a.limitRange[v],w=b.length,S=w/a.maxScale,M=w/a.minScale,C=y.length,A=m.invertPoint(i).x,k=C-e*this.catStep,P=parseInt(k*A),T=k+P;if(e>0&&C>=S){var I=P,O=T;T>C&&(O=C-1,I=C-k);var L=y.slice(I,O);x.scale(v,r.mix({},_,{values:L}))}else if(e<0&&C<=M){var E=b.indexOf(y[0]),D=b.indexOf(y[C-1]),F=Math.max(0,E-P),B=Math.min(D+T,w),R=b.slice(F,B);x.scale(v,r.mix({},_,{values:R}))}}},n.process=function(t){var e=this,n=e.chart,i=e.type,r=n.get("coord"),a=t.deltaY,o=r.invertPoint(t);if(a){e.onZoom&&e.onZoom(a,o,e),a>0?e.onZoomin&&e.onZoomin(a,o,e):e.onZoomout&&e.onZoomout(a,o,e);var s=a/Math.abs(a);if(i.indexOf("X")>-1&&e._applyScale(n.getXScale(),s,o.x,t),i.indexOf("Y")>-1){n.getYScales().forEach(function(n){e._applyScale(n,s,o.y,t)})}}n.repaint()},n.reset=function(){var t=this.view,e=this.originScaleDefsByField,n=t.getYScales(),i=t.getXScale();n.push(i),n.forEach(function(n){if(n.isLinear){var i=n.field;t.scale(i,e[i])}}),t.repaint()},e}(a);t.exports=c}])});
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/js/jquery.min.js b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/js/jquery.min.js
new file mode 100644
index 0000000..fad9ab1
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/lib/js/jquery.min.js
@@ -0,0 +1,5 @@
+/*! jQuery v2.1.4 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b="length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\f]' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function qa(){}qa.prototype=d.filters=d.pseudos,d.setFilters=new qa,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function ra(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){
+return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=L.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var Q=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,R=["Top","Right","Bottom","Left"],S=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)},T=/^(?:checkbox|radio)$/i;!function(){var a=l.createDocumentFragment(),b=a.appendChild(l.createElement("div")),c=l.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||l,d=c.documentElement,e=c.body,a.pageX=b.clientX+(d&&d.scrollLeft||e&&e.scrollLeft||0)-(d&&d.clientLeft||e&&e.clientLeft||0),a.pageY=b.clientY+(d&&d.scrollTop||e&&e.scrollTop||0)-(d&&d.clientTop||e&&e.clientTop||0)),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},fix:function(a){if(a[n.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=W.test(e)?this.mouseHooks:V.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new n.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=l),3===a.target.nodeType&&(a.target=a.target.parentNode),g.filter?g.filter(a,f):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==_()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===_()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&n.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=n.extend(new n.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?n.event.trigger(e,null,b):n.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?Z:$):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={isDefaultPrevented:$,isPropagationStopped:$,isImmediatePropagationStopped:$,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=Z,a&&a.preventDefault&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=Z,a&&a.stopPropagation&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=Z,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.focusinBubbles||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a),!0)};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=L.access(d,b);e||d.addEventListener(a,c,!0),L.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=L.access(d,b)-1;e?L.access(d,b,e):(d.removeEventListener(a,c,!0),L.remove(d,b))}}}),n.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(g in a)this.on(g,b,c,a[g],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=$;else if(!d)return this;return 1===e&&(f=d,d=function(a){return n().off(a),f.apply(this,arguments)},d.guid=f.guid||(f.guid=n.guid++)),this.each(function(){n.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=$),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ba=/<([\w:]+)/,ca=/<|&#?\w+;/,da=/<(?:script|style|link)/i,ea=/checked\s*(?:[^=]|=\s*.checked.)/i,fa=/^$|\/(?:java|ecma)script/i,ga=/^true\/(.*)/,ha=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ia={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ia.optgroup=ia.option,ia.tbody=ia.tfoot=ia.colgroup=ia.caption=ia.thead,ia.th=ia.td;function ja(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function ka(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function la(a){var b=ga.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function ma(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function na(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function oa(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pa(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=oa(h),f=oa(a),d=0,e=f.length;e>d;d++)pa(f[d],g[d]);if(b)if(c)for(f=f||oa(a),g=g||oa(h),d=0,e=f.length;e>d;d++)na(f[d],g[d]);else na(a,h);return g=oa(h,"script"),g.length>0&&ma(g,!i&&oa(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(ca.test(e)){f=f||k.appendChild(b.createElement("div")),g=(ba.exec(e)||["",""])[1].toLowerCase(),h=ia[g]||ia._default,f.innerHTML=h[1]+e.replace(aa,"<$1></$2>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=oa(k.appendChild(e),"script"),i&&ma(f),c)){j=0;while(e=f[j++])fa.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(oa(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&ma(oa(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(oa(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!da.test(a)&&!ia[(ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(aa,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(oa(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(oa(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&ea.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(oa(c,"script"),ka),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,oa(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,la),j=0;g>j;j++)h=f[j],fa.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(ha,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qa,ra={};function sa(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function ta(a){var b=l,c=ra[a];return c||(c=sa(a,b),"none"!==c&&c||(qa=(qa||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=qa[0].contentDocument,b.write(),b.close(),c=sa(a,b),qa.detach()),ra[a]=c),c}var ua=/^margin/,va=new RegExp("^("+Q+")(?!px)[a-z%]+$","i"),wa=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)};function xa(a,b,c){var d,e,f,g,h=a.style;return c=c||wa(a),c&&(g=c.getPropertyValue(b)||c[b]),c&&(""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),va.test(g)&&ua.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function ya(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d=l.documentElement,e=l.createElement("div"),f=l.createElement("div");if(f.style){f.style.backgroundClip="content-box",f.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===f.style.backgroundClip,e.style.cssText="border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute",e.appendChild(f);function g(){f.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",f.innerHTML="",d.appendChild(e);var g=a.getComputedStyle(f,null);b="1%"!==g.top,c="4px"===g.width,d.removeChild(e)}a.getComputedStyle&&n.extend(k,{pixelPosition:function(){return g(),b},boxSizingReliable:function(){return null==c&&g(),c},reliableMarginRight:function(){var b,c=f.appendChild(l.createElement("div"));return c.style.cssText=f.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",f.style.width="1px",d.appendChild(e),b=!parseFloat(a.getComputedStyle(c,null).marginRight),d.removeChild(e),f.removeChild(c),b}})}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var za=/^(none|table(?!-c[ea]).+)/,Aa=new RegExp("^("+Q+")(.*)$","i"),Ba=new RegExp("^([+-])=("+Q+")","i"),Ca={position:"absolute",visibility:"hidden",display:"block"},Da={letterSpacing:"0",fontWeight:"400"},Ea=["Webkit","O","Moz","ms"];function Fa(a,b){if(b in a)return b;var c=b[0].toUpperCase()+b.slice(1),d=b,e=Ea.length;while(e--)if(b=Ea[e]+c,b in a)return b;return d}function Ga(a,b,c){var d=Aa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Ha(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+R[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+R[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+R[f]+"Width",!0,e))):(g+=n.css(a,"padding"+R[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+R[f]+"Width",!0,e)));return g}function Ia(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=wa(a),g="border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=xa(a,b,f),(0>e||null==e)&&(e=a.style[b]),va.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Ha(a,b,c||(g?"border":"content"),d,f)+"px"}function Ja(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=L.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&S(d)&&(f[g]=L.access(d,"olddisplay",ta(d.nodeName)))):(e=S(d),"none"===c&&e||L.set(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=xa(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Fa(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=Ba.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||n.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Fa(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=xa(a,b,d)),"normal"===e&&b in Da&&(e=Da[b]),""===c||c?(f=parseFloat(e),c===!0||n.isNumeric(f)?f||0:e):e}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?za.test(n.css(a,"display"))&&0===a.offsetWidth?n.swap(a,Ca,function(){return Ia(a,b,d)}):Ia(a,b,d):void 0},set:function(a,c,d){var e=d&&wa(a);return Ga(a,c,d?Ha(a,b,d,"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),n.cssHooks.marginRight=ya(k.reliableMarginRight,function(a,b){return b?n.swap(a,{display:"inline-block"},xa,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+R[d]+b]=f[d]||f[d-2]||f[0];return e}},ua.test(a)||(n.cssHooks[a+b].set=Ga)}),n.fn.extend({css:function(a,b){return J(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=wa(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Ja(this,!0)},hide:function(){return Ja(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){S(this)?n(this).show():n(this).hide()})}});function Ka(a,b,c,d,e){return new Ka.prototype.init(a,b,c,d,e)}n.Tween=Ka,Ka.prototype={constructor:Ka,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=Ka.propHooks[this.prop];return a&&a.get?a.get(this):Ka.propHooks._default.get(this)},run:function(a){var b,c=Ka.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ka.propHooks._default.set(this),this}},Ka.prototype.init.prototype=Ka.prototype,Ka.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Ka.propHooks.scrollTop=Ka.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=Ka.prototype.init,n.fx.step={};var La,Ma,Na=/^(?:toggle|show|hide)$/,Oa=new RegExp("^(?:([+-])=|)("+Q+")([a-z%]*)$","i"),Pa=/queueHooks$/,Qa=[Va],Ra={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=Oa.exec(b),f=e&&e[3]||(n.cssNumber[a]?"":"px"),g=(n.cssNumber[a]||"px"!==f&&+d)&&Oa.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function Sa(){return setTimeout(function(){La=void 0}),La=n.now()}function Ta(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=R[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function Ua(a,b,c){for(var d,e=(Ra[b]||[]).concat(Ra["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Va(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&S(a),q=L.get(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,"display"),k="none"===j?L.get(a,"olddisplay")||ta(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(o.display="inline-block")),c.overflow&&(o.overflow="hidden",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Na.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))"inline"===("none"===j?ta(a.nodeName):j)&&(o.display=j);else{q?"hidden"in q&&(p=q.hidden):q=L.access(a,"fxshow",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;L.remove(a,"fxshow");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ua(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function Wa(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function Xa(a,b,c){var d,e,f=0,g=Qa.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=La||Sa(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:La||Sa(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(Wa(k,j.opts.specialEasing);g>f;f++)if(d=Qa[f].call(j,a,k,j.opts))return d;return n.map(k,Ua,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(Xa,{tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],Ra[c]=Ra[c]||[],Ra[c].unshift(b)},prefilter:function(a,b){b?Qa.unshift(a):Qa.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(S).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=Xa(this,n.extend({},a),f);(e||L.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=L.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Pa.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=L.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(Ta(b,!0),a,d,e)}}),n.each({slideDown:Ta("show"),slideUp:Ta("hide"),slideToggle:Ta("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(La=n.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||n.fx.stop(),La=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){Ma||(Ma=setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){clearInterval(Ma),Ma=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(a,b){return a=n.fx?n.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a=l.createElement("input"),b=l.createElement("select"),c=b.appendChild(l.createElement("option"));a.type="checkbox",k.checkOn=""!==a.value,k.optSelected=c.selected,b.disabled=!0,k.optDisabled=!c.disabled,a=l.createElement("input"),a.value="t",a.type="radio",k.radioValue="t"===a.value}();var Ya,Za,$a=n.expr.attrHandle;n.fn.extend({attr:function(a,b){return J(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===U?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?Za:Ya)),
+void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void n.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),Za={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=$a[b]||n.find.attr;$a[b]=function(a,b,d){var e,f;return d||(f=$a[b],$a[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,$a[b]=f),e}});var _a=/^(?:input|select|textarea|button)$/i;n.fn.extend({prop:function(a,b){return J(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute("tabindex")||_a.test(a.nodeName)||a.href?a.tabIndex:-1}}}}),k.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var ab=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ab," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||"string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ab," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?n.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=n(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===U||"boolean"===c)&&(this.className&&L.set(this,"__className__",this.className),this.className=this.className||a===!1?"":L.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ab," ").indexOf(b)>=0)return!0;return!1}});var bb=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(bb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},k.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var cb=n.now(),db=/\?/;n.parseJSON=function(a){return JSON.parse(a+"")},n.parseXML=function(a){var b,c;if(!a||"string"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,"text/xml")}catch(d){b=void 0}return(!b||b.getElementsByTagName("parsererror").length)&&n.error("Invalid XML: "+a),b};var eb=/#.*$/,fb=/([?&])_=[^&]*/,gb=/^(.*?):[ \t]*([^\r\n]*)$/gm,hb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,ib=/^(?:GET|HEAD)$/,jb=/^\/\//,kb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,lb={},mb={},nb="*/".concat("*"),ob=a.location.href,pb=kb.exec(ob.toLowerCase())||[];function qb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(n.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function rb(a,b,c,d){var e={},f=a===mb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function sb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function tb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function ub(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:ob,type:"GET",isLocal:hb.test(pb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":nb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?sb(sb(a,n.ajaxSettings),b):sb(n.ajaxSettings,a)},ajaxPrefilter:qb(lb),ajaxTransport:qb(mb),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!f){f={};while(b=gb.exec(e))f[b[1].toLowerCase()]=b[2]}b=f[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?e:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return c&&c.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||ob)+"").replace(eb,"").replace(jb,pb[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(h=kb.exec(k.url.toLowerCase()),k.crossDomain=!(!h||h[1]===pb[1]&&h[2]===pb[2]&&(h[3]||("http:"===h[1]?"80":"443"))===(pb[3]||("http:"===pb[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),rb(lb,k,b,v),2===t)return v;i=n.event&&k.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!ib.test(k.type),d=k.url,k.hasContent||(k.data&&(d=k.url+=(db.test(d)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=fb.test(d)?d.replace(fb,"$1_="+cb++):d+(db.test(d)?"&":"?")+"_="+cb++)),k.ifModified&&(n.lastModified[d]&&v.setRequestHeader("If-Modified-Since",n.lastModified[d]),n.etag[d]&&v.setRequestHeader("If-None-Match",n.etag[d])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+nb+"; q=0.01":""):k.accepts["*"]);for(j in k.headers)v.setRequestHeader(j,k.headers[j]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(j in{success:1,error:1,complete:1})v[j](k[j]);if(c=rb(mb,k,b,v)){v.readyState=1,i&&m.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,c.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,f,h){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),c=void 0,e=h||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,f&&(u=tb(k,v,f)),u=ub(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(n.lastModified[d]=w),w=v.getResponseHeader("etag"),w&&(n.etag[d]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,i&&m.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),i&&(m.trigger("ajaxComplete",[v,k]),--n.active||n.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var vb=/%20/g,wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&").replace(vb,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!T.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Bb=0,Cb={},Db={0:200,1223:204},Eb=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Cb)Cb[a]()}),k.cors=!!Eb&&"withCredentials"in Eb,k.ajax=Eb=!!Eb,n.ajaxTransport(function(a){var b;return k.cors||Eb&&!a.crossDomain?{send:function(c,d){var e,f=a.xhr(),g=++Bb;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Cb[g],b=f.onload=f.onerror=null,"abort"===a?f.abort():"error"===a?d(f.status,f.statusText):d(Db[f.status]||f.status,f.statusText,"string"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b("error"),b=Cb[g]=b("abort");try{f.send(a.hasContent&&a.data||null)}catch(h){if(b)throw h}},abort:function(){b&&b()}}:void 0}),n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=n("<script>").prop({async:!0,charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&e("error"===a.type?404:200,a.type)}),l.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Fb=[],Gb=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Fb.pop()||n.expando+"_"+cb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Gb.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Gb.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Gb,"$1"+e):b.jsonp!==!1&&(b.url+=(db.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Fb.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||l;var d=v.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=n.buildFragment([a],b,e),e&&e.length&&n(e).remove(),n.merge([],d.childNodes))};var Hb=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&Hb)return Hb.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=n.trim(a.slice(h)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e,dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,f||[a.responseText,b,a])}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};var Ib=a.document.documentElement;function Jb(a){return n.isWindow(a)?a:9===a.nodeType&&a.defaultView}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d=this[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,n.contains(b,d)?(typeof d.getBoundingClientRect!==U&&(e=d.getBoundingClientRect()),c=Jb(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===n.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(d=a.offset()),d.top+=n.css(a[0],"borderTopWidth",!0),d.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-d.top-n.css(c,"marginTop",!0),left:b.left-d.left-n.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||Ib;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Ib})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b,c){var d="pageYOffset"===c;n.fn[b]=function(e){return J(this,function(b,e,f){var g=Jb(b);return void 0===f?g?g[c]:b[e]:void(g?g.scrollTo(d?a.pageXOffset:f,d?f:a.pageYOffset):b[e]=f)},b,e,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=ya(k.pixelPosition,function(a,c){return c?(c=xa(a,b),va.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return J(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var Kb=a.jQuery,Lb=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=Lb),b&&a.jQuery===n&&(a.jQuery=Kb),n},typeof b===U&&(a.jQuery=a.$=n),n});
+//# sourceMappingURL=jquery.min.map
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/license-stat.csv b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/license-stat.csv
new file mode 100644
index 0000000..fd3c5ca
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/license-stat.csv
@@ -0,0 +1,26 @@
+Type,Package,License
+npm,angular,MIT License
+npm,angular-animate,MIT License
+npm,angular-bootstrap,MIT License
+npm,angular-clipboard,MIT License
+npm,angular-cookies,MIT License
+npm,angular-date-time-input,MIT License
+npm,angular-loading-bar,MIT License
+npm,angular-mocks,MIT License
+npm,angular-resource,MIT License
+npm,angular-route,MIT License
+npm,angular-selectize2,MIT License
+npm,angular-table-resize,MIT License
+npm,angular-touch,MIT License
+npm,angular-ui-notification,MIT License
+npm,angular-ui-router,MIT License
+npm,angular-utils-pagination,MIT License
+npm,angularjs-bootstrap-datetimepicker,MIT License
+npm,bootstrap-switch,Apache License 2.0
+npm,bootstrap-tagsinput,MIT License
+npm,moment,MIT License
+npm,ng-dialog,MIT License
+npm,ng-tags-input,MIT License
+npm,oclazyload,MIT License
+npm,selectize,Apache License 2.0
+lib,jsTreeTable,MIT License
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/package-lock.json b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/package-lock.json
new file mode 100644
index 0000000..b18d466
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/package-lock.json
@@ -0,0 +1,4498 @@
+{
+  "name": "sentinel-dashboard",
+  "version": "1.0.0",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "@uirouter/core": {
+      "version": "5.0.20",
+      "resolved": "http://registry.npm.alibaba-inc.com/@uirouter/core/download/@uirouter/core-5.0.20.tgz",
+      "integrity": "sha1-nCfY0U1QNYBAhA/QDp04w2vhrcU="
+    },
+    "accepts": {
+      "version": "1.3.5",
+      "resolved": "http://registry.npm.alibaba-inc.com/accepts/download/accepts-1.3.5.tgz",
+      "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
+      "dev": true,
+      "requires": {
+        "mime-types": "~2.1.18",
+        "negotiator": "0.6.1"
+      }
+    },
+    "amdefine": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/amdefine/download/amdefine-1.0.1.tgz",
+      "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
+      "dev": true
+    },
+    "angular": {
+      "version": "1.7.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/angular/download/angular-1.7.2.tgz",
+      "integrity": "sha1-aHuVXb5cUz+Nc0YEYXB68ANgJR8="
+    },
+    "angular-animate": {
+      "version": "1.7.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/angular-animate/download/angular-animate-1.7.2.tgz",
+      "integrity": "sha1-SNHSLK8AV7V7UPiCto1Rwpeqd0c="
+    },
+    "angular-bootstrap": {
+      "version": "0.12.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/angular-bootstrap/download/angular-bootstrap-0.12.2.tgz",
+      "integrity": "sha1-3pkAp9sIen6dpHMEqcL3f5wGmCc="
+    },
+    "angular-clipboard": {
+      "version": "1.6.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/angular-clipboard/download/angular-clipboard-1.6.2.tgz",
+      "integrity": "sha1-RwjlodyU85QKuJhh6h4ZsmdUFU8="
+    },
+    "angular-cookies": {
+      "version": "1.7.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/angular-cookies/download/angular-cookies-1.7.2.tgz",
+      "integrity": "sha1-y6OpGB0qSMLYGV/3/jKQVfupcLo="
+    },
+    "angular-date-time-input": {
+      "version": "1.2.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/angular-date-time-input/download/angular-date-time-input-1.2.1.tgz",
+      "integrity": "sha1-bXt+tH+yz2GYylZMXdW8UVYnnXY=",
+      "requires": {
+        "angular": "^1.x",
+        "moment": "^2.15.x"
+      }
+    },
+    "angular-loading-bar": {
+      "version": "0.9.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/angular-loading-bar/download/angular-loading-bar-0.9.0.tgz",
+      "integrity": "sha1-N+9Swl8QLCFuezzf0vxaXflijkU="
+    },
+    "angular-mocks": {
+      "version": "1.7.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/angular-mocks/download/angular-mocks-1.7.2.tgz",
+      "integrity": "sha1-iivHp841VpekirAOVIuI549x+lI="
+    },
+    "angular-resource": {
+      "version": "1.7.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/angular-resource/download/angular-resource-1.7.2.tgz",
+      "integrity": "sha1-NtHd9AaCuY96lYA9Y6ZMxM5Wcqg="
+    },
+    "angular-route": {
+      "version": "1.7.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/angular-route/download/angular-route-1.7.2.tgz",
+      "integrity": "sha1-okt6DI7wmj1OLKIN5/hODoV6Ya4="
+    },
+    "angular-selectize2": {
+      "version": "1.2.3",
+      "resolved": "http://registry.npm.alibaba-inc.com/angular-selectize2/download/angular-selectize2-1.2.3.tgz",
+      "integrity": "sha1-rJJvgtckbYcBC6W+N/BKrfkRbZU="
+    },
+    "angular-table-resize": {
+      "version": "2.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/angular-table-resize/download/angular-table-resize-2.0.1.tgz",
+      "integrity": "sha1-yZaAqAOA9SEu/HHRTfk3uTdOmOk=",
+      "requires": {
+        "angular": "^1.5.7",
+        "jquery": "^3.0.0"
+      }
+    },
+    "angular-touch": {
+      "version": "1.7.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/angular-touch/download/angular-touch-1.7.2.tgz",
+      "integrity": "sha1-VLoh5nUgsPv2ocenz6RfvY/Fnvc="
+    },
+    "angular-ui-notification": {
+      "version": "0.3.6",
+      "resolved": "http://registry.npm.alibaba-inc.com/angular-ui-notification/download/angular-ui-notification-0.3.6.tgz",
+      "integrity": "sha1-MzvL6ComUUgrOcNZWzy/qI4wvPc="
+    },
+    "angular-ui-router": {
+      "version": "1.0.19",
+      "resolved": "http://registry.npm.alibaba-inc.com/angular-ui-router/download/angular-ui-router-1.0.19.tgz",
+      "integrity": "sha1-nB9KVMimX3xrcKm00IGPXxL7AaE=",
+      "requires": {
+        "@uirouter/core": "5.0.20"
+      }
+    },
+    "angular-utils-pagination": {
+      "version": "0.11.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/angular-utils-pagination/download/angular-utils-pagination-0.11.1.tgz",
+      "integrity": "sha1-7618iHm+swrT13cH+T49DvUfLGY="
+    },
+    "angularjs-bootstrap-datetimepicker": {
+      "version": "1.1.4",
+      "resolved": "http://registry.npm.alibaba-inc.com/angularjs-bootstrap-datetimepicker/download/angularjs-bootstrap-datetimepicker-1.1.4.tgz",
+      "integrity": "sha1-iKT+oORv6PRWHirDKWT/WJ5UZKk=",
+      "requires": {
+        "angular": "^1.6.4",
+        "moment": "^2.18.1"
+      }
+    },
+    "ansi-colors": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-2.0.5.tgz",
+      "integrity": "sha512-yAdfUZ+c2wetVNIFsNRn44THW+Lty6S5TwMpUfLA/UaGhiXbBv/F8E60/1hMLd0cnF/CDoWH8vzVaI5bAcHCjw==",
+      "dev": true
+    },
+    "ansi-cyan": {
+      "version": "0.1.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/ansi-cyan/download/ansi-cyan-0.1.1.tgz",
+      "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=",
+      "dev": true,
+      "requires": {
+        "ansi-wrap": "0.1.0"
+      }
+    },
+    "ansi-gray": {
+      "version": "0.1.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/ansi-gray/download/ansi-gray-0.1.1.tgz",
+      "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=",
+      "dev": true,
+      "requires": {
+        "ansi-wrap": "0.1.0"
+      }
+    },
+    "ansi-red": {
+      "version": "0.1.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/ansi-red/download/ansi-red-0.1.1.tgz",
+      "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=",
+      "dev": true,
+      "requires": {
+        "ansi-wrap": "0.1.0"
+      }
+    },
+    "ansi-regex": {
+      "version": "2.1.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/ansi-regex/download/ansi-regex-2.1.1.tgz",
+      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+      "dev": true
+    },
+    "ansi-styles": {
+      "version": "2.2.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/ansi-styles/download/ansi-styles-2.2.1.tgz",
+      "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+      "dev": true
+    },
+    "ansi-wrap": {
+      "version": "0.1.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/ansi-wrap/download/ansi-wrap-0.1.0.tgz",
+      "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
+      "dev": true
+    },
+    "ansicolors": {
+      "version": "0.2.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/ansicolors/download/ansicolors-0.2.1.tgz",
+      "integrity": "sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8="
+    },
+    "archy": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/archy/download/archy-1.0.0.tgz",
+      "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
+      "dev": true
+    },
+    "arr-diff": {
+      "version": "4.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/arr-diff/download/arr-diff-4.0.0.tgz",
+      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+      "dev": true
+    },
+    "arr-flatten": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/arr-flatten/download/arr-flatten-1.1.0.tgz",
+      "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=",
+      "dev": true
+    },
+    "arr-union": {
+      "version": "3.1.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/arr-union/download/arr-union-3.1.0.tgz",
+      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+      "dev": true
+    },
+    "array-differ": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/array-differ/download/array-differ-1.0.0.tgz",
+      "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=",
+      "dev": true
+    },
+    "array-each": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/array-each/download/array-each-1.0.1.tgz",
+      "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=",
+      "dev": true
+    },
+    "array-find-index": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/array-find-index/download/array-find-index-1.0.2.tgz",
+      "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+      "dev": true
+    },
+    "array-slice": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.taobao.org/array-slice/download/array-slice-1.1.0.tgz",
+      "integrity": "sha1-42jqFfibxwaff/uJrsOmx9SsItQ=",
+      "dev": true
+    },
+    "array-uniq": {
+      "version": "1.0.3",
+      "resolved": "http://registry.npm.alibaba-inc.com/array-uniq/download/array-uniq-1.0.3.tgz",
+      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+      "dev": true
+    },
+    "array-unique": {
+      "version": "0.3.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/array-unique/download/array-unique-0.3.2.tgz",
+      "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+      "dev": true
+    },
+    "assign-symbols": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/assign-symbols/download/assign-symbols-1.0.0.tgz",
+      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+      "dev": true
+    },
+    "async": {
+      "version": "2.6.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/async/download/async-2.6.1.tgz",
+      "integrity": "sha1-skWiPKcZMAROxT+kaqAKPofGphA=",
+      "requires": {
+        "lodash": "^4.17.10"
+      }
+    },
+    "atob": {
+      "version": "2.1.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/atob/download/atob-2.1.1.tgz",
+      "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=",
+      "dev": true
+    },
+    "balanced-match": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/balanced-match/download/balanced-match-1.0.0.tgz",
+      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+      "dev": true
+    },
+    "base": {
+      "version": "0.11.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/base/download/base-0.11.2.tgz",
+      "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=",
+      "dev": true,
+      "requires": {
+        "cache-base": "^1.0.1",
+        "class-utils": "^0.3.5",
+        "component-emitter": "^1.2.1",
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.1",
+        "mixin-deep": "^1.2.0",
+        "pascalcase": "^0.1.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/define-property/download/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "http://registry.npm.alibaba-inc.com/is-descriptor/download/is-descriptor-1.0.2.tgz",
+          "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "batch": {
+      "version": "0.6.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/batch/download/batch-0.6.1.tgz",
+      "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
+      "dev": true
+    },
+    "beeper": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/beeper/download/beeper-1.1.1.tgz",
+      "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=",
+      "dev": true
+    },
+    "body": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz",
+      "integrity": "sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=",
+      "dev": true,
+      "requires": {
+        "continuable-cache": "^0.3.1",
+        "error": "^7.0.0",
+        "raw-body": "~1.1.0",
+        "safe-json-parse": "~1.0.1"
+      }
+    },
+    "bootstrap-switch": {
+      "version": "3.3.4",
+      "resolved": "http://registry.npm.alibaba-inc.com/bootstrap-switch/download/bootstrap-switch-3.3.4.tgz",
+      "integrity": "sha1-cOCusqh3wNx2aZHeEI4hcPwpov8="
+    },
+    "bootstrap-tagsinput": {
+      "version": "0.7.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/bootstrap-tagsinput/download/bootstrap-tagsinput-0.7.1.tgz",
+      "integrity": "sha1-/+Owa74qEGlF7ygUVoAFqU8hGTc="
+    },
+    "brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "http://registry.npm.alibaba-inc.com/brace-expansion/download/brace-expansion-1.1.11.tgz",
+      "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=",
+      "dev": true,
+      "requires": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "braces": {
+      "version": "2.3.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/braces/download/braces-2.3.2.tgz",
+      "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=",
+      "dev": true,
+      "requires": {
+        "arr-flatten": "^1.1.0",
+        "array-unique": "^0.3.2",
+        "extend-shallow": "^2.0.1",
+        "fill-range": "^4.0.0",
+        "isobject": "^3.0.1",
+        "repeat-element": "^1.1.2",
+        "snapdragon": "^0.8.1",
+        "snapdragon-node": "^2.0.1",
+        "split-string": "^3.0.2",
+        "to-regex": "^3.0.1"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "http://registry.npm.alibaba-inc.com/extend-shallow/download/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "builtin-modules": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/builtin-modules/download/builtin-modules-1.1.1.tgz",
+      "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+      "dev": true
+    },
+    "bytes": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz",
+      "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=",
+      "dev": true
+    },
+    "cache-base": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/cache-base/download/cache-base-1.0.1.tgz",
+      "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=",
+      "dev": true,
+      "requires": {
+        "collection-visit": "^1.0.0",
+        "component-emitter": "^1.2.1",
+        "get-value": "^2.0.6",
+        "has-value": "^1.0.0",
+        "isobject": "^3.0.1",
+        "set-value": "^2.0.0",
+        "to-object-path": "^0.3.0",
+        "union-value": "^1.0.0",
+        "unset-value": "^1.0.0"
+      }
+    },
+    "camelcase": {
+      "version": "2.1.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/camelcase/download/camelcase-2.1.1.tgz",
+      "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+      "dev": true
+    },
+    "camelcase-keys": {
+      "version": "2.1.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/camelcase-keys/download/camelcase-keys-2.1.0.tgz",
+      "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+      "dev": true,
+      "requires": {
+        "camelcase": "^2.0.0",
+        "map-obj": "^1.0.0"
+      }
+    },
+    "cardinal": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/cardinal/download/cardinal-1.0.0.tgz",
+      "integrity": "sha1-UOIcGwqjdyn5N33vGWtanOyTLuk=",
+      "requires": {
+        "ansicolors": "~0.2.1",
+        "redeyed": "~1.0.0"
+      }
+    },
+    "chalk": {
+      "version": "1.1.3",
+      "resolved": "http://registry.npm.alibaba-inc.com/chalk/download/chalk-1.1.3.tgz",
+      "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "^2.2.1",
+        "escape-string-regexp": "^1.0.2",
+        "has-ansi": "^2.0.0",
+        "strip-ansi": "^3.0.0",
+        "supports-color": "^2.0.0"
+      }
+    },
+    "class-utils": {
+      "version": "0.3.6",
+      "resolved": "http://registry.npm.alibaba-inc.com/class-utils/download/class-utils-0.3.6.tgz",
+      "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=",
+      "dev": true,
+      "requires": {
+        "arr-union": "^3.1.0",
+        "define-property": "^0.2.5",
+        "isobject": "^3.0.0",
+        "static-extend": "^0.1.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "http://registry.npm.alibaba-inc.com/define-property/download/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        }
+      }
+    },
+    "cli": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/cli/download/cli-1.0.1.tgz",
+      "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=",
+      "dev": true,
+      "requires": {
+        "exit": "0.1.2",
+        "glob": "^7.1.1"
+      },
+      "dependencies": {
+        "glob": {
+          "version": "7.1.3",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+          "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+          "dev": true,
+          "requires": {
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        },
+        "minimatch": {
+          "version": "3.0.4",
+          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+          "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+          "dev": true,
+          "requires": {
+            "brace-expansion": "^1.1.7"
+          }
+        }
+      }
+    },
+    "clone": {
+      "version": "1.0.4",
+      "resolved": "http://registry.npm.alibaba-inc.com/clone/download/clone-1.0.4.tgz",
+      "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+      "dev": true
+    },
+    "clone-buffer": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/clone-buffer/download/clone-buffer-1.0.0.tgz",
+      "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=",
+      "dev": true
+    },
+    "clone-stats": {
+      "version": "0.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/clone-stats/download/clone-stats-0.0.1.tgz",
+      "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
+      "dev": true
+    },
+    "cloneable-readable": {
+      "version": "1.1.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/cloneable-readable/download/cloneable-readable-1.1.2.tgz",
+      "integrity": "sha1-1ZHe5Kj4vBXaQ86X3O66E9Q+KmU=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "process-nextick-args": "^2.0.0",
+        "readable-stream": "^2.3.5"
+      },
+      "dependencies": {
+        "isarray": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/isarray/download/isarray-1.0.0.tgz",
+          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+          "dev": true
+        },
+        "readable-stream": {
+          "version": "2.3.6",
+          "resolved": "http://registry.npm.alibaba-inc.com/readable-stream/download/readable-stream-2.3.6.tgz",
+          "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=",
+          "dev": true,
+          "requires": {
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.3",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~2.0.0",
+            "safe-buffer": "~5.1.1",
+            "string_decoder": "~1.1.1",
+            "util-deprecate": "~1.0.1"
+          }
+        },
+        "string_decoder": {
+          "version": "1.1.1",
+          "resolved": "http://registry.npm.alibaba-inc.com/string_decoder/download/string_decoder-1.1.1.tgz",
+          "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=",
+          "dev": true,
+          "requires": {
+            "safe-buffer": "~5.1.0"
+          }
+        }
+      }
+    },
+    "collection-visit": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/collection-visit/download/collection-visit-1.0.0.tgz",
+      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+      "dev": true,
+      "requires": {
+        "map-visit": "^1.0.0",
+        "object-visit": "^1.0.0"
+      }
+    },
+    "color-support": {
+      "version": "1.1.3",
+      "resolved": "http://registry.npm.alibaba-inc.com/color-support/download/color-support-1.1.3.tgz",
+      "integrity": "sha1-k4NDeaHMmgxh+C9S8NBDIiUb1aI=",
+      "dev": true
+    },
+    "commander": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/commander/download/commander-2.0.0.tgz",
+      "integrity": "sha1-0bhvkB+LZL2UG96tr5JFMDk76Sg=",
+      "dev": true
+    },
+    "component-emitter": {
+      "version": "1.2.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/component-emitter/download/component-emitter-1.2.1.tgz",
+      "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+      "dev": true
+    },
+    "concat-map": {
+      "version": "0.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/concat-map/download/concat-map-0.0.1.tgz",
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+      "dev": true
+    },
+    "concat-with-sourcemaps": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/concat-with-sourcemaps/download/concat-with-sourcemaps-1.1.0.tgz",
+      "integrity": "sha1-1OqT8FriV5CVG5nns7CeOQikCC4=",
+      "dev": true,
+      "requires": {
+        "source-map": "^0.6.1"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "http://registry.npm.alibaba-inc.com/source-map/download/source-map-0.6.1.tgz",
+          "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
+          "dev": true
+        }
+      }
+    },
+    "connect": {
+      "version": "3.6.6",
+      "resolved": "http://registry.npm.alibaba-inc.com/connect/download/connect-3.6.6.tgz",
+      "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "finalhandler": "1.1.0",
+        "parseurl": "~1.3.2",
+        "utils-merge": "1.0.1"
+      }
+    },
+    "connect-livereload": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.6.1.tgz",
+      "integrity": "sha512-3R0kMOdL7CjJpU66fzAkCe6HNtd3AavCS4m+uW4KtJjrdGPT0SQEZieAYd+cm+lJoBznNQ4lqipYWkhBMgk00g==",
+      "dev": true
+    },
+    "console-browserify": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/console-browserify/download/console-browserify-1.1.0.tgz",
+      "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
+      "dev": true,
+      "requires": {
+        "date-now": "^0.1.4"
+      }
+    },
+    "continuable-cache": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz",
+      "integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=",
+      "dev": true
+    },
+    "copy-descriptor": {
+      "version": "0.1.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/copy-descriptor/download/copy-descriptor-0.1.1.tgz",
+      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+      "dev": true
+    },
+    "core-util-is": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/core-util-is/download/core-util-is-1.0.2.tgz",
+      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+      "dev": true
+    },
+    "csscomb": {
+      "version": "3.1.8",
+      "resolved": "http://registry.npm.alibaba-inc.com/csscomb/download/csscomb-3.1.8.tgz",
+      "integrity": "sha1-qKc4iE9Am6817JRhr8UuHHW9I6I=",
+      "dev": true,
+      "requires": {
+        "commander": "2.0.0",
+        "csscomb-core": "3.0.0-3.1",
+        "gonzales-pe": "3.0.0-28",
+        "vow": "0.4.4"
+      }
+    },
+    "csscomb-core": {
+      "version": "3.0.0-3.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/csscomb-core/download/csscomb-core-3.0.0-3.1.tgz",
+      "integrity": "sha1-tBHI18/g3z8v4d+E0b1kpvAEbGg=",
+      "dev": true,
+      "requires": {
+        "gonzales-pe": "3.0.0-28",
+        "minimatch": "0.2.12",
+        "vow": "0.4.4",
+        "vow-fs": "0.3.2"
+      },
+      "dependencies": {
+        "minimatch": {
+          "version": "0.2.12",
+          "resolved": "http://registry.npm.alibaba-inc.com/minimatch/download/minimatch-0.2.12.tgz",
+          "integrity": "sha1-6oKgEqxmLH3fqhRPHBR+aUb12vs=",
+          "dev": true,
+          "requires": {
+            "lru-cache": "2",
+            "sigmund": "~1.0.0"
+          }
+        }
+      }
+    },
+    "csv-parse": {
+      "version": "2.5.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/csv-parse/download/csv-parse-2.5.0.tgz",
+      "integrity": "sha1-ZXSJl+zDcZxZRiLbG56g4ut9Vrs="
+    },
+    "currently-unhandled": {
+      "version": "0.4.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/currently-unhandled/download/currently-unhandled-0.4.1.tgz",
+      "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+      "dev": true,
+      "requires": {
+        "array-find-index": "^1.0.1"
+      }
+    },
+    "date-now": {
+      "version": "0.1.4",
+      "resolved": "http://registry.npm.alibaba-inc.com/date-now/download/date-now-0.1.4.tgz",
+      "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
+      "dev": true
+    },
+    "dateformat": {
+      "version": "2.2.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/dateformat/download/dateformat-2.2.0.tgz",
+      "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=",
+      "dev": true
+    },
+    "debug": {
+      "version": "2.6.9",
+      "resolved": "http://registry.npm.alibaba-inc.com/debug/download/debug-2.6.9.tgz",
+      "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
+      "dev": true,
+      "requires": {
+        "ms": "2.0.0"
+      }
+    },
+    "decamelize": {
+      "version": "1.2.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/decamelize/download/decamelize-1.2.0.tgz",
+      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+      "dev": true
+    },
+    "decode-uri-component": {
+      "version": "0.2.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/decode-uri-component/download/decode-uri-component-0.2.0.tgz",
+      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+      "dev": true
+    },
+    "defaults": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npm.taobao.org/defaults/download/defaults-1.0.3.tgz",
+      "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
+      "dev": true,
+      "requires": {
+        "clone": "^1.0.2"
+      }
+    },
+    "define-property": {
+      "version": "2.0.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/define-property/download/define-property-2.0.2.tgz",
+      "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=",
+      "dev": true,
+      "requires": {
+        "is-descriptor": "^1.0.2",
+        "isobject": "^3.0.1"
+      },
+      "dependencies": {
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "http://registry.npm.alibaba-inc.com/is-descriptor/download/is-descriptor-1.0.2.tgz",
+          "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "depd": {
+      "version": "1.1.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/depd/download/depd-1.1.2.tgz",
+      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+      "dev": true
+    },
+    "deprecated": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npm.taobao.org/deprecated/download/deprecated-0.0.1.tgz",
+      "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=",
+      "dev": true
+    },
+    "destroy": {
+      "version": "1.0.4",
+      "resolved": "http://registry.npm.alibaba-inc.com/destroy/download/destroy-1.0.4.tgz",
+      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
+      "dev": true
+    },
+    "detect-file": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/detect-file/download/detect-file-1.0.0.tgz",
+      "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
+      "dev": true
+    },
+    "dom-serializer": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz",
+      "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==",
+      "dev": true,
+      "requires": {
+        "domelementtype": "^1.3.0",
+        "entities": "^1.1.1"
+      },
+      "dependencies": {
+        "entities": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
+          "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
+          "dev": true
+        }
+      }
+    },
+    "domelementtype": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+      "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+      "dev": true
+    },
+    "domhandler": {
+      "version": "2.3.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/domhandler/download/domhandler-2.3.0.tgz",
+      "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=",
+      "dev": true,
+      "requires": {
+        "domelementtype": "1"
+      }
+    },
+    "domutils": {
+      "version": "1.5.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/domutils/download/domutils-1.5.1.tgz",
+      "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
+      "dev": true,
+      "requires": {
+        "dom-serializer": "0",
+        "domelementtype": "1"
+      }
+    },
+    "duplexer2": {
+      "version": "0.0.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/duplexer2/download/duplexer2-0.0.2.tgz",
+      "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=",
+      "dev": true,
+      "requires": {
+        "readable-stream": "~1.1.9"
+      }
+    },
+    "ee-first": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/ee-first/download/ee-first-1.1.1.tgz",
+      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+      "dev": true
+    },
+    "encodeurl": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/encodeurl/download/encodeurl-1.0.2.tgz",
+      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+      "dev": true
+    },
+    "end-of-stream": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npm.taobao.org/end-of-stream/download/end-of-stream-0.1.5.tgz",
+      "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=",
+      "dev": true,
+      "requires": {
+        "once": "~1.3.0"
+      }
+    },
+    "entities": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/entities/download/entities-1.0.0.tgz",
+      "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=",
+      "dev": true
+    },
+    "error": {
+      "version": "7.0.2",
+      "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz",
+      "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=",
+      "dev": true,
+      "requires": {
+        "string-template": "~0.2.1",
+        "xtend": "~4.0.0"
+      }
+    },
+    "error-ex": {
+      "version": "1.3.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/error-ex/download/error-ex-1.3.2.tgz",
+      "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=",
+      "dev": true,
+      "requires": {
+        "is-arrayish": "^0.2.1"
+      }
+    },
+    "escape-html": {
+      "version": "1.0.3",
+      "resolved": "http://registry.npm.alibaba-inc.com/escape-html/download/escape-html-1.0.3.tgz",
+      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+      "dev": true
+    },
+    "escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "http://registry.npm.alibaba-inc.com/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+      "dev": true
+    },
+    "esprima": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/esprima/download/esprima-3.0.0.tgz",
+      "integrity": "sha1-U88kes2ncxPlUcOqLnM0LT+099k="
+    },
+    "etag": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+      "dev": true
+    },
+    "exit": {
+      "version": "0.1.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/exit/download/exit-0.1.2.tgz",
+      "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
+      "dev": true
+    },
+    "expand-brackets": {
+      "version": "2.1.4",
+      "resolved": "http://registry.npm.alibaba-inc.com/expand-brackets/download/expand-brackets-2.1.4.tgz",
+      "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+      "dev": true,
+      "requires": {
+        "debug": "^2.3.3",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "posix-character-classes": "^0.1.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "http://registry.npm.alibaba-inc.com/define-property/download/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "http://registry.npm.alibaba-inc.com/extend-shallow/download/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "expand-tilde": {
+      "version": "2.0.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/expand-tilde/download/expand-tilde-2.0.2.tgz",
+      "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
+      "dev": true,
+      "requires": {
+        "homedir-polyfill": "^1.0.1"
+      }
+    },
+    "extend": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz",
+      "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=",
+      "dev": true
+    },
+    "extend-shallow": {
+      "version": "3.0.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/extend-shallow/download/extend-shallow-3.0.2.tgz",
+      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+      "dev": true,
+      "requires": {
+        "assign-symbols": "^1.0.0",
+        "is-extendable": "^1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "http://registry.npm.alibaba-inc.com/is-extendable/download/is-extendable-1.0.1.tgz",
+          "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=",
+          "dev": true,
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
+      }
+    },
+    "extglob": {
+      "version": "2.0.4",
+      "resolved": "http://registry.npm.alibaba-inc.com/extglob/download/extglob-2.0.4.tgz",
+      "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=",
+      "dev": true,
+      "requires": {
+        "array-unique": "^0.3.2",
+        "define-property": "^1.0.0",
+        "expand-brackets": "^2.1.4",
+        "extend-shallow": "^2.0.1",
+        "fragment-cache": "^0.2.1",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/define-property/download/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "http://registry.npm.alibaba-inc.com/extend-shallow/download/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "http://registry.npm.alibaba-inc.com/is-descriptor/download/is-descriptor-1.0.2.tgz",
+          "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "fancy-log": {
+      "version": "1.3.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/fancy-log/download/fancy-log-1.3.2.tgz",
+      "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=",
+      "dev": true,
+      "requires": {
+        "ansi-gray": "^0.1.1",
+        "color-support": "^1.1.3",
+        "time-stamp": "^1.0.0"
+      }
+    },
+    "faye-websocket": {
+      "version": "0.10.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/faye-websocket/download/faye-websocket-0.10.0.tgz",
+      "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
+      "dev": true,
+      "requires": {
+        "websocket-driver": ">=0.5.1"
+      }
+    },
+    "filesize": {
+      "version": "2.0.4",
+      "resolved": "http://registry.npm.alibaba-inc.com/filesize/download/filesize-2.0.4.tgz",
+      "integrity": "sha1-eAWUHGD83+Y/RtfqNYxZreEcEyU=",
+      "dev": true
+    },
+    "fill-range": {
+      "version": "4.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/fill-range/download/fill-range-4.0.0.tgz",
+      "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^2.0.1",
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1",
+        "to-regex-range": "^2.1.0"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "http://registry.npm.alibaba-inc.com/extend-shallow/download/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "finalhandler": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/finalhandler/download/finalhandler-1.1.0.tgz",
+      "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "encodeurl": "~1.0.1",
+        "escape-html": "~1.0.3",
+        "on-finished": "~2.3.0",
+        "parseurl": "~1.3.2",
+        "statuses": "~1.3.1",
+        "unpipe": "~1.0.0"
+      }
+    },
+    "find-index": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npm.taobao.org/find-index/download/find-index-0.1.1.tgz",
+      "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=",
+      "dev": true
+    },
+    "find-up": {
+      "version": "1.1.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/find-up/download/find-up-1.1.2.tgz",
+      "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+      "dev": true,
+      "requires": {
+        "path-exists": "^2.0.0",
+        "pinkie-promise": "^2.0.0"
+      }
+    },
+    "findup-sync": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/findup-sync/download/findup-sync-2.0.0.tgz",
+      "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
+      "dev": true,
+      "requires": {
+        "detect-file": "^1.0.0",
+        "is-glob": "^3.1.0",
+        "micromatch": "^3.0.4",
+        "resolve-dir": "^1.0.1"
+      }
+    },
+    "fined": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npm.taobao.org/fined/download/fined-1.2.0.tgz",
+      "integrity": "sha1-0AvszxqitHXRbUI7Aji3E6LEo3s=",
+      "dev": true,
+      "requires": {
+        "expand-tilde": "^2.0.2",
+        "is-plain-object": "^2.0.3",
+        "object.defaults": "^1.1.0",
+        "object.pick": "^1.2.0",
+        "parse-filepath": "^1.0.1"
+      }
+    },
+    "first-chunk-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/first-chunk-stream/download/first-chunk-stream-1.0.0.tgz",
+      "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=",
+      "dev": true
+    },
+    "flagged-respawn": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/flagged-respawn/download/flagged-respawn-1.0.1.tgz",
+      "integrity": "sha1-595vEnnd2cqarIpZcdYYYGs6q0E=",
+      "dev": true
+    },
+    "for-in": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/for-in/download/for-in-1.0.2.tgz",
+      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+      "dev": true
+    },
+    "for-own": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/for-own/download/for-own-1.0.0.tgz",
+      "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+      "dev": true,
+      "requires": {
+        "for-in": "^1.0.1"
+      }
+    },
+    "fragment-cache": {
+      "version": "0.2.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/fragment-cache/download/fragment-cache-0.2.1.tgz",
+      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+      "dev": true,
+      "requires": {
+        "map-cache": "^0.2.2"
+      }
+    },
+    "fresh": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+      "dev": true
+    },
+    "fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/fs.realpath/download/fs.realpath-1.0.0.tgz",
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+      "dev": true
+    },
+    "gaze": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npm.taobao.org/gaze/download/gaze-0.5.2.tgz",
+      "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=",
+      "dev": true,
+      "requires": {
+        "globule": "~0.1.0"
+      }
+    },
+    "get-stdin": {
+      "version": "4.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/get-stdin/download/get-stdin-4.0.1.tgz",
+      "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+      "dev": true
+    },
+    "get-value": {
+      "version": "2.0.6",
+      "resolved": "http://registry.npm.alibaba-inc.com/get-value/download/get-value-2.0.6.tgz",
+      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+      "dev": true
+    },
+    "glob": {
+      "version": "4.5.3",
+      "resolved": "https://registry.npm.taobao.org/glob/download/glob-4.5.3.tgz",
+      "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=",
+      "dev": true,
+      "requires": {
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^2.0.1",
+        "once": "^1.3.0"
+      }
+    },
+    "glob-stream": {
+      "version": "3.1.18",
+      "resolved": "https://registry.npm.taobao.org/glob-stream/download/glob-stream-3.1.18.tgz",
+      "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=",
+      "dev": true,
+      "requires": {
+        "glob": "^4.3.1",
+        "glob2base": "^0.0.12",
+        "minimatch": "^2.0.1",
+        "ordered-read-streams": "^0.1.0",
+        "through2": "^0.6.1",
+        "unique-stream": "^1.0.0"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "1.0.34",
+          "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-1.0.34.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freadable-stream%2Fdownload%2Freadable-stream-1.0.34.tgz",
+          "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+          "dev": true,
+          "requires": {
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.1",
+            "isarray": "0.0.1",
+            "string_decoder": "~0.10.x"
+          }
+        },
+        "through2": {
+          "version": "0.6.5",
+          "resolved": "https://registry.npm.taobao.org/through2/download/through2-0.6.5.tgz",
+          "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+          "dev": true,
+          "requires": {
+            "readable-stream": ">=1.0.33-1 <1.1.0-0",
+            "xtend": ">=4.0.0 <4.1.0-0"
+          }
+        }
+      }
+    },
+    "glob-watcher": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npm.taobao.org/glob-watcher/download/glob-watcher-0.0.6.tgz",
+      "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=",
+      "dev": true,
+      "requires": {
+        "gaze": "^0.5.1"
+      }
+    },
+    "glob2base": {
+      "version": "0.0.12",
+      "resolved": "https://registry.npm.taobao.org/glob2base/download/glob2base-0.0.12.tgz",
+      "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=",
+      "dev": true,
+      "requires": {
+        "find-index": "^0.1.1"
+      }
+    },
+    "global-modules": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/global-modules/download/global-modules-1.0.0.tgz",
+      "integrity": "sha1-bXcPDrUjrHgWTXK15xqIdyZcw+o=",
+      "dev": true,
+      "requires": {
+        "global-prefix": "^1.0.1",
+        "is-windows": "^1.0.1",
+        "resolve-dir": "^1.0.0"
+      }
+    },
+    "global-prefix": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/global-prefix/download/global-prefix-1.0.2.tgz",
+      "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
+      "dev": true,
+      "requires": {
+        "expand-tilde": "^2.0.2",
+        "homedir-polyfill": "^1.0.1",
+        "ini": "^1.3.4",
+        "is-windows": "^1.0.1",
+        "which": "^1.2.14"
+      }
+    },
+    "globule": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npm.taobao.org/globule/download/globule-0.1.0.tgz",
+      "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=",
+      "dev": true,
+      "requires": {
+        "glob": "~3.1.21",
+        "lodash": "~1.0.1",
+        "minimatch": "~0.2.11"
+      },
+      "dependencies": {
+        "glob": {
+          "version": "3.1.21",
+          "resolved": "https://registry.npm.taobao.org/glob/download/glob-3.1.21.tgz",
+          "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "~1.2.0",
+            "inherits": "1",
+            "minimatch": "~0.2.11"
+          }
+        },
+        "graceful-fs": {
+          "version": "1.2.3",
+          "resolved": "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-1.2.3.tgz",
+          "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=",
+          "dev": true
+        },
+        "inherits": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-1.0.2.tgz",
+          "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=",
+          "dev": true
+        },
+        "lodash": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-1.0.2.tgz",
+          "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=",
+          "dev": true
+        },
+        "minimatch": {
+          "version": "0.2.14",
+          "resolved": "https://registry.npm.taobao.org/minimatch/download/minimatch-0.2.14.tgz",
+          "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=",
+          "dev": true,
+          "requires": {
+            "lru-cache": "2",
+            "sigmund": "~1.0.0"
+          }
+        }
+      }
+    },
+    "glogg": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/glogg/download/glogg-1.0.1.tgz",
+      "integrity": "sha1-3PdY5EeJzD89MsHzVio2duajSBA=",
+      "dev": true,
+      "requires": {
+        "sparkles": "^1.0.0"
+      }
+    },
+    "gonzales-pe": {
+      "version": "3.0.0-28",
+      "resolved": "http://registry.npm.alibaba-inc.com/gonzales-pe/download/gonzales-pe-3.0.0-28.tgz",
+      "integrity": "sha1-3VC0HdFbaCooxA5fD/IAeQGsYr0=",
+      "dev": true
+    },
+    "graceful-fs": {
+      "version": "3.0.11",
+      "resolved": "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-3.0.11.tgz",
+      "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=",
+      "dev": true,
+      "requires": {
+        "natives": "^1.1.0"
+      }
+    },
+    "graceful-readlink": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/graceful-readlink/download/graceful-readlink-1.0.1.tgz",
+      "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=",
+      "dev": true
+    },
+    "gulp": {
+      "version": "3.9.1",
+      "resolved": "https://registry.npm.taobao.org/gulp/download/gulp-3.9.1.tgz",
+      "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=",
+      "dev": true,
+      "requires": {
+        "archy": "^1.0.0",
+        "chalk": "^1.0.0",
+        "deprecated": "^0.0.1",
+        "gulp-util": "^3.0.0",
+        "interpret": "^1.0.0",
+        "liftoff": "^2.1.0",
+        "minimist": "^1.1.0",
+        "orchestrator": "^0.3.0",
+        "pretty-hrtime": "^1.0.0",
+        "semver": "^4.1.0",
+        "tildify": "^1.0.0",
+        "v8flags": "^2.0.2",
+        "vinyl-fs": "^0.3.0"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        }
+      }
+    },
+    "gulp-clean": {
+      "version": "0.4.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/gulp-clean/download/gulp-clean-0.4.0.tgz",
+      "integrity": "sha1-O8JecITmQbvXveBXz5DAHFDZWVA=",
+      "dev": true,
+      "requires": {
+        "fancy-log": "^1.3.2",
+        "plugin-error": "^0.1.2",
+        "rimraf": "^2.6.2",
+        "through2": "^2.0.3",
+        "vinyl": "^2.1.0"
+      },
+      "dependencies": {
+        "clone": {
+          "version": "2.1.1",
+          "resolved": "http://registry.npm.alibaba-inc.com/clone/download/clone-2.1.1.tgz",
+          "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+          "dev": true
+        },
+        "clone-stats": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/clone-stats/download/clone-stats-1.0.0.tgz",
+          "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
+          "dev": true
+        },
+        "replace-ext": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/replace-ext/download/replace-ext-1.0.0.tgz",
+          "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
+          "dev": true
+        },
+        "vinyl": {
+          "version": "2.2.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/vinyl/download/vinyl-2.2.0.tgz",
+          "integrity": "sha1-2FsH2pbkWNJbL/4Z/s6fLKoT7YY=",
+          "dev": true,
+          "requires": {
+            "clone": "^2.1.1",
+            "clone-buffer": "^1.0.0",
+            "clone-stats": "^1.0.0",
+            "cloneable-readable": "^1.0.0",
+            "remove-trailing-separator": "^1.0.1",
+            "replace-ext": "^1.0.0"
+          }
+        }
+      }
+    },
+    "gulp-concat": {
+      "version": "2.6.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/gulp-concat/download/gulp-concat-2.6.1.tgz",
+      "integrity": "sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M=",
+      "dev": true,
+      "requires": {
+        "concat-with-sourcemaps": "^1.0.0",
+        "through2": "^2.0.0",
+        "vinyl": "^2.0.0"
+      },
+      "dependencies": {
+        "clone": {
+          "version": "2.1.1",
+          "resolved": "http://registry.npm.alibaba-inc.com/clone/download/clone-2.1.1.tgz",
+          "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+          "dev": true
+        },
+        "clone-stats": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/clone-stats/download/clone-stats-1.0.0.tgz",
+          "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
+          "dev": true
+        },
+        "replace-ext": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/replace-ext/download/replace-ext-1.0.0.tgz",
+          "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
+          "dev": true
+        },
+        "vinyl": {
+          "version": "2.2.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/vinyl/download/vinyl-2.2.0.tgz",
+          "integrity": "sha1-2FsH2pbkWNJbL/4Z/s6fLKoT7YY=",
+          "dev": true,
+          "requires": {
+            "clone": "^2.1.1",
+            "clone-buffer": "^1.0.0",
+            "clone-stats": "^1.0.0",
+            "cloneable-readable": "^1.0.0",
+            "remove-trailing-separator": "^1.0.1",
+            "replace-ext": "^1.0.0"
+          }
+        }
+      }
+    },
+    "gulp-connect": {
+      "version": "5.7.0",
+      "resolved": "https://registry.npmjs.org/gulp-connect/-/gulp-connect-5.7.0.tgz",
+      "integrity": "sha512-8tRcC6wgXMLakpPw9M7GRJIhxkYdgZsXwn7n56BA2bQYGLR9NOPhMzx7js+qYDy6vhNkbApGKURjAw1FjY4pNA==",
+      "dev": true,
+      "requires": {
+        "ansi-colors": "^2.0.5",
+        "connect": "^3.6.6",
+        "connect-livereload": "^0.6.0",
+        "fancy-log": "^1.3.2",
+        "map-stream": "^0.0.7",
+        "send": "^0.16.2",
+        "serve-index": "^1.9.1",
+        "serve-static": "^1.13.2",
+        "tiny-lr": "^1.1.1"
+      },
+      "dependencies": {
+        "map-stream": {
+          "version": "0.0.7",
+          "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz",
+          "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=",
+          "dev": true
+        }
+      }
+    },
+    "gulp-csscomb": {
+      "version": "3.0.8",
+      "resolved": "http://registry.npm.alibaba-inc.com/gulp-csscomb/download/gulp-csscomb-3.0.8.tgz",
+      "integrity": "sha1-3zSCSlgKTH0zUcHo67ateh1aibc=",
+      "dev": true,
+      "requires": {
+        "csscomb": "^3.1.7",
+        "gulp-util": "^3.0.7",
+        "through2": "^2.0.1"
+      }
+    },
+    "gulp-cssmin": {
+      "version": "0.2.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/gulp-cssmin/download/gulp-cssmin-0.2.0.tgz",
+      "integrity": "sha1-h6s8ad05sg1dljVcZQStakR7HnI=",
+      "dev": true,
+      "requires": {
+        "clean-css": "^3.1.9",
+        "filesize": "~2.0.0",
+        "graceful-fs": "~4.1.4",
+        "gulp-rename": "~1.1.0",
+        "gulp-util": "~2.2.0",
+        "map-stream": "0.0.4",
+        "temp-write": "~0.1.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "0.2.1",
+          "resolved": "http://registry.npm.alibaba-inc.com/ansi-regex/download/ansi-regex-0.2.1.tgz",
+          "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "1.1.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/ansi-styles/download/ansi-styles-1.1.0.tgz",
+          "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "0.5.1",
+          "resolved": "http://registry.npm.alibaba-inc.com/chalk/download/chalk-0.5.1.tgz",
+          "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^1.1.0",
+            "escape-string-regexp": "^1.0.0",
+            "has-ansi": "^0.1.0",
+            "strip-ansi": "^0.3.0",
+            "supports-color": "^0.2.0"
+          }
+        },
+        "clean-css": {
+          "version": "3.4.28",
+          "resolved": "https://registry.npm.taobao.org/clean-css/download/clean-css-3.4.28.tgz",
+          "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=",
+          "dev": true,
+          "requires": {
+            "commander": "2.8.x",
+            "source-map": "0.4.x"
+          }
+        },
+        "commander": {
+          "version": "2.8.1",
+          "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.8.1.tgz",
+          "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=",
+          "dev": true,
+          "requires": {
+            "graceful-readlink": ">= 1.0.0"
+          }
+        },
+        "dateformat": {
+          "version": "1.0.12",
+          "resolved": "http://registry.npm.alibaba-inc.com/dateformat/download/dateformat-1.0.12.tgz",
+          "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=",
+          "dev": true,
+          "requires": {
+            "get-stdin": "^4.0.1",
+            "meow": "^3.3.0"
+          }
+        },
+        "graceful-fs": {
+          "version": "4.1.11",
+          "resolved": "http://registry.npm.alibaba-inc.com/graceful-fs/download/graceful-fs-4.1.11.tgz",
+          "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+          "dev": true
+        },
+        "gulp-util": {
+          "version": "2.2.20",
+          "resolved": "http://registry.npm.alibaba-inc.com/gulp-util/download/gulp-util-2.2.20.tgz",
+          "integrity": "sha1-1xRuVyiRC9jwR6awseVJvCLb1kw=",
+          "dev": true,
+          "requires": {
+            "chalk": "^0.5.0",
+            "dateformat": "^1.0.7-1.2.3",
+            "lodash._reinterpolate": "^2.4.1",
+            "lodash.template": "^2.4.1",
+            "minimist": "^0.2.0",
+            "multipipe": "^0.1.0",
+            "through2": "^0.5.0",
+            "vinyl": "^0.2.1"
+          }
+        },
+        "has-ansi": {
+          "version": "0.1.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/has-ansi/download/has-ansi-0.1.0.tgz",
+          "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^0.2.0"
+          }
+        },
+        "lodash._reinterpolate": {
+          "version": "2.4.1",
+          "resolved": "http://registry.npm.alibaba-inc.com/lodash._reinterpolate/download/lodash._reinterpolate-2.4.1.tgz",
+          "integrity": "sha1-TxInqlqHEfxjL1sHofRgequLMiI=",
+          "dev": true
+        },
+        "lodash.escape": {
+          "version": "2.4.1",
+          "resolved": "http://registry.npm.alibaba-inc.com/lodash.escape/download/lodash.escape-2.4.1.tgz",
+          "integrity": "sha1-LOEsXghNsKV92l5dHu659dF1o7Q=",
+          "dev": true,
+          "requires": {
+            "lodash._escapehtmlchar": "~2.4.1",
+            "lodash._reunescapedhtml": "~2.4.1",
+            "lodash.keys": "~2.4.1"
+          }
+        },
+        "lodash.keys": {
+          "version": "2.4.1",
+          "resolved": "http://registry.npm.alibaba-inc.com/lodash.keys/download/lodash.keys-2.4.1.tgz",
+          "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=",
+          "dev": true,
+          "requires": {
+            "lodash._isnative": "~2.4.1",
+            "lodash._shimkeys": "~2.4.1",
+            "lodash.isobject": "~2.4.1"
+          }
+        },
+        "lodash.template": {
+          "version": "2.4.1",
+          "resolved": "http://registry.npm.alibaba-inc.com/lodash.template/download/lodash.template-2.4.1.tgz",
+          "integrity": "sha1-nmEQB+32KRKal0qzxIuBez4c8g0=",
+          "dev": true,
+          "requires": {
+            "lodash._escapestringchar": "~2.4.1",
+            "lodash._reinterpolate": "~2.4.1",
+            "lodash.defaults": "~2.4.1",
+            "lodash.escape": "~2.4.1",
+            "lodash.keys": "~2.4.1",
+            "lodash.templatesettings": "~2.4.1",
+            "lodash.values": "~2.4.1"
+          }
+        },
+        "lodash.templatesettings": {
+          "version": "2.4.1",
+          "resolved": "http://registry.npm.alibaba-inc.com/lodash.templatesettings/download/lodash.templatesettings-2.4.1.tgz",
+          "integrity": "sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk=",
+          "dev": true,
+          "requires": {
+            "lodash._reinterpolate": "~2.4.1",
+            "lodash.escape": "~2.4.1"
+          }
+        },
+        "map-stream": {
+          "version": "0.0.4",
+          "resolved": "http://registry.npm.alibaba-inc.com/map-stream/download/map-stream-0.0.4.tgz",
+          "integrity": "sha1-XsbekCE+9sey65Nn6a3o2k79tos=",
+          "dev": true
+        },
+        "minimist": {
+          "version": "0.2.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/minimist/download/minimist-0.2.0.tgz",
+          "integrity": "sha1-Tf/lJdriuGTGbC4jxicdev3s784=",
+          "dev": true
+        },
+        "readable-stream": {
+          "version": "1.0.34",
+          "resolved": "http://registry.npm.alibaba-inc.com/readable-stream/download/readable-stream-1.0.34.tgz",
+          "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+          "dev": true,
+          "requires": {
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.1",
+            "isarray": "0.0.1",
+            "string_decoder": "~0.10.x"
+          }
+        },
+        "source-map": {
+          "version": "0.4.4",
+          "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.4.4.tgz",
+          "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
+          "dev": true,
+          "requires": {
+            "amdefine": ">=0.0.4"
+          }
+        },
+        "strip-ansi": {
+          "version": "0.3.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/strip-ansi/download/strip-ansi-0.3.0.tgz",
+          "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^0.2.1"
+          }
+        },
+        "supports-color": {
+          "version": "0.2.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/supports-color/download/supports-color-0.2.0.tgz",
+          "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=",
+          "dev": true
+        },
+        "through2": {
+          "version": "0.5.1",
+          "resolved": "http://registry.npm.alibaba-inc.com/through2/download/through2-0.5.1.tgz",
+          "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=",
+          "dev": true,
+          "requires": {
+            "readable-stream": "~1.0.17",
+            "xtend": "~3.0.0"
+          }
+        },
+        "vinyl": {
+          "version": "0.2.3",
+          "resolved": "http://registry.npm.alibaba-inc.com/vinyl/download/vinyl-0.2.3.tgz",
+          "integrity": "sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI=",
+          "dev": true,
+          "requires": {
+            "clone-stats": "~0.0.1"
+          }
+        },
+        "xtend": {
+          "version": "3.0.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/xtend/download/xtend-3.0.0.tgz",
+          "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=",
+          "dev": true
+        }
+      }
+    },
+    "gulp-jshint": {
+      "version": "2.1.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/gulp-jshint/download/gulp-jshint-2.1.0.tgz",
+      "integrity": "sha1-v6+Sf3ju4mPFu6xfY+MU1Ep71B4=",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.12.0",
+        "minimatch": "^3.0.3",
+        "plugin-error": "^0.1.2",
+        "rcloader": "^0.2.2",
+        "through2": "^2.0.0"
+      },
+      "dependencies": {
+        "minimatch": {
+          "version": "3.0.4",
+          "resolved": "http://registry.npm.alibaba-inc.com/minimatch/download/minimatch-3.0.4.tgz",
+          "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=",
+          "dev": true,
+          "requires": {
+            "brace-expansion": "^1.1.7"
+          }
+        }
+      }
+    },
+    "gulp-load-plugins": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/gulp-load-plugins/-/gulp-load-plugins-1.6.0.tgz",
+      "integrity": "sha512-HlCODki0WHJvQIgAsJYOTkyo0c7TsDCetvfhrdGz9JYPL6A4mFRMGmKfoi6JmXjA/vvzg+fkT91c9FBh7rnkyg==",
+      "dev": true,
+      "requires": {
+        "array-unique": "^0.2.1",
+        "fancy-log": "^1.2.0",
+        "findup-sync": "^3.0.0",
+        "gulplog": "^1.0.0",
+        "has-gulplog": "^0.1.0",
+        "micromatch": "^3.1.10",
+        "resolve": "^1.1.7"
+      },
+      "dependencies": {
+        "array-unique": {
+          "version": "0.2.1",
+          "resolved": "http://registry.npm.alibaba-inc.com/array-unique/download/array-unique-0.2.1.tgz",
+          "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
+          "dev": true
+        },
+        "findup-sync": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz",
+          "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==",
+          "dev": true,
+          "requires": {
+            "detect-file": "^1.0.0",
+            "is-glob": "^4.0.0",
+            "micromatch": "^3.0.4",
+            "resolve-dir": "^1.0.1"
+          }
+        },
+        "is-glob": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+          "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+          "dev": true,
+          "requires": {
+            "is-extglob": "^2.1.1"
+          }
+        }
+      }
+    },
+    "gulp-rename": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/gulp-rename/download/gulp-rename-1.1.0.tgz",
+      "integrity": "sha1-kwkKqvTThsB/IFOKaIjxXvunJ6E=",
+      "dev": true,
+      "requires": {
+        "map-stream": ">=0.0.4"
+      }
+    },
+    "gulp-serv": {
+      "version": "0.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/gulp-serv/download/gulp-serv-0.0.1.tgz",
+      "integrity": "sha1-8bNhdWfusKUkW2Vw+dSjqBmcZ04=",
+      "dev": true,
+      "requires": {
+        "connect": "^3.3.3",
+        "serve-static": "^1.7.1"
+      }
+    },
+    "gulp-uglify": {
+      "version": "3.0.1",
+      "resolved": "http://registry.npm.taobao.org/gulp-uglify/download/gulp-uglify-3.0.1.tgz",
+      "integrity": "sha1-jT7uRmUhvqaxD9dd/3Kt+LfqLZc=",
+      "dev": true,
+      "requires": {
+        "gulplog": "^1.0.0",
+        "has-gulplog": "^0.1.0",
+        "lodash": "^4.13.1",
+        "make-error-cause": "^1.1.1",
+        "safe-buffer": "^5.1.2",
+        "through2": "^2.0.0",
+        "uglify-js": "^3.0.5",
+        "vinyl-sourcemaps-apply": "^0.2.0"
+      }
+    },
+    "gulp-util": {
+      "version": "3.0.8",
+      "resolved": "http://registry.npm.alibaba-inc.com/gulp-util/download/gulp-util-3.0.8.tgz",
+      "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=",
+      "dev": true,
+      "requires": {
+        "array-differ": "^1.0.0",
+        "array-uniq": "^1.0.2",
+        "beeper": "^1.0.0",
+        "chalk": "^1.0.0",
+        "dateformat": "^2.0.0",
+        "fancy-log": "^1.1.0",
+        "gulplog": "^1.0.0",
+        "has-gulplog": "^0.1.0",
+        "lodash._reescape": "^3.0.0",
+        "lodash._reevaluate": "^3.0.0",
+        "lodash._reinterpolate": "^3.0.0",
+        "lodash.template": "^3.0.0",
+        "minimist": "^1.1.0",
+        "multipipe": "^0.1.2",
+        "object-assign": "^3.0.0",
+        "replace-ext": "0.0.1",
+        "through2": "^2.0.0",
+        "vinyl": "^0.5.0"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/minimist/download/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        }
+      }
+    },
+    "gulplog": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/gulplog/download/gulplog-1.0.0.tgz",
+      "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
+      "dev": true,
+      "requires": {
+        "glogg": "^1.0.0"
+      }
+    },
+    "has-ansi": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/has-ansi/download/has-ansi-2.0.0.tgz",
+      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+      "dev": true,
+      "requires": {
+        "ansi-regex": "^2.0.0"
+      }
+    },
+    "has-gulplog": {
+      "version": "0.1.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/has-gulplog/download/has-gulplog-0.1.0.tgz",
+      "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=",
+      "dev": true,
+      "requires": {
+        "sparkles": "^1.0.0"
+      }
+    },
+    "has-value": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/has-value/download/has-value-1.0.0.tgz",
+      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+      "dev": true,
+      "requires": {
+        "get-value": "^2.0.6",
+        "has-values": "^1.0.0",
+        "isobject": "^3.0.0"
+      }
+    },
+    "has-values": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/has-values/download/has-values-1.0.0.tgz",
+      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+      "dev": true,
+      "requires": {
+        "is-number": "^3.0.0",
+        "kind-of": "^4.0.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "4.0.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/kind-of/download/kind-of-4.0.0.tgz",
+          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "homedir-polyfill": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/homedir-polyfill/download/homedir-polyfill-1.0.1.tgz",
+      "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=",
+      "dev": true,
+      "requires": {
+        "parse-passwd": "^1.0.0"
+      }
+    },
+    "hosted-git-info": {
+      "version": "2.7.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/hosted-git-info/download/hosted-git-info-2.7.1.tgz",
+      "integrity": "sha1-l/I2l3vW4SVAiTD/bePuxigewEc=",
+      "dev": true
+    },
+    "htmlparser2": {
+      "version": "3.8.3",
+      "resolved": "http://registry.npm.alibaba-inc.com/htmlparser2/download/htmlparser2-3.8.3.tgz",
+      "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=",
+      "dev": true,
+      "requires": {
+        "domelementtype": "1",
+        "domhandler": "2.3",
+        "domutils": "1.5",
+        "entities": "1.0",
+        "readable-stream": "1.1"
+      }
+    },
+    "http-errors": {
+      "version": "1.6.3",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+      "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+      "dev": true,
+      "requires": {
+        "depd": "~1.1.2",
+        "inherits": "2.0.3",
+        "setprototypeof": "1.1.0",
+        "statuses": ">= 1.4.0 < 2"
+      },
+      "dependencies": {
+        "statuses": {
+          "version": "1.5.0",
+          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+          "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
+          "dev": true
+        }
+      }
+    },
+    "http-parser-js": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz",
+      "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==",
+      "dev": true
+    },
+    "humanize": {
+      "version": "0.0.9",
+      "resolved": "http://registry.npm.alibaba-inc.com/humanize/download/humanize-0.0.9.tgz",
+      "integrity": "sha1-GZT/rs3+nEQe0r2sdFK3u0yeQaQ="
+    },
+    "indent-string": {
+      "version": "2.1.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/indent-string/download/indent-string-2.1.0.tgz",
+      "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+      "dev": true,
+      "requires": {
+        "repeating": "^2.0.0"
+      }
+    },
+    "inflight": {
+      "version": "1.0.6",
+      "resolved": "http://registry.npm.alibaba-inc.com/inflight/download/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "dev": true,
+      "requires": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "inherits": {
+      "version": "2.0.3",
+      "resolved": "http://registry.npm.alibaba-inc.com/inherits/download/inherits-2.0.3.tgz",
+      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+      "dev": true
+    },
+    "ini": {
+      "version": "1.3.5",
+      "resolved": "http://registry.npm.alibaba-inc.com/ini/download/ini-1.3.5.tgz",
+      "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc=",
+      "dev": true
+    },
+    "interpret": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npm.taobao.org/interpret/download/interpret-1.2.0.tgz",
+      "integrity": "sha1-1QYaYiS+WOgIOYX1AU2EQ1lXYpY=",
+      "dev": true
+    },
+    "is-absolute": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/is-absolute/download/is-absolute-1.0.0.tgz",
+      "integrity": "sha1-OV4a6EsR8mrReV5zwXN45IowFXY=",
+      "dev": true,
+      "requires": {
+        "is-relative": "^1.0.0",
+        "is-windows": "^1.0.1"
+      }
+    },
+    "is-accessor-descriptor": {
+      "version": "0.1.6",
+      "resolved": "http://registry.npm.alibaba-inc.com/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz",
+      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "http://registry.npm.alibaba-inc.com/kind-of/download/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/is-arrayish/download/is-arrayish-0.2.1.tgz",
+      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+      "dev": true
+    },
+    "is-buffer": {
+      "version": "1.1.6",
+      "resolved": "http://registry.npm.alibaba-inc.com/is-buffer/download/is-buffer-1.1.6.tgz",
+      "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=",
+      "dev": true
+    },
+    "is-builtin-module": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/is-builtin-module/download/is-builtin-module-1.0.0.tgz",
+      "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
+      "dev": true,
+      "requires": {
+        "builtin-modules": "^1.0.0"
+      }
+    },
+    "is-data-descriptor": {
+      "version": "0.1.4",
+      "resolved": "http://registry.npm.alibaba-inc.com/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz",
+      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "http://registry.npm.alibaba-inc.com/kind-of/download/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "is-descriptor": {
+      "version": "0.1.6",
+      "resolved": "http://registry.npm.alibaba-inc.com/is-descriptor/download/is-descriptor-0.1.6.tgz",
+      "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=",
+      "dev": true,
+      "requires": {
+        "is-accessor-descriptor": "^0.1.6",
+        "is-data-descriptor": "^0.1.4",
+        "kind-of": "^5.0.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "5.1.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/kind-of/download/kind-of-5.1.0.tgz",
+          "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=",
+          "dev": true
+        }
+      }
+    },
+    "is-extendable": {
+      "version": "0.1.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/is-extendable/download/is-extendable-0.1.1.tgz",
+      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+      "dev": true
+    },
+    "is-extglob": {
+      "version": "2.1.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/is-extglob/download/is-extglob-2.1.1.tgz",
+      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+      "dev": true
+    },
+    "is-finite": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/is-finite/download/is-finite-1.0.2.tgz",
+      "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+      "dev": true,
+      "requires": {
+        "number-is-nan": "^1.0.0"
+      }
+    },
+    "is-glob": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz",
+      "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+      "dev": true,
+      "requires": {
+        "is-extglob": "^2.1.0"
+      }
+    },
+    "is-number": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/is-number/download/is-number-3.0.0.tgz",
+      "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "http://registry.npm.alibaba-inc.com/kind-of/download/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "is-plain-object": {
+      "version": "2.0.4",
+      "resolved": "http://registry.npm.alibaba-inc.com/is-plain-object/download/is-plain-object-2.0.4.tgz",
+      "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=",
+      "dev": true,
+      "requires": {
+        "isobject": "^3.0.1"
+      }
+    },
+    "is-relative": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/is-relative/download/is-relative-1.0.0.tgz",
+      "integrity": "sha1-obtpNc6MXboei5dUubLcwCDiJg0=",
+      "dev": true,
+      "requires": {
+        "is-unc-path": "^1.0.0"
+      }
+    },
+    "is-unc-path": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/is-unc-path/download/is-unc-path-1.0.0.tgz",
+      "integrity": "sha1-1zHoiY7QkKEsNSrS6u1Qla0yLJ0=",
+      "dev": true,
+      "requires": {
+        "unc-path-regex": "^0.1.2"
+      }
+    },
+    "is-utf8": {
+      "version": "0.2.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/is-utf8/download/is-utf8-0.2.1.tgz",
+      "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+      "dev": true
+    },
+    "is-windows": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/is-windows/download/is-windows-1.0.2.tgz",
+      "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=",
+      "dev": true
+    },
+    "is-wsl": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
+      "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
+      "dev": true
+    },
+    "isarray": {
+      "version": "0.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/isarray/download/isarray-0.0.1.tgz",
+      "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+      "dev": true
+    },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/isexe/download/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+      "dev": true
+    },
+    "isobject": {
+      "version": "3.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/isobject/download/isobject-3.0.1.tgz",
+      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+      "dev": true
+    },
+    "jquery": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz",
+      "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw=="
+    },
+    "jshint": {
+      "version": "2.10.2",
+      "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.10.2.tgz",
+      "integrity": "sha512-e7KZgCSXMJxznE/4WULzybCMNXNAd/bf5TSrvVEq78Q/K8ZwFpmBqQeDtNiHc3l49nV4E/+YeHU/JZjSUIrLAA==",
+      "dev": true,
+      "requires": {
+        "cli": "~1.0.0",
+        "console-browserify": "1.1.x",
+        "exit": "0.1.x",
+        "htmlparser2": "3.8.x",
+        "lodash": "~4.17.11",
+        "minimatch": "~3.0.2",
+        "shelljs": "0.3.x",
+        "strip-json-comments": "1.0.x"
+      },
+      "dependencies": {
+        "minimatch": {
+          "version": "3.0.4",
+          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+          "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+          "dev": true,
+          "requires": {
+            "brace-expansion": "^1.1.7"
+          }
+        }
+      }
+    },
+    "kind-of": {
+      "version": "6.0.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/kind-of/download/kind-of-6.0.2.tgz",
+      "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=",
+      "dev": true
+    },
+    "liftoff": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npm.taobao.org/liftoff/download/liftoff-2.5.0.tgz",
+      "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=",
+      "dev": true,
+      "requires": {
+        "extend": "^3.0.0",
+        "findup-sync": "^2.0.0",
+        "fined": "^1.0.1",
+        "flagged-respawn": "^1.0.0",
+        "is-plain-object": "^2.0.4",
+        "object.map": "^1.0.0",
+        "rechoir": "^0.6.2",
+        "resolve": "^1.1.7"
+      }
+    },
+    "livereload-js": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz",
+      "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==",
+      "dev": true
+    },
+    "load-json-file": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/load-json-file/download/load-json-file-1.1.0.tgz",
+      "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "parse-json": "^2.2.0",
+        "pify": "^2.0.0",
+        "pinkie-promise": "^2.0.0",
+        "strip-bom": "^2.0.0"
+      },
+      "dependencies": {
+        "graceful-fs": {
+          "version": "4.1.11",
+          "resolved": "http://registry.npm.alibaba-inc.com/graceful-fs/download/graceful-fs-4.1.11.tgz",
+          "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+          "dev": true
+        },
+        "strip-bom": {
+          "version": "2.0.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/strip-bom/download/strip-bom-2.0.0.tgz",
+          "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+          "dev": true,
+          "requires": {
+            "is-utf8": "^0.2.0"
+          }
+        }
+      }
+    },
+    "lodash": {
+      "version": "4.17.15",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
+      "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
+    },
+    "lodash._basecopy": {
+      "version": "3.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/lodash._basecopy/download/lodash._basecopy-3.0.1.tgz",
+      "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=",
+      "dev": true
+    },
+    "lodash._basetostring": {
+      "version": "3.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/lodash._basetostring/download/lodash._basetostring-3.0.1.tgz",
+      "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=",
+      "dev": true
+    },
+    "lodash._basevalues": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/lodash._basevalues/download/lodash._basevalues-3.0.0.tgz",
+      "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=",
+      "dev": true
+    },
+    "lodash._escapehtmlchar": {
+      "version": "2.4.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/lodash._escapehtmlchar/download/lodash._escapehtmlchar-2.4.1.tgz",
+      "integrity": "sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0=",
+      "dev": true,
+      "requires": {
+        "lodash._htmlescapes": "~2.4.1"
+      }
+    },
+    "lodash._escapestringchar": {
+      "version": "2.4.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/lodash._escapestringchar/download/lodash._escapestringchar-2.4.1.tgz",
+      "integrity": "sha1-7P4iYYoq3lC/7qQ5N+Ud9m8O23I=",
+      "dev": true
+    },
+    "lodash._getnative": {
+      "version": "3.9.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/lodash._getnative/download/lodash._getnative-3.9.1.tgz",
+      "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=",
+      "dev": true
+    },
+    "lodash._htmlescapes": {
+      "version": "2.4.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/lodash._htmlescapes/download/lodash._htmlescapes-2.4.1.tgz",
+      "integrity": "sha1-MtFL8IRLbeb4tioFG09nwii2JMs=",
+      "dev": true
+    },
+    "lodash._isiterateecall": {
+      "version": "3.0.9",
+      "resolved": "http://registry.npm.alibaba-inc.com/lodash._isiterateecall/download/lodash._isiterateecall-3.0.9.tgz",
+      "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=",
+      "dev": true
+    },
+    "lodash._isnative": {
+      "version": "2.4.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/lodash._isnative/download/lodash._isnative-2.4.1.tgz",
+      "integrity": "sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw=",
+      "dev": true
+    },
+    "lodash._objecttypes": {
+      "version": "2.4.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/lodash._objecttypes/download/lodash._objecttypes-2.4.1.tgz",
+      "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=",
+      "dev": true
+    },
+    "lodash._reescape": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/lodash._reescape/download/lodash._reescape-3.0.0.tgz",
+      "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=",
+      "dev": true
+    },
+    "lodash._reevaluate": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/lodash._reevaluate/download/lodash._reevaluate-3.0.0.tgz",
+      "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=",
+      "dev": true
+    },
+    "lodash._reinterpolate": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/lodash._reinterpolate/download/lodash._reinterpolate-3.0.0.tgz",
+      "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=",
+      "dev": true
+    },
+    "lodash._reunescapedhtml": {
+      "version": "2.4.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/lodash._reunescapedhtml/download/lodash._reunescapedhtml-2.4.1.tgz",
+      "integrity": "sha1-dHxPxAED6zu4oJduVx96JlnpO6c=",
+      "dev": true,
+      "requires": {
+        "lodash._htmlescapes": "~2.4.1",
+        "lodash.keys": "~2.4.1"
+      },
+      "dependencies": {
+        "lodash.keys": {
+          "version": "2.4.1",
+          "resolved": "http://registry.npm.alibaba-inc.com/lodash.keys/download/lodash.keys-2.4.1.tgz",
+          "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=",
+          "dev": true,
+          "requires": {
+            "lodash._isnative": "~2.4.1",
+            "lodash._shimkeys": "~2.4.1",
+            "lodash.isobject": "~2.4.1"
+          }
+        }
+      }
+    },
+    "lodash._root": {
+      "version": "3.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/lodash._root/download/lodash._root-3.0.1.tgz",
+      "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=",
+      "dev": true
+    },
+    "lodash._shimkeys": {
+      "version": "2.4.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/lodash._shimkeys/download/lodash._shimkeys-2.4.1.tgz",
+      "integrity": "sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=",
+      "dev": true,
+      "requires": {
+        "lodash._objecttypes": "~2.4.1"
+      }
+    },
+    "lodash.assign": {
+      "version": "4.2.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/lodash.assign/download/lodash.assign-4.2.0.tgz",
+      "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=",
+      "dev": true
+    },
+    "lodash.clonedeep": {
+      "version": "4.5.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/lodash.clonedeep/download/lodash.clonedeep-4.5.0.tgz",
+      "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
+      "dev": true
+    },
+    "lodash.defaults": {
+      "version": "2.4.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/lodash.defaults/download/lodash.defaults-2.4.1.tgz",
+      "integrity": "sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=",
+      "dev": true,
+      "requires": {
+        "lodash._objecttypes": "~2.4.1",
+        "lodash.keys": "~2.4.1"
+      },
+      "dependencies": {
+        "lodash.keys": {
+          "version": "2.4.1",
+          "resolved": "http://registry.npm.alibaba-inc.com/lodash.keys/download/lodash.keys-2.4.1.tgz",
+          "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=",
+          "dev": true,
+          "requires": {
+            "lodash._isnative": "~2.4.1",
+            "lodash._shimkeys": "~2.4.1",
+            "lodash.isobject": "~2.4.1"
+          }
+        }
+      }
+    },
+    "lodash.escape": {
+      "version": "3.2.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/lodash.escape/download/lodash.escape-3.2.0.tgz",
+      "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=",
+      "dev": true,
+      "requires": {
+        "lodash._root": "^3.0.0"
+      }
+    },
+    "lodash.isarguments": {
+      "version": "3.1.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/lodash.isarguments/download/lodash.isarguments-3.1.0.tgz",
+      "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=",
+      "dev": true
+    },
+    "lodash.isarray": {
+      "version": "3.0.4",
+      "resolved": "http://registry.npm.alibaba-inc.com/lodash.isarray/download/lodash.isarray-3.0.4.tgz",
+      "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=",
+      "dev": true
+    },
+    "lodash.isobject": {
+      "version": "2.4.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/lodash.isobject/download/lodash.isobject-2.4.1.tgz",
+      "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=",
+      "dev": true,
+      "requires": {
+        "lodash._objecttypes": "~2.4.1"
+      }
+    },
+    "lodash.keys": {
+      "version": "3.1.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/lodash.keys/download/lodash.keys-3.1.2.tgz",
+      "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
+      "dev": true,
+      "requires": {
+        "lodash._getnative": "^3.0.0",
+        "lodash.isarguments": "^3.0.0",
+        "lodash.isarray": "^3.0.0"
+      }
+    },
+    "lodash.merge": {
+      "version": "4.6.2",
+      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+      "dev": true
+    },
+    "lodash.restparam": {
+      "version": "3.6.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/lodash.restparam/download/lodash.restparam-3.6.1.tgz",
+      "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=",
+      "dev": true
+    },
+    "lodash.template": {
+      "version": "3.6.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/lodash.template/download/lodash.template-3.6.2.tgz",
+      "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=",
+      "dev": true,
+      "requires": {
+        "lodash._basecopy": "^3.0.0",
+        "lodash._basetostring": "^3.0.0",
+        "lodash._basevalues": "^3.0.0",
+        "lodash._isiterateecall": "^3.0.0",
+        "lodash._reinterpolate": "^3.0.0",
+        "lodash.escape": "^3.0.0",
+        "lodash.keys": "^3.0.0",
+        "lodash.restparam": "^3.0.0",
+        "lodash.templatesettings": "^3.0.0"
+      }
+    },
+    "lodash.templatesettings": {
+      "version": "3.1.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/lodash.templatesettings/download/lodash.templatesettings-3.1.1.tgz",
+      "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=",
+      "dev": true,
+      "requires": {
+        "lodash._reinterpolate": "^3.0.0",
+        "lodash.escape": "^3.0.0"
+      }
+    },
+    "lodash.values": {
+      "version": "2.4.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/lodash.values/download/lodash.values-2.4.1.tgz",
+      "integrity": "sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ=",
+      "dev": true,
+      "requires": {
+        "lodash.keys": "~2.4.1"
+      },
+      "dependencies": {
+        "lodash.keys": {
+          "version": "2.4.1",
+          "resolved": "http://registry.npm.alibaba-inc.com/lodash.keys/download/lodash.keys-2.4.1.tgz",
+          "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=",
+          "dev": true,
+          "requires": {
+            "lodash._isnative": "~2.4.1",
+            "lodash._shimkeys": "~2.4.1",
+            "lodash.isobject": "~2.4.1"
+          }
+        }
+      }
+    },
+    "loud-rejection": {
+      "version": "1.6.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/loud-rejection/download/loud-rejection-1.6.0.tgz",
+      "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+      "dev": true,
+      "requires": {
+        "currently-unhandled": "^0.4.1",
+        "signal-exit": "^3.0.0"
+      }
+    },
+    "lru-cache": {
+      "version": "2.7.3",
+      "resolved": "http://registry.npm.alibaba-inc.com/lru-cache/download/lru-cache-2.7.3.tgz",
+      "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=",
+      "dev": true
+    },
+    "make-error": {
+      "version": "1.3.5",
+      "resolved": "http://registry.npm.taobao.org/make-error/download/make-error-1.3.5.tgz",
+      "integrity": "sha1-7+ToH22yjK3WBccPKcgxtY73dsg=",
+      "dev": true
+    },
+    "make-error-cause": {
+      "version": "1.2.2",
+      "resolved": "http://registry.npm.taobao.org/make-error-cause/download/make-error-cause-1.2.2.tgz",
+      "integrity": "sha1-3wOI/NCzeBbf8KX7gQiTl3fcvJ0=",
+      "dev": true,
+      "requires": {
+        "make-error": "^1.2.0"
+      }
+    },
+    "make-iterator": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/make-iterator/download/make-iterator-1.0.1.tgz",
+      "integrity": "sha1-KbM/MSqo9UfEpeSQ9Wr87JkTOtY=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^6.0.2"
+      }
+    },
+    "map-cache": {
+      "version": "0.2.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/map-cache/download/map-cache-0.2.2.tgz",
+      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+      "dev": true
+    },
+    "map-obj": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/map-obj/download/map-obj-1.0.1.tgz",
+      "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+      "dev": true
+    },
+    "map-stream": {
+      "version": "0.1.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/map-stream/download/map-stream-0.1.0.tgz",
+      "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=",
+      "dev": true
+    },
+    "map-visit": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/map-visit/download/map-visit-1.0.0.tgz",
+      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+      "dev": true,
+      "requires": {
+        "object-visit": "^1.0.0"
+      }
+    },
+    "meow": {
+      "version": "3.7.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/meow/download/meow-3.7.0.tgz",
+      "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+      "dev": true,
+      "requires": {
+        "camelcase-keys": "^2.0.0",
+        "decamelize": "^1.1.2",
+        "loud-rejection": "^1.0.0",
+        "map-obj": "^1.0.1",
+        "minimist": "^1.1.3",
+        "normalize-package-data": "^2.3.4",
+        "object-assign": "^4.0.1",
+        "read-pkg-up": "^1.0.1",
+        "redent": "^1.0.0",
+        "trim-newlines": "^1.0.0"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/minimist/download/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        },
+        "object-assign": {
+          "version": "4.1.1",
+          "resolved": "http://registry.npm.alibaba-inc.com/object-assign/download/object-assign-4.1.1.tgz",
+          "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+          "dev": true
+        }
+      }
+    },
+    "micromatch": {
+      "version": "3.1.10",
+      "resolved": "http://registry.npm.alibaba-inc.com/micromatch/download/micromatch-3.1.10.tgz",
+      "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=",
+      "dev": true,
+      "requires": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "braces": "^2.3.1",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "extglob": "^2.0.4",
+        "fragment-cache": "^0.2.1",
+        "kind-of": "^6.0.2",
+        "nanomatch": "^1.2.9",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.2"
+      }
+    },
+    "microplugin": {
+      "version": "0.0.3",
+      "resolved": "http://registry.npm.alibaba-inc.com/microplugin/download/microplugin-0.0.3.tgz",
+      "integrity": "sha1-H8Lhu3yeGegr2Eu6kTe75xJQ2M0="
+    },
+    "mime": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
+      "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
+      "dev": true
+    },
+    "mime-db": {
+      "version": "1.38.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz",
+      "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==",
+      "dev": true
+    },
+    "mime-types": {
+      "version": "2.1.22",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz",
+      "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==",
+      "dev": true,
+      "requires": {
+        "mime-db": "~1.38.0"
+      }
+    },
+    "minimatch": {
+      "version": "2.0.10",
+      "resolved": "https://registry.npm.taobao.org/minimatch/download/minimatch-2.0.10.tgz",
+      "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=",
+      "dev": true,
+      "requires": {
+        "brace-expansion": "^1.0.0"
+      }
+    },
+    "minimist": {
+      "version": "0.0.10",
+      "resolved": "http://registry.npm.alibaba-inc.com/minimist/download/minimist-0.0.10.tgz",
+      "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="
+    },
+    "mixin-deep": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
+      "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+      "dev": true,
+      "requires": {
+        "for-in": "^1.0.2",
+        "is-extendable": "^1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "dev": true,
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
+      }
+    },
+    "mkdirp": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmkdirp%2Fdownload%2Fmkdirp-0.5.1.tgz",
+      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+      "dev": true,
+      "requires": {
+        "minimist": "0.0.8"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "0.0.8",
+          "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz",
+          "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+          "dev": true
+        }
+      }
+    },
+    "moment": {
+      "version": "2.22.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/moment/download/moment-2.22.2.tgz",
+      "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y="
+    },
+    "ms": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/ms/download/ms-2.0.0.tgz",
+      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+      "dev": true
+    },
+    "multipipe": {
+      "version": "0.1.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/multipipe/download/multipipe-0.1.2.tgz",
+      "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=",
+      "dev": true,
+      "requires": {
+        "duplexer2": "0.0.2"
+      }
+    },
+    "nanomatch": {
+      "version": "1.2.13",
+      "resolved": "http://registry.npm.alibaba-inc.com/nanomatch/download/nanomatch-1.2.13.tgz",
+      "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=",
+      "dev": true,
+      "requires": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "fragment-cache": "^0.2.1",
+        "is-windows": "^1.0.2",
+        "kind-of": "^6.0.2",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      }
+    },
+    "natives": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npm.taobao.org/natives/download/natives-1.1.6.tgz",
+      "integrity": "sha1-pgO0pJirdxc2ErnqGs3sTZgPALs=",
+      "dev": true
+    },
+    "negotiator": {
+      "version": "0.6.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/negotiator/download/negotiator-0.6.1.tgz",
+      "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
+      "dev": true
+    },
+    "ng-dialog": {
+      "version": "0.6.6",
+      "resolved": "http://registry.npm.alibaba-inc.com/ng-dialog/download/ng-dialog-0.6.6.tgz",
+      "integrity": "sha1-qtekfI5ByAf3AxPbEpbb6d4x2n0="
+    },
+    "ng-tags-input": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/ng-tags-input/download/ng-tags-input-3.0.0.tgz",
+      "integrity": "sha1-X7BgMuAtOKrQLUQ+P1r8UeEn+ks="
+    },
+    "node-uuid": {
+      "version": "1.4.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/node-uuid/download/node-uuid-1.4.0.tgz",
+      "integrity": "sha1-B/myM3Vy/2J1x3Xh1IUT86RdemU=",
+      "dev": true
+    },
+    "normalize-package-data": {
+      "version": "2.4.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/normalize-package-data/download/normalize-package-data-2.4.0.tgz",
+      "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=",
+      "dev": true,
+      "requires": {
+        "hosted-git-info": "^2.1.4",
+        "is-builtin-module": "^1.0.0",
+        "semver": "2 || 3 || 4 || 5",
+        "validate-npm-package-license": "^3.0.1"
+      }
+    },
+    "number-is-nan": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/number-is-nan/download/number-is-nan-1.0.1.tgz",
+      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+      "dev": true
+    },
+    "object-assign": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/object-assign/download/object-assign-3.0.0.tgz",
+      "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=",
+      "dev": true
+    },
+    "object-copy": {
+      "version": "0.1.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/object-copy/download/object-copy-0.1.0.tgz",
+      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+      "dev": true,
+      "requires": {
+        "copy-descriptor": "^0.1.0",
+        "define-property": "^0.2.5",
+        "kind-of": "^3.0.3"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "http://registry.npm.alibaba-inc.com/define-property/download/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "http://registry.npm.alibaba-inc.com/kind-of/download/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "object-visit": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/object-visit/download/object-visit-1.0.1.tgz",
+      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+      "dev": true,
+      "requires": {
+        "isobject": "^3.0.0"
+      }
+    },
+    "object.defaults": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/object.defaults/download/object.defaults-1.1.0.tgz",
+      "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
+      "dev": true,
+      "requires": {
+        "array-each": "^1.0.1",
+        "array-slice": "^1.0.0",
+        "for-own": "^1.0.0",
+        "isobject": "^3.0.0"
+      }
+    },
+    "object.map": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/object.map/download/object.map-1.0.1.tgz",
+      "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
+      "dev": true,
+      "requires": {
+        "for-own": "^1.0.0",
+        "make-iterator": "^1.0.0"
+      }
+    },
+    "object.pick": {
+      "version": "1.3.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/object.pick/download/object.pick-1.3.0.tgz",
+      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+      "dev": true,
+      "requires": {
+        "isobject": "^3.0.1"
+      }
+    },
+    "oclazyload": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/oclazyload/download/oclazyload-1.1.0.tgz",
+      "integrity": "sha1-qYBzIvGQggqBwCLy7xcB0DbYPoc="
+    },
+    "on-finished": {
+      "version": "2.3.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/on-finished/download/on-finished-2.3.0.tgz",
+      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+      "dev": true,
+      "requires": {
+        "ee-first": "1.1.1"
+      }
+    },
+    "once": {
+      "version": "1.3.3",
+      "resolved": "http://registry.npm.alibaba-inc.com/once/download/once-1.3.3.tgz",
+      "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=",
+      "dev": true,
+      "requires": {
+        "wrappy": "1"
+      }
+    },
+    "open": {
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/open/-/open-6.3.0.tgz",
+      "integrity": "sha512-6AHdrJxPvAXIowO/aIaeHZ8CeMdDf7qCyRNq8NwJpinmCdXhz+NZR7ie1Too94lpciCDsG+qHGO9Mt0svA4OqA==",
+      "dev": true,
+      "requires": {
+        "is-wsl": "^1.1.0"
+      }
+    },
+    "optimist": {
+      "version": "0.6.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/optimist/download/optimist-0.6.1.tgz",
+      "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
+      "requires": {
+        "minimist": "~0.0.1",
+        "wordwrap": "~0.0.2"
+      }
+    },
+    "orchestrator": {
+      "version": "0.3.8",
+      "resolved": "https://registry.npm.taobao.org/orchestrator/download/orchestrator-0.3.8.tgz",
+      "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=",
+      "dev": true,
+      "requires": {
+        "end-of-stream": "~0.1.5",
+        "sequencify": "~0.0.7",
+        "stream-consume": "~0.1.0"
+      }
+    },
+    "ordered-read-streams": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npm.taobao.org/ordered-read-streams/download/ordered-read-streams-0.1.0.tgz",
+      "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=",
+      "dev": true
+    },
+    "os-homedir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/os-homedir/download/os-homedir-1.0.2.tgz",
+      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+      "dev": true
+    },
+    "parse-filepath": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/parse-filepath/download/parse-filepath-1.0.2.tgz",
+      "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
+      "dev": true,
+      "requires": {
+        "is-absolute": "^1.0.0",
+        "map-cache": "^0.2.0",
+        "path-root": "^0.1.1"
+      }
+    },
+    "parse-json": {
+      "version": "2.2.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/parse-json/download/parse-json-2.2.0.tgz",
+      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+      "dev": true,
+      "requires": {
+        "error-ex": "^1.2.0"
+      }
+    },
+    "parse-passwd": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/parse-passwd/download/parse-passwd-1.0.0.tgz",
+      "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
+      "dev": true
+    },
+    "parseurl": {
+      "version": "1.3.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/parseurl/download/parseurl-1.3.2.tgz",
+      "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
+      "dev": true
+    },
+    "pascalcase": {
+      "version": "0.1.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/pascalcase/download/pascalcase-0.1.1.tgz",
+      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+      "dev": true
+    },
+    "path-exists": {
+      "version": "2.1.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/path-exists/download/path-exists-2.1.0.tgz",
+      "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+      "dev": true,
+      "requires": {
+        "pinkie-promise": "^2.0.0"
+      }
+    },
+    "path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/path-is-absolute/download/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+      "dev": true
+    },
+    "path-parse": {
+      "version": "1.0.5",
+      "resolved": "http://registry.npm.alibaba-inc.com/path-parse/download/path-parse-1.0.5.tgz",
+      "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+      "dev": true
+    },
+    "path-root": {
+      "version": "0.1.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/path-root/download/path-root-0.1.1.tgz",
+      "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
+      "dev": true,
+      "requires": {
+        "path-root-regex": "^0.1.0"
+      }
+    },
+    "path-root-regex": {
+      "version": "0.1.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/path-root-regex/download/path-root-regex-0.1.2.tgz",
+      "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=",
+      "dev": true
+    },
+    "path-type": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/path-type/download/path-type-1.1.0.tgz",
+      "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "pify": "^2.0.0",
+        "pinkie-promise": "^2.0.0"
+      },
+      "dependencies": {
+        "graceful-fs": {
+          "version": "4.1.11",
+          "resolved": "http://registry.npm.alibaba-inc.com/graceful-fs/download/graceful-fs-4.1.11.tgz",
+          "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+          "dev": true
+        }
+      }
+    },
+    "pify": {
+      "version": "2.3.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/pify/download/pify-2.3.0.tgz",
+      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+      "dev": true
+    },
+    "pinkie": {
+      "version": "2.0.4",
+      "resolved": "http://registry.npm.alibaba-inc.com/pinkie/download/pinkie-2.0.4.tgz",
+      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+      "dev": true
+    },
+    "pinkie-promise": {
+      "version": "2.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/pinkie-promise/download/pinkie-promise-2.0.1.tgz",
+      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+      "dev": true,
+      "requires": {
+        "pinkie": "^2.0.0"
+      }
+    },
+    "plugin-error": {
+      "version": "0.1.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/plugin-error/download/plugin-error-0.1.2.tgz",
+      "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=",
+      "dev": true,
+      "requires": {
+        "ansi-cyan": "^0.1.1",
+        "ansi-red": "^0.1.1",
+        "arr-diff": "^1.0.1",
+        "arr-union": "^2.0.1",
+        "extend-shallow": "^1.1.2"
+      },
+      "dependencies": {
+        "arr-diff": {
+          "version": "1.1.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/arr-diff/download/arr-diff-1.1.0.tgz",
+          "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=",
+          "dev": true,
+          "requires": {
+            "arr-flatten": "^1.0.1",
+            "array-slice": "^0.2.3"
+          }
+        },
+        "arr-union": {
+          "version": "2.1.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/arr-union/download/arr-union-2.1.0.tgz",
+          "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=",
+          "dev": true
+        },
+        "array-slice": {
+          "version": "0.2.3",
+          "resolved": "http://registry.npm.alibaba-inc.com/array-slice/download/array-slice-0.2.3.tgz",
+          "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
+          "dev": true
+        },
+        "extend-shallow": {
+          "version": "1.1.4",
+          "resolved": "http://registry.npm.alibaba-inc.com/extend-shallow/download/extend-shallow-1.1.4.tgz",
+          "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^1.1.0"
+          }
+        },
+        "kind-of": {
+          "version": "1.1.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/kind-of/download/kind-of-1.1.0.tgz",
+          "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=",
+          "dev": true
+        }
+      }
+    },
+    "posix-character-classes": {
+      "version": "0.1.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/posix-character-classes/download/posix-character-classes-0.1.1.tgz",
+      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+      "dev": true
+    },
+    "pretty-hrtime": {
+      "version": "1.0.3",
+      "resolved": "http://registry.npm.alibaba-inc.com/pretty-hrtime/download/pretty-hrtime-1.0.3.tgz",
+      "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=",
+      "dev": true
+    },
+    "process-nextick-args": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/process-nextick-args/download/process-nextick-args-2.0.0.tgz",
+      "integrity": "sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o=",
+      "dev": true
+    },
+    "qs": {
+      "version": "6.6.0",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.6.0.tgz",
+      "integrity": "sha512-KIJqT9jQJDQx5h5uAVPimw6yVg2SekOKu959OCtktD3FjzbpvaPr8i4zzg07DOMz+igA4W/aNM7OV8H37pFYfA==",
+      "dev": true
+    },
+    "range-parser": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
+      "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
+      "dev": true
+    },
+    "raw-body": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz",
+      "integrity": "sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=",
+      "dev": true,
+      "requires": {
+        "bytes": "1",
+        "string_decoder": "0.10"
+      }
+    },
+    "rcfinder": {
+      "version": "0.1.9",
+      "resolved": "http://registry.npm.alibaba-inc.com/rcfinder/download/rcfinder-0.1.9.tgz",
+      "integrity": "sha1-8+gPOH3fmugK4wpBADKWQuroERU=",
+      "dev": true,
+      "requires": {
+        "lodash.clonedeep": "^4.3.2"
+      }
+    },
+    "rcloader": {
+      "version": "0.2.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/rcloader/download/rcloader-0.2.2.tgz",
+      "integrity": "sha1-WNIpi0YtC5v9ITPSoex0+9cFxxc=",
+      "dev": true,
+      "requires": {
+        "lodash.assign": "^4.2.0",
+        "lodash.isobject": "^3.0.2",
+        "lodash.merge": "^4.6.0",
+        "rcfinder": "^0.1.6"
+      },
+      "dependencies": {
+        "lodash.isobject": {
+          "version": "3.0.2",
+          "resolved": "http://registry.npm.alibaba-inc.com/lodash.isobject/download/lodash.isobject-3.0.2.tgz",
+          "integrity": "sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0=",
+          "dev": true
+        }
+      }
+    },
+    "read-pkg": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/read-pkg/download/read-pkg-1.1.0.tgz",
+      "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+      "dev": true,
+      "requires": {
+        "load-json-file": "^1.0.0",
+        "normalize-package-data": "^2.3.2",
+        "path-type": "^1.0.0"
+      }
+    },
+    "read-pkg-up": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/read-pkg-up/download/read-pkg-up-1.0.1.tgz",
+      "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+      "dev": true,
+      "requires": {
+        "find-up": "^1.0.0",
+        "read-pkg": "^1.0.0"
+      }
+    },
+    "readable-stream": {
+      "version": "1.1.14",
+      "resolved": "http://registry.npm.alibaba-inc.com/readable-stream/download/readable-stream-1.1.14.tgz",
+      "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+      "dev": true,
+      "requires": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.1",
+        "isarray": "0.0.1",
+        "string_decoder": "~0.10.x"
+      }
+    },
+    "rechoir": {
+      "version": "0.6.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/rechoir/download/rechoir-0.6.2.tgz",
+      "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+      "dev": true,
+      "requires": {
+        "resolve": "^1.1.6"
+      }
+    },
+    "redent": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/redent/download/redent-1.0.0.tgz",
+      "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+      "dev": true,
+      "requires": {
+        "indent-string": "^2.1.0",
+        "strip-indent": "^1.0.1"
+      }
+    },
+    "redeyed": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/redeyed/download/redeyed-1.0.1.tgz",
+      "integrity": "sha1-6WwZO0DAgWsArshCaY5hGF5VSYo=",
+      "requires": {
+        "esprima": "~3.0.0"
+      }
+    },
+    "regex-not": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/regex-not/download/regex-not-1.0.2.tgz",
+      "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^3.0.2",
+        "safe-regex": "^1.1.0"
+      }
+    },
+    "remove-trailing-separator": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz",
+      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+      "dev": true
+    },
+    "repeat-element": {
+      "version": "1.1.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/repeat-element/download/repeat-element-1.1.2.tgz",
+      "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+      "dev": true
+    },
+    "repeat-string": {
+      "version": "1.6.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/repeat-string/download/repeat-string-1.6.1.tgz",
+      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+      "dev": true
+    },
+    "repeating": {
+      "version": "2.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/repeating/download/repeating-2.0.1.tgz",
+      "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+      "dev": true,
+      "requires": {
+        "is-finite": "^1.0.0"
+      }
+    },
+    "replace-ext": {
+      "version": "0.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/replace-ext/download/replace-ext-0.0.1.tgz",
+      "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
+      "dev": true
+    },
+    "resolve": {
+      "version": "1.8.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/resolve/download/resolve-1.8.1.tgz",
+      "integrity": "sha1-gvHsGaQjrB+9CAsLqwa6NuhKeiY=",
+      "dev": true,
+      "requires": {
+        "path-parse": "^1.0.5"
+      }
+    },
+    "resolve-dir": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/resolve-dir/download/resolve-dir-1.0.1.tgz",
+      "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
+      "dev": true,
+      "requires": {
+        "expand-tilde": "^2.0.0",
+        "global-modules": "^1.0.0"
+      }
+    },
+    "resolve-url": {
+      "version": "0.2.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/resolve-url/download/resolve-url-0.2.1.tgz",
+      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+      "dev": true
+    },
+    "ret": {
+      "version": "0.1.15",
+      "resolved": "http://registry.npm.alibaba-inc.com/ret/download/ret-0.1.15.tgz",
+      "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=",
+      "dev": true
+    },
+    "rimraf": {
+      "version": "2.6.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/rimraf/download/rimraf-2.6.2.tgz",
+      "integrity": "sha1-LtgVDSShbqhlHm1u8PR8QVjOejY=",
+      "dev": true,
+      "requires": {
+        "glob": "^7.0.5"
+      },
+      "dependencies": {
+        "glob": {
+          "version": "7.1.2",
+          "resolved": "http://registry.npm.alibaba-inc.com/glob/download/glob-7.1.2.tgz",
+          "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=",
+          "dev": true,
+          "requires": {
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        },
+        "minimatch": {
+          "version": "3.0.4",
+          "resolved": "http://registry.npm.alibaba-inc.com/minimatch/download/minimatch-3.0.4.tgz",
+          "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=",
+          "dev": true,
+          "requires": {
+            "brace-expansion": "^1.1.7"
+          }
+        }
+      }
+    },
+    "safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/safe-buffer/download/safe-buffer-5.1.2.tgz",
+      "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=",
+      "dev": true
+    },
+    "safe-json-parse": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz",
+      "integrity": "sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=",
+      "dev": true
+    },
+    "safe-regex": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/safe-regex/download/safe-regex-1.1.0.tgz",
+      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+      "dev": true,
+      "requires": {
+        "ret": "~0.1.10"
+      }
+    },
+    "selectize": {
+      "version": "0.12.6",
+      "resolved": "http://registry.npm.alibaba-inc.com/selectize/download/selectize-0.12.6.tgz",
+      "integrity": "sha1-ws8Iy6pMsGxembtFKRnXGwgGkNY=",
+      "requires": {
+        "microplugin": "0.0.3",
+        "sifter": "^0.5.1"
+      }
+    },
+    "semver": {
+      "version": "4.3.6",
+      "resolved": "http://registry.npm.alibaba-inc.com/semver/download/semver-4.3.6.tgz",
+      "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=",
+      "dev": true
+    },
+    "send": {
+      "version": "0.16.2",
+      "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
+      "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "destroy": "~1.0.4",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "fresh": "0.5.2",
+        "http-errors": "~1.6.2",
+        "mime": "1.4.1",
+        "ms": "2.0.0",
+        "on-finished": "~2.3.0",
+        "range-parser": "~1.2.0",
+        "statuses": "~1.4.0"
+      },
+      "dependencies": {
+        "statuses": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
+          "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
+          "dev": true
+        }
+      }
+    },
+    "sequencify": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npm.taobao.org/sequencify/download/sequencify-0.0.7.tgz",
+      "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=",
+      "dev": true
+    },
+    "serve-index": {
+      "version": "1.9.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/serve-index/download/serve-index-1.9.1.tgz",
+      "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
+      "dev": true,
+      "requires": {
+        "accepts": "~1.3.4",
+        "batch": "0.6.1",
+        "debug": "2.6.9",
+        "escape-html": "~1.0.3",
+        "http-errors": "~1.6.2",
+        "mime-types": "~2.1.17",
+        "parseurl": "~1.3.2"
+      }
+    },
+    "serve-static": {
+      "version": "1.13.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/serve-static/download/serve-static-1.13.2.tgz",
+      "integrity": "sha1-CV6Ecv1bRiN9tQzkhqQ/S4bGzsE=",
+      "dev": true,
+      "requires": {
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "parseurl": "~1.3.2",
+        "send": "0.16.2"
+      },
+      "dependencies": {
+        "etag": {
+          "version": "1.8.1",
+          "resolved": "http://registry.npm.alibaba-inc.com/etag/download/etag-1.8.1.tgz",
+          "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+          "dev": true
+        },
+        "fresh": {
+          "version": "0.5.2",
+          "resolved": "http://registry.npm.alibaba-inc.com/fresh/download/fresh-0.5.2.tgz",
+          "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+          "dev": true
+        },
+        "http-errors": {
+          "version": "1.6.3",
+          "resolved": "http://registry.npm.alibaba-inc.com/http-errors/download/http-errors-1.6.3.tgz",
+          "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+          "dev": true,
+          "requires": {
+            "depd": "~1.1.2",
+            "inherits": "2.0.3",
+            "setprototypeof": "1.1.0",
+            "statuses": ">= 1.4.0 < 2"
+          }
+        },
+        "mime": {
+          "version": "1.4.1",
+          "resolved": "http://registry.npm.alibaba-inc.com/mime/download/mime-1.4.1.tgz",
+          "integrity": "sha1-Eh+evEnjdm8xGnbh+hyAA8SwOqY=",
+          "dev": true
+        },
+        "range-parser": {
+          "version": "1.2.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/range-parser/download/range-parser-1.2.0.tgz",
+          "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
+          "dev": true
+        },
+        "send": {
+          "version": "0.16.2",
+          "resolved": "http://registry.npm.alibaba-inc.com/send/download/send-0.16.2.tgz",
+          "integrity": "sha1-bsyh4PjBVtFBWXVZhI32RzCmu8E=",
+          "dev": true,
+          "requires": {
+            "debug": "2.6.9",
+            "depd": "~1.1.2",
+            "destroy": "~1.0.4",
+            "encodeurl": "~1.0.2",
+            "escape-html": "~1.0.3",
+            "etag": "~1.8.1",
+            "fresh": "0.5.2",
+            "http-errors": "~1.6.2",
+            "mime": "1.4.1",
+            "ms": "2.0.0",
+            "on-finished": "~2.3.0",
+            "range-parser": "~1.2.0",
+            "statuses": "~1.4.0"
+          }
+        },
+        "statuses": {
+          "version": "1.4.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/statuses/download/statuses-1.4.0.tgz",
+          "integrity": "sha1-u3PURtonlhBu/MG2AaJT1sRr0Ic=",
+          "dev": true
+        }
+      }
+    },
+    "set-value": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
+      "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^2.0.1",
+        "is-extendable": "^0.1.1",
+        "is-plain-object": "^2.0.3",
+        "split-string": "^3.0.1"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "http://registry.npm.alibaba-inc.com/extend-shallow/download/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "setprototypeof": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/setprototypeof/download/setprototypeof-1.1.0.tgz",
+      "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=",
+      "dev": true
+    },
+    "shelljs": {
+      "version": "0.3.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/shelljs/download/shelljs-0.3.0.tgz",
+      "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=",
+      "dev": true
+    },
+    "sifter": {
+      "version": "0.5.3",
+      "resolved": "http://registry.npm.alibaba-inc.com/sifter/download/sifter-0.5.3.tgz",
+      "integrity": "sha1-XmUH/owRSyso2Qtr9OW2NuYR5Is=",
+      "requires": {
+        "async": "^2.6.0",
+        "cardinal": "^1.0.0",
+        "csv-parse": "^2.0.0",
+        "humanize": "^0.0.9",
+        "optimist": "^0.6.1"
+      }
+    },
+    "sigmund": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/sigmund/download/sigmund-1.0.1.tgz",
+      "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=",
+      "dev": true
+    },
+    "signal-exit": {
+      "version": "3.0.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/signal-exit/download/signal-exit-3.0.2.tgz",
+      "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+      "dev": true
+    },
+    "snapdragon": {
+      "version": "0.8.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/snapdragon/download/snapdragon-0.8.2.tgz",
+      "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=",
+      "dev": true,
+      "requires": {
+        "base": "^0.11.1",
+        "debug": "^2.2.0",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "map-cache": "^0.2.2",
+        "source-map": "^0.5.6",
+        "source-map-resolve": "^0.5.0",
+        "use": "^3.1.0"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "http://registry.npm.alibaba-inc.com/define-property/download/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "http://registry.npm.alibaba-inc.com/extend-shallow/download/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "http://registry.npm.alibaba-inc.com/source-map/download/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        }
+      }
+    },
+    "snapdragon-node": {
+      "version": "2.1.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/snapdragon-node/download/snapdragon-node-2.1.1.tgz",
+      "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=",
+      "dev": true,
+      "requires": {
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.0",
+        "snapdragon-util": "^3.0.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/define-property/download/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "http://registry.npm.alibaba-inc.com/is-descriptor/download/is-descriptor-1.0.2.tgz",
+          "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "snapdragon-util": {
+      "version": "3.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/snapdragon-util/download/snapdragon-util-3.0.1.tgz",
+      "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.2.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "http://registry.npm.alibaba-inc.com/kind-of/download/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "source-map": {
+      "version": "0.7.3",
+      "resolved": "http://registry.npm.alibaba-inc.com/source-map/download/source-map-0.7.3.tgz",
+      "integrity": "sha1-UwL4FpAxc1ImVECS5kmB91F1A4M=",
+      "dev": true
+    },
+    "source-map-resolve": {
+      "version": "0.5.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/source-map-resolve/download/source-map-resolve-0.5.2.tgz",
+      "integrity": "sha1-cuLMNAlVQ+Q7LGKyxMENSpBU8lk=",
+      "dev": true,
+      "requires": {
+        "atob": "^2.1.1",
+        "decode-uri-component": "^0.2.0",
+        "resolve-url": "^0.2.1",
+        "source-map-url": "^0.4.0",
+        "urix": "^0.1.0"
+      }
+    },
+    "source-map-url": {
+      "version": "0.4.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/source-map-url/download/source-map-url-0.4.0.tgz",
+      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+      "dev": true
+    },
+    "sparkles": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/sparkles/download/sparkles-1.0.1.tgz",
+      "integrity": "sha1-AI22XtzmxQ7sDF4ijhlFBh3QQ3w=",
+      "dev": true
+    },
+    "spdx-correct": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/spdx-correct/download/spdx-correct-3.0.0.tgz",
+      "integrity": "sha1-BaW01xU6GVvJLDxCW2nzsqlSTII=",
+      "dev": true,
+      "requires": {
+        "spdx-expression-parse": "^3.0.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "spdx-exceptions": {
+      "version": "2.1.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/spdx-exceptions/download/spdx-exceptions-2.1.0.tgz",
+      "integrity": "sha1-LHrmEFbHFKW5ubKyr30xHvXHj+k=",
+      "dev": true
+    },
+    "spdx-expression-parse": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/spdx-expression-parse/download/spdx-expression-parse-3.0.0.tgz",
+      "integrity": "sha1-meEZt6XaAOBUkcn6M4t5BII7QdA=",
+      "dev": true,
+      "requires": {
+        "spdx-exceptions": "^2.1.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "spdx-license-ids": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/spdx-license-ids/download/spdx-license-ids-3.0.0.tgz",
+      "integrity": "sha1-enzShHDMbToc/m1miG9rxDDTrIc=",
+      "dev": true
+    },
+    "split-string": {
+      "version": "3.1.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/split-string/download/split-string-3.1.0.tgz",
+      "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^3.0.0"
+      }
+    },
+    "static-extend": {
+      "version": "0.1.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/static-extend/download/static-extend-0.1.2.tgz",
+      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+      "dev": true,
+      "requires": {
+        "define-property": "^0.2.5",
+        "object-copy": "^0.1.0"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "http://registry.npm.alibaba-inc.com/define-property/download/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        }
+      }
+    },
+    "statuses": {
+      "version": "1.3.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/statuses/download/statuses-1.3.1.tgz",
+      "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=",
+      "dev": true
+    },
+    "stream-consume": {
+      "version": "0.1.1",
+      "resolved": "http://registry.npm.taobao.org/stream-consume/download/stream-consume-0.1.1.tgz",
+      "integrity": "sha1-0721mMK9CugrjKx6xQsRB6eZbEg=",
+      "dev": true
+    },
+    "string-template": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz",
+      "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=",
+      "dev": true
+    },
+    "string_decoder": {
+      "version": "0.10.31",
+      "resolved": "http://registry.npm.alibaba-inc.com/string_decoder/download/string_decoder-0.10.31.tgz",
+      "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+      "dev": true
+    },
+    "strip-ansi": {
+      "version": "3.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/strip-ansi/download/strip-ansi-3.0.1.tgz",
+      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+      "dev": true,
+      "requires": {
+        "ansi-regex": "^2.0.0"
+      }
+    },
+    "strip-bom": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/strip-bom/download/strip-bom-1.0.0.tgz",
+      "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=",
+      "dev": true,
+      "requires": {
+        "first-chunk-stream": "^1.0.0",
+        "is-utf8": "^0.2.0"
+      }
+    },
+    "strip-indent": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/strip-indent/download/strip-indent-1.0.1.tgz",
+      "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+      "dev": true,
+      "requires": {
+        "get-stdin": "^4.0.1"
+      }
+    },
+    "strip-json-comments": {
+      "version": "1.0.4",
+      "resolved": "http://registry.npm.alibaba-inc.com/strip-json-comments/download/strip-json-comments-1.0.4.tgz",
+      "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=",
+      "dev": true
+    },
+    "supports-color": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/supports-color/download/supports-color-2.0.0.tgz",
+      "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+      "dev": true
+    },
+    "temp-write": {
+      "version": "0.1.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/temp-write/download/temp-write-0.1.1.tgz",
+      "integrity": "sha1-C2Rng43Xf79/YqDJPah5cy/9qTI=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "~2.0.0",
+        "tempfile": "~0.1.2"
+      },
+      "dependencies": {
+        "graceful-fs": {
+          "version": "2.0.3",
+          "resolved": "http://registry.npm.alibaba-inc.com/graceful-fs/download/graceful-fs-2.0.3.tgz",
+          "integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA=",
+          "dev": true
+        }
+      }
+    },
+    "tempfile": {
+      "version": "0.1.3",
+      "resolved": "http://registry.npm.alibaba-inc.com/tempfile/download/tempfile-0.1.3.tgz",
+      "integrity": "sha1-fWtxAEcznTn4RzJ6BW2t8YMQMBA=",
+      "dev": true,
+      "requires": {
+        "uuid": "~1.4.0"
+      }
+    },
+    "through2": {
+      "version": "2.0.3",
+      "resolved": "http://registry.npm.alibaba-inc.com/through2/download/through2-2.0.3.tgz",
+      "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+      "dev": true,
+      "requires": {
+        "readable-stream": "^2.1.5",
+        "xtend": "~4.0.1"
+      },
+      "dependencies": {
+        "isarray": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/isarray/download/isarray-1.0.0.tgz",
+          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+          "dev": true
+        },
+        "readable-stream": {
+          "version": "2.3.6",
+          "resolved": "http://registry.npm.alibaba-inc.com/readable-stream/download/readable-stream-2.3.6.tgz",
+          "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=",
+          "dev": true,
+          "requires": {
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.3",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~2.0.0",
+            "safe-buffer": "~5.1.1",
+            "string_decoder": "~1.1.1",
+            "util-deprecate": "~1.0.1"
+          }
+        },
+        "string_decoder": {
+          "version": "1.1.1",
+          "resolved": "http://registry.npm.alibaba-inc.com/string_decoder/download/string_decoder-1.1.1.tgz",
+          "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=",
+          "dev": true,
+          "requires": {
+            "safe-buffer": "~5.1.0"
+          }
+        }
+      }
+    },
+    "tildify": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npm.taobao.org/tildify/download/tildify-1.2.0.tgz",
+      "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=",
+      "dev": true,
+      "requires": {
+        "os-homedir": "^1.0.0"
+      }
+    },
+    "time-stamp": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/time-stamp/download/time-stamp-1.1.0.tgz",
+      "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=",
+      "dev": true
+    },
+    "tiny-lr": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.1.1.tgz",
+      "integrity": "sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==",
+      "dev": true,
+      "requires": {
+        "body": "^5.1.0",
+        "debug": "^3.1.0",
+        "faye-websocket": "~0.10.0",
+        "livereload-js": "^2.3.0",
+        "object-assign": "^4.1.0",
+        "qs": "^6.4.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.6",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+          "dev": true
+        },
+        "object-assign": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+          "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+          "dev": true
+        }
+      }
+    },
+    "to-object-path": {
+      "version": "0.3.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/to-object-path/download/to-object-path-0.3.0.tgz",
+      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "http://registry.npm.alibaba-inc.com/kind-of/download/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "to-regex": {
+      "version": "3.0.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/to-regex/download/to-regex-3.0.2.tgz",
+      "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=",
+      "dev": true,
+      "requires": {
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "regex-not": "^1.0.2",
+        "safe-regex": "^1.1.0"
+      }
+    },
+    "to-regex-range": {
+      "version": "2.1.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/to-regex-range/download/to-regex-range-2.1.1.tgz",
+      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+      "dev": true,
+      "requires": {
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1"
+      }
+    },
+    "trim-newlines": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/trim-newlines/download/trim-newlines-1.0.0.tgz",
+      "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+      "dev": true
+    },
+    "uglify-js": {
+      "version": "3.4.9",
+      "resolved": "http://registry.npm.taobao.org/uglify-js/download/uglify-js-3.4.9.tgz",
+      "integrity": "sha1-rwLxgMEgfXZDLkc+0koo9KeCuuM=",
+      "dev": true,
+      "requires": {
+        "commander": "~2.17.1",
+        "source-map": "~0.6.1"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.17.1",
+          "resolved": "http://registry.npm.taobao.org/commander/download/commander-2.17.1.tgz",
+          "integrity": "sha1-vXerfebelCBc6sxy8XFtKfIKd78=",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz",
+          "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
+          "dev": true
+        }
+      }
+    },
+    "unc-path-regex": {
+      "version": "0.1.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/unc-path-regex/download/unc-path-regex-0.1.2.tgz",
+      "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
+      "dev": true
+    },
+    "union-value": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
+      "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
+      "dev": true,
+      "requires": {
+        "arr-union": "^3.1.0",
+        "get-value": "^2.0.6",
+        "is-extendable": "^0.1.1",
+        "set-value": "^2.0.1"
+      }
+    },
+    "unique-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/unique-stream/download/unique-stream-1.0.0.tgz",
+      "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=",
+      "dev": true
+    },
+    "unpipe": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/unpipe/download/unpipe-1.0.0.tgz",
+      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+      "dev": true
+    },
+    "unset-value": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/unset-value/download/unset-value-1.0.0.tgz",
+      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+      "dev": true,
+      "requires": {
+        "has-value": "^0.3.1",
+        "isobject": "^3.0.0"
+      },
+      "dependencies": {
+        "has-value": {
+          "version": "0.3.1",
+          "resolved": "http://registry.npm.alibaba-inc.com/has-value/download/has-value-0.3.1.tgz",
+          "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+          "dev": true,
+          "requires": {
+            "get-value": "^2.0.3",
+            "has-values": "^0.1.4",
+            "isobject": "^2.0.0"
+          },
+          "dependencies": {
+            "isobject": {
+              "version": "2.1.0",
+              "resolved": "http://registry.npm.alibaba-inc.com/isobject/download/isobject-2.1.0.tgz",
+              "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+              "dev": true,
+              "requires": {
+                "isarray": "1.0.0"
+              }
+            }
+          }
+        },
+        "has-values": {
+          "version": "0.1.4",
+          "resolved": "http://registry.npm.alibaba-inc.com/has-values/download/has-values-0.1.4.tgz",
+          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+          "dev": true
+        },
+        "isarray": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.alibaba-inc.com/isarray/download/isarray-1.0.0.tgz",
+          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+          "dev": true
+        }
+      }
+    },
+    "urix": {
+      "version": "0.1.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/urix/download/urix-0.1.0.tgz",
+      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+      "dev": true
+    },
+    "use": {
+      "version": "3.1.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/use/download/use-3.1.1.tgz",
+      "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=",
+      "dev": true
+    },
+    "user-home": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npm.taobao.org/user-home/download/user-home-1.1.1.tgz",
+      "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=",
+      "dev": true
+    },
+    "util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/util-deprecate/download/util-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+      "dev": true
+    },
+    "utils-merge": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/utils-merge/download/utils-merge-1.0.1.tgz",
+      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
+      "dev": true
+    },
+    "uuid": {
+      "version": "1.4.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/uuid/download/uuid-1.4.2.tgz",
+      "integrity": "sha1-RTAZ9oaWam34PNxSROfJkOzDMvw=",
+      "dev": true
+    },
+    "v8flags": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npm.taobao.org/v8flags/download/v8flags-2.1.1.tgz",
+      "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=",
+      "dev": true,
+      "requires": {
+        "user-home": "^1.1.1"
+      }
+    },
+    "validate-npm-package-license": {
+      "version": "3.0.3",
+      "resolved": "http://registry.npm.alibaba-inc.com/validate-npm-package-license/download/validate-npm-package-license-3.0.3.tgz",
+      "integrity": "sha1-gWQ7y+8b3+zUYjeT3EZIlIupgzg=",
+      "dev": true,
+      "requires": {
+        "spdx-correct": "^3.0.0",
+        "spdx-expression-parse": "^3.0.0"
+      }
+    },
+    "vinyl": {
+      "version": "0.5.3",
+      "resolved": "http://registry.npm.alibaba-inc.com/vinyl/download/vinyl-0.5.3.tgz",
+      "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=",
+      "dev": true,
+      "requires": {
+        "clone": "^1.0.0",
+        "clone-stats": "^0.0.1",
+        "replace-ext": "0.0.1"
+      }
+    },
+    "vinyl-fs": {
+      "version": "0.3.14",
+      "resolved": "https://registry.npm.taobao.org/vinyl-fs/download/vinyl-fs-0.3.14.tgz",
+      "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=",
+      "dev": true,
+      "requires": {
+        "defaults": "^1.0.0",
+        "glob-stream": "^3.1.5",
+        "glob-watcher": "^0.0.6",
+        "graceful-fs": "^3.0.0",
+        "mkdirp": "^0.5.0",
+        "strip-bom": "^1.0.0",
+        "through2": "^0.6.1",
+        "vinyl": "^0.4.0"
+      },
+      "dependencies": {
+        "clone": {
+          "version": "0.2.0",
+          "resolved": "https://registry.npm.taobao.org/clone/download/clone-0.2.0.tgz",
+          "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=",
+          "dev": true
+        },
+        "readable-stream": {
+          "version": "1.0.34",
+          "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-1.0.34.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freadable-stream%2Fdownload%2Freadable-stream-1.0.34.tgz",
+          "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+          "dev": true,
+          "requires": {
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.1",
+            "isarray": "0.0.1",
+            "string_decoder": "~0.10.x"
+          }
+        },
+        "through2": {
+          "version": "0.6.5",
+          "resolved": "https://registry.npm.taobao.org/through2/download/through2-0.6.5.tgz",
+          "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+          "dev": true,
+          "requires": {
+            "readable-stream": ">=1.0.33-1 <1.1.0-0",
+            "xtend": ">=4.0.0 <4.1.0-0"
+          }
+        },
+        "vinyl": {
+          "version": "0.4.6",
+          "resolved": "https://registry.npm.taobao.org/vinyl/download/vinyl-0.4.6.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvinyl%2Fdownload%2Fvinyl-0.4.6.tgz",
+          "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=",
+          "dev": true,
+          "requires": {
+            "clone": "^0.2.0",
+            "clone-stats": "^0.0.1"
+          }
+        }
+      }
+    },
+    "vinyl-sourcemaps-apply": {
+      "version": "0.2.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/vinyl-sourcemaps-apply/download/vinyl-sourcemaps-apply-0.2.1.tgz",
+      "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=",
+      "dev": true,
+      "requires": {
+        "source-map": "^0.5.1"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "http://registry.npm.alibaba-inc.com/source-map/download/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        }
+      }
+    },
+    "vow": {
+      "version": "0.4.4",
+      "resolved": "http://registry.npm.alibaba-inc.com/vow/download/vow-0.4.4.tgz",
+      "integrity": "sha1-yf5GCRKdf1qmIVCOvmS1HJW8e5g=",
+      "dev": true
+    },
+    "vow-fs": {
+      "version": "0.3.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/vow-fs/download/vow-fs-0.3.2.tgz",
+      "integrity": "sha1-6isDTYXh24wnfrLpqG0cFfXTjno=",
+      "dev": true,
+      "requires": {
+        "glob": "3.2.8",
+        "node-uuid": "1.4.0",
+        "vow": "0.4.4",
+        "vow-queue": "0.3.1"
+      },
+      "dependencies": {
+        "glob": {
+          "version": "3.2.8",
+          "resolved": "http://registry.npm.alibaba-inc.com/glob/download/glob-3.2.8.tgz",
+          "integrity": "sha1-VQb0MRchvMYYx9jboUQYh1AwcHM=",
+          "dev": true,
+          "requires": {
+            "inherits": "2",
+            "minimatch": "~0.2.11"
+          }
+        },
+        "minimatch": {
+          "version": "0.2.14",
+          "resolved": "http://registry.npm.alibaba-inc.com/minimatch/download/minimatch-0.2.14.tgz",
+          "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=",
+          "dev": true,
+          "requires": {
+            "lru-cache": "2",
+            "sigmund": "~1.0.0"
+          }
+        }
+      }
+    },
+    "vow-queue": {
+      "version": "0.3.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/vow-queue/download/vow-queue-0.3.1.tgz",
+      "integrity": "sha1-WYxRoVsKgabV/AX0dhzrRi3h6Gg=",
+      "dev": true,
+      "requires": {
+        "vow": "~0.4.0"
+      }
+    },
+    "websocket-driver": {
+      "version": "0.7.0",
+      "resolved": "http://registry.npm.alibaba-inc.com/websocket-driver/download/websocket-driver-0.7.0.tgz",
+      "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=",
+      "dev": true,
+      "requires": {
+        "http-parser-js": ">=0.4.0",
+        "websocket-extensions": ">=0.1.1"
+      }
+    },
+    "websocket-extensions": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz",
+      "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==",
+      "dev": true
+    },
+    "which": {
+      "version": "1.3.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/which/download/which-1.3.1.tgz",
+      "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=",
+      "dev": true,
+      "requires": {
+        "isexe": "^2.0.0"
+      }
+    },
+    "wordwrap": {
+      "version": "0.0.3",
+      "resolved": "http://registry.npm.alibaba-inc.com/wordwrap/download/wordwrap-0.0.3.tgz",
+      "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
+    },
+    "wrappy": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.alibaba-inc.com/wrappy/download/wrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+      "dev": true
+    },
+    "xtend": {
+      "version": "4.0.1",
+      "resolved": "http://registry.npm.alibaba-inc.com/xtend/download/xtend-4.0.1.tgz",
+      "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
+      "dev": true
+    }
+  }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/package.json b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/package.json
new file mode 100644
index 0000000..b62fb32
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/package.json
@@ -0,0 +1,55 @@
+{
+  "name": "sentinel-dashboard",
+  "version": "1.0.0",
+  "description": "",
+  "main": "index.js",
+  "scripts": {
+    "test": "echo no test case",
+    "build": "gulp build",
+    "start": "gulp"
+  },
+  "author": "x-cold <lxstart@outlook.com>",
+  "license": "MIT",
+  "dependencies": {
+    "angular": "^1.4.8",
+    "angular-animate": "^1.4.0",
+    "angular-bootstrap": "^0.12.2",
+    "angular-clipboard": "^1.6.2",
+    "angular-cookies": "^1.4.0",
+    "angular-date-time-input": "^1.2.1",
+    "angular-loading-bar": "^0.9.0",
+    "angular-mocks": "^1.4.0",
+    "angular-resource": "^1.4.0",
+    "angular-route": "^1.4.0",
+    "angular-selectize2": "^v1.2.3",
+    "angular-table-resize": "^2.0.1",
+    "angular-touch": "^1.4.0",
+    "angular-ui-notification": "^0.3.6",
+    "angular-ui-router": "^1.0.18",
+    "angular-utils-pagination": "^0.11.1",
+    "angularjs-bootstrap-datetimepicker": "^1.1.4",
+    "bootstrap-switch": "^3.3.4",
+    "bootstrap-tagsinput": "~0.7.1",
+    "lodash": "^4.17.15",
+    "moment": "^2.12.0",
+    "ng-dialog": "^0.6.6",
+    "ng-tags-input": "~3.0.0",
+    "oclazyload": "^1.1.0",
+    "selectize": "^0.12.1"
+  },
+  "devDependencies": {
+    "gulp": "^3.9.1",
+    "gulp-clean": "^0.4.0",
+    "gulp-concat": "^2.6.1",
+    "gulp-connect": "^5.7.0",
+    "gulp-csscomb": "^3.0.8",
+    "gulp-cssmin": "^0.2.0",
+    "gulp-jshint": "^2.1.0",
+    "gulp-load-plugins": "^1.6.0",
+    "gulp-serv": "0.0.1",
+    "gulp-uglify": "^3.0.0",
+    "jshint": "^2.10.2",
+    "open": "^6.3.0",
+    "source-map": "^0.7.3"
+  }
+}
diff --git a/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/static/favicon.ico b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/static/favicon.ico
new file mode 100644
index 0000000..1719e7f
--- /dev/null
+++ b/ruoyi-visual/ruoyi-sentinel-dashboard/src/main/webapp/resources/static/favicon.ico
Binary files differ

--
Gitblit v1.9.1